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 2010/07/11 21:05:53 UTC

svn commit: r963125 - /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java

Author: hlship
Date: Sun Jul 11 19:05:53 2010
New Revision: 963125

URL: http://svn.apache.org/viewvc?rev=963125&view=rev
Log:
TAP5-1197: Updated PersistWorker to store mutable state in the PerThreadManager

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java?rev=963125&r1=963124&r2=963125&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java Sun Jul 11 19:05:53 2010
@@ -21,7 +21,7 @@ import org.apache.tapestry5.annotations.
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.services.ComponentClassCache;
 import org.apache.tapestry5.ioc.services.FieldValueConduit;
-import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.runtime.PageLifecycleAdapter;
 import org.apache.tapestry5.services.ClassTransformation;
@@ -34,6 +34,16 @@ import org.apache.tapestry5.services.Tra
  */
 public class PersistWorker implements ComponentClassTransformWorker
 {
+    class PerThreadState
+    {
+        Object value;
+
+        PerThreadState(Object defaultValue)
+        {
+            value = defaultValue;
+        }
+    }
+
     class PersistentFieldConduit implements FieldValueConduit
     {
         private final InternalComponentResources resources;
@@ -42,24 +52,19 @@ public class PersistWorker implements Co
 
         private final Object defaultValue;
 
-        private Object currentValue;
+        private final String key;
 
         public PersistentFieldConduit(InternalComponentResources resources, String name, Object defaultValue)
         {
             this.resources = resources;
             this.name = name;
-            this.currentValue = defaultValue;
             this.defaultValue = defaultValue;
 
+            this.key = String.format("PersistWorker:%s/%s", resources.getCompleteId(), name);
+
             resources.addPageLifecycleListener(new PageLifecycleAdapter()
             {
                 @Override
-                public void containingPageDidDetach()
-                {
-                    resetToDefaultAtPageDetach();
-                }
-
-                @Override
                 public void restoreStateBeforePageAttach()
                 {
                     restoreStateAtPageAttach();
@@ -67,38 +72,46 @@ public class PersistWorker implements Co
             });
         }
 
+        private PerThreadState getState()
+        {
+            PerThreadState state = (PerThreadState) perThreadManager.get(key);
+
+            if (state == null)
+            {
+                state = new PerThreadState(defaultValue);
+                perThreadManager.put(key, state);
+            }
+
+            return state;
+        }
+
         public Object get()
         {
-            return currentValue;
+            return getState().value;
         }
 
         public void set(Object newValue)
         {
             resources.persistFieldChange(name, newValue);
 
-            currentValue = newValue;
-        }
-
-        private void resetToDefaultAtPageDetach()
-        {
-            currentValue = defaultValue;
+            getState().value = newValue;
         }
 
         private void restoreStateAtPageAttach()
         {
             if (resources.hasFieldChange(name))
-                currentValue = resources.getFieldChange(name);
+                getState().value = resources.getFieldChange(name);
         }
     }
 
-    private final TypeCoercer typeCoercer;
-
     private final ComponentClassCache classCache;
 
-    public PersistWorker(TypeCoercer typeCoercer, ComponentClassCache classCache)
+    private final PerthreadManager perThreadManager;
+
+    public PersistWorker(ComponentClassCache classCache, PerthreadManager perThreadManager)
     {
-        this.typeCoercer = typeCoercer;
         this.classCache = classCache;
+        this.perThreadManager = perThreadManager;
     }
 
     public void transform(ClassTransformation transformation, MutableComponentModel model)
@@ -133,7 +146,6 @@ public class PersistWorker implements Co
         field.replaceAccess(provider);
     }
 
-    @SuppressWarnings("unchecked")
     private Object determineDefaultValueFromFieldType(TransformField field)
     {
         return classCache.defaultValueForType(field.getType());