1 /* 2 * Copyright (C) 2013 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.caliper.platform.jvm; 18 19 import com.google.common.base.Joiner; 20 import com.google.common.base.Splitter; 21 import com.google.common.collect.ImmutableSet; 22 23 import java.io.File; 24 import java.net.URISyntaxException; 25 import java.net.URL; 26 import java.net.URLClassLoader; 27 import java.util.LinkedHashSet; 28 import java.util.Set; 29 30 import javax.annotation.Nullable; 31 32 /** 33 * Provides a class path containing all of the jars present on the local machine that are referenced 34 * by a given {@link ClassLoader}. 35 */ 36 final class EffectiveClassPath { EffectiveClassPath()37 private EffectiveClassPath() {} 38 39 private static final String PATH_SEPARATOR = System.getProperty("path.separator"); 40 private static final String JAVA_CLASS_PATH = System.getProperty("java.class.path"); 41 getClassPathForClassLoader(ClassLoader classLoader)42 static String getClassPathForClassLoader(ClassLoader classLoader) { 43 // Order of JAR files may have some significance. Try to preserve it. 44 LinkedHashSet<File> files = new LinkedHashSet<File>(); 45 for (String entry : Splitter.on(PATH_SEPARATOR).split(JAVA_CLASS_PATH)) { 46 files.add(new File(entry)); 47 } 48 files.addAll(getClassPathFiles(classLoader)); 49 50 return Joiner.on(PATH_SEPARATOR).join(files); 51 } 52 getClassPathFiles(ClassLoader classLoader)53 private static Set<File> getClassPathFiles(ClassLoader classLoader) { 54 ImmutableSet.Builder<File> files = ImmutableSet.builder(); 55 @Nullable ClassLoader parent = classLoader.getParent(); 56 if (parent != null) { 57 files.addAll(getClassPathFiles(parent)); 58 } 59 if (classLoader instanceof URLClassLoader) { 60 URLClassLoader urlClassLoader = (URLClassLoader) classLoader; 61 for (URL url : urlClassLoader.getURLs()) { 62 try { 63 files.add(new File(url.toURI())); 64 } catch (URISyntaxException e) { 65 // skip it then 66 } catch (IllegalArgumentException e) { 67 // skip it then 68 } 69 } 70 } 71 return files.build(); 72 } 73 } 74