001: /*
002: License $Id: PlatformHelper.java,v 1.6 2005/03/15 20:08:13 hendriks73 Exp $
003:
004: Copyright (c) 2001-2005 tagtraum industries.
005:
006: LGPL
007: ====
008:
009: jo! is free software; you can redistribute it and/or
010: modify it under the terms of the GNU Lesser General Public
011: License as published by the Free Software Foundation; either
012: version 2.1 of the License, or (at your option) any later version.
013:
014: jo! is distributed in the hope that it will be useful,
015: but WITHOUT ANY WARRANTY; without even the implied warranty of
016: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: Lesser General Public License for more details.
018:
019: You should have received a copy of the GNU Lesser General Public
020: License along with this library; if not, write to the Free Software
021: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022:
023: For LGPL see <http://www.fsf.org/copyleft/lesser.txt>
024:
025:
026: Sun license
027: ===========
028:
029: This release contains software by Sun Microsystems. Therefore
030: the following conditions have to be met, too. They apply to the
031: files
032:
033: - lib/mail.jar
034: - lib/activation.jar
035: - lib/jsse.jar
036: - lib/jcert.jar
037: - lib/jaxp.jar
038: - lib/crimson.jar
039: - lib/servlet.jar
040: - lib/jnet.jar
041: - lib/jaas.jar
042: - lib/jaasmod.jar
043:
044: contained in this release.
045:
046: a. Licensee may not modify the Java Platform
047: Interface (JPI, identified as classes contained within the javax
048: package or any subpackages of the javax package), by creating additional
049: classes within the JPI or otherwise causing the addition to or modification
050: of the classes in the JPI. In the event that Licensee creates any
051: Java-related API and distribute such API to others for applet or
052: application development, you must promptly publish broadly, an accurate
053: specification for such API for free use by all developers of Java-based
054: software.
055:
056: b. Software is confidential copyrighted information of Sun and
057: title to all copies is retained by Sun and/or its licensors. Licensee
058: shall not modify, decompile, disassemble, decrypt, extract, or otherwise
059: reverse engineer Software. Software may not be leased, assigned, or
060: sublicensed, in whole or in part. Software is not designed or intended
061: for use in on-line control of aircraft, air traffic, aircraft navigation
062: or aircraft communications; or in the design, construction, operation or
063: maintenance of any nuclear facility. Licensee warrants that it will not
064: use or redistribute the Software for such purposes.
065:
066: c. Software is provided "AS IS," without a warranty
067: of any kind. ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES,
068: INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
069: PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
070:
071: d. This License is effective until terminated. Licensee may
072: terminate this License at any time by destroying all copies of Software.
073: This License will terminate immediately without notice from Sun if Licensee
074: fails to comply with any provision of this License. Upon such termination,
075: Licensee must destroy all copies of Software.
076:
077: e. Software, including technical data, is subject to U.S.
078: export control laws, including the U.S. Export Administration Act and its
079: associated regulations, and may be subject to export or import regulations
080: in other countries. Licensee agrees to comply strictly with all such
081: regulations and acknowledges that it has the responsibility to obtain
082: licenses to export, re-export, or import Software. Software may not be
083: downloaded, or otherwise exported or re-exported (i) into, or to a national
084: or resident of, Cuba, Iraq, Iran, North Korea, Libya, Sudan, Syria or any
085: country to which the U.S. has embargoed goods; or (ii) to anyone on the
086: U.S. Treasury Department's list of Specially Designated Nations or the U.S.
087: Commerce Department's Table of Denial Orders.
088:
089:
090: Feedback
091: ========
092:
093: We encourage your feedback and suggestions and want to use your feedback to
094: improve the Software. Send all such feedback to:
095: <feedback@tagtraum.com>
096:
097: For more information on tagtraum industries and jo!
098: please see <http://www.tagtraum.com/>.
099:
100:
101: */
102: package com.tagtraum.framework.util;
103:
104: import java.io.File;
105: import java.util.StringTokenizer;
106:
107: /**
108: * Klasse mit Methoden zum Handling von plattformspezifischen
109: * Gegebenheiten.
110: *
111: * TODO: Translate comments to English.
112: *
113: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
114: * @version 1.1beta1 $Id: PlatformHelper.java,v 1.6 2005/03/15 20:08:13 hendriks73 Exp $
115: */
116: public class PlatformHelper {
117:
118: /**
119: * Source-Version
120: */
121: public static String vcid = "$Id: PlatformHelper.java,v 1.6 2005/03/15 20:08:13 hendriks73 Exp $";
122:
123: /**
124: * Array mit möglichen Dateiseparatoren. Zur Zeit sind
125: * dies nur <code>/</code> und <code>\</code>.
126: */
127: public static final char[] fileSeparators = { '\\', '/' };
128:
129: /**
130: * Ersetzt bekannte Dateiseparatoren durch den angebenen
131: * Dateiseparatoren.
132: *
133: * @param aFileSeparator enthält den Dateiseparator
134: * @param aDirtyPath enthält einen Pfad
135: * @return plattformspezifischen Pfad
136: */
137: public final static String getPathForSeparator(String aDirtyPath,
138: char aFileSeparator) {
139: if (aDirtyPath == null) {
140: return null;
141: }
142: String theCleanPath = null;
143: for (int i = 0; i < fileSeparators.length; i++) {
144: if (fileSeparators[i] != aFileSeparator) {
145: theCleanPath = aDirtyPath.replace(fileSeparators[i],
146: aFileSeparator);
147: }
148: }
149: return theCleanPath;
150: }
151:
152: /**
153: * Ersetzt systemfremde Dateiseparatoren durch systemspezifische
154: * Dateiseparatoren. Unter Windows wird also aus '/' '\', unter
155: * Unix aus '\' '/'.
156: *
157: * @param aDirtyPath enthält einen Pfad
158: * @return plattformspezifischen Pfad
159: */
160: public final static String getOSSpecificPath(String aDirtyPath) {
161: return getPathForSeparator(aDirtyPath, File.separatorChar);
162: }
163:
164: /**
165: * Entfernt <code>..</code> und <code>.</code> aus einem
166: * Dateipfad. Es wird dabei der plattformspezifische
167: * Dateiseparator benutzt.
168: *
169: * @exception IllegalArgumentException falls der Pfad unterhalb der Wurzel
170: * zielt. Ein Pfad <code>/../../passwd</code> oder <code>../../passwd</code>
171: * ist also nicht erlaubt.
172: * @param aDirtyPath zu bereinigender Pfad
173: * @return bereinigter Pfad
174: */
175: public final static String removeDoubleDots(String aDirtyPath) {
176: return removeDoubleDots(aDirtyPath, File.separatorChar);
177: }
178:
179: /**
180: * Entfernt <code>..</code> und <code>.</code> aus einem
181: * Dateipfad. Es wird dabei der angegebene
182: * Dateiseparator benutzt.
183: *
184: * @exception IllegalArgumentException falls der Pfad unterhalb der Wurzel
185: * zielt. Ein Pfad <code>/../../passwd</code> oder <code>../../passwd</code>
186: * ist also nicht erlaubt.
187: * @param aDirtyPath zu bereinigender Pfad
188: * @param aFileSeparator zu benutzender Dateiseparator
189: * @return bereinigter Pfad
190: */
191: public final static String removeDoubleDots(String aDirtyPath,
192: char aFileSeparator) {
193: char theFileSeparator[] = { aFileSeparator };
194: StringTokenizer theTokenizer = new StringTokenizer(aDirtyPath,
195: new String(theFileSeparator));
196: String[] buf = new String[theTokenizer.countTokens()];
197: boolean startsWithSeparator = false;
198: boolean endsWithSeparator = false;
199:
200: if (aDirtyPath != null && aDirtyPath.length() > 0) {
201: startsWithSeparator = aDirtyPath.charAt(0) == aFileSeparator;
202: }
203:
204: if (aDirtyPath != null && aDirtyPath.length() > 1) {
205: endsWithSeparator = aDirtyPath
206: .charAt(aDirtyPath.length() - 1) == aFileSeparator;
207: }
208:
209: int i = 0;
210:
211: while (theTokenizer.hasMoreTokens()) {
212: String theToken = theTokenizer.nextToken();
213:
214: if (theToken.equals("..")) {
215: if (i > 0) {
216: i--;
217:
218: continue;
219: } else {
220: throw new IllegalArgumentException(
221: "Path aims beneath root: " + aDirtyPath);
222: }
223: } else {
224: if (theToken.equals(".")) {
225: continue;
226: }
227: }
228:
229: buf[i++] = theToken;
230: }
231:
232: StringBuffer sb = new StringBuffer();
233:
234: for (int j = 0; j < i; j++) {
235: if (j != 0 || startsWithSeparator) {
236: sb.append(aFileSeparator);
237: }
238:
239: sb.append(buf[j]);
240: }
241:
242: if (endsWithSeparator) {
243: sb.append(aFileSeparator);
244: }
245:
246: return sb.toString();
247: }
248:
249: }
|