[jboss-cvs] JBossAS SVN: r96463 - in projects/kernel/trunk: jmx-mc-int/src/test/java/org/jboss/test/system/metadata/value/valuefactory/test and 9 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 17 12:23:51 EST 2009


Author: alesj
Date: 2009-11-17 12:23:51 -0500 (Tue, 17 Nov 2009)
New Revision: 96463

Added:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CleanupJoinPoint.java
Modified:
   projects/kernel/trunk/jmx-mc-int/src/test/java/org/jboss/test/system/metadata/value/valuefactory/test/MockTypeInfo.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueFactoryMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/AbstractScopeMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/ValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/AbstractKernelConfigurator.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/Configurator.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstantiateAction.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/LifecycleAction.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/PropertyDispatchWrapper.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/config/KernelConfigurator.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/support/container/plugin/GenericComponentFactory.java
   projects/kernel/trunk/pom.xml
Log:
[JBKERNEL-61]; initial uninject impl. A lot more work ahead ...

Modified: projects/kernel/trunk/jmx-mc-int/src/test/java/org/jboss/test/system/metadata/value/valuefactory/test/MockTypeInfo.java
===================================================================
--- projects/kernel/trunk/jmx-mc-int/src/test/java/org/jboss/test/system/metadata/value/valuefactory/test/MockTypeInfo.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/jmx-mc-int/src/test/java/org/jboss/test/system/metadata/value/valuefactory/test/MockTypeInfo.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -94,6 +94,11 @@
       return clazz;
    }
 
+   public ClassLoader getClassLoader()
+   {
+      return clazz.getClassLoader();
+   }
+
    public TypeInfoFactory getTypeInfoFactory()
    {
       // TODO Auto-generated method stub

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanMetaData.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanMetaData.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -756,6 +756,7 @@
    {
       if (context == null)
          throw new IllegalStateException("Context has not been set: " + this);
+
       Controller controller = context.getController();
       ControllerContext lookup = controller.getInstalledContext(name);
       if (lookup == null || lookup.getTarget() == null)
@@ -776,6 +777,11 @@
       return target;
    }
 
+   public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+   {
+      return null;
+   }
+
    public void toString(JBossStringBuilder buffer)
    {
       buffer.append("name=").append(name);

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueFactoryMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueFactoryMetaData.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueFactoryMetaData.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -317,6 +317,16 @@
 
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
+      return applyValue(info, cl, false);
+   }
+
+   public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+   {
+      return applyValue(info, cl, true);
+   }
+
+   protected Object applyValue(TypeInfo info, ClassLoader cl, boolean unget) throws Throwable
+   {
       ControllerState state = dependentState;
       if (state == null)
          state = ControllerState.INSTALLED;
@@ -331,10 +341,10 @@
       KernelConfigurator configurator = kernel.getConfigurator();
       Object result = InvokeDispatchHelper.invoke(
             configurator,
-            lookup.getTarget(),
             (InvokeDispatchContext)lookup,
             getMethod(),
-            getParameters()
+            getParameters(),
+            unget
       );
       if (result == null)
          result = defaultValue;
@@ -356,6 +366,7 @@
          buffer.append(" parameters=").append(parameters);
    }
 
+   @SuppressWarnings({"unchecked"})
    public AbstractValueFactoryMetaData clone()
    {
       AbstractValueFactoryMetaData clone = (AbstractValueFactoryMetaData)super.clone();

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -144,6 +144,11 @@
       }
    }
 
+   public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+   {
+      return null; // plain null
+   }
+
    @XmlTransient
    public Iterator<? extends MetaDataVisitorNode> getChildren()
    {

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/AbstractScopeMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/AbstractScopeMetaData.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/AbstractScopeMetaData.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -94,6 +94,11 @@
       }
    }
 
+   public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+   {
+      return null;
+   }
+
    private ScopeKey createScopeKey(String name, String qualifier)
    {
       int level = ScopeLevel.getScopeLevel(name);

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/ValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/ValueMetaData.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/ValueMetaData.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -77,4 +77,19 @@
     * @throws Throwable for any error
     */
    Object getValue(TypeInfo info, ClassLoader cl) throws Throwable;
+
+   /**
+    * Unget the value.
+    *
+    * This will normally return null,
+    * the goal is to unget the potential injection,
+    * which in some component models requires more cleanup.
+    * e.g. OSGi services need an explicit unget call on ServiceRefs
+    *
+    * @param info the type info
+    * @param cl the classloader
+    * @return the value.
+    * @throws Throwable for any error
+    */
+   Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable;
 }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -156,6 +156,11 @@
          return value.getValue(info, cl);
       }
 
