blob: 86633cf36478b7394074fb7a2a44532a7f66bbf7 [file] [log] [blame]
/* *******************************************************************
* Copyright (c) 2003 Contributors.
* 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:
* Mik Kersten initial implementation
* ******************************************************************/
package org.aspectj.asm;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.List;
/**
* A relationship has a name (e.g. 'declare warning') and some set of affected targets.
*
* @author Mik Kersten
* @author Andy Clement
*/
public interface IRelationship extends Serializable {
public String getName();
public Kind getKind();
public void addTarget(String handle);
public List<String> getTargets();
public String getSourceHandle();
public boolean hasRuntimeTest();
public boolean isAffects();
public static class Kind implements Serializable { // typesafe enum
private static final long serialVersionUID = -2691351740214705220L;
public static final Kind DECLARE_WARNING = new Kind("declare warning");
public static final Kind DECLARE_ERROR = new Kind("declare error");
public static final Kind ADVICE_AROUND = new Kind("around advice");
public static final Kind ADVICE_AFTERRETURNING = new Kind("after returning advice");
public static final Kind ADVICE_AFTERTHROWING = new Kind("after throwing advice");
public static final Kind ADVICE_AFTER = new Kind("after advice");
public static final Kind ADVICE_BEFORE = new Kind("before advice");
public static final Kind ADVICE = new Kind("advice");
public static final Kind DECLARE = new Kind("declare");
public static final Kind DECLARE_INTER_TYPE = new Kind("inter-type declaration");
public static final Kind USES_POINTCUT = new Kind("uses pointcut");
public static final Kind DECLARE_SOFT = new Kind("declare soft");
public static final Kind[] ALL = { DECLARE_WARNING, DECLARE_ERROR, ADVICE_AROUND, ADVICE_AFTERRETURNING,
ADVICE_AFTERTHROWING, ADVICE_AFTER, ADVICE_BEFORE, ADVICE, DECLARE, DECLARE_INTER_TYPE, USES_POINTCUT, DECLARE_SOFT };
private final String name;
public boolean isDeclareKind() {
return this == DECLARE_WARNING || this == DECLARE_ERROR || this == DECLARE || this == DECLARE_INTER_TYPE
|| this == DECLARE_SOFT;
}
public String getName() {
return name;
}
/**
* Return the Kind of the relationship that is passed in by name.
*
* @param stringFormOfRelationshipKind the relationship name, eg. 'declare warning', 'declare error', etc.
* @return the Kind instance
*/
public static Kind getKindFor(String stringFormOfRelationshipKind) {
for (int i = 0; i < ALL.length; i++) {
if (ALL[i].name.equals(stringFormOfRelationshipKind)) {
return ALL[i];
}
}
return null;
}
private Kind(String name) {
this.name = name;
}
public String toString() {
return name;
}
// The 4 declarations below are necessary for serialization
private static int nextOrdinal = 0;
private final int ordinal = nextOrdinal++;
private Object readResolve() throws ObjectStreamException {
return ALL[ordinal];
}
}
}