You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/04/14 00:22:42 UTC

svn commit: r1091936 - in /tapestry/tapestry5/trunk: plastic/src/main/java/org/apache/tapestry5/internal/plastic/ plastic/src/main/java/org/apache/tapestry5/plastic/ tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/

Author: hlship
Date: Wed Apr 13 22:22:41 2011
New Revision: 1091936

URL: http://svn.apache.org/viewvc?rev=1091936&view=rev
Log:
TAP5-853: Add generic signatures to PlasticClassTransformation and ClassInstantiator

Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java Wed Apr 13 22:22:41 2011
@@ -22,11 +22,11 @@ import org.apache.tapestry5.plastic.Clas
 import org.apache.tapestry5.plastic.InstanceContext;
 
 @SuppressWarnings("all")
-public class ClassInstantiatorImpl implements ClassInstantiator, InstanceContext
+public class ClassInstantiatorImpl<T> implements ClassInstantiator<T>, InstanceContext
 {
     private final Class clazz;
 
-    private final Constructor ctor;
+    private final Constructor<T> ctor;
 
     private final StaticContext staticContext;
 
@@ -35,7 +35,7 @@ public class ClassInstantiatorImpl imple
 
     private final Map instanceContextMap;
 
-    ClassInstantiatorImpl(Class clazz, Constructor ctor, StaticContext staticContext)
+    ClassInstantiatorImpl(Class<T> clazz, Constructor ctor, StaticContext staticContext)
     {
         this(clazz, ctor, staticContext, null);
     }
@@ -48,7 +48,7 @@ public class ClassInstantiatorImpl imple
         this.instanceContextMap = instanceContextMap;
     }
 
-    public <T> ClassInstantiator with(Class<T> valueType, T instanceContextValue)
+    public <V> ClassInstantiator<T> with(Class<V> valueType, V instanceContextValue)
     {
         assert valueType != null;
         assert instanceContextValue != null;
@@ -82,7 +82,7 @@ public class ClassInstantiatorImpl imple
         return instanceContextMap == null ? null : valueType.cast(instanceContextMap.get(valueType));
     }
 
-    public Object newInstance()
+    public T newInstance()
     {
         try
         {
@@ -95,7 +95,7 @@ public class ClassInstantiatorImpl imple
         }
     }
 
-    public Class<?> getInstanceType()
+    public Class<T> getInstanceType()
     {
         return clazz;
     }

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java Wed Apr 13 22:22:41 2011
@@ -22,6 +22,7 @@ import org.apache.tapestry5.plastic.Inst
 import org.apache.tapestry5.plastic.InstructionBuilderCallback;
 import org.apache.tapestry5.plastic.MethodDescription;
 import org.apache.tapestry5.plastic.PlasticField;
+import org.apache.tapestry5.plastic.PlasticMethod;
 import org.apache.tapestry5.plastic.PlasticUtils;
 import org.apache.tapestry5.plastic.SwitchCallback;
 import org.apache.tapestry5.plastic.TryCatchCallback;
@@ -146,6 +147,18 @@ public class InstructionBuilderImpl exte
         return this;
     }
 
+    public InstructionBuilder invokeVirtual(PlasticMethod method)
+    {
+        check();
+
+        assert method != null;
+
+        MethodDescription description = method.getDescription();
+
+        return invokeVirtual(method.getPlasticClass().getClassName(), description.returnType, description.methodName,
+                description.argumentTypes);
+    }
+
     public InstructionBuilder invokeVirtual(String className, String returnType, String methodName,
             String... argumentTypes)
     {

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java Wed Apr 13 22:22:41 2011
@@ -183,6 +183,13 @@ public class PlasticClassImpl extends Lo
             return String.format("PlasticMethod[%s in class %s]", description, className);
         }
 
+        public PlasticClass getPlasticClass()
+        {
+            check();
+
+            return PlasticClassImpl.this;
+        }
+
         public MethodDescription getDescription()
         {
             check();
@@ -1769,6 +1776,11 @@ public class PlasticClassImpl extends Lo
     {
         check();
 
+        if (Modifier.isAbstract(description.modifiers))
+        {
+            description = description.withModifiers(description.modifiers & ~ACC_ABSTRACT);
+        }
+
         PlasticMethod result = description2method.get(description);
 
         if (result == null)
@@ -1779,7 +1791,7 @@ public class PlasticClassImpl extends Lo
         }
 
         methodNames.add(description.methodName);
-        
+
         // Note that is it not necessary to add the new MethodNode to
         // fieldTransformMethods (the default implementations provided by introduceMethod() do not
         // ever access instance fields) ... unless the caller invokes changeImplementation().
@@ -1787,11 +1799,20 @@ public class PlasticClassImpl extends Lo
         return result;
     }
 
