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);