package org.eclipse.ant.internal.core;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
public class AntClassLoader extends URLClassLoader {
private static final String ANT_PACKAGES_PREFIX = "org.apache.tools";
private static final String ANT_URL_PREFIX = "org/apache/tools";
private boolean fAllowPluginLoading = false;
protected ClassLoader[] fPluginLoaders;
private ClassLoader fContextClassloader = null;
public AntClassLoader(URL[] urls, ClassLoader[] pluginLoaders) {
super(urls, ClassLoader.getSystemClassLoader());
fPluginLoaders = pluginLoaders;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> result = null;
if (fAllowPluginLoading || !(name.startsWith(ANT_PACKAGES_PREFIX))) {
result = loadClassPlugins(name);
}
if (result != null) {
return result;
}
return super.findClass(name);
}
protected Class<?> loadClassPlugins(String name) {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
if (fContextClassloader != null) {
Thread.currentThread().setContextClassLoader(fContextClassloader);
}
try {
Class<?> result = null;
if (fPluginLoaders != null) {
for (int i = 0; (i < fPluginLoaders.length) && (result == null); i++) {
try {
result = fPluginLoaders[i].loadClass(name);
}
catch (ClassNotFoundException e) {
}
}
}
return result;
}
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
@Override
public URL findResource(String name) {
if (fAllowPluginLoading || !(name.startsWith(ANT_URL_PREFIX))) {
URL result = findResourcePlugins(name);
if (result != null) {
return result;
}
}
return super.findResource(name);
}
private URL findResourcePlugins(String name) {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
if (fContextClassloader != null) {
Thread.currentThread().setContextClassLoader(fContextClassloader);
}
try {
URL result = null;
if (fPluginLoaders != null) {
for (int i = 0; i < fPluginLoaders.length; i++) {
result = fPluginLoaders[i].getResource(name);
if (result != null) {
return result;
}
}
}
}
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
return null;
}
@Override
public Enumeration<URL> findResources(String name) throws IOException {
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
if (fContextClassloader != null) {
Thread.currentThread().setContextClassLoader(fContextClassloader);
}
ArrayList<URL> all = new ArrayList<>();
try {
if (fAllowPluginLoading || !(name.startsWith(ANT_URL_PREFIX) || name.startsWith(ANT_URL_PREFIX, 1))) {
if (fPluginLoaders != null) {
Enumeration<URL> result = null;
for (int i = 0; i < fPluginLoaders.length; i++) {
result = fPluginLoaders[i].getResources(name);
while (result.hasMoreElements()) {
all.add(result.nextElement());
}
}
}
}
Enumeration<URL> superResources = super.findResources(name);
if (all.isEmpty()) {
return superResources;
}
while (superResources.hasMoreElements()) {
all.add(superResources.nextElement());
}
return Collections.enumeration(all);
}
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
public void allowPluginClassLoadersToLoadAnt(boolean allowLoading) {
fAllowPluginLoading = allowLoading;
}
public void setPluginContextClassloader(ClassLoader classLoader) {
fContextClassloader = classLoader;
}
}