Author: hlship
Date: Fri Apr 29 22:54:53 2011
New Revision: 1097985

URL: http://svn.apache.org/viewvc?rev=1097985&view=rev
Log:
TAP5-853: Initial work on reimplementing ComponentInstantiatorSource using 
PlasticManager instead of Javassist

Added:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/ComponentClassTransformWorker2.java
      - copied, changed from r1097984, 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker2.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
Removed:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractComponentMethodInvocation.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformer.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassTransformerImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMethodInvocationBuilder.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentMethodInvocationInfo.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformation.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker2.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/pages/MethodAccessSubject.java
Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/Instantiator.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CCTWToCCTW2Coercion.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImplTest.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ApplicationStateWorkerTest.java
    
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractConfigurationImpl.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
 Fri Apr 29 22:54:53 2011
@@ -14,48 +14,45 @@
 
 package org.apache.tapestry5.internal.services;
 
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.Map;
 import java.util.Set;
 
-import javassist.CannotCompileException;
-import javassist.ClassPath;
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.Loader;
-import javassist.LoaderClassPath;
-import javassist.NotFoundException;
-import javassist.Translator;
-
+import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.internal.InternalComponentResources;
+import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.event.InvalidationEventHubImpl;
-import org.apache.tapestry5.ioc.internal.services.ClassFactoryClassPool;
+import org.apache.tapestry5.internal.model.MutableComponentModelImpl;
+import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
+import org.apache.tapestry5.ioc.LoggerSource;
+import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
-import org.apache.tapestry5.ioc.internal.services.CtClassSource;
-import org.apache.tapestry5.ioc.internal.services.CtClassSourceImpl;
 import org.apache.tapestry5.ioc.internal.services.PlasticProxyFactoryImpl;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.internal.util.URLChangeTracker;
-import org.apache.tapestry5.ioc.services.ClassFabUtils;
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
+import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.plastic.ClassInstantiator;
+import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticManager;
+import org.apache.tapestry5.plastic.PlasticManagerDelegate;
+import org.apache.tapestry5.runtime.Component;
 import org.apache.tapestry5.services.InvalidationEventHub;
 import org.apache.tapestry5.services.UpdateListener;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
 import org.slf4j.Logger;
 
 /**
- * A wrapper around a Javassist class loader that allows certain classes to be 
modified as they are loaded.
+ * A wrapper around a {@link PlasticManager} that allows certain classes to be 
modified as they are loaded.
  */
