package org.audit4j.core.extra.scannotation;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
public class IteratorFactory {
private static final ConcurrentHashMap<String, DirectoryIteratorFactory> registry = new ConcurrentHashMap<String, DirectoryIteratorFactory>();
/**
* private constructor to avoid instantiation of this class
*/
private IteratorFactory(){
}
static {
registry.put("file", new FileProtocolIteratorFactory());
}
public static StreamIterator create(URL url, Filter filter) throws IOException {
String urlString = url.toString();
if (urlString.endsWith("!/")) {
urlString = urlString.substring(4);
urlString = urlString.substring(0, urlString.length() - 2);
url = new URL(urlString);
}
if (!urlString.endsWith("/")) {
return new JarIterator(url.openStream(), filter);
} else {
DirectoryIteratorFactory factory = registry.get(url.getProtocol());
if (factory == null)
throw new IOException("Unable to scan directory of protocol: " + url.getProtocol());
return factory.create(url, filter);
}
}
}