package org.liquibase.maven.plugins;
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;
import liquibase.resource.ResourceAccessor;
import liquibase.util.StringUtils;
/**
* Implementation of liquibase.FileOpener for Maven which will use a default or user
* specified {@link ClassLoader} to load files/resources.
*
* @see liquibase.resource.ResourceAccessor
*/
public class MavenResourceAccessor implements ResourceAccessor {
/**
* The class loader to use to load files/resources from.
*/
private ClassLoader _loader;
/**
* Creates a {@link liquibase.resource.ResourceAccessor} that uses the classloader for the class.
*/
public MavenResourceAccessor() {
this(MavenResourceAccessor.class.getClassLoader());
}
/**
* Creates a {@link liquibase.resource.ResourceAccessor} that will use the specified
* {@link ClassLoader} to load files.
*
* @param cl The {@link ClassLoader} to use to load files/resources.
*/
public MavenResourceAccessor(ClassLoader cl) {
_loader = cl;
}
public InputStream getResourceAsStream(String file) throws IOException {
return _loader.getResourceAsStream(file);
}
public Enumeration<URL> getResources(String packageName) throws IOException {
return _loader.getResources(packageName);
}
public ClassLoader toClassLoader() {
return _loader;
}
@Override
public String toString() {
String description;
if (_loader instanceof URLClassLoader) {
List<String> urls = new ArrayList<String>();
for (URL url : ((URLClassLoader) _loader ).getURLs()) {
urls.add(url.toExternalForm());
}
description = StringUtils.join(urls, ",");
} else {
description = _loader .getClass().getName();
}
return getClass().getName()+"("+ description +")";
}
}