Logo Search packages:      
Sourcecode: aspectj version File versions

AdviceKind.java

/* *******************************************************************
 * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved. 
 * This program and the accompanying materials are made available 
 * under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution and is available at 
 * http://www.eclipse.org/legal/epl-v10.html 
 *  
 * Contributors: 
 *     PARC     initial implementation 
 * ******************************************************************/


package org.aspectj.weaver;

import java.io.IOException;

import org.aspectj.util.TypeSafeEnum;

/**
 * The five kinds of advice in AspectJ.
 * 
 * @author Erik Hilsdale
 * @author Jim Hugunin
 */
00026 public class AdviceKind extends TypeSafeEnum {
      private int precedence;
      private boolean isAfter;
      private boolean isCflow;
    public AdviceKind(String name, int key, int precedence, boolean isAfter, boolean isCflow) {
      super(name, key);
      this.precedence = precedence;
      this.isAfter = isAfter;
      this.isCflow = isCflow;
    }
    
    public static AdviceKind read(VersionedDataInputStream s) throws IOException {
        int key = s.readByte();
        switch(key) {
            case 1: return Before;
            case 2: return After;
            case 3: return AfterThrowing;
            case 4: return AfterReturning;
            case 5: return Around;
            case 6: return CflowEntry;
            case 7: return CflowBelowEntry;

            case 8: return InterInitializer;
            
            case 9: return PerCflowEntry;
            case 10: return PerCflowBelowEntry;
            case 11: return PerThisEntry;
            case 12: return PerTargetEntry;

            case 13: return Softener;
            
            case 14: return PerTypeWithinEntry;
        }
        throw new RuntimeException("unimplemented kind: " + key);
    }
    
    public static final AdviceKind Before         = new AdviceKind("before", 1, 0, false, false);
    public static final AdviceKind After          = new AdviceKind("after", 2, 0, true, false);
    public static final AdviceKind AfterThrowing  = new AdviceKind("afterThrowing", 3, 0, true, false);
    public static final AdviceKind AfterReturning = new AdviceKind("afterReturning", 4, 0, true, false);
    public static final AdviceKind Around         = new AdviceKind("around", 5, 0, false, false);
    
    // these kinds can't be declared, but are used by the weaver
    public static final AdviceKind CflowEntry  = new AdviceKind("cflowEntry", 6, 1, false, true);
    public static final AdviceKind CflowBelowEntry = new AdviceKind("cflowBelowEntry", 7, -1, false, true);  //XXX resolve precednece with the below
    public static final AdviceKind InterInitializer   = new AdviceKind("interInitializer", 8, -2, false, false);

    public static final AdviceKind PerCflowEntry         = new AdviceKind("perCflowEntry", 9, 1, false, true);
    public static final AdviceKind PerCflowBelowEntry         = new AdviceKind("perCflowBelowEntry", 10, -1, false, true); 

    public static final AdviceKind PerThisEntry         = new AdviceKind("perThisEntry", 11, 1, false, false);
    public static final AdviceKind PerTargetEntry         = new AdviceKind("perTargetEntry", 12, 1, false, false); 

    public static final AdviceKind Softener         = new AdviceKind("softener", 13, 1, false, false); 
    
    // PTWIMPL Advice representing when aspect should be initialized
    public static final AdviceKind PerTypeWithinEntry   = new AdviceKind("perTypeWithinEntry",14,1,false,false);
   

    public static AdviceKind stringToKind(String s) {
        if (s.equals(Before.getName())) return Before;
        if (s.equals(After.getName())) return After;
        if (s.equals(AfterThrowing.getName())) return AfterThrowing;
        if (s.equals(AfterReturning.getName())) return AfterReturning;
        if (s.equals(Around.getName())) return Around;
        throw new IllegalArgumentException("unknown kind: " + "\"" + s + "\"");
    }

      public boolean isAfter() {
            return this.isAfter;
      }
      
      public boolean isCflow() {
            return this.isCflow;
      }

      public int getPrecedence() {
            return precedence;
      }

      public boolean isPerEntry() {
            return 
                this == PerCflowEntry || this == PerCflowBelowEntry ||
                  this == PerThisEntry || this == PerTargetEntry || 
                  this == PerTypeWithinEntry; // PTWIMPL Allow for PTW case
      }
      
      public boolean isPerObjectEntry() {
            return this == PerThisEntry || this == PerTargetEntry;
      }

}

Generated by  Doxygen 1.6.0   Back to index