+    public PlasticMethod introduceMethod(MethodDescription description, InstructionBuilderCallback callback)
+    {
+        check();
+
+        // TODO: optimize this so that a default implementation is not created.
+
+        return introduceMethod(description).changeImplementation(callback);
+    }
+
     public PlasticMethod introduceMethod(Method method)
     {
         check();
 
-        return introduceMethod(new MethodDescription(method).withModifiers(method.getModifiers() & ~Modifier.ABSTRACT));
+        return introduceMethod(new MethodDescription(method));
     }
 
     private void addMethod(MethodNode methodNode)
@@ -1803,9 +1824,9 @@ public class PlasticClassImpl extends Lo
 
     private PlasticMethod createNewMethod(MethodDescription description)
     {
-        if (Modifier.isAbstract(description.modifiers) || Modifier.isStatic(description.modifiers))
+        if (Modifier.isStatic(description.modifiers))
             throw new IllegalArgumentException(String.format(
-                    "Unable to introduce method '%s' into class %s: introduced methods may not be abstract or static.",
+                    "Unable to introduce method '%s' into class %s: introduced methods may not be static.",
                     description, className));
 
         String desc = nameCache.toDesc(description);
@@ -2215,7 +2236,7 @@ public class PlasticClassImpl extends Lo
 
         if (!isMethodImplemented(TO_STRING_METHOD_DESCRIPTION))
         {
-            introduceMethod(TO_STRING_METHOD_DESCRIPTION).changeImplementation(new InstructionBuilderCallback()
+            introduceMethod(TO_STRING_METHOD_DESCRIPTION, new InstructionBuilderCallback()
             {
                 public void doBuild(InstructionBuilder builder)
                 {

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java Wed Apr 13 22:22:41 2011
@@ -18,12 +18,12 @@ package org.apache.tapestry5.plastic;
  * The end result of a class transformation is a ClassInstantiator that can be used to
  * instantiate an instance of the transformed class.
  */
-public interface ClassInstantiator
+public interface ClassInstantiator<T>
 {
     /**
      * Creates and returns a new instance of the transformed class.
      */
-    Object newInstance();
+    T newInstance();
 
     /**
      * Returns a <em>new</em> instantiator that adds the indicated value to the
@@ -38,5 +38,5 @@ public interface ClassInstantiator
      * @throws IllegalStateException
      *             if a value of the given value type has already been stored
      */
-    <T> ClassInstantiator with(Class<T> valueType, T instanceContextValue);
+    <V> ClassInstantiator<T> with(Class<V> valueType, V instanceContextValue);
 }

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java Wed Apr 13 22:22:41 2011
@@ -83,6 +83,9 @@ public interface InstructionBuilder
     @Opcodes("INVOKEVIRTUAL")
     InstructionBuilder invokeVirtual(String className, String returnType, String methodName, String... argumentTypes);
 
+    @Opcodes("INVOKEVIRTUAL")
+    InstructionBuilder invokeVirtual(PlasticMethod method);
+    
     /**
      * Invokes a standard virtual method.
      */

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java Wed Apr 13 22:22:41 2011
@@ -115,6 +115,9 @@ public interface PlasticClass extends An
      * implemented in a <em>transformed</em> super class, the the default behavior is to invoke that method and return
      * its value. Otherwise, the default behavior is to ignore parameters and return 0, false, or null. Void methods
      * will invoke the super-class implementation (if it exists) and return no value.
+     * <p>
+     * It is allowed for the method description to indicate an abstract method; however the abstract flag will be
+     * removed, and a non-abstract method will be created.
      * 
      * @param description
      *            describes the method name, visibility, return value, etc.
@@ -125,6 +128,23 @@ public interface PlasticClass extends An
     PlasticMethod introduceMethod(MethodDescription description);
 
     /**
+     * Returns an existing method declared in this class, or introduces a new method into this class.
+     * The method is created with default behavior.
+     * <p>
+     * It is allowed for the method description to indicate an abstract method; however the abstract flag will be
+     * removed, and a non-abstract method will be created.
+     * 
+     * @param description
+     *            describes the method name, visibility, return value, etc.
+     * @param callback
+     *            used to create the implementation of the method
+     * @return a new (or previously created) PlasticMethod for the method
+     * @throws IllegalArgumentException
+     *             if the method is abstract or static
+     */
+    PlasticMethod introduceMethod(MethodDescription description, InstructionBuilderCallback callback);
+
+    /**
      * A convenience that creates a {@link MethodDescription} from the Method and introduces that. This is often
      * invoked when walking the methods of an interface and introducing each of those methods.
      * <p>

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java Wed Apr 13 22:22:41 2011
@@ -14,7 +14,7 @@
 
 package org.apache.tapestry5.plastic;
 
-public interface PlasticClassTransformation
+public interface PlasticClassTransformation<T>
 {
     /**
      * Returns the PlasticClass being transformed.
@@ -31,5 +31,5 @@ public interface PlasticClassTransformat
      * The returned ClassInstantiator has an empty {@link InstanceContext} map. Use
      * {@link ClassInstantiator#with(Class, Object)} to create a new ClassInstantiator with new InstanceContext entries.
      */
-    ClassInstantiator createInstantiator();
+    ClassInstantiator<T> createInstantiator();
 }

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java Wed Apr 13 22:22:41 2011
@@ -25,6 +25,7 @@ import org.apache.tapestry5.internal.pla
  * Manages the internal class loaders and other logics necessary to load and transform existing classes,
  * or to create new classes dynamically at runtime.
  */
+@SuppressWarnings("unchecked")
 public class PlasticManager
 {
     private final PlasticClassPool pool;
@@ -92,7 +93,7 @@ public class PlasticManager
      * 
      * @throws ClassNotFoundException
      */
-    PlasticClassTransformation getPlasticClass(String className) throws ClassNotFoundException
+    <T> PlasticClassTransformation<T> getPlasticClass(String className) throws ClassNotFoundException
     {
         assert PlasticInternalUtils.isNonBlank(className);
 
@@ -110,7 +111,7 @@ public class PlasticManager
      * @throws IllegalArgumentException
      *             if the class is not a transformed class
      */
-    public ClassInstantiator getClassInstantiator(String className)
+    public <T> ClassInstantiator<T> getClassInstantiator(String className)
     {
         return pool.getClassInstantiator(className);
     }
@@ -124,7 +125,7 @@ public class PlasticManager
      *            used to configure the new class
      * @return the instantiator, which allows instances of the new class to be created
      */
-    public ClassInstantiator createClass(Class baseClass, PlasticClassTransformer callback)
+    public <T> ClassInstantiator<T> createClass(Class<T> baseClass, PlasticClassTransformer callback)
     {
         assert baseClass != null;
         assert callback != null;
@@ -135,7 +136,7 @@ public class PlasticManager
 
         String name = String.format("$PlasticProxy$%s_%s", baseClass.getSimpleName(), PlasticUtils.nextUID());
 
-        PlasticClassTransformation transformation = pool.createTransformation(baseClass.getName(), name);
+        PlasticClassTransformation<T> transformation = pool.createTransformation(baseClass.getName(), name);
 
         callback.transform(transformation.getPlasticClass());
 
@@ -152,11 +153,11 @@ public class PlasticManager
      * @return the instantiator, which allows instances of the new class to be created
      * @see #createProxyTransformation(Class)
      */
-    public ClassInstantiator createProxy(Class interfaceType, PlasticClassTransformer callback)
+    public <T> ClassInstantiator<T> createProxy(Class<T> interfaceType, PlasticClassTransformer callback)
     {
         assert callback != null;
 
-        PlasticClassTransformation transformation = createProxyTransformation(interfaceType);
+        PlasticClassTransformation<T> transformation = createProxyTransformation(interfaceType);
 
         callback.transform(transformation.getPlasticClass());
 
@@ -172,7 +173,7 @@ public class PlasticManager
      *            class proxy will extend from
      * @return transformation from which an instantiator may be created
      */
-    public PlasticClassTransformation createProxyTransformation(Class interfaceType)
+    public <T> PlasticClassTransformation<T> createProxyTransformation(Class interfaceType)
     {
         assert interfaceType != null;
 
@@ -183,7 +184,7 @@ public class PlasticManager
 
         String name = String.format("$PlasticProxy$%s_%s", interfaceType.getSimpleName(), PlasticUtils.nextUID());
 
-        PlasticClassTransformation result = pool.createTransformation("java.lang.Object", name);
+        PlasticClassTransformation<T> result = pool.createTransformation("java.lang.Object", name);
 
         result.getPlasticClass().introduceInterface(interfaceType);
 

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java Wed Apr 13 22:22:41 2011
@@ -24,6 +24,9 @@ import java.util.List;
  */
 public interface PlasticMethod extends AnnotationAccess
 {
+    /** Returns the PlasticClass containing this method. */
+    PlasticClass getPlasticClass();
+
     /**
      * Returns a representation of the method's name, return value, argument types, etc.
      */

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java Wed Apr 13 22:22:41 2011
@@ -47,7 +47,7 @@ public interface PlasticProxyFactory
      *            configures the proxy
      * @return instantiator that can be used to create an instance of the proxy class
      */
-    ClassInstantiator createProxy(Class interfaceType, PlasticClassTransformer callback);
+    <T> ClassInstantiator<T> createProxy(Class<T> interfaceType, PlasticClassTransformer callback);
 
     /**
      * Creates the underlying {@link PlasticClassTransformation} for an interface proxy. This should only be
@@ -58,7 +58,7 @@ public interface PlasticProxyFactory
      *            class proxy will extend from
      * @return transformation from which an instantiator may be created
      */
-    PlasticClassTransformation createProxyTransformation(Class interfaceType);
+    <T> PlasticClassTransformation<T> createProxyTransformation(Class<T> interfaceType);
 
     /**
      * Creates a proxy instance that delegates all methods through a corresponding