[jboss-cvs] JBossAS SVN: r59376 - in projects/microcontainer/trunk: aop-mc-int/src/main/org/jboss/aop/microcontainer/integration kernel/src/main/org/jboss/beans/metadata/plugins/factory kernel/src/main/org/jboss/kernel/plugins/dependency
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Jan 5 12:35:01 EST 2007
Author: kabir.khan at jboss.com
Date: 2007-01-05 12:34:51 -0500 (Fri, 05 Jan 2007)
New Revision: 59376
Modified:
projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java
projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java
projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java
projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
Log:
Fixes to get aop/mc integration working following new metadata crossover
Modified: projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java 2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java 2007-01-05 17:34:51 UTC (rev 59376)
@@ -21,7 +21,9 @@
*/
package org.jboss.aop.microcontainer.integration;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
+import java.util.List;
import org.jboss.aop.Advisor;
import org.jboss.aop.AspectManager;
@@ -32,9 +34,20 @@
import org.jboss.aop.proxy.container.ContainerCache;
import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
import org.jboss.joinpoint.plugins.BasicConstructorJoinPoint;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
+import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.spi.context.MetaDataContext;
+import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
+import org.jboss.metadata.spi.scope.CommonLevels;
+import org.jboss.metadata.spi.scope.ScopeKey;
+import org.jboss.metadata.spi.signature.MethodSignature;
import org.jboss.metadata.spi.stack.MetaDataStack;
+import org.jboss.reflect.spi.ClassInfo;
import org.jboss.reflect.spi.ConstructorInfo;
+import org.jboss.reflect.spi.MethodInfo;
import org.jboss.reflect.spi.TypeInfo;
/**
@@ -46,10 +59,13 @@
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision$
*/
-public class AOPConstructorJoinpoint extends BasicConstructorJoinPoint
+public class AOPConstructorJoinpoint extends BasicConstructorJoinPoint implements KernelControllerContextAware
{
+ private final static String[] EMPTY_PARAM_ARRAY = new String[0];
+
AOPProxyFactory proxyFactory = new GeneratedAOPProxyFactory();
+ KernelControllerContext context;
/**
* Create a new AOPConstructorJoinpoint.
*
@@ -60,6 +76,17 @@
super(constructorInfo);
}
+ public void setKernelControllerContext(KernelControllerContext context) throws Exception
+ {
+ this.context = context;
+ }
+
+ public void unsetKernelControllerContext(KernelControllerContext context) throws Exception
+ {
+ this.context = null;
+ }
+
+
public Object dispatch() throws Throwable
{
Class clazz = constructorInfo.getDeclaringClass().getType();
@@ -72,15 +99,15 @@
MetaDataStack.mask();
try
{
- MetaData md = getNonEmptyMetaData(metaData);
- ContainerCache cache = ContainerCache.initialise(manager, clazz, md);
+ boolean hasInstanceMetaData = hasInstanceOrJoinpointMetaData(metaData);
+ ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, hasInstanceMetaData);
AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
Object target = createTarget(cache, params);
-
params.setProxiedClass(target.getClass());
- params.setMetaData(md);
+ params.setMetaData(metaData);
params.setTarget(target);
params.setContainerCache(cache);
+ params.setMetaDataHasInstanceLevelData(hasInstanceMetaData);
return proxyFactory.createAdvisedProxy(params);
}
@@ -90,21 +117,99 @@
}
}
- private MetaData getNonEmptyMetaData(MetaData metaData)
+ private boolean hasInstanceOrJoinpointMetaData(MetaData metaData)
{
if (metaData == null)
{
- return null;
+ return false;
}
+
+ MetaDataRetrieval retrieval = null;
+ if (context != null)
+ {
+ //TODO We might need the context injected somehow by the GenericBeanFactory, since that is used for creating the aspect instances...
+ Kernel kernel = context.getKernel();
+ KernelMetaDataRepository repository = kernel.getMetaDataRepository();
+ retrieval = repository.getMetaDataRetrieval(context);
+
+ if (retrieval instanceof MetaDataContext)
+ {
+ ScopeKey instanceKey = new ScopeKey(CommonLevels.INSTANCE, (String)context.getName());
+
+ List<MetaDataRetrieval> retrievals =((MetaDataContext)retrieval).getLocalRetrievals();
+ for (MetaDataRetrieval ret : retrievals)
+ {
+ ScopeKey key = ret.getScope();
+ if (instanceKey.equals(key))
+ {
+ Annotation[] anns = ret.retrieveAnnotations().getValue();
+ if (anns != MetaData.NO_ANNOTATIONS)
+ {
+ return true;
+ }
+ }
+ }
+ }
+
+ //Check for method annotations
+ if (hasMethodMetaData(metaData))
+ {
+ return true;
+ }
+ }
- if (metaData.getAnnotations() != MetaData.NO_ANNOTATIONS)
+ return false;
+ }
+
+ private boolean hasMethodMetaData(MetaData metaData)
+ {
+ //Check for method annotations
+ ClassInfo info = constructorInfo.getDeclaringClass();
+ while (info != null)
{
- return metaData;
+ MethodInfo[] methods = info.getDeclaredMethods();
+ if (methods != null)
+ {
+ for (MethodInfo mi : methods)
+ {
+ if (methodHasAnnotations(metaData, mi))
+ {
+ return true;
+ }
+ }
+ }
+ info = info.getSuperclass();
}
- return null;
+ return false;
}
+ private boolean methodHasAnnotations(MetaData metaData, MethodInfo mi)
+ {
+ TypeInfo[] types = mi.getParameterTypes();
+ String[] typeStrings = null;
+
+ if (types.length == 0)
+ {
+ typeStrings = EMPTY_PARAM_ARRAY;
+ }
+ else
+ {
+ typeStrings = new String[types.length];
+ for (int j = 0 ; j < types.length ; j++)
+ {
+ typeStrings[j] = types[j].getName();
+ }
+ }
+ MethodSignature sig = new MethodSignature(mi.getName(), typeStrings);
+ MetaData methodMD = metaData.getComponentMetaData(sig);
+ if (methodMD != null)
+ {
+ return methodMD.getAnnotations() != MetaData.NO_ANNOTATIONS;
+ }
+ return false;
+ }
+
private Object createTarget(ContainerCache cache, AOPProxyFactoryParameters params) throws Throwable
{
Advisor advisor = cache.getAdvisor();
Modified: projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java 2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java 2007-01-05 17:34:51 UTC (rev 59376)
@@ -91,7 +91,7 @@
Advisor advisor;
synchronized (ContainerCache.mapLock)
{
- ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData);
+ ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, true);
advisor = cache.getAdvisor();
}
Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java 2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java 2007-01-05 17:34:51 UTC (rev 59376)
@@ -31,12 +31,15 @@
import org.jboss.beans.metadata.spi.LifecycleMetaData;
import org.jboss.beans.metadata.spi.ParameterMetaData;
import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.joinpoint.spi.Joinpoint;
import org.jboss.joinpoint.spi.JoinpointException;
import org.jboss.joinpoint.spi.MethodJoinpoint;
import org.jboss.joinpoint.spi.TargettedJoinpoint;
import org.jboss.kernel.plugins.config.Configurator;
import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
/**
* Collection metadata.
Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java 2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java 2007-01-05 17:34:51 UTC (rev 59376)
@@ -85,6 +85,9 @@
{
if( cl != null && access == null )
Thread.currentThread().setContextClassLoader(cl);
+ if (joinpoint instanceof KernelControllerContextAware)
+ ((KernelControllerContextAware)joinpoint).setKernelControllerContext(context);
+
if (access == null)
{
return joinpoint.dispatch();
@@ -106,6 +109,8 @@
{
if( cl != null && access == null )
Thread.currentThread().setContextClassLoader(tcl);
+ if (joinpoint instanceof KernelControllerContextAware)
+ ((KernelControllerContextAware)joinpoint).unsetKernelControllerContext(null);
}
}
finally
More information about the jboss-cvs-commits
mailing list