帆软使用的第三方框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

158 lines
3.4 KiB

/* *******************************************************************
* Copyright (c) 2008 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
*
* ******************************************************************/
package com.fr.third.aspectj.weaver;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public abstract class AbstractAnnotationAJ implements AnnotationAJ {
protected final ResolvedType type;
private Set<String> supportedTargets = null; // @target meta annotation
public AbstractAnnotationAJ(ResolvedType type) {
this.type = type;
}
/**
* {@inheritDoc}
*/
public final ResolvedType getType() {
return type;
}
/**
* {@inheritDoc}
*/
public final String getTypeSignature() {
return type.getSignature();
}
/**
* {@inheritDoc}
*/
public final String getTypeName() {
return type.getName();
}
/**
* {@inheritDoc}
*/
public final boolean allowedOnAnnotationType() {
ensureAtTargetInitialized();
if (supportedTargets.isEmpty()) {
return true;
}
return supportedTargets.contains("ANNOTATION_TYPE");
}
/**
* {@inheritDoc}
*/
public final boolean allowedOnField() {
ensureAtTargetInitialized();
if (supportedTargets.isEmpty()) {
return true;
}
return supportedTargets.contains("FIELD");
}
/**
* {@inheritDoc}
*/
public final boolean allowedOnRegularType() {
ensureAtTargetInitialized();
if (supportedTargets.isEmpty()) {
return true;
}
return supportedTargets.contains("TYPE");
}
/**
* {@inheritDoc}
*/
public final void ensureAtTargetInitialized() {
if (supportedTargets == null) {
AnnotationAJ atTargetAnnotation = retrieveAnnotationOnAnnotation(UnresolvedType.AT_TARGET);
if (atTargetAnnotation == null) {
supportedTargets = Collections.emptySet();
} else {
supportedTargets = atTargetAnnotation.getTargets();
}
}
}
/**
* {@inheritDoc}
*/
public final String getValidTargets() {
StringBuffer sb = new StringBuffer();
sb.append("{");
for (Iterator<String> iter = supportedTargets.iterator(); iter.hasNext();) {
String evalue = iter.next();
sb.append(evalue);
if (iter.hasNext()) {
sb.append(",");
}
}
sb.append("}");
return sb.toString();
}
/**
* {@inheritDoc}
*/
public final boolean specifiesTarget() {
ensureAtTargetInitialized();
return !supportedTargets.isEmpty();
}
/**
* Helper method to retrieve an annotation on an annotation e.g. retrieveAnnotationOnAnnotation(UnresolvedType.AT_TARGET)
*/
private final AnnotationAJ retrieveAnnotationOnAnnotation(UnresolvedType requiredAnnotationSignature) {
AnnotationAJ[] annos = type.getAnnotations();
for (int i = 0; i < annos.length; i++) {
AnnotationAJ a = annos[i];
if (a.getTypeSignature().equals(requiredAnnotationSignature.getSignature())) {
return annos[i];
}
}
return null;
}
/**
* {@inheritDoc}
*/
public abstract boolean isRuntimeVisible();
/**
* {@inheritDoc}
*/
public abstract Set<String> getTargets();
/**
* {@inheritDoc}
*/
public abstract boolean hasNameValuePair(String name, String value);
/**
* {@inheritDoc}
*/
public abstract boolean hasNamedValue(String name);
/**
* {@inheritDoc}
*/
public abstract String stringify();
}