[jboss-cvs] JBossAS SVN: r81889 - in projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans: metadata and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Dec 1 06:41:49 EST 2008


Author: kabir.khan at jboss.com
Date: 2008-12-01 06:41:48 -0500 (Mon, 01 Dec 2008)
New Revision: 81889

Added:
   projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/ClassLoaderAwareGenericBeanFactory.java
Modified:
   projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/GenericBeanAspectFactory.java
   projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/SecurityActions.java
   projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java
Log:
[JBMICROCONT-400] Create version of GenericBeanFactory where the classloader used to create the beans can be overridden. This is needed by GenericBeanAspectFactory since the loader that should be used to create the bean instances may be different from the loader used to deploy the aspect factory

Added: projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/ClassLoaderAwareGenericBeanFactory.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/ClassLoaderAwareGenericBeanFactory.java	                        (rev 0)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/ClassLoaderAwareGenericBeanFactory.java	2008-12-01 11:41:48 UTC (rev 81889)
@@ -0,0 +1,66 @@
+/*
+* 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.microcontainer.beans;
+
+import org.jboss.beans.metadata.plugins.factory.GenericBeanFactory;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ClassLoaderAwareGenericBeanFactory extends GenericBeanFactory
+{
+   ThreadLocal<ClassLoader> pushedLoader = new ThreadLocal<ClassLoader>();
+   
+   public ClassLoaderAwareGenericBeanFactory(KernelConfigurator configurator)
+   {
+      super(configurator);
+   }
+   
+   public void pushLoader(ClassLoader loader)
+   {
+      pushedLoader.set(loader);
+   }
+   
+   public void popLoader()
+   {
+      pushedLoader.set(null);
+   }
+
+   @Override
+   public Object createBean() throws Throwable
+   {
+      ClassLoader loader = pushedLoader.get();
+      if (loader == null)
+      {
+         return super.createBean();
+      }
+      else
+      {
+         return super.createBean(loader);
+      }
+   }
+ 
+   
+}

Modified: projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/GenericBeanAspectFactory.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/GenericBeanAspectFactory.java	2008-12-01 11:07:01 UTC (rev 81888)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/GenericBeanAspectFactory.java	2008-12-01 11:41:48 UTC (rev 81889)
@@ -56,7 +56,7 @@
    
    protected KernelControllerContext context;
    
-   public GenericBeanAspectFactory(String name, GenericBeanFactory factory, Element element)
+   public GenericBeanAspectFactory(String name, BeanFactory factory, Element element)
    {
       super(null, element);
       this.name = name;
@@ -64,11 +64,11 @@
       setBeanFactory(factory);
    }
 
-   public void setBeanFactory(GenericBeanFactory factory)
+   public void setBeanFactory(BeanFactory factory)
    {
-      if (factory != null)
+      if (factory != null && factory instanceof GenericBeanFactory)
       {
-         classname = factory.getBean();
+         classname = ((GenericBeanFactory)factory).getBean();
       }
       this.factory = factory;
    }
@@ -130,34 +130,14 @@
    {
       try
       {
-         log.debug("Creating advice " + name);
-         
-         
-         PushedClassLoaderMetaData pcmd = null;
-         if (((GenericBeanFactory)factory).getClassLoader() == null)
+         final ClassLoader loader = getCreatingClassLoader(advisor);
+         log.debug("Creating advice " + name + " with loader " + loader);
+         if (factory instanceof ClassLoaderAwareGenericBeanFactory)
          {
-            pcmd = new PushedClassLoaderMetaData();
-            ((GenericBeanFactory)factory).setClassLoader(pcmd);
+            ((ClassLoaderAwareGenericBeanFactory)factory).pushLoader(loader);
          }
          
-         Object object = null;
-         try
-         {
-            //Try without looking at the context first which is what shold be used when running scoped in AS
-            object = factory.createBean();
-         }
-         catch(Throwable t)
-         {
-            if (pcmd != null)
-            {
-               pcmd.setLookAtContext(true);
-            }
-            else
-            {
-               throw new RuntimeException(t);
-            }
-            object = factory.createBean();
-         }
+         Object object = factory.createBean();
          
          if (object instanceof XmlLoadable)
          {
@@ -170,59 +150,21 @@
       {
          throw new RuntimeException(throwable);
       }
+      finally
+      {
+         if (factory instanceof ClassLoaderAwareGenericBeanFactory)
+         {
+            ((ClassLoaderAwareGenericBeanFactory)factory).popLoader();
+         }
+      }
    }
    
-   /**
-    * Gets any classloaders for the thread
-    */
-   private class PushedClassLoaderMetaData extends AbstractClassLoaderMetaData
+   private ClassLoader getCreatingClassLoader(Advisor advisor)
    {
-      /** The serialVersionUID */
-      private static final long serialVersionUID = 1L;
-      
-      boolean lookAtContext;
-      
-      void setLookAtContext(boolean look)
+      if (advisor == null)
       {
-         lookAtContext = look;
+         return getLoader();
       }
-   
-      @Override
-      public ValueMetaData getClassLoader()
-      {
-         ClassLoader loader = GenericBeanAspectFactory.this.getLoader(); 
-         //GenericBeanAspectFactory.this.peekScopedClassLoader();
-         if (loader == null)
-         {
-            if (lookAtContext && context != null)
-            {
-               try
-               {
-                  loader = context.getClassLoader();
-               }
-               catch (Throwable t)
-               {
-                  log.trace("Unable to retrieve classloader from " + context);
-               }
-               
-               if (loader == null)
-               {
-                  try
-                  {
-                     loader = Configurator.getClassLoader(((GenericBeanFactory)factory).getClassLoader());
-                  }
-                  catch (Throwable e)
-                  {
-                     log.trace("Unable to retrieve classloader from " + factory);
-                  }
-               }
-            }
-            return loader != null ?  new AbstractValueMetaData(loader) : null;
-         }
-         else
-         {
-            return new AbstractValueMetaData(loader);
-         }
-      }
+      return SecurityActions.getClassLoader(advisor.getClass());
    }
 }

