Logo Search packages:      
Sourcecode: aspectj version File versions  Download package

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
 */
00025 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