You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2011/07/24 05:46:00 UTC
svn commit: r1150276 -
/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java
Author: hlship
Date: Sun Jul 24 03:45:59 2011
New Revision: 1150276
URL: http://svn.apache.org/viewvc?rev=1150276&view=rev
Log:
TAP5-1585: @InjectPage annotation can leak page instances from one locale to another
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java?rev=1150276&r1=1150275&r2=1150276&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectPageWorker.java Sun Jul 24 03:45:59 2011
@@ -14,19 +14,21 @@
package org.apache.tapestry5.internal.transform;
-import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.services.PerThreadValue;
+import org.apache.tapestry5.ioc.services.PerthreadManager;
import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.plastic.*;
-import org.apache.tapestry5.runtime.PageLifecycleAdapter;
+import org.apache.tapestry5.plastic.InstanceContext;
+import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticField;
import org.apache.tapestry5.services.ComponentClassResolver;
import org.apache.tapestry5.services.ComponentSource;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;
/**
- * Peforms transformations that allow pages to be injected into components.
+ * Performs transformations that allow pages to be injected into components.
*
* @see org.apache.tapestry5.annotations.InjectPage
*/
@@ -36,31 +38,24 @@ public class InjectPageWorker implements
{
private final String injectedPageName;
- private Object page;
+ private final PerThreadValue<Object> pageValue = perThreadManager.createValue();
- private InjectedPageConduit(ComponentResources resources, String fieldName,
+ private InjectedPageConduit(String className, String fieldName,
String injectedPageName)
{
- super(resources, fieldName);
+ super(className, fieldName);
this.injectedPageName = injectedPageName;
-
- resources.addPageLifecycleListener(new PageLifecycleAdapter()
- {
- @Override
- public void containingPageDidDetach()
- {
- page = null;
- }
- });
}
public Object get(Object instance, InstanceContext context)
{
- if (page == null)
- page = componentSource.getPage(injectedPageName);
+ if (!pageValue.exists())
+ {
+ pageValue.set(componentSource.getPage(injectedPageName));
+ }
- return page;
+ return pageValue.get();
}
}
@@ -68,10 +63,13 @@ public class InjectPageWorker implements
private final ComponentClassResolver resolver;
- public InjectPageWorker(ComponentSource componentSource, ComponentClassResolver resolver)
+ private final PerthreadManager perThreadManager;
+
+ public InjectPageWorker(ComponentSource componentSource, ComponentClassResolver resolver, PerthreadManager perThreadManager)
{
this.componentSource = componentSource;
this.resolver = resolver;
+ this.perThreadManager = perThreadManager;
}
public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
@@ -90,20 +88,11 @@ public class InjectPageWorker implements
String pageName = annotation.value();
- final String fieldName = field.getName();
+ String fieldName = field.getName();
- final String injectedPageName = InternalUtils.isBlank(pageName) ? resolver
+ String injectedPageName = InternalUtils.isBlank(pageName) ? resolver
.resolvePageClassNameToPageName(field.getTypeName()) : pageName;
- ComputedValue<FieldConduit<Object>> provider = new ComputedValue<FieldConduit<Object>>()
- {
- public FieldConduit<Object> get(InstanceContext context)
- {
- ComponentResources resources = context.get(ComponentResources.class);
- return new InjectedPageConduit(resources, fieldName, injectedPageName);
- }
- };
-
- field.setComputedConduit(provider);
+ field.setConduit(new InjectedPageConduit(field.getPlasticClass().getClassName(), fieldName, injectedPageName));
}
}