/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.artifact.classloader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* Fake {@link ClassLoader} for testing purposes
*/
public class TestClassLoader extends ClassLoader {
private Map<String, Class> classes = new HashMap<>();
private Map<String, URL> resources = new HashMap<>();
private Map<String, InputStream> streamResources = new HashMap<>();
private Map<String, String> libraries = new HashMap<>();
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return findClass(name);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class aClass = classes.get(name);
if (aClass == null) {
throw new TestClassNotFoundException(name, this);
}
return aClass;
}
@Override
public URL getResource(String s) {
return resources.get(s);
}
@Override
public InputStream getResourceAsStream(String s) {
return streamResources.get(s);
}
@Override
public Enumeration<URL> getResources(String s) throws IOException {
return findResources(s);
}
@Override
protected Enumeration<URL> findResources(String name) throws IOException {
return new EnumerationAdapter<>(resources.values());
}
@Override
protected URL findResource(String s) {
return resources.get(s);
}
@Override
protected String findLibrary(String s) {
return libraries.get(s);
}
public void addClass(String className, Class aClass) {
classes.put(className, aClass);
}
public void addResource(String resourceName, URL resourceUrl) {
resources.put(resourceName, resourceUrl);
}
public void addStreamResource(String resourceName, InputStream resourceStream) {
streamResources.put(resourceName, resourceStream);
}
public void addLibrary(String libraryName, String libraryPath) {
libraries.put(libraryName, libraryPath);
}
@Override
protected synchronized Class<?> loadClass(String s, boolean b) throws ClassNotFoundException {
return loadClass(s);
}
public static class TestClassNotFoundException extends ClassNotFoundException {
private ClassLoader classLoader;
public TestClassNotFoundException(String s, ClassLoader classLoader) {
super(s);
this.classLoader = classLoader;
}
public ClassLoader getClassLoader() {
return classLoader;
}
}
}