aboutsummaryrefslogtreecommitdiffstats
path: root/loadtime
diff options
context:
space:
mode:
authoraclement <aclement>2008-09-11 08:36:44 +0000
committeraclement <aclement>2008-09-11 08:36:44 +0000
commit4fcdec844c7c6fe8c172d3ee351654be96d67c8a (patch)
treeae92a5486dccc2f13b8572dd1a373bf1abc59909 /loadtime
parentdd88cb3cd35dc195a60cfa0ef68a6239bdd96a17 (diff)
downloadaspectj-4fcdec844c7c6fe8c172d3ee351654be96d67c8a.tar.gz
aspectj-4fcdec844c7c6fe8c172d3ee351654be96d67c8a.zip
246918: perclause:
Diffstat (limited to 'loadtime')
-rw-r--r--loadtime/src/aspectj_1_5_0.dtd1
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java253
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/definition/Definition.java182
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/definition/DocumentParser.java15
4 files changed, 236 insertions, 215 deletions
diff --git a/loadtime/src/aspectj_1_5_0.dtd b/loadtime/src/aspectj_1_5_0.dtd
index 88856f7e3..1b776242a 100644
--- a/loadtime/src/aspectj_1_5_0.dtd
+++ b/loadtime/src/aspectj_1_5_0.dtd
@@ -128,6 +128,7 @@ concrete-aspect
name CDATA #REQUIRED
extends CDATA #REQUIRED
precedence CDATA #IMPLIED
+ perclause CDATA #IMPLIED
>
<!--*****************************************************************************************************************************
pointcut
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java
index f7676f0fb..ac8730747 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java
@@ -33,6 +33,7 @@ import org.aspectj.apache.bcel.generic.Type;
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.Message;
import org.aspectj.weaver.AnnotationAJ;
+import org.aspectj.weaver.GeneratedReferenceTypeDelegate;
import org.aspectj.weaver.ReferenceType;
import org.aspectj.weaver.ResolvedMember;
import org.aspectj.weaver.ResolvedType;
@@ -48,13 +49,14 @@ import org.aspectj.weaver.patterns.PerClause;
import org.aspectj.weaver.patterns.PerSingleton;
/**
- * Generates bytecode for concrete-aspect <p/> The concrete aspect is @AspectJ
- * code generated. As it is build during aop.xml definitions registration we
- * perform the type munging for perclause ie aspectOf artifact directly, instead
- * of waiting for it to go thru the weaver (that we are in the middle of
- * configuring).
+ * Generates bytecode for concrete-aspect.
+ * <p>
+ * The concrete aspect is @AspectJ code generated. As it is build during aop.xml definitions registration we perform the type
+ * munging for perclause, ie. aspectOf() artifact directly, instead of waiting for it to go thru the weaver (that we are in the
+ * middle of configuring).
*
- * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
+ * @author Alexandre Vasseur
+ * @author Andy Clement
*/
public class ConcreteAspectCodeGen {
@@ -64,27 +66,27 @@ public class ConcreteAspectCodeGen {
/**
* Concrete aspect definition we build for
*/
- private final Definition.ConcreteAspect m_concreteAspect;
+ private final Definition.ConcreteAspect concreteAspect;
/**
* World for which we build for
*/
- private final World m_world;
+ private final World world;
/**
* Set to true when all is checks are verified
*/
- private boolean m_isValid = false;
+ private boolean isValid = false;
/**
* The parent aspect, not concretized
*/
- private ResolvedType m_parent;
+ private ResolvedType parent;
/**
* Aspect perClause, used for direct munging of aspectOf artifacts
*/
- private PerClause m_perClause;
+ private PerClause perclause;
/**
* Create a new compiler for a concrete aspect
@@ -93,8 +95,8 @@ public class ConcreteAspectCodeGen {
* @param world
*/
ConcreteAspectCodeGen(Definition.ConcreteAspect concreteAspect, World world) {
- m_concreteAspect = concreteAspect;
- m_world = world;
+ this.concreteAspect = concreteAspect;
+ this.world = world;
}
/**
@@ -103,7 +105,7 @@ public class ConcreteAspectCodeGen {
* @return true if ok, false otherwise
*/
public boolean validate() {
- if (!(m_world instanceof BcelWorld)) {
+ if (!(world instanceof BcelWorld)) {
reportError("Internal error: world must be of type BcelWorld");
return false;
}
@@ -111,62 +113,57 @@ public class ConcreteAspectCodeGen {
// name must be undefined so far
// TODO only convert the name to signature once, probably earlier than
// this
- ResolvedType current = m_world.lookupBySignature(UnresolvedType
- .forName(m_concreteAspect.name).getSignature());
+ ResolvedType current = world.lookupBySignature(UnresolvedType.forName(concreteAspect.name).getSignature());
if (current != null && !current.isMissing()) {
- reportError("Attempt to concretize but chosen aspect name already defined: "
- + stringify());
+ reportError("Attempt to concretize but chosen aspect name already defined: " + stringify());
return false;
}
// it can happen that extends is null, for precedence only declaration
- if (m_concreteAspect.extend == null
- && m_concreteAspect.precedence != null) {
- if (m_concreteAspect.pointcuts.isEmpty()) {
- m_isValid = true;
- m_perClause = new PerSingleton();
- m_parent = null;
+ if (concreteAspect.extend == null && concreteAspect.precedence != null) {
+ if (concreteAspect.pointcuts.isEmpty()) {
+ isValid = true;
+ // m_perClause = new PerSingleton();
+ parent = null;
return true;// no need to checks more in that special case
} else {
- reportError("Attempt to use nested pointcuts without extends clause: "
- + stringify());
+ reportError("Attempt to use nested pointcuts without extends clause: " + stringify());
return false;
}
}
- m_parent = m_world.resolve(m_concreteAspect.extend, true);
+ parent = world.resolve(concreteAspect.extend, true);
// handle inner classes
- if (m_parent.isMissing()) {
+ if (parent.isMissing()) {
// fallback on inner class lookup mechanism
- String fixedName = m_concreteAspect.extend;
+ String fixedName = concreteAspect.extend;
int hasDot = fixedName.lastIndexOf('.');
while (hasDot > 0) {
char[] fixedNameChars = fixedName.toCharArray();
fixedNameChars[hasDot] = '$';
fixedName = new String(fixedNameChars);
hasDot = fixedName.lastIndexOf('.');
- m_parent = m_world.resolve(UnresolvedType.forName(fixedName),
- true);
- if (!m_parent.isMissing()) {
+ parent = world.resolve(UnresolvedType.forName(fixedName), true);
+ if (!parent.isMissing()) {
break;
}
}
}
- if (m_parent.isMissing()) {
+
+ if (parent.isMissing()) {
reportError("Cannot find m_parent aspect for: " + stringify());
return false;
}
// extends must be abstract
- if (!m_parent.isAbstract()) {
- reportError("Attempt to concretize a non-abstract aspect: "
- + stringify());
+ if (!parent.isAbstract()) {
+ reportError("Attempt to concretize a non-abstract aspect: " + stringify());
return false;
}
// m_parent must be aspect
- if (!m_parent.isAspect()) {
+ if (!parent.isAspect()) {
reportError("Attempt to concretize a non aspect: " + stringify());
return false;
}
@@ -174,64 +171,66 @@ public class ConcreteAspectCodeGen {
// must have all abstractions defined
List elligibleAbstractions = new ArrayList();
- Collection abstractMethods = getOutstandingAbstractMethods(m_parent);
+ Collection abstractMethods = getOutstandingAbstractMethods(parent);
for (Iterator iter = abstractMethods.iterator(); iter.hasNext();) {
ResolvedMember method = (ResolvedMember) iter.next();
if ("()V".equals(method.getSignature())) {
String n = method.getName();
- if (n.startsWith("ajc$pointcut")) { // Allow for the abstract
- // pointcut being from a
- // code style aspect
- // compiled with
- // -1.5 (see test for 128744)
+ // Allow for the abstract pointcut being from a code style aspect compiled with -1.5 (see test for 128744)
+ if (n.startsWith("ajc$pointcut")) {
n = n.substring(14);
n = n.substring(0, n.indexOf("$"));
elligibleAbstractions.add(n);
} else if (hasPointcutAnnotation(method)) {
elligibleAbstractions.add(method.getName());
} else {
- // error, an outstanding abstract method that can't be
- // concretized in XML
- reportError("Abstract method '" + method.toString()
- + "' cannot be concretized in XML: " + stringify());
+ // error, an outstanding abstract method that can't be concretized in XML
+ reportError("Abstract method '" + method.toString() + "' cannot be concretized in XML: " + stringify());
return false;
}
} else {
- if (method.getName().startsWith("ajc$pointcut")
- || hasPointcutAnnotation(method)) {
- // it may be a pointcut but it doesn't meet the requirements
- // for XML concretization
+ if (method.getName().startsWith("ajc$pointcut") || hasPointcutAnnotation(method)) {
+ // it may be a pointcut but it doesn't meet the requirements for XML concretization
reportError("Abstract method '"
+ method.toString()
+ "' cannot be concretized as a pointcut (illegal signature, must have no arguments, must return void): "
+ stringify());
return false;
} else {
- // error, an outstanding abstract method that can't be
- // concretized in XML
- reportError("Abstract method '" + method.toString()
- + "' cannot be concretized in XML: " + stringify());
+ // error, an outstanding abstract method that can't be concretized in XML
+ reportError("Abstract method '" + method.toString() + "' cannot be concretized in XML: " + stringify());
return false;
}
}
}
List pointcutNames = new ArrayList();
- for (Iterator it = m_concreteAspect.pointcuts.iterator(); it.hasNext();) {
+ for (Iterator it = concreteAspect.pointcuts.iterator(); it.hasNext();) {
Definition.Pointcut abstractPc = (Definition.Pointcut) it.next();
pointcutNames.add(abstractPc.name);
}
for (Iterator it = elligibleAbstractions.iterator(); it.hasNext();) {
String elligiblePc = (String) it.next();
if (!pointcutNames.contains(elligiblePc)) {
- reportError("Abstract pointcut '" + elligiblePc
- + "' not configured: " + stringify());
+ reportError("Abstract pointcut '" + elligiblePc + "' not configured: " + stringify());
return false;
}
}
- m_perClause = m_parent.getPerClause();
- m_isValid = true;
- return m_isValid;
+ if (concreteAspect.perclause != null) {
+ String perclauseString = concreteAspect.perclause;
+ if (perclauseString.startsWith("persingleton")) {
+ } else if (perclauseString.startsWith("percflow")) {
+ } else if (perclauseString.startsWith("pertypewithin")) {
+ } else if (perclauseString.startsWith("perthis")) {
+ } else if (perclauseString.startsWith("pertarget")) {
+ } else if (perclauseString.startsWith("percflowbelow")) {
+ } else {
+ reportError("Unrecognized per clause specified " + stringify());
+ return false;
+ }
+ }
+ isValid = true;
+ return isValid;
}
private Collection getOutstandingAbstractMethods(ResolvedType type) {
@@ -246,15 +245,13 @@ public class ConcreteAspectCodeGen {
// We are trying to determine abstract methods left over at the bottom of a
// hierarchy that have not been
// concretized.
- private void getOutstandingAbstractMethodsHelper(ResolvedType type,
- Map collector) {
+ private void getOutstandingAbstractMethodsHelper(ResolvedType type, Map collector) {
if (type == null)
return;
// Get to the top
if (!type.equals(ResolvedType.OBJECT)) {
if (type.getSuperclass() != null)
- getOutstandingAbstractMethodsHelper(type.getSuperclass(),
- collector);
+ getOutstandingAbstractMethodsHelper(type.getSuperclass(), collector);
}
ResolvedMember[] rms = type.getDeclaredMethods();
if (rms != null) {
@@ -271,16 +268,17 @@ public class ConcreteAspectCodeGen {
}
/**
- * Rebuild the XML snip that defines this concrete aspect, for log error
- * purpose
+ * Rebuild the XML snip that defines this concrete aspect, for log error purpose
*
* @return string repr.
*/
private String stringify() {
StringBuffer sb = new StringBuffer("<concrete-aspect name='");
- sb.append(m_concreteAspect.name);
+ sb.append(concreteAspect.name);
sb.append("' extends='");
- sb.append(m_concreteAspect.extend);
+ sb.append(concreteAspect.extend);
+ sb.append("' perclause='");
+ sb.append(concreteAspect.perclause);
sb.append("'/> in aop.xml");
return sb.toString();
}
@@ -290,8 +288,7 @@ public class ConcreteAspectCodeGen {
if (as == null || as.length == 0)
return false;
for (int i = 0; i < as.length; i++) {
- if (as[i].getTypeSignature().equals(
- "Lorg/aspectj/lang/annotation/Pointcut;")) {
+ if (as[i].getTypeSignature().equals("Lorg/aspectj/lang/annotation/Pointcut;")) {
return true;
}
}
@@ -299,7 +296,7 @@ public class ConcreteAspectCodeGen {
}
public String getClassName() {
- return m_concreteAspect.name;
+ return concreteAspect.name;
}
/**
@@ -308,9 +305,32 @@ public class ConcreteAspectCodeGen {
* @return concrete aspect bytecode
*/
public byte[] getBytes() {
- if (!m_isValid) {
+ if (!isValid) {
throw new RuntimeException("Must validate first");
}
+ PerClause parentPerClause = (parent != null ? parent.getPerClause() : null);
+ if (parentPerClause == null) {
+ parentPerClause = new PerSingleton();
+ }
+ PerClause.Kind perclauseKind = PerClause.SINGLETON;
+ String perclauseString = null;
+
+ if (concreteAspect.perclause != null) {
+ perclauseString = concreteAspect.perclause;
+ if (perclauseString.startsWith("persingleton")) {
+ perclauseKind = PerClause.SINGLETON;
+ } else if (perclauseString.startsWith("percflow")) {
+ perclauseKind = PerClause.PERCFLOW;
+ } else if (perclauseString.startsWith("pertypewithin")) {
+ perclauseKind = PerClause.PERTYPEWITHIN;
+ } else if (perclauseString.startsWith("perthis")) {
+ perclauseKind = PerClause.PEROBJECT;
+ } else if (perclauseString.startsWith("pertarget")) {
+ perclauseKind = PerClause.PEROBJECT;
+ } else if (perclauseString.startsWith("percflowbelow")) {
+ perclauseKind = PerClause.PERCFLOW;
+ }
+ }
// TODO AV - abstract away from BCEL...
// @Aspect //inherit clause from m_parent
@@ -321,63 +341,55 @@ public class ConcreteAspectCodeGen {
// }
// @Aspect public class ...
- LazyClassGen cg = new LazyClassGen(m_concreteAspect.name.replace('.',
- '/'), (m_parent == null) ? "java/lang/Object" : m_parent
+ LazyClassGen cg = new LazyClassGen(concreteAspect.name.replace('.', '/'), (parent == null) ? "java/lang/Object" : parent
.getName().replace('.', '/'), null,// TODO AV - we could point
// to the aop.xml that
// defines it and use
// JSR-45
- Modifier.PUBLIC + Constants.ACC_SUPER, EMPTY_STRINGS, m_world);
- AnnotationGen ag = new AnnotationGen(new ObjectType(
- "org/aspectj/lang/annotation/Aspect"), Collections.EMPTY_LIST,
- true, cg.getConstantPool());
- cg.addAnnotation(ag);
- if (m_concreteAspect.precedence != null) {
- SimpleElementValueGen svg = new SimpleElementValueGen(
- ElementValueGen.STRING, cg.getConstantPool(),
- m_concreteAspect.precedence);
- List elems = new ArrayList();
- elems.add(new ElementNameValuePairGen("value", svg, cg
- .getConstantPool()));
- AnnotationGen agprec = new AnnotationGen(new ObjectType(
- "org/aspectj/lang/annotation/DeclarePrecedence"), elems,
+ Modifier.PUBLIC + Constants.ACC_SUPER, EMPTY_STRINGS, world);
+ if (perclauseString == null) {
+ AnnotationGen ag = new AnnotationGen(new ObjectType("org/aspectj/lang/annotation/Aspect"), Collections.EMPTY_LIST,
true, cg.getConstantPool());
+ cg.addAnnotation(ag);
+ } else {
+ // List elems = new ArrayList();
+ List elems = new ArrayList();
+ elems.add(new ElementNameValuePairGen("value", new SimpleElementValueGen(ElementValueGen.STRING, cg.getConstantPool(),
+ perclauseString), cg.getConstantPool()));
+ AnnotationGen ag = new AnnotationGen(new ObjectType("org/aspectj/lang/annotation/Aspect"), elems, true, cg
+ .getConstantPool());
+ cg.addAnnotation(ag);
+ }
+ if (concreteAspect.precedence != null) {
+ SimpleElementValueGen svg = new SimpleElementValueGen(ElementValueGen.STRING, cg.getConstantPool(),
+ concreteAspect.precedence);
+ List elems = new ArrayList();
+ elems.add(new ElementNameValuePairGen("value", svg, cg.getConstantPool()));
+ AnnotationGen agprec = new AnnotationGen(new ObjectType("org/aspectj/lang/annotation/DeclarePrecedence"), elems, true,
+ cg.getConstantPool());
cg.addAnnotation(agprec);
}
// default constructor
- LazyMethodGen init = new LazyMethodGen(Modifier.PUBLIC, Type.VOID,
- "<init>", EMPTY_TYPES, EMPTY_STRINGS, cg);
+ LazyMethodGen init = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, "<init>", EMPTY_TYPES, EMPTY_STRINGS, cg);
InstructionList cbody = init.getBody();
cbody.append(InstructionConstants.ALOAD_0);
- cbody.append(cg.getFactory().createInvoke(
- (m_parent == null) ? "java/lang/Object" : m_parent.getName()
- .replace('.', '/'), "<init>", Type.VOID, EMPTY_TYPES,
- Constants.INVOKESPECIAL));
+ cbody.append(cg.getFactory().createInvoke((parent == null) ? "java/lang/Object" : parent.getName().replace('.', '/'),
+ "<init>", Type.VOID, EMPTY_TYPES, Constants.INVOKESPECIAL));
cbody.append(InstructionConstants.RETURN);
cg.addMethodGen(init);
- for (Iterator it = m_concreteAspect.pointcuts.iterator(); it.hasNext();) {
+ for (Iterator it = concreteAspect.pointcuts.iterator(); it.hasNext();) {
Definition.Pointcut abstractPc = (Definition.Pointcut) it.next();
-
- LazyMethodGen mg = new LazyMethodGen(Modifier.PUBLIC,// TODO AV -
- // respect
- // visibility
- // instead
- // of
- // opening
- // up?
- Type.VOID, abstractPc.name, EMPTY_TYPES, EMPTY_STRINGS, cg);
- SimpleElementValueGen svg = new SimpleElementValueGen(
- ElementValueGen.STRING, cg.getConstantPool(),
+ // TODO AV - respect visibility instead of opening up as public?
+ LazyMethodGen mg = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, abstractPc.name, EMPTY_TYPES, EMPTY_STRINGS, cg);
+ SimpleElementValueGen svg = new SimpleElementValueGen(ElementValueGen.STRING, cg.getConstantPool(),
abstractPc.expression);
List elems = new ArrayList();
- elems.add(new ElementNameValuePairGen("value", svg, cg
- .getConstantPool()));
- AnnotationGen mag = new AnnotationGen(new ObjectType(
- "org/aspectj/lang/annotation/Pointcut"), elems, true, cg
+ elems.add(new ElementNameValuePairGen("value", svg, cg.getConstantPool()));
+ AnnotationGen mag = new AnnotationGen(new ObjectType("org/aspectj/lang/annotation/Pointcut"), elems, true, cg
.getConstantPool());
- AnnotationAJ max = new BcelAnnotation(mag, m_world);
+ AnnotationAJ max = new BcelAnnotation(mag, world);
mg.addAnnotation(max);
InstructionList body = mg.getBody();
@@ -387,17 +399,19 @@ public class ConcreteAspectCodeGen {
}
// handle the perClause
- ReferenceType rt = new ReferenceType(ResolvedType.forName(
- m_concreteAspect.name).getSignature(), m_world);
- BcelPerClauseAspectAdder perClauseMunger = new BcelPerClauseAspectAdder(
- rt, m_perClause.getKind());
+ ReferenceType rt = new ReferenceType(ResolvedType.forName(concreteAspect.name).getSignature(), world);
+ GeneratedReferenceTypeDelegate grtd = new GeneratedReferenceTypeDelegate(rt);
+ grtd.setSuperclass(parent);
+ rt.setDelegate(grtd);
+
+ BcelPerClauseAspectAdder perClauseMunger = new BcelPerClauseAspectAdder(rt, perclauseKind);
perClauseMunger.forceMunge(cg, false);
// TODO AV - unsafe cast
// register the fresh new class into the world repository as it does not
// exist on the classpath anywhere
- JavaClass jc = cg.getJavaClass((BcelWorld) m_world);
- ((BcelWorld) m_world).addSourceObjectType(jc);
+ JavaClass jc = cg.getJavaClass((BcelWorld) world);
+ ((BcelWorld) world).addSourceObjectType(jc);
return jc.getBytes();
}
@@ -408,7 +422,6 @@ public class ConcreteAspectCodeGen {
* @param message
*/
private void reportError(String message) {
- m_world.getMessageHandler().handleMessage(
- new Message(message, IMessage.ERROR, null, null));
+ world.getMessageHandler().handleMessage(new Message(message, IMessage.ERROR, null, null));
}
}
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/definition/Definition.java b/loadtime/src/org/aspectj/weaver/loadtime/definition/Definition.java
index 2730428d2..3b6e06a1d 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/definition/Definition.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/definition/Definition.java
@@ -16,47 +16,48 @@ import java.util.List;
/**
* A POJO that contains raw strings from the XML (sort of XMLBean for our simple LTW DTD)
- *
+ *
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class Definition {
- private StringBuffer m_weaverOptions;
+ private final StringBuffer m_weaverOptions;
+
+ private final List m_dumpPatterns;
- private List m_dumpPatterns;
- private boolean m_dumpBefore;
+ private boolean m_dumpBefore;
- private List m_includePatterns;
+ private final List m_includePatterns;
- private List m_excludePatterns;
+ private final List m_excludePatterns;
- private List m_aspectClassNames;
+ private final List m_aspectClassNames;
- private List m_aspectExcludePatterns;
+ private final List m_aspectExcludePatterns;
- private List m_aspectIncludePatterns;
+ private final List m_aspectIncludePatterns;
- private List m_concreteAspects;
+ private final List m_concreteAspects;
- public Definition() {
- m_weaverOptions = new StringBuffer();
- m_dumpBefore = false;
- m_dumpPatterns = new ArrayList(0);
- m_includePatterns = new ArrayList(0);
- m_excludePatterns = new ArrayList(0);
- m_aspectClassNames = new ArrayList();
- m_aspectExcludePatterns = new ArrayList(0);
- m_aspectIncludePatterns = new ArrayList(0);
- m_concreteAspects = new ArrayList(0);
- }
+ public Definition() {
+ m_weaverOptions = new StringBuffer();
+ m_dumpBefore = false;
+ m_dumpPatterns = new ArrayList(0);
+ m_includePatterns = new ArrayList(0);
+ m_excludePatterns = new ArrayList(0);
+ m_aspectClassNames = new ArrayList();
+ m_aspectExcludePatterns = new ArrayList(0);
+ m_aspectIncludePatterns = new ArrayList(0);
+ m_concreteAspects = new ArrayList(0);
+ }
- public String getWeaverOptions() {
- return m_weaverOptions.toString();
- }
+ public String getWeaverOptions() {
+ return m_weaverOptions.toString();
+ }
- public List getDumpPatterns() {
- return m_dumpPatterns;
- }
+ public List getDumpPatterns() {
+ return m_dumpPatterns;
+ }
public void setDumpBefore(boolean b) {
m_dumpBefore = b;
@@ -66,67 +67,70 @@ public class Definition {
return m_dumpBefore;
}
- public List getIncludePatterns() {
- return m_includePatterns;
- }
-
- public List getExcludePatterns() {
- return m_excludePatterns;
- }
-
- public List getAspectClassNames() {
- return m_aspectClassNames;
- }
-
- public List getAspectExcludePatterns() {
- return m_aspectExcludePatterns;
- }
-
- public List getAspectIncludePatterns() {
- return m_aspectIncludePatterns;
- }
-
- public List getConcreteAspects() {
- return m_concreteAspects;
- }
-
- public static class ConcreteAspect {
- public final String name;
- public final String extend;
- public final String precedence;
- public final List pointcuts;
-
- public ConcreteAspect(String name, String extend) {
- this(name, extend, null);
- }
-
- public ConcreteAspect(String name, String extend, String precedence) {
- this.name = name;
- // make sure extend set to null if ""
- if (extend == null || extend.length() == 0) {
- this.extend = null;
- if (precedence == null || precedence.length() == 0) {
- throw new RuntimeException("Not allowed");
- }
- } else {
- this.extend = extend;
- }
- this.precedence = precedence;
- this.pointcuts = new ArrayList();
- }
- }
-
- public static class Pointcut {
- public final String name;
- public final String expression;
- public Pointcut(String name, String expression) {
- this.name = name;
- this.expression = expression;
- }
- }
-
- public void appendWeaverOptions(String option) {
- m_weaverOptions.append(option.trim()).append(' ');
- }
+ public List getIncludePatterns() {
+ return m_includePatterns;
+ }
+
+ public List getExcludePatterns() {
+ return m_excludePatterns;
+ }
+
+ public List getAspectClassNames() {
+ return m_aspectClassNames;
+ }
+
+ public List getAspectExcludePatterns() {
+ return m_aspectExcludePatterns;
+ }
+
+ public List getAspectIncludePatterns() {
+ return m_aspectIncludePatterns;
+ }
+
+ public List getConcreteAspects() {
+ return m_concreteAspects;
+ }
+
+ public static class ConcreteAspect {
+ public final String name;
+ public final String extend;
+ public final String precedence;
+ public final List pointcuts;
+ public final String perclause;
+
+ public ConcreteAspect(String name, String extend) {
+ this(name, extend, null, null);
+ }
+
+ public ConcreteAspect(String name, String extend, String precedence, String perclause) {
+ this.name = name;
+ // make sure extend set to null if ""
+ if (extend == null || extend.length() == 0) {
+ this.extend = null;
+ if (precedence == null || precedence.length() == 0) {
+ throw new RuntimeException("Not allowed");
+ }
+ } else {
+ this.extend = extend;
+ }
+ this.precedence = precedence;
+ this.pointcuts = new ArrayList();
+ this.perclause = perclause;
+ }
+ }
+
+ public static class Pointcut {
+ public final String name;
+ public final String expression;
+
+ public Pointcut(String name, String expression) {
+ this.name = name;
+ this.expression = expression;
+ }
+ }
+
+ public void appendWeaverOptions(String option) {
+ m_weaverOptions.append(option.trim()).append(' ');
+ }
}
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/definition/DocumentParser.java b/loadtime/src/org/aspectj/weaver/loadtime/definition/DocumentParser.java
index 727d93501..f620e78d9 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/definition/DocumentParser.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/definition/DocumentParser.java
@@ -61,6 +61,7 @@ public class DocumentParser extends DefaultHandler {
private final static String NAME_ATTRIBUTE = "name";
private final static String EXTEND_ATTRIBUTE = "extends";
private final static String PRECEDENCE_ATTRIBUTE = "precedence";
+ private final static String PERCLAUSE_ATTRIBUTE = "perclause";
private final static String POINTCUT_ELEMENT = "pointcut";
private final static String WITHIN_ATTRIBUTE = "within";
private final static String EXPRESSION_ATTRIBUTE = "expression";
@@ -161,13 +162,15 @@ public class DocumentParser extends DefaultHandler {
String name = attributes.getValue(NAME_ATTRIBUTE);
String extend = attributes.getValue(EXTEND_ATTRIBUTE);
String precedence = attributes.getValue(PRECEDENCE_ATTRIBUTE);
+ String perclause = attributes.getValue(PERCLAUSE_ATTRIBUTE);
if (!isNull(name)) {
- if (isNull(precedence) && !isNull(extend)) {// if no precedence, then extends must be there
- m_lastConcreteAspect = new Definition.ConcreteAspect(name, extend);
- } else if (!isNull(precedence)) {
- // wether a pure precedence def, or an extendsANDprecedence def.
- m_lastConcreteAspect = new Definition.ConcreteAspect(name, extend, precedence);
- }
+ m_lastConcreteAspect = new Definition.ConcreteAspect(name, extend, precedence, perclause);
+ // if (isNull(precedence) && !isNull(extend)) {// if no precedence, then extends must be there
+ // m_lastConcreteAspect = new Definition.ConcreteAspect(name, extend);
+ // } else if (!isNull(precedence)) {
+ // // wether a pure precedence def, or an extendsANDprecedence def.
+ // m_lastConcreteAspect = new Definition.ConcreteAspect(name, extend, precedence, perclause);
+ // }
m_definition.getConcreteAspects().add(m_lastConcreteAspect);
}
} else if (POINTCUT_ELEMENT.equals(qName) && m_lastConcreteAspect != null) {