001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.discovery.resource.classes;
018    
019    import java.net.URL;
020    import java.util.Vector;
021    
022    import org.apache.commons.discovery.ResourceClass;
023    import org.apache.commons.discovery.ResourceClassDiscover;
024    import org.apache.commons.discovery.ResourceClassIterator;
025    import org.apache.commons.discovery.log.DiscoveryLogFactory;
026    import org.apache.commons.discovery.resource.ClassLoaders;
027    import org.apache.commons.logging.Log;
028    
029    
030    /**
031     * The findResources() method will check every loader.
032     *
033     * @author Richard A. Sitze
034     * @author Craig R. McClanahan
035     * @author Costin Manolache
036     * @author James Strachan
037     */
038    public class DiscoverClasses
039        extends ResourceClassDiscoverImpl
040        implements ResourceClassDiscover
041    {
042        private static Log log = DiscoveryLogFactory.newLog(DiscoverClasses.class);
043        public static void setLog(Log _log) {
044            log = _log;
045        }
046    
047        /** Construct a new resource discoverer
048         */
049        public DiscoverClasses() {
050            super();
051        }
052        
053        /** Construct a new resource discoverer
054         */
055        public DiscoverClasses(ClassLoaders classLoaders) {
056            super(classLoaders);
057        }
058        
059        public ResourceClassIterator findResourceClasses(final String className) {
060            final String resourceName = className.replace('.','/') + ".class";
061            
062            if (log.isDebugEnabled())
063                log.debug("find: className='" + className + "'");
064    
065            return new ResourceClassIterator() {
066                private Vector history = new Vector();
067                private int idx = 0;
068                private ResourceClass resource = null;
069                
070                public boolean hasNext() {
071                    if (resource == null) {
072                        resource = getNextClass();
073                    }
074                    return resource != null;
075                }
076                
077                public ResourceClass nextResourceClass() {
078                    ResourceClass element = resource;
079                    resource = null;
080                    return element;
081                }
082                
083                private ResourceClass getNextClass() {
084                    while (idx < getClassLoaders().size()) {
085                        ClassLoader loader = getClassLoaders().get(idx++);
086                        URL url = loader.getResource(resourceName);
087                        if (url != null) {
088                            if (!history.contains(url)) {
089                                history.addElement(url);
090        
091                                if (log.isDebugEnabled())
092                                    log.debug("getNextClass: next URL='" + url + "'");
093        
094                                return new ResourceClass(className, url, loader);
095                            }
096                            if (log.isDebugEnabled())
097                                log.debug("getNextClass: duplicate URL='" + url + "'");
098                        } else {
099                            if (log.isDebugEnabled())
100                                log.debug("getNextClass: loader " + loader + ": '" + resourceName + "' not found");
101                        }
102                    }
103                    return null;
104                }
105            };
106        }
107    }