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/16 18:34:36 UTC

svn commit: r964851 - in /tapestry/tapestry5/trunk: tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/s...

Author: hlship
Date: Fri Jul 16 16:34:36 2010
New Revision: 964851

URL: http://svn.apache.org/viewvc?rev=964851&view=rev
Log:
TAP5-1197: Use an internally generated unique Long key to access PerThreadValues (which will be a more efficient Map key than a String), and make some other small optimizations

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResources.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResourcesImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PersistWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceCreator.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceLifecycle.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerThreadValue.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerthreadManager.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java Fri Jul 16 16:34:36 2010
@@ -597,8 +597,8 @@ public class ComponentPageElementImpl ex
 
         eventLogger = elementResources.getEventLogger(coreResources.getLogger());
 
-        renderEvent = elementResources.createPerThreadValue("tapestry.internal.RenderEvent:" + completeId);
-        rendering = elementResources.createPerThreadValue("tapestry.internal.Rendering:" + completeId);
+        renderEvent = elementResources.createPerThreadValue();
+        rendering = elementResources.createPerThreadValue();
     }
 
     /**
@@ -1001,7 +1001,7 @@ public class ComponentPageElementImpl ex
 
     public boolean isRendering()
     {
-        return rendering.exists() && rendering.get();
+        return rendering.get(false);
     }
 
     /**
@@ -1289,9 +1289,9 @@ public class ComponentPageElementImpl ex
         if (result != null)
             return result;
 
-        // Create a per-thread value to use until the end of the render. 
+        // Create a per-thread value to use until the end of the render.
         // This assumes that the queue will not change during the current request,
-        // which should be valid. 
+        // which should be valid.
 
         result = new RenderPhaseEvent(new RenderPhaseEventHandler(queue), eventLogger);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResources.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResources.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResources.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResources.java Fri Jul 16 16:34:36 2010
@@ -129,9 +129,9 @@ public interface ComponentPageElementRes
     Logger getEventLogger(Logger componentLogger);
 
     /**
-     * Wrapper around {@link PerthreadManager#createValue(Object)}.
+     * Wrapper around {@link PerthreadManager#createValue()}.
      * 
      * @since 5.2.0
      */
-    <T> PerThreadValue<T> createPerThreadValue(Object key);
+    <T> PerThreadValue<T> createPerThreadValue();
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResourcesImpl.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementResourcesImpl.java Fri Jul 16 16:34:36 2010
@@ -133,7 +133,7 @@ public class ComponentPageElementResourc
 
     private Object[] defaulted(Object[] context)
     {
-        return context == null ? InternalConstants.EMPTY_STRING_ARRAY: context;
+        return context == null ? InternalConstants.EMPTY_STRING_ARRAY : context;
     }
 
     public <T> T invoke(String description, Invokable<T> operation)
@@ -146,9 +146,9 @@ public class ComponentPageElementResourc
         tracker.run(description, operation);
     }
 
-    public <T> PerThreadValue<T> createPerThreadValue(Object key)
+    public <T> PerThreadValue<T> createPerThreadValue()
     {
-        return perThreadManager.createValue(key);
+        return perThreadManager.createValue();
     }
 
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java Fri Jul 16 16:34:36 2010
@@ -464,8 +464,7 @@ public class InternalComponentResourcesI
     private synchronized Map<String, Object> getRenderVariables()
     {
         if (renderVariables == null)
-            renderVariables = elementResources.createPerThreadValue("tapestry.internal.RenderVariables:"
-                    + getCompleteId());
+            renderVariables = elementResources.createPerThreadValue();
 
         Map<String, Object> result = renderVariables.get();
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageImpl.java Fri Jul 16 16:34:36 2010
@@ -77,14 +77,14 @@ public class PageImpl implements Page
 
         if (pooled)
         {
-            dirtyCount = perThreadManager.createValue("PageDirtyCount:" + name);
+            dirtyCount = perThreadManager.createValue();
         }
         else
         {
             dirtyCount = null;
         }
 
-        fieldBundle = perThreadManager.createValue("PersistentFieldBundle:" + name);
+        fieldBundle = perThreadManager.createValue();
     }
 
     @Override
