1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.discovery.resource.names;
18
19 import java.util.Vector;
20
21 import org.apache.commons.discovery.ResourceNameDiscover;
22 import org.apache.commons.discovery.ResourceNameIterator;
23 import org.apache.commons.discovery.log.DiscoveryLogFactory;
24 import org.apache.commons.logging.Log;
25
26
27 /***
28 * Holder for multiple ResourceNameDiscover instances.
29 * The result is the union of the results from each
30 * (not a chained sequence, where results feed the next in line.
31 *
32 * @author Richard A. Sitze
33 */
34 public class NameDiscoverers
35 extends ResourceNameDiscoverImpl
36 implements ResourceNameDiscover
37 {
38 private static Log log = DiscoveryLogFactory.newLog(NameDiscoverers.class);
39 public static void setLog(Log _log) {
40 log = _log;
41 }
42
43 private Vector discoverers = new Vector();
44
45 /***
46 * Construct a new resource name discoverer
47 */
48 public NameDiscoverers() {
49 }
50
51 /***
52 * Specify an additional class loader to be used in searching.
53 * The order of loaders determines the order of the result.
54 * It is recommended to add the most specific loaders first.
55 */
56 public void addResourceNameDiscover(ResourceNameDiscover discover) {
57 if (discover != null) {
58 discoverers.addElement(discover);
59 }
60 }
61
62 protected ResourceNameDiscover getResourceNameDiscover(int idx) {
63 return (ResourceNameDiscover)discoverers.get(idx);
64 }
65
66 protected int size() {
67 return discoverers.size();
68 }
69
70 /***
71 * Set of results of all discoverers.
72 *
73 * @return ResourceIterator
74 */
75 public ResourceNameIterator findResourceNames(final String resourceName) {
76 if (log.isDebugEnabled())
77 log.debug("find: resourceName='" + resourceName + "'");
78
79 return new ResourceNameIterator() {
80 private int idx = 0;
81 private ResourceNameIterator iterator = null;
82
83 public boolean hasNext() {
84 if (iterator == null || !iterator.hasNext()) {
85 iterator = getNextIterator();
86 if (iterator == null) {
87 return false;
88 }
89 }
90 return iterator.hasNext();
91 }
92
93 public String nextResourceName() {
94 return iterator.nextResourceName();
95 }
96
97 private ResourceNameIterator getNextIterator() {
98 while (idx < size()) {
99 ResourceNameIterator iter =
100 getResourceNameDiscover(idx++).findResourceNames(resourceName);
101
102 if (iter.hasNext()) {
103 return iter;
104 }
105 }
106 return null;
107 }
108 };
109 }
110 }