-public final class ComponentInstantiatorSourceImpl extends 
InvalidationEventHubImpl implements Translator,
-        ComponentInstantiatorSource, UpdateListener
+public final class ComponentInstantiatorSourceImpl extends 
InvalidationEventHubImpl implements
+        ComponentInstantiatorSource, UpdateListener, PlasticManagerDelegate
 {
-    /**
-     * Add -Djavassist-write-dir=target/transformed-classes to the command 
line to force output of transformed classes
-     * to disk (for hardcore debugging).
-     */
-    private static final String JAVASSIST_WRITE_DIR = 
System.getProperty("javassist-write-dir");
 
     private final Set<String> controlledPackageNames = 
CollectionFactory.newSet();
 
@@ -65,9 +62,9 @@ public final class ComponentInstantiator
 
     private final InternalRequestGlobals internalRequestGlobals;
 
-    private Loader loader;
+    private final ComponentClassTransformWorker2 transformerChain;
 
-    private final ComponentClassTransformer transformer;
+    private final LoggerSource loggerSource;
 
     private final Logger logger;
 
@@ -75,50 +72,29 @@ public final class ComponentInstantiator
 
     private PlasticProxyFactory proxyFactory;
 
+    private PlasticManager manager;
+
     /**
      * Map from class name to Instantiator.
      */
-    private final Map<String, Instantiator> classNameToInstantiator = 
CollectionFactory.newMap();
-
-    private final Map<String, RuntimeException> classToPriorTransformException 
= CollectionFactory.newMap();
-
-    private CtClassSource classSource;
-
-    private class PackageAwareLoader extends Loader
-    {
-        public PackageAwareLoader(ClassLoader parent, ClassPool classPool)
-        {
-            super(parent, classPool);
-        }
+    private final Map<String, Instantiator> classToInstantiator = 
CollectionFactory.newMap();
 
-        /**
-         * Determines if the class name represents a component class from a 
controlled package. If so,
-         * super.findClass() will load it and transform it. Returns null if 
not in a controlled package, allowing the
-         * parent class loader to do the work.
-         * 
-         * @param className
-         * @return the loaded transformed Class, or null to force a load of 
the class from the parent class loader
-         * @throws ClassNotFoundException
-         */
-        @Override
-        protected Class findClass(String className) throws 
ClassNotFoundException
-        {
-            if (inControlledPackage(className)) { return 
super.findClass(className); }
+    private final Map<String, ComponentModel> classToModel = 
CollectionFactory.newMap();
 
-            // Returning null forces delegation to the parent class loader.
-
-            return null;
-        }
-    }
+    private final String[] SUBPACKAGES =
+    { "." + InternalConstants.PAGES_SUBPACKAGE + ".", "." + 
InternalConstants.COMPONENTS_SUBPACKAGE + ".",
+            "." + InternalConstants.MIXINS_SUBPACKAGE + ".", "." + 
InternalConstants.BASE_SUBPACKAGE + "." };
 
-    public ComponentInstantiatorSourceImpl(boolean productionMode, Logger 
logger, ClassLoader parent,
-            ComponentClassTransformer transformer, InternalRequestGlobals 
internalRequestGlobals, ClasspathURLConverter classpathURLConverter)
+    public ComponentInstantiatorSourceImpl(boolean productionMode, Logger 
logger, LoggerSource loggerSource,
+            ClassLoader parent, ComponentClassTransformWorker2 
transformerChain,
+            InternalRequestGlobals internalRequestGlobals, 
ClasspathURLConverter classpathURLConverter)
     {
         super(productionMode);
-        
+
         this.parent = parent;
-        this.transformer = transformer;
+        this.transformerChain = transformerChain;
         this.logger = logger;
+        this.loggerSource = loggerSource;
         this.internalRequestGlobals = internalRequestGlobals;
         this.changeTracker = new URLChangeTracker(classpathURLConverter);
 
@@ -131,7 +107,7 @@ public final class ComponentInstantiator
             return;
 
         changeTracker.clear();
-        classNameToInstantiator.clear();
+        classToInstantiator.clear();
 
         // Release the existing class pool, loader and so forth.
         // Create a new one.
@@ -150,235 +126,160 @@ public final class ComponentInstantiator
      */
     private void initializeService()
     {
-        ClassFactoryClassPool classPool = new ClassFactoryClassPool(parent);
-
-        // For TAPESTRY-2561, we're introducing a class loader between the 
parent (i.e., the
-        // context class loader), and the component class loader, to try and 
prevent the deadlocks
-        // that we've been seeing.
-
-        ClassLoader threadDeadlockBuffer = new URLClassLoader(new URL[0], 
parent);
-
-        loader = new PackageAwareLoader(threadDeadlockBuffer, classPool);
-
-        ClassPath path = new LoaderClassPath(loader);
-
-        classPool.appendClassPath(path);
-
-        classSource = new CtClassSourceImpl(classPool, loader);
+        classFactory = new ClassFactoryImpl(parent, logger);
 
-        try
-        {
-            loader.addTranslator(classPool, this);
-        }
-        catch (Exception ex)
-        {
-            throw new RuntimeException(ex);
-        }
+        proxyFactory = new PlasticProxyFactoryImpl(classFactory, parent);
 
-        classFactory = new ClassFactoryImpl(loader, classPool, classSource, 
logger);
+        classToInstantiator.clear();
+        classToModel.clear();
 
-        proxyFactory = new PlasticProxyFactoryImpl(classFactory, loader);
-
-        classToPriorTransformException.clear();
+        manager = null;
     }
 
-    // This is called from well within a synchronized block.
-    public void onLoad(ClassPool pool, String classname) throws 
NotFoundException, CannotCompileException
+    public synchronized Instantiator getInstantiator(final String className)
     {
-        logger.debug("BEGIN onLoad " + classname);
-
-        // This is our chance to make changes to the CtClass before it is 
loaded into memory.
-
-        String diag = "FAIL";
+        Instantiator result = classToInstantiator.get(className);
 
-        // TAPESTRY-2517: Attempting to re-transform a class that was 
partially transformed (but
-        // then failed) gives confusing exceptions if the user refreshes the 
failed page.
-        // Just give the same exception back.
-
-        RuntimeException failure = 
classToPriorTransformException.get(classname);
-
-        if (failure == null)
+        if (result == null)
         {
-            // If we are loading a class, it is because it is in a controlled 
package. There may be
-            // errors in the class that keep it from loading. By adding it to 
the change tracker
-            // early, we ensure that when the class is fixed, the change is 
picked up. Originally,
-            // this code was at the end of the method, and classes that 
contained errors would not be
-            // reloaded even after the code was fixed.
-
-            addClassFileToChangeTracker(classname);
-
-            try
+            if (manager == null)
             {
-                CtClass ctClass = pool.get(classname);
-
-                // Force the creation of the super-class before the target 
class.
-
-                forceSuperclassTransform(ctClass);
+                manager = new PlasticManager(parent, this, 
controlledPackageNames);
+            }
 
-                // Do the transformations here
+            // Force the creation of the class (and the transformation of the 
class). This will first
+            // trigger transformations of any base classes.
 
-                transformer.transformComponentClass(ctClass, loader);
+            final ClassInstantiator<Component> plasticInstantiator = 
manager.getClassInstantiator(className);
 
-                
writeClassToFileSystemForHardCoreDebuggingPurposesOnly(ctClass);
+            final ComponentModel model = classToModel.get(className);
 
-                diag = "END";
-            }
-            catch (RuntimeException classLoaderException)
+            result = new Instantiator()
             {
-                
internalRequestGlobals.storeClassLoaderException(classLoaderException);
+                public Component newInstance(InternalComponentResources 
resources)
+                {
+                    return plasticInstantiator.with(ComponentResources.class, 
resources)
+                            .with(InternalComponentResources.class, 
resources).newInstance();
+                }
+
+                public ComponentModel getModel()
+                {
+                    return model;
+                }
+
+                @Override
+                public String toString()
+                {
+                    return String.format("[Instantiator[%s]", className);
+                }
+            };
 
-                failure = classLoaderException;
-
-                classToPriorTransformException.put(classname, failure);
-            }
+            classToInstantiator.put(className, result);
         }
 
-        logger.debug(String.format("%5s onLoad %s", diag, classname));
-
-        if (failure != null)
-            throw failure;
+        return result;
     }
 
-    private void 
writeClassToFileSystemForHardCoreDebuggingPurposesOnly(CtClass ctClass)
+    // synchronized may be overkill, but that's ok.
+    public synchronized void addPackage(String packageName)
     {
-        if (JAVASSIST_WRITE_DIR == null)
-            return;
+        assert InternalUtils.isNonBlank(packageName);
 
-        try
-        {
-            boolean p = ctClass.stopPruning(true);
-            ctClass.writeFile(JAVASSIST_WRITE_DIR);
-            ctClass.defrost();
-            ctClass.stopPruning(p);
-        }
-        catch (Exception ex)
-        {
-            throw new RuntimeException(ex);
-        }
+        controlledPackageNames.add(packageName);
+
+        manager = null;
     }
 
-    private void addClassFileToChangeTracker(String classname)
+    public boolean exists(String className)
     {
-        String path = ClassFabUtils.getPathForClassNamed(classname);
-
-        URL url = loader.getResource(path);
-
-        changeTracker.add(url);
+        return parent.getResource(PlasticInternalUtils.toClassPath(className)) 
!= null;
     }
 
-    private void forceSuperclassTransform(CtClass ctClass) throws 
NotFoundException
+    public ClassFactory getClassFactory()
     {
-        CtClass superClass = ctClass.getSuperclass();
-
-        findClass(superClass.getName());
+        return classFactory;
     }
 
-    /**
-     * Does nothing.
-     */
-    public void start(ClassPool pool) throws NotFoundException, 
CannotCompileException
+    public PlasticProxyFactory getProxyFactory()
     {
+        return proxyFactory;
     }
 
-    public synchronized Instantiator getInstantiator(String className)
+    public InvalidationEventHub getInvalidationEventHub()
     {
-        Instantiator result = classNameToInstantiator.get(className);
-
-        // Note: a race condition here can result in the temporary creation of 
a duplicate instantiator.
-
-        if (result == null)
-        {
-            // Force the creation of the class (and the transformation of the 
class).
-
-            findClass(className);
-
-            // Note: this is really a create, and in fact, will create a new 
Class instance
-            // (it doesn't cache internally). This code is the only cache, 
which is why
-            // the method is synchronized. We could use a ConcurrentBarrier, 
but I suspect
-            // that the overhead of that is greater on a typical invocation 
than
-            // the cost of the synchronization and the Map lookup.
-
-            result = transformer.createInstantiator(className);
-
-            classNameToInstantiator.put(className, result);
-        }
-
-        return result;
+        return this;
     }
 
