blob: 475b0977f17a4221c8a46fd65758f71d1e49b0e0 [file] [log] [blame]
/* *******************************************************************
* 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 org.aspectj.weaver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* This type represents the weavers abstraction of an annotation - it is not tied to any underlying BCI toolkit. The weaver actualy
* handles these through AnnotationX wrapper objects - until we start transforming the BCEL annotations into this form (expensive)
* or offer a clever visitor mechanism over the BCEL annotation stuff that builds these annotation types directly.
*
* @author AndyClement
*/
public class StandardAnnotation extends AbstractAnnotationAJ {
private final boolean isRuntimeVisible;
private List<AnnotationNameValuePair> nvPairs = null;
public StandardAnnotation(ResolvedType type, boolean isRuntimeVisible) {
super(type);
this.isRuntimeVisible = isRuntimeVisible;
}
/**
* {@inheritDoc}
*/
public boolean isRuntimeVisible() {
return isRuntimeVisible;
}
/**
* {@inheritDoc}
*/
public String stringify() {
StringBuffer sb = new StringBuffer();
sb.append("@").append(type.getClassName());
if (hasNameValuePairs()) {
sb.append("(");
for (AnnotationNameValuePair nvPair : nvPairs) {
sb.append(nvPair.stringify());
}
sb.append(")");
}
return sb.toString();
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Anno[" + getTypeSignature() + " " + (isRuntimeVisible ? "rVis" : "rInvis"));
if (nvPairs != null) {
sb.append(" ");
for (Iterator<AnnotationNameValuePair> iter = nvPairs.iterator(); iter.hasNext();) {
AnnotationNameValuePair element = iter.next();
sb.append(element.toString());
if (iter.hasNext()) {
sb.append(",");
}
}
}
sb.append("]");
return sb.toString();
}
/**
* {@inheritDoc}
*/
public boolean hasNamedValue(String n) {
if (nvPairs == null) {
return false;
}
for (int i = 0; i < nvPairs.size(); i++) {
AnnotationNameValuePair pair = nvPairs.get(i);
if (pair.getName().equals(n)) {
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean hasNameValuePair(String n, String v) {
if (nvPairs == null) {
return false;
}
for (int i = 0; i < nvPairs.size(); i++) {
AnnotationNameValuePair pair = nvPairs.get(i);
if (pair.getName().equals(n)) {
if (pair.getValue().stringify().equals(v)) {
return true;
}
}
}
return false;
}
/**
* {@inheritDoc}
*/
public Set<String> getTargets() {
if (!type.equals(UnresolvedType.AT_TARGET)) {
return Collections.emptySet();
}
AnnotationNameValuePair nvp = nvPairs.get(0);
ArrayAnnotationValue aav = (ArrayAnnotationValue) nvp.getValue();
AnnotationValue[] avs = aav.getValues();
Set<String> targets = new HashSet<String>();
for (int i = 0; i < avs.length; i++) {
EnumAnnotationValue value = (EnumAnnotationValue)avs[i];
targets.add(value.getValue());
}
return targets;
}
public List<AnnotationNameValuePair> getNameValuePairs() {
return nvPairs;
}
public boolean hasNameValuePairs() {
return nvPairs != null && nvPairs.size() != 0;
}
public void addNameValuePair(AnnotationNameValuePair pair) {
if (nvPairs == null) {
nvPairs = new ArrayList<AnnotationNameValuePair>();
}
nvPairs.add(pair);
}
/**
* {@inheritDoc}
*/
public String getStringFormOfValue(String name) {
if (hasNameValuePairs()) {
for (AnnotationNameValuePair nvPair : nvPairs) {
if (nvPair.getName().equals(name)) {
return nvPair.getValue().stringify();
}
}
}
return null;
}
}