1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.qedeq.base.io;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.apache.commons.lang.ArrayUtils;
22 import org.qedeq.base.utility.EqualsUtility;
23 import org.qedeq.base.utility.StringUtility;
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public final class Path {
38
39
40
41 private final String[] path;
42
43
44 private final String name;
45
46
47
48
49
50
51
52
53 public Path(final String filePath) {
54 final String[] p = StringUtility.split(filePath, "/");
55 name = p[p.length - 1];
56 final String[] p2 = new String[p.length - 1];
57 System.arraycopy(p, 0, p2, 0, p2.length);
58 path = removeRelativeDirs(p2);
59 }
60
61
62
63
64
65
66
67
68
69 public Path(final String dirPath, final String fileName) {
70 this((dirPath.endsWith("/") ? StringUtility.split(dirPath.substring(0,
71 dirPath.length() - 1), "/") : StringUtility.split(dirPath, "/")), fileName);
72 }
73
74
75
76
77
78
79
80
81
82 public Path(final String[] dirNames, final String fileName) {
83 path = removeRelativeDirs(dirNames);
84 name = (fileName != null ? fileName : "");
85 }
86
87
88
89
90
91
92
93
94 public Path createRelative(final String filePath) {
95 final Path to = new Path(filePath);
96 if (isRelative()) {
97
98 return to;
99 }
100 if (to.isRelative()) {
101 return to;
102 }
103
104
105 int max = 0;
106 while (max < path.length && max < to.path.length) {
107 if (!"..".equals(path[max]) && EqualsUtility.equals(path[max], to.path[max])) {
108 max++;
109 } else {
110 break;
111 }
112 }
113 final String[] r = new String[path.length - max + to.path.length - max];
114 for (int i = max; i < path.length; i++) {
115 r[i - max] = "..";
116 }
117 for (int i = max; i < to.path.length; i++) {
118 r[i - max + path.length - max] = to.path[i];
119 }
120 return new Path(r, to.name);
121 }
122
123
124
125
126
127
128 public boolean isDirectory() {
129 return name.length() == 0;
130 }
131
132
133
134
135
136
137 public boolean isFile() {
138 return !isDirectory();
139 }
140
141
142
143
144
145
146
147 public boolean isAbsolute() {
148 return path.length > 0 && (path[0].length() == 0 || path[0].endsWith(":"));
149 }
150
151
152
153
154
155
156 public boolean isRelative() {
157 return !isAbsolute();
158 }
159
160
161
162
163
164
165 public String getFileName() {
166 return name;
167 }
168
169
170
171
172
173
174
175
176 public String getDirectory() {
177 StringBuffer result = new StringBuffer(256);
178 for (int i = 0; i < path.length; i++) {
179 result.append(path[i]).append("/");
180 }
181 return result.toString();
182 }
183
184
185
186
187
188
189
190 private String[] removeRelativeDirs(final String[] dirNames) {
191 List d = new ArrayList();
192 for (int i = 0; i < dirNames.length; i++) {
193 d.add(dirNames[i]);
194 }
195 for (int i = 0; i < d.size(); ) {
196 if (i > 0 && "..".equals(d.get(i)) && !"".equals(d.get(i - 1))
197 && !"..".equals(d.get(i - 1))) {
198 d.remove(i - 1);
199 d.remove(i - 1);
200 i--;
201 } else if (".".equals(d.get(i))) {
202 d.remove(i);
203 } else {
204 i++;
205 }
206 }
207 return (String[]) d.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
208 }
209
210 public String toString() {
211 StringBuffer result = new StringBuffer(256);
212 for (int i = 0; i < path.length; i++) {
213 result.append(path[i]).append("/");
214 }
215 result.append(name);
216 return result.toString();
217 }
218
219 public boolean equals(final Object obj) {
220 if (!(obj instanceof Path)) {
221 return false;
222 }
223 final Path other = (Path) obj;
224 return EqualsUtility.equals(path, other.path) && name.equals(other.name);
225 }
226
227 public int hashCode() {
228 return toString().hashCode();
229 }
230
231 }
232