Looks like there is lot more work to this.
The original refactoring just dealt with the aop project (AspectManager).
There's also a lot of deep integration in the asintegration project (AspectManagerService).
I've manged to come up with an alternate integration interface that encapsulates all this:
package org.jboss.aop.deployment;
import java.io.File;
import javassist.scopedpool.ScopedClassPoolFactory;
import org.jboss.aop.ClassLoaderValidation;
import org.jboss.aop.classpool.AOPClassLoaderScopingPolicy;
/**
* AOPIntegration.<p>
*
* This class is intended to identify all the integration
* points AOP is making with the JBoss appserver.
*
* @author <a href="adrian@jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
*/
public interface JBossIntegration extends ClassLoaderValidation, ScopedClassPoolFactory
{
/**
* Create the AOPClassLoaderScopingPolicy
*
* @return the policy
*/
AOPClassLoaderScopingPolicy createAOPClassLoaderScopingPolicy();
/**
* Create a scoped classpool factory
*
* TODO JBAOP-??? need to review whether ScopedClassPool should also be replaced with
* some other policy, e.g. javassist ClassPath notion is closer to new classloader?
* @param tmpDir the temporary directory for classes
* @return the factory
* @throws Exception for any error
*/
ScopedClassPoolFactory createScopedClassPoolFactory(File tmpDir) throws Exception;
/**
* Attach the depreacted translator
*/
void attachDeprecatedTranslator();
/**
* Detach the deprecated translator
*/
void detachDeprecatedTranslator();
}
And an implementation for the old stuff
package org.jboss.aop.deployment;
import java.io.File;
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.ReflectionException;
import javassist.ClassPool;
import javassist.scopedpool.ScopedClassPool;
import javassist.scopedpool.ScopedClassPoolFactory;
import javassist.scopedpool.ScopedClassPoolRepository;
import org.jboss.aop.AspectManager;
import org.jboss.aop.classpool.AOPClassLoaderScopingPolicy;
import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
import org.jboss.aop.classpool.AOPScopedClassLoaderHelperBridge;
import org.jboss.mx.loading.RepositoryClassLoader;
import org.jboss.mx.util.MBeanServerLocator;
/**
* JBoss4Integration.<p>
*
* This class and its associated classes are
* for the old JBoss4 integration with the LoaderRepository<p>
*
* <ul>Related Classes:
* <li> {@link JBossClassPool}
* <li> {@link JBossClassPoolFactory}
* <li> {@link JBossScopedClassLoaderHelper}
* <li> {@link LoaderRepositoryUrlUtil}
* <li> {@link ScopedClassLoaderDomain}
* <li> {@link ScopedJBossClassPool}
* </ul>
*
* @deprecated TODO JBAOP-??? need to write a JBoss5 version
* @author <a href="adrian@jboss.com">Adrian Brock</a>
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
* @version $Revision: 1.1 $
*/
@Deprecated
public class JBoss4Integration implements JBossIntegration
{
/** The delegate classpool factory */
private ScopedClassPoolFactory delegateClassPoolFactory;
public boolean isValidClassLoader(ClassLoader loader)
{
if (!(loader instanceof RepositoryClassLoader)) return false;
return ((RepositoryClassLoader) loader).getLoaderRepository() != null;
}
public AOPClassLoaderScopingPolicy createAOPClassLoaderScopingPolicy()
{
AOPScopedClassLoaderHelper helper = new JBossScopedClassLoaderHelper();
return new AOPScopedClassLoaderHelperBridge(helper);
}
public ScopedClassPoolFactory createScopedClassPoolFactory(File tmpDir) throws Exception
{
delegateClassPoolFactory = new JBossClassPoolFactory(tmpDir);
return this;
}
public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
return delegateClassPoolFactory.create(cl, src, repository);
}
public ScopedClassPool create(ClassPool src, ScopedClassPoolRepository repository)
{
return delegateClassPoolFactory.create(src, repository);
}
public void attachDeprecatedTranslator()
{
AspectManager mgr = AspectManager.instance();
MBeanServer server = MBeanServerLocator.locateJBoss();
try
{
server.setAttribute(AspectManagerService.DEFAULT_LOADER_REPOSITORY, new Attribute("Translator", mgr));
}
catch (InstanceNotFoundException e)
{
throw new RuntimeException(e);
}
catch (AttributeNotFoundException e)
{
throw new RuntimeException(e);
}
catch (InvalidAttributeValueException e)
{
throw new RuntimeException(e);
}
catch (MBeanException e)
{
throw new RuntimeException(e);
}
catch (ReflectionException e)
{
throw new RuntimeException(e);
}
}
public void detachDeprecatedTranslator()
{
MBeanServer server = MBeanServerLocator.locateJBoss();
try
{
server.setAttribute(AspectManagerService.DEFAULT_LOADER_REPOSITORY, new Attribute("Translator", null));
}
catch (InstanceNotFoundException e)
{
throw new RuntimeException(e);
}
catch (AttributeNotFoundException e)
{
throw new RuntimeException(e);
}
catch (InvalidAttributeValueException e)
{
throw new RuntimeException(e);
}
catch (MBeanException e)
{
throw new RuntimeException(e);
}
catch (ReflectionException e)
{
throw new RuntimeException(e);
}
}
This is just an FYI warning, since I've NOT committed it yet (not tested it).
The main work will be in writing a JBoss5 version that uses the new
jboss-classloading-spi instead so it can work with both the
RepositoryClassLoader and the VFSClassLoader.