001    /*
002     * Licensed under the Apache License, Version 2.0 (the "License");
003     * you may not use this file except in compliance with the License.
004     * You may obtain a copy of the License at
005     *
006     *      http://www.apache.org/licenses/LICENSE-2.0
007     *
008     * Unless required by applicable law or agreed to in writing, software
009     * distributed under the License is distributed on an "AS IS" BASIS,
010     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011     * See the License for the specific language governing permissions and
012     * limitations under the License.
013     */
014    package org.apache.commons.classscan.builtin;
015    
016    import java.util.Collection;
017    
018    import org.apache.commons.classscan.model.MetaClass;
019    import org.apache.commons.classscan.spi.model.SpiMetaClassLoader;
020    import org.apache.commons.classscan.spi.model.SpiMetaClassPathElement;
021    import org.apache.commons.classscan.spi.model.SpiMetaRegistry;
022    import org.apache.commons.classscan.util.NameSet;
023    
024    public class BootstrapMetaClassLoader extends UrlMetaClassLoader {
025    
026        BootstrapMetaClassLoader(SpiMetaRegistry registry) {
027            super(registry, null);
028        }
029    
030        @Override
031            void addLocations(SpiMetaRegistry registry, ClassLoader classLoader) {
032            SpiMetaClassPathElement primitives= getPrimitiveClassPathElement();
033            addLocation(primitives);
034            super.addLocations(registry, classLoader);
035        }
036    
037            private SpiMetaClassPathElement getPrimitiveClassPathElement() {
038            final NameSet<PrimitiveClass> primitives = new NameSet<PrimitiveClass>(PrimitiveClass.values());
039    
040            return new SpiMetaClassPathElement() {
041    
042                            @Override
043                            public Collection<? extends MetaClass> getMetaClasses() {
044                                    return primitives;
045                            }
046    
047                            @Override
048                            public MetaClass getMetaClass(String className) {
049                                    return primitives.getValue(className);
050                            }
051    
052                            @Override
053                            public String getName() {
054                                    return "<builtin-primitives>";
055                            }
056    
057                            @Override
058                            public boolean resolve(SpiMetaClassLoader classLoader) {
059                                    return true;
060                            }
061    
062                            @Override
063                            public MetaClass resolveMetaClass(SpiMetaClassLoader classLoader, String className) {
064                                    return primitives.getValue(className);
065                            }
066            };
067            }
068    
069        @Override
070        public MetaClass findMetaClass(String className) {
071            return getMetaClass(className);
072        }
073    
074        @Override
075        public MetaClass resolveMetaClass(String className) {
076            return resolveInPath(className);
077        }
078    }