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."
+ }
+}