You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-dev@jakarta.apache.org by tc...@apache.org on 2006/07/11 03:57:20 UTC

svn commit: r420672 - in /jakarta/bcel/trunk/src: main/java/org/apache/bcel/classfile/ main/java/org/apache/bcel/generic/ test/java/org/apache/bcel/ test/java/org/apache/bcel/data/

Author: tcurdt
Date: Mon Jul 10 18:57:19 2006
New Revision: 420672

URL: http://svn.apache.org/viewvc?rev=420672&view=rev
Log:
GSoC: latest changes from Dmitriy Khayredinov

Modified:
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/Annotations.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/ElementValuePair.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ClassGen.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ElementValueGen.java
    jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/AbstractTestCase.java
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/CounterVisitorTestCase.java
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkedType.java
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotation.java
    jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java Mon Jul 10 18:57:19 2006
@@ -106,7 +106,7 @@
      */
     public ElementValuePair[] getElementValuePairs() {
     	// TOFO return List
-        return (ElementValuePair[]) element_value_pairs.toArray();
+        return (ElementValuePair[]) element_value_pairs.toArray(new ElementValuePair[element_value_pairs.size()]);
     }
 
 
@@ -124,5 +124,23 @@
 	public void addElementNameValuePair(ElementValuePair elementNameValuePair)
 	{
 		element_value_pairs.add(elementNameValuePair);
+	}
+
+	public String toShortString()
+	{
+		StringBuffer result = new StringBuffer();
+		result.append("@");
+		result.append(getAnnotationType());
+		if (getElementValuePairs().length > 0)
+		{
+			result.append("(");
+			for (int i = 0; i < getElementValuePairs().length; i++)
+			{
+				ElementValuePair element = getElementValuePairs()[i];
+				result.append(element.toShortString());
+			}
+			result.append(")");
+		}
+		return result.toString();
 	}
 }

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/Annotations.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/Annotations.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/Annotations.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/Annotations.java Mon Jul 10 18:57:19 2006
@@ -87,12 +87,14 @@
     }
 
 
+    // TODO: update method names
     /**
      * @return the annotation entry table
      */
