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]

Reply via email to