package org.atomnuke.plugin.env; import org.atomnuke.plugin.Environment; import org.atomnuke.plugin.ReferenceInstantiationException; /** * * @author zinic */ public abstract class ClassLoaderEnvironment implements Environment { private final ThreadLocal<ClassLoader> previousContext; private final ClassLoader classLoader; public ClassLoaderEnvironment(ClassLoader classLoader) { this.classLoader = classLoader; previousContext = new ThreadLocal<ClassLoader>(); } protected final ClassLoader classLoader() { return classLoader; } @Override public void stepInto() { final Thread currentThread = Thread.currentThread(); previousContext.set(currentThread.getContextClassLoader()); currentThread.setContextClassLoader(classLoader); } @Override public <T> T instantiate(Class<T> interfaceType, String referenceName) throws ReferenceInstantiationException { try { final Class hrefClass = classLoader.loadClass(referenceName); final Object instance = hrefClass.newInstance(); return interfaceType.cast(instance); } catch (Exception ex) { throw new ReferenceInstantiationException(ex); } } @Override public boolean hasReference(String referenceName) { try { classLoader.loadClass(referenceName); return true; } catch (ClassNotFoundException cnfe) { } return false; } @Override public void stepOut() { if (previousContext.get() == null) { return; } final Thread currentThread = Thread.currentThread(); currentThread.setContextClassLoader(previousContext.get()); previousContext.remove(); } @Override public String toString() { return "ClassLoaderEnvironment{" + "classLoader=" + classLoader + '}'; } }