View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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 }