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