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/06 21:10:17 UTC

svn commit: r1089567 - in /tapestry/tapestry5/trunk/plastic/src: main/java/org/apache/tapestry5/plastic/PlasticManager.java test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy

Author: hlship
Date: Wed Apr  6 19:10:16 2011
New Revision: 1089567

URL: http://svn.apache.org/viewvc?rev=1089567&view=rev
Log:
TAP5-853: Add new method to PlasticManager for creating a proper proxy from an interface

Added:
    tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy
Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java

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=1089567&r1=1089566&r2=1089567&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  6 19:10:16 2011
@@ -142,4 +142,36 @@ public class PlasticManager
 
         return transformation.createInstantiator();
     }
+
+    /**
+     * Creates an entirely new class, extending from the provided base class.
+     * 
+     * @param interfaceType
+     *            class to extend from, which must be a class, not an interface
+     * @param callback
+     *            used to configure the new class
+     * @return the instantiator, which allows instances of the new class to be created
+     */
+    public ClassInstantiator createProxy(Class interfaceType, PlasticClassTransformer callback)
+    {
+        assert interfaceType != null;
+        assert callback != null;
+
+        if (!interfaceType.isInterface())
+            throw new IllegalArgumentException(String.format(
+                    "Class %s is not an interface; proxies may only be created for interfaces.",
+                    interfaceType.getName()));
+
+        String name = String.format("$PlasticProxy$%s_%s", interfaceType.getSimpleName(), PlasticUtils.nextUID());
+
+        PlasticClassTransformation transformation = pool.createTransformation("java.lang.Object", name);
+
+        PlasticClass plasticClass = transformation.getPlasticClass();
+
+        plasticClass.introduceInterface(interfaceType);
+
+        callback.transform(plasticClass);
+
+        return transformation.createInstantiator();
+    }
 }

Added: tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy?rev=1089567&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy (added)
+++ tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ProxyCreation.groovy Wed Apr  6 19:10:16 2011
@@ -0,0 +1,49 @@
+package org.apache.tapestry5.plastic
+
+import spock.lang.Specification;
+
+class ProxyCreation extends Specification {
+    def "create a proxy"() {
+        setup:
+
+        def mgr = new PlasticManager()
+
+        Runnable r = Mock(Runnable)
+
+        def ins = mgr.createProxy(Runnable.class, {
+            def f = it.introduceField(Runnable.class, "delegate").inject(r)
+
+            it.introduceMethod(new MethodDescription("void", "run")).delegateTo(f)
+        } as PlasticClassTransformer)
+
+        when:
+
+        def proxy = ins.newInstance()
+
+        then:
+
+        assert proxy instanceof Runnable
+
+        when:
+
+        proxy.run()
+
+        then:
+
+        r.run()
+    }
+
+    def "type must be an interface"() {
+        setup:
+        def mgr = new PlasticManager()
+
+        when:
+
+        mgr.createProxy (String.class, {
+        } as PlasticClassTransformer)
+
+        then:
+        def e = thrown(IllegalArgumentException)
+        e.message == "Class java.lang.String is not an interface; proxies may only be created for interfaces."
+    }
+}