+      public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+      {
+         return value.ungetValue(info, cl);
+      }
+
       public void initialVisit(MetaDataVisitor vistor)
       {
          vistor.initialVisit(this);

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/AbstractKernelConfigurator.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/AbstractKernelConfigurator.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/AbstractKernelConfigurator.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -41,6 +41,7 @@
  * Abstract Kernel configurator.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
 public class AbstractKernelConfigurator extends AbstractKernelObject implements KernelConfigurator
@@ -137,11 +138,21 @@
       return Configurator.getConstructorJoinPoint(config, info, metaData, beanMetaData, object);
    }
 
+   public Joinpoint getConstructorJoinPoint(BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object, boolean unget) throws Throwable
+   {
+      return Configurator.getConstructorJoinPoint(config, info, metaData, beanMetaData, object, unget);
+   }
+
    public MethodJoinpoint getMethodJoinPoint(BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic) throws Throwable
    {
       return Configurator.findMethod(info, cl, name, parameters, isStatic, isPublic);
    }
-   
+
+   public MethodJoinpoint getMethodJoinPoint(BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic, boolean unget) throws Throwable
+   {
+      return Configurator.findMethod(info, cl, name, parameters, isStatic, isPublic, unget);
+   }
+
    public void setKernel(Kernel kernel) throws Throwable
    {
       super.setKernel(kernel);

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/Configurator.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/Configurator.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/config/Configurator.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -109,8 +109,7 @@
     * @return the joinpoint
     * @throws Throwable for any error
     */
-   public static Joinpoint getConstructorJoinPoint(KernelConfig config, BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData)
-      throws Throwable
+   public static Joinpoint getConstructorJoinPoint(KernelConfig config, BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData) throws Throwable
    {
       return getConstructorJoinPoint(config, info, metaData, beanMetaData, null);
    }
@@ -126,9 +125,25 @@
     * @return the joinpoint
     * @throws Throwable for any error
     */
-   public static Joinpoint getConstructorJoinPoint(KernelConfig config, BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object)
-      throws Throwable
+   public static Joinpoint getConstructorJoinPoint(KernelConfig config, BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object) throws Throwable
    {
+      return getConstructorJoinPoint(config, info, metaData, beanMetaData, object, false);
+   }
+
+   /**
+    * Get a constructor joinpoint
+    *
+    * @param config the kernel config
+    * @param info the bean info
+    * @param metaData the constructor metadata
+    * @param beanMetaData the bean metadata
+    * @param object an opaque object
+    * @param unget do we actually do an unget on the ctor
+    * @return the joinpoint
+    * @throws Throwable for any error
+    */
+   public static Joinpoint getConstructorJoinPoint(KernelConfig config, BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object, boolean unget) throws Throwable
+   {
       boolean trace = log.isTraceEnabled();
 
       if (trace)
@@ -154,26 +169,29 @@
          if (vmd != null)
          {
             // Get the factory
-            Object factory = vmd.getValue(null, cl);
-
+            Object factory;
+            if (unget)
+            {
+               try
+               {
+                  factory = vmd.getValue(null, cl);
+               }
+               finally
+               {
+                  vmd.ungetValue(null, cl); // do cleanup call
+               }
+            }
+            else
+            {
+               factory = vmd.getValue(null, cl);
+            }
             // Get the parameters
             List<ParameterMetaData> parameters = metaData.getParameters();
-
             // Describe the factory
             BeanInfo factoryInfo = config.getBeanInfo(factory.getClass());
-
             // Find the method
-            MethodJoinpoint joinPoint = findMethod(trace, factoryInfo, cl, metaData.getFactoryMethod(), parameters, false, true);
+            MethodJoinpoint joinPoint = findMethod(trace, factoryInfo, cl, metaData.getFactoryMethod(), parameters, false, true, unget);
             joinPoint.setTarget(factory);
-            MethodInfo minfo = joinPoint.getMethodInfo();
-
-            // Set the parameters
-            if (minfo != null)
-            {
-               TypeInfo[] pinfos = minfo.getParameterTypes();
-               Object[] params = getParameters(trace, cl, pinfos, parameters);
-               joinPoint.setArguments(params);
-            }
             return joinPoint;
          }
 
@@ -182,32 +200,19 @@
          {
             // Get the parameters
             List<ParameterMetaData> parameters = metaData.getParameters();
-
             BeanInfo factoryInfo = config.getBeanInfo(factoryClassName, cl);
-
             // Find the method
-            MethodJoinpoint joinPoint = findMethod(trace, factoryInfo, cl, metaData.getFactoryMethod(), parameters, true, true);
-            MethodInfo minfo = joinPoint.getMethodInfo();
-
-            // Set the parameters
-            if (minfo != null)
-            {
-               TypeInfo[] pinfos = minfo.getParameterTypes();
-               Object[] params = getParameters(trace, cl, pinfos, parameters);
-               joinPoint.setArguments(params);
-            }
-            return joinPoint;
+            return findMethod(trace, factoryInfo, cl, metaData.getFactoryMethod(), parameters, true, true, unget);
          }
 
          // Find the constructor
          ConstructorJoinpoint joinPoint = findConstructor(trace, info, metaData, object);
          ConstructorInfo cinfo = joinPoint.getConstructorInfo();
-
          // Set the parameters
          if (cinfo != null)
          {
             TypeInfo[] pinfos = cinfo.getParameterTypes();
-            Object[] params = getParameters(trace, cl, pinfos, metaData.getParameters());
+            Object[] params = getParameters(trace, cl, pinfos, metaData.getParameters(), unget);
             joinPoint.setArguments(params);
          }
          return joinPoint;
@@ -533,6 +538,25 @@
    /**
     * Find a method
     *
+    * @param info the bean info
+    * @param cl the classloader
+    * @param name the method name
+    * @param parameters the parameter metadata
+    * @param isStatic whether the method is static
+    * @param isPublic whether the method is public
+    * @param unget do we actually do an unget on params
+    * @return the method join point
+    * @throws Throwable for any error
+    */
+   public static MethodJoinpoint findMethod(BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic, boolean unget) throws Throwable
+   {
+      boolean trace = log.isTraceEnabled();
+      return findMethod(trace, info, cl, name, parameters, isStatic, isPublic, unget);
+   }
+
+   /**
+    * Find a method
+    *
     * @param trace whether trace is enabled
     * @param info the bean info
     * @param cl the classloader
@@ -545,6 +569,25 @@
     */
    public static MethodJoinpoint findMethod(boolean trace, BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic) throws Throwable
    {
+      return findMethod(trace, info, cl, name, parameters, isStatic, isPublic, false);
+   }
+
+   /**
+    * Find a method
+    *
+    * @param trace whether trace is enabled
+    * @param info the bean info
+    * @param cl the classloader
+    * @param name the method name
+    * @param parameters the parameter metadata
+    * @param isStatic whether the method is static
+    * @param isPublic whether the method is public
+    * @param unget do we actually do an unget on params
+    * @return the method join point
+    * @throws Throwable for any error
+    */
+   public static MethodJoinpoint findMethod(boolean trace, BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic, boolean unget) throws Throwable
+   {
       if (info == null)
          throw new IllegalArgumentException("Null bean info");
       if (name == null)
@@ -559,7 +602,7 @@
       if (minfo != null)
       {
          TypeInfo[] pinfos = minfo.getParameterTypes();
-         Object[] params = getParameters(trace, cl, pinfos, parameters);
+         Object[] params = getParameters(trace, cl, pinfos, parameters, unget);
          joinPoint.setArguments(params);
       }
 
@@ -616,10 +659,11 @@
     * @param cl the classloader
     * @param pinfos the parameter infos
     * @param parameters the parameter metadata
+    * @param unget do we actually do an unget on params
     * @return an array of parameters
     * @throws Throwable for any error
     */
-   public static Object[] getParameters(boolean trace, ClassLoader cl, TypeInfo[] pinfos, List<ParameterMetaData> parameters) throws Throwable
+   public static Object[] getParameters(boolean trace, ClassLoader cl, TypeInfo[] pinfos, List<ParameterMetaData> parameters, boolean unget) throws Throwable
    {
       if (parameters == null)
          return NO_PARAM_VALUES;
@@ -630,7 +674,10 @@
       {
          ParameterMetaData pdata = i.next();
          ValueMetaData vmd = pdata.getValue();
-         params[x] = vmd.getValue(pinfos[x], cl);
+         if (unget)
+            params[x] = vmd.ungetValue(pinfos[x], cl);
+         else
+            params[x] = vmd.getValue(pinfos[x], cl);
          x++;
       }
       return params;
@@ -750,6 +797,11 @@
          return vmd.getValue(info, cl);
       }
 
+      public Object cleanup()
+      {
+         return null;
+      }
+
       public String toHumanReadableString()
       {
          return vmd.toShortString();

Copied: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CleanupJoinPoint.java (from rev 96220, projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/DispatchJoinPoint.java)
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CleanupJoinPoint.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CleanupJoinPoint.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -0,0 +1,65 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.kernel.plugins.dependency;
+
+import java.security.PrivilegedExceptionAction;
+
+import org.jboss.joinpoint.spi.Joinpoint;
+
+/**
+ * CleanupJoinPoint.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+class CleanupJoinPoint implements PrivilegedExceptionAction<Object>
+{
+   private Joinpoint joinpoint;
+
+   public CleanupJoinPoint(Joinpoint joinpoint)
+   {
+      this.joinpoint = joinpoint;
+   }
+
+   public Object run() throws Exception
+   {
+      try
+      {
+         return joinpoint.cleanup();
+      }
+      catch (RuntimeException e)
+      {
+         throw e;
+      }
+      catch (Exception e)
+      {
+         throw e;
+      }
+      catch (Error e)
+      {
+         throw e;
+      }
+      catch (Throwable t)
+      {
+         throw new RuntimeException(t);
+      }
+   }
+}
\ No newline at end of file

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -69,6 +69,21 @@
       KernelConfigurator configurator = kernel.getConfigurator();
       BeanMetaData metaData = context.getBeanMetaData();
 
+      invokeInstalls(context, controller, configurator, metaData, false);
+   }
+
+   /**
+    * Invoke installs.
+    *
+    * @param context the context
+    * @param controller the controller
+    * @param configurator the configurator
+    * @param metaData the metadata
+    * @param unget do we do unget
+    * @throws Throwable for any error
+    */
+   protected void invokeInstalls(KernelControllerContext context, KernelController controller, KernelConfigurator configurator, BeanMetaData metaData, boolean unget) throws Throwable
+   {
       List<InstallMetaData> installs = metaData.getInstalls();
       if (installs != null && installs.isEmpty() == false)
       {
@@ -91,10 +106,10 @@
                      {
                         InvokeDispatchHelper.invoke(
                               configurator,
-                              target.getTarget(),
                               (InvokeDispatchContext)target,
                               install.getMethodName(),
-                              install.getParameters()
+                              install.getParameters(),
+                              unget
                         );
                      }
                      finally
@@ -111,9 +126,12 @@
          }
          catch (Throwable t)
          {
-            considerUninstalls(context, index);
-            undoInstallAction(context);
-            throw t;
+            if (unget == false)
+            {
+               considerUninstalls(context, index);
+               undoInstallAction(context);
+               throw t;
+            }
          }
       }
    }
@@ -182,11 +200,22 @@
     */
    protected void doUninstalls(KernelControllerContext context, int index)
    {
+      if (index < 0)
+         return;
+
       KernelController controller = (KernelController) context.getController();
       Kernel kernel = controller.getKernel();
       KernelConfigurator configurator = kernel.getConfigurator();
       BeanMetaData metaData = context.getBeanMetaData();
 
+      try
+      {
+         invokeInstalls(context, controller, configurator, metaData, true);
+      }
+      catch (Throwable ignored)
+      {
+      }
+
       List<InstallMetaData> uninstalls = metaData.getUninstalls();
       if (uninstalls != null && uninstalls.isEmpty() == false)
       {
@@ -211,13 +240,26 @@
                   try
                   {
                      previous = SecurityActions.setContextClassLoader(context);
-                     InvokeDispatchHelper.invoke(
+                     try
+                     {
+                        InvokeDispatchHelper.invoke(
                            configurator,
-                           target.getTarget(),
                            (InvokeDispatchContext)target,
                            uninstall.getMethodName(),
-                           uninstall.getParameters()
-                     );
+                           uninstall.getParameters(),
+                           false
+                        );
+                     }
+                     finally
+                     {
+                        InvokeDispatchHelper.invoke(
+                           configurator,
+                              (InvokeDispatchContext)target,
+                           uninstall.getMethodName(),
+                           uninstall.getParameters(),
+                           true
+                        );
+                     }
                   }
                   catch (Throwable t)
                   {

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstantiateAction.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstantiateAction.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/InstantiateAction.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -42,6 +42,7 @@
  * InstantiateAction.
  *
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
 public class InstantiateAction extends AnnotationsAction
@@ -107,9 +108,9 @@
 
    protected void uninstallActionInternal(KernelControllerContext context)
    {
+      KernelController controller = (KernelController)context.getController();
       try
       {
-         KernelController controller = (KernelController)context.getController();
          DependencyInfo dependencyInfo = context.getDependencyInfo();
          if (dependencyInfo != null && dependencyInfo.isAutowireCandidate())
             controller.removeInstantiatedContext(context);
@@ -120,7 +121,27 @@
       }
       finally
       {
-         context.setTarget(null);
+         Object cleanup = null;
+         try
+         {
+            Kernel kernel = controller.getKernel();
+            KernelMetaDataRepository repository = kernel.getMetaDataRepository();
+            KernelConfigurator configurator = kernel.getConfigurator();
+
+            BeanMetaData metaData = context.getBeanMetaData();
+            BeanInfo info = context.getBeanInfo();
+            MetaData repositoryMetaData = repository.getMetaData(context);
+
+            Joinpoint joinPoint = configurator.getConstructorJoinPoint(info, metaData.getConstructor(), metaData, repositoryMetaData, true);
+            cleanup = cleanupJoinPoint(context, joinPoint);
+         }
+         catch (Throwable ignored)
+         {
+         }
+         finally
+         {
+            context.setTarget(cleanup);
+         }
       }
    }
 

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -73,6 +73,20 @@
    }
    
    /**
+    * Cleanup a joinpoint
+    *
+    * @param context   the context
+    * @param joinpoint the joinpoint
+    * @return the result
+    * @throws Throwable for any error
+    */
+   static Object cleanupJoinPoint(final KernelControllerContext context, final Joinpoint joinpoint) throws Throwable
+   {
+      ExecutionWrapper wrapper = new JoinpointCleanupWrapper(joinpoint);
+      return dispatchExecutionWrapper(context, wrapper);
+   }
+
+   /**
     * Dispatch a wrapper
     *
     * @param context   the context
@@ -250,6 +264,31 @@
    }
 
    /**
+    * Joinpoint cleanup execution wrapper.
+    */
+   private static class JoinpointCleanupWrapper extends ExecutionWrapper
+   {
+      private Joinpoint joinpoint;
+
+      public JoinpointCleanupWrapper(Joinpoint joinpoint)
+      {
+         if (joinpoint == null)
+            throw new IllegalArgumentException("Null joinpoint");
+         this.joinpoint = joinpoint;
+      }
+
+      protected Object execute() throws Throwable
+      {
+         return joinpoint.cleanup();
+      }
+
+      protected PrivilegedExceptionAction<Object> getAction()
+      {
+         return new CleanupJoinPoint(joinpoint);
+      }
+   }
+
+   /**
     * Get bean validator bridge.
     *
     * @param context the owner context

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/LifecycleAction.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/LifecycleAction.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/LifecycleAction.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -190,7 +190,6 @@
 
       if (isInstallInvocationIgnored(context) == false)
       {
-
          KernelController controller = (KernelController)context.getController();
          Kernel kernel = controller.getKernel();
          KernelConfigurator configurator = kernel.getConfigurator();
@@ -198,55 +197,96 @@
          Object target = context.getTarget();
          BeanInfo info = context.getBeanInfo();
          BeanMetaData metaData = context.getBeanMetaData();
-         String method = getInstallMethod(context);
-         List<ParameterMetaData> parameters = getInstallParameters(context);
-         MethodJoinpoint joinpoint;
-         try
-         {
-            ClassLoader cl = Configurator.getClassLoader(metaData);
-            joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true);
-         }
-         catch (JoinpointException ignored)
-         {
-            if (trace)
-            {
-               if (parameters == null)
-                  log.trace("No " + method + " method for " + context);
-               else
-                  log.trace("No " + method + parameters + " method for " + context);
-            }
-            return;
-         }
-         joinpoint.setTarget(target);
-         dispatchJoinPoint(context, joinpoint);
+         MethodJoinpoint joinpoint = invokeInstallLifecycle(trace, context, configurator, target, info, metaData, false);
+         if (joinpoint != null)
+            dispatchJoinPoint(context, joinpoint);
       }
       else if (trace)
          log.trace("Ignoring " + getDefaultInstallMethod() + " lifecycle invocation.");
    }
 
+   /**
+    * Invoke install lifecycle method.
+    *
+    * @param trace the log trace
+    * @param context the context
+    * @param configurator the configurator
+    * @param target the target
+    * @param info the bean info
+    * @param metaData the metadata
+    * @param unget do we do unget
+    * @return method joinpoint
+    * @throws Throwable for any error
+    */
+   protected MethodJoinpoint invokeInstallLifecycle(boolean trace, KernelControllerContext context, KernelConfigurator configurator, Object target, BeanInfo info, BeanMetaData metaData, boolean unget) throws Throwable
+   {
+      String method = getInstallMethod(context);
+      List<ParameterMetaData> parameters = getInstallParameters(context);
+      ClassLoader cl = Configurator.getClassLoader(metaData);
+      try
+      {
+         MethodJoinpoint joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true, unget);
+         joinpoint.setTarget(target);
+         return joinpoint;
+      }
+      catch (JoinpointException ignored)
+      {
+         if (trace)
+         {
+            if (parameters == null)
+               log.trace("No " + method + " method for " + context);
+            else
+               log.trace("No " + method + parameters + " method for " + context);
+         }
+         return null;
+      }
+   }
+
    protected void uninstallActionInternal(KernelControllerContext context)
    {
       boolean trace = log.isTraceEnabled();
 
+      KernelController controller = (KernelController)context.getController();
+      Kernel kernel = controller.getKernel();
+      KernelConfigurator configurator = kernel.getConfigurator();
+
+      Object target = context.getTarget();
+      BeanInfo info = context.getBeanInfo();
+      BeanMetaData metaData = context.getBeanMetaData();
+
+      if (isInstallInvocationIgnored(context) == false)
+      {
+         try
+         {
+            MethodJoinpoint joinpoint = invokeInstallLifecycle(trace, context, configurator, target, info, metaData, true);
+            joinpoint.setTarget(target);
+            cleanupJoinPoint(context, joinpoint);
+         }
+         catch (Throwable ignored)
+         {
+         }
+      }
+
       if (isUninstallInvocationIgnored(context) == false)
       {
-
-         KernelController controller = (KernelController)context.getController();
-         Kernel kernel = controller.getKernel();
-         KernelConfigurator configurator = kernel.getConfigurator();
-
-         Object target = context.getTarget();
-         BeanInfo info = context.getBeanInfo();
-         BeanMetaData metaData = context.getBeanMetaData();
          String method = getUninstallMethod(context);
          List<ParameterMetaData> parameters = getUninstallParameters(context);
          MethodJoinpoint joinpoint;
          try
          {
             ClassLoader cl = Configurator.getClassLoader(metaData);
-            joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true);
-            joinpoint.setTarget(target);
-            dispatchJoinPoint(context, joinpoint);
+            try
+            {
+               joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true, false);
+               joinpoint.setTarget(target);
+               dispatchJoinPoint(context, joinpoint);
+            }
+            finally
+            {
+               joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true, true);
+               joinpoint.setTarget(target);
+               cleanupJoinPoint(context, joinpoint);
+            }
          }
          catch (JoinpointException ignored)
          {

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/PropertyDispatchWrapper.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/PropertyDispatchWrapper.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/PropertyDispatchWrapper.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -80,8 +80,10 @@
       if (typeInfo == null)
          typeInfo = getTypeInfo();
 
+      ValueMetaData valueMetaData = property.getValue();
       if (nullify)
       {
+         Object value = valueMetaData.ungetValue(typeInfo, cl);
          if (typeInfo != null)
          {
             if (typeInfo.isPrimitive() == false)
@@ -89,9 +91,9 @@
                try
                {
                   if (propertyTypeInfo != null)
-                     beanInfo.setProperty(target, name, null);
+                     beanInfo.setProperty(target, name, value);
                   else // e.g. NestedPropertyInfo
-                     nullifyByMatchingType(propertyInfo.getUpperName(), typeInfo);
+                     nullifyByMatchingType(propertyInfo.getUpperName(), typeInfo, value);
                }
                catch (Throwable t)
                {
@@ -107,11 +109,11 @@
       }
       else
       {
-         ValueMetaData valueMetaData = property.getValue();
          Object value = valueMetaData.getValue(typeInfo, cl);
          validatePropertyValue(context, target, propertyInfo, value);
          beanInfo.setProperty(target, name, value);
       }
+
       return null;
    }
 
@@ -137,9 +139,10 @@
     *
     * @param name the property name
     * @param typeInfo the type info
+    * @param value the value to set
     * @throws Throwable for any error
     */
-   protected void nullifyByMatchingType(String name, TypeInfo typeInfo) throws Throwable
+   protected void nullifyByMatchingType(String name, TypeInfo typeInfo, Object value) throws Throwable
    {
       // TODO - remove this Character.toUpperCase once Reflect is updated
       String upperName = "set" + Character.toUpperCase(name.charAt(0));
@@ -156,7 +159,7 @@
             TypeInfo[] parameters = minfo.getParameterTypes();
             if (parameters.length == 1 && PrimitiveInfo.VOID.equals(returnType) && typeInfo.equals(parameters[0]))
             {
-               minfo.invoke(target, new Object[]{null});
+               minfo.invoke(target, new Object[]{value});
                return;
             }
          }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -23,13 +23,15 @@
 
 import java.util.List;
 
+import org.jboss.beans.metadata.spi.ParameterMetaData;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
+import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.config.KernelConfigurator;
-import org.jboss.kernel.plugins.config.Configurator;
-import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
-import org.jboss.beans.metadata.spi.ParameterMetaData;
+import org.jboss.logging.Logger;
 import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.TypeInfo;
-import org.jboss.logging.Logger;
 
 /**
  * Helper - reducing duplicated code.
@@ -44,19 +46,19 @@
     * Invoke context with params from ParameterMetaData list.
     *
     * @param configurator the configurator
-    * @param target the target
     * @param context the invoke dispatch
     * @param methodName the method name
     * @param params the parameters
+    * @param unget do we do an unget on parameters
     * @return  invocation's result
     * @throws Throwable for any exception
     */
    public static Object invoke(
          KernelConfigurator configurator,
-         Object target,
          InvokeDispatchContext context,
          String methodName,
-         List<ParameterMetaData> params) throws Throwable
+         List<ParameterMetaData> params,
+         boolean unget) throws Throwable
    {
       String[] signature;
       Object[] parameters;
@@ -67,6 +69,7 @@
       }
       else
       {
+         Object target = (context instanceof ControllerContext) ? ControllerContext.class.cast(context).getTarget() : null;
          int size = params.size();
          signature = Configurator.getParameterTypes(log.isTraceEnabled(), params);
          // TODO - is this ok for non-POJO targets?
@@ -74,13 +77,14 @@
          if (target != null)
          {
             MethodInfo methodInfo = Configurator.findMethodInfo(configurator.getClassInfo(target.getClass()), methodName, signature);
-            parameters = Configurator.getParameters(log.isTraceEnabled(), classLoader, methodInfo.getParameterTypes(), params);
+            TypeInfo[] infos = methodInfo.getParameterTypes();
+            parameters = Configurator.getParameters(log.isTraceEnabled(), classLoader, infos, params, unget);
             // add some more info, if not yet set
             for(int i = 0; i < size; i++)
             {
-               if (signature[i] == null)
+               if (signature[i] == null && infos[i] != null)
                {
-                  signature[i] = methodInfo.getParameterTypes()[i].getName();
+                  signature[i] = infos[i].getName();
                }
             }
          }
@@ -96,11 +100,15 @@
                   typeInfo = configurator.getClassInfo(signature[i], classLoader);
                }
                // typeInfo might be null, but we can still get value in some cases
-               parameters[i] = pmd.getValue().getValue(typeInfo, classLoader);
+               ValueMetaData vmd = pmd.getValue();
+               if (unget)
+                  vmd.ungetValue(typeInfo, classLoader);
+               else
+                  parameters[i] = vmd.getValue(typeInfo, classLoader);
             }
 
          }
       }
-      return context.invoke(methodName, parameters, signature);
+      return (unget == false) ? context.invoke(methodName, parameters, signature) : null;
    }
 }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/config/KernelConfigurator.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/config/KernelConfigurator.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/config/KernelConfigurator.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -43,6 +43,7 @@
  * {@link KernelConfig}.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
 public interface KernelConfigurator extends KernelObject
