1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.discovery.resource;
18
19 import java.io.IOException;
20 import java.net.URL;
21 import java.util.Enumeration;
22
23 import org.apache.commons.discovery.Resource;
24 import org.apache.commons.discovery.ResourceDiscover;
25 import org.apache.commons.discovery.ResourceIterator;
26 import org.apache.commons.discovery.jdk.JDKHooks;
27 import org.apache.commons.discovery.log.DiscoveryLogFactory;
28 import org.apache.commons.logging.Log;
29
30
31 /***
32 * @author Richard A. Sitze
33 * @author Craig R. McClanahan
34 * @author Costin Manolache
35 * @author James Strachan
36 */
37 public class DiscoverResources
38 extends ResourceDiscoverImpl
39 implements ResourceDiscover
40 {
41 private static Log log = DiscoveryLogFactory.newLog(DiscoverResources.class);
42 public static void setLog(Log _log) {
43 log = _log;
44 }
45
46 /***
47 * Construct a new resource discoverer
48 */
49 public DiscoverResources() {
50 super();
51 }
52
53 /***
54 * Construct a new resource discoverer
55 */
56 public DiscoverResources(ClassLoaders classLoaders) {
57 super(classLoaders);
58 }
59
60 /***
61 * @return ResourceIterator
62 */
63 public ResourceIterator findResources(final String resourceName) {
64 if (log.isDebugEnabled())
65 log.debug("find: resourceName='" + resourceName + "'");
66
67 return new ResourceIterator() {
68 private int idx = 0;
69 private ClassLoader loader = null;
70 private Enumeration resources = null;
71 private Resource resource = null;
72
73 public boolean hasNext() {
74 if (resource == null) {
75 resource = getNextResource();
76 }
77 return resource != null;
78 }
79
80 public Resource nextResource() {
81 Resource element = resource;
82 resource = null;
83 return element;
84 }
85
86 private Resource getNextResource() {
87 if (resources == null || !resources.hasMoreElements()) {
88 resources = getNextResources();
89 }
90
91 Resource resourceInfo;
92 if (resources != null) {
93 URL url = (URL)resources.nextElement();
94
95 if (log.isDebugEnabled())
96 log.debug("getNextResource: next URL='" + url + "'");
97
98 resourceInfo = new Resource(resourceName, url, loader);
99 } else {
100 resourceInfo = null;
101 }
102
103 return resourceInfo;
104 }
105
106 private Enumeration getNextResources() {
107 while (idx < getClassLoaders().size()) {
108 loader = getClassLoaders().get(idx++);
109 if (log.isDebugEnabled())
110 log.debug("getNextResources: search using ClassLoader '" + loader + "'");
111 try {
112 Enumeration e = JDKHooks.getJDKHooks().getResources(loader, resourceName);
113 if (e != null && e.hasMoreElements()) {
114 return e;
115 }
116 } catch( IOException ex ) {
117 log.warn("getNextResources: Ignoring Exception", ex);
118 }
119 }
120 return null;
121 }
122 };
123 }
124 }