Author: hlship
Date: Sun Apr 10 01:54:49 2011
New Revision: 1090732

URL: http://svn.apache.org/viewvc?rev=1090732&view=rev
Log:
TAP5-853: Introduce a method on PlasticProxyFactory that creates a proxy 
instance from an interface type and an ObjectCreator

Modified:
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java?rev=1090732&r1=1090731&r2=1090732&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
 Sun Apr 10 01:54:49 2011
@@ -1,10 +1,21 @@
 package org.apache.tapestry5.ioc.internal.services;
 
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.apache.tapestry5.ioc.ObjectCreator;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
 import org.apache.tapestry5.plastic.ClassInstantiator;
+import org.apache.tapestry5.plastic.InstructionBuilder;
+import org.apache.tapestry5.plastic.InstructionBuilderCallback;
+import org.apache.tapestry5.plastic.MethodDescription;
+import org.apache.tapestry5.plastic.PlasticClass;
 import org.apache.tapestry5.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.plastic.PlasticClassTransformer;
+import org.apache.tapestry5.plastic.PlasticField;
 import org.apache.tapestry5.plastic.PlasticManager;
+import org.apache.tapestry5.plastic.PlasticMethod;
 
 public class PlasticProxyFactoryImpl implements PlasticProxyFactory
 {
@@ -30,4 +41,43 @@ public class PlasticProxyFactoryImpl imp
         return manager.createProxyTransformation(interfaceType);
     }
 
+    public <T> T createProxy(final Class<T> interfaceType, final 
ObjectCreator<T> creator, final String description)
+    {
+        assert creator != null;
+        assert InternalUtils.isNonBlank(description);
+
+        ClassInstantiator instantiator = createProxy(interfaceType, new 
PlasticClassTransformer()
+        {
+            public void transform(PlasticClass plasticClass)
+            {
+                final PlasticField objectCreatorField = 
plasticClass.introduceField(ObjectCreator.class, "creator")
+                        .inject(creator);
+
+                PlasticMethod delegateMethod = 
plasticClass.introducePrivateMethod(interfaceType.getName(), "delegate",
+                        null, null);
+
+                delegateMethod.changeImplementation(new 
InstructionBuilderCallback()
+                {
+                    public void doBuild(InstructionBuilder builder)
+                    {
+                        builder.loadThis().getField(objectCreatorField);
+                        builder.invoke(ObjectCreator.class, Object.class, 
"createObject");
+                        builder.checkcast(interfaceType).returnResult();
+                    }
+                });
+
+                for (Method method : interfaceType.getMethods())
+                {
+                    
plasticClass.introduceMethod(method).delegateTo(delegateMethod);
+                }
+
+                plasticClass.addToString(description);
+
+                // TODO: Copy annotations from delegate?
+            }
+        });
+
+        return interfaceType.cast(instantiator.newInstance());
+    }
+
 }

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=1090732&r1=1090731&r2=1090732&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
 Sun Apr 10 01:54:49 2011
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry5.ioc.services;
 
+import org.apache.tapestry5.ioc.ObjectCreator;
 import org.apache.tapestry5.plastic.ClassInstantiator;
 import org.apache.tapestry5.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.plastic.PlasticClassTransformer;
@@ -53,4 +54,22 @@ public interface PlasticProxyFactory
      * @return transformation from which an instantiator may be created
      */
     PlasticClassTransformation createProxyTransformation(Class interfaceType);
+
+    /**
+     * Creates a proxy instance that delegates all methods through a 
corresponding
+     * ObjectCreator. Each method invocation on the proxy will route through 
{@link ObjectCreator#createObject()} (the
+     * creator implementation may decide to
+     * cache the return value as appropriate).
+     * 
+     * @param <T>
+     *            type of proxy
+     * @param interfaceType
+     *            interface class for proxy
+     * @param creator
+     *            object responsible for creating the real object
+     * @param description
+     *            the <code>toString()</code> of the proxy
+     * @return proxy instance
+     */
+    <T> T createProxy(Class<T> interfaceType, ObjectCreator<T> creator, String 
description);
 }


Reply via email to