Author: hlship
Date: Fri Apr 21 17:28:10 2006
New Revision: 396036
URL: http://svn.apache.org/viewcvs?rev=396036&view=rev
Log:
Add support for creating a component Instantiator instance
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformer.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformer.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformer.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformer.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformer.java
Fri Apr 21 17:28:10 2006
@@ -16,5 +16,6 @@
*/
void transformClass(CtClass ctClass);
- Instantiator findInstantiator(String classname);
+ /** Creates a new instantiator instance. */
+ Instantiator createInstantiator(Class componentClass);
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java
Fri Apr 21 17:28:10 2006
@@ -10,6 +10,7 @@
import org.apache.tapestry.transform.ClassTransformWorker;
import static org.apache.tapestry.util.CollectionFactory.newMap;
+import static org.apache.tapestry.util.Defense.notNull;
/**
* Implementation of [EMAIL PROTECTED]
org.apache.tapestry.internal.transform.ClassTransformer}.
@@ -23,12 +24,6 @@
private ClassTransformWorker _workers;
- public Instantiator findInstantiator(String classname)
- {
- // TODO Auto-generated method stub
- return null;
- }
-
public void transformClass(CtClass ctClass)
{
String classname = ctClass.getName();
@@ -51,6 +46,17 @@
transformation.finish();
_nameToClassTransformation.put(classname, transformation);
+ }
+
+ public Instantiator createInstantiator(Class componentClass)
+ {
+ String className = notNull(componentClass, "componentClass").getName();
+
+ InternalClassTransformation ct =
_nameToClassTransformation.get(className);
+
+ // TODO: if null ...
+
+ return ct.createInstantiator(componentClass);
}
/**
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java
Fri Apr 21 17:28:10 2006
@@ -26,7 +26,6 @@
import javassist.NotFoundException;
import javassist.Translator;
-import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.tapestry.util.Defense;
import static org.apache.tapestry.util.CollectionFactory.newMap;
@@ -50,7 +49,9 @@
private final Loader _loader;
- /** Map from FQCN to an object instantiator. */
+ private final ClassTransformer _transformer;
+
+ /** Map from class name to Instantiator. */
private final Map<String, Instantiator> _instantiatorMap = newMap();
/** @return the class loader used when loading enhanced/modified classes */
@@ -59,7 +60,7 @@
return _loader;
}
- ComponentInstantiatorSourceImpl(ClassLoader parent)
+ public ComponentInstantiatorSourceImpl(ClassLoader parent,
ClassTransformer transformer)
{
_parent = notNull(parent, "parent");
@@ -71,6 +72,8 @@
_loader = new Loader(_classPool);
+ _transformer = notNull(transformer, "transformer");
+
try
{
_loader.addTranslator(_classPool, this);
@@ -81,14 +84,6 @@
}
}
- /**
- * Uses the thread's context class loader.
- */
- public ComponentInstantiatorSourceImpl()
- {
- this(Thread.currentThread().getContextClassLoader());
- }
-
public void onLoad(ClassPool pool, String classname) throws
NotFoundException,
CannotCompileException
{
@@ -136,8 +131,8 @@
{
Class instanceClass = findClass(classname);
- result = new ReflectiveInstantiator(instanceClass, new Object[1]);
-
+ result = _transformer.createInstantiator(instanceClass);
+
_instantiatorMap.put(classname, result);
}
@@ -155,7 +150,7 @@
}
catch (ClassNotFoundException ex)
{
- throw new ApplicationRuntimeException(ex);
+ throw new RuntimeException(ex);
}
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
Fri Apr 21 17:28:10 2006
@@ -14,6 +14,7 @@
package org.apache.tapestry.internal.transform;
+import org.apache.tapestry.ResourceAware;
import org.apache.tapestry.internal.InternalComponentResources;
/**
@@ -21,14 +22,14 @@
* normal no-arguments constructor has been replaced with a constructor with
arguments; the
* instantiator will retain the necessary arguments and pass them to the
enhanced class'
* constructor.
- * <p>
- * TODO: Identify arguments to the instantiator itself and pass those along.
I.e., the
- * ComponentResources for the component.
*
* @author Howard M. Lewis Ship
*/
public interface Instantiator
{
- /** Instantiates and returns a new instance of the desired class. */
- Object newInstance(InternalComponentResources resources);
+ /**
+ * Instantiates and returns a new instance of the desired class. Component
classes are always
+ * modified so that they implement [EMAIL PROTECTED] ResourceAware} (and
often, other interfaces as well).
+ */
+ ResourceAware newInstance(InternalComponentResources resources);
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
Fri Apr 21 17:28:10 2006
@@ -27,7 +27,17 @@
{
/**
* Invoked after all [EMAIL PROTECTED] ClassTransformWorker}s have had
their chance to work over the
- * class. This performs any final operations for the class transformation.
+ * class. This performs any final operations for the class transformation,
which includes coming
+ * up with the final constructor method for the class.
*/
void finish();
+
+ /**
+ * Called (after [EMAIL PROTECTED] #finish()}) to construct an
instantiator for the component.
+ *
+ * @param componentClass
+ * the class to be instantiated
+ * @return the component's instantiator
+ */
+ Instantiator createInstantiator(Class componentClass);
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
Fri Apr 21 17:28:10 2006
@@ -580,7 +580,7 @@
return null;
}
- public String newField(int modifiers, String type, String suggestedName)
+ public String addField(int modifiers, String type, String suggestedName)
{
String fieldName = newMemberName(suggestedName);
@@ -613,7 +613,7 @@
// TODO: Probably doesn't handle arrays and primitives.
- String fieldName = newField(Modifier.PROTECTED, type.getName(),
suggestedName);
+ String fieldName = addField(Modifier.PROTECTED, type.getName(),
suggestedName);
_constructorArgs.add(new ConstructorArg(type, fieldName, value));
@@ -683,32 +683,27 @@
_meta.put(key, notBlank(value, "value"));
}
- public void addGetterMethod(String type, String methodName, String
fieldName)
+ public Instantiator createInstantiator(Class componentClass)
{
- try
- {
- CtClass ctType = _classPool.get(type);
+ String className = _ctClass.getName();
- CtMethod method = CtNewMethod.make(
- ctType,
- notBlank(methodName, "methodName"),
- null,
- null,
- "return " + fieldName + ";",
- _ctClass);
- _ctClass.addMethod(method);
+ if (!className.equals(componentClass.getName()))
+ throw new
IllegalArgumentException(TransformMessages.incorrectClassForInstantiator(
+ className,
+ componentClass));
- _addedMethods.add(method);
- }
- catch (NotFoundException ex)
- {
- throw new RuntimeException(ex);
- }
- catch (CannotCompileException ex)
+ Object[] parameters = new Object[_constructorArgs.size()];
+
+ // Skip the first constructor argument, it's always a placeholder
+ // for the InternalComponentResources instance that's provided
+ // later.
+
+ for (int i = 1; i < _constructorArgs.size(); i++)
{
- throw new RuntimeException(ex);
+ parameters[i] = _constructorArgs.get(i).getValue();
}
+ return new ReflectiveInstantiator(componentClass, parameters);
}
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
Fri Apr 21 17:28:10 2006
@@ -14,13 +14,13 @@
package org.apache.tapestry.internal.transform;
-import static org.apache.tapestry.util.Defense.notNull;
-
import java.lang.reflect.Constructor;
-import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.tapestry.ResourceAware;
import org.apache.tapestry.internal.InternalComponentResources;
+import static org.apache.tapestry.util.Defense.notNull;
+
/**
* Implementation of [EMAIL PROTECTED] Instantiator} based on a class, a list
of parameters to the class'
* constructor, and a instance of [EMAIL PROTECTED]
org.apache.tapestry.internal.InternalComponentResources}.
@@ -45,12 +45,12 @@
*/
ReflectiveInstantiator(Class instanceClass, Object[] constructorParameters)
{
+ _constructorParameters = notNull(constructorParameters,
"constructorParameters");
_constructor = findConstructor(
notNull(instanceClass, "instanceClass"),
constructorParameters.length);
- _constructorParameters = notNull(constructorParameters,
"constructorParameters");
}
static Constructor findConstructor(Class instanceClass, int parameterCount)
@@ -64,19 +64,21 @@
throw new
RuntimeException(TransformMessages.noConstructorFound(instanceClass));
}
- public Object newInstance(InternalComponentResources resources)
+ public ResourceAware newInstance(InternalComponentResources resources)
{
+ // Hm. Is it faster to clone the parameters, or to synchronize this
method?
+
Object[] parameters = _constructorParameters.clone();
parameters[0] = resources;
try
{
- return _constructor.newInstance(parameters);
+ return (ResourceAware) _constructor.newInstance(parameters);
}
catch (Exception ex)
{
- throw new ApplicationRuntimeException(ex);
+ throw new RuntimeException(ex);
}
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
Fri Apr 21 17:28:10 2006
@@ -63,4 +63,10 @@
{
return MESSAGES.format("no-declared-method", methodSignature,
ctClass.getName());
}
+
+ static String incorrectClassForInstantiator(String className, Class
componentClass)
+ {
+ return MESSAGES.format("incorrect-class-for-instantiator", className,
componentClass
+ .getName());
+ }
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java
Fri Apr 21 17:28:10 2006
@@ -33,6 +33,10 @@
"resources",
null);
+ // Notice that return type is ComponentResources (to match the
interface), even though the
+ // field is InternalComponentResources. We don't want just anybody
tapping the capabilities
+ // of InternalComponentResources.
+
MethodSignature sig = new MethodSignature(Modifier.PUBLIC,
ComponentResources.class
.getName(), "getResources", null, null);
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
Fri Apr 21 17:28:10 2006
@@ -46,7 +46,7 @@
{
String type = transformation.getFieldType(fieldName);
- String defaultFieldName = transformation.newField(Modifier.PRIVATE,
type, fieldName
+ String defaultFieldName = transformation.addField(Modifier.PRIVATE,
type, fieldName
+ "Default");
// Add the the interface and an implementation that squirrels away the
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
Fri Apr 21 17:28:10 2006
@@ -42,7 +42,7 @@
* conflict with any existing member (declared by the underlying class, or
inherited from a base
* class).
* <p>
- * TODO: This method may be removed (see [EMAIL PROTECTED] #newField(int,
String, String)})
+ * TODO: This method may be removed (see [EMAIL PROTECTED] #addField(int,
String, String)})
*
* @param suggested
* the suggested value for the member
@@ -128,10 +128,11 @@
* returned
* @return the (uniqued) name for the field
*/
- String newField(int modifiers, String type, String suggestedName);
+ String addField(int modifiers, String type, String suggestedName);
/**
- * Defines a new protected instance variable whose initial value is
provided statically.
+ * Defines a new protected instance variable whose initial value is
provided statically, via a
+ * constructor parameter.
*
* @param type
* the type of object to inject
@@ -182,22 +183,11 @@
*/
void storeMeta(String key, String value);
- /*
- * Retrieves previously stored meta data. @return value for key, or null
if not found.
- */
-
- String readMeta(String key);
-
/**
- * Adds a getter method, a public instance method that returns the value
of a field. This is
- * often paired with [EMAIL PROTECTED] #addInjectedField(Class, String,
Object)}.
+ * Retrieves previously stored meta data.
*
- * @param the
- * return type of the method
- * @param methodName
- * the name of the method (i.e., "getFoo")
- * @param fieldName
- * the field to return
+ * @return value for key, or null if not found.
*/
- void addGetterMethod(String type, String methodName, String fieldName);
+ String readMeta(String key);
+
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
Fri Apr 21 17:28:10 2006
@@ -17,4 +17,5 @@
error-adding-method=Error adding method {1} to class {0}: {2}
field-already-claimed=Field {0} of class {1} is already claimed by {2} and can
not be claimed by {3}.
meta-key-exists=Class transformation meta key ''{0}'' already contains value
''{1}'' and can not be set to ''{2}''.
-no-declared-method=Class {1} does not declare method ''{0}''.
\ No newline at end of file
+no-declared-method=Class {1} does not declare method ''{0}''.
+incorrect-class-for-instantiator=Unable to create a component instantiator for
class {0} because class {1} was provided instead.
\ No newline at end of file
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java
Fri Apr 21 17:28:10 2006
@@ -39,7 +39,12 @@
@Test
public void controlledPackagesTest() throws Exception
{
- ComponentInstantiatorSourceImpl e = new
ComponentInstantiatorSourceImpl(_defaultClassLoader);
+ ClassTransformer transformer = newMock(ClassTransformer.class);
+
+ replay();
+
+ ComponentInstantiatorSourceImpl e = new
ComponentInstantiatorSourceImpl(
+ _defaultClassLoader, transformer);
assertEquals(e.inControlledPackage("foo.bar.Baz"), false);
@@ -60,5 +65,7 @@
// Parents of controlled packages are not controlled
assertEquals(e.inControlledPackage("foo.Gloop"), false);
+
+ verify();
}
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
Fri Apr 21 17:28:10 2006
@@ -16,7 +16,6 @@
import java.lang.annotation.Documented;
import java.lang.annotation.Target;
-import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;
@@ -227,7 +226,7 @@
{
ClassTransformation ct =
createClassTransformation(ClaimedFields.class);
- ct.newField(Modifier.PRIVATE, "int", "newField");
+ ct.addField(Modifier.PRIVATE, "int", "newField");
String[] unclaimed = ct.findUnclaimedFields();
@@ -354,15 +353,51 @@
ct.finish();
- Class modified = _classPool.toClass(targetObjectCtClass, childLoader);
+ Class transformed = _classPool.toClass(targetObjectCtClass,
childLoader);
- Constructor cons = modified.getConstructors()[0];
+ Instantiator instantiator = ct.createInstantiator(transformed);
- ResourceAware instance = (ResourceAware) cons.newInstance(resources);
+ ResourceAware instance = instantiator.newInstance(resources);
assertSame(instance.getResources(), resources);
}
+ @Test
+ public void wrongClassPassedToCreateInstantiator() throws Exception
+ {
+ MutableComponentModel model = newMock(MutableComponentModel.class);
+
+ ClassLoader childLoader = newLoader();
+
+ CtClass targetObjectCtClass = findCtClass(TargetObject.class);
+
+ InternalClassTransformation ct = new
InternalClassTransformationImpl(targetObjectCtClass);
+
+ replay();
+
+ ClassTransformWorker worker = new ImplementResourceAwareWorker();
+
+ worker.transform(ct, model);
+
+ ct.finish();
+
+ _classPool.toClass(targetObjectCtClass, childLoader);
+
+ try
+ {
+ ct.createInstantiator(Boolean.class);
+ unreachable();
+ }
+ catch (IllegalArgumentException ex)
+ {
+ assertEquals(ex.getMessage(),
TransformMessages.incorrectClassForInstantiator(
+ TargetObject.class.getName(),
+ Boolean.class));
+ }
+
+ verify();
+ }
+
private Loader newLoader()
{
Loader loader = new Loader(_contextClassLoader, _classPool);
@@ -379,30 +414,37 @@
@Test
public void addImplementedInterface() throws Exception
{
+ MutableComponentModel model = newMock(MutableComponentModel.class);
+
+ replay();
+
ClassLoader childLoader = newLoader();
CtClass targetObjectCtClass = findCtClass(TargetObject.class);
- ClassTransformation ct = new
InternalClassTransformationImpl(targetObjectCtClass);
+ InternalClassTransformation ct = new
InternalClassTransformationImpl(targetObjectCtClass);
+
+ new ImplementResourceAwareWorker().transform(ct, model);
ct.addImplementedInterface(FooInterface.class);
ct.addImplementedInterface(GetterMethodsInterface.class);
+ ct.finish();
+
// Inside this test case, we're a bit limited, because
// when the modified version of the TargetObject class is loaded,
// the FooInterface and GetterMethodsInterface classes are also loaded
// into the child class loader. Therefore, we need to use reflection
// to check that the methods are implemented correctly.
- Class modified = _classPool.toClass(targetObjectCtClass, childLoader);
+ Class transformed = _classPool.toClass(targetObjectCtClass,
childLoader);
- Class[] interfaces = modified.getInterfaces();
+ Class[] interfaces = transformed.getInterfaces();
- assertEquals(interfaces.length, 2);
- assertEquals(FooInterface.class.getName(), interfaces[0].getName());
- assertEquals(GetterMethodsInterface.class.getName(),
interfaces[1].getName());
+ assertEquals(interfaces, new Class[]
+ { ResourceAware.class, FooInterface.class,
GetterMethodsInterface.class });
- Object target = modified.newInstance();
+ Object target = ct.createInstantiator(transformed).newInstance(null);
FooInterface asFoo = (FooInterface) target;
@@ -420,5 +462,7 @@
assertNull(getters.getString());
assertNull(getters.getObjectArray());
assertNull(getters.getIntArray());
+
+ verify();
}
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
URL:
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java?rev=396036&r1=396035&r2=396036&view=diff
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
Fri Apr 21 17:28:10 2006
@@ -63,7 +63,7 @@
ct.getFieldType("_fred");
setReturnValue("foo.Bar");
- ct.newField(Modifier.PRIVATE, "foo.Bar", "_fredDefault");
+ ct.addField(Modifier.PRIVATE, "foo.Bar", "_fredDefault");
setReturnValue("_$fredDefault");
ct.addImplementedInterface(ComponentLifecycle.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]