[jboss-cvs] JBossAS SVN: r85651 - in projects/aop/trunk/asintegration-mc/src: main/java/org/jboss/aop/classpool/jbosscl and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Mar 9 13:43:09 EDT 2009


Author: kabir.khan at jboss.com
Date: 2009-03-09 13:43:09 -0400 (Mon, 09 Mar 2009)
New Revision: 85651

Added:
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/RegisterModuleCallback.java
Modified:
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java
   projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
   projects/aop/trunk/asintegration-mc/src/resources/META-INF/aop.xml
   projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
Log:
[JBAOP-666] Register bootstrap classloaders in AS

Added: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/RegisterModuleCallback.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/RegisterModuleCallback.java	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/asintegration/jboss5/RegisterModuleCallback.java	2009-03-09 17:43:09 UTC (rev 85651)
@@ -0,0 +1,68 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.aop.asintegration.jboss5;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.logging.Logger;
+
+/**
+ * Use with org.jboss.aop.classpool.jbosscl.JBossClDelegatingClassPoolFactory
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class RegisterModuleCallback
+{
+   Logger logger = Logger.getLogger(this.getClass());
+   
+   private Set<Module> registeredModules = new HashSet<Module>();
+   private Set<Module> unregisteredModules = new HashSet<Module>();
+
+   public synchronized void addModule(Module module)
+   {
+      logger.debug("Adding module " + module);
+      unregisteredModules.add(module);
+   }
+
+   public synchronized void removeModule(Module module)
+   {
+      logger.debug("Removing module " + module);
+      registeredModules.remove(module);
+      unregisteredModules.remove(module);
+   }
+   
+   public synchronized Set<Module> getUnregisteredModules()
+   {
+      return Collections.unmodifiableSet(new HashSet<Module>(unregisteredModules));
+   }
+   
+   public synchronized void registerModule(Module module)
+   {
+      logger.debug("Registering module " + module);
+      registeredModules.add(module);
+      unregisteredModules.remove(module);
+   }
+}

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	2009-03-09 15:55:05 UTC (rev 85650)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	2009-03-09 17:43:09 UTC (rev 85651)
@@ -51,7 +51,7 @@
       super(domain, cl, parent, repository);
       if (module == null)
       {
-         throw new IllegalStateException("Null Module");
+         throw new IllegalStateException("Null Module for loader " + cl);
       }
       if (domain instanceof JBossClClassPoolDomain == false)
       {

Modified: projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-03-09 15:55:05 UTC (rev 85650)
+++ projects/aop/trunk/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-03-09 17:43:09 UTC (rev 85651)
@@ -21,6 +21,10 @@
 */ 
 package org.jboss.aop.classpool.jbosscl;
 
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Set;
+
 import javassist.ClassPool;
 import javassist.scopedpool.ScopedClassPool;
 import javassist.scopedpool.ScopedClassPoolFactory;
@@ -28,6 +32,7 @@
 
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.asintegration.jboss5.DomainRegistry;
+import org.jboss.aop.asintegration.jboss5.RegisterModuleCallback;
 import org.jboss.aop.classpool.AbstractJBossDelegatingClassPoolFactory;
 import org.jboss.aop.classpool.ClassPoolDomain;
 import org.jboss.aop.classpool.ClassPoolDomainRegistry;
@@ -36,6 +41,7 @@
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.classloading.spi.dependency.ClassLoading;
 import org.jboss.classloading.spi.dependency.Module;
 
 /**
@@ -45,11 +51,14 @@
  */
 public class JBossClDelegatingClassPoolFactory extends AbstractJBossDelegatingClassPoolFactory implements ScopedClassPoolFactory
 {
-   private DomainRegistry registry;
+   private final DomainRegistry registry;
    
-   public JBossClDelegatingClassPoolFactory(DomainRegistry registry)
+   private final RegisterModuleCallback registerModuleCallback;
+   
+   public JBossClDelegatingClassPoolFactory(DomainRegistry registry, RegisterModuleCallback registerModuleCallback)
    {
       this.registry = registry;
+      this.registerModuleCallback = registerModuleCallback;
    }
    
    public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
@@ -59,6 +68,12 @@
       if (cl instanceof RealClassLoader)
       {
          Module module = registry.getModule(cl);
+         if (module == null)
+         {
+            module = getModuleForClassLoader(cl);
+         }
+         registerModuleCallback.registerModule(module);
+         registerBootstrapLoaders();
          ClassPoolDomain domain = getDomain(module, cl);  
          return new JBossClDelegatingClassPool(domain, cl, parent, repository, module);
       }
@@ -122,4 +137,41 @@
       }
       return parent;
    }
