package org.jboss.windup.util;
import java.io.IOException;
import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* A composite class loader which looks for classes and resources in a list of class loaders.
*
* @author Ondrej Zizka, ozizka at redhat.com
*/
public class FurnaceCompositeClassLoader extends ClassLoader
{
private final Set<ClassLoader> loaders = new LinkedHashSet<>();
public FurnaceCompositeClassLoader(List<ClassLoader> loaders)
{
this.loaders.addAll(loaders);
}
public FurnaceCompositeClassLoader(ClassLoader classLoader, List<ClassLoader> loaders)
{
super(classLoader);
this.loaders.addAll(loaders);
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException
{
for (ClassLoader classLoader : loaders)
{
try
{
return classLoader.loadClass(name);
}
catch (ClassNotFoundException notFound)
{
// oh well
}
}
ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
if (contextLoader != null)
{
return contextLoader.loadClass(name);
}
else
{
return super.findClass(name);
}
}
@Override
public URL getResource(String name)
{
for (ClassLoader classLoader : loaders)
{
URL resource = classLoader.getResource(name);
if (resource != null)
{
return resource;
}
}
ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
if (contextLoader != null)
{
return contextLoader.getResource(name);
}
else
{
return super.getResource(name);
}
}
@Override
public Enumeration<URL> getResources(String name) throws IOException
{
Set<URL> result = new LinkedHashSet<>();
for (ClassLoader classLoader : loaders)
{
result.addAll(Collections.list(classLoader.getResources(name)));
}
ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
if (contextLoader != null)
{
result.addAll(Collections.list(contextLoader.getResources(name)));
}
else
{
result.addAll(Collections.list(super.getResources(name)));
}
return Collections.enumeration(result);
}
}