org.aspectj.weaver.patterns.PerClause Maven / Gradle / Ivy
/* *******************************************************************
* 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.patterns;
import java.io.IOException;
import org.aspectj.util.TypeSafeEnum;
import org.aspectj.weaver.*;
// PTWIMPL New kind added to this class, can be (de)serialized
public abstract class PerClause extends Pointcut {
protected ResolvedType inAspect;
public static PerClause readPerClause(VersionedDataInputStream s, ISourceContext context) throws IOException {
Kind kind = Kind.read(s);
if (kind == SINGLETON) return PerSingleton.readPerClause(s, context);
else if (kind == PERCFLOW) return PerCflow.readPerClause(s, context);
else if (kind == PEROBJECT) return PerObject.readPerClause(s, context);
else if (kind == FROMSUPER) return PerFromSuper.readPerClause(s, context);
else if (kind == PERTYPEWITHIN) return PerTypeWithin.readPerClause(s,context);
throw new BCException("unknown kind: " + kind);
}
public final Pointcut concretize1(ResolvedType inAspect, ResolvedType declaringType, IntMap bindings) {
throw new RuntimeException("unimplemented: wrong concretize");
}
public abstract PerClause concretize(ResolvedType inAspect);
public abstract PerClause.Kind getKind();
public abstract String toDeclarationString();
public static class Kind extends TypeSafeEnum {
public Kind(String name, int key) { super(name, key); }
public static Kind read(VersionedDataInputStream s) throws IOException {
int key = s.readByte();
switch(key) {
case 1: return SINGLETON;
case 2: return PERCFLOW;
case 3: return PEROBJECT;
case 4: return FROMSUPER;
case 5: return PERTYPEWITHIN;
}
throw new BCException("weird kind " + key);
}
}
public static final Kind SINGLETON = new Kind("issingleton", 1);
public static final Kind PERCFLOW = new Kind("percflow", 2);
public static final Kind PEROBJECT = new Kind("perobject", 3);
public static final Kind FROMSUPER = new Kind("fromsuper", 4);
public static final Kind PERTYPEWITHIN = new Kind("pertypewithin",5);
public static class KindAnnotationPrefix extends TypeSafeEnum {
private KindAnnotationPrefix(String name, int key) {
super(name, key);
}
public String extractPointcut(String perClause) {
int from = getName().length();
int to = perClause.length()-1;
if (!perClause.startsWith(getName())
|| !perClause.endsWith(")")
|| from > perClause.length()) {
throw new RuntimeException("cannot read perclause " + perClause);
}
return perClause.substring(from, to);
}
public static final KindAnnotationPrefix PERCFLOW = new KindAnnotationPrefix("percflow(", 1);
public static final KindAnnotationPrefix PERCFLOWBELOW = new KindAnnotationPrefix("percflowbelow(", 2);
public static final KindAnnotationPrefix PERTHIS = new KindAnnotationPrefix("perthis(", 3);
public static final KindAnnotationPrefix PERTARGET = new KindAnnotationPrefix("pertarget(", 4);
public static final KindAnnotationPrefix PERTYPEWITHIN = new KindAnnotationPrefix("pertypewithin(", 5);
}
}