package liquibase.resource;
import liquibase.util.StringUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* An implementation of liquibase.FileOpener that opens file from the class loader.
*
* @see ResourceAccessor
*/
public class ClassLoaderResourceAccessor implements ResourceAccessor {
private ClassLoader classLoader;
private final String base;
public ClassLoaderResourceAccessor(ClassLoader classLoader) {
this.classLoader = classLoader;
base = null;
}
public ClassLoaderResourceAccessor(String base, ClassLoader classLoader) {
this.classLoader = classLoader;
final int endIndex = base.lastIndexOf('/');
this.base = endIndex < 0 ? base : base.substring(0, 1 + endIndex);
}
public InputStream getResourceAsStream(String resource) throws IOException {
if (base != null && resource.startsWith(base)) {
final String file = resource.substring(base.length());
if ("http:/www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd".equals(file)) {
final ClassLoader loader = getClass().getClassLoader();
InputStream resourceAsStream = loader.getResourceAsStream("liquibase/parser/core/xml/dbchangelog-2.0.xsd");
if (resourceAsStream == null) {
throw new IllegalStateException("Loader " + loader);
}
return resourceAsStream;
}
}
return classLoader.getResourceAsStream(resource);
}
public Enumeration<URL> getResources(String packageName) throws IOException {
return classLoader.getResources(packageName);
}
public ClassLoader toClassLoader() {
return getClass().getClassLoader();
}
@Override
public String toString() {
String description;
if (classLoader instanceof URLClassLoader) {
List<String> urls = new ArrayList<String>();
for (URL url : ((URLClassLoader) classLoader).getURLs()) {
urls.add(url.toExternalForm());
}
description = StringUtils.join(urls, ",");
} else {
description = classLoader.getClass().getName();
}
return getClass().getName() + "(" + description + ")";
}
}