741 |
10 Oct 06 |
olle |
1 |
/* |
1652 |
22 May 07 |
gregory |
$Id$ |
741 |
10 Oct 06 |
olle |
3 |
|
1916 |
31 Aug 07 |
jari |
Copyright (C) 2006 Olle Mansson |
1916 |
31 Aug 07 |
jari |
Copyright (C) 2007 Gregory Vincic |
741 |
10 Oct 06 |
olle |
6 |
|
1652 |
22 May 07 |
gregory |
This file is part of Proteios. |
1652 |
22 May 07 |
gregory |
Available at http://www.proteios.org/ |
741 |
10 Oct 06 |
olle |
9 |
|
1652 |
22 May 07 |
gregory |
Proteios is free software; you can redistribute it and/or modify it |
1652 |
22 May 07 |
gregory |
under the terms of the GNU General Public License as published by |
1652 |
22 May 07 |
gregory |
the Free Software Foundation; either version 2 of the License, or |
1652 |
22 May 07 |
gregory |
(at your option) any later version. |
741 |
10 Oct 06 |
olle |
14 |
|
1652 |
22 May 07 |
gregory |
Proteios is distributed in the hope that it will be useful, but |
1652 |
22 May 07 |
gregory |
WITHOUT ANY WARRANTY; without even the implied warranty of |
1652 |
22 May 07 |
gregory |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1652 |
22 May 07 |
gregory |
General Public License for more details. |
741 |
10 Oct 06 |
olle |
19 |
|
1652 |
22 May 07 |
gregory |
You should have received a copy of the GNU General Public License |
1652 |
22 May 07 |
gregory |
along with this program; if not, write to the Free Software |
1652 |
22 May 07 |
gregory |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
1652 |
22 May 07 |
gregory |
02111-1307, USA. |
1652 |
22 May 07 |
gregory |
24 |
*/ |
741 |
10 Oct 06 |
olle |
// Xerver Free Web Server |
741 |
10 Oct 06 |
olle |
// Copyright (C) 2002-2005 Omid Rouhani |
741 |
10 Oct 06 |
olle |
27 |
// |
741 |
10 Oct 06 |
olle |
28 |
// |
741 |
10 Oct 06 |
olle |
// This program is free software; you can redistribute it and/or |
741 |
10 Oct 06 |
olle |
// modify it under the terms of the GNU General Public License |
741 |
10 Oct 06 |
olle |
// as published by the Free Software Foundation; either version 2 |
741 |
10 Oct 06 |
olle |
// of the License, or (at your option) any later version. |
741 |
10 Oct 06 |
olle |
33 |
// |
741 |
10 Oct 06 |
olle |
// This program is distributed in the hope that it will be useful, |
741 |
10 Oct 06 |
olle |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
741 |
10 Oct 06 |
olle |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
741 |
10 Oct 06 |
olle |
// GNU General Public License for more details. |
741 |
10 Oct 06 |
olle |
38 |
// |
741 |
10 Oct 06 |
olle |
// You should have received a copy of the GNU General Public License |
741 |
10 Oct 06 |
olle |
// along with this program; if not, write to the Free Software |
741 |
10 Oct 06 |
olle |
// 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 |
// ## YOU CAN CONTACT THE AUTHOR (OMID ROUHANI) AT: ## |
741 |
10 Oct 06 |
olle |
// ## HTTP://WWW.JAVASCRIPT.NU/XERVER/ ## |
741 |
10 Oct 06 |
olle |
47 |
// ## ## |
741 |
10 Oct 06 |
olle |
// ## IF YOUR SOFTWARE IS NOT RELEASED UNDER THE ## |
741 |
10 Oct 06 |
olle |
// ## GNU GENERAL PUBLIC LICENSE (GPL), ## |
741 |
10 Oct 06 |
olle |
// ## PLEASE DO NOT COPY ANYTHING FROM THIS SOURCE CODE!!! ## |
741 |
10 Oct 06 |
olle |
51 |
// ## ## |
741 |
10 Oct 06 |
olle |
// ## 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 |
* <B>About this class:</B> <BR> |
1652 |
22 May 07 |
gregory |
* <CODE>MyString</CODE> is a very useful class. <BR> |
1652 |
22 May 07 |
gregory |
* All members in <CODE>MyString</CODE> are <CODE>static</CODE>. <BR> |
741 |
10 Oct 06 |
olle |
* 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 |
* @author <a href="http://www.JavaScript.nu/xerver/" TARGET="_top">Omid Rouhani</a> |
741 |
10 Oct 06 |
olle |
* @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 |
* public static void main(String [] s) { String path; path="aa/.."; |
2418 |
22 Nov 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="./aa/bb/.."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="./aa/bb/cc"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="./aa/bb/../cc"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="./aa/bb/cc/../../dd"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="aa/bb/../../../../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/aa/bb/../../../../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="aa/bb/../../../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/aa/bb/../../../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="aa/bb/../../../../.."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/aa/bb/../../../../.."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="aa/bb/../../../.."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/aa/bb/../../../.."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="/../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); path=".."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); path="."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/abc/def/../../"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/abc/def/../../."; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/abc/def/../../cc/./dd"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/abc/./d/"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="/aa/./bb/./././../cc/../dd"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="../../..///aa/./bb/././//.////../cc/../dd"; |
1652 |
22 May 07 |
gregory |
* System.out.println(path+"\t\t"+makeCanonicalPath(path)); |
1652 |
22 May 07 |
gregory |
* path="c:/aa/../../../b/"; |
1652 |
22 May 07 |
gregory |
* 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 |
// 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 |
* "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 |
* 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 |
// definition of this method is to return |
2418 |
22 Nov 07 |
gregory |
// 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 |
// 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 |
* Number of times "subString" can be found in "bigString". If |
1652 |
22 May 07 |
gregory |
* returnHighValue equals "false" then "aaaa" and "aa" ==> 2. If |
1652 |
22 May 07 |
gregory |
* 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 |
// definition of this method is to return |
2418 |
22 Nov 07 |
gregory |
// 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 |
* 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 |
// forever if you try to replace all |
2418 |
22 Nov 07 |
gregory |
// "/" with "//" in this string |
2418 |
22 Nov 07 |
gregory |
// "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 |
* 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 |
* Returns a String with a fix length: <BR> |
1652 |
22 May 07 |
gregory |
* ("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 |
* If you set <CODE>b_useSlash</CODE> to true you shall use /, otherwise |
2418 |
22 Nov 07 |
gregory |
* use \ in your paths. This will take a relative path and remove all . and .. |
2418 |
22 Nov 07 |
gregory |
* in a proper way. The easiest way to display how this method works is with |
2418 |
22 Nov 07 |
gregory |
* a few examples: |
1652 |
22 May 07 |
gregory |
301 |
* |
1652 |
22 May 07 |
gregory |
* <PRE> |
1652 |
22 May 07 |
gregory |
303 |
* |
1652 |
22 May 07 |
gregory |
* aa/.. ./aa/bb/.. aa/ ./aa/bb/cc aa/bb/cc ./aa/bb/../cc aa/cc |
1652 |
22 May 07 |
gregory |
* ./aa/bb/cc/../../dd aa/dd aa/bb/../../../../../ ../../../ |
1652 |
22 May 07 |
gregory |
* /aa/bb/../../../../../ /../../../ aa/bb/../../../../ ../../ |
1652 |
22 May 07 |
gregory |
* /aa/bb/../../../../ /../../ aa/bb/../../../../.. ../../.. |
1652 |
22 May 07 |
gregory |
* /aa/bb/../../../../.. /../../.. aa/bb/../../../.. ../.. |
1652 |
22 May 07 |
gregory |
* /aa/bb/../../../.. /../.. ../../ ../../ /../../ /../../ .. .. . . |
1652 |
22 May 07 |
gregory |
* /abc/def/../../ / /abc/def/../../. / /abc/def/../../cc/./dd /cc/dd |
1652 |
22 May 07 |
gregory |
* /abc/./d/ /abc/d/ /aa/./bb/./././../cc/../dd /aa/dd c:/aa/../../../b/ |
1652 |
22 May 07 |
gregory |
* ../b/ ../../..///aa/./bb/././//.//../cc/../dd ../../../aa/dd |
1652 |
22 May 07 |
gregory |
313 |
* |
1652 |
22 May 07 |
gregory |
* </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 |
// 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 |
// 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 |
// 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 |
// Remove all /.. in end (note: for example "../.." or "/../../.." |
1652 |
22 May 07 |
gregory |
// 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 |
// 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 |
// 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 |
* Code modified from original Xerver code. Now returns path with web syntax |
2418 |
22 Nov 07 |
gregory |
* separation '/'. This returns <CODE>makeCanonicalPath(path, |
2418 |
22 Nov 07 |
gregory |
* (File.separatorChar=='/'))</CODE>, which means that the paths sent to |
2418 |
22 Nov 07 |
gregory |
* <CODE>makeCanonicalPath</CODE> shall use \ if you use Windows and / if |
2418 |
22 Nov 07 |
gregory |
* you use for example UNIX, Linux or Mac. Please see documentation for |
2418 |
22 Nov 07 |
gregory |
* <CODE>makeCanonicalPath(String path, boolean b_useSlash)</CODE> for |
2418 |
22 Nov 07 |
gregory |
* 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 |
// return makeCanonicalPath(path, (File.separatorChar=='/')); |
938 |
20 Nov 06 |
olle |
451 |
/* |
938 |
20 Nov 06 |
olle |
* 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 |
// 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 |
// 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 |
} |