+    /*
     public final AnnotationEntry[] getAnnotationTable() {
         return annotation_table;
-    }
+    }*/
 
 
     /**

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/ElementValuePair.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/ElementValuePair.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/ElementValuePair.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/ElementValuePair.java Mon Jul 10 18:57:19 2006
@@ -57,4 +57,12 @@
 	{
 		return elementNameIndex;
 	}
+
+	public String toShortString()
+	{
+		StringBuffer result = new StringBuffer();
+		result.append(getNameString()).append("=").append(
+				getValue().toShortString());
+		return result.toString();
+	}
 }

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java Mon Jul 10 18:57:19 2006
@@ -19,7 +19,11 @@
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.bcel.Constants;
+import org.apache.bcel.classfile.Attribute;
+import org.apache.bcel.classfile.Signature;
 
 /** 
  * Abstract super class for fields and methods.
@@ -33,8 +37,15 @@
     protected int signature_index; // Points to encoded signature
     protected int attributes_count; // No. of attributes
     protected Attribute[] attributes; // Collection of attributes
+    protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method 
     protected ConstantPool constant_pool;
 
+    private String signatureAttributeString = null;
+    private boolean searchedForSignatureAttribute = false;
+    
+
+    // Annotations are collected from certain attributes, don't do it more than necessary!
+    private boolean annotationsOutOfDate = true;
 
     FieldOrMethod() {
     }
@@ -191,16 +202,87 @@
      * @return deep copy of this field
      */
     protected FieldOrMethod copy_( ConstantPool _constant_pool ) {
+    	FieldOrMethod c = null;
+
         try {
-            FieldOrMethod c = (FieldOrMethod) clone();
-            c.constant_pool = _constant_pool;
-            c.attributes = new Attribute[attributes_count];
-            for (int i = 0; i < attributes_count; i++) {
-                c.attributes[i] = attributes[i].copy(_constant_pool);
-            }
-            return c;
-        } catch (CloneNotSupportedException e) {
-            return null;
-        }
-    }
+          c = (FieldOrMethod)clone();
+        } catch(CloneNotSupportedException e) {}
+
+        c.constant_pool    = constant_pool;
+        c.attributes       = new Attribute[attributes_count];
+
+        for(int i=0; i < attributes_count; i++)
+          c.attributes[i] = attributes[i].copy(constant_pool);
+
+        return c;
+    }
+    
+    /**
+	 * Ensure we have unpacked any attributes that contain annotations.
+	 * We don't remove these annotation attributes from the attributes list, they
+	 * remain there.
+	 */
+	private void ensureAnnotationsUpToDate()
+	{
+		if (annotationsOutOfDate)
+		{
+			// Find attributes that contain annotation data
+			Attribute[] attrs = getAttributes();
+			List accumulatedAnnotations = new ArrayList();
+			for (int i = 0; i < attrs.length; i++)
+			{
+				Attribute attribute = attrs[i];
+				if (attribute instanceof Annotations)
+				{
+					Annotations annotations = (Annotations) attribute;
+					for (int j = 0; i < annotations.getAnnotationEntries().length; i++)
+						accumulatedAnnotations.add(annotations
+								.getAnnotationEntries()[j]);
+				}
+			}
+			annotationEntries = (AnnotationEntry[]) accumulatedAnnotations
+					.toArray(new AnnotationEntry[] {});
+			annotationsOutOfDate = false;
+		}
+	}
+
+	public AnnotationEntry[] getAnnotationEntries()
+	{
+		ensureAnnotationsUpToDate();
+		return annotationEntries;
+	}
+
+	public void addAnnotationEntry(AnnotationEntry a)
+	{
+		ensureAnnotationsUpToDate();
+		int len = annotationEntries.length;
+		AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1];
+		System.arraycopy(annotationEntries, 0, newAnnotations, 0, len);
+		newAnnotations[len] = a;
+		annotationEntries = newAnnotations;
+	}
+
+	/**
+	 * Hunts for a signature attribute on the member and returns its contents.  So where the 'regular' signature
+	 * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector<Ljava/lang/String>;'
+	 * Coded for performance - searches for the attribute only when requested - only searches for it once.
+	 */
+	public final String getGenericSignature()
+	{
+		if (!searchedForSignatureAttribute)
+		{
+			boolean found = false;
+			for (int i = 0; !found && i < attributes_count; i++)
+			{
+				if (attributes[i] instanceof Signature)
+				{
+					signatureAttributeString = ((Signature) attributes[i])
+							.getSignature();
+					found = true;
+				}
+			}
+			searchedForSignatureAttribute = true;
+		}
+		return signatureAttributeString;
+	}
 }

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/classfile/JavaClass.java Mon Jul 10 18:57:19 2006
@@ -61,12 +61,21 @@
     private Field[] fields; // Fields, i.e., variables of class
     private Method[] methods; // methods defined in the class
     private Attribute[] attributes; // attributes defined in the class
+    private AnnotationEntry[] annotations;   // annotations defined on the class
     private byte source = HEAP; // Generated in memory
+    private boolean isGeneric = false;
+    private boolean isAnonymous = false;
+    private boolean isNested = false;
+    private boolean computedNestedTypeStatus = false;
     public static final byte HEAP = 1;
     public static final byte FILE = 2;
     public static final byte ZIP = 3;
     static boolean debug = false; // Debugging on/off
     static char sep = '/'; // directory separator
+    
+    //  Annotations are collected from certain attributes, don't do it more than necessary!
+    private boolean annotationsOutOfDate = true;
+    
     private static BCELComparator _cmp = new BCELComparator() {
 
         public boolean equals( Object o1, Object o2 ) {
@@ -134,6 +143,7 @@
         this.fields = fields;
         this.methods = methods;
         this.attributes = attributes;
+        annotationsOutOfDate = true;
         this.source = source;
         // Get source file name if available
         for (int i = 0; i < attributes.length; i++) {
@@ -325,8 +335,25 @@
     public Attribute[] getAttributes() {
         return attributes;
     }
-
-
+    
+    public AnnotationEntry[] getAnnotationEntries() {
+      	if (annotationsOutOfDate) { 
+      		// Find attributes that contain annotation data
+      		Attribute[] attrs = getAttributes();
+      		List accumulatedAnnotations = new ArrayList();
+      		for (int i = 0; i < attrs.length; i++) {
+    			Attribute attribute = attrs[i];
+    			if (attribute instanceof Annotations) {				
+    				Annotations runtimeAnnotations = (Annotations)attribute;
+    				for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++)
+    					accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]);
+    			}
+    		}
+      		annotations = (AnnotationEntry[])accumulatedAnnotations.toArray(new AnnotationEntry[]{});
+      		annotationsOutOfDate = false;
+      	}
+      	return annotations;
+      }
     /**
      * @return Class name.
      */
