adbc0913707bbe521bfc0d9f74fac210a6910e71
[scannotation] / src / main / java / org / scannotation / classpath / IteratorFactory.java
1 package org.scannotation.classpath;
2
3 import java.io.IOException;
4 import java.net.URL;
5 import java.util.concurrent.ConcurrentHashMap;
6
7 /**
8  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
9  * @version $Revision: 1 $
10  */
11 public class IteratorFactory
12 {
13    private static final ConcurrentHashMap<String, DirectoryIteratorFactory> registry = new ConcurrentHashMap<String, DirectoryIteratorFactory>();
14
15    static
16    {
17       registry.put("file", new FileProtocolIteratorFactory());
18    }
19
20
21    public static StreamIterator create(URL url, Filter filter) throws IOException
22    {
23       String urlString = url.toString();
24       if (urlString.endsWith("!/"))
25       {
26          urlString = urlString.substring(4);
27          urlString = urlString.substring(0, urlString.length() - 2);
28          url = new URL(urlString);
29       }
30
31
32       if (!urlString.endsWith("/"))
33       {
34          return new JarIterator(url.openStream(), filter);
35       }
36       else
37       {
38          DirectoryIteratorFactory factory = registry.get(url.getProtocol());
39          if (factory == null) throw new IOException("Unable to scan directory of protocol: " + url.getProtocol());
40          return factory.create(url, filter);
41       }
42    }
43 }