client/ftpd/src/se/lu/thep/coreftpd/common/MyString.java

Code
Comments
Other
Rev Date Author Line
741 10 Oct 06 olle 1 /*
1652 22 May 07 gregory 2  $Id$
741 10 Oct 06 olle 3
1916 31 Aug 07 jari 4  Copyright (C) 2006 Olle Mansson
1916 31 Aug 07 jari 5  Copyright (C) 2007 Gregory Vincic
741 10 Oct 06 olle 6
1652 22 May 07 gregory 7  This file is part of Proteios.
1652 22 May 07 gregory 8  Available at http://www.proteios.org/
741 10 Oct 06 olle 9
1652 22 May 07 gregory 10  Proteios is free software; you can redistribute it and/or modify it
1652 22 May 07 gregory 11  under the terms of the GNU General Public License as published by
1652 22 May 07 gregory 12  the Free Software Foundation; either version 2 of the License, or
1652 22 May 07 gregory 13  (at your option) any later version.
741 10 Oct 06 olle 14
1652 22 May 07 gregory 15  Proteios is distributed in the hope that it will be useful, but
1652 22 May 07 gregory 16  WITHOUT ANY WARRANTY; without even the implied warranty of
1652 22 May 07 gregory 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1652 22 May 07 gregory 18  General Public License for more details.
741 10 Oct 06 olle 19
1652 22 May 07 gregory 20  You should have received a copy of the GNU General Public License
1652 22 May 07 gregory 21  along with this program; if not, write to the Free Software
1652 22 May 07 gregory 22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1652 22 May 07 gregory 23  02111-1307, USA.
1652 22 May 07 gregory 24  */
741 10 Oct 06 olle 25 //  Xerver Free Web Server
741 10 Oct 06 olle 26 //  Copyright (C) 2002-2005 Omid Rouhani
741 10 Oct 06 olle 27 //
741 10 Oct 06 olle 28 //
741 10 Oct 06 olle 29 //  This program is free software; you can redistribute it and/or
741 10 Oct 06 olle 30 //  modify it under the terms of the GNU General Public License
741 10 Oct 06 olle 31 //  as published by the Free Software Foundation; either version 2
741 10 Oct 06 olle 32 //  of the License, or (at your option) any later version.
741 10 Oct 06 olle 33 //
741 10 Oct 06 olle 34 //  This program is distributed in the hope that it will be useful,
741 10 Oct 06 olle 35 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
741 10 Oct 06 olle 36 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
741 10 Oct 06 olle 37 //  GNU General Public License for more details.
741 10 Oct 06 olle 38 //
741 10 Oct 06 olle 39 //  You should have received a copy of the GNU General Public License
741 10 Oct 06 olle 40 //  along with this program; if not, write to the Free Software
741 10 Oct 06 olle 41 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
741 10 Oct 06 olle 42 //
741 10 Oct 06 olle 43 //
741 10 Oct 06 olle 44 //  #############################################################
741 10 Oct 06 olle 45 //  ##  YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT:          ##
741 10 Oct 06 olle 46 //  ##  HTTP://WWW.JAVASCRIPT.NU/XERVER/                       ##
741 10 Oct 06 olle 47 //  ##                                                         ##
741 10 Oct 06 olle 48 //  ##  IF YOUR SOFTWARE IS NOT RELEASED UNDER THE             ##
741 10 Oct 06 olle 49 //  ##  GNU GENERAL PUBLIC LICENSE (GPL),                      ##
741 10 Oct 06 olle 50 //  ##  PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!!   ##
741 10 Oct 06 olle 51 //  ##                                                         ##
741 10 Oct 06 olle 52 //  ##  FOR FULL LICENSE, PLEASE READ "XERVER LICENSE".        ##
741 10 Oct 06 olle 53 //  #############################################################
1652 22 May 07 gregory 54 package se.lu.thep.coreftpd.common;
741 10 Oct 06 olle 55
1052 08 Dec 06 olle 56 import se.lu.thep.coreftpd.ftp_server.FTPNewConnection;
741 10 Oct 06 olle 57 import java.io.File;
741 10 Oct 06 olle 58
741 10 Oct 06 olle 59 /**
1652 22 May 07 gregory 60  * <B>About this class:</B> <BR>
1652 22 May 07 gregory 61  * <CODE>MyString</CODE> is a very useful class. <BR>
1652 22 May 07 gregory 62  * All members in <CODE>MyString</CODE> are <CODE>static</CODE>. <BR>
741 10 Oct 06 olle 63  * By the name of the members you are supposed to understand what they do. ;)
1652 22 May 07 gregory 64  * 
741 10 Oct 06 olle 65  * @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a>
741 10 Oct 06 olle 66  * @version 1.0
741 10 Oct 06 olle 67  */
1652 22 May 07 gregory 68 final public class MyString // Contains only static members
741 10 Oct 06 olle 69 {
1652 22 May 07 gregory 70   /*
2418 22 Nov 07 gregory 71    * public static void main(String [] s) { String path; path="aa/..";
2418 22 Nov 07 gregory 72    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 73    * path="./aa/bb/..";
1652 22 May 07 gregory 74    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 75    * path="./aa/bb/cc";
1652 22 May 07 gregory 76    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 77    * path="./aa/bb/../cc";
1652 22 May 07 gregory 78    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 79    * path="./aa/bb/cc/../../dd";
1652 22 May 07 gregory 80    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 81    * path="aa/bb/../../../../../";
1652 22 May 07 gregory 82    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 83    * path="/aa/bb/../../../../../";
1652 22 May 07 gregory 84    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 85    * path="aa/bb/../../../../";
1652 22 May 07 gregory 86    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 87    * path="/aa/bb/../../../../";
1652 22 May 07 gregory 88    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 89    * path="aa/bb/../../../../..";
1652 22 May 07 gregory 90    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 91    * path="/aa/bb/../../../../..";
1652 22 May 07 gregory 92    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 93    * path="aa/bb/../../../..";
1652 22 May 07 gregory 94    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 95    * path="/aa/bb/../../../..";
1652 22 May 07 gregory 96    * System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="../../";
1652 22 May 07 gregory 97    * System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="/../../";
1652 22 May 07 gregory 98    * System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="..";
1652 22 May 07 gregory 99    * System.out.println(path+"\t\t"+makeCanonicalPath(path)); path=".";
1652 22 May 07 gregory 100    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 101    * path="/abc/def/../../";
1652 22 May 07 gregory 102    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 103    * path="/abc/def/../../.";
1652 22 May 07 gregory 104    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 105    * path="/abc/def/../../cc/./dd";
1652 22 May 07 gregory 106    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 107    * path="/abc/./d/";
1652 22 May 07 gregory 108    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 109    * path="/aa/./bb/./././../cc/../dd";
1652 22 May 07 gregory 110    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 111    * path="../../..///aa/./bb/././//.////../cc/../dd";
1652 22 May 07 gregory 112    * System.out.println(path+"\t\t"+makeCanonicalPath(path));
1652 22 May 07 gregory 113    * path="c:/aa/../../../b/";
1652 22 May 07 gregory 114    * System.out.println(path+"\t\t"+makeCanonicalPath(path)); }
1652 22 May 07 gregory 115    */
1652 22 May 07 gregory 116   final static private char coreSeparatorChar = FTPNewConnection.coreSeparatorChar;
1052 08 Dec 06 olle 117   final static private String coreSeparator = FTPNewConnection.coreSeparator;
1052 08 Dec 06 olle 118
741 10 Oct 06 olle 119
2418 22 Nov 07 gregory 120   private MyString()
2418 22 Nov 07 gregory 121   {}
2418 22 Nov 07 gregory 122
2418 22 Nov 07 gregory 123
1652 22 May 07 gregory 124   public static boolean stringExistInArrayIgnoreCase(String str,
2418 22 Nov 07 gregory 125       String[] strArray)
2418 22 Nov 07 gregory 126   {
1652 22 May 07 gregory 127     for (int i = 0, strArrayLength = strArray.length; i < strArrayLength; i++)
1652 22 May 07 gregory 128       // Optimization...
741 10 Oct 06 olle 129       if (str.equalsIgnoreCase(strArray[i]))
741 10 Oct 06 olle 130         return true;
741 10 Oct 06 olle 131     return false;
741 10 Oct 06 olle 132   }
741 10 Oct 06 olle 133
2418 22 Nov 07 gregory 134
1652 22 May 07 gregory 135   /**
1652 22 May 07 gregory 136    * "12345678" ==> "12'345'678"
1652 22 May 07 gregory 137    */
2418 22 Nov 07 gregory 138   public static String makeNumberToStringWithApostrophe(String txt)
2418 22 Nov 07 gregory 139   {
2418 22 Nov 07 gregory 140     while ((txt.indexOf("'") > 3 || txt.indexOf("'") == -1) && txt.length() > 3)
2418 22 Nov 07 gregory 141     {
1652 22 May 07 gregory 142       int txtIndexOfApostrophe = txt.indexOf("'"); // Optimization...
741 10 Oct 06 olle 143       if (txtIndexOfApostrophe != -1)
2418 22 Nov 07 gregory 144         txt = txt.substring(0, txtIndexOfApostrophe - 3) + "'" + txt
2418 22 Nov 07 gregory 145           .substring(txtIndexOfApostrophe - 3);
2418 22 Nov 07 gregory 146       else
2418 22 Nov 07 gregory 147       {
1652 22 May 07 gregory 148         int txtLengthMinus3 = txt.length() - 3;
2418 22 Nov 07 gregory 149         txt = txt.substring(0, txtLengthMinus3) + "'" + txt
2418 22 Nov 07 gregory 150           .substring(txtLengthMinus3);
741 10 Oct 06 olle 151       }
741 10 Oct 06 olle 152     }
741 10 Oct 06 olle 153     return txt;
741 10 Oct 06 olle 154   }
741 10 Oct 06 olle 155
2418 22 Nov 07 gregory 156
1652 22 May 07 gregory 157   /**
1652 22 May 07 gregory 158    * Number of times "subString" can be found in "bigString".
1652 22 May 07 gregory 159    */
2418 22 Nov 07 gregory 160   public static int numberOfStringsInString(String bigString, String subString)
2418 22 Nov 07 gregory 161   {
1652 22 May 07 gregory 162     if (subString.equals("")) // If subString is an empty string, my
2418 22 Nov 07 gregory 163       // definition of this method is to return
2418 22 Nov 07 gregory 164       // bigString.length()
741 10 Oct 06 olle 165       return bigString.length();
1652 22 May 07 gregory 166     int raknare = 0, bigStringLength = bigString.length(), subStringLength = subString
2418 22 Nov 07 gregory 167       .length(); // Optimization...
1652 22 May 07 gregory 168     int forUntilThis = bigStringLength - subStringLength + 1; // Optimization...
1652 22 May 07 gregory 169     for (int i = 0; i < forUntilThis; i++)
1652 22 May 07 gregory 170       // Optimization...
1652 22 May 07 gregory 171       if (bigString.substring(i, i + subStringLength).equals(subString))
741 10 Oct 06 olle 172         raknare++;
741 10 Oct 06 olle 173     return raknare;
741 10 Oct 06 olle 174   }
741 10 Oct 06 olle 175
2418 22 Nov 07 gregory 176
1652 22 May 07 gregory 177   /**
1652 22 May 07 gregory 178    * Number of times "subString" can be found in "bigString". If
1652 22 May 07 gregory 179    * returnHighValue equals "false" then "aaaa" and "aa" ==> 2. If
1652 22 May 07 gregory 180    * returnHighValue equals "false" then "aaaa" and "aa" ==> 3.
1652 22 May 07 gregory 181    */
1652 22 May 07 gregory 182   public static int numberOfStringsInString(String bigString,
1652 22 May 07 gregory 183       String subString, boolean returnHighValue) //
741 10 Oct 06 olle 184   {
1652 22 May 07 gregory 185     if (subString.equals("")) // If subString is an empty string, my
2418 22 Nov 07 gregory 186       // definition of this method is to return
2418 22 Nov 07 gregory 187       // bigString.length()
741 10 Oct 06 olle 188       return bigString.length();
741 10 Oct 06 olle 189     if (returnHighValue)
741 10 Oct 06 olle 190       return numberOfStringsInString(bigString, subString);
2418 22 Nov 07 gregory 191     int raknare = 0;
2418 22 Nov 07 gregory 192     int bigStringLength = bigString.length(), subStringLength = subString
2418 22 Nov 07 gregory 193       .length();
2418 22 Nov 07 gregory 194     int forUntilThis = bigStringLength - subStringLength + 1;
2418 22 Nov 07 gregory 195     for (int i = 0; i < forUntilThis; i++)
2418 22 Nov 07 gregory 196       if (bigString.substring(i, i + subStringLength).equals(subString))
2418 22 Nov 07 gregory 197       {
2418 22 Nov 07 gregory 198         i += subStringLength - 1;
2418 22 Nov 07 gregory 199         raknare++;
2418 22 Nov 07 gregory 200       }
2418 22 Nov 07 gregory 201     return raknare;
741 10 Oct 06 olle 202   }
741 10 Oct 06 olle 203
2418 22 Nov 07 gregory 204
1652 22 May 07 gregory 205   /**
1652 22 May 07 gregory 206    * Search "bigString" for "oldStr" and replace it with "newStr"
1652 22 May 07 gregory 207    */
1652 22 May 07 gregory 208   public static String searchAndReplace(String bigString, String oldStr,
2418 22 Nov 07 gregory 209       String newStr)
2418 22 Nov 07 gregory 210   {
1652 22 May 07 gregory 211     String storStrang = bigString;
1652 22 May 07 gregory 212     int oldStrLength = oldStr.length(), newStrLengthMinusOne = newStr
2418 22 Nov 07 gregory 213       .length() - 1; // Optimization...
2418 22 Nov 07 gregory 214     for (int i = 0; i <= storStrang.length() - oldStrLength; i++)
2418 22 Nov 07 gregory 215     {
2418 22 Nov 07 gregory 216       if (storStrang.substring(i, i + oldStrLength).equals(oldStr))
2418 22 Nov 07 gregory 217       {
2418 22 Nov 07 gregory 218         storStrang = storStrang.substring(0, i) + newStr + storStrang
2418 22 Nov 07 gregory 219           .substring(i + oldStrLength);
1652 22 May 07 gregory 220         i += newStrLengthMinusOne; // Without this the loop will go on
2418 22 Nov 07 gregory 221         // forever if you try to replace all
2418 22 Nov 07 gregory 222         // "/" with "//" in this string
2418 22 Nov 07 gregory 223         // "ab/cd"
741 10 Oct 06 olle 224       }
741 10 Oct 06 olle 225     }
741 10 Oct 06 olle 226     return storStrang;
741 10 Oct 06 olle 227   }
741 10 Oct 06 olle 228
2418 22 Nov 07 gregory 229
1652 22 May 07 gregory 230   /**
1652 22 May 07 gregory 231    * Make [String:] "a,b,c" ==> [Array:] "a","b,"c"
1652 22 May 07 gregory 232    */
2418 22 Nov 07 gregory 233   public static String[] makeArrayOfString(String str, String separate)
2418 22 Nov 07 gregory 234   {
2418 22 Nov 07 gregory 235     if (str.equals(""))
2418 22 Nov 07 gregory 236     {
741 10 Oct 06 olle 237       return new String[0];
741 10 Oct 06 olle 238     }
1652 22 May 07 gregory 239     String theString = str;
1652 22 May 07 gregory 240     int numberOfSeparates, separateLength = separate.length(); // Optimization...
1652 22 May 07 gregory 241     String[] newArray;
1652 22 May 07 gregory 242     numberOfSeparates = MyString.numberOfStringsInString(theString,
2418 22 Nov 07 gregory 243       separate, false);
2418 22 Nov 07 gregory 244     if (separateLength == 0)
2418 22 Nov 07 gregory 245     {
1652 22 May 07 gregory 246       int index = 0, strLength = str.length(); // Optimization...
1652 22 May 07 gregory 247       newArray = new String[strLength];
2418 22 Nov 07 gregory 248       for (int i = 0; i < strLength; i++)
2418 22 Nov 07 gregory 249       {
1652 22 May 07 gregory 250         newArray[index] = str.substring(i, i + 1);
741 10 Oct 06 olle 251       }
2418 22 Nov 07 gregory 252     }
2418 22 Nov 07 gregory 253     else
2418 22 Nov 07 gregory 254     {
1652 22 May 07 gregory 255       newArray = new String[numberOfSeparates + 1];
1652 22 May 07 gregory 256       int index = 0, theStringIndexOfSeparate; // Optimization...
2418 22 Nov 07 gregory 257       while (theString.indexOf(separate) != -1 && theString.length() > 0)
2418 22 Nov 07 gregory 258       {
1652 22 May 07 gregory 259         theStringIndexOfSeparate = theString.indexOf(separate); // Optimization...
1652 22 May 07 gregory 260         newArray[index++] = theString.substring(0,
2418 22 Nov 07 gregory 261           theStringIndexOfSeparate);
2418 22 Nov 07 gregory 262         theString = theString
2418 22 Nov 07 gregory 263           .substring(theStringIndexOfSeparate + separateLength);
741 10 Oct 06 olle 264       }
1652 22 May 07 gregory 265       newArray[index] = theString;
1652 22 May 07 gregory 266     }// else
741 10 Oct 06 olle 267     return newArray;
741 10 Oct 06 olle 268   }
741 10 Oct 06 olle 269
2418 22 Nov 07 gregory 270
1652 22 May 07 gregory 271   /**
1652 22 May 07 gregory 272    * Returns a String with a fix length: <BR>
1652 22 May 07 gregory 273    * ("abc",5," ") ==> "abc "
1652 22 May 07 gregory 274    */
2418 22 Nov 07 gregory 275   public static String giveStringWithFixLength(String s, int len, char ch)
2418 22 Nov 07 gregory 276   {
1652 22 May 07 gregory 277     String tmpStr = s;
2418 22 Nov 07 gregory 278     if (s == null)
2418 22 Nov 07 gregory 279     {
1652 22 May 07 gregory 280       tmpStr = "";
1652 22 May 07 gregory 281       for (int i = 0; i < len; i++)
1652 22 May 07 gregory 282         tmpStr += ch;
741 10 Oct 06 olle 283       return tmpStr;
741 10 Oct 06 olle 284     }
1652 22 May 07 gregory 285     int sLength = s.length();
1652 22 May 07 gregory 286     int lenMinusSLength = len - sLength; // Optimization...
1652 22 May 07 gregory 287     if (sLength > len)
1652 22 May 07 gregory 288       return s.substring(0, len);
1652 22 May 07 gregory 289     StringBuffer SB_str = new StringBuffer(tmpStr);
1652 22 May 07 gregory 290     for (int i = 0; i < lenMinusSLength; i++)
741 10 Oct 06 olle 291       SB_str.append(ch);
741 10 Oct 06 olle 292     return SB_str.toString();
741 10 Oct 06 olle 293   }
741 10 Oct 06 olle 294
2418 22 Nov 07 gregory 295
741 10 Oct 06 olle 296   /**
1652 22 May 07 gregory 297    * If you set <CODE>b_useSlash</CODE> to true you shall use /, otherwise
2418 22 Nov 07 gregory 298    * use \ in your paths. This will take a relative path and remove all . and ..
2418 22 Nov 07 gregory 299    * in a proper way. The easiest way to display how this method works is with
2418 22 Nov 07 gregory 300    * a few examples:
1652 22 May 07 gregory 301    * 
1652 22 May 07 gregory 302    * <PRE>
1652 22 May 07 gregory 303    * 
1652 22 May 07 gregory 304    * aa/.. ./aa/bb/.. aa/ ./aa/bb/cc aa/bb/cc ./aa/bb/../cc aa/cc
1652 22 May 07 gregory 305    * ./aa/bb/cc/../../dd aa/dd aa/bb/../../../../../ ../../../
1652 22 May 07 gregory 306    * /aa/bb/../../../../../ /../../../ aa/bb/../../../../ ../../
1652 22 May 07 gregory 307    * /aa/bb/../../../../ /../../ aa/bb/../../../../.. ../../..
1652 22 May 07 gregory 308    * /aa/bb/../../../../.. /../../.. aa/bb/../../../.. ../..
1652 22 May 07 gregory 309    * /aa/bb/../../../.. /../.. ../../ ../../ /../../ /../../ .. .. . .
1652 22 May 07 gregory 310    * /abc/def/../../ / /abc/def/../../. / /abc/def/../../cc/./dd /cc/dd
1652 22 May 07 gregory 311    * /abc/./d/ /abc/d/ /aa/./bb/./././../cc/../dd /aa/dd c:/aa/../../../b/
1652 22 May 07 gregory 312    * ../b/ ../../..///aa/./bb/././//.//../cc/../dd ../../../aa/dd
1652 22 May 07 gregory 313    * 
1652 22 May 07 gregory 314    * </PRE>
1652 22 May 07 gregory 315    */
2418 22 Nov 07 gregory 316   public static String makeCanonicalPath(String path, boolean b_useSlash)
2418 22 Nov 07 gregory 317   {
2418 22 Nov 07 gregory 318     if (path == null)
2418 22 Nov 07 gregory 319     {
741 10 Oct 06 olle 320       return path;
2418 22 Nov 07 gregory 321     }
2418 22 Nov 07 gregory 322     else if (path.indexOf('.') != -1)
2418 22 Nov 07 gregory 323     {
1652 22 May 07 gregory 324       String ss, sds, sdds, dds, ds, sdd, sd; // s=slash, d=dot
741 10 Oct 06 olle 325       char sChar;
2418 22 Nov 07 gregory 326       if (b_useSlash)
2418 22 Nov 07 gregory 327       {
1652 22 May 07 gregory 328         sChar = '/';
1652 22 May 07 gregory 329         ss = "//";
1652 22 May 07 gregory 330         sds = "/./";
1652 22 May 07 gregory 331         sdds = "/../";
1652 22 May 07 gregory 332         dds = "../";
1652 22 May 07 gregory 333         ds = "./";
1652 22 May 07 gregory 334         sdd = "/..";
1652 22 May 07 gregory 335         sd = "/.";
2418 22 Nov 07 gregory 336       }
2418 22 Nov 07 gregory 337       else
2418 22 Nov 07 gregory 338       {
1652 22 May 07 gregory 339         sChar = '\\';
1652 22 May 07 gregory 340         ss = "\\\\";
1652 22 May 07 gregory 341         sds = "\\.\\";
1652 22 May 07 gregory 342         sdds = "\\..\\";
1652 22 May 07 gregory 343         dds = "..\\";
1652 22 May 07 gregory 344         ds = ".\\";
1652 22 May 07 gregory 345         sdd = "\\..";
1652 22 May 07 gregory 346         sd = "\\.";
741 10 Oct 06 olle 347       }
1652 22 May 07 gregory 348       // Remove all // and replace with /
1652 22 May 07 gregory 349       int doubleSlash = path.indexOf(ss);
2418 22 Nov 07 gregory 350       while (doubleSlash != -1)
2418 22 Nov 07 gregory 351       {
2418 22 Nov 07 gregory 352         path = path.substring(0, doubleSlash) + path
2418 22 Nov 07 gregory 353           .substring(doubleSlash + 1);
1652 22 May 07 gregory 354         doubleSlash = path.indexOf(ss);
741 10 Oct 06 olle 355       }
1652 22 May 07 gregory 356       // Remove all /./
1652 22 May 07 gregory 357       int firstDot = path.indexOf(sds);
2418 22 Nov 07 gregory 358       while (firstDot != -1)
2418 22 Nov 07 gregory 359       {
2418 22 Nov 07 gregory 360         path = path.substring(0, firstDot) + path
2418 22 Nov 07 gregory 361           .substring(firstDot + 2);
1652 22 May 07 gregory 362         firstDot = path.indexOf(sds);
741 10 Oct 06 olle 363       }
1652 22 May 07 gregory 364       // Remove all /../
1652 22 May 07 gregory 365       int firstDotDot = path.indexOf(sdds);
2418 22 Nov 07 gregory 366       while (firstDotDot != -1)
2418 22 Nov 07 gregory 367       {
1652 22 May 07 gregory 368         int prevSlash = path.lastIndexOf(sChar, firstDotDot - 1);
2418 22 Nov 07 gregory 369         if (prevSlash != -1)
2418 22 Nov 07 gregory 370         {
1652 22 May 07 gregory 371           String parentDir = path.substring(prevSlash + 1,
2418 22 Nov 07 gregory 372             firstDotDot);
2418 22 Nov 07 gregory 373           if (parentDir.equals(".."))
2418 22 Nov 07 gregory 374           {
1652 22 May 07 gregory 375             firstDotDot = path.indexOf(sdds, firstDotDot + 1);
2418 22 Nov 07 gregory 376           }
2418 22 Nov 07 gregory 377           else
2418 22 Nov 07 gregory 378           {
2418 22 Nov 07 gregory 379             path = path.substring(0, prevSlash + 1) + path
2418 22 Nov 07 gregory 380               .substring(firstDotDot + 4);
1652 22 May 07 gregory 381             firstDotDot = path.indexOf(sdds);
741 10 Oct 06 olle 382           }
2418 22 Nov 07 gregory 383         }
2418 22 Nov 07 gregory 384         else
2418 22 Nov 07 gregory 385         {
2418 22 Nov 07 gregory 386           if (firstDotDot == 0 || path.startsWith(dds) || path
2418 22 Nov 07 gregory 387             .startsWith(ds))
1652 22 May 07 gregory 388             firstDotDot = path.indexOf(sdds, firstDotDot + 1);
2418 22 Nov 07 gregory 389           else
2418 22 Nov 07 gregory 390           {
1652 22 May 07 gregory 391             path = path.substring(firstDotDot + 4);
1652 22 May 07 gregory 392             firstDotDot = path.indexOf(sdds);
741 10 Oct 06 olle 393           }
741 10 Oct 06 olle 394         }
741 10 Oct 06 olle 395       }
1652 22 May 07 gregory 396       // Remove all /.. in end (note: for example "../.." or "/../../.."
1652 22 May 07 gregory 397       // doesn't get modifed)
2418 22 Nov 07 gregory 398       while (path.endsWith(sdd))
2418 22 Nov 07 gregory 399       {
1652 22 May 07 gregory 400         int lastDotDot = path.length() - 3;
1652 22 May 07 gregory 401         int prevSlash = path.lastIndexOf(sChar, path.length() - 4);
2418 22 Nov 07 gregory 402         if (prevSlash != -1)
2418 22 Nov 07 gregory 403         {
1652 22 May 07 gregory 404           String parentDir = path
2418 22 Nov 07 gregory 405             .substring(prevSlash + 1, lastDotDot);
2418 22 Nov 07 gregory 406           if (parentDir.equals(".."))
2418 22 Nov 07 gregory 407           {
741 10 Oct 06 olle 408             break;
741 10 Oct 06 olle 409           }
2418 22 Nov 07 gregory 410           path = path.substring(0, prevSlash + 1);
2418 22 Nov 07 gregory 411           lastDotDot = path.indexOf(sdd);
2418 22 Nov 07 gregory 412         }
2418 22 Nov 07 gregory 413         else
2418 22 Nov 07 gregory 414         {
741 10 Oct 06 olle 415           if (path.startsWith(dds))
741 10 Oct 06 olle 416             break;
2418 22 Nov 07 gregory 417           path = "";
741 10 Oct 06 olle 418         }
741 10 Oct 06 olle 419       }
1652 22 May 07 gregory 420       // Remove last dot if string ends with /.
2418 22 Nov 07 gregory 421       if (path.endsWith(sd))
2418 22 Nov 07 gregory 422       {
1652 22 May 07 gregory 423         path = path.substring(0, path.length() - 1);
741 10 Oct 06 olle 424       }
1652 22 May 07 gregory 425       // Remove the first ./ in string
2418 22 Nov 07 gregory 426       if (path.startsWith(ds))
2418 22 Nov 07 gregory 427       {
1652 22 May 07 gregory 428         path = path.substring(2);
741 10 Oct 06 olle 429       }
741 10 Oct 06 olle 430       return path;
2418 22 Nov 07 gregory 431     }
2418 22 Nov 07 gregory 432     else
2418 22 Nov 07 gregory 433     {
1652 22 May 07 gregory 434       return path; // No . in path
741 10 Oct 06 olle 435     }
741 10 Oct 06 olle 436   }
741 10 Oct 06 olle 437
2418 22 Nov 07 gregory 438
741 10 Oct 06 olle 439   /**
1652 22 May 07 gregory 440    * Code modified from original Xerver code. Now returns path with web syntax
2418 22 Nov 07 gregory 441    * separation '/'. This returns <CODE>makeCanonicalPath(path,
2418 22 Nov 07 gregory 442    * (File.separatorChar=='/'))</CODE>, which means that the paths sent to
2418 22 Nov 07 gregory 443    * <CODE>makeCanonicalPath</CODE> shall use \ if you use Windows and / if
2418 22 Nov 07 gregory 444    * you use for example UNIX, Linux or Mac. Please see documentation for
2418 22 Nov 07 gregory 445    * <CODE>makeCanonicalPath(String path, boolean b_useSlash)</CODE> for
2418 22 Nov 07 gregory 446    * more detailed information about this method.
938 20 Nov 06 olle 447    */
2418 22 Nov 07 gregory 448   public static String makeCanonicalPath(String path)
2418 22 Nov 07 gregory 449   {
1652 22 May 07 gregory 450     // return makeCanonicalPath(path, (File.separatorChar=='/'));
938 20 Nov 06 olle 451     /*
938 20 Nov 06 olle 452      * Convert path to web syntax separation '/'.
938 20 Nov 06 olle 453      */
1052 08 Dec 06 olle 454     path = path.replace(File.separatorChar, coreSeparatorChar);
938 20 Nov 06 olle 455     return makeCanonicalPath(path, true);
741 10 Oct 06 olle 456   }
741 10 Oct 06 olle 457
2418 22 Nov 07 gregory 458
741 10 Oct 06 olle 459   public static String unescapeMakePlusesIntoSpaces(String s)
1652 22 May 07 gregory 460   // throws ParseException
741 10 Oct 06 olle 461   {
1652 22 May 07 gregory 462     if (s == null)
741 10 Oct 06 olle 463       return null;
2418 22 Nov 07 gregory 464     return UnescapeMethods.unescape(s.replace('+', ' '), null);
741 10 Oct 06 olle 465   }
741 10 Oct 06 olle 466
2418 22 Nov 07 gregory 467
741 10 Oct 06 olle 468   public static String unescape(String s)
1652 22 May 07 gregory 469   // throws ParseException
741 10 Oct 06 olle 470   {
741 10 Oct 06 olle 471     return UnescapeMethods.unescape(s, null);
741 10 Oct 06 olle 472   }
741 10 Oct 06 olle 473 }