@@ -615,6 +642,12 @@
                 buf.append(indent(attributes[i]));
             }
         }
+        AnnotationEntry[] annotations = getAnnotationEntries();
+        if (annotations!=null && annotations.length>0) {
+        	buf.append("\nAnnotation(s):\n");
+        	for (int i=0; i<annotations.length; i++) 
+        		buf.append(indent(annotations[i]));
+        }
         if (fields.length > 0) {
             buf.append("\n").append(fields.length).append(" fields:\n");
             for (int i = 0; i < fields.length; i++) {
@@ -676,6 +709,41 @@
 
     public final boolean isClass() {
         return (access_flags & Constants.ACC_INTERFACE) == 0;
+    }
+    
+    public final boolean isAnonymous() {
+  	  computeNestedTypeStatus();
+  	  return this.isAnonymous;
+    }
+    
+    public final boolean isNested() {
+  	  computeNestedTypeStatus();
+  	  return this.isNested;
+    }
+    
+    private final void computeNestedTypeStatus() {
+  	  if (computedNestedTypeStatus) return;
+  	  for (int i = 0; i < this.attributes.length; i++) {
+  			if (this.attributes[i] instanceof InnerClasses) {
+  				InnerClass[] innerClasses = ((InnerClasses) this.attributes[i]).getInnerClasses();
+  				for (int j = 0; j < innerClasses.length; j++) {
+  					boolean innerClassAttributeRefersToMe = false;
+  					String inner_class_name = constant_pool.getConstantString(innerClasses[j].getInnerClassIndex(),
+  						       Constants.CONSTANT_Class);
+  					inner_class_name = Utility.compactClassName(inner_class_name);
+  					if (inner_class_name.equals(getClassName())) {
+  						innerClassAttributeRefersToMe = true;
+  					}
+  					if (innerClassAttributeRefersToMe) {
+  						this.isNested = true;
+  						if (innerClasses[j].getInnerNameIndex() == 0) {
+  							this.isAnonymous = true;
+  						}
+  					}
+  				}
+  			}
+  	  }
+  	  this.computedNestedTypeStatus = true;
     }
 
 

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ClassGen.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ClassGen.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ClassGen.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ClassGen.java Mon Jul 10 18:57:19 2006
@@ -21,12 +21,16 @@
 import java.util.List;
 import org.apache.bcel.Constants;
 import org.apache.bcel.classfile.AccessFlags;
+import org.apache.bcel.classfile.AnnotationEntry;
 import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.classfile.ConstantPool;
 import org.apache.bcel.classfile.Field;
 import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.Method;
+import org.apache.bcel.classfile.RuntimeInvisibleAnnotations;
+import org.apache.bcel.classfile.RuntimeVisibleAnnotations;
 import org.apache.bcel.classfile.SourceFile;
+import org.apache.bcel.classfile.Utility;
 import org.apache.bcel.util.BCELComparator;
 
 /** 
@@ -50,6 +54,9 @@
     private List method_vec = new ArrayList();
     private List attribute_vec = new ArrayList();
     private List interface_vec = new ArrayList();
+    private List annotation_vec = new ArrayList();
+	private boolean unpackedAnnotations = false; 
+	
     private static BCELComparator _cmp = new BCELComparator() {
 
         public boolean equals( Object o1, Object o2 ) {
@@ -127,6 +134,8 @@
         major = clazz.getMajor();
         minor = clazz.getMinor();
         Attribute[] attributes = clazz.getAttributes();
+        // J5TODO: Could make unpacking lazy, done on first reference
+        AnnotationEntryGen[] annotations = unpackAnnotations(attributes);
         Method[] methods = clazz.getMethods();
         Field[] fields = clazz.getFields();
         String[] interfaces = clazz.getInterfaceNames();
@@ -136,6 +145,9 @@
         for (int i = 0; i < attributes.length; i++) {
             addAttribute(attributes[i]);
         }
+        for(int i=0; i < annotations.length; i++) {
+            addAnnotationEntry(annotations[i]);
+        }
         for (int i = 0; i < methods.length; i++) {
             addMethod(methods[i]);
         }
@@ -143,6 +155,43 @@
             addField(fields[i]);
         }
     }
+    
+    /**
+	 * Look for attributes representing annotations and unpack them.
+	 */
+	private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs)
+	{
+		List /* AnnotationGen */annotationGenObjs = new ArrayList();
+		for (int i = 0; i < attrs.length; i++)
+		{
+			Attribute attr = attrs[i];
+			if (attr instanceof RuntimeVisibleAnnotations)
+			{
+				RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr;
+				AnnotationEntry[] annos = rva.getAnnotationEntries();
+				for (int j = 0; i < annos.length; i++)
+				{
+					AnnotationEntry a = annos[i];
+					annotationGenObjs.add(new AnnotationEntryGen(a,
+							getConstantPool(), false));
+				}
+			}
+			else
+				if (attr instanceof RuntimeInvisibleAnnotations)
+				{
+					RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr;
+					AnnotationEntry[] annos = ria.getAnnotationEntries();
+					for (int j = 0; i < annos.length; i++)
+					{
+						AnnotationEntry a = annos[i];
+						annotationGenObjs.add(new AnnotationEntryGen(a,
+								getConstantPool(), false));
+					}
+				}
+		}
+		return (AnnotationEntryGen[]) annotationGenObjs
+				.toArray(new AnnotationEntryGen[] {});
+	}
 
 
     /**
@@ -152,7 +201,16 @@
         int[] interfaces = getInterfaces();
         Field[] fields = getFields();
         Method[] methods = getMethods();
-        Attribute[] attributes = getAttributes();
+        Attribute[] attributes = null;
+        if (annotation_vec.size()==0) {
+        	attributes = getAttributes();
+        } else {
+        	// TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations'
+            Attribute[] annAttributes  = Utility.getAnnotationAttributes(cp,annotation_vec);
+            attributes = new Attribute[attribute_vec.size()+annAttributes.length];
+            attribute_vec.toArray(attributes);
+            System.arraycopy(annAttributes,0,attributes,attribute_vec.size(),annAttributes.length);       
+        }
         // Must be last since the above calls may still add something to it
         ConstantPool _cp = this.cp.getFinalConstantPool();
         return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor,
@@ -217,6 +275,10 @@
     public void addAttribute( Attribute a ) {
         attribute_vec.add(a);
     }
+    
+    public void addAnnotationEntry(AnnotationEntryGen a) { 
+    	annotation_vec.add(a); 
+    }
 
 
     /**
@@ -420,6 +482,11 @@
 
     public Attribute[] getAttributes() {
         return (Attribute[]) attribute_vec.toArray(new Attribute[attribute_vec.size()]);
+    }
+    
+    //  J5TODO: Should we make calling unpackAnnotations() lazy and put it in here?
+    public AnnotationEntryGen[] getAnnotationEntries() {
+    	return (AnnotationEntryGen[]) annotation_vec.toArray(new AnnotationEntryGen[annotation_vec.size()]);
     }
 
 

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ElementValueGen.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ElementValueGen.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ElementValueGen.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/ElementValueGen.java Mon Jul 10 18:57:19 2006
@@ -3,9 +3,10 @@
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
-import org.apache.bcel.classfile.AnnotationElementValue;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.bcel.classfile.AnnotationEntry;
 import org.apache.bcel.classfile.ArrayElementValue;
-import org.apache.bcel.classfile.ClassElementValue;
 import org.apache.bcel.classfile.ElementValue;
 import org.apache.bcel.classfile.EnumElementValue;
 import org.apache.bcel.classfile.SimpleElementValue;
@@ -98,21 +99,22 @@
 		case 'e': // Enum constant
 			return new EnumElementValueGen(dis.readUnsignedShort(), dis
 					.readUnsignedShort(), cpGen);
-			// case 'c': // Class
-			// return new ClassElementValueGen(dis.readUnsignedShort(), cpGen);
-			//
-			// case '@': // Annotation
-			// return new
-			// AnnotationElementValueGen(ANNOTATION,Annotation.read(dis,cpGen),cpGen);
-			//		  	
-			// case '[': // Array
-			// int numArrayVals = dis.readUnsignedShort();
-			// List arrayVals = new ArrayList();
-			// ElementValue[] evalues = new ElementValue[numArrayVals];
-			// for (int j=0;j<numArrayVals;j++) {
-			// evalues[j] = ElementValue.readElementValue(dis,cpGen);
-			// }
-			// return new ArrayElementValue(ARRAY,evalues,cpGen);
+		case 'c': // Class
+			return new ClassElementValueGen(dis.readUnsignedShort(), cpGen);
+		case '@': // Annotation
+			// TODO: isRuntimeVisible ??????????
+			// FIXME
+			return new AnnotationElementValueGen(ANNOTATION, new AnnotationEntryGen(AnnotationEntry.read(
+					dis, cpGen.getConstantPool(), true), cpGen, false), cpGen);
+		case '[': // Array
+			int numArrayVals = dis.readUnsignedShort();
+			List arrayVals = new ArrayList();
+			ElementValue[] evalues = new ElementValue[numArrayVals];
+			for (int j = 0; j < numArrayVals; j++)
+			{
+				evalues[j] = ElementValue.readElementValue(dis, cpGen.getConstantPool());
+			}
+			return new ArrayElementValueGen(ARRAY, evalues, cpGen);
 		default:
 			throw new RuntimeException(
 					"Unexpected element value kind in annotation: " + type);
@@ -155,7 +157,7 @@
 			// copyPoolEntries);
 			// case 'c': // Class
 			// return new ClassElementValueGen((ClassElementValue) value, cpool,
-			//					copyPoolEntries);
+			// copyPoolEntries);
 		default:
 			throw new RuntimeException("Not implemented yet! ("
 					+ value.getElementValueType() + ")");

Modified: jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java (original)
+++ jakarta/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java Mon Jul 10 18:57:19 2006
@@ -35,6 +35,7 @@
     protected Type type;
     protected ConstantPoolGen cp;
     private List attribute_vec = new ArrayList();
+    protected ArrayList       annotation_vec= new ArrayList();
 
 
     protected FieldGenOrMethodGen() {
@@ -87,6 +88,11 @@
     public void addAttribute( Attribute a ) {
         attribute_vec.add(a);
     }
+    
+    public void addAnnotationEntry(AnnotationEntryGen ag)
+	{
+		annotation_vec.add(ag);
+	}
 
 
     /**
@@ -95,6 +101,11 @@
     public void removeAttribute( Attribute a ) {
         attribute_vec.remove(a);
     }
+    
+    public void removeAnnotationEntry(AnnotationEntryGen ag)
+	{
+		annotation_vec.remove(ag);
+	}
 
 
     /**
@@ -103,6 +114,11 @@
     public void removeAttributes() {
         attribute_vec.clear();
     }
+    
+    public void removeAnnotationEntries()
+	{
+		annotation_vec.clear();
+	}
 
 
     /**
@@ -113,6 +129,12 @@
         attribute_vec.toArray(attributes);
         return attributes;
     }
+    
+    public AnnotationEntryGen[] getAnnotationEntries() {
+    	AnnotationEntryGen[] annotations = new AnnotationEntryGen[annotation_vec.size()];
+      	annotation_vec.toArray(annotations);
+      	return annotations;
+      }
 
 
     /** @return signature of method/field.

Modified: jakarta/bcel/trunk/src/test/java/org/apache/bcel/AbstractTestCase.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/AbstractTestCase.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/AbstractTestCase.java (original)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/AbstractTestCase.java Mon Jul 10 18:57:19 2006
@@ -1,17 +1,32 @@
 package org.apache.bcel;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import junit.framework.TestCase;
+import org.apache.bcel.classfile.AnnotationEntry;
 import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.Method;
+import org.apache.bcel.generic.AnnotationEntryGen;
+import org.apache.bcel.generic.ConstantPoolGen;
+import org.apache.bcel.generic.ElementValueGen;
+import org.apache.bcel.generic.ElementValuePairGen;
+import org.apache.bcel.generic.ObjectType;
+import org.apache.bcel.generic.SimpleElementValueGen;
+import org.apache.bcel.util.ClassPath;
 import org.apache.bcel.util.SyntheticRepository;
 
 public class AbstractTestCase extends TestCase
 {
 	private boolean verbose = false;
 
+	protected File createTestdataFile(String name)
+	{
+		return new File("target" + File.separator + "testdata" + File.separator
+				+ name);
+	}
+
 	protected JavaClass getTestClass(String name) throws ClassNotFoundException
 	{
 		return SyntheticRepository.getInstance().loadClass(name);
@@ -31,6 +46,45 @@
 		return null;
 	}
 
+	protected boolean wipe(String name)
+	{
+		return new File("target" + File.separator + "testdata" + File.separator
+				+ name).delete();
+	}
+
+	protected boolean wipe(String dir, String name)
+	{
+		boolean b = wipe(dir + File.separator + name);
+		String[] files = new File(dir).list();
+		if (files == null || files.length == 0)
+		{
+			new File(dir).delete(); // Why does this not succeed? stupid thing
+		}
+		return b;
+	}
+
+	public SyntheticRepository createRepos(String cpentry)
+	{
+		ClassPath cp = new ClassPath("target" + File.separator + "testdata"
+				+ File.separator + cpentry + File.pathSeparator
+				+ System.getProperty("java.class.path"));
+		return SyntheticRepository.getInstance(cp);
+	}
+
+	protected Attribute[] findAttribute(String name, JavaClass clazz)
+	{
+		Attribute[] all = clazz.getAttributes();
+		List chosenAttrsList = new ArrayList();
+		for (int i = 0; i < all.length; i++)
+		{
+			if (verbose)
+				System.err.println("Attribute: " + all[i].getName());
+			if (all[i].getName().equals(name))
+				chosenAttrsList.add(all[i]);
+		}
+		return (Attribute[]) chosenAttrsList.toArray(new Attribute[] {});
+	}
+
 	protected Attribute findAttribute(String name, Attribute[] all)
 	{
 		List chosenAttrsList = new ArrayList();
@@ -44,5 +98,60 @@
 		assertTrue("Should be one match: " + chosenAttrsList.size(),
 				chosenAttrsList.size() == 1);
 		return (Attribute) chosenAttrsList.get(0);
+	}
+
+	protected String dumpAttributes(Attribute[] as)
+	{
+		StringBuffer result = new StringBuffer();
+		result.append("AttributeArray:[");
+		for (int i = 0; i < as.length; i++)
+		{
+			Attribute attr = as[i];
+			result.append(attr.toString());
+			if (i + 1 < as.length)
+				result.append(",");
+		}
+		result.append("]");
+		return result.toString();
+	}
+
+	protected String dumpAnnotationEntries(AnnotationEntry[] as)
+	{
+		StringBuffer result = new StringBuffer();
+		result.append("[");
+		for (int i = 0; i < as.length; i++)
+		{
+			AnnotationEntry annotation = as[i];
+			result.append(annotation.toShortString());
+			if (i + 1 < as.length)
+				result.append(",");
+		}
+		result.append("]");
+		return result.toString();
+	}
+	
+	protected String dumpAnnotationEntries(AnnotationEntryGen[] as) {
+		StringBuffer result = new StringBuffer();
+		result.append("[");
+		for (int i = 0; i < as.length; i++) {
+			AnnotationEntryGen annotation = as[i];
+			result.append(annotation.toShortString());
+			if (i+1<as.length) result.append(",");
+		}
+		result.append("]");
+		return result.toString();
+	}
+
+	public AnnotationEntryGen createFruitAnnotationEntry(ConstantPoolGen cp,
+			String aFruit, boolean visibility)
+	{
+		SimpleElementValueGen evg = new SimpleElementValueGen(
+				ElementValueGen.STRING, cp, aFruit);
+		ElementValuePairGen nvGen = new ElementValuePairGen("fruit",
+				evg, cp);
+		ObjectType t = new ObjectType("SimpleStringAnnotation");
+		List elements = new ArrayList();
+		elements.add(nvGen);
+		return new AnnotationEntryGen(t, elements, visibility, cp);
 	}
 }

Modified: jakarta/bcel/trunk/src/test/java/org/apache/bcel/CounterVisitorTestCase.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/CounterVisitorTestCase.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/CounterVisitorTestCase.java (original)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/CounterVisitorTestCase.java Mon Jul 10 18:57:19 2006
@@ -6,7 +6,7 @@
 {
 	protected JavaClass getTestClass() throws ClassNotFoundException
 	{
-		return getTestClass("org.apache.bcel.data.MarkedType$1");
+		return getTestClass("org.apache.bcel.data.MarkedType");
 	}
 
 	public void testAnnotationsCount()

Modified: jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkedType.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkedType.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkedType.java (original)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkedType.java Mon Jul 10 18:57:19 2006
@@ -0,0 +1,7 @@
+package org.apache.bcel.data;
+
+@MarkerAnnotationInvisible
+@MarkerAnnotation
+public class MarkedType
+{
+}

Modified: jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotation.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotation.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotation.java (original)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotation.java Mon Jul 10 18:57:19 2006
@@ -0,0 +1,8 @@
+package org.apache.bcel.data;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MarkerAnnotation
+{
+}

Modified: jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java
URL: http://svn.apache.org/viewvc/jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java?rev=420672&r1=420671&r2=420672&view=diff
==============================================================================
--- jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java (original)
+++ jakarta/bcel/trunk/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java Mon Jul 10 18:57:19 2006
@@ -0,0 +1,6 @@
+package org.apache.bcel.data;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.CLASS)
+public @interface MarkerAnnotationInvisible { }



---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-dev-help@jakarta.apache.org