List of usage examples for org.aspectj.weaver.patterns NotPointcut NotPointcut
public NotPointcut(Pointcut pointcut, int startPos)
From source file:org.caesarj.compiler.aspectj.CaesarWrapperPatternParser.java
License:Open Source License
private CaesarPointcutWrapper parseKindedPointcut() { String kind = parseIdentifier(); eat("(");//www . ja v a 2s . c om SignaturePattern sig; Shadow.Kind shadowKind = null; if (kind.equals("execution")) { sig = parseMethodOrConstructorSignaturePattern(); if (sig.getKind() == Member.METHOD) { shadowKind = Shadow.MethodExecution; } else if (sig.getKind() == Member.CONSTRUCTOR) { shadowKind = Shadow.ConstructorExecution; } } else if (kind.equals("call")) { sig = parseMethodOrConstructorSignaturePattern(); if (sig.getKind() == Member.METHOD) { shadowKind = Shadow.MethodCall; } else if (sig.getKind() == Member.CONSTRUCTOR) { shadowKind = Shadow.ConstructorCall; } } else if (kind.equals("get")) { sig = parseFieldSignaturePattern(); shadowKind = Shadow.FieldGet; } else if (kind.equals("set")) { sig = parseFieldSignaturePattern(); shadowKind = Shadow.FieldSet; } else { throw new ParserException("bad kind: " + kind, tokenSource.peek()); } eat(")"); // Creates the wrapper if (Shadow.MethodCall.equals(shadowKind) || Shadow.MethodExecution.equals(shadowKind)) { // Method call and execution are wrapped in an "and pointcut" to avoid getting constructors CaesarKindedPointcut p = new CaesarKindedPointcut(shadowKind, sig); registerPointcut(new CaesarPointcutWrapper(p)); Pointcut andPointcut = new AndPointcut(p, new NotPointcut(new CaesarKindedPointcut(shadowKind, this.createConstructorSignature()), tokenSource.peek().getStart())); return new CaesarPointcutWrapper(andPointcut); } else if (Shadow.ConstructorCall.equals(shadowKind) || Shadow.ConstructorExecution.equals(shadowKind)) { Shadow.Kind cclassShadowKind = null; // Transform the constructor call/execution to a method call/execution, // using $constructor and the same parameters if (Shadow.ConstructorCall.equals(shadowKind)) { cclassShadowKind = Shadow.MethodCall; } else { cclassShadowKind = Shadow.MethodExecution; } CaesarCloner c = CaesarCloner.instance(); SignaturePattern cclassSig = new SignaturePattern(Member.METHOD, sig.getModifiers(), createCaesarObjectPattern(), c.clone(sig.getDeclaringType()), new NamePattern("$constructor"), c.clone(sig.getParameterTypes()), c.clone(sig.getThrowsPattern())); CaesarKindedPointcut regular = new CaesarKindedPointcut(shadowKind, sig); CaesarKindedPointcut cclass = new CaesarKindedPointcut(cclassShadowKind, cclassSig); registerPointcut(new CaesarPointcutWrapper(regular)); registerPointcut(new CaesarPointcutWrapper(cclass)); // Creates an orPointcut for both the regular java and cclass constructors Pointcut orPointcut = new OrPointcut(regular, cclass); return new CaesarPointcutWrapper(orPointcut); } if (Shadow.FieldGet.equals(shadowKind) || Shadow.FieldSet.equals(shadowKind)) { // Creates the wrapper and register it CaesarKindedPointcut p = new CaesarKindedPointcut(shadowKind, sig); CaesarPointcutWrapper wrapper = new CaesarPointcutWrapper(p); registerPointcut(wrapper); // Append something like || get(public * Classname_Impl_Mixin_*.field) TypePattern mixinType = createMixinType(sig.getDeclaringType()); SignaturePattern mixinSignature = createMixinSignature(sig, mixinType); CaesarKindedPointcut mixin = new CaesarKindedPointcut(shadowKind, mixinSignature); // Register the mixin wrapper = new CaesarPointcutWrapper(mixin, sig.getDeclaringType()); wrapper.setDeclaringType(mixinType); registerPointcut(wrapper); // Creates an orPointcut for both the type and the mixin Pointcut orPointcut = new OrPointcut(p, mixin); return new CaesarPointcutWrapper(orPointcut); } CaesarKindedPointcut p = new CaesarKindedPointcut(shadowKind, sig); return new CaesarPointcutWrapper(p); }