-    private Class findClass(String classname)
+    public void transform(PlasticClass plasticClass)
     {
-        try
-        {
-            return loader.loadClass(classname);
-        }
-        catch (ClassNotFoundException ex)
-        {
-            throw new RuntimeException(ex);
-        }
-    }
+        String className = plasticClass.getClassName();
+        String parentClassName = plasticClass.getSuperClassName();
 
-    /**
-     * Returns true if the package for the class name is in a package that is 
controlled by the enhancer. Controlled
-     * packages are identified by {@link #addPackage(String)}.
-     */
+        // The parent model may not exist, if the super class is not in a 
controlled package.
 
-    boolean inControlledPackage(String classname)
-    {
-        String packageName = stripTail(classname);
+        ComponentModel parentModel = classToModel.get(parentClassName);
 
-        while (packageName != null)
+        if (parentModel == null
+                && !(parentClassName.equals("java.lang.Object") || 
parentClassName
+                        .equals("groovy.lang.GroovyObjectSupport")))
         {
-            if (controlledPackageNames.contains(packageName))
-                return true;
+            String suggestedPackageName = buildSuggestedPackageName(className);
 
-            packageName = stripTail(packageName);
+            throw new 
RuntimeException(ServicesMessages.baseClassInWrongPackage(parentClassName, 
className,
+                    suggestedPackageName));
         }
 
-        return false;
-    }
+        // Tapestry 5.2 was more sensitive that the parent class have a public 
no-args constructor. Plastic
+        // doesn't care, and we don't have the tools to dig that information 
out.
 
