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/14 00:22:42 UTC
svn commit: r1091936 - in /tapestry/tapestry5/trunk:
plastic/src/main/java/org/apache/tapestry5/internal/plastic/
plastic/src/main/java/org/apache/tapestry5/plastic/
tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/
Author: hlship
Date: Wed Apr 13 22:22:41 2011
New Revision: 1091936
URL: http://svn.apache.org/viewvc?rev=1091936&view=rev
Log:
TAP5-853: Add generic signatures to PlasticClassTransformation and ClassInstantiator
Modified:
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticManager.java
tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/ClassInstantiatorImpl.java Wed Apr 13 22:22:41 2011
@@ -22,11 +22,11 @@ import org.apache.tapestry5.plastic.Clas
import org.apache.tapestry5.plastic.InstanceContext;
@SuppressWarnings("all")
-public class ClassInstantiatorImpl implements ClassInstantiator, InstanceContext
+public class ClassInstantiatorImpl<T> implements ClassInstantiator<T>, InstanceContext
{
private final Class clazz;
- private final Constructor ctor;
+ private final Constructor<T> ctor;
private final StaticContext staticContext;
@@ -35,7 +35,7 @@ public class ClassInstantiatorImpl imple
private final Map instanceContextMap;
- ClassInstantiatorImpl(Class clazz, Constructor ctor, StaticContext staticContext)
+ ClassInstantiatorImpl(Class<T> clazz, Constructor ctor, StaticContext staticContext)
{
this(clazz, ctor, staticContext, null);
}
@@ -48,7 +48,7 @@ public class ClassInstantiatorImpl imple
this.instanceContextMap = instanceContextMap;
}
- public <T> ClassInstantiator with(Class<T> valueType, T instanceContextValue)
+ public <V> ClassInstantiator<T> with(Class<V> valueType, V instanceContextValue)
{
assert valueType != null;
assert instanceContextValue != null;
@@ -82,7 +82,7 @@ public class ClassInstantiatorImpl imple
return instanceContextMap == null ? null : valueType.cast(instanceContextMap.get(valueType));
}
- public Object newInstance()
+ public T newInstance()
{
try
{
@@ -95,7 +95,7 @@ public class ClassInstantiatorImpl imple
}
}
- public Class<?> getInstanceType()
+ public Class<T> getInstanceType()
{
return clazz;
}
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java Wed Apr 13 22:22:41 2011
@@ -22,6 +22,7 @@ import org.apache.tapestry5.plastic.Inst
import org.apache.tapestry5.plastic.InstructionBuilderCallback;
import org.apache.tapestry5.plastic.MethodDescription;
import org.apache.tapestry5.plastic.PlasticField;
+import org.apache.tapestry5.plastic.PlasticMethod;
import org.apache.tapestry5.plastic.PlasticUtils;
import org.apache.tapestry5.plastic.SwitchCallback;
import org.apache.tapestry5.plastic.TryCatchCallback;
@@ -146,6 +147,18 @@ public class InstructionBuilderImpl exte
return this;
}
+ public InstructionBuilder invokeVirtual(PlasticMethod method)
+ {
+ check();
+
+ assert method != null;
+
+ MethodDescription description = method.getDescription();
+
+ return invokeVirtual(method.getPlasticClass().getClassName(), description.returnType, description.methodName,
+ description.argumentTypes);
+ }
+
public InstructionBuilder invokeVirtual(String className, String returnType, String methodName,
String... argumentTypes)
{
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=1091936&r1=1091935&r2=1091936&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 13 22:22:41 2011
@@ -183,6 +183,13 @@ public class PlasticClassImpl extends Lo
return String.format("PlasticMethod[%s in class %s]", description, className);
}
+ public PlasticClass getPlasticClass()
+ {
+ check();
+
+ return PlasticClassImpl.this;
+ }
+
public MethodDescription getDescription()
{
check();
@@ -1769,6 +1776,11 @@ public class PlasticClassImpl extends Lo
{
check();
+ if (Modifier.isAbstract(description.modifiers))
+ {
+ description = description.withModifiers(description.modifiers & ~ACC_ABSTRACT);
+ }
+
PlasticMethod result = description2method.get(description);
if (result == null)
@@ -1779,7 +1791,7 @@ public class PlasticClassImpl extends Lo
}
methodNames.add(description.methodName);
-
+
// Note that is it not necessary to add the new MethodNode to
// fieldTransformMethods (the default implementations provided by introduceMethod() do not
// ever access instance fields) ... unless the caller invokes changeImplementation().
@@ -1787,11 +1799,20 @@ public class PlasticClassImpl extends Lo
return result;
}
+ public PlasticMethod introduceMethod(MethodDescription description, InstructionBuilderCallback callback)
+ {
+ check();
+
+ // TODO: optimize this so that a default implementation is not created.
+
+ return introduceMethod(description).changeImplementation(callback);
+ }
+
public PlasticMethod introduceMethod(Method method)
{
check();
- return introduceMethod(new MethodDescription(method).withModifiers(method.getModifiers() & ~Modifier.ABSTRACT));
+ return introduceMethod(new MethodDescription(method));
}
private void addMethod(MethodNode methodNode)
@@ -1803,9 +1824,9 @@ public class PlasticClassImpl extends Lo
private PlasticMethod createNewMethod(MethodDescription description)
{
- if (Modifier.isAbstract(description.modifiers) || Modifier.isStatic(description.modifiers))
+ if (Modifier.isStatic(description.modifiers))
throw new IllegalArgumentException(String.format(
- "Unable to introduce method '%s' into class %s: introduced methods may not be abstract or static.",
+ "Unable to introduce method '%s' into class %s: introduced methods may not be static.",
description, className));
String desc = nameCache.toDesc(description);
@@ -2215,7 +2236,7 @@ public class PlasticClassImpl extends Lo
if (!isMethodImplemented(TO_STRING_METHOD_DESCRIPTION))
{
- introduceMethod(TO_STRING_METHOD_DESCRIPTION).changeImplementation(new InstructionBuilderCallback()
+ introduceMethod(TO_STRING_METHOD_DESCRIPTION, new InstructionBuilderCallback()
{
public void doBuild(InstructionBuilder builder)
{
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/ClassInstantiator.java Wed Apr 13 22:22:41 2011
@@ -18,12 +18,12 @@ package org.apache.tapestry5.plastic;
* The end result of a class transformation is a ClassInstantiator that can be used to
* instantiate an instance of the transformed class.
*/
-public interface ClassInstantiator
+public interface ClassInstantiator<T>
{
/**
* Creates and returns a new instance of the transformed class.
*/
- Object newInstance();
+ T newInstance();
/**
* Returns a <em>new</em> instantiator that adds the indicated value to the
@@ -38,5 +38,5 @@ public interface ClassInstantiator
* @throws IllegalStateException
* if a value of the given value type has already been stored
*/
- <T> ClassInstantiator with(Class<T> valueType, T instanceContextValue);
+ <V> ClassInstantiator<T> with(Class<V> valueType, V instanceContextValue);
}
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/InstructionBuilder.java Wed Apr 13 22:22:41 2011
@@ -83,6 +83,9 @@ public interface InstructionBuilder
@Opcodes("INVOKEVIRTUAL")
InstructionBuilder invokeVirtual(String className, String returnType, String methodName, String... argumentTypes);
+ @Opcodes("INVOKEVIRTUAL")
+ InstructionBuilder invokeVirtual(PlasticMethod method);
+
/**
* Invokes a standard virtual method.
*/
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClass.java Wed Apr 13 22:22:41 2011
@@ -115,6 +115,9 @@ public interface PlasticClass extends An
* implemented in a <em>transformed</em> super class, the the default behavior is to invoke that method and return
* its value. Otherwise, the default behavior is to ignore parameters and return 0, false, or null. Void methods
* will invoke the super-class implementation (if it exists) and return no value.
+ * <p>
+ * It is allowed for the method description to indicate an abstract method; however the abstract flag will be
+ * removed, and a non-abstract method will be created.
*
* @param description
* describes the method name, visibility, return value, etc.
@@ -125,6 +128,23 @@ public interface PlasticClass extends An
PlasticMethod introduceMethod(MethodDescription description);
/**
+ * Returns an existing method declared in this class, or introduces a new method into this class.
+ * The method is created with default behavior.
+ * <p>
+ * It is allowed for the method description to indicate an abstract method; however the abstract flag will be
+ * removed, and a non-abstract method will be created.
+ *
+ * @param description
+ * describes the method name, visibility, return value, etc.
+ * @param callback
+ * used to create the implementation of the method
+ * @return a new (or previously created) PlasticMethod for the method
+ * @throws IllegalArgumentException
+ * if the method is abstract or static
+ */
+ PlasticMethod introduceMethod(MethodDescription description, InstructionBuilderCallback callback);
+
+ /**
* A convenience that creates a {@link MethodDescription} from the Method and introduces that. This is often
* invoked when walking the methods of an interface and introducing each of those methods.
* <p>
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticClassTransformation.java Wed Apr 13 22:22:41 2011
@@ -14,7 +14,7 @@
package org.apache.tapestry5.plastic;
-public interface PlasticClassTransformation
+public interface PlasticClassTransformation<T>
{
/**
* Returns the PlasticClass being transformed.
@@ -31,5 +31,5 @@ public interface PlasticClassTransformat
* The returned ClassInstantiator has an empty {@link InstanceContext} map. Use
* {@link ClassInstantiator#with(Class, Object)} to create a new ClassInstantiator with new InstanceContext entries.
*/
- ClassInstantiator createInstantiator();
+ ClassInstantiator<T> createInstantiator();
}
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=1091936&r1=1091935&r2=1091936&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 13 22:22:41 2011
@@ -25,6 +25,7 @@ import org.apache.tapestry5.internal.pla
* Manages the internal class loaders and other logics necessary to load and transform existing classes,
* or to create new classes dynamically at runtime.
*/
+@SuppressWarnings("unchecked")
public class PlasticManager
{
private final PlasticClassPool pool;
@@ -92,7 +93,7 @@ public class PlasticManager
*
* @throws ClassNotFoundException
*/
- PlasticClassTransformation getPlasticClass(String className) throws ClassNotFoundException
+ <T> PlasticClassTransformation<T> getPlasticClass(String className) throws ClassNotFoundException
{
assert PlasticInternalUtils.isNonBlank(className);
@@ -110,7 +111,7 @@ public class PlasticManager
* @throws IllegalArgumentException
* if the class is not a transformed class
*/
- public ClassInstantiator getClassInstantiator(String className)
+ public <T> ClassInstantiator<T> getClassInstantiator(String className)
{
return pool.getClassInstantiator(className);
}
@@ -124,7 +125,7 @@ public class PlasticManager
* used to configure the new class
* @return the instantiator, which allows instances of the new class to be created
*/
- public ClassInstantiator createClass(Class baseClass, PlasticClassTransformer callback)
+ public <T> ClassInstantiator<T> createClass(Class<T> baseClass, PlasticClassTransformer callback)
{
assert baseClass != null;
assert callback != null;
@@ -135,7 +136,7 @@ public class PlasticManager
String name = String.format("$PlasticProxy$%s_%s", baseClass.getSimpleName(), PlasticUtils.nextUID());
- PlasticClassTransformation transformation = pool.createTransformation(baseClass.getName(), name);
+ PlasticClassTransformation<T> transformation = pool.createTransformation(baseClass.getName(), name);
callback.transform(transformation.getPlasticClass());
@@ -152,11 +153,11 @@ public class PlasticManager
* @return the instantiator, which allows instances of the new class to be created
* @see #createProxyTransformation(Class)
*/
- public ClassInstantiator createProxy(Class interfaceType, PlasticClassTransformer callback)
+ public <T> ClassInstantiator<T> createProxy(Class<T> interfaceType, PlasticClassTransformer callback)
{
assert callback != null;
- PlasticClassTransformation transformation = createProxyTransformation(interfaceType);
+ PlasticClassTransformation<T> transformation = createProxyTransformation(interfaceType);
callback.transform(transformation.getPlasticClass());
@@ -172,7 +173,7 @@ public class PlasticManager
* class proxy will extend from
* @return transformation from which an instantiator may be created
*/
- public PlasticClassTransformation createProxyTransformation(Class interfaceType)
+ public <T> PlasticClassTransformation<T> createProxyTransformation(Class interfaceType)
{
assert interfaceType != null;
@@ -183,7 +184,7 @@ public class PlasticManager
String name = String.format("$PlasticProxy$%s_%s", interfaceType.getSimpleName(), PlasticUtils.nextUID());
- PlasticClassTransformation result = pool.createTransformation("java.lang.Object", name);
+ PlasticClassTransformation<T> result = pool.createTransformation("java.lang.Object", name);
result.getPlasticClass().introduceInterface(interfaceType);
Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java?rev=1091936&r1=1091935&r2=1091936&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticMethod.java Wed Apr 13 22:22:41 2011
@@ -24,6 +24,9 @@ import java.util.List;
*/
public interface PlasticMethod extends AnnotationAccess
{
+ /** Returns the PlasticClass containing this method. */
+ PlasticClass getPlasticClass();
+
/**
* Returns a representation of the method's name, return value, argument types, etc.
*/
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=1091936&r1=1091935&r2=1091936&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 Wed Apr 13 22:22:41 2011
@@ -47,7 +47,7 @@ public interface PlasticProxyFactory
* configures the proxy
* @return instantiator that can be used to create an instance of the proxy class
*/
- ClassInstantiator createProxy(Class interfaceType, PlasticClassTransformer callback);
+ <T> ClassInstantiator<T> createProxy(Class<T> interfaceType, PlasticClassTransformer callback);
/**
* Creates the underlying {@link PlasticClassTransformation} for an interface proxy. This should only be
@@ -58,7 +58,7 @@ public interface PlasticProxyFactory
* class proxy will extend from
* @return transformation from which an instantiator may be created
*/
- PlasticClassTransformation createProxyTransformation(Class interfaceType);
+ <T> PlasticClassTransformation<T> createProxyTransformation(Class<T> interfaceType);
/**
* Creates a proxy instance that delegates all methods through a corresponding