package org.cmc.music.util;
import java.io.File;
//import org.cmc.shared.util.Debug; import com.exe4j.*;
public class FSTraversal
{
public static final int kFILES = 1;
public static final int kFOLDERS = 2;
public static final int kFILES_AND_FOLDERS = 3;
public static final int kALL = 4;
public interface Visitor
{
public boolean visit(File file, double progress_estimate);
}
public boolean traverseFiles(File file, Visitor visitor)
{
return traverse(file, kFILES, visitor);
}
public boolean traverseFolders(File file, Visitor visitor)
{
return traverse(file, kFOLDERS, visitor);
}
public boolean traverseAll(File file, Visitor visitor)
{
return traverse(file, kFILES_AND_FOLDERS, visitor);
}
public boolean traverse(File file, int mode, Visitor visitor)
{
return traverse(file, mode, visitor, 0, 1);
}
private boolean traverse(File file, int mode, Visitor visitor,
double estimate, double estimate_increment)
{
if (file.isFile())
{
if ((mode == kFILES) || (mode == kFILES_AND_FOLDERS)
|| (mode == kALL))
{
if (!visitor.visit(file, estimate))
return false;
}
} else if (file.isDirectory())
{
File files[] = file.listFiles();
if (files != null)
{
for (int i = 0; i < files.length; i++)
{
File child = files[i];
// new FSTraversal().traverse(files[i], mode, visitor,
// estimate * i / files.length);
// Debug.debug("estimate: " + estimate + ", i: " + i
// + ", files.length: " + files.length + ", result: "
// + (estimate * i / files.length));
if (!traverse(child, mode, visitor, estimate
+ estimate_increment * i / files.length,
estimate_increment / files.length))
return false;
}
}
if ((mode == kFOLDERS) || (mode == kFILES_AND_FOLDERS)
|| (mode == kALL))
{
if (!visitor.visit(file, estimate))
return false;
}
} else
{
if (mode == kALL)
{
if (!visitor.visit(file, estimate))
return false;
}
}
return true;
}
}