[jboss-user] [JBoss Microcontainer Development] - ClassPool bootstrap refactoring

Kabir Khan do-not-reply at jboss.com
Fri Apr 23 10:01:03 EDT 2010


Kabir Khan [http://community.jboss.org/people/kabir.khan%40jboss.com] created the discussion

"ClassPool bootstrap refactoring"

To view the discussion, visit: http://community.jboss.org/message/539242#539242

--------------------------------------------------------------
Following on from  http://community.jboss.org/message/539041#539041 http://community.jboss.org/message/539041#539041 I have started refactoring how the ClassPools are initialized during bootstrap and moving code into the classpools project. The following (uncommitted, but working) test in ClassPools demonstrates how I see this working in the bootstrap.

   /**
    * Simulates the steps to be taken during AS bootstrap
    */
   public void testBootstrap() throws Exception
   {
      //Initialize the config. This wires together the parts of the system
      JBossClClassPoolConfig config = JBossClClassPoolConfig.getInstance();
      assertNotNull(config.getClassPoolFactory());
      assertNotNull(config.getClassPoolRepository());
      assertNotNull(config.getDomainRegistry());
      assertNotNull(config.getRegisterModuleCallback());
      assertNull(config.getClassLoading());
 
      //Check that the classpool factory works before we have deployed the classpool system
      ClassLoader urlCl = createChildURLLoader(null, JAR_A_URL); 
      ClassPool urlPool = config.getClassPoolRepository().registerClassLoader(urlCl);
      assertNotNull(urlPool);
      CtClass aUrl = urlPool.get(CLASS_A);
      CtClass stringUrl = urlPool.get(String.class.getName());
 
      //Install the bean to get notified when ClassLoading is installed
      BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("JBossClClassPoolConfig", JBossClClassPoolConfig.class.getName());
      builder.setFactoryClass(JBossClClassPoolConfig.class.getName());
      builder.setFactoryMethod("getInstance");
      ValueMetaData inject = builder.createContextualInject(null, null, AutowireType.BY_NAME, InjectOption.CALLBACK);
      ((AbstractInjectionValueMetaData)inject).setValue("ClassLoading");
      builder.addPropertyMetaData("classLoading", inject);
      getDelegate().deploy(builder.getBeanMetaData());
 
      //Deploy the ClassLoading. This causes the RegistryModuleCallback
      //to get installed as a module registry in ClassLoading
      getDelegate().deployCommon();
      assertNotNull(config.getClassLoading());
 
      testScenario = new ClassPoolTestScenario<CLDeploymentBuilder>(getClassLoaderFactory(), config.getClassPoolRepository());
 
      ClassPool poolA = testScenario.createLoader(new CLDeploymentBuilder("A", JAR_A_URL));
      CtClass aDomain = poolA.get(CLASS_A);
      assertNotSame(aUrl, aDomain);
      assertSame(stringUrl, poolA.get(String.class.getName()));
 
      ClassPool poolB = testScenario.createLoader(new CLDeploymentBuilder("B", JAR_B_URL));
      assertSame(aDomain, poolB.get(CLASS_A));
   }


The JBossClClassPoolConfig singleton wires together a lot of the things that are needed for running this in AS (getters ommitted)

public class JBossClClassPoolConfig
{
   private static volatile JBossClClassPoolConfig config;  
 
   private final DomainRegistry domainRegistry;
 
   private final RegisterModuleCallback registerModuleCallback;
 
   private ClassLoading classLoading;
 
   private JBossClDelegatingClassPoolFactory classPoolFactory;
 
   private ClassPoolRepository classPoolRepository;
 
   private JBossClClassPoolConfig(DomainRegistry domainRegistry, RegisterModuleCallback registerModuleCallback, JBossClDelegatingClassPoolFactory classPoolFactory)
   {
      this.domainRegistry = domainRegistry;
      this.registerModuleCallback = registerModuleCallback;
      this.classPoolFactory = classPoolFactory;
      classPoolRepository = ClassPoolRepository.getInstance();
      classPoolRepository.setClassPoolFactory(classPoolFactory);
   }
 
   public static JBossClClassPoolConfig getInstance()
   {
      if (config == null)
      {
         config = initialize();
      }
      return config;
   }
   
   private synchronized static JBossClClassPoolConfig initialize()
   {
      if (config != null)
         return config;
      
      DomainRegistry domainRegistry = new VFSClassLoaderDomainRegistry();
      RegisterModuleCallback registerModuleCallback = new RegisterModuleCallback(domainRegistry);
      JBossClDelegatingClassPoolFactory classPoolFactory = new JBossClDelegatingClassPoolFactory(domainRegistry, registerModuleCallback);
      
      return new JBossClClassPoolConfig(domainRegistry, registerModuleCallback, classPoolFactory);
   }
   
   /**
    * Set the classLoading. This should be set via a property 
    * by the MC
    * 
    * @param cl the classLoading to set
    */
   public void setClassLoading(ClassLoading cl)
   {
      if (cl != null)
         cl.addModuleRegistry(registerModuleCallback);
      else if (classLoading != null)
         classLoading.removeModuleRegistry(registerModuleCallback);
      
      classLoading = cl;
   }
}


So basically all the AS bootstrap will need to do is to call JBossClClassPoolConfig.getInstance() to initialize the classpool parts, and then deploy the JBossClClassPoolConfig bean whose purpose is to add the RegisterModuleCallback as a module registry in ClassLoading once that is deployed.

With this in place and with a few small changes to how the aop classes work, what is in bootstrap/aop.xml will reuse things from JBossClClassPoolConfig where appropriate.

--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/539242#539242]

Start a new discussion in JBoss Microcontainer Development at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2115]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20100423/4a702344/attachment.html 


More information about the jboss-user mailing list