// We need to create a fake jar entry to mimic this behavior
rootEntry = new JarEntry("/");
}
// Get the root entry
JarEntryInfo rootEntryInfo = new JarEntryInfo(rootEntry);
// The entries we will browse
JarInfo jarInfo = new JarInfo(jarFile);
boolean enabled = true;
//
Stack stack = new Stack(jarURL, rootEntryInfo);
for (Iterator i = jarInfo.entries(); i.hasNext();)
{
JarEntryInfo entryInfo = (JarEntryInfo)i.next();
// Only consider descendant of the root or root itself
if (entryInfo.equals(rootEntryInfo) || entryInfo.isDescendantOf(rootEntryInfo))
{
List relPath;
// The relative path from the root
if (rootEntryInfo.size() > 1){
relPath = entryInfo.getNames().subList(rootEntryInfo.size() - 1, entryInfo.size());
}
else
{
relPath = entryInfo.getNames();
}
// Enter intermediate dirs
while (stack.size() < relPath.size() - 1 && enabled)
{
String name = (String)relPath.get(stack.size());
stack.push(name, true);
URL url = stack.getURL();
boolean visit = filter == null || filter.acceptDir(url);
if (visit)
{
visitor.startDir(url, name);
}
else
{
enabled = false;
}
}
// Leave intermediate dirs
while (stack.size() > relPath.size() - 1)
{
URL url = stack.getURL();
Stack.Entry entry = stack.pop();
if (enabled)
{
String name = entry.name;
visitor.endDir(url, name);
}
enabled = true;
}
//
if (enabled)
{
if (entryInfo.isDirectory())
{
String name = (String)relPath.get(relPath.size() - 1);
stack.push(name, true);
URL url = stack.getURL();
boolean visit = filter == null || filter.acceptDir(url);