@@ -201,6 +202,23 @@
    Joinpoint getConstructorJoinPoint(BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object) throws Throwable;
 
    /**
+    * Get a constructor join point a bean info. This will be the constructor
+    * that is the closest match to the constructor specified by the passed in constructor
+    * metadata.
+    *
+    * Note: there is a new unget parameter, which is used to do proper cleanup on the Joinpoint
+    *
+    * @param info the bean info
+    * @param metaData the constructor metadata
+    * @param beanMetaData the bean metadata
+    * @param object an opaque object. If used with AOP this should be the {@link MetaData} for the bean.
+    * @param unget do we actually do an unget on the ctor
+    * @return the join point
+    * @throws Throwable for any error
+    */
+   Joinpoint getConstructorJoinPoint(BeanInfo info, ConstructorMetaData metaData, BeanMetaData beanMetaData, Object object, boolean unget) throws Throwable;
+
+   /**
     * Get a method joinpoint for a bean.
     * 
     * @param info the bean info
@@ -213,4 +231,19 @@
     * @throws Throwable for any error
     */
    MethodJoinpoint getMethodJoinPoint(BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic) throws Throwable;
+
+   /**
+    * Get a method joinpoint for a bean.
+    *
+    * @param info the bean info
+    * @param cl the classloader
+    * @param name the method name
+    * @param parameters the parameter metadata
+    * @param isStatic whether the method is static
+    * @param isPublic whether the method is public
+    * @param unget do we actually do an unget on the ctor
+    * @return the method join point
+    * @throws Throwable for any error
+    */
+   MethodJoinpoint getMethodJoinPoint(BeanInfo info, ClassLoader cl, String name, List<ParameterMetaData> parameters, boolean isStatic, boolean isPublic, boolean unget) throws Throwable;
 }

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/support/container/plugin/GenericComponentFactory.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/support/container/plugin/GenericComponentFactory.java	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/support/container/plugin/GenericComponentFactory.java	2009-11-17 17:23:51 UTC (rev 96463)
@@ -251,6 +251,10 @@
       {
          return bmd.getValue(info, cl);
       }
+      public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+      {
+         return bmd.ungetValue(info, cl);
+      }
       public void initialVisit(MetaDataVisitor vistor)
       {
          bmd.initialVisit(vistor);

Modified: projects/kernel/trunk/pom.xml
===================================================================
--- projects/kernel/trunk/pom.xml	2009-11-17 15:52:05 UTC (rev 96462)
+++ projects/kernel/trunk/pom.xml	2009-11-17 17:23:51 UTC (rev 96463)
@@ -42,7 +42,7 @@
     <version.jboss.vfs>2.1.3.SP1</version.jboss.vfs>
     <version.javassist>3.11.0.GA</version.javassist>
     <version.jboss.aop>2.1.0.CR3</version.jboss.aop>
-    <version.org.jboss.reflect>2.0.2.GA</version.org.jboss.reflect>
+    <version.org.jboss.reflect>2.2.0-SNAPSHOT</version.org.jboss.reflect>
     <version.org.jboss.mdr>2.0.2.GA</version.org.jboss.mdr>
     <version.org.jboss.mx>6.0.0.Beta2</version.org.jboss.mx>
     <version.org.jboss.test>1.1.1.GA</version.org.jboss.test>




More information about the jboss-cvs-commits mailing list