]> source.dussan.org Git - javassist.git/commitdiff
fixed JASSIST-130
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sun, 12 Sep 2010 12:59:04 +0000 (12:59 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Sun, 12 Sep 2010 12:59:04 +0000 (12:59 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@573 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CtClass.java
src/main/javassist/bytecode/AnnotationsAttribute.java
src/main/javassist/bytecode/AttributeInfo.java
src/main/javassist/bytecode/ClassFilePrinter.java
src/main/javassist/bytecode/ParameterAnnotationsAttribute.java

index b1bd8a6b22e238e25d26cf2c09ec17d5ac2764aa..87b9e6342e1362e6036c405401587dc1acbe8b1e 100644 (file)
@@ -284,7 +284,7 @@ see javassist.Dump.
 <p>-version 3.14
 
 <ul>
-       <li>JIRA JASSIST-131.
+       <li>JIRA JASSIST-130, 131, 132.
 </ul>
 
 <p>-version 3.13 on July 19, 2010
index adb814557c24ca0e120a63769a6e08d0fa51a8c6..c3d41760bab76153f473fcdbbedf716d9b89b088 100644 (file)
@@ -409,6 +409,8 @@ public abstract class CtClass {
      * That collection includes the name of this class.
      *
      * <p>This method may return <code>null</code>.
+     *
+     * @return a <code>Collection&lt;String&gt;</code> object.
      */
     public synchronized Collection getRefClasses() {
         ClassFile cf = getClassFile2();
index 4612d38ea3c309b5cd5ed2c67d9d4146429594e4..7e53ce0269961bd474401ea050ae1f93edc902ef 100644 (file)
@@ -16,6 +16,7 @@
 package javassist.bytecode;
 
 import java.util.Map;
+import java.util.HashMap;
 import java.io.IOException;
 import java.io.DataInputStream;
 import java.io.ByteArrayOutputStream;
@@ -165,7 +166,7 @@ public class AnnotationsAttribute extends AttributeInfo {
             return new AnnotationsAttribute(newCp, getName(), copier.close());
         }
         catch (Exception e) {
-            throw new RuntimeException(e.toString());
+            throw new RuntimeException(e);
         }
     }
 
@@ -225,7 +226,7 @@ public class AnnotationsAttribute extends AttributeInfo {
             return new Parser(info, constPool).parseAnnotations();
         }
         catch (Exception e) {
-            throw new RuntimeException(e.toString());
+            throw new RuntimeException(e);
         }
     }
 
@@ -265,12 +266,31 @@ public class AnnotationsAttribute extends AttributeInfo {
         setAnnotations(new Annotation[] { annotation });
     }
 
+    /**
+     * @param oldname       a JVM class name.
+     * @param newname       a JVM class name.
+     */
+    void renameClass(String oldname, String newname) {
+        HashMap map = new HashMap();
+        map.put(oldname, newname);
+        renameClass(map);
+    }
+
+    void renameClass(Map classnames) {
+        Renamer renamer = new Renamer(info, getConstPool(), classnames);
+        try {
+            renamer.annotationArray();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * Returns a string representation of this object.
      */
     public String toString() {
         Annotation[] a = getAnnotations();
-        StringBuffer sbuf = new StringBuffer();
+        StringBuilder sbuf = new StringBuilder();
         int i = 0;
         while (i < a.length) {
             sbuf.append(a[i++].toString());
@@ -341,12 +361,12 @@ public class AnnotationsAttribute extends AttributeInfo {
             if (tag == 'e') {
                 int typeNameIndex = ByteArray.readU16bit(info, pos + 1);
                 int constNameIndex = ByteArray.readU16bit(info, pos + 3);
-                enumMemberValue(typeNameIndex, constNameIndex);
+                enumMemberValue(pos, typeNameIndex, constNameIndex);
                 return pos + 5;
             }
             else if (tag == 'c') {
                 int index = ByteArray.readU16bit(info, pos + 1);
-                classMemberValue(index);
+                classMemberValue(pos, index);
                 return pos + 3;
             }
             else if (tag == '@')
@@ -364,11 +384,11 @@ public class AnnotationsAttribute extends AttributeInfo {
 
         void constValueMember(int tag, int index) throws Exception {}
 
-        void enumMemberValue(int typeNameIndex, int constNameIndex)
+        void enumMemberValue(int pos, int typeNameIndex, int constNameIndex)
             throws Exception {
         }
 
-        void classMemberValue(int index) throws Exception {}
+        void classMemberValue(int pos, int index) throws Exception {}
 
         int annotationMemberValue(int pos) throws Exception {
             return annotation(pos);
@@ -383,6 +403,52 @@ public class AnnotationsAttribute extends AttributeInfo {
         }
     }
 
+    static class Renamer extends Walker {
+        ConstPool cpool;
+        Map classnames;
+
+        /**
+         * Constructs a renamer.  It renames some class names
+         * into the new names specified by <code>map</code>.
+         *
+         * @param info      the annotations attribute.
+         * @param cp        the constant pool.
+         * @param map       pairs of replaced and substituted class names.
+         *                  It can be null.
+         */
+        Renamer(byte[] info, ConstPool cp, Map map) {
+            super(info);
+            cpool = cp;
+            classnames = map;
+        }
+
+        int annotation(int pos, int type, int numPairs) throws Exception {
+            renameType(pos - 4, type);
+            return super.annotation(pos, type, numPairs);
+        }
+
+        void enumMemberValue(int pos, int typeNameIndex, int constNameIndex)
+            throws Exception
+        {
+            renameType(pos + 1, typeNameIndex);
+            super.enumMemberValue(pos, typeNameIndex, constNameIndex);
+        }
+
+        void classMemberValue(int pos, int index) throws Exception {
+            renameType(pos + 1, index);
+            super.classMemberValue(pos, index);
+        }
+
+        private void renameType(int pos, int index) {
+            String name = cpool.getUtf8Info(index);
+            String newName = Descriptor.rename(name, classnames);
+            if (!name.equals(newName)) {
+                int index2 = cpool.addUtf8Info(newName);
+                ByteArray.write16bit(index2, info, pos);
+            }
+        }
+    }
+
     static class Copier extends Walker {
         ByteArrayOutputStream output;
         AnnotationsWriter writer;
@@ -425,7 +491,7 @@ public class AnnotationsAttribute extends AttributeInfo {
         }
 
         int annotation(int pos, int type, int numPairs) throws Exception {
-            writer.annotation(copy(type), numPairs);
+            writer.annotation(copyType(type), numPairs);
             return super.annotation(pos, type, numPairs);
         }
 
@@ -439,16 +505,16 @@ public class AnnotationsAttribute extends AttributeInfo {
             super.constValueMember(tag, index);
         }
 
-        void enumMemberValue(int typeNameIndex, int constNameIndex)
+        void enumMemberValue(int pos, int typeNameIndex, int constNameIndex)
             throws Exception
         {
-            writer.enumConstValue(copy(typeNameIndex), copy(constNameIndex));
-            super.enumMemberValue(typeNameIndex, constNameIndex);
+            writer.enumConstValue(copyType(typeNameIndex), copy(constNameIndex));
+            super.enumMemberValue(pos, typeNameIndex, constNameIndex);
         }
 
-        void classMemberValue(int index) throws Exception {
-            writer.classInfoIndex(copy(index));
-            super.classMemberValue(index);
+        void classMemberValue(int pos, int index) throws Exception {
+            writer.classInfoIndex(copyType(index));
+            super.classMemberValue(pos, index);
         }
 
         int annotationMemberValue(int pos) throws Exception {
@@ -473,6 +539,22 @@ public class AnnotationsAttribute extends AttributeInfo {
         int copy(int srcIndex) {
             return srcPool.copy(srcIndex, destPool, classnames);
         }
+
+        /**
+         * Copies a constant pool entry into the destination constant pool
+         * and returns the index of the copied entry.  That entry must be
+         * a Utf8Info representing a class name in the L<class name>; form.
+         *
+         * @param srcIndex  the index of the copied entry into the source
+         *                  constant pool.
+         * @return          the index of the copied item into the destination
+         *                  constant pool.
+         */
+        int copyType(int srcIndex) {
+            String name = srcPool.getUtf8Info(srcIndex);
+            String newName = Descriptor.rename(name, classnames);
+            return destPool.addUtf8Info(newName);
+        }
     }
 
     static class Parser extends Walker {
@@ -580,17 +662,17 @@ public class AnnotationsAttribute extends AttributeInfo {
             super.constValueMember(tag, index);
         }
 
-        void enumMemberValue(int typeNameIndex, int constNameIndex)
+        void enumMemberValue(int pos, int typeNameIndex, int constNameIndex)
             throws Exception
         {
             currentMember = new EnumMemberValue(typeNameIndex,
                                               constNameIndex, pool);
-            super.enumMemberValue(typeNameIndex, constNameIndex);
+            super.enumMemberValue(pos, typeNameIndex, constNameIndex);
         }
 
-        void classMemberValue(int index) throws Exception {
+        void classMemberValue(int pos, int index) throws Exception {
             currentMember = new ClassMemberValue(index, pool);
-            super.classMemberValue(index);
+            super.classMemberValue(pos, index);
         }
 
         int annotationMemberValue(int pos) throws Exception {
index c7bcf149b9e4e1aebce63b2653df2dc05b0e8143..29c950acc6f6a0b1b4a91341de2f334e21d02756 100644 (file)
@@ -251,8 +251,8 @@ public class AttributeInfo {
 
     /* The following two methods are used to implement
      * ClassFile.renameClass().
-     * Only CodeAttribute and LocalVariableAttribute override
-     * this method.
+     * Only CodeAttribute, LocalVariableAttribute, and
+     * AnnotationsAttribute override these methods.
      */
     void renameClass(String oldname, String newname) {}
     void renameClass(Map classnames) {}
index 59834114efbbfa3984d9a2192d54c88e0e2ad28d..08078dc0f7550e1ba865855e07a4949e014f9eb9 100644 (file)
@@ -111,6 +111,9 @@ public class ClassFilePrinter {
             else if (ai instanceof AnnotationsAttribute) {
                 out.println("annnotation: " + ai.toString());
             }
+            else if (ai instanceof ParameterAnnotationsAttribute) {
+                out.println("parameter annnotations: " + ai.toString());
+            }
             else if (ai instanceof StackMapTable) {
                 out.println("<stack map table begin>");
                 StackMapTable.Printer.print((StackMapTable)ai, out);
index 2fd5a7140681be523109bf11aeb6309764997df3..6638642921b46c99ef893a4aa7dea90d1969f6cb 100644 (file)
@@ -15,6 +15,7 @@
 
 package javassist.bytecode;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.io.IOException;
 import java.io.DataInputStream;
@@ -22,6 +23,7 @@ import java.io.ByteArrayOutputStream;
 
 import javassist.bytecode.AnnotationsAttribute.Copier;
 import javassist.bytecode.AnnotationsAttribute.Parser;
+import javassist.bytecode.AnnotationsAttribute.Renamer;
 import javassist.bytecode.annotation.*;
 
 /**
@@ -164,4 +166,47 @@ public class ParameterAnnotationsAttribute extends AttributeInfo {
 
         set(output.toByteArray());
     }
+
+    /**
+     * @param oldname       a JVM class name.
+     * @param newname       a JVM class name.
+     */
+    void renameClass(String oldname, String newname) {
+        HashMap map = new HashMap();
+        map.put(oldname, newname);
+        renameClass(map);
+    }
+
+    void renameClass(Map classnames) {
+        Renamer renamer = new Renamer(info, getConstPool(), classnames);
+        try {
+            renamer.parameters();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Returns a string representation of this object.
+     */
+    public String toString() {
+        Annotation[][] aa = getAnnotations();
+        StringBuilder sbuf = new StringBuilder();
+        int k = 0;
+        while (k < aa.length) {
+            Annotation[] a = aa[k++]; 
+            int i = 0;
+            while (i < a.length) {
+                sbuf.append(a[i++].toString());
+                if (i != a.length)
+                    sbuf.append(" ");
+            }
+
+            if (k != aa.length)
+                sbuf.append(", ");
+        }
+
+        return sbuf.toString();
+
+    }
 }