package org.exist.util;
import java.io.File;
import java.util.ArrayList;
public class DirectoryScanner {
private final static String extractBaseDir(String pattern) {
int p = 0;
char ch;
for(int i = 0; i < pattern.length(); i++) {
ch = pattern.charAt(i);
if(ch == File.separatorChar || ch == ':') {
p = i;
continue;
} else if(ch == '*' || ch == '?') {
if(p > 0)
return pattern.substring(0, p + 1);
}
}
return null;
}
public final static File[] scanDir(String pattern) {
//TODO : why this test ? File should make it ! -pb
pattern = pattern.replace('/', File.separatorChar).replace('\\',File.separatorChar);
String baseDir = extractBaseDir(pattern);
if(baseDir == null) {
// Dizzzz ##### Why this dependancy?
baseDir = System.getProperty("user.dir");
pattern = baseDir + File.separator + pattern;
}
File base = new File(baseDir);
return scanDir(base, pattern.substring(baseDir.length()));
}
public final static File[] scanDir(File baseDir, String pattern) {
///TODO : why this test ? File should make it ! -pb
pattern = pattern.replace('/', File.separatorChar).replace('\\',File.separatorChar);
ArrayList list = new ArrayList();
scanDir(list, baseDir, "", pattern);
File[] files = new File[list.size()];
return (File[])list.toArray(files);
}
private final static void scanDir(ArrayList list, File dir, String vpath, String pattern) {
String files[] = dir.list();
if (files == null) {
return;
}
File file;
String name;
for(int i = 0; i < files.length; i++) {
file = new File(dir, files[i]);
name = vpath + files[i];
if(file.isDirectory() && matchStart(pattern, name)) {
scanDir(list, file, name + File.separator, pattern);
} else if(match(pattern, name))
list.add(file);
}
}
public final static boolean match(String pattern, String name) {
return SelectorUtils.matchPath(pattern, name);
}
public final static boolean matchStart(String pattern, String name) {
return SelectorUtils.matchPatternStart(pattern, name);
}
public static void main(String args[]) {
File files[] = scanDir("/home/*/xml/**/*.xml");
for(int i = 0; i < files.length; i++)
System.out.println(files[i].getAbsolutePath());
files = scanDir("/does-not-exist/*.xml");
for(int i = 0; i < files.length; i++)
System.out.println(files[i].getAbsolutePath());
}
}