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;
}
}