-    private String stripTail(String input)
-    {
-        int lastdot = input.lastIndexOf('.');
+        Logger logger = loggerSource.getLogger(className);
 
-        if (lastdot < 0)
-            return null;
+        Resource baseResource = new 
ClasspathResource(PlasticInternalUtils.toClassPath(className));
 
-        return input.substring(0, lastdot);
-    }
+        changeTracker.add(baseResource.toURL());
 
-    // synchronized may be overkill, but that's ok.
-    public synchronized void addPackage(String packageName)
-    {
-        assert InternalUtils.isNonBlank(packageName);
-        controlledPackageNames.add(packageName);
-    }
+        MutableComponentModel model = new 
MutableComponentModelImpl(plasticClass.getClassName(), logger, baseResource,
+                parentModel);
 
-    public boolean exists(String className)
-    {
-        String path = className.replace(".", "/") + ".class";
+        transformerChain.transform(plasticClass, new TransformationSupport()
+        {
+            public Class toClass(String typeName)
+            {
+                try
+                {
+                    return 
PlasticInternalUtils.toClass(manager.getClassLoader(), typeName);
+                }
+                catch (ClassNotFoundException ex)
+                {
+                    throw new RuntimeException(String.format("Unable to 
convert type '%s' to a Class: %s", typeName,
+                            InternalUtils.toMessage(ex)), ex);
+                }
+            }
+        }, model);
 
-        return parent.getResource(path) != null;
+        classToModel.put(className, model);
     }
 
-    public ClassFactory getClassFactory()
+    public <T> ClassInstantiator<T> configureInstantiator(String className, 
ClassInstantiator<T> instantiator)
     {
-        return classFactory;
+        return instantiator;
     }
 
-    public PlasticProxyFactory getProxyFactory()
+    private String buildSuggestedPackageName(String className)
     {
-        return proxyFactory;
-    }
+        for (String subpackage : SUBPACKAGES)
+        {
+            int pos = className.indexOf(subpackage);
 
-    public CtClassSource getClassSource()
-    {
-        return classSource;
-    }
+            // Keep the leading '.' in the subpackage name and tack on "base".
 
-    public InvalidationEventHub getInvalidationEventHub()
-    {
-        return this;
+            if (pos > 0)
+                return className.substring(0, pos + 1) + 
InternalConstants.BASE_SUBPACKAGE;
+        }
+
+        // Is this even reachable? className should always be in a controlled 
package and so
+        // some subpackage above should have matched.
+
+        return null;
     }
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/Instantiator.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/Instantiator.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/Instantiator.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/Instantiator.java
 Fri Apr 29 22:54:53 2011
@@ -1,10 +1,10 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,20 +14,22 @@
 
 package org.apache.tapestry5.internal.services;
 
