}
if (!zipFile.isFile()) {
throw new InvalidUserDataException(String.format("Cannot expand %s as it is not a file.", this));
}
AtomicBoolean stopFlag = new AtomicBoolean();
try {
ZipFile zip = new ZipFile(zipFile);
try {
// The iteration order of zip.getEntries() is based on the hash of the zip entry. This isn't much use
// to us. So, collect the entries in a map and iterate over them in alphabetical order.
Map<String, ZipEntry> entriesByName = new TreeMap<String, ZipEntry>();
Enumeration entries = zip.getEntries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
entriesByName.put(entry.getName(), entry);
}
Iterator<ZipEntry> sortedEntries = entriesByName.values().iterator();
while (!stopFlag.get() && sortedEntries.hasNext()) {
ZipEntry entry = sortedEntries.next();
if (entry.isDirectory()) {
visitor.visitDir(new DetailsImpl(entry, zip, stopFlag));
} else {
visitor.visitFile(new DetailsImpl(entry, zip, stopFlag));