### Eclipse Workspace Patch 1.0
#P ajde.core
Index: src/org/aspectj/ajde/core/internal/AjdeCoreBuildManager.java
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/ajde.core/src/org/aspectj/ajde/core/internal/AjdeCoreBuildManager.java,v
retrieving revision 1.1
diff -u -r1.1 AjdeCoreBuildManager.java
--- src/org/aspectj/ajde/core/internal/AjdeCoreBuildManager.java 11 Jan 2007 16:04:31 -0000 1.1
+++ src/org/aspectj/ajde/core/internal/AjdeCoreBuildManager.java 26 Nov 2007 19:05:13 -0000
@@ -40,6 +40,7 @@
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.aspectj.util.ConfigParser;
import org.aspectj.util.LangUtil;
+import org.aspectj.weaver.CustomMungerFactory;
/**
* Build Manager which drives the build for a given AjCompiler.
@@ -65,6 +66,14 @@
AsmManager.attemptIncrementalModelRepairs = true;
}
+ public void setCustomMungerFactory(CustomMungerFactory factory) {
+ ajBuildManager.setCustomMungerFactory(factory);
+ }
+
+ public CustomMungerFactory getCustomMungerFactory() {
+ return ajBuildManager.getCustomMungerFactory();
+ }
+
/**
* @param buildFresh - true if want to force a full build, false otherwise
*/
Index: src/org/aspectj/ajde/core/AjCompiler.java
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/ajde.core/src/org/aspectj/ajde/core/AjCompiler.java,v
retrieving revision 1.1
diff -u -r1.1 AjCompiler.java
--- src/org/aspectj/ajde/core/AjCompiler.java 11 Jan 2007 16:04:31 -0000 1.1
+++ src/org/aspectj/ajde/core/AjCompiler.java 26 Nov 2007 19:05:13 -0000
@@ -15,6 +15,7 @@
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.Message;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.aspectj.weaver.CustomMungerFactory;
/**
* The class to be used by tools to drive a build. An AjCompiler is created
@@ -59,6 +60,14 @@
buildManager = new AjdeCoreBuildManager(this);
}
+ public void setCustomMungerFactory(CustomMungerFactory factory) {
+ buildManager.setCustomMungerFactory(factory);
+ }
+
+ public CustomMungerFactory getCustomMungerFactory() {
+ return buildManager.getCustomMungerFactory();
+ }
+
/**
* @return the id for this AjCompiler
*/
Index: .classpath
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/ajde.core/.classpath,v
retrieving revision 1.1
diff -u -r1.1 .classpath
--- .classpath 11 Jan 2007 16:04:31 -0000 1.1
+++ .classpath 26 Nov 2007 19:05:13 -0000
@@ -9,5 +9,6 @@
+
#P org.aspectj.ajdt.core
Index: src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java,v
retrieving revision 1.119
diff -u -r1.119 AjBuildManager.java
--- src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java 22 Jan 2007 16:43:20 -0000 1.119
+++ src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java 26 Nov 2007 19:05:17 -0000
@@ -84,6 +84,7 @@
import org.aspectj.org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.aspectj.tools.ajc.Main;
import org.aspectj.util.FileUtil;
+import org.aspectj.weaver.CustomMungerFactory;
import org.aspectj.weaver.Dump;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.World;
@@ -156,6 +157,7 @@
public BcelWorld getBcelWorld() { return state.getBcelWorld();}
public CountingMessageHandler handler;
+ private CustomMungerFactory customMungerFactory;
public AjBuildManager(IMessageHandler holder) {
super();
@@ -749,6 +751,15 @@
// }
// }
+ //LTODO delegate to BcelWeaver?
+ public void setCustomMungerFactory(CustomMungerFactory factory) {
+ customMungerFactory = factory;
+ }
+
+ public CustomMungerFactory getCustomMungerFactory() {
+ return customMungerFactory;
+ }
+
/** init only on initial batch compile? no file-specific options */
private void initBcelWorld(IMessageHandler handler) throws IOException {
List cp =
@@ -767,6 +778,7 @@
bcelWorld.setPinpointMode(buildConfig.isXdevPinpoint());
bcelWorld.setErrorAndWarningThreshold(buildConfig.getOptions().errorThreshold,buildConfig.getOptions().warningThreshold);
BcelWeaver bcelWeaver = new BcelWeaver(bcelWorld);
+ bcelWeaver.setCustomMungerFactory(customMungerFactory);
state.setWorld(bcelWorld);
state.setWeaver(bcelWeaver);
state.clearBinarySourceFiles();
@@ -1388,5 +1400,6 @@
public boolean wasFullBuild() {
return wasFullBuild;
}
+
}
#P weaver
Index: src/org/aspectj/weaver/World.java
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/weaver/src/org/aspectj/weaver/World.java,v
retrieving revision 1.100
diff -u -r1.100 World.java
--- src/org/aspectj/weaver/World.java 6 Nov 2006 13:53:12 -0000 1.100
+++ src/org/aspectj/weaver/World.java 26 Nov 2007 19:05:19 -0000
@@ -1042,6 +1042,25 @@
public int hardSize() {
return tMap.size();
}
+
+ public ResolvedType[] getAllTypes() {
+ List results = new ArrayList();
+
+ collectTypes(expendableMap, results);
+ collectTypes(tMap, results);
+ return results.toArray(new ResolvedType[results.size()]);
+ }
+
+ private void collectTypes(Map map, List results) {
+ for (Object key:map.keySet()) {
+ ResolvedType type = get((String)key);
+ if (type!=null)
+ results.add(type);
+ else System.err.println("null!:"+key);
+ }
+ }
+
+
}
/** Reference types we don't intend to weave may be ejected from
@@ -1250,4 +1269,9 @@
public boolean isASMAround() {
return isASMAround;
}
+
+ public ResolvedType[] getAllTypes() {
+ return typeMap.getAllTypes();
+ }
+
}
\ No newline at end of file
Index: src/org/aspectj/weaver/bcel/BcelWeaver.java
===================================================================
RCS file: /cvsroot/tools/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java,v
retrieving revision 1.99
diff -u -r1.99 BcelWeaver.java
--- src/org/aspectj/weaver/bcel/BcelWeaver.java 6 Nov 2007 15:28:58 -0000 1.99
+++ src/org/aspectj/weaver/bcel/BcelWeaver.java 26 Nov 2007 19:05:21 -0000
@@ -64,6 +64,7 @@
import org.aspectj.weaver.BCException;
import org.aspectj.weaver.ConcreteTypeMunger;
import org.aspectj.weaver.CrosscuttingMembersSet;
+import org.aspectj.weaver.CustomMungerFactory;
import org.aspectj.weaver.IClassFileProvider;
import org.aspectj.weaver.IWeaveRequestor;
import org.aspectj.weaver.IWeaver;
@@ -138,6 +139,7 @@
private List declareParentsList = null; // setup by prepareForWeave
private ZipOutputStream zipOutputStream;
+ private CustomMungerFactory customMungerFactory;
// ----
@@ -488,6 +490,8 @@
typeMungerList = xcutSet.getTypeMungers();
lateTypeMungerList = xcutSet.getLateTypeMungers();
declareParentsList = xcutSet.getDeclareParents();
+
+ addCustomMungers();
// The ordering here used to be based on a string compare on toString() for the two mungers -
// that breaks for the @AJ style where advice names aren't programmatically generated. So we
@@ -519,6 +523,31 @@
if (trace.isTraceEnabled()) trace.exit("prepareForWeave");
}
+ private void addCustomMungers() {
+ if (customMungerFactory != null) {
+ for (Iterator i = addedClasses.iterator(); i.hasNext();) {
+ UnwovenClassFile jc = (UnwovenClassFile) i.next();
+ String name = jc.getClassName();
+ ResolvedType type = world.resolve(name);
+ if (type.isAspect()) {
+ Collection shadowMungers = customMungerFactory
+ .createCustomShadowMungers(type);
+ if (shadowMungers != null) {
+ shadowMungerList.addAll(shadowMungers);
+ }
+ Collection typeMungers = customMungerFactory
+ .createCustomTypeMungers(type);
+ if (typeMungers != null)
+ typeMungerList.addAll(typeMungers);
+ }
+ }
+ }
+ }
+
+ public void setCustomMungerFactory(CustomMungerFactory factory) {
+ customMungerFactory = factory;
+ }
+
/*
* Rewrite all of the pointcuts in the world into their most efficient
* form for subsequent matching. Also ensure that if pc1.equals(pc2)
Index: src/org/aspectj/weaver/CustomMungerFactory.java
===================================================================
RCS file: src/org/aspectj/weaver/CustomMungerFactory.java
diff -N src/org/aspectj/weaver/CustomMungerFactory.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/aspectj/weaver/CustomMungerFactory.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,12 @@
+package org.aspectj.weaver;
+
+import java.util.Collection;
+
+import org.aspectj.weaver.bcel.BcelWorld;
+import org.aspectj.weaver.patterns.Declare;
+
+public interface CustomMungerFactory {
+ public Collection createCustomShadowMungers(ResolvedType aspectType);
+ public Collection createCustomTypeMungers(ResolvedType aspectType);
+// public Collection createCustomDeclares(ResolvedType aspectType);
+}