]> source.dussan.org Git - javassist.git/commitdiff
implemented ClassPool.makeClassIfNew()
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 11 Sep 2008 10:40:08 +0000 (10:40 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Thu, 11 Sep 2008 10:40:08 +0000 (10:40 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@457 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/META-INF/MANIFEST.MF
src/main/javassist/ClassPool.java
src/main/javassist/CtClass.java

index a1310be65c0b8a660b77bde72ed47e0c6ab345ee..0dbd327a35b8e6bd7d79d0b9582c5c3cc68257ee 100644 (file)
@@ -283,6 +283,7 @@ see javassist.Dump.
 
 <p>-version 3.9
 <ul>
+       <li>ClassPool.makeClassIfNew(InputStream) was implemented.
        <li>CtNewMethod.wrapped(..) and CtNewConstructor.wrapped(..)
        implicitly append a method like _added_m$0.
        This method now has a synthetic attribute.
index 65b6a928a34997318b2b236e3e0fdc76d45893f1..1dea24d3fa8ce645b9dc295c100abb086a3305a1 100644 (file)
@@ -2,7 +2,7 @@ Manifest-Version: 1.1
 Specification-Title: Javassist
 Created-By: Shigeru Chiba, Tokyo Institute of Technology
 Specification-Vendor: Shigeru Chiba, Tokyo Institute of Technology
-Specification-Version: 3.8.1.GA
+Specification-Version: 3.9.0.GA
 Main-Class: javassist.CtClass
 
 Name: javassist/
index 2db2009a22afd0f66fdf70577638c2efbb97e6bd..f802ed6ebbfba277ca7da1bd1168065430426ed0 100644 (file)
@@ -547,6 +547,8 @@ public class ClassPool {
      * This method throws an exception if the class is already frozen or
      * if this class pool cannot edit the class since it is in a parent
      * class pool.
+     *
+     * @see checkNotExists(String)
      */
     void checkNotFrozen(String classname) throws RuntimeException {
         CtClass clazz = getCached(classname);
@@ -567,6 +569,25 @@ public class ClassPool {
                                         + ": frozen class (cannot edit)");
     }
 
+    /*
+     * This method returns null if this or its parent class pool does
+     * not contain a CtClass object with the class name.
+     *
+     * @see checkNotFrozen(String)
+     */
+    CtClass checkNotExists(String classname) {
+        CtClass clazz = getCached(classname);
+        if (clazz == null)
+            if (!childFirstLookup && parent != null) {
+                try {
+                    clazz = parent.get0(classname, true);
+                }
+                catch (NotFoundException e) {}
+            }
+
+        return clazz;
+    }
+
     /* for CtClassType.getClassFile2().  Don't delegate to the parent.
      */
     InputStream openClassfile(String classname) throws NotFoundException {
@@ -628,6 +649,7 @@ public class ClassPool {
      * @param classfile class file.
      * @throws RuntimeException if there is a frozen class with the
      *                          the same name.
+     * @see #makeClassIfNew(InputStream)
      * @see javassist.ByteArrayClassPath
      */
     public CtClass makeClass(InputStream classfile)
@@ -665,6 +687,38 @@ public class ClassPool {
         return clazz;
     }
 
+    /**
+     * Creates a new class (or interface) from the given class file.
+     * If there already exists a class with the same name, this method
+     * returns the existing class; a new class is never created from
+     * the given class file.
+     *
+     * <p>This method is used for creating a <code>CtClass</code> object
+     * directly from a class file.  The qualified class name is obtained
+     * from the class file; you do not have to explicitly give the name.
+     *
+     * @param classfile             the class file.
+     * @see #makeClass(InputStream)
+     * @see javassist.ByteArrayClassPath
+     * @since 3.9
+     */
+    public CtClass makeClassIfNew(InputStream classfile)
+        throws IOException, RuntimeException
+    {
+        compress();
+        classfile = new BufferedInputStream(classfile);
+        CtClass clazz = new CtClassType(classfile, this);
+        clazz.checkModify();
+        String classname = clazz.getName();
+        CtClass found = checkNotExists(classname);
+        if (found != null)
+            return found;
+        else {
+            cacheCtClass(classname, clazz, true);
+            return clazz;
+        }
+    }
+
     /**
      * Creates a new public class.
      * If there already exists a class with the same name, the new class
index 554b89234fe7f89d114a39aa98290c4ee2d69460..21d5ab0e0d13b669ad62d6010f269c356e47851f 100644 (file)
@@ -52,7 +52,7 @@ public abstract class CtClass {
     /**
      * The version number of this release.
      */
-    public static final String version = "3.8.1.GA";
+    public static final String version = "3.9.0.GA";
 
     /**
      * Prints the version number and the copyright notice.