/* *******************************************************************
 * 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.bcel;

import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.aspectj.apache.bcel.classfile.annotation.AnnotationGen;
import org.aspectj.apache.bcel.classfile.annotation.ArrayElementValue;
import org.aspectj.apache.bcel.classfile.annotation.ElementValue;
import org.aspectj.apache.bcel.classfile.annotation.EnumElementValue;
import org.aspectj.apache.bcel.classfile.annotation.NameValuePair;
import org.aspectj.weaver.AbstractAnnotationAJ;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.World;

Wraps a Bcel Annotation object and uses it to answer AnnotationAJ method calls. This is cheaper than translating all Bcel annotations into AnnotationAJ objects.
Author:AndyClement
/** * Wraps a Bcel Annotation object and uses it to answer AnnotationAJ method calls. This is cheaper than translating all Bcel * annotations into AnnotationAJ objects. * * @author AndyClement */
public class BcelAnnotation extends AbstractAnnotationAJ { private final AnnotationGen bcelAnnotation; public BcelAnnotation(AnnotationGen theBcelAnnotation, World world) { super(UnresolvedType.forSignature(theBcelAnnotation.getTypeSignature()).resolve(world)); this.bcelAnnotation = theBcelAnnotation; } public BcelAnnotation(AnnotationGen theBcelAnnotation, ResolvedType resolvedAnnotationType) { super(resolvedAnnotationType); this.bcelAnnotation = theBcelAnnotation; } public String toString() { StringBuffer sb = new StringBuffer(); List<NameValuePair> nvPairs = bcelAnnotation.getValues(); sb.append("Anno[" + getTypeSignature() + " " + (isRuntimeVisible() ? "rVis" : "rInvis")); if (nvPairs.size() > 0) { sb.append(" "); int i = 0; for (NameValuePair element : nvPairs) { if (i > 0) { sb.append(','); } sb.append(element.getNameString()).append("=").append(element.getValue().toString()); i++; } } sb.append("]"); return sb.toString(); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public Set<String> getTargets() { if (!type.equals(UnresolvedType.AT_TARGET)) { return Collections.emptySet(); } List<NameValuePair> values = bcelAnnotation.getValues(); NameValuePair envp = values.get(0); ArrayElementValue aev = (ArrayElementValue) envp.getValue(); ElementValue[] evs = aev.getElementValuesArray(); Set<String> targets = new HashSet<String>(); for (int i = 0; i < evs.length; i++) { EnumElementValue ev = (EnumElementValue) evs[i]; targets.add(ev.getEnumValueString()); } return targets; }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public boolean hasNameValuePair(String name, String value) { return bcelAnnotation.hasNameValuePair(name, value); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public boolean hasNamedValue(String name) { return bcelAnnotation.hasNamedValue(name); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public String stringify() { StringBuffer sb = new StringBuffer(); sb.append("@").append(type.getClassName()); List<NameValuePair> values = bcelAnnotation.getValues(); if (values != null && values.size() != 0) { sb.append("("); for (NameValuePair nvPair : values) { sb.append(nvPair.getNameString()).append("=").append(nvPair.getValue().stringifyValue()); } sb.append(")"); } return sb.toString(); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public boolean isRuntimeVisible() { return this.bcelAnnotation.isRuntimeVisible(); }
Returns:return the real bcel annotation being wrapped
/** * @return return the real bcel annotation being wrapped */
public AnnotationGen getBcelAnnotation() { return bcelAnnotation; }
{@inheritDoc}
/** * {@inheritDoc} */
public String getStringFormOfValue(String name) { List<NameValuePair> annotationValues = this.bcelAnnotation.getValues(); if (annotationValues == null || annotationValues.size() == 0) { return null; } else { for (NameValuePair nvPair : annotationValues) { if (nvPair.getNameString().equals(name)) { return nvPair.getValue().stringifyValue(); } } return null; } } }