/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.ipojo.manipulator.util;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
/**
* An ordered list of classpath elements with set behaviour. A Classpath is immutable and thread safe.
* This class let retrieve an isolated classloader to load classes from a set of jars.
*/
public class Classpath implements Iterable<String> {
private final List<String> unmodifiableElements;
public static Classpath join(Classpath firstClasspath, Classpath secondClasspath) {
LinkedHashSet<String> accumulated = new LinkedHashSet<String>();
if (firstClasspath != null) firstClasspath.addTo(accumulated);
if (secondClasspath != null) secondClasspath.addTo(accumulated);
return new Classpath(accumulated);
}
private void addTo(Collection<String> c) {
c.addAll(unmodifiableElements);
}
private Classpath() {
this.unmodifiableElements = Collections.emptyList();
}
public Classpath(Classpath other, String additionalElement) {
ArrayList<String> elems = new ArrayList<String>(other.unmodifiableElements);
elems.add(additionalElement);
this.unmodifiableElements = Collections.unmodifiableList(elems);
}
public Classpath(Iterable<String> paths) {
List<String> newCp = new ArrayList<String>();
for (String element : paths) {
newCp.add(element);
}
this.unmodifiableElements = Collections.unmodifiableList(newCp);
}
public static Classpath emptyClasspath() {
return new Classpath();
}
public Classpath addClassPathElementUrl(String path) {
if (path == null) {
throw new IllegalArgumentException("Null is not a valid class path element url.");
}
return !unmodifiableElements.contains(path) ? new Classpath(this, path) : this;
}
public List<String> getClassPath() {
return unmodifiableElements;
}
public List<URL> getAsUrlList()
throws MalformedURLException {
List<URL> urls = new ArrayList<URL>();
for (String path : unmodifiableElements) {
File f = new File(path);
urls.add(f.toURI().toURL());
}
return urls;
}
public void writeToSystemProperty(String propertyName) {
StringBuilder sb = new StringBuilder();
for (String element : unmodifiableElements) {
sb.append(element).append(File.pathSeparatorChar);
}
System.setProperty(propertyName, sb.toString());
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Classpath classpath = (Classpath) o;
return !(unmodifiableElements
!= null ? !unmodifiableElements.equals(classpath.unmodifiableElements) : classpath.unmodifiableElements != null);
}
public ClassLoader createClassLoader(ClassLoader parent, boolean childDelegation)
throws RuntimeException {
try {
List urls = getAsUrlList();
IsolatedClassLoader classLoader = new IsolatedClassLoader(parent, childDelegation);
for (Object url1 : urls) {
URL url = (URL) url1;
classLoader.addURL(url);
}
return classLoader;
} catch (MalformedURLException e) {
throw new RuntimeException("When creating classloader", e);
}
}
public ClassLoader createClassLoader()
throws RuntimeException {
try {
List urls = getAsUrlList();
IsolatedClassLoader classLoader = new IsolatedClassLoader();
for (Object url1 : urls) {
URL url = (URL) url1;
classLoader.addURL(url);
}
return classLoader;
} catch (MalformedURLException e) {
throw new RuntimeException("When creating classloader", e);
}
}
public int hashCode() {
return unmodifiableElements != null ? unmodifiableElements.hashCode() : 0;
}
public String getLogMessage(String descriptor) {
StringBuilder result = new StringBuilder();
result.append(descriptor).append(" classpath:");
for (String element : unmodifiableElements) {
result.append(" ").append(element);
}
return result.toString();
}
public String getCompactLogMessage(String descriptor) {
StringBuilder result = new StringBuilder();
result.append(descriptor).append(" classpath:");
for (String element : unmodifiableElements) {
result.append(" ");
if (element != null) {
int pos = element.lastIndexOf(File.separatorChar);
if (pos >= 0) {
result.append(element.substring(pos + 1));
} else {
result.append(element);
}
} else {
result.append(element);
}
}
return result.toString();
}
public Iterator<String> iterator() {
return unmodifiableElements.iterator();
}
}