+   
+   private void registerBootstrapLoaders()
+   {
+      Set<Module> unregistered = registerModuleCallback.getUnregisteredModules();
+      if (unregistered.size() > 0)
+      {
+         for (Module module : unregistered)
+         {
+            ClassLoader loader = getClassLoaderForModule(module);
+            log.debug("Registering loader for module " + module + ": " + loader);
+            AspectManager.instance().registerClassLoader(loader);
+         }
+      }
+   }
+   
+   private ClassLoader getClassLoaderForModule(final Module module)
+   {
+      return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+      {
+      
+         public ClassLoader run()
+         {
+            return ClassLoading.getClassLoaderForModule(module);
+         }
+      });
+   }
+   
+   private Module getModuleForClassLoader(final ClassLoader classLoader)
+   {
+      return AccessController.doPrivileged(new PrivilegedAction<Module>()
+      {
+         public Module run()
+         {
+            return ClassLoading.getModuleForClassLoader(classLoader);
+         }
+      });
+   }
 }

Modified: projects/aop/trunk/asintegration-mc/src/resources/META-INF/aop.xml
===================================================================
--- projects/aop/trunk/asintegration-mc/src/resources/META-INF/aop.xml	2009-03-09 15:55:05 UTC (rev 85650)
+++ projects/aop/trunk/asintegration-mc/src/resources/META-INF/aop.xml	2009-03-09 17:43:09 UTC (rev 85651)
@@ -18,7 +18,10 @@
    <bean name="AOPClassLoaderScopingPolicy" class="org.jboss.aop.asintegration.jboss5.VFSClassLoaderScopingPolicy"/>
    
    <bean name="AOPClassPoolFactory" class="org.jboss.aop.classpool.jbosscl.JBossClDelegatingClassPoolFactory">
-      <constructor><parameter><inject bean="AOPClassLoaderScopingPolicy" property="registry"/></parameter></constructor>
+      <constructor>
+         <parameter><inject bean="AOPClassLoaderScopingPolicy" property="registry"/></parameter>
+         <parameter><inject bean="AOPRegisterModuleCallback"/></parameter>
+      </constructor>
    </bean>
 
    <bean name="AOPJBossIntegration" class="org.jboss.aop.asintegration.jboss5.JBoss5Integration">
@@ -31,12 +34,17 @@
       <property name="managerProperty">aspectManager</property>
    </bean>
 
-   <bean name="AOPBootstrap" class="org.jboss.aop.asintegration.jboss5.AOPBootstrap">
+   <!-- bean name="AOPBootstrap" class="org.jboss.aop.asintegration.jboss5.AOPBootstrap" -->
       <!--  This one lives in AS 5 source tree -->
-      <property name="policy"><inject bean="AOPClassLoaderScopingPolicy"/></property>
+      <!-- property name="policy"><inject bean="AOPClassLoaderScopingPolicy"/></property>
        <property name="manager"><inject bean="AspectManager" property="aspectManager"/></property>
+   </bean-->
+
+   <bean name="AOPRegisterModuleCallback" class="org.jboss.aop.asintegration.jboss5.RegisterModuleCallback">
+      <!-- classloader><null/></classloader -->
+      <incallback method="addModule" state="Installed"/>
+      <uncallback method="removeModule" state="Installed"/>
    </bean>
-
    <!--
       Valid values for the AspectManager bean for use with enableTransformer=true are:
       * org.jboss.aop.deployers.AspectManagerJDK5 - works with the -javaagent:pluggable-instrumentor.jar switch

Modified: projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-03-09 15:55:05 UTC (rev 85650)
+++ projects/aop/trunk/asintegration-mc/src/test/java/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-03-09 17:43:09 UTC (rev 85651)
@@ -36,6 +36,7 @@
 import junit.framework.Test;
 
 import org.jboss.aop.AspectManager;
+import org.jboss.aop.asintegration.jboss5.RegisterModuleCallback;
 import org.jboss.aop.asintegration.jboss5.VFSClassLoaderDomainRegistry;
 import org.jboss.aop.classpool.jbosscl.JBossClDelegatingClassPoolFactory;
 import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
@@ -122,7 +123,7 @@
    {
       domainRegistry = new VFSClassLoaderDomainRegistry();
       
-      AspectManager.setClassPoolFactory(new JBossClDelegatingClassPoolFactory(domainRegistry));
+      AspectManager.setClassPoolFactory(new JBossClDelegatingClassPoolFactory(domainRegistry, new RegisterModuleCallback()));
       VFS.init();
    }
 




More information about the jboss-cvs-commits mailing list