Modified: projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/SecurityActions.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/SecurityActions.java	2008-12-01 11:07:01 UTC (rev 81888)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/SecurityActions.java	2008-12-01 11:41:48 UTC (rev 81889)
@@ -69,4 +69,43 @@
          return GetContextClassLoaderAction.PRIVILEGED.getContextClassLoader();
       }
    }
+
+   private interface GetClassLoaderAction
+   {
+      ClassLoader getClassLoader(Class<?> clazz);
+      
+      GetClassLoaderAction PRIVILEGED = new GetClassLoaderAction(){
+      
+            public ClassLoader getClassLoader(final Class<?> clazz)
+            {
+               return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+               {
+                  public ClassLoader run()
+                  {
+                     return clazz.getClassLoader();
+                  }
+               });
+            }
+      };
+
+      GetClassLoaderAction NOT_PRIVILEGED = new GetClassLoaderAction(){
+         
+         public ClassLoader getClassLoader(Class<?> clazz)
+         {
+            return clazz.getClassLoader();
+         }
+      };
+   }
+   
+   public static ClassLoader getClassLoader(Class<?> clazz)
+   {
+      if (System.getSecurityManager() == null)
+      {
+         return GetClassLoaderAction.NOT_PRIVILEGED.getClassLoader(clazz);
+      }
+      else
+      {
+         return GetClassLoaderAction.PRIVILEGED.getClassLoader(clazz);
+      }
+   }
 }

Modified: projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java	2008-12-01 11:07:01 UTC (rev 81888)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java	2008-12-01 11:41:48 UTC (rev 81889)
@@ -32,6 +32,7 @@
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.jboss.aop.microcontainer.beans.Aspect;
+import org.jboss.aop.microcontainer.beans.ClassLoaderAwareGenericBeanFactory;
 import org.jboss.beans.metadata.plugins.AbstractDependencyValueMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
@@ -138,6 +139,7 @@
       }
       BeanMetaData factory = beans.get(0);
       BeanMetaDataBuilder factoryBuilder = BeanMetaDataBuilder.createBuilder(factory);
+      factoryBuilder.setBean(ClassLoaderAwareGenericBeanFactory.class.getName());
       result.add(factory);
       
       //Add the Aspect




More information about the jboss-cvs-commits mailing list