FilterableClassLoader.java

package fr.sii.ogham.testing.mock.classloader;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
import java.util.function.Predicate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FilterableClassLoader extends ClassLoader {
	private static final Logger LOG = LoggerFactory.getLogger(FilterableClassLoader.class);
	
	private ClassLoader delegate;
	private Predicate<String> predicate;

	public FilterableClassLoader(ClassLoader delegate, Predicate<String> predicate) {
		super();
		this.delegate = delegate;
		this.predicate = predicate;
	}

	@Override
	public Class<?> loadClass(String name) throws ClassNotFoundException {
		if(predicate.test(name)) {
			return delegate.loadClass(name);
		} else {
			LOG.info("Class {} not accepted", name);
			throw new ClassNotFoundException("Class "+name+" not accepted");
		}
	}

	@Override
	public URL getResource(String name) {
		if(predicate.test(name)) {
			return delegate.getResource(name);
		} else {
			LOG.info("Resource {} not accepted", name);
			return null;
		}
	}

	@Override
	public Enumeration<URL> getResources(String name) throws IOException {
		if(predicate.test(name)) {
			return delegate.getResources(name);
		} else {
			LOG.info("Resources {} not accepted", name);
			return Collections.emptyEnumeration();
		}
	}

	@Override
	public InputStream getResourceAsStream(String name) {
		if(predicate.test(name)) {
			return delegate.getResourceAsStream(name);
		} else {
			LOG.info("Resource {} not accepted", name);
			return null;
		}
	}

	@Override
	public void setDefaultAssertionStatus(boolean enabled) {
		super.setDefaultAssertionStatus(enabled);
		if (delegate != null) {
			delegate.setDefaultAssertionStatus(enabled);
		}
		// TODO: should set value when delegate is initialized ?
	}

	@Override
	public void setPackageAssertionStatus(String packageName, boolean enabled) {
		super.setPackageAssertionStatus(packageName, enabled);
		if (delegate != null) {
			delegate.setPackageAssertionStatus(packageName, enabled);
		}
		// TODO: should set values when delegate is initialized ?
	}

	@Override
	public void setClassAssertionStatus(String className, boolean enabled) {
		super.setClassAssertionStatus(className, enabled);
		if (delegate != null) {
			delegate.setClassAssertionStatus(className, enabled);
		}
		// TODO: should set values when delegate is initialized ?
	}

	@Override
	public void clearAssertionStatus() {
		super.clearAssertionStatus();
		if (delegate != null) {
			delegate.clearAssertionStatus();
		}
		// TODO: should call when delegate is initialized ?
	}
	
	
}