Example usage for org.aspectj.weaver.patterns AndPointcut AndPointcut

List of usage examples for org.aspectj.weaver.patterns AndPointcut AndPointcut

Introduction

In this page you can find the example usage for org.aspectj.weaver.patterns AndPointcut AndPointcut.

Prototype

public AndPointcut(Pointcut left, Pointcut right) 

Source Link

Usage

From source file:org.caesarj.compiler.aspectj.CaesarWrapperPatternParser.java

License:Open Source License

private CaesarPointcutWrapper parseKindedPointcut() {
    String kind = parseIdentifier();
    eat("(");//from  ww  w  . j  a v  a2 s.co m
    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);
}

From source file:org.caesarj.compiler.joinpoint.PerObjectDeploymentVisitor.java

License:Open Source License

public boolean visit(CjAdviceDeclaration adviceDec) {
    //include the old parameters
    List adviceParameters = new ArrayList();

    for (int i = 0; i < adviceDec.getParameters().length; i++) {
        adviceParameters.add(adviceDec.getParameters()[i]);
    }/*w w w  .j av  a 2 s .  com*/

    /* add additiona parameter JOINPOINT_THIS_PARAM to the advice */
    adviceDec.setExtraArgumentFlag(CaesarConstants.JoinPointThis);

    JFormalParameter extraParameter = new JFormalParameter(adviceDec.getTokenReference(),
            JFormalParameter.DES_PARAMETER, new CClassNameType(Constants.JAV_OBJECT),
            CaesarConstants.JOINPOINT_THIS_PARAM, false);
    adviceParameters.add(extraParameter);

    adviceDec.setParameters((JFormalParameter[]) adviceParameters.toArray(new JFormalParameter[0]));

    /* transform the advice poincut from a() to (a() && this(JOINPOINT_THIS_PARAM)) */
    ArrayList<NamePattern> names = new ArrayList<NamePattern>();
    names.add(new NamePattern(CaesarConstants.JOINPOINT_THIS_PARAM));

    CaesarWildTypePattern pattern = new CaesarWildTypePattern(names, false, 0);

    Pointcut origPointcut = adviceDec.getPointcut().wrappee();
    Pointcut newPointcut = new AndPointcut(origPointcut, new ThisOrTargetPointcut(true, pattern));
    adviceDec.getPointcut().replacePointcut(newPointcut);

    return false;
}