1 /*
2 * The Apache Software License, Version 1.1
3 *
4 * Copyright (c) 2000,2002-2003 The Apache Software Foundation. All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. The end-user documentation included with the redistribution, if
20 * any, must include the following acknowlegement:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowlegement may appear in the software itself,
24 * if and wherever such third-party acknowlegements normally appear.
25 *
26 * 4. The names "Ant" and "Apache Software
27 * Foundation" must not be used to endorse or promote products derived
28 * from this software without prior written permission. For written
29 * permission, please contact apache@apache.org.
30 *
31 * 5. Products derived from this software may not be called "Apache"
32 * nor may "Apache" appear in their names without prior written
33 * permission of the Apache Group.
34 *
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 * SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
53 */
54 package attrib4j.utensil;
55
56 import java.io.File;
57 import java.util.NoSuchElementException;
58 import java.util.StringTokenizer;
59
60 /***
61 * A Path tokenizer takes a path and returns the components that make up
62 * that path.
63 *
64 * The path can use path separators of either ':' or ';' and file separators
65 * of either '/' or '\'.
66 *
67 * @author Conor MacNeill
68 * @author <a href="mailto:jtulley@novell.com">Jeff Tulley</a>
69 */
70 public class PathTokenizer {
71 /***
72 * A tokenizer to break the string up based on the ':' or ';' separators.
73 */
74 private StringTokenizer tokenizer;
75
76 /***
77 * A String which stores any path components which have been read ahead
78 * due to DOS filesystem compensation.
79 */
80 private String lookahead = null;
81
82 /***
83 * Flag to indicate whether or not we are running on a platform with a
84 * DOS style filesystem
85 */
86 private boolean dosStyleFilesystem;
87
88 /***
89 * Constructs a path tokenizer for the specified path.
90 *
91 * @param path The path to tokenize. Must not be <code>null</code>.
92 */
93 public PathTokenizer(String path) {
94
95 // on Windows and Unix, we can ignore delimiters and still have
96 // enough information to tokenize correctly.
97 tokenizer = new StringTokenizer(path, ":;", false);
98
99 dosStyleFilesystem = File.pathSeparatorChar == ';';
100 }
101
102 /***
103 * Tests if there are more path elements available from this tokenizer's
104 * path. If this method returns <code>true</code>, then a subsequent call
105 * to nextToken will successfully return a token.
106 *
107 * @return <code>true</code> if and only if there is at least one token
108 * in the string after the current position; <code>false</code> otherwise.
109 */
110 public boolean hasMoreTokens() {
111 if (lookahead != null) {
112 return true;
113 }
114
115 return tokenizer.hasMoreTokens();
116 }
117
118 /***
119 * Returns the next path element from this tokenizer.
120 *
121 * @return the next path element from this tokenizer.
122 *
123 * @exception NoSuchElementException if there are no more elements in this
124 * tokenizer's path.
125 */
126 public String nextToken() throws NoSuchElementException {
127 String token = null;
128 if (lookahead != null) {
129 token = lookahead;
130 lookahead = null;
131 } else {
132 token = tokenizer.nextToken().trim();
133 }
134
135 if (token.length() == 1
136 && Character.isLetter(token.charAt(0))
137 && dosStyleFilesystem
138 && tokenizer.hasMoreTokens()) {
139 // we are on a dos style system so this path could be a drive
140 // spec. We look at the next token
141 String nextToken = tokenizer.nextToken().trim();
142 if (nextToken.startsWith("//") || nextToken.startsWith("/")) {
143 // we know we are on a DOS style platform and the next path
144 // starts with a slash or backslash, so we know this is a
145 // drive spec
146 token += ":" + nextToken;
147 } else {
148 // store the token just read for next time
149 lookahead = nextToken;
150 }
151 }
152
153 return token;
154 }
155 }
This page was automatically generated by Maven