[jboss-cvs] JBossAS SVN: r68507 - in projects/aop/trunk/aop/src/main/org/jboss/aop: instrument and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Dec 21 07:11:10 EST 2007
Author: flavia.rainone at jboss.com
Date: 2007-12-21 07:11:10 -0500 (Fri, 21 Dec 2007)
New Revision: 68507
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java
projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java
Log:
[JBAOP-487] Joinpoint infos are now unique for constructor, construction and field access joinpoints.
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -128,9 +128,9 @@
/** Read/Write lock to be used when lazy creating the collections */
protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
- protected HashSet adviceBindings = new HashSet();
+ protected Set<AdviceBinding> adviceBindings = new HashSet<AdviceBinding>();
protected volatile ArrayList interfaceIntroductions = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
- protected volatile ArrayList classMetaDataBindings = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
+ protected volatile ArrayList<ClassMetaDataBinding> classMetaDataBindings = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
protected SimpleMetaData defaultMetaData = new SimpleMetaData();
protected MethodMetaData methodMetaData = new MethodMetaData();
protected FieldMetaData fieldMetaData = new FieldMetaData();
@@ -866,7 +866,7 @@
}
- protected void createInterceptorChain(InterceptorFactory[] factories, ArrayList newinterceptors, Joinpoint joinpoint)
+ protected void createInterceptorChain(InterceptorFactory[] factories, ArrayList<Interceptor> newinterceptors, Joinpoint joinpoint)
{
for (int i = 0; i < factories.length; i++)
{
@@ -986,14 +986,14 @@
return name.substring(lastIndex + 1);
}
- protected ArrayList initializeConstructorChain()
+ protected ConstructorInfo[] initializeConstructorChain()
{
if (clazz != null && constructors == null)
{
constructors = clazz.getDeclaredConstructors();
}
- ArrayList newInfos = new ArrayList(constructors.length);
+ ConstructorInfo[] newInfos = new ConstructorInfo[constructors.length];
for (int i = 0; i < constructors.length; i++)
{
final ConstructorInfo info = new ConstructorInfo();
@@ -1003,9 +1003,9 @@
{
final String name = ConstructorExecutionTransformer.constructorFactory(getSimpleName(clazz));
final Class[] types = constructors[i].getParameterTypes();
- Method method = (Method) AccessController.doPrivileged(new PrivilegedExceptionAction()
+ Method method = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>()
{
- public Object run() throws Exception
+ public Method run() throws Exception
{
return clazz.getDeclaredMethod(name, types);
}
@@ -1020,18 +1020,18 @@
}
info.setAdvisor(this);
- newInfos.add(info);
+ newInfos[i] = info;
try
{
final String name = ConstructorExecutionTransformer.getConstructorInfoFieldName(getSimpleName(clazz), i);
- AccessController.doPrivileged(new PrivilegedExceptionAction()
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
{
public Object run() throws Exception
{
Field infoField = clazz.getDeclaredField(name);
infoField.setAccessible(true);
- infoField.set(null, new WeakReference(info));
+ infoField.set(null, new WeakReference<ConstructorInfo>(info));
return null;
}
});
@@ -1047,22 +1047,22 @@
return newInfos;
}
- protected ArrayList initializeConstructionChain()
+ protected ConstructionInfo[] initializeConstructionChain()
{
- ArrayList newInfos = new ArrayList(constructors.length);
+ ConstructionInfo[] newInfos = new ConstructionInfo[constructors.length];
for (int i = 0; i < constructors.length; i++)
{
ConstructionInfo info = new ConstructionInfo();
info.setConstructor(constructors[i]);
info.setIndex(i);
info.setAdvisor(this);
- newInfos.add(info);
+ newInfos[i] = info;
try
{
Field infoField = clazz.getDeclaredField(ConstructionTransformer.getConstructionInfoFieldName(getSimpleName(clazz), i));
infoField.setAccessible(true);
- infoField.set(null, new WeakReference(info));
+ infoField.set(null, new WeakReference<ConstructionInfo>(info));
}
catch (NoSuchFieldException e)
{
@@ -1077,37 +1077,37 @@
return newInfos;
}
- protected void finalizeConstructorChain(ArrayList newConstructorInfos)
+ protected void finalizeChain(JoinPointInfo[] infos)
{
- for (int i = 0; i < newConstructorInfos.size(); i++)
+ for (int i = 0; i < infos.length; i++)
{
- ConstructorInfo info = (ConstructorInfo) newConstructorInfos.get(i);
- ArrayList list = info.getInterceptorChain();
+ JoinPointInfo info = infos[i];
+ ArrayList<Interceptor> list = info.getInterceptorChain();
Interceptor[] interceptors = null;
if (list.size() > 0)
{
- interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+ interceptors = applyPrecedence(list.toArray(new Interceptor[list.size()]));
}
info.setInterceptors(interceptors);
}
}
- protected void finalizeConstructionChain(ArrayList newConstructionInfos)
- {
- for (int i = 0; i < newConstructionInfos.size(); i++)
- {
- ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
- ArrayList list = info.getInterceptorChain();
- Interceptor[] interceptors = null;
- if (list.size() > 0)
- {
- interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
- }
- info.setInterceptors(interceptors);
- }
- }
+// protected void finalizeConstructionChain(ArrayList newConstructionInfos)
+// {
+// for (int i = 0; i < newConstructionInfos.size(); i++)
+// {
+// ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
+// ArrayList list = info.getInterceptorChain();
+// Interceptor[] interceptors = null;
+// if (list.size() > 0)
+// {
+// interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+// }
+// info.setInterceptors(interceptors);
+// }
+// }
- protected void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+ protected void resolveConstructorPointcut(AdviceBinding binding)
{
for (int i = 0; i < constructors.length; i++)
{
@@ -1117,19 +1117,18 @@
if (AspectManager.verbose) System.err.println("[debug] constructor matched binding: " + constructor);
adviceBindings.add(binding);
binding.addAdvisor(this);
- ConstructorInfo info = (ConstructorInfo)newConstructorInfos.get(i);
- pointcutResolved(info, binding, new ConstructorJoinpoint(constructor));
+ pointcutResolved(constructorInfos[i], binding, new ConstructorJoinpoint(constructor));
}
}
}
- protected void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+ protected void resolveConstructionPointcut(AdviceBinding binding)
{
- if (newConstructionInfos.size() > 0)
+ if (constructionInfos.length > 0)
{
- for (Iterator it = newConstructionInfos.iterator() ; it.hasNext() ; )
+ for (int i = 0; i < constructionInfos.length ;i++)
{
- ConstructionInfo info = (ConstructionInfo)it.next();
+ ConstructionInfo info = constructionInfos[i];
Constructor constructor = info.getConstructor();
if (binding.getPointcut().matchesConstruction(this, constructor))
{
@@ -1158,10 +1157,10 @@
*/
protected void pointcutResolved(JoinPointInfo info, AdviceBinding binding, Joinpoint joinpoint)
{
- ArrayList curr = info.getInterceptorChain();
+ ArrayList<Interceptor> curr = info.getInterceptorChain();
if (binding.getCFlow() != null)
{
- ArrayList cflowChain = new ArrayList();
+ ArrayList<Interceptor> cflowChain = new ArrayList<Interceptor>();
createInterceptorChain(binding.getInterceptorFactories(), cflowChain, joinpoint);
Interceptor[] cflowInterceptors = (Interceptor[]) cflowChain.toArray(new Interceptor[cflowChain.size()]);
curr.add(new CFlowInterceptor(binding.getCFlowString(), binding.getCFlow(), cflowInterceptors));
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -114,10 +114,10 @@
// Used by instrumentor to access separate interceptor chains for read and write access
/** @deprecated Use fieldReadInfos instead*/
private Interceptor[][] fieldReadInterceptors;
- private FieldInfo[] fieldReadInfos;
+ protected FieldInfo[] fieldReadInfos;
/** @deprecated Use fieldWriteInfos instead */
private Interceptor[][] fieldWriteInterceptors;
- private FieldInfo[] fieldWriteInfos;
+ protected FieldInfo[] fieldWriteInfos;
protected Field[] advisedFields;
@@ -270,7 +270,7 @@
final AspectManager theManager = manager;
//register class loader: necessary when clazz was precompiled through aopc
manager.registerClassLoader(clazz.getClassLoader());
- AccessController.doPrivileged(new PrivilegedExceptionAction()
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
{
public Object run() throws Exception
{
@@ -428,11 +428,11 @@
doesHaveAspects = adviceBindings.size() > 0;
}
- protected void resolveFieldPointcut(ArrayList newFieldInfos, AdviceBinding binding, boolean write)
+ protected void resolveFieldPointcut(FieldInfo[] newFieldInfos, AdviceBinding binding, boolean write)
{
- for (int i = 0; i < advisedFields.length; i++)
+ for (int i = 0; i < newFieldInfos.length; i++)
{
- Field field = advisedFields[i];
+ Field field = newFieldInfos[i].getField();
if ((!write && binding.getPointcut().matchesGet(this, field))
|| (write && binding.getPointcut().matchesSet(this, field)))
@@ -440,8 +440,7 @@
if (AspectManager.verbose) System.err.println("[debug] field matched " + ((write) ? "write" : "read") + " binding: " + field);
adviceBindings.add(binding);
binding.addAdvisor(this);
- FieldInfo info = (FieldInfo)newFieldInfos.get(i);
- pointcutResolved(info, binding, new FieldJoinpoint(field));
+ pointcutResolved(newFieldInfos[i], binding, new FieldJoinpoint(field));
}
}
}
@@ -480,9 +479,9 @@
return newInterceptors;
}
- protected ArrayList initializeFieldReadChain()
+ protected FieldInfo[] initializeFieldReadChain()
{
- ArrayList chain = new ArrayList(advisedFields.length);
+ FieldInfo[] chain = new FieldInfo[advisedFields.length];
for (int i = 0; i < advisedFields.length; i++)
{
FieldInfo info = new FieldInfo();
@@ -501,13 +500,13 @@
//Just means not advised
}
- chain.add(info);
+ chain[i] = info;
try
{
Field infoField = clazz.getDeclaredField(FieldAccessTransformer.getFieldReadInfoFieldName(advisedFields[i].getName()));
infoField.setAccessible(true);
- infoField.set(null, new WeakReference(info));
+ infoField.set(null, new WeakReference<FieldInfo>(info));
}
catch (NoSuchFieldException e)
{
@@ -517,14 +516,13 @@
{
throw new RuntimeException(e);
}
-
}
return chain;
}
- protected ArrayList initializeFieldWriteChain()
+ protected FieldInfo[] initializeFieldWriteChain()
{
- ArrayList chain = new ArrayList(advisedFields.length);
+ FieldInfo[] chain = new FieldInfo[advisedFields.length];
for (int i = 0; i < advisedFields.length; i++)
{
FieldInfo info = new FieldInfo();
@@ -543,13 +541,13 @@
//Just means not advised
}
- chain.add(info);
+ chain[i] = info;
try
{
Field infoField = clazz.getDeclaredField(FieldAccessTransformer.getFieldWriteInfoFieldName(advisedFields[i].getName()));
infoField.setAccessible(true);
- infoField.set(null, new WeakReference(info));
+ infoField.set(null, new WeakReference<FieldInfo>(info));
}
catch (NoSuchFieldException e)
{
@@ -564,44 +562,83 @@
return chain;
}
- protected void finalizeFieldReadChain(ArrayList newFieldInfos)
+// protected void finalizeChain(JoinPointInfo[] infos)
+// {
+// for (int i = 0; i < infos.length; i++)
+// {
+// JoinPointInfo info = infos[i];
+// ArrayList<Interceptor> list = info.getInterceptorChain();
+// Interceptor[] interceptors = null;
+// if (list.size() > 0)
+// {
+// interceptors = applyPrecedence(list.toArray(new Interceptor[list.size()]));
+// }
+// info.setInterceptors(interceptors);
+// }
+// }
+
+ protected void createInterceptorChains() throws Exception
{
- for (int i = 0; i < newFieldInfos.size(); i++)
+ if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("Creating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
+ MethodInterceptors newMethodInfos = initializeMethodChain();
+ // TODO flavia remove this
+ boolean buildFieldConsChain = true;
+ if (fieldReadInfos == null)
{
- FieldInfo info = (FieldInfo)newFieldInfos.get(i);
- ArrayList list = info.getInterceptorChain();
- Interceptor[] interceptors = null;
- if (list.size() > 0)
+ buildFieldConsChain = false;
+ this.fieldReadInfos = initializeFieldReadChain();
+ this.fieldWriteInfos = initializeFieldWriteChain();
+ }
+
+ this.constructorInfos = initializeConstructorChain();
+ this.constructionInfos = initializeConstructionChain();
+
+ synchronized (manager.getBindings())
+ {
+ Iterator it = manager.getBindings().values().iterator();
+ while (it.hasNext())
{
- interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+ AdviceBinding binding = (AdviceBinding) it.next();
+ if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName() + " " + binding.getPointcut().getExpr());
+ resolveMethodPointcut(newMethodInfos, binding);
+ resolveFieldPointcut(fieldReadInfos, binding, false);
+ resolveFieldPointcut(fieldWriteInfos, binding, true);
+ resolveConstructorPointcut(binding);
+ resolveConstructionPointcut(binding);
}
- info.setInterceptors(interceptors);
}
+
+ finalizeChains(newMethodInfos);
+ populateInterceptorsFromInfos();
+
+ doesHaveAspects = adviceBindings.size() > 0;
+ // Notify observer about this change
+ if (this.interceptorChainObserver != null)
+ {
+ this.interceptorChainObserver.interceptorChainsUpdated(fieldReadInterceptors, fieldWriteInterceptors,
+ constructorInterceptors, methodInterceptors);
+ }
}
-
- protected void finalizeFieldWriteChain(ArrayList newFieldInfos)
+
+ private void resetChain(JoinPointInfo[] infos)
{
- for (int i = 0; i < newFieldInfos.size(); i++)
+ for (int i = 0; i < infos.length; i++)
{
- FieldInfo info = (FieldInfo)newFieldInfos.get(i);
- ArrayList list = info.getInterceptorChain();
- Interceptor[] interceptors = null;
- if (list.size() > 0)
- {
- interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
- }
- info.setInterceptors(interceptors);
+ infos[i].getInterceptorChain().clear();
}
}
-
- protected void createInterceptorChains() throws Exception
+
+ protected void updateInterceptorChains() throws Exception
{
- if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("Creating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
+ if (AspectManager.verbose && logger.isDebugEnabled())
+ {
+ logger.debug("Updating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
+ }
MethodInterceptors newMethodInfos = initializeMethodChain();
- ArrayList newFieldReadInfos = initializeFieldReadChain();
- ArrayList newFieldWriteInfos = initializeFieldWriteChain();
- ArrayList newConstructorInfos = initializeConstructorChain();
- ArrayList newConstructionInfos = initializeConstructionChain();
+ resetChain(fieldReadInfos);
+ resetChain(fieldWriteInfos);
+ resetChain(constructorInfos);
+ resetChain(constructionInfos);
synchronized (manager.getBindings())
{
@@ -611,14 +648,14 @@
AdviceBinding binding = (AdviceBinding) it.next();
if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName() + " " + binding.getPointcut().getExpr());
resolveMethodPointcut(newMethodInfos, binding);
- resolveFieldPointcut(newFieldReadInfos, binding, false);
- resolveFieldPointcut(newFieldWriteInfos, binding, true);
- resolveConstructorPointcut(newConstructorInfos, binding);
- resolveConstructionPointcut(newConstructionInfos, binding);
+ resolveFieldPointcut(fieldReadInfos, binding, false);
+ resolveFieldPointcut(fieldWriteInfos, binding, true);
+ resolveConstructorPointcut(binding);
+ resolveConstructionPointcut(binding);
}
}
- finalizeChains(newMethodInfos, newFieldReadInfos, newFieldWriteInfos, newConstructorInfos, newConstructionInfos);
+ finalizeChains(newMethodInfos);
populateInterceptorsFromInfos();
doesHaveAspects = adviceBindings.size() > 0;
@@ -630,17 +667,13 @@
}
}
- protected void finalizeChains(MethodInterceptors newMethodInfos, ArrayList newFieldReadInfos, ArrayList newFieldWriteInfos, ArrayList newConstructorInfos, ArrayList newConstructionInfos)
+ protected void finalizeChains(MethodInterceptors newMethodInfos)
{
finalizeMethodChain(newMethodInfos);
- finalizeFieldReadChain(newFieldReadInfos);
- finalizeFieldWriteChain(newFieldWriteInfos);
- finalizeConstructorChain(newConstructorInfos);
- finalizeConstructionChain(newConstructionInfos);
- fieldReadInfos = (FieldInfo[]) newFieldReadInfos.toArray(new FieldInfo[newFieldReadInfos.size()]);
- fieldWriteInfos = (FieldInfo[]) newFieldWriteInfos.toArray(new FieldInfo[newFieldWriteInfos.size()]);
- constructorInfos = (ConstructorInfo[]) newConstructorInfos.toArray(new ConstructorInfo[newConstructorInfos.size()]);
- constructionInfos = (ConstructionInfo[]) newConstructionInfos.toArray(new ConstructionInfo[newConstructionInfos.size()]);
+ finalizeChain(fieldReadInfos);
+ finalizeChain(fieldWriteInfos);
+ finalizeChain(constructorInfos);
+ finalizeChain(constructionInfos);
}
private MethodByConInfo initializeConstructorCallerInterceptorsMap(Class callingClass, int callingIndex, String calledClass, long calledMethodHash, Method calledMethod) throws Exception
@@ -861,11 +894,22 @@
try
{
adviceBindings.clear();
- createInterceptorChains();
+ if (this.constructionInfos == null)
+ {
+ createInterceptorChains();
+ }
+ else
+ {
+ updateInterceptorChains();
+ }
rebuildCallerInterceptors();
}
catch (Exception ex)
{
+ if (ex instanceof RuntimeException)
+ {
+ throw (RuntimeException) ex;
+ }
throw new RuntimeException(ex);
}
}
@@ -1959,7 +2003,7 @@
{
try
{
- AccessController.doPrivileged(new PrivilegedExceptionAction()
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
{
public Object run()
{
@@ -1973,7 +2017,7 @@
Exception ex = e.getException();
if (ex instanceof RuntimeException)
{
- throw (RuntimeException)ex;
+ throw (RuntimeException) ex;
}
throw new RuntimeException(ex);
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -21,12 +21,10 @@
*/
package org.jboss.aop;
-import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -83,7 +81,7 @@
protected Field[] advisedFields;
- private void populateFieldTable(ArrayList fields, final Class superclass)
+ private void populateFieldTable(ArrayList<Field> fields, final Class superclass)
{
if (superclass == null) return;
if (superclass.equals(Object.class)) return;
@@ -92,10 +90,10 @@
// if (!isAdvised(superclass)) return;
- ArrayList temp = new ArrayList();
- Field[] declaredFields = (Field[]) AccessController.doPrivileged(new PrivilegedAction()
+ ArrayList<Field> temp = new ArrayList<Field>();
+ Field[] declaredFields = AccessController.doPrivileged(new PrivilegedAction<Field[]>()
{
- public Object run()
+ public Field[] run()
{
return superclass.getDeclaredFields();
}
@@ -116,12 +114,10 @@
*/
protected void createFieldTable()
{
- ArrayList fields = new ArrayList();
-
+ ArrayList<Field> fields = new ArrayList<Field>();
populateFieldTable(fields, clazz);
+ advisedFields = fields.toArray(new Field[fields.size()]);
- advisedFields = (Field[]) fields.toArray(new Field[fields.size()]);
-
}
protected void rebuildInterceptors()
@@ -246,7 +242,7 @@
protected void createInterceptorChains()
{
MethodInterceptors newMethodInfos = initializeMethodChain();
- ArrayList newConstructorInfos = initializeConstructorChain();
+ constructorInfos = initializeConstructorChain();
LinkedHashMap bindings = manager.getBindings();
synchronized (bindings)
@@ -259,16 +255,12 @@
AdviceBinding binding = (AdviceBinding) it.next();
if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName());
resolveMethodPointcut(newMethodInfos, binding);
- resolveConstructorPointcut(newConstructorInfos, binding);
+ resolveConstructorPointcut(binding);
}
}
}
- finalizeConstructorChain(newConstructorInfos);
+ finalizeChain(constructorInfos);
finalizeMethodChain(newMethodInfos);
- constructorInfos = new ConstructorInfo[newConstructorInfos.size()];
- if (constructorInfos.length > 0)
- constructorInfos = (ConstructorInfo[]) newConstructorInfos.toArray(constructorInfos);
-
populateInterceptorsFromInfos();
doesHaveAspects = adviceBindings.size() > 0;
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -26,6 +26,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -35,9 +36,9 @@
import org.jboss.aop.advice.AdviceBinding;
import org.jboss.aop.advice.AspectDefinition;
import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
+import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.advice.InterceptorFactory;
import org.jboss.aop.advice.PrecedenceSorter;
-import org.jboss.aop.advice.annotation.JoinPoint;
import org.jboss.aop.instrument.ConByConJoinPointGenerator;
import org.jboss.aop.instrument.ConByMethodJoinPointGenerator;
import org.jboss.aop.instrument.ConstructionJoinPointGenerator;
@@ -69,10 +70,11 @@
public static final String GET_PARENT_ADVISOR = "getParentAdvisor";
MethodInterceptors methodInfos = new MethodInterceptors(this);
- ArrayList constructorInfos = new ArrayList();
- ArrayList constructionInfos = new ArrayList();
- ArrayList fieldReadInfos = new ArrayList();
- ArrayList fieldWriteInfos = new ArrayList();
+// TODO Flavia
+// ArrayList<ConstructorInfo> constructorInfos = new ArrayList();
+// ArrayList<ConstructionInfo> constructionInfos = new ArrayList();
+// ArrayList<FieldInfo> fieldReadInfos = new ArrayList();
+// ArrayList<FieldInfo> fieldWriteInfos = new ArrayList();
/** Super class methods that have been overrridden - these need special handling in this weaving mode */
ArrayList overriddenMethods = new ArrayList();
@@ -84,9 +86,9 @@
//Needs its own map to avoid crashing with the constructor generators
private volatile ConcurrentHashMap constructionJoinPointGenerators = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
- ConcurrentHashMap oldInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
- ConcurrentHashMap oldFieldReadInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
- ConcurrentHashMap oldConstructionInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+ ConcurrentHashMap<Joinpoint, Interceptor[]> oldInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+ ConcurrentHashMap<Joinpoint, Interceptor[]> oldFieldReadInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+ ConcurrentHashMap<Joinpoint, Interceptor[]> oldConstructionInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
boolean initialisedSuperClasses;
@@ -169,14 +171,15 @@
{
FieldInfo copy = (FieldInfo)info.copy();
copy.setAdvisor(this);
- if (copy.isRead())
- {
- addFieldReadInfo(copy);
- }
- else
- {
- addFieldWriteInfo(copy);
- }
+// TODO Flavia
+// if (copy.isRead())
+// {
+// addFieldReadInfo(copy);
+// }
+// else
+// {
+// addFieldWriteInfo(copy);
+// }
return copy;
}
@@ -287,11 +290,10 @@
super.resolveMethodPointcut(newMethodInterceptors, binding);
handleOverriddenMethods(binding);
}
-
}
@Override
- protected void resolveFieldPointcut(ArrayList newFieldInfos, AdviceBinding binding, boolean write)
+ protected void resolveFieldPointcut(FieldInfo[] newFieldInfos, AdviceBinding binding, boolean write)
{
GeneratedClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
if (classAdvisor == null)
@@ -302,15 +304,15 @@
}
@Override
- protected void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+ protected void resolveConstructorPointcut( AdviceBinding binding)
{
- advisorStrategy.resolveConstructorPointcut(newConstructorInfos, binding);
+ advisorStrategy.resolveConstructorPointcut(binding);
}
@Override
- protected void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+ protected void resolveConstructionPointcut(AdviceBinding binding)
{
- advisorStrategy.resolveConstructionPointcut(newConstructionInfos, binding);
+ advisorStrategy.resolveConstructionPointcut(binding);
}
/**
@@ -369,14 +371,14 @@
/**
* Generated class advisor sub class will override
*/
- protected void initialiseConstructors()
+ protected void initialiseConstructors(Collection<ConstructorInfo> constructorInfos)
{
}
/**
* Called by initialiseConstructors() in generated advisor sub classes
*/
- protected void addConstructorInfo(ConstructorInfo ci)
+ protected void addConstructorInfo(ConstructorInfo ci, Collection<ConstructorInfo> constructorInfos)
{
constructorInfos.add(ci);
//If we do dynamic invokes the constructor will need to be accessible via reflection
@@ -386,84 +388,111 @@
@Override
protected void createInterceptorChains() throws Exception
{
+ System.out.println("Creating interceptor chains on advisor " + this.getClass().getName());
advisorStrategy.createInterceptorChains();
}
- @Override
- protected ArrayList initializeConstructorChain()
- {
- if (super.initialized)
- {
- for (Iterator it = constructorInfos.iterator() ; it.hasNext() ; )
- {
- ((ConstructorInfo)it.next()).clear();
- }
- }
- return constructorInfos;
- }
+// TODO Flavia
+// @Override
+// protected ArrayList initializeConstructorChain()
+// {
+// if (super.initialized)
+// {
+// for (Iterator it = constructorInfos.iterator() ; it.hasNext() ; )
+// {
+// ((ConstructorInfo)it.next()).clear();
+// }
+// }
+// return constructorInfos;
+// }
/**
* Generated class advisor sub class will override
*/
- protected void initialiseConstructions()
+ protected void initialiseConstructions(Collection<ConstructionInfo> constructorInfos)
{
}
/**
* Called by initialiseConstructions() in generated advisor sub classes
*/
- protected void addConstructionInfo(ConstructionInfo ci)
+ protected void addConstructionInfo(ConstructionInfo ci, Collection<ConstructionInfo> constructionInfos)
{
constructionInfos.add(ci);
}
- @Override
- protected ArrayList initializeConstructionChain()
- {
- if (super.initialized)
- {
- for (Iterator it = constructionInfos.iterator() ; it.hasNext() ; )
- {
- ((ConstructionInfo)it.next()).clear();
- }
- }
- return constructionInfos;
- }
+// TODO Flavia
+// @Override
+// protected ArrayList initializeConstructionChain()
+// {
+// if (super.initialized)
+// {
+// for (Iterator it = constructionInfos.iterator() ; it.hasNext() ; )
+// {
+// ((ConstructionInfo)it.next()).clear();
+// }
+// }
+// return constructionInfos;
+// }
/**
* Generated class advisor sub class will override
*/
- protected void initialiseFieldReads()
+ protected void initialiseFieldReads(Collection<FieldInfo> fieldReadInfos)
{
}
/**
* Called by initialiseFieldReads() in generated advisor sub classes
*/
- protected void addFieldReadInfo(FieldInfo fi)
+ protected void addFieldReadInfo(FieldInfo fi, Collection<FieldInfo> fieldReadInfos)
{
fieldReadInfos.add(fi);
//If we do dynamic invokes the field will need to be accessible via reflection
advisorStrategy.makeAccessibleField(fi);
}
+ // TODO Flavia remove this once the process is complete
@Override
- protected ArrayList initializeFieldReadChain()
+ protected ConstructorInfo[] initializeConstructorChain()
{
+ // TODO remove this
+ if (this.constructorInfos != null)
+ {
+ return this.constructorInfos;
+ }
+ return super.initializeConstructorChain();
+ }
+
+ // TODO remove this once the process is complete
+ @Override
+ protected ConstructionInfo[] initializeConstructionChain()
+ {
+ // TODO remove this
+ if (this.constructionInfos != null)
+ {
+ return this.constructionInfos;
+ }
+ return super.initializeConstructionChain();
+ }
+
+ @Override
+ protected FieldInfo[] initializeFieldReadChain()
+ {
return mergeFieldInfos(fieldReadInfos, true);
}
/**
* Generated class advisor sub class will override
*/
- protected void initialiseFieldWrites()
+ protected void initialiseFieldWrites(Collection<FieldInfo> fieldWriteInfos)
{
}
/**
* Called by initialiseFieldWrites() in generated advisor sub classes
*/
- protected void addFieldWriteInfo(FieldInfo fi)
+ protected void addFieldWriteInfo(FieldInfo fi, Collection<FieldInfo> fieldWriteInfos)
{
fieldWriteInfos.add(fi);
//If we do dynamic invokes the field will need to be accessible via reflection
@@ -471,7 +500,7 @@
}
@Override
- protected ArrayList initializeFieldWriteChain()
+ protected FieldInfo[] initializeFieldWriteChain()
{
return mergeFieldInfos(fieldWriteInfos, false);
}
@@ -479,42 +508,31 @@
/* Creates a full list of field infos for all fields, using the ones added by
* generated advisor for advised fields.
*/
- private ArrayList mergeFieldInfos(ArrayList advisedInfos, boolean read)
+ private FieldInfo[] mergeFieldInfos(FieldInfo[] advisedInfos, boolean read)
{
- ArrayList newInfos = new ArrayList(advisedFields.length);
+ FieldInfo[] newInfos = new FieldInfo[advisedFields.length];
- FieldInfo nextFieldInfo = null;
- Iterator it = advisedInfos.iterator();
- if (it.hasNext())
- {
- nextFieldInfo = (FieldInfo)it.next();
- }
+ int nextIndex = 0;
+ int advisedInfosLength = advisedInfos == null? 0: advisedInfos.length;
for (int i = 0 ; i < advisedFields.length ; i++)
{
- if (nextFieldInfo != null && nextFieldInfo.getIndex() == i)
+ if (nextIndex < advisedInfosLength && advisedInfos[nextIndex].getIndex() == i)
{
if (super.initialized)
{
- nextFieldInfo.clear();
+ advisedInfos[nextIndex].clear();
}
- newInfos.add(nextFieldInfo);
- if (it.hasNext())
- {
- nextFieldInfo = (FieldInfo)it.next();
- }
- else
- {
- nextFieldInfo = null;
- }
+ newInfos[i] = advisedInfos[nextIndex];
+ nextIndex++;
}
else
{
FieldInfo info = new FieldInfo(this, read);
info.setAdvisedField(advisedFields[i]);
info.setIndex(i);
- newInfos.add(info);
+ newInfos[i] = info;
}
}
@@ -522,7 +540,7 @@
}
@Override
- protected void finalizeChains(MethodInterceptors newMethodInfos, ArrayList newFieldReadInfos, ArrayList newFieldWriteInfos, ArrayList newConstructorInfos, ArrayList newConstructionInfos)
+ protected void finalizeChains(MethodInterceptors newMethodInfos)
{
ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
if (classAdvisor != null)
@@ -540,7 +558,12 @@
}
}
}
- super.finalizeChains(newMethodInfos, newFieldReadInfos, newFieldWriteInfos, newConstructorInfos, newConstructionInfos);
+
+ finalizeMethodChain(newMethodInfos);
+ finalizeFieldReadChain();
+ finalizeFieldWriteChain();
+ advisorStrategy.finalizeConstructorChain(constructorInfos);
+ advisorStrategy.finalizeConstructionChain(constructionInfos);
}
@Override
@@ -608,82 +631,65 @@
}
}
}
-
- @Override
- protected void finalizeFieldReadChain(ArrayList newFieldInfos)
+
+ private void finalizeFieldReadChain()
{
ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
if (classAdvisor != null)
{
//We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
- easyFinalizeFieldChainForInstance(oldFieldReadInfos, classAdvisor.getFieldReadInfos(), newFieldInfos, OldInfoMaps.FIELD_READ_INFOS);
+ easyFinalizeFieldChainForInstance(oldFieldReadInfos, classAdvisor.getFieldReadInfos(), fieldReadInfos, OldInfoMaps.FIELD_READ_INFOS);
}
else
{
//We are either the class advisor or an instanceadvisor with own data so we need to do all the work
- fullWorkFinalizeFieldChain(oldFieldReadInfos, newFieldInfos, OldInfoMaps.FIELD_READ_INFOS);
+ fullWorkFinalizeFieldChain(oldFieldReadInfos, fieldReadInfos, OldInfoMaps.FIELD_READ_INFOS);
}
}
- @Override
- protected void finalizeFieldWriteChain(ArrayList newFieldInfos)
+ protected void finalizeFieldWriteChain()
{
ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
if (classAdvisor != null)
{
//We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
- easyFinalizeFieldChainForInstance(oldInfos, classAdvisor.getFieldWriteInfos(), newFieldInfos, OldInfoMaps.INFOS);
+ easyFinalizeFieldChainForInstance(oldInfos, classAdvisor.getFieldWriteInfos(), fieldWriteInfos, OldInfoMaps.INFOS);
}
else
{
//We are either the class advisor or an instanceadvisor with own data so we need to do all the work
- fullWorkFinalizeFieldChain(oldInfos, newFieldInfos, OldInfoMaps.INFOS);
+ fullWorkFinalizeFieldChain(oldInfos, fieldWriteInfos, OldInfoMaps.INFOS);
}
}
- private void easyFinalizeFieldChainForInstance(Map oldFieldInfos, FieldInfo[] classFieldInfos, ArrayList newFieldInfos, OldInfoMaps oldInfoMapInstance)
+ private void easyFinalizeFieldChainForInstance(Map<Joinpoint, Interceptor[]> oldFieldInfos, FieldInfo[] classFieldInfos, FieldInfo[] newFieldInfos, OldInfoMaps oldInfoMapInstance)
{
//We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
- if (newFieldInfos.size() > 0)
+ for (int i = 0; i < newFieldInfos.length; i++)
{
- for (int i = 0; i < newFieldInfos.size(); i++)
+ FieldInfo myInfo = (FieldInfo) newFieldInfos[i];
+ myInfo.cloneChains(classFieldInfos[i]);
+
+ if (updateOldInfo(oldFieldInfos, myInfo, oldInfoMapInstance))
{
- FieldInfo myInfo = (FieldInfo)newFieldInfos.get(i);
- myInfo.cloneChains(classFieldInfos[i]);
-
- if (updateOldInfo(oldFieldInfos, myInfo, oldInfoMapInstance))
- {
- FieldJoinPointGenerator generator = getJoinPointGenerator(myInfo);
- generator.rebindJoinpoint(myInfo);
- }
+ FieldJoinPointGenerator generator = getJoinPointGenerator(myInfo);
+ generator.rebindJoinpoint(myInfo);
}
}
}
- private void fullWorkFinalizeFieldChain(Map oldFieldInfos, ArrayList newFieldInfos, OldInfoMaps oldInfoMapInstance)
+ private void fullWorkFinalizeFieldChain(Map<Joinpoint, Interceptor[]> oldFieldInfos, FieldInfo[] newFieldInfos, OldInfoMaps oldInfoMapInstance)
{
//We are either the class advisor or an instanceadvisor with own data so we need to do all the work
- for (int i = 0; i < newFieldInfos.size(); i++)
+ for (int i = 0; i < newFieldInfos.length; i++)
{
- FieldInfo info = (FieldInfo)newFieldInfos.get(i);
+ FieldInfo info = (FieldInfo)newFieldInfos[i];
FieldJoinPointGenerator generator = getJoinPointGenerator(info);
finalizeChainAndRebindJoinPoint(oldFieldInfos, info, generator, oldInfoMapInstance);
}
}
-
- @Override
- protected void finalizeConstructorChain(ArrayList newConstructorInfos)
- {
- advisorStrategy.finalizeConstructorChain(newConstructorInfos);
- }
@Override
- protected void finalizeConstructionChain(ArrayList newConstructionInfos)
- {
- advisorStrategy.finalizeConstructionChain(newConstructionInfos);
- }
-
- @Override
protected void finalizeMethodCalledByMethodInterceptorChain(MethodByMethodInfo info)
{
MethodByMethodJoinPointGenerator generator = getJoinPointGenerator(info);
@@ -829,9 +835,9 @@
}
}
- private void finalizeChainAndRebindJoinPoint(Map oldInfos, JoinPointInfo info, JoinPointGenerator generator, OldInfoMaps oldInfoMapInstance)
+ private void finalizeChainAndRebindJoinPoint(Map<Joinpoint, Interceptor[]> oldInfos, JoinPointInfo info, JoinPointGenerator generator, OldInfoMaps oldInfoMapInstance)
{
- ArrayList list = info.getInterceptorChain();
+ ArrayList<Interceptor> list = info.getInterceptorChain();
GeneratedAdvisorInterceptor[] factories = null;
if (list.size() > 0)
{
@@ -978,18 +984,18 @@
/**
* Caches the old info and checks if the chains have been updated
*/
- private boolean updateOldInfo(Map oldInfos, JoinPointInfo newInfo, OldInfoMaps oldInfoMapInstance)
+ private boolean updateOldInfo(Map<Joinpoint, Interceptor[]> oldInfos, JoinPointInfo newInfo, OldInfoMaps oldInfoMapInstance)
{
- JoinPointInfo oldInfo = (JoinPointInfo)oldInfos.get(newInfo.getJoinpoint());
- if (oldInfo != null)
+ Interceptor[] oldChain = oldInfos.get(newInfo.getJoinpoint());
+ if (oldChain != null)
{
//We are not changing any of the bindings
- if (oldInfo.equalChains(newInfo))
+ if (newInfo.equalChains(oldChain))
{
return false;
}
}
- oldInfo = newInfo.copy();
+ Interceptor[] currentOldChain = newInfo.getInterceptors();
if (oldInfoMapInstance == OldInfoMaps.INFOS)
{
@@ -1007,8 +1013,14 @@
{
throw new RuntimeException("Unrecognised map");
}
-
- oldInfos.put(newInfo.getJoinpoint(), oldInfo);
+ if (currentOldChain != null)
+ {
+ oldInfos.put(newInfo.getJoinpoint(), currentOldChain);
+ }
+ else if (oldChain != null)
+ {
+ oldInfos.remove(newInfo.getJoinpoint());
+ }
return true;
}
@@ -1135,7 +1147,7 @@
}
}
- protected ConcurrentHashMap initOldInfosMap()
+ protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldInfosMap()
{
if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
@@ -1144,7 +1156,7 @@
{
if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
- oldInfos = new ConcurrentHashMap();
+ oldInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
}
}
finally
@@ -1155,7 +1167,7 @@
return oldInfos;
}
- protected ConcurrentHashMap initOldFieldReadInfosMap()
+ protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldFieldReadInfosMap()
{
if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
@@ -1164,7 +1176,7 @@
{
if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
- oldFieldReadInfos = new ConcurrentHashMap();
+ oldFieldReadInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
}
}
finally
@@ -1175,7 +1187,7 @@
return oldFieldReadInfos;
}
- protected ConcurrentHashMap initOldConstructionInfosMap()
+ protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldConstructionInfosMap()
{
if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
@@ -1184,7 +1196,7 @@
{
if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
{
- oldConstructionInfos = new ConcurrentHashMap();
+ oldConstructionInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
}
}
finally
@@ -1220,10 +1232,10 @@
Set getPerInstanceAspectDefinitions();
Map getPerInstanceJoinpointAspectDefinitions();
void rebuildInterceptors();
- void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding);
- void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding);
- void finalizeConstructorChain(ArrayList newConstructorInfos);
- void finalizeConstructionChain(ArrayList newConstructionInfos);
+ void resolveConstructorPointcut(AdviceBinding binding);
+ void resolveConstructionPointcut(AdviceBinding binding);
+ void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos);
+ void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos);
void makeAccessibleField(FieldInfo fi);
void makeAccessibleMethod(MethodInfo mi);
}
@@ -1235,10 +1247,22 @@
public void initialise(Class clazz, AspectManager manager)
{
initialiseMethods();
- initialiseConstructors();
- initialiseConstructions();
- initialiseFieldReads();
- initialiseFieldWrites();
+ // initialise constructor info array
+ Collection<ConstructorInfo> constructorInfoCol = new ArrayList<ConstructorInfo>();
+ initialiseConstructors(constructorInfoCol);
+ constructorInfos = constructorInfoCol.toArray(new ConstructorInfo[constructorInfoCol.size()]);
+ // initialise construction info array
+ Collection<ConstructionInfo> constructionInfoCol = new ArrayList<ConstructionInfo>();
+ initialiseConstructions(constructionInfoCol);
+ constructionInfos = constructionInfoCol.toArray(new ConstructionInfo[constructionInfoCol.size()]);
+ // initalise field read info array
+ Collection<FieldInfo> fieldReadInfoCol = new ArrayList<FieldInfo>();
+ initialiseFieldReads(fieldReadInfoCol);
+ fieldReadInfos = fieldReadInfoCol.toArray(new FieldInfo[fieldReadInfoCol.size()]);
+ // initalise field write info array
+ Collection<FieldInfo> fieldWriteInfoCol = new ArrayList<FieldInfo>();
+ initialiseFieldWrites(fieldWriteInfoCol);
+ fieldWriteInfos = fieldWriteInfoCol.toArray(new FieldInfo[fieldWriteInfoCol.size()]);
GeneratedClassAdvisor.super.setManager(manager);
@@ -1495,31 +1519,34 @@
GeneratedClassAdvisor.super.rebuildInterceptors();
}
- public void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+ public void resolveConstructorPointcut(AdviceBinding binding)
{
- GeneratedClassAdvisor.super.resolveConstructorPointcut(newConstructorInfos, binding);
+ GeneratedClassAdvisor.super.resolveConstructorPointcut(binding);
}
- public void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+ public void resolveConstructionPointcut(AdviceBinding binding)
{
- GeneratedClassAdvisor.super.resolveConstructionPointcut(newConstructionInfos, binding);
+ GeneratedClassAdvisor.super.resolveConstructionPointcut(binding);
}
- public void finalizeConstructorChain(ArrayList newConstructorInfos)
+ public void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos)
{
- for (int i = 0; i < newConstructorInfos.size(); i++)
+ for (int i = 0; i < newConstructorInfos.length; i++)
{
- ConstructorInfo info = (ConstructorInfo) newConstructorInfos.get(i);
+ ConstructorInfo info = newConstructorInfos[i];
ConstructorJoinPointGenerator generator = getJoinPointGenerator(info);
+ Class clazz = info.getClazz();
+ if (clazz != null)
+ System.out.println("Finalizing constructor chain for constructor of class " + clazz.getName());
finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
}
}
- public void finalizeConstructionChain(ArrayList newConstructionInfos)
+ public void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos)
{
- for (int i = 0; i < newConstructionInfos.size(); i++)
+ for (int i = 0; i < newConstructionInfos.length; i++)
{
- ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
+ ConstructionInfo info = newConstructionInfos[i];
ConstructionJoinPointGenerator generator = getJoinPointGenerator(info);
finalizeChainAndRebindJoinPoint(oldConstructionInfos, info, generator, OldInfoMaps.CONSTRUCTION_INFOS);
}
@@ -1701,26 +1728,45 @@
}
else
{
- GeneratedClassAdvisor.super.rebuildInterceptors();
+ // check if it is initilized
+ if (GeneratedClassAdvisor.this.fieldReadInfos == null)
+ {
+ try
+ {
+ GeneratedClassAdvisor.this.createInterceptorChains();
+ }
+ catch (Exception ex)
+ {
+ if (ex instanceof RuntimeException)
+ {
+ throw (RuntimeException) ex;
+ }
+ throw new RuntimeException(ex);
+ }
+ }
+ else
+ {
+ GeneratedClassAdvisor.super.rebuildInterceptors();
+ }
}
}
- public void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+ public void resolveConstructorPointcut(AdviceBinding binding)
{
//Since the instance already exists it makes no sense to have bindings for constructors
}
- public void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+ public void resolveConstructionPointcut(AdviceBinding binding)
{
//Since the instance already exists it makes no sense to have bindings for constructors
}
- public void finalizeConstructorChain(ArrayList newConstructorInfos)
+ public void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos)
{
//Since the instance already exists it makes no sense to have bindings for constructors
}
- public void finalizeConstructionChain(ArrayList newConstructionInfos)
+ public void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos)
{
//Since the instance already exists it makes no sense to have bindings for constructors
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -23,6 +23,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Collection;
import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
import org.jboss.aop.advice.Interceptor;
@@ -33,25 +34,25 @@
{
private Interceptor[] interceptors;
- private ArrayList interceptorChain = new ArrayList();
+ private ArrayList<Interceptor> interceptorChain = new ArrayList<Interceptor>();
- private WeakReference advisor;
+ private WeakReference<Advisor> advisor;
protected volatile Joinpoint joinpoint;
- protected WeakReference clazz;
+ protected WeakReference<Class> clazz;
private String adviceString;
protected JoinPointInfo()
{
- this.clazz = new WeakReference(null);
+ this.clazz = new WeakReference<Class>(null);
}
protected JoinPointInfo(Advisor advisor, Class clazz)
{
setAdvisor(advisor);
- this.clazz = new WeakReference(clazz);
+ this.clazz = new WeakReference<Class>(clazz);
}
/*
@@ -86,12 +87,12 @@
public Class getClazz()
{
- return (Class)clazz.get();
+ return clazz.get();
}
public void setAdvisor(Advisor advisor)
{
- this.advisor = new WeakReference(advisor);
+ this.advisor = new WeakReference<Advisor>(advisor);
}
public boolean hasAdvices()
@@ -99,15 +100,15 @@
return (interceptors != null && interceptors.length > 0);
}
- public boolean equalChains(JoinPointInfo other)
+ public boolean equalChains(Interceptor[] otherInterceptors)
{
- if (this.interceptors == null && other.interceptors == null) return true;
- if (!(this.interceptors != null && other.interceptors != null))return false;
- if (this.interceptors.length != other.interceptors.length) return false;
+ if (this.interceptors == null && otherInterceptors == null) return true;
+ if (!(this.interceptors != null && otherInterceptors != null))return false;
+ if (this.interceptors.length != otherInterceptors.length) return false;
for (int i = 0 ; i < this.interceptors.length ; i++)
{
- if(!this.interceptors[i].equals(other.interceptors[i])) return false;
+ if(!this.interceptors[i].equals(otherInterceptors[i])) return false;
}
return true;
@@ -122,7 +123,7 @@
return joinpoint;
}
- public ArrayList getInterceptorChain() {
+ public ArrayList<Interceptor> getInterceptorChain() {
return interceptorChain;
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -232,46 +232,54 @@
genadvisor);
genadvisor.addMethod(initialiseMethods);
+ CtMethod superInitialiseConstructors =
+ genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_CONSTRUCTORS);
CtMethod initialiseConstructors = CtNewMethod.make(
Modifier.PROTECTED,
CtClass.voidType,
INITIALISE_CONSTRUCTORS,
- EMPTY_SIG,
+ superInitialiseConstructors.getParameterTypes(),
EMPTY_EXCEPTIONS,
null,
genadvisor);
genadvisor.addMethod(initialiseConstructors);
+ CtMethod superInitialiseConstructions =
+ genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_CONSTRUCTIONS);
CtMethod initialiseConstructions = CtNewMethod.make(
Modifier.PROTECTED,
CtClass.voidType,
INITIALISE_CONSTRUCTIONS,
- EMPTY_SIG,
+ superInitialiseConstructions.getParameterTypes(),
EMPTY_EXCEPTIONS,
(isBaseClass(clazz)) ?
- null : "{super." + INITIALISE_CONSTRUCTIONS + "();}",
+ null : "{super." + INITIALISE_CONSTRUCTIONS + "($1);}",
genadvisor);
genadvisor.addMethod(initialiseConstructions);
+ CtMethod superInitialiseFieldReads =
+ genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_FIELD_READS);
CtMethod initialiseFieldReads = CtNewMethod.make(
Modifier.PROTECTED,
CtClass.voidType,
INITIALISE_FIELD_READS,
- EMPTY_SIG,
+ superInitialiseFieldReads.getParameterTypes(),
EMPTY_EXCEPTIONS,
(isBaseClass(clazz)) ?
- null : "{super." + INITIALISE_FIELD_READS + "();}",
+ null : "{super." + INITIALISE_FIELD_READS + "($1);}",
genadvisor);
genadvisor.addMethod(initialiseFieldReads);
+ CtMethod superInitialiseFieldWrites =
+ genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_FIELD_WRITES);
CtMethod initialiseFieldWrites = CtNewMethod.make(
Modifier.PROTECTED,
CtClass.voidType,
INITIALISE_FIELD_WRITES,
- EMPTY_SIG,
+ superInitialiseFieldWrites.getParameterTypes(),
EMPTY_EXCEPTIONS,
(isBaseClass(clazz)) ?
- null : "{super." + INITIALISE_FIELD_WRITES + "();}",
+ null : "{super." + INITIALISE_FIELD_WRITES + "($1);}",
genadvisor);
genadvisor.addMethod(initialiseFieldWrites);
@@ -631,7 +639,8 @@
StringBuffer advicesUpdatedCode = new StringBuffer();
StringBuffer initialiseInfosForInstanceCode = new StringBuffer();
-
+ initialiseInfosForInstanceCode.append("java.util.Collection fieldReadCol = new java.util.ArrayList();");
+ initialiseInfosForInstanceCode.append("java.util.Collection fieldWriteCol = new java.util.ArrayList();");
while (true)
{
CtField[] fields = superAdvisor.getDeclaredFields();
@@ -662,6 +671,13 @@
String code = infoName + " = super.copyInfoFromClassAdvisor(((" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "())." + infoName + ");";
initialiseInfosForInstanceCode.append(code);
}
+ if (infoClassName.equals(FieldInfo.class.getName()))
+ {
+ initialiseInfosForInstanceCode.append("if (").append(infoName).append(".isRead()){");
+ initialiseInfosForInstanceCode.append("fieldReadCol.add(").append(infoName).append(");");
+ initialiseInfosForInstanceCode.append("} else { fieldWriteCol.add(");
+ initialiseInfosForInstanceCode.append(infoName).append(");}");
+ }
}
if (isBaseClass(superClass))
@@ -673,7 +689,8 @@
superClass = superClass.getSuperclass();
superAdvisor = superAdvisor.getSuperclass();
}
-
+ initialiseInfosForInstanceCode.append("fieldReadInfos = (org.jboss.aop.FieldInfo[]) fieldReadCol.toArray(new org.jboss.aop.FieldInfo[fieldReadCol.size()]);");
+ initialiseInfosForInstanceCode.append("fieldWriteInfos = (org.jboss.aop.FieldInfo[]) fieldWriteCol.toArray(new org.jboss.aop.FieldInfo[fieldWriteCol.size()]);");
if (initialiseInfosForInstanceCode.length() > 0)
{
initialiseInfosForInstanceCode.insert(0, genadvisor.getName() + " classAdvisor = (" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "();");
@@ -750,7 +767,7 @@
index + ", " +
"\"" + fieldName + "\", " +
wrapperHash + "L, this, true);" +
- GeneratedClassAdvisor.ADD_FIELD_READ_INFO + "(" + infoName + ");";
+ GeneratedClassAdvisor.ADD_FIELD_READ_INFO + "(" + infoName + ", $1);";
addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_READS);
}
@@ -764,7 +781,7 @@
index + ", " +
"\"" + fieldName + "\", " +
wrapperHash + "L, this, false);" +
- GeneratedClassAdvisor.ADD_FIELD_WRITE_INFO + "(" + infoName + ");";
+ GeneratedClassAdvisor.ADD_FIELD_WRITE_INFO + "(" + infoName + ", $1);";
addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_WRITES);
}
@@ -778,7 +795,7 @@
index + ", " +
wrapperHash + "L, " +
constructorHash + "L, this);" +
- GeneratedClassAdvisor.ADD_CONSTRUCTOR_INFO + "(" + infoName + ");";
+ GeneratedClassAdvisor.ADD_CONSTRUCTOR_INFO + "(" + infoName + ", $1);";
addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTORS);
}
@@ -791,7 +808,7 @@
"java.lang.Class.forName(\"" + clazz.getName() + "\")," +
index + ", " +
constructorHash + "L, this);" +
- GeneratedClassAdvisor.ADD_CONSTRUCTION_INFO + "(" + infoName + ");";
+ GeneratedClassAdvisor.ADD_CONSTRUCTION_INFO + "(" + infoName + ", $1);";
addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTIONS);
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -22,6 +22,7 @@
package org.jboss.aop.util;
import java.lang.reflect.Constructor;
+import java.util.Comparator;
/**
@@ -31,13 +32,13 @@
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
* @version $Revision$
*/
-public class ConstructorComparator implements java.util.Comparator
+public class ConstructorComparator implements Comparator<Constructor>
{
private ConstructorComparator() {}
- public static final java.util.Comparator INSTANCE = new ConstructorComparator();
+ public static final java.util.Comparator<Constructor> INSTANCE = new ConstructorComparator();
- private int compare(Constructor m1, Constructor m2) {
+ public int compare(Constructor m1, Constructor m2) {
try {
Class[] args1 = m1.getParameterTypes();
Class[] args2 = m2.getParameterTypes();
@@ -55,8 +56,4 @@
// unreachable.
throw new Error();
}
-
- public int compare(Object o1, Object o2) {
- return compare((Constructor) o1, (Constructor) o2);
- }
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java 2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java 2007-12-21 12:11:10 UTC (rev 68507)
@@ -22,6 +22,7 @@
package org.jboss.aop.util;
import java.lang.reflect.Field;
+import java.util.Comparator;
/**
* Compares Fields. This is used to make sure the field IDs line up between
@@ -30,18 +31,13 @@
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
* @version $Revision$
*/
-public class FieldComparator implements java.util.Comparator {
+public class FieldComparator implements Comparator<Field> {
private FieldComparator() {}
- public static final java.util.Comparator INSTANCE = new FieldComparator();
+ public static final Comparator<Field> INSTANCE = new FieldComparator();
- private int compare(Field m1, Field m2) {
+ public int compare(Field m1, Field m2) {
return m1.getName().compareTo(m2.getName());
}
-
- public int compare(Object o1, Object o2) {
- return compare((Field) o1, (Field) o2);
- }
-
}
More information about the jboss-cvs-commits
mailing list