URLAbsolue.java
public class URLAbsolue
{
private String relativeURL; //URL relative
private String homeURL; //URL de la page en cours
private String absoluteURL; //URL Absolue
private String servletURL="http://pc-grit12:8080/servlet/Projet/"; //URL du serveur
private boolean passeParServeur; //Savoir si on fait pointer ou non le liens vers notre serveur
private String decoupeRelativeURL[];
private String decoupeHomeURL[];
public URLAbsolue(String homURL,String relURL,boolean passe)
{
relativeURL=relURL;
homeURL=homURL;
decoupeRelativeURL=decoupageURL(relativeURL);
decoupeHomeURL=decoupageURL(homeURL);
passeParServeur=passe;
absoluteURL=creationAbsoluteURL(); //on crée l'URL Absolue
if(passeParServeur)
{
absoluteURL=remplacementCaractere(absoluteURL,"%","%25"); //on remplace le caractere % par %25
absoluteURL=remplacementCaractere(absoluteURL,"/","%2F"); //on remplace le caractere / par %2F
absoluteURL=servletURL+absoluteURL; //on rajoute l'adresse du servlet
}
}
//recuperation et modification des différentes valeurs
public String getHomeURL()
{
return(homeURL);
}
public void setHomeURL(String homURL)
{
homeURL=homURL;
decoupeHomeURL=decoupageURL(homeURL);
absoluteURL=creationAbsoluteURL(); //on crée l'URL Absolue
if(passeParServeur)
{
absoluteURL=remplacementCaractere(absoluteURL,"%","%25"); //on remplace le caractere % par %25
absoluteURL=remplacementCaractere(absoluteURL,"/","%2F"); //on remplace le caractere / par %2F
absoluteURL=servletURL+absoluteURL; //on rajoute l'adresse du servlet
}
}
public String getRelativeURL()
{
return(relativeURL);
}
public void setRelativeURL(String relURL)
{
relativeURL=relURL;
decoupeRelativeURL=decoupageURL(relativeURL);
absoluteURL=creationAbsoluteURL(); //on crée l'URL Absolue
if(passeParServeur)
{
absoluteURL=remplacementCaractere(absoluteURL,"%","%25"); //on remplace le caractere % par %25
absoluteURL=remplacementCaractere(absoluteURL,"/","%2F"); //on remplace le caractere / par %2F
absoluteURL=servletURL+absoluteURL; //on rajoute l'adresse du servlet
}
}
public String getAbsoluteURL()
{
return(absoluteURL);
}
public String getServletURL()
{
return(servletURL);
}
public void setServletURL(String addr)
{
servletURL=addr;
absoluteURL=creationAbsoluteURL(); //on crée l'URL Absolue
if(passeParServeur)
{
absoluteURL=remplacementCaractere(absoluteURL,"%","%25"); //on remplace le caractere % par %25
absoluteURL=remplacementCaractere(absoluteURL,"/","%2F"); //on remplace le caractere / par %2F
absoluteURL=servletURL+absoluteURL; //on rajoute l'adresse du servlet
}
}
//méthodes privées utiles au traitement
private static String[] decoupageURL(String monURL)
{
int compt=0;
int i=monURL.indexOf('/',0);
//comptage du nombre de "/" dans une URL
while(i!=(-1))
{
compt++;
i=monURL.indexOf('/',(i+1));
}
//System.out.println("nombre de / : "+compt);
String result[]=new String[compt+1];
//indice pour le découpage
int deb=0;
int fin=monURL.indexOf('/',0);
//indice pour le remplissage du tableau
compt=0;
//on stocke dans le tableau résultat l'ensemble des éléments de l'URL
while(fin!=(-1))
{
result[compt]=monURL.substring(deb,fin);
compt++;
deb=fin+1;
fin=monURL.indexOf('/',(fin+1));
}
fin=monURL.length();
result[compt]=monURL.substring(deb,(fin));
//à supprimer à la fin du développement
//for(i=0;i<compt+1;i++)
//{
//System.out.println("mot "+i+" <"+result[i]+">");
//}
//renvoie du resultat
return(result);
}
private static boolean isAbsoluteURL(String[] monURL)
{
int i=monURL.length;
if (i>2)
{
if ( ( ((monURL[0]).equals("http:")) || ((monURL[0]).equals("https:")) || ((monURL[0]).equals("ftp:")) ) && ((monURL[1]).equals("")) )
return(true);
}
return(false);
}
private static boolean isAdresseEmail(String monURL)
{
String monURL2=monURL.toLowerCase();
if ( (monURL2.indexOf("mailto:")!=(-1)) && (monURL2.indexOf("@")!=(-1)) )
{
return(true);
}
else
{
return(false);
}
}
private static boolean doitPasserParServeur(String argument)
{
int fin=argument.lastIndexOf(".");
String arg=argument.toLowerCase();
//System.out.println("arg="+arg);
//on teste si on doit repasser par le serveur :
if (fin==-1) return(true);
try
{
if (arg.substring(fin+1,fin+4).equals("htm")) return(true);
if (arg.substring(fin+1,fin+4).equals("css")) return(true);
if (arg.substring(fin+1,fin+4).equals("php")) return(true);
if (arg.substring(fin+1,fin+5).equals("html")) return(true);
}
catch(Exception e)
{
return(false);
}
return(false);
}
private String creationAbsoluteURL()
{
if (isAbsoluteURL(decoupeRelativeURL))
{
return(relativeURL);
}
else
if (isAdresseEmail(relativeURL))
{
passeParServeur=false;
//System.out.println("on est dans le cas d'une adresse e-mail");
return(relativeURL);
}
if (relativeURL.indexOf("#")==0)
{
return(homeURL+relativeURL);
}
else
{
int length1=decoupeHomeURL.length;
int length2=decoupeRelativeURL.length;
if (passeParServeur==true)
{
passeParServeur=doitPasserParServeur(decoupeRelativeURL[length2-1]);
}
String result="";
int compt=length1+length2;
//permet d'enlever le fichier affiché dans le répertoire home !!!
//ex: blablabla/index.html --> blablabla/
//ex2 : blablabla/ -->blablabla
boolean boolxxx=( ( (decoupeHomeURL[length1-1].indexOf('.'))==(-1) )? false : true );
boolean boolyyy=( (decoupeHomeURL[length1-1].equals("") )? true : false );
int arriere=0;
while (compt>0)
{
int l1, l2;
// System.out.println("coucou compt "+compt+" / resultat <"+result+">");
if (compt>length1)
{
// l1=length1-1;
l2=compt-length1-1;
if ((arriere!=0)&&(!decoupeRelativeURL[l2].equals(".."))) //c'est que l'on a rencontré une ou plusieurs fois le caractere ".." précedemment
{
compt--;
arriere--;
continue;
}
if ( (decoupeRelativeURL[l2]).equals("..") )//si on a .. dans l'URL
{
compt--; //on va 1 fois en arriére
arriere++; //on se prépare à aller une deuxieme fois en arriere
continue;
}
else
{
if ((l2==0)&&(decoupeRelativeURL[l2].equals(""))) //si on est en debut d'url relative et qu'il y a un slash sans rien devant
{
//on doit redescendre jusqu'à la racine...
//ex http://www.exemple.fr
compt=3;
boolxxx=false;
boolyyy=false;
}
else
{
if (l2!=(length2-1)) //si on est pas en bout de chaine, on continu à construire la chaine
{
result=(decoupeRelativeURL[l2]+"/"+result);
}
else //si on est en bout de chaine, on ajoute pas le /
{
result=(decoupeRelativeURL[l2]+result);
}
compt--;
}
}
}
else //on est dans une URL Absolue
{
l1=compt-1;
// l2=0;
if ((arriere!=0)&&(!decoupeHomeURL[l1].equals(".."))) //c'est que l'on a rencontré le caractere ".." précedemment
{
compt--;
arriere--;
continue;
}
if (boolxxx || boolyyy)
{
if (l1>2)
{
compt--;
l1--;
boolxxx=false;
boolyyy=false;
}
}
result=decoupeHomeURL[l1]+"/"+result;
compt--;
}
}
return(result);
}
}
public static String remplacementCaractere(String chaine, String caractere,String remplacement)
{
//permet de remplacer les symboles caractere dans une chaine par les symboles remplacement
int positionFin;
int longueurCaractere=caractere.length();
String resultat="";
while( (positionFin=chaine.indexOf(caractere))!=(-1))
{
resultat=resultat+chaine.substring(0,positionFin)+remplacement;
chaine=chaine.substring(positionFin+longueurCaractere);
// System.out.println(resultat+" "+chaine);
}
resultat=resultat+chaine;
return(resultat);
}
}