package jp.terasoluna.fw.message;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MockClassLoader extends URLClassLoader {
protected final Map<String, List<URL>> urlMapping = new ConcurrentHashMap<String, List<URL>>();
public MockClassLoader() {
super(new URL[]{});
}
public void addMapping(String name, URL... urls) {
List<URL> mapped = urlMapping.get(name);
if (mapped == null) {
mapped = new ArrayList<URL>();
urlMapping.put(name, mapped);
}
for (URL url : urls) {
mapped.add(url);
}
}
@Override
public URL getResource(String name) {
List<URL> mapped = urlMapping.get(name);
if (mapped.isEmpty()) {
return super.getResource(name);
}
return mapped.get(0);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
List<URL> mapped = urlMapping.get(name);
if (mapped.isEmpty()) {
return super.getResources(name);
}
return new IteratorEnumeration<URL>(mapped.iterator());
}
static class IteratorEnumeration<T> implements Enumeration<T> {
private Iterator<T> iterator;
public IteratorEnumeration() {
}
public IteratorEnumeration(Iterator<T> iterator) {
this.iterator = iterator;
}
public boolean hasMoreElements() {
return iterator.hasNext();
}
public T nextElement() {
return iterator.next();
}
public Iterator<T> getIterator() {
return iterator;
}
public void setIterator(Iterator<T> iterator) {
this.iterator = iterator;
}
}
}