package io.cattle.platform.liquibase;
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Set;
import liquibase.servicelocator.DefaultPackageScanClassResolver;
import liquibase.servicelocator.PackageScanFilter;
import org.apache.commons.io.IOUtils;
public class JarInJarPackageScanner extends DefaultPackageScanClassResolver {
public static final String JAR_IN_JAR_PREFIX = "jar:injar";
@Override
protected void find(PackageScanFilter test, String packageName, ClassLoader loader, Set<Class<?>> classes) {
super.find(test, packageName, loader, classes);
Enumeration<URL> urls;
try {
urls = getResources(loader, packageName);
} catch (IOException ioe) {
return;
}
InputStream is = null;
while (urls.hasMoreElements()) {
URL url = null;
try {
url = urls.nextElement();
if (!isInJar(url))
continue;
is = getInputStream(url);
loadImplementationsInJar(test, packageName, is, url.toExternalForm(), classes);
} catch (IOException e) {
} finally {
IOUtils.closeQuietly(is);
}
}
}
protected InputStream getInputStream(URL url) throws IOException {
URLConnection connection = url.openConnection();
if (connection instanceof JarURLConnection) {
url = ((JarURLConnection) connection).getJarFileURL();
}
URLConnection con = url.openConnection();
return con.getInputStream();
}
protected boolean isInJar(URL url) {
String urlPath = url.toExternalForm();
return urlPath.startsWith(JAR_IN_JAR_PREFIX);
}
}