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.io.File; 017 import java.io.IOException; 018 import java.util.ArrayList; 019 import java.util.Collections; 020 import java.util.List; 021 import java.util.Map; 022 import java.util.regex.Pattern; 023 024 import org.apache.commons.classscan.ClassPathElement; 025 import org.apache.commons.classscan.ResourceFile; 026 import org.apache.commons.classscan.spi.model.SpiClassPath; 027 import org.apache.commons.classscan.spi.model.SpiClassPathElement; 028 import org.apache.commons.classscan.spi.model.SpiMetaClassLoader; 029 import org.apache.commons.classscan.spi.model.SpiMetaRegistry; 030 import org.slf4j.Logger; 031 import org.slf4j.LoggerFactory; 032 033 public class BootstrapClassPath implements SpiClassPath { 034 035 private static final Logger logger = LoggerFactory.getLogger(BootstrapClassPath.class); 036 037 static Pattern PATH_SPLITTER = Pattern.compile(File.pathSeparator); 038 039 private final SpiMetaRegistry registry; 040 041 public BootstrapClassPath(SpiMetaRegistry registry) { 042 this.registry = registry; 043 } 044 045 @Override 046 public List<? extends ClassPathElement> getClassPathElements() { 047 return getBootstrapLocations(); 048 } 049 050 private List<SpiClassPathElement> getBootstrapLocations() { 051 List<SpiClassPathElement> locations= new ArrayList<SpiClassPathElement>(); 052 for(String element : parseBootstrapClassPathValues()) { 053 try { 054 SpiClassPathElement location = checkLocation(element); 055 if(location!=null) { 056 locations.add(location); 057 } 058 } catch (IOException e) { 059 logger.info("Bootstrap Classpath element "+element+" ignored", e); 060 } 061 } 062 return locations; 063 } 064 065 String[] parseBootstrapClassPathValues() { 066 return PATH_SPLITTER.split(System.getProperty("sun.boot.class.path")); 067 } 068 069 private SpiClassPathElement checkLocation(String element) throws IOException { 070 File location = new File(element); 071 return registry.createClassPathElement(location.toURI().toURL()); 072 } 073 074 @Override 075 public SpiMetaClassLoader createMetaClassLoader(SpiMetaRegistry registry, ClassLoader classLoader) { 076 if(classLoader!=null) { 077 throw new IllegalArgumentException("BootStrap ClassLoader should be null"); 078 } 079 080 return new BootstrapMetaClassLoader(registry); 081 } 082 083 @Override 084 public Map<ClassPathElement, ResourceFile> getResources(String fileName) { 085 return Collections.emptyMap(); 086 } 087 }