+import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.plastic.ClassInstantiator;
+import org.apache.tapestry5.plastic.InstanceContext;
 import org.apache.tapestry5.runtime.Component;
 
 /**
- * An object that can instantiate a component. This is used with transformed 
classes, in which the 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.
+ * An object that can instantiate a component. This is now largely a wrapper 
around {@link ClassInstantiator}.
  */
 public interface Instantiator
 {
     /**
      * Instantiates and returns a new instance of the desired class. Component 
classes are always modified so that they
-     * implement {@link Component} (and often, other interfaces as well).
+     * implement {@link Component} (and often, other interfaces as well). The 
resources are made available
+     * in the {@link InstanceContext} as both {@link ComponentResources} and 
{@link InternalComponentResources}.
      */
     Component newInstance(InternalComponentResources resources);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
 Fri Apr 29 22:54:53 2011
@@ -22,6 +22,7 @@ import org.apache.tapestry5.internal.ser
 import 
org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructor;
 import 
org.apache.tapestry5.internal.structure.ComponentPageElementResourcesSource;
 import 
org.apache.tapestry5.internal.structure.ComponentPageElementResourcesSourceImpl;
+import org.apache.tapestry5.ioc.LoggerSource;
 import org.apache.tapestry5.ioc.ObjectLocator;
 import org.apache.tapestry5.ioc.OrderedConfiguration;
 import org.apache.tapestry5.ioc.ServiceBinder;
@@ -46,6 +47,7 @@ import org.apache.tapestry5.services.Req
 import org.apache.tapestry5.services.ResponseCompressionAnalyzer;
 import org.apache.tapestry5.services.UpdateListenerHub;
 import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
 import org.slf4j.Logger;
 
 /**
@@ -126,31 +128,26 @@ public class InternalModule
     public ComponentInstantiatorSource 
buildComponentInstantiatorSource(@Builtin
     ClassFactory classFactory,
 
-    ComponentClassTransformer transformer,
+    @Primary
+    ComponentClassTransformWorker2 transformerChain,
 
     Logger logger,
 
+    LoggerSource loggerSource,
+
     InternalRequestGlobals internalRequestGlobals,
 
     ClasspathURLConverter classpathURLConverter)
     {
         ComponentInstantiatorSourceImpl source = new 
ComponentInstantiatorSourceImpl(productionMode, logger,
-                classFactory.getClassLoader(), transformer, 
internalRequestGlobals, classpathURLConverter);
+                loggerSource, classFactory.getClassLoader(), transformerChain, 
internalRequestGlobals,
+                classpathURLConverter);
 
         updateListenerHub.addUpdateListener(source);
 
         return source;
     }
 
-    public static ComponentClassTransformer 
buildComponentClassTransformer(@Autobuild
-    ComponentClassTransformerImpl transformer, @ComponentClasses
-    InvalidationEventHub hub)
-    {
-        hub.addInvalidationListener(transformer);
-
-        return transformer;
-    }
-
     public PageLoader buildPageLoader(@Autobuild
     PageLoaderImpl service,
 
@@ -228,7 +225,8 @@ public class InternalModule
     public ComponentTemplateSource buildComponentTemplateSource(TemplateParser 
parser, @Primary
     ComponentTemplateLocator locator, ClasspathURLConverter 
classpathURLConverter)
     {
-        ComponentTemplateSourceImpl service = new 
ComponentTemplateSourceImpl(productionMode, parser, locator, 
classpathURLConverter);
+        ComponentTemplateSourceImpl service = new 
ComponentTemplateSourceImpl(productionMode, parser, locator,
+                classpathURLConverter);
 
         updateListenerHub.addUpdateListener(service);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BridgeClassTransformation.java
 Fri Apr 29 22:54:53 2011
@@ -52,6 +52,7 @@ import org.apache.tapestry5.services.Tra
 import org.apache.tapestry5.services.TransformField;
 import org.apache.tapestry5.services.TransformMethod;
 import org.apache.tapestry5.services.TransformMethodSignature;
+import org.apache.tapestry5.services.transform.TransformationSupport;
 import org.slf4j.Logger;
 
 /**
@@ -65,6 +66,8 @@ public class BridgeClassTransformation i
 {
     private final PlasticClass plasticClass;
 
+    private final TransformationSupport support;
+
     private final MutableComponentModel model;
 
     private static <T> ComputedValue<T> toComputedValue(final 
ComponentValueProvider<T> provider)
@@ -399,9 +402,11 @@ public class BridgeClassTransformation i
         }
     };
 
-    public BridgeClassTransformation(PlasticClass plasticClass, 
MutableComponentModel model)
+    public BridgeClassTransformation(PlasticClass plasticClass, 
TransformationSupport support,
+            MutableComponentModel model)
     {
         this.plasticClass = plasticClass;
+        this.support = support;
         this.model = model;
     }
 
@@ -494,7 +499,7 @@ public class BridgeClassTransformation i
 
     public Class toClass(String type)
     {
-        throw new IllegalArgumentException("toClass() not yet implemented.");
+        return support.toClass(type);
     }
 
     public Logger getLogger()

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CCTWToCCTW2Coercion.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CCTWToCCTW2Coercion.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CCTWToCCTW2Coercion.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/CCTWToCCTW2Coercion.java
 Fri Apr 29 22:54:53 2011
@@ -20,7 +20,8 @@ import org.apache.tapestry5.model.Mutabl
 import org.apache.tapestry5.plastic.PlasticClass;
 import org.apache.tapestry5.services.ClassTransformation;
 import org.apache.tapestry5.services.ComponentClassTransformWorker;
-import org.apache.tapestry5.services.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
 
 @SuppressWarnings("deprecation")
 public class CCTWToCCTW2Coercion implements 
Coercion<ComponentClassTransformWorker, ComponentClassTransformWorker2>
@@ -29,9 +30,9 @@ public class CCTWToCCTW2Coercion impleme
     {
         return new ComponentClassTransformWorker2()
         {
-            public void transform(PlasticClass plasticClass, 
MutableComponentModel model)
+            public void transform(PlasticClass plasticClass, 
TransformationSupport support, MutableComponentModel model)
             {
-                ClassTransformation ct = new 
BridgeClassTransformation(plasticClass, model);
+                ClassTransformation ct = new 
BridgeClassTransformation(plasticClass, support, model);
 
                 oldStyleWorker.transform(ct, model);
             }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker.java
 Fri Apr 29 22:54:53 2011
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.services;
 
 import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
 
 /**
  * Interface for a set of objects that can perform component class 
transformations. Implementations should be

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 Fri Apr 29 22:54:53 2011
@@ -132,6 +132,7 @@ import org.apache.tapestry5.internal.ser
 import 
org.apache.tapestry5.internal.transform.ActivationRequestParameterWorker;
 import org.apache.tapestry5.internal.transform.ApplicationStateWorker;
 import org.apache.tapestry5.internal.transform.BindParameterWorker;
+import org.apache.tapestry5.internal.transform.CCTWToCCTW2Coercion;
 import org.apache.tapestry5.internal.transform.CachedWorker;
 import org.apache.tapestry5.internal.transform.ComponentWorker;
 import org.apache.tapestry5.internal.transform.DiscardAfterWorker;
@@ -183,7 +184,6 @@ import org.apache.tapestry5.ioc.annotati
 import org.apache.tapestry5.ioc.annotations.Contribute;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.ioc.annotations.InjectService;
-import org.apache.tapestry5.ioc.annotations.IntermediateType;
 import org.apache.tapestry5.ioc.annotations.Local;
 import org.apache.tapestry5.ioc.annotations.Marker;
 import org.apache.tapestry5.ioc.annotations.Match;
@@ -197,7 +197,6 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.apache.tapestry5.ioc.services.Coercion;
 import org.apache.tapestry5.ioc.services.CoercionTuple;
-import org.apache.tapestry5.ioc.services.DefaultImplementationBuilder;
 import org.apache.tapestry5.ioc.services.LazyAdvisor;
 import org.apache.tapestry5.ioc.services.MasterObjectProvider;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
@@ -213,7 +212,6 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.ioc.util.AvailableValues;
 import org.apache.tapestry5.ioc.util.IdAllocator;
 import org.apache.tapestry5.ioc.util.StrategyRegistry;
-import org.apache.tapestry5.ioc.util.TimeInterval;
 import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.runtime.Component;
@@ -237,6 +235,7 @@ import org.apache.tapestry5.services.met
 import org.apache.tapestry5.services.meta.MetaDataExtractor;
 import org.apache.tapestry5.services.meta.MetaWorker;
 import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
 import org.apache.tapestry5.util.StringToEnumCoercion;
 import org.apache.tapestry5.validator.Email;
 import org.apache.tapestry5.validator.Max;
@@ -1112,6 +1111,7 @@ public final class TapestryModule
      * <li>{@link Renderable} to {@link RenderCommand}</li>
      * <li>String to {@link Pattern}</li>
      * <li>String to {@link DateFormat}</li>
+     * <li>{@link ComponentClassTransformWorker} to {@link 
ComponentClassTransformWorker2}</li>
      * </ul>
      */
     public static void contributeTypeCoercer(Configuration<CoercionTuple> 
configuration,
@@ -1262,6 +1262,8 @@ public final class TapestryModule
                 .addAlias("false", ClientValidation.NONE);
 
         configuration.add(CoercionTuple.create(String.class, 
ClientValidation.class, stringToClientValidationCoercion));
+
+        configuration.add(CCTWToCCTW2Coercion.TUPLE);
     }
 
     /**
@@ -1419,10 +1421,11 @@ public final class TapestryModule
      * be defined.
      */
     @Marker(Primary.class)
-    public ComponentClassTransformWorker buildComponentClassTransformWorker(
-            List<ComponentClassTransformWorker> configuration)
+    public ComponentClassTransformWorker2 buildComponentClassTransformWorker(
+            List<ComponentClassTransformWorker2> configuration)
+
     {
-        return chainBuilder.build(ComponentClassTransformWorker.class, 
configuration);
+        return chainBuilder.build(ComponentClassTransformWorker2.class, 
configuration);
     }
 
     /**

Copied: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/ComponentClassTransformWorker2.java
 (from r1097984, 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker2.java)
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/ComponentClassTransformWorker2.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/ComponentClassTransformWorker2.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker2.java&r1=1097984&r2=1097985&rev=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentClassTransformWorker2.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/ComponentClassTransformWorker2.java
 Fri Apr 29 22:54:53 2011
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.services;
+package org.apache.tapestry5.services.transform;
 
 import org.apache.tapestry5.ioc.annotations.UsesOrderedConfiguration;
 import org.apache.tapestry5.ioc.services.ChainBuilder;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.services.ComponentClassTransformWorker;
 
 /**
  * Interface for a set of objects that can perform transformation of component 
classes. Implementations should
@@ -27,11 +28,21 @@ import org.apache.tapestry5.plastic.Plas
  * chain of command}. For compatibility with the code compiled for Tapestry 
5.2, contributions of type
  * {@link ComponentClassTransformWorker} are type coerced into this type 
automatically.
  * 
- * @since 5.3
+ * @since 5.3.0
  * @see {@link PlasticClass}
  */
 @UsesOrderedConfiguration(ComponentClassTransformWorker2.class)
 public interface ComponentClassTransformWorker2
 {
-    void transform(PlasticClass plasticClass, MutableComponentModel model);
+    /**
+     * Invoked to perform part of the transformation of the {@link 
PlasticClass}.
+     * 
+     * @param plasticClass
+     *            component class being transformed
+     * @param support
+     *            additional utilities needed during the transformation
+     * @param model
+     *            the model for the component being transformed
+     */
+    void transform(PlasticClass plasticClass, TransformationSupport support, 
MutableComponentModel model);
 }

Added: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java?rev=1097985&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
 (added)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/transform/TransformationSupport.java
 Fri Apr 29 22:54:53 2011
@@ -0,0 +1,32 @@
+// Copyright 2011 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.services.transform;
+
+import org.apache.tapestry5.plastic.PlasticClass;
+
+/**
+ * Additional utilities, beyond {@link PlasticClass}, needed when transforming.
+ * 
+ * @since 5.3.0
+ */
+public interface TransformationSupport
+{
+    /**
+     * @param typeName
+     *            Java type name (which may be a primitive type or array, or 
fully qualified class name)
+     * @return corresponding Java Class
+     */
+    Class toClass(String typeName);
+}

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImplTest.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImplTest.java
 Fri Apr 29 22:54:53 2011
@@ -40,6 +40,7 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.runtime.Component;
 import org.apache.tapestry5.services.TapestryModule;
 import org.apache.tapestry5.services.UpdateListenerHub;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
 import org.slf4j.Logger;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -69,40 +70,6 @@ public class ComponentInstantiatorSource
 
     private String tempDir;
 
-    @Test
-    public void controlled_packages() throws Exception
-    {
-        ComponentClassTransformer transformer = 
newMock(ComponentClassTransformer.class);
-        Logger logger = mockLogger();
-
-        replay();
-
-        ComponentInstantiatorSourceImpl e = new 
ComponentInstantiatorSourceImpl(false, logger, contextLoader,
-                transformer, null, converter);
-
-        assertEquals(e.inControlledPackage("foo.bar.Baz"), false);
-
-        // Check that classes in the default package are never controlled
-
-        assertEquals(e.inControlledPackage("Biff"), false);
-
-        // Now add a controlled package
-
-        e.addPackage("foo.bar");
-
-        assertEquals(e.inControlledPackage("foo.bar.Baz"), true);
-
-        // Sub-packages of controlled packages are controlled as well
-
-        assertEquals(e.inControlledPackage("foo.bar.biff.Pop"), true);
-
-        // Parents of controlled packages are not controlled
-
-        assertEquals(e.inControlledPackage("foo.Gloop"), false);
-
-        verify();
-    }
-
     /**
      * This allows tests the exists() method.
      */
@@ -183,13 +150,6 @@ public class ComponentInstantiatorSource
         ctClass.writeFile(extraClasspath.getAbsolutePath());
     }
 
