Package org.aspectj.weaver.bcel

Source Code of org.aspectj.weaver.bcel.BcelAnnotation

/* *******************************************************************
* 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
*/
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}
   */
  @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}
   */
  @Override
  public boolean hasNameValuePair(String name, String value) {
    return bcelAnnotation.hasNameValuePair(name, value);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean hasNamedValue(String name) {
    return bcelAnnotation.hasNamedValue(name);
  }

  /**
   * {@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}
   */
  @Override
  public boolean isRuntimeVisible() {
    return this.bcelAnnotation.isRuntimeVisible();
  }

  /**
   * @return return the real bcel annotation being wrapped
   */
  public AnnotationGen getBcelAnnotation() {
    return bcelAnnotation;
  }

  /**
   * {@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;
    }
  }
}
TOP

Related Classes of org.aspectj.weaver.bcel.BcelAnnotation

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.