@@ -227,7 +227,7 @@ public class PageImpl implements Page
     {
         if (dirtyCount != null)
         {
-            int newCount = dirtyCount.exists() ? dirtyCount.get() + 1 : 1;
+            int newCount = dirtyCount.get(0) + 1;
 
             dirtyCount.set(newCount);
         }

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=964851&r1=964850&r2=964851&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 Fri Jul 16 16:34:36 2010
@@ -65,10 +65,7 @@ public class PersistWorker implements Co
 
         public Object get()
         {
-            if (!fieldValue.exists())
-                return defaultValue;
-
-            return fieldValue.get();
+            return fieldValue.get(defaultValue);
         }
 
         public void set(Object newValue)
@@ -119,10 +116,8 @@ public class PersistWorker implements Co
         {
             public FieldValueConduit get(ComponentResources resources)
             {
-                String key = String.format("PersistWorker:%s/%s", resources.getCompleteId(), logicalFieldName);
-
                 return new PersistentFieldConduit((InternalComponentResources) resources, logicalFieldName,
-                        perThreadManager.createValue(key), defaultValue);
+                        perThreadManager.createValue(), defaultValue);
             }
         };
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java Fri Jul 16 16:34:36 2010
@@ -58,7 +58,7 @@ public final class UnclaimedFieldWorker 
 
         public Object get()
         {
-            return fieldValue.exists() ? fieldValue.get() : fieldDefaultValue;
+            return fieldValue.get(fieldDefaultValue);
         }
 
         public void set(Object newValue)
@@ -111,10 +111,8 @@ public final class UnclaimedFieldWorker 
             {
                 Object fieldDefaultValue = classCache.defaultValueForType(fieldType);
 
-                String key = String.format("UnclaimedFieldWorker:%s/%s", resources.getCompleteId(), fieldName);
-
                 return new UnclaimedFieldConduit((InternalComponentResources) resources,
-                        perThreadManager.createValue(key), fieldDefaultValue);
+                        perThreadManager.createValue(), fieldDefaultValue);
             }
         };
     }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceCreator.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceCreator.java Fri Jul 16 16:34:36 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2008 The Apache Software Foundation
+// Copyright 2006, 2008, 2010 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,
@@ -15,6 +15,7 @@
 package org.apache.tapestry5.ioc.internal.services;
 
 import org.apache.tapestry5.ioc.ObjectCreator;
+import org.apache.tapestry5.ioc.services.PerThreadValue;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 
 /**
@@ -22,33 +23,27 @@ import org.apache.tapestry5.ioc.services
  */
 public class PerThreadServiceCreator implements ObjectCreator
 {
-    private final PerthreadManager perthreadManager;
+    private final PerThreadValue<Object> perThreadValue;
 
     private final ObjectCreator delegate;
 
     public PerThreadServiceCreator(PerthreadManager perthreadManager, ObjectCreator delegate)
     {
-        this.perthreadManager = perthreadManager;
+        perThreadValue = perthreadManager.createValue();
+
         this.delegate = delegate;
     }
 
     /**
-     * For each thread, the first call will use the delegate {@link org.apache.tapestry5.ioc.ObjectCreator} to create an
-     * instance, and later calls will reuse the same per-thread instance. The instance is stored in the {@link
-     * org.apache.tapestry5.ioc.services.PerthreadManager} and will be released at the end of the request.
+     * For each thread, the first call will use the delegate {@link org.apache.tapestry5.ioc.ObjectCreator} to create
+     * an instance, and later calls will reuse the same per-thread instance. The instance is stored in the
+     * {@link org.apache.tapestry5.ioc.services.PerthreadManager} and will be released at the end of the request.
      */
     public Object createObject()
     {
-        // Use the ObjectCreator instance as the key.  it will be unique.
-
-        Object perthreadInstance = perthreadManager.get(delegate);
-
-        if (perthreadInstance == null)
-        {
-            perthreadInstance = delegate.createObject();
-            perthreadManager.put(delegate, perthreadInstance);
-        }
+        if (perThreadValue.exists())
+            return perThreadValue.get();
 
-        return perthreadInstance;
+        return perThreadValue.set(delegate.createObject());
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceLifecycle.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceLifecycle.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceLifecycle.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerThreadServiceLifecycle.java Fri Jul 16 16:34:36 2010
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010 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,6 +33,7 @@ import java.lang.reflect.Modifier;
  * application, the service decoration process occurs only once. The final calling chain is: Service Proxy --&gt;
  * Decorator(s) --&gt; PerThread Proxy --&gt; (per thread) instance.
  */
+@SuppressWarnings("all")
 public class PerThreadServiceLifecycle implements ServiceLifecycle
 {
     private static final String PER_THREAD_METHOD_NAME = "_perThreadInstance";

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java Fri Jul 16 16:34:36 2010
@@ -21,12 +21,14 @@ import java.util.concurrent.locks.Reentr
 
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.DummyLock;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.internal.util.JDKUtils;
 import org.apache.tapestry5.ioc.services.PerThreadValue;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
 import org.slf4j.Logger;
 
+@SuppressWarnings("all")
 public class PerthreadManagerImpl implements PerthreadManager
 {
     private static final String LISTENERS_KEY = "PerthreadManager.listenerList";
@@ -130,7 +132,6 @@ public class PerthreadManagerImpl implem
         }
     }
 
-    @SuppressWarnings("unchecked")
     public void put(Object key, Object value)
     {
         getPerthreadMap().put(key, value);
@@ -143,19 +144,30 @@ public class PerthreadManagerImpl implem
 
     private static Object NULL_VALUE = new Object();
 
-    public <T> PerThreadValue<T> createValue(final Object key)
+    <T> PerThreadValue<T> createValue(final Object key)
     {
         return new PerThreadValue<T>()
         {
-            @SuppressWarnings("unchecked")
             public T get()
             {
-                Object storedValue = PerthreadManagerImpl.this.get(key);
+                return get(null);
+            }
+
+            public T get(T defaultValue)
+            {
+                Map map = getPerthreadMap();
+
+                if (map.containsKey(key))
+                {
+                    Object storedValue = map.get(key);
 
-                if (storedValue == NULL_VALUE)
-                    return null;
+                    if (storedValue == NULL_VALUE)
+                        return null;
 
-                return (T) storedValue;
+                    return (T) storedValue;
+                }
+
+                return defaultValue;
             }
 
             public T set(T newValue)
@@ -172,4 +184,9 @@ public class PerthreadManagerImpl implem
         };
     }
 
+    public <T> PerThreadValue<T> createValue()
+    {
+        return createValue(InternalUtils.nextUUID());
+    }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java Fri Jul 16 16:34:36 2010
@@ -29,6 +29,7 @@ import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.net.URL;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -1022,4 +1023,17 @@ public class InternalUtils
             }
         };
     }