-    private Component createComponent(Class componentClass)
-    {
-        String classname = componentClass.getName();
-
-        return createComponent(classname);
-    }
-
     private Component createComponent(String classname)
     {
         InternalComponentResources resources = 
mockInternalComponentResources();

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ApplicationStateWorkerTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ApplicationStateWorkerTest.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ApplicationStateWorkerTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/ApplicationStateWorkerTest.java
 Fri Apr 29 22:54:53 2011
@@ -19,29 +19,23 @@ import javassist.Loader;
 import javassist.LoaderClassPath;
 import javassist.NotFoundException;
 
-import org.apache.tapestry5.internal.InternalComponentResources;
-import org.apache.tapestry5.internal.services.ComponentClassCache;
-import org.apache.tapestry5.internal.services.Instantiator;
-import org.apache.tapestry5.internal.services.InternalClassTransformation;
-import org.apache.tapestry5.internal.services.InternalClassTransformationImpl;
-import 
org.apache.tapestry5.internal.services.InternalClassTransformationImplTest;
-import org.apache.tapestry5.internal.services.SimpleASO;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
-import org.apache.tapestry5.internal.transform.pages.MaybeStateHolder;
-import org.apache.tapestry5.internal.transform.pages.StateHolder;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryClassPool;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
 import org.apache.tapestry5.ioc.internal.services.PropertyAccessImpl;
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.apache.tapestry5.ioc.services.PropertyAccess;
-import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.services.ApplicationStateManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
 
+/**
+ * This test was gutted because it depended too much on internals (i.e., 
instantiating an
+ * InternalComponentClassTransformation instance). Still, unit tests (rather 
than relying entirely
+ * on integration tests) would be nice.
+ */
 public class ApplicationStateWorkerTest extends InternalBaseTestCase
 {
     private final ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
@@ -71,7 +65,7 @@ public class ApplicationStateWorkerTest 
         // the necessary files.
         classFactoryClassPool.appendClassPath(new LoaderClassPath(loader));
 
-        Logger logger = 
LoggerFactory.getLogger(InternalClassTransformationImplTest.class);
+        Logger logger = 
LoggerFactory.getLogger(ApplicationStateWorkerTest.class);
 
         classFactory = new ClassFactoryImpl(loader, classFactoryClassPool, 
logger);
     }
@@ -92,125 +86,6 @@ public class ApplicationStateWorkerTest 
         access = null;
     }
 
