123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /* *******************************************************************
- * 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
- */
- 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;
- }
-
- @Override
- public int hashCode() {
- return ((super.hashCode()*37 + precedence)*37+(isAfter?0:1))*37 + (isCflow?0:1);
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof AdviceKind)) {
- return false;
- }
- AdviceKind ak = (AdviceKind)o;
- return super.equals(ak) &&
- ak.precedence == precedence &&
- ak.isAfter == isAfter &&
- ak.isCflow == isCflow;
- }
- }
|