1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codehaus.mojo.wagon.shared;
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.Iterator;
36 import java.util.List;
37
38 import org.apache.maven.plugin.logging.Log;
39 import org.apache.maven.wagon.Wagon;
40 import org.apache.maven.wagon.WagonException;
41 import org.codehaus.plexus.util.StringUtils;
42
43 public class WagonDirectoryScanner {
44 private final static String[] NOT_DIRECTORIES = new String[] { ".jar", ".zip", ".md5", ".sha1", ".pom", ".xml",
45 ".war" };
46
47
48
49
50
51 public static final String[] DEFAULTEXCLUDES = org.codehaus.plexus.util.DirectoryScanner.DEFAULTEXCLUDES;
52
53
54
55
56 private Wagon wagon;
57
58
59
60
61 private String directory;
62
63
64 private String[] includes;
65
66
67 private String[] excludes;
68
69
70
71
72 private boolean isCaseSensitive = true;
73
74
75
76
77 private List<String> filesIncluded = new ArrayList<String>();
78
79 private Log logger;
80
81
82
83
84
85
86
87
88
89
90
91 public void setIncludes(String[] includes) {
92 if (includes == null) {
93 this.includes = null;
94 } else {
95 this.includes = new String[includes.length];
96 for (int i = 0; i < includes.length; i++) {
97 String pattern = includes[i].trim();
98
99 if (pattern.endsWith("/")) {
100 pattern += "**";
101 }
102 this.includes[i] = pattern;
103 }
104 }
105 }
106
107
108
109
110
111
112
113
114
115
116 public void setExcludes(String[] excludes) {
117 if (excludes == null) {
118 this.excludes = null;
119 } else {
120 this.excludes = new String[excludes.length];
121 for (int i = 0; i < excludes.length; i++) {
122 String pattern = excludes[i].trim();
123
124 if (pattern.endsWith("/")) {
125 pattern += "**";
126 }
127 this.excludes[i] = pattern;
128 }
129 }
130 }
131
132
133
134
135
136
137
138
139
140 private boolean isIncluded(String name) {
141 logger.debug("includes.length=" + includes.length);
142 for (int i = 0; i < includes.length; i++) {
143 logger.debug("includes[" + i + "]=" + includes[i]);
144 if (matchPath(includes[i], name, isCaseSensitive)) {
145 return true;
146 }
147 }
148 return false;
149 }
150
151
152
153
154
155
156
157
158
159 protected boolean isExcluded(String name) {
160 for (int i = 0; i < excludes.length; i++) {
161 if (matchPath(excludes[i], name, isCaseSensitive)) {
162 return true;
163 }
164 }
165 return false;
166 }
167
168
169
170
171
172
173
174
175
176 protected boolean couldHoldIncluded(String name) {
177 for (int i = 0; i < includes.length; i++) {
178 if (matchPatternStart(includes[i], name, isCaseSensitive)) {
179 return true;
180 }
181 }
182 return false;
183 }
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 protected static boolean matchPatternStart(String pattern, String str, boolean isCaseSensitive) {
201 return SelectorUtils.matchPatternStart(pattern, str, isCaseSensitive);
202 }
203
204
205
206
207
208
209
210
211
212
213
214
215
216 private static boolean matchPath(String pattern, String str, boolean isCaseSensitive) {
217 return SelectorUtils.matchPath(pattern, str, isCaseSensitive);
218 }
219
220 public void scan() throws WagonException {
221 if (wagon == null) {
222 throw new IllegalStateException("No wagon set");
223 }
224
225 if (StringUtils.isBlank(directory)) {
226 directory = "";
227 }
228
229
230
231 if (includes == null) {
232
233 includes = new String[1];
234 includes[0] = "**";
235 }
236
237 if (excludes == null) {
238 excludes = new String[0];
239 }
240
241 filesIncluded = new ArrayList<String>();
242
243 scandir(directory);
244
245 Collections.sort(filesIncluded);
246
247 }
248
249
250
251
252 public void addDefaultExcludes() {
253 int excludesLength = excludes == null ? 0 : excludes.length;
254 String[] newExcludes;
255 newExcludes = new String[excludesLength + DEFAULTEXCLUDES.length];
256 if (excludesLength > 0) {
257 System.arraycopy(excludes, 0, newExcludes, 0, excludesLength);
258 }
259 for (int i = 0; i < DEFAULTEXCLUDES.length; i++) {
260 newExcludes[i + excludesLength] = DEFAULTEXCLUDES[i];
261 }
262 excludes = newExcludes;
263 }
264
265
266
267
268
269
270
271
272
273
274 private boolean isRidiculousFile(String fileName) {
275 return fileName.endsWith(".") || fileName.contains("*") || fileName.startsWith("?") || fileName.startsWith("#");
276 }
277
278
279
280
281
282
283
284
285
286 protected void scandir(String dir) throws WagonException {
287
288 if (StringUtils.isBlank(dir)) {
289 logger.info("Scanning '" + dir + "'");
290 } else {
291 logger.info("Scanning " + dir);
292 }
293 List<?> files = wagon.getFileList(dir);
294
295
296 for (Iterator<?> itr = files.iterator(); itr.hasNext();) {
297 String fileName = (String) itr.next();
298 if (isRidiculousFile(fileName)) {
299 continue;
300 }
301
302 boolean directory = isDirectory(fileName);
303 boolean included = isIncluded(fileName);
304 boolean excluded = isExcluded(fileName);
305 boolean chi = directory && couldHoldIncluded(fileName);
306 boolean include = included && !excluded || chi && !excluded;
307
308 if (!include) {
309 logger.debug("Skipping " + fileName);
310 logger.debug("fileName=" + fileName + " included=" + included + " excluded=" + excluded + " chi=" + chi);
311 continue;
312 }
313
314 if (directory) {
315 scandir(fileName);
316 } else {
317 filesIncluded.add(fileName);
318 }
319 }
320 }
321
322 private boolean isDirectory(String existingRemotePath) throws WagonException {
323 for (int x = 0; x < NOT_DIRECTORIES.length; x++) {
324 if (existingRemotePath.endsWith(NOT_DIRECTORIES[x])) {
325 return false;
326 }
327 }
328 return existingRemotePath.endsWith("/");
329 }
330
331 public List<String> getFilesIncluded() {
332 return filesIncluded;
333 }
334
335 public void setWagon(Wagon wagon) {
336 this.wagon = wagon;
337 }
338
339 public void setCaseSensitive(boolean isCaseSensitive) {
340 this.isCaseSensitive = isCaseSensitive;
341 }
342
343 public void setDirectory(String basePath) {
344 this.directory = basePath;
345 }
346
347 public Log getLogger() {
348 return logger;
349 }
350
351 public void setLogger(Log logger) {
352 this.logger = logger;
353 }
354
355 }