-    @SuppressWarnings("unchecked")
-    @Test
-    public void field_read_and_write() throws Exception
-    {
-        ApplicationStateManager manager = mockApplicationStateManager();
-        Logger logger = mockLogger();
-        MutableComponentModel model = mockMutableComponentModel();
-        InternalComponentResources resources = 
mockInternalComponentResources();
-        ComponentClassCache cache = mockComponentClassCache();
-
-        train_getLogger(model, logger);
-
-        Class asoClass = SimpleASO.class;
-
-        CtClass ctClass = findCtClass(StateHolder.class);
-
-        train_forName(cache, asoClass);
-
-        replay();
-
-        InternalClassTransformation transformation = new 
InternalClassTransformationImpl(classFactory, ctClass, null,
-                model, null, false);
-        new ApplicationStateWorker(manager, cache).transform(transformation, 
model);
-
-        verify();
-
-        transformation.finish();
-
-        Instantiator instantiator = transformation.createInstantiator();
-
-        Object component = instantiator.newInstance(resources);
-
-        // Test the companion flag field
-
-        expect(manager.exists(asoClass)).andReturn(true);
-
-        replay();
-
-        assertEquals(access.get(component, "beanExists"), true);
-
-        verify();
-
-        // Test read property (get from ASM)
-
-        Object aso = new SimpleASO();
-
-        train_get(manager, asoClass, aso);
-
-        replay();
-
-        assertSame(access.get(component, "bean"), aso);
-
-        verify();
-
-        // Test write property (set ASM)
-
-        Object aso2 = new SimpleASO();
-
-        manager.set(asoClass, aso2);
-
-        replay();
-
-        access.set(component, "bean", aso2);
-
-        verify();
-    }
-
-    @Test
-    public void read_field_with_create_disabled() throws Exception
-    {
-        ApplicationStateManager manager = mockApplicationStateManager();
-        Logger logger = mockLogger();
-        MutableComponentModel model = mockMutableComponentModel();
-        InternalComponentResources resources = 
mockInternalComponentResources();
-        ComponentClassCache cache = mockComponentClassCache();
-
-        train_getLogger(model, logger);
-
-        Class asoClass = SimpleASO.class;
-
-        CtClass ctClass = findCtClass(MaybeStateHolder.class);
-
-        train_forName(cache, asoClass);
-
-        replay();
-
-        InternalClassTransformation transformation = new 
InternalClassTransformationImpl(classFactory, ctClass, null,
-                model, null, false);
-        new ApplicationStateWorker(manager, cache).transform(transformation, 
model);
-
-        verify();
-
-        transformation.finish();
-
-        Instantiator instantiator = transformation.createInstantiator();
-
-        Object component = instantiator.newInstance(resources);
-
-        // Test read property
-
-        train_getIfExists(manager, asoClass, null);
-
-        replay();
-
-        assertNull(access.get(component, "bean"));
-
-        verify();
-
-        Object aso = new SimpleASO();
-
-        train_getIfExists(manager, asoClass, aso);
-
-        replay();
-
-        assertSame(access.get(component, "bean"), aso);
-
-        verify();
-    }
-
     protected final void train_getIfExists(ApplicationStateManager manager, 
Class asoClass, Object aso)
     {
         expect(manager.getIfExists(asoClass)).andReturn(aso);

Modified: 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractConfigurationImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractConfigurationImpl.java?rev=1097985&r1=1097984&r2=1097985&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractConfigurationImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractConfigurationImpl.java
 Fri Apr 29 22:54:53 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -33,7 +33,13 @@ public abstract class AbstractConfigurat
     {
         assert clazz != null;
 
-        if (contributionType.isInterface() && InternalUtils.isLocalFile(clazz))
+        // Only attempt to proxy the class if it is the right type for the 
contribution. Starting
+        // in 5.3, it is allowed to make contributions of different types (as 
long as they can be
+        // coerced to the right type) ... but this means that sometimes, a 
class is passed that isn't
+        // assignable to the actual contribution type.
+
+        if (contributionType.isInterface() && InternalUtils.isLocalFile(clazz)
+                && contributionType.isAssignableFrom(clazz))
             return locator.proxy(contributionType, clazz);
 
         return locator.autobuild(clazz);


Reply via email to