[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