1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.discovery.resource.classes;
18
19 import java.net.URL;
20 import java.util.Vector;
21
22 import org.apache.commons.discovery.ResourceClass;
23 import org.apache.commons.discovery.ResourceClassDiscover;
24 import org.apache.commons.discovery.ResourceClassIterator;
25 import org.apache.commons.discovery.log.DiscoveryLogFactory;
26 import org.apache.commons.discovery.resource.ClassLoaders;
27 import org.apache.commons.logging.Log;
28
29
30 /***
31 * The findResources() method will check every loader.
32 *
33 * @author Richard A. Sitze
34 * @author Craig R. McClanahan
35 * @author Costin Manolache
36 * @author James Strachan
37 */
38 public class DiscoverClasses
39 extends ResourceClassDiscoverImpl
40 implements ResourceClassDiscover
41 {
42 private static Log log = DiscoveryLogFactory.newLog(DiscoverClasses.class);
43 public static void setLog(Log _log) {
44 log = _log;
45 }
46
47 /*** Construct a new resource discoverer
48 */
49 public DiscoverClasses() {
50 super();
51 }
52
53 /*** Construct a new resource discoverer
54 */
55 public DiscoverClasses(ClassLoaders classLoaders) {
56 super(classLoaders);
57 }
58
59 public ResourceClassIterator findResourceClasses(final String className) {
60 final String resourceName = className.replace('.','/') + ".class";
61
62 if (log.isDebugEnabled())
63 log.debug("find: className='" + className + "'");
64
65 return new ResourceClassIterator() {
66 private Vector history = new Vector();
67 private int idx = 0;
68 private ResourceClass resource = null;
69
70 public boolean hasNext() {
71 if (resource == null) {
72 resource = getNextClass();
73 }
74 return resource != null;
75 }
76
77 public ResourceClass nextResourceClass() {
78 ResourceClass element = resource;
79 resource = null;
80 return element;
81 }
82
83 private ResourceClass getNextClass() {
84 while (idx < getClassLoaders().size()) {
85 ClassLoader loader = getClassLoaders().get(idx++);
86 URL url = loader.getResource(resourceName);
87 if (url != null) {
88 if (!history.contains(url)) {
89 history.addElement(url);
90
91 if (log.isDebugEnabled())
92 log.debug("getNextClass: next URL='" + url + "'");
93
94 return new ResourceClass(className, url, loader);
95 }
96 if (log.isDebugEnabled())
97 log.debug("getNextClass: duplicate URL='" + url + "'");
98 } else {
99 if (log.isDebugEnabled())
100 log.debug("getNextClass: loader " + loader + ": '" + resourceName + "' not found");
101 }
102 }
103 return null;
104 }
105 };
106 }
107 }