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]