package org.jboss.weld.environment.osgi.integration; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import org.jboss.weld.exceptions.WeldException; import org.jboss.weld.logging.messages.BeanMessage; import org.jboss.weld.serialization.spi.ProxyServices; /** * * @author Mathieu ANCELIN - SERLI (mathieu.ancelin@serli.com) */ public class OSGiProxyService implements ProxyServices { private final ClassLoader loader; public OSGiProxyService() { this.loader = getClass().getClassLoader(); } @Override public ClassLoader getClassLoader(Class<?> proxiedBeanType) { return new BridgeClassLoader(proxiedBeanType.getClassLoader(), loader); } @Override public Class<?> loadBeanClass(final String className) { try { return (Class<?>) AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { return Class.forName(className, true, getClassLoader(this.getClass())); } }); } catch (PrivilegedActionException pae) { throw new WeldException(BeanMessage.CANNOT_LOAD_CLASS, className, pae.getException()); } } @Override public void cleanup() { // no cleanup } private static class BridgeClassLoader extends ClassLoader { private final ClassLoader delegate; private final ClassLoader infra; public BridgeClassLoader(ClassLoader delegate, ClassLoader infraClassLoader) { this.delegate = delegate; this.infra = infraClassLoader; } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { Class<?> loadedClass = null; try { loadedClass = delegate.loadClass(name); } catch (ClassNotFoundException cnfe) { // todo : filter on utils class only loadedClass = infra.loadClass(name); } return loadedClass; } } }