Author: hlship
Date: Wed Apr  6 19:10:26 2011
New Revision: 1089570

URL: http://svn.apache.org/viewvc?rev=1089570&view=rev
Log:
TAP5-853: Allow for creating a transformation for a proxy

Split PlasticClassTransformation into two interfaces, make one public and the 
other internal, and introduce PlasticManager.createProxyTransformation()

Added:
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InternalPlasticClassTransformation.java
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
      - copied, changed from r1089569, 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassTransformation.java
Removed:
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassTransformation.java
Modified:
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
    
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java

Added: 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InternalPlasticClassTransformation.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InternalPlasticClassTransformation.java?rev=1089570&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InternalPlasticClassTransformation.java
 (added)
+++ 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InternalPlasticClassTransformation.java
 Wed Apr  6 19:10:26 2011
@@ -0,0 +1,26 @@
+// Copyright 2011 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.plastic;
+
+import org.apache.tapestry5.plastic.PlasticClassTransformation;
+
+public interface InternalPlasticClassTransformation extends 
PlasticClassTransformation
+{
+    /*
+     * Only invokable after {@link #createInstantiator()}, returns the 
transformed Class instance, as loaded
+     * by a {@link PlasticClassLoader}.
+     */
+    Class<?> getTransformedClass();
+}

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=1089570&r1=1089569&r2=1089570&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  6 19:10:26 2011
@@ -64,7 +64,7 @@ import org.objectweb.asm.tree.MethodNode
 import org.objectweb.asm.tree.VarInsnNode;
 
 @SuppressWarnings("all")
-public class PlasticClassImpl extends Lockable implements PlasticClass, 
PlasticClassTransformation, Opcodes
+public class PlasticClassImpl extends Lockable implements PlasticClass, 
InternalPlasticClassTransformation, Opcodes
 {
     private static final String NOTHING_TO_VOID = "()V";
 

Modified: 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java?rev=1089570&r1=1089569&r2=1089570&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
 (original)
+++ 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java
 Wed Apr  6 19:10:26 2011
@@ -28,6 +28,7 @@ import java.util.Set;
 
 import org.apache.tapestry5.plastic.AnnotationAccess;
 import org.apache.tapestry5.plastic.ClassInstantiator;
+import org.apache.tapestry5.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.plastic.PlasticManagerDelegate;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;
@@ -236,7 +237,7 @@ public class PlasticClassPool implements
         // TODO: What about interfaces, enums, annotations, etc. ... they 
shouldn't be in the package, but
         // we should generate a reasonable error message.
 
-        PlasticClassTransformation transformation = 
getPlasticClassTransformation(className);
+        InternalPlasticClassTransformation transformation = 
getPlasticClassTransformation(className);
 
         delegate.transform(transformation.getPlasticClass());
 
@@ -261,7 +262,8 @@ public class PlasticClassPool implements
      * 
      * @throws ClassNotFoundException
      */
-    public PlasticClassTransformation getPlasticClassTransformation(String 
className) throws ClassNotFoundException
+    public InternalPlasticClassTransformation 
getPlasticClassTransformation(String className)
+            throws ClassNotFoundException
     {
         assert PlasticInternalUtils.isNonBlank(className);
 
@@ -272,7 +274,7 @@ public class PlasticClassPool implements
         return createTransformation(baseClassName, classNode);
     }
 
-    private PlasticClassTransformation createTransformation(String 
baseClassName, ClassNode classNode)
+    private InternalPlasticClassTransformation createTransformation(String 
baseClassName, ClassNode classNode)
             throws ClassNotFoundException
     {
         if (shouldInterceptClassLoading(baseClassName))

Copied: 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
 (from r1089569, 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassTransformation.java)
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java?p2=tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java&p1=tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassTransformation.java&r1=1089569&r2=1089570&rev=1089570&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassTransformation.java
 (original)
+++ 
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
 Wed Apr  6 19:10:26 2011
@@ -12,11 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.plastic;
-
-import org.apache.tapestry5.plastic.ClassInstantiator;
-import org.apache.tapestry5.plastic.InstanceContext;
-import org.apache.tapestry5.plastic.PlasticClass;
+package org.apache.tapestry5.plastic;
 
 public interface PlasticClassTransformation
 {
@@ -36,10 +32,4 @@ public interface PlasticClassTransformat
      * {@link ClassInstantiator#with(Class, Object)} to create a new 
ClassInstantiator with new InstanceContext entries.
      */
     ClassInstantiator createInstantiator();
-
-    /**
-     * Only invokable after {@link #createInstantiator()}, returns the 
transformed Class instance, as loaded
-     * by a {@link PlasticClassLoader}.
-     */
-    Class<?> getTransformedClass();
 }

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=1089570&r1=1089569&r2=1089570&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:26 2011
@@ -19,7 +19,6 @@ import java.util.Set;
 
 import org.apache.tapestry5.internal.plastic.NoopDelegate;
 import org.apache.tapestry5.internal.plastic.PlasticClassPool;
-import org.apache.tapestry5.internal.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
 
 /**
@@ -151,12 +150,32 @@ public class PlasticManager
      * @param callback
      *            used to configure the new class
      * @return the instantiator, which allows instances of the new class to be 
created
+     * @see #createProxyTransformation(Class)
      */
     public ClassInstantiator createProxy(Class interfaceType, 
PlasticClassTransformer callback)
     {
-        assert interfaceType != null;
         assert callback != null;
 
+        PlasticClassTransformation transformation = 
createProxyTransformation(interfaceType);
+
+        callback.transform(transformation.getPlasticClass());
+
+        return transformation.createInstantiator();
+    }
+
+    /**
+     * Creates the underlying {@link PlasticClassTransformation} for an 
interface proxy. This should only be
+     * used in the cases where encapsulating the PlasticClass construction 
into a {@linkplain PlasticClassTransformer
+     * callback} is not feasible (which is the case for some of the older APIs 
inside Tapestry IoC).
+     * 
+     * @param interfaceType
+     *            class proxy will extend from
+     * @return transformation from which an instantiator may be created
+     */
+    public PlasticClassTransformation createProxyTransformation(Class 
interfaceType)
+    {
+        assert interfaceType != null;
+
         if (!interfaceType.isInterface())
             throw new IllegalArgumentException(String.format(
                     "Class %s is not an interface; proxies may only be created 
for interfaces.",
@@ -164,14 +183,10 @@ public class PlasticManager
 
         String name = String.format("$PlasticProxy$%s_%s", 
interfaceType.getSimpleName(), PlasticUtils.nextUID());
 
-        PlasticClassTransformation transformation = 
pool.createTransformation("java.lang.Object", name);
-
-        PlasticClass plasticClass = transformation.getPlasticClass();
+        PlasticClassTransformation result = 
pool.createTransformation("java.lang.Object", name);
 
-        plasticClass.introduceInterface(interfaceType);
+        result.getPlasticClass().introduceInterface(interfaceType);
 
-        callback.transform(plasticClass);
-
-        return transformation.createInstantiator();
+        return result;
     }
 }


Reply via email to