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);
          }
     
     }