You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2008/04/15 02:32:11 UTC

svn commit: r648079 - in /myfaces/core/trunk_1.2.x/api/src/main: java-templates/javax/faces/component/UIDataTemplate.java java-templates/javax/faces/component/UIViewRootTemplate.java java/javax/faces/component/UIComponentBase.java

Author: lu4242
Date: Mon Apr 14 17:32:09 2008
New Revision: 648079

URL: http://svn.apache.org/viewvc?rev=648079&view=rev
Log:
fix MYFACES-1862 Use ThreadLocal StringBuilder for create ids on getClientId, like in trinidad for 12

Modified:
    myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java
    myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java
    myfaces/core/trunk_1.2.x/api/src/main/java/javax/faces/component/UIComponentBase.java

Modified: myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java?rev=648079&r1=648078&r2=648079&view=diff
==============================================================================
--- myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java (original)
+++ myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIDataTemplate.java Mon Apr 14 17:32:09 2008
@@ -492,7 +492,9 @@
         {
             return clientId;
         }
-        return clientId + NamingContainer.SEPARATOR_CHAR + rowIndex;
+        
+        StringBuilder bld = __getSharedStringBuilder();
+        return bld.append(clientId).append(NamingContainer.SEPARATOR_CHAR).append(rowIndex).toString();
     }
 
     /**

Modified: myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java?rev=648079&r1=648078&r2=648079&view=diff
==============================================================================
--- myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java (original)
+++ myfaces/core/trunk_1.2.x/api/src/main/java-templates/javax/faces/component/UIViewRootTemplate.java Mon Apr 14 17:32:09 2008
@@ -156,7 +156,8 @@
     public String createUniqueId()
     {
         ExternalContext extCtx = FacesContext.getCurrentInstance().getExternalContext();
-        return extCtx.encodeNamespace(UNIQUE_ID_PREFIX + _uniqueIdCounter++);
+        StringBuilder bld = __getSharedStringBuilder();
+        return extCtx.encodeNamespace(bld.append(UNIQUE_ID_PREFIX).append(_uniqueIdCounter++).toString());
     }
 
     /**

Modified: myfaces/core/trunk_1.2.x/api/src/main/java/javax/faces/component/UIComponentBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk_1.2.x/api/src/main/java/javax/faces/component/UIComponentBase.java?rev=648079&r1=648078&r2=648079&view=diff
==============================================================================
--- myfaces/core/trunk_1.2.x/api/src/main/java/javax/faces/component/UIComponentBase.java (original)
+++ myfaces/core/trunk_1.2.x/api/src/main/java/javax/faces/component/UIComponentBase.java Mon Apr 14 17:32:09 2008
@@ -58,7 +58,10 @@
         extends UIComponent
 {
     private static Log log = LogFactory.getLog(UIComponentBase.class);
-
+    
+    private static final ThreadLocal<StringBuilder> _STRING_BUILDER =
+        new ThreadLocal<StringBuilder>();
+    
     private _ComponentAttributesMap _attributesMap = null;
     private List<UIComponent> _childrenList = null;
     private Map<String,UIComponent> _facetMap = null;
@@ -220,7 +223,8 @@
             String containerClientId = namingContainer.getContainerClientId(context); 
             if (containerClientId != null )
             {
-                _clientId = containerClientId + NamingContainer.SEPARATOR_CHAR + id;
+                StringBuilder bld = __getSharedStringBuilder();
+                _clientId = bld.append(containerClientId).append(NamingContainer.SEPARATOR_CHAR).append(id).toString();
             }
             else
             {
@@ -1114,6 +1118,56 @@
     {
         return _ComponentUtils.getExpressionValue(this, attribute, explizitValue, defaultValueIfExpressionNull);
     }
+    
+    /**
+     * <p>
+     * This gets a single threadlocal shared stringbuilder instance, each time you call
+     * __getSharedStringBuilder it sets the length of the stringBuilder instance to 0.
+     * </p><p>
+     * This allows you to use the same StringBuilder instance over and over.
+     * You must call toString on the instance before calling __getSharedStringBuilder again.
+     * </p>
+     * Example that works
+     * <pre><code>
+     * StringBuilder sb1 = __getSharedStringBuilder();
+     * sb1.append(a).append(b);
+     * String c = sb1.toString();
+     *
+     * StringBuilder sb2 = __getSharedStringBuilder();
+     * sb2.append(b).append(a);
+     * String d = sb2.toString();
+     * </code></pre>
+     * <br><br>
+     * Example that doesn't work, you must call toString on sb1 before
+     * calling __getSharedStringBuilder again.
+     * <pre><code>
+     * StringBuilder sb1 = __getSharedStringBuilder();
+     * StringBuilder sb2 = __getSharedStringBuilder();
+     *
+     * sb1.append(a).append(b);
+     * String c = sb1.toString();
+     *
+     * sb2.append(b).append(a);
+     * String d = sb2.toString();
+     * </code></pre>
+     *
+     */
+    static StringBuilder __getSharedStringBuilder()
+    {
+      StringBuilder sb = _STRING_BUILDER.get();
+
+      if (sb == null)
+      {
+        sb = new StringBuilder();
+        _STRING_BUILDER.set(sb);
+      }
+
+      // clear out the stringBuilder by setting the length to 0
+      sb.setLength(0);
+
+      return sb;
+    }
+
 
 
     //------------------ GENERATED CODE BEGIN (do not modify!) --------------------