+
+    private static final AtomicLong uuidGenerator = new AtomicLong(System.nanoTime());
+
+    /**
+     * Generates a unique value for the current execution of the application. This initial UUID value
+     * is not easily predicatable; subsequent UUIDs are allocated in ascending series.
+     * 
+     * @since 5.2.0
+     */
+    public static long nextUUID()
+    {
+        return uuidGenerator.incrementAndGet();
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerThreadValue.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerThreadValue.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerThreadValue.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerThreadValue.java Fri Jul 16 16:34:36 2010
@@ -23,10 +23,16 @@ public interface PerThreadValue<T>
 {
     /** Is a value stored (even null)? */
     boolean exists();
-    
+
     /** Reads the current per-thread value, or returns null if no value has been stored. */
     T get();
 
+    /**
+     * Gets the current per-thread value if it exists (even if null), or the defaultValue
+     * if no value has been stored.
+     */
+    T get(T defaultValue);
+
     /** Sets the current per-thread value, then returns that value. */
     T set(T newValue);
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerthreadManager.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerthreadManager.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerthreadManager.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PerthreadManager.java Fri Jul 16 16:34:36 2010
@@ -46,14 +46,21 @@ public interface PerthreadManager
      * @param key
      *            key used to retrieve object
      * @return corresponding per-thread object, or null
+     * @deprecated use {@link PerthreadManager#createValue()} instead
      */
     Object get(Object key);
 
     /**
      * Stores a value into the per-thread map.
+     * 
+     * @deprecated use {@link PerthreadManager#createValue()} instead
      */
     void put(Object key, Object value);
 
-    /** Creates an object that captures the key, making it easier to get or set per-thread values. */
-    <T> PerThreadValue<T> createValue(Object key);
+    /**
+     * Creates a value using a unique internal key.
+     * 
+     * @since 5.2.0
+     */
+    <T> PerThreadValue<T> createValue();
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImplTest.java?rev=964851&r1=964850&r2=964851&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImplTest.java Fri Jul 16 16:34:36 2010
@@ -139,7 +139,29 @@ public class PerthreadManagerImplTest ex
         assertSame(m.get(key), value);
         assertSame(v.get(), value);
     }
-    
+
+    @Test
+    public void get_with_default()
+    {
+        PerthreadManagerImpl m = new PerthreadManagerImpl(null);
+
+        PerThreadValue<Object> v = m.createValue(new Object());
+
+        Object def = new Object();
+
+        assertSame(v.get(def), def);
+
+        v.set(null);
+
+        assertNull(v.get(def));
+
+        Object x = new Object();
+
+        v.set(x);
+
+        assertSame(v.get(def), x);
+    }
+
     @Test
     public void per_thread_null()
     {
@@ -148,9 +170,9 @@ public class PerthreadManagerImplTest ex
         PerThreadValue<Object> v = m.createValue(new Object());
 
         v.set(null);
-        
+
         assertTrue(v.exists());
-        
+
         assertNull(v.get());
     }
 }