blob: 69632e9eb18e40dcdce1b87a76f5c2099ca999db [file] [log] [blame]
package com.ibm.text.utility;
import java.util.*;
import java.io.*;
import java.io.*;
import com.ibm.text.UCD.UCD_Types;
public class DirectoryIterator {
private File baseDirectory;
private Iterator fileList;
private DirectoryIterator subdirectory = null;
private FileFilter filter = null;
static private Comparator reverseComparator =
new Comparator() {
public int compare(Object a, Object b) {
return ((Comparable) b).compareTo(a);
}
};
public DirectoryIterator(File directory, FileFilter filter) {
setDirectory(directory);
setFilter(filter);
}
public DirectoryIterator(String directory, FileFilter filter) {
setDirectory(new File(directory));
setFilter(filter);
}
public DirectoryIterator(File directory) {
setDirectory(directory);
}
public DirectoryIterator(String directory) {
setDirectory(new File(directory));
}
public void reset() {
setDirectory(baseDirectory);
}
public void setDirectory(File directory) {
if (!directory.isDirectory()) {
throw new IllegalArgumentException("Not a directory: " + directory);
}
baseDirectory = directory;
Set tempSet = new TreeSet(reverseComparator);
tempSet.addAll(java.util.Arrays.asList(directory.list()));
fileList = tempSet.iterator();
}
public File getDirectory() {
return baseDirectory;
}
public void setFilter(FileFilter filter) {
this.filter = filter;
}
public FileFilter getFilter() {
return filter;
}
/** Returns null when done
*/
public File next() {
File file = null;
while (true) {
if (subdirectory != null) {
file = subdirectory.next();
if (file != null) return file;
subdirectory = null; // null out when done
}
if (!fileList.hasNext()) return null;
String filestr = (String)fileList.next();
file = new File(baseDirectory, filestr);
if (file.isDirectory()) {
subdirectory = new DirectoryIterator(file, filter);
continue;
}
if (filter == null) return file;
if (filter.accept(file)) return file;
}
}
/**
* Returns the part before any '.' or '-' in the file name, without directory
*/
static public String getRoot(File f) {
String s = f.getName();
int dotPos = s.indexOf('.');
if (dotPos < 0) dotPos = s.length();
int dashPos = s.indexOf('-');
if (dashPos < 0) dashPos = s.length();
if (dotPos < dashPos) dashPos = dotPos;
return s.substring(0,dashPos);
}
public static class RootFileFilter implements FileFilter {
String root;
public RootFileFilter(String root) {
setRoot(root);
}
public void setRoot(String root) {
this.root = root;
}
public String getRoot() {
return root;
}
public boolean accept(File f) {
return DirectoryIterator.getRoot(f).equals("DerivedCoreProperties");
}
public String getDescription() {
return "Root is '" + root + "'";
}
public String toString() {
return getDescription();
}
};
static public void test() {
File testDir = new File(UCD_Types.UCD_DIR);
DirectoryIterator di;
di = new DirectoryIterator(testDir, new RootFileFilter("DerivedBinaryProperties"));
System.out.println();
System.out.println("Filter: " + di.getFilter());
while (true) {
File f = di.next();
if (f == null) break;
System.out.println(f);
}
di.reset();
di.setFilter(new RootFileFilter("DerivedCoreProperties"));
System.out.println();
System.out.println("Filter: " + di.getFilter());
while (true) {
File f = di.next();
if (f == null) break;
System.out.println(f);
}
}
static public boolean isAlmostIdentical(File file1, File file2, boolean show) throws IOException {
BufferedReader br1 = new BufferedReader(new FileReader(file1), 32*1024);
BufferedReader br2 = new BufferedReader(new FileReader(file2), 32*1024);
try {
for (int lineCount = 0; ; ++lineCount) {
String line1 = br1.readLine();
String line2 = br2.readLine();
if (line1 == null) {
if (line2 == null) return true;
if (show) {
Utility.fixDot();
System.out.println("Found difference in : " + file1 + ", " + file2);
System.out.println(" Line1: " + line1);
System.out.println(" Line2: " + line2);
}
return false;
}
if (!line1.equals(line2)) {
if (line1.startsWith("# Generated") && line2.startsWith("# Generated")) continue;
if (line1.startsWith("# Date") && line2.startsWith("# Date")) continue;
if (lineCount == 0 && line1.startsWith("#") && line2.startsWith("#")) continue;
if (show) {
Utility.fixDot();
System.out.println("Found difference in : " + file1 + ", " + file2);
System.out.println(" Line1: " + line1);
System.out.println(" Line2: " + line2);
}
return false;
}
}
} finally {
br1.close();
br2.close();
}
}
}