You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by bo...@apache.org on 2007/11/27 14:35:28 UTC

svn commit: r598637 - in /myfaces/tobago/trunk: core/src/main/java/org/apache/myfaces/tobago/ajax/api/ core/src/main/java/org/apache/myfaces/tobago/util/ sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/ theme/sca...

Author: bommel
Date: Tue Nov 27 05:35:26 2007
New Revision: 598637

URL: http://svn.apache.org/viewvc?rev=598637&view=rev
Log:
(TOBAGO-555) Using a FastStringWriter instead of java.io.StringWriter and optimize inital buffer size for response buffering

Added:
    myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java   (with props)
Modified:
    myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxPhaseListener.java
    myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxResponseRenderer.java
    myfaces/tobago/trunk/sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java
    myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/MenuBarRenderer.java
    myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/PageRenderer.java
    myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeOldRenderer.java

Modified: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxPhaseListener.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxPhaseListener.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxPhaseListener.java (original)
+++ myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxPhaseListener.java Tue Nov 27 05:35:26 2007
@@ -24,6 +24,7 @@
 import org.apache.myfaces.tobago.context.ResourceManagerUtil;
 import org.apache.myfaces.tobago.util.RequestUtils;
 import org.apache.myfaces.tobago.util.ResponseUtils;
+import org.apache.myfaces.tobago.util.FastStringWriter;
 import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 
@@ -41,8 +42,7 @@
 import javax.faces.render.RenderKitFactory;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
+import java.io.PrintWriter;;
 import java.util.Map;
 
 /**
@@ -103,7 +103,7 @@
         RequestUtils.ensureEncoding(externalContext);
         ResponseUtils.ensureNoCacheHeader(externalContext);
         final UIViewRoot viewRoot = facesContext.getViewRoot();
-        StringWriter content = new StringWriter();
+        FastStringWriter content = new FastStringWriter(1024*10);
         RenderKitFactory renderFactory = (RenderKitFactory)
             FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
         RenderKit renderKit = renderFactory.getRenderKit(
@@ -113,9 +113,7 @@
 
         AjaxUtils.processAjax(facesContext, viewRoot);
 
-
-
-        StringWriter jsfState = new StringWriter();
+        FastStringWriter jsfState = new FastStringWriter();
         ResponseWriter jsfStateWriter = contentWriter.cloneWithWriter(jsfState);
         facesContext.setResponseWriter(jsfStateWriter);
 

Modified: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxResponseRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxResponseRenderer.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxResponseRenderer.java (original)
+++ myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/ajax/api/AjaxResponseRenderer.java Tue Nov 27 05:35:26 2007
@@ -17,43 +17,41 @@
  * limitations under the License.
  */
 
-import static org.apache.myfaces.tobago.lifecycle.TobagoLifecycle.FACES_MESSAGES_KEY;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
-import org.apache.myfaces.tobago.util.RequestUtils;
-import org.apache.myfaces.tobago.util.ResponseUtils;
-import org.apache.myfaces.tobago.util.EncodeAjaxCallback;
-import org.apache.myfaces.tobago.util.Callback;
-import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
-import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
-import static org.apache.myfaces.tobago.lifecycle.TobagoLifecycle.VIEW_ROOT_KEY;
 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_CHARSET;
 import org.apache.myfaces.tobago.component.ComponentUtil;
+import static org.apache.myfaces.tobago.lifecycle.TobagoLifecycle.FACES_MESSAGES_KEY;
+import static org.apache.myfaces.tobago.lifecycle.TobagoLifecycle.VIEW_ROOT_KEY;
+import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
+import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
+import org.apache.myfaces.tobago.util.Callback;
+import org.apache.myfaces.tobago.util.EncodeAjaxCallback;
+import org.apache.myfaces.tobago.util.FastStringWriter;
+import org.apache.myfaces.tobago.util.RequestUtils;
+import org.apache.myfaces.tobago.util.ResponseUtils;
 
+import javax.faces.FactoryFinder;
+import javax.faces.application.StateManager;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
-import javax.faces.context.ExternalContext;
-import javax.faces.component.UIViewRoot;
-import javax.faces.component.UIComponent;
-import javax.faces.render.RenderKitFactory;
 import javax.faces.render.RenderKit;
-import javax.faces.FactoryFinder;
-import javax.faces.application.StateManager;
-import javax.servlet.http.HttpServletResponse;
-import javax.naming.InitialContext;
+import javax.faces.render.RenderKitFactory;
 import javax.naming.Context;
+import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import java.io.StringWriter;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.List;
 import java.util.ArrayList;
-import java.util.Map;
-import java.util.Iterator;
 import java.util.EmptyStackException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 public class AjaxResponseRenderer {
 
@@ -114,7 +112,7 @@
       }
       writeResponseReload(facesContext, renderKit);
     } else {
-      List<StringWriter> responseParts = new ArrayList<StringWriter>();
+      List<FastStringWriter> responseParts = new ArrayList<FastStringWriter>();
       Map<String, UIComponent> ajaxComponents = AjaxUtils.getAjaxComponents(facesContext);
 
       for (Map.Entry<String, UIComponent> entry : ajaxComponents.entrySet()) {
@@ -128,9 +126,9 @@
     }
   }
 
-  private StringWriter renderComponent(FacesContext facesContext, RenderKit renderKit, String clientId,
+  private FastStringWriter renderComponent(FacesContext facesContext, RenderKit renderKit, String clientId,
       AjaxComponent component) throws IOException {
-    StringWriter content = new StringWriter();
+    FastStringWriter content = new FastStringWriter();
     ResponseWriter contentWriter = renderKit.createResponseWriter(content, null, null);
     facesContext.setResponseWriter(contentWriter);
     if (LOG.isDebugEnabled()) {
@@ -141,7 +139,7 @@
       // TODO: invokeOnComponent()
       ComponentUtil.invokeOnComponent(facesContext, clientId, (UIComponent) component, callback);
     } catch (EmptyStackException e) {
-      LOG.error(" content = \"" + content.getBuffer().toString() + "\"");
+      LOG.error(" content = \"" + content.toString() + "\"");
       throw e;
     }
 
@@ -149,20 +147,20 @@
   }
 
   private void writeResponse(FacesContext facesContext, RenderKit renderKit,
-                             List<StringWriter> parts, String state)
+                             List<FastStringWriter> parts, String state)
       throws IOException {
     writeResponse(facesContext, renderKit, CODE_SUCCESS, parts, state);
   }
 
   private void writeResponseReload(FacesContext facesContext, RenderKit renderKit)
       throws IOException {
-    writeResponse(facesContext, renderKit, CODE_RELOAD_REQUIRED, new ArrayList<StringWriter>(0), "");
+    writeResponse(facesContext, renderKit, CODE_RELOAD_REQUIRED, new ArrayList<FastStringWriter>(0), "");
   }
 
 
-  private StringWriter writeState(FacesContext facesContext, RenderKit renderKit, String state)
+  private FastStringWriter writeState(FacesContext facesContext, RenderKit renderKit, String state)
       throws IOException {
-    StringWriter jsfState = new StringWriter();
+    FastStringWriter jsfState = new FastStringWriter();
     ResponseWriter stateWriter = renderKit.createResponseWriter(jsfState, null, null);
     facesContext.setResponseWriter(stateWriter);
     stateWriter.startElement(HtmlConstants.SCRIPT, null);
@@ -177,7 +175,7 @@
 
   private String saveState(FacesContext facesContext, RenderKit renderKit)
       throws IOException {
-    StringWriter jsfState = new StringWriter();
+    FastStringWriter jsfState = new FastStringWriter();
     ResponseWriter stateWriter = renderKit.createResponseWriter(jsfState, null, null);
     facesContext.setResponseWriter(stateWriter);
 
@@ -204,7 +202,7 @@
   }
 
   private void writeResponse(FacesContext facesContext, RenderKit renderKit,
-                             String responseCode, List<StringWriter> responseParts, String jsfState)
+                             String responseCode, List<FastStringWriter> responseParts, String jsfState)
       throws IOException {
     ExternalContext externalContext = facesContext.getExternalContext();
     RequestUtils.ensureEncoding(externalContext);
@@ -220,18 +218,18 @@
     StringBuilder buffer = new StringBuilder(responseCode);
 
     // add parts to response
-    for (StringWriter part : responseParts) {
+    for (FastStringWriter part : responseParts) {
       // TODO surround by javascript parsable tokens
-
+      String partStr = part.toString();
       // FIXME:
-      if (part.toString().startsWith(CODE_NOT_MODIFIED)
-          && buffer.toString().equals(responseCode)) {
+      if (partStr.startsWith(CODE_NOT_MODIFIED)
+          && partStr.equals(responseCode)) {
         // remove resopnseCode from buffer
         buffer.setLength(0);
       }
       // /FIXME:
 
-      buffer.append(part.toString());
+      buffer.append(partStr);
     }
 
     // add jsfState to response

Added: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java?rev=598637&view=auto
==============================================================================
--- myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java (added)
+++ myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java Tue Nov 27 05:35:26 2007
@@ -0,0 +1,66 @@
+package org.apache.myfaces.tobago.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Writer;
+import java.io.IOException;
+
+public class FastStringWriter extends Writer {
+
+  private StringBuilder stringBuilder;
+
+  public FastStringWriter() {
+    this(1024);
+  }
+
+  public FastStringWriter(int initialSize) {
+    stringBuilder = new StringBuilder(initialSize);
+  }
+
+  public void write(int c) {
+    stringBuilder.append((char) c);
+  }
+
+  public void write(char cbuf[], int off, int len) {
+    stringBuilder.append(cbuf, off, len);
+  }
+
+  public void write(String str) {
+    stringBuilder.append(str);
+  }
+
+  public void write(String str, int off, int len) {
+    stringBuilder.append(str.substring(off, off + len));
+  }
+
+  public String toString() {
+    return stringBuilder.toString();
+  }
+
+  public void flush() {
+    // do nothing
+  }
+
+  public void close() throws IOException {
+    // do nothing
+  }
+
+  public StringBuilder getBuilder() {
+	  return stringBuilder;
+  }
+}

Propchange: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/util/FastStringWriter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/tobago/trunk/sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java (original)
+++ myfaces/tobago/trunk/sandbox/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeRenderer.java Tue Nov 27 05:35:26 2007
@@ -32,13 +32,13 @@
 import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
 import org.apache.myfaces.tobago.renderkit.html.HtmlRendererUtil;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
+import org.apache.myfaces.tobago.util.FastStringWriter;
 
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import java.io.IOException;
-import java.io.StringWriter;
 import java.util.List;
 
 public class TreeRenderer extends LayoutableRendererBase {
@@ -173,7 +173,7 @@
 
   protected String getNodesAsJavascript(FacesContext facesContext, UITreeNode root) throws IOException {
     ResponseWriter writer = facesContext.getResponseWriter();
-    StringWriter stringWriter = new StringWriter();
+    FastStringWriter stringWriter = new FastStringWriter();
     facesContext.setResponseWriter(writer.cloneWithWriter(stringWriter));
     RenderUtil.encode(facesContext, root);
     facesContext.setResponseWriter(writer);

Modified: myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/MenuBarRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/MenuBarRenderer.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/MenuBarRenderer.java (original)
+++ myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/MenuBarRenderer.java Tue Nov 27 05:35:26 2007
@@ -50,6 +50,7 @@
 import org.apache.myfaces.tobago.renderkit.html.HtmlRendererUtil;
 import org.apache.myfaces.tobago.renderkit.html.StyleClasses;
 import org.apache.myfaces.tobago.util.AccessKeyMap;
+import org.apache.myfaces.tobago.util.FastStringWriter;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
 import javax.faces.component.UICommand;
@@ -62,7 +63,6 @@
 import javax.faces.context.ResponseWriter;
 import javax.faces.model.SelectItem;
 import java.io.IOException;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -227,7 +227,7 @@
   private String createMenuEntry(FacesContext facesContext, UIPanel uiPanel)
       throws IOException {
     ResponseWriter savedWriter = facesContext.getResponseWriter();
-    StringWriter stringWriter = new StringWriter();
+    FastStringWriter stringWriter = new FastStringWriter();
     ResponseWriter newWriter = savedWriter.cloneWithWriter(stringWriter);
     facesContext.setResponseWriter(newWriter);
     TobagoResponseWriter writer = HtmlRendererUtil.getTobagoResponseWriter(facesContext);
@@ -466,7 +466,7 @@
         + (disabled ? "disabled" : "enabled");
 
     ResponseWriter savedWriter = facesContext.getResponseWriter();
-    StringWriter stringWriter = new StringWriter();
+    FastStringWriter stringWriter = new FastStringWriter();
     ResponseWriter newWriter = savedWriter.cloneWithWriter(stringWriter);
     facesContext.setResponseWriter(newWriter);
     TobagoResponseWriter writer = HtmlRendererUtil.getTobagoResponseWriter(facesContext);

Modified: myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/PageRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/PageRenderer.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/PageRenderer.java (original)
+++ myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/PageRenderer.java Tue Nov 27 05:35:26 2007
@@ -31,12 +31,12 @@
 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_LABEL;
 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_METHOD;
 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_PAGE_MENU;
+import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TARGET;
+import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TRANSITION;
 import static org.apache.myfaces.tobago.TobagoConstants.FACET_ACTION;
 import static org.apache.myfaces.tobago.TobagoConstants.FACET_MENUBAR;
 import static org.apache.myfaces.tobago.TobagoConstants.FORM_ACCEPT_CHARSET;
 import static org.apache.myfaces.tobago.TobagoConstants.SUBCOMPONENT_SEP;
-import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TARGET;
-import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TRANSITION;
 import org.apache.myfaces.tobago.component.ComponentUtil;
 import org.apache.myfaces.tobago.component.UILayout;
 import org.apache.myfaces.tobago.component.UIPage;
@@ -48,6 +48,7 @@
 import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
 import org.apache.myfaces.tobago.renderkit.html.HtmlRendererUtil;
 import org.apache.myfaces.tobago.util.AccessKeyMap;
+import org.apache.myfaces.tobago.util.FastStringWriter;
 import org.apache.myfaces.tobago.util.MimeTypeUtils;
 import org.apache.myfaces.tobago.util.ResponseUtils;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
@@ -60,7 +61,6 @@
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import java.io.IOException;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -115,7 +115,7 @@
     TobagoResponseWriter writer = HtmlRendererUtil.getTobagoResponseWriter(facesContext);
 
     // replace responseWriter and render page content
-    StringWriter content = new StringWriter();
+    FastStringWriter content = new FastStringWriter(1024*10);
     ResponseWriter contentWriter = writer.cloneWithWriter(content);
     facesContext.setResponseWriter(contentWriter);
 
@@ -131,7 +131,7 @@
 //    RenderUtil.encodeChildren(facesContext, page);
 
 // render popups into buffer
-    StringWriter popups = new StringWriter();
+    FastStringWriter popups = new FastStringWriter();
     contentWriter = writer.cloneWithWriter(popups);
     facesContext.setResponseWriter(contentWriter);
 

Modified: myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeOldRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeOldRenderer.java?rev=598637&r1=598636&r2=598637&view=diff
==============================================================================
--- myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeOldRenderer.java (original)
+++ myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeOldRenderer.java Tue Nov 27 05:35:26 2007
@@ -30,6 +30,7 @@
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlConstants;
 import org.apache.myfaces.tobago.renderkit.html.HtmlRendererUtil;
+import org.apache.myfaces.tobago.util.FastStringWriter;
 import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 
 import javax.faces.component.NamingContainer;
@@ -38,7 +39,6 @@
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import java.io.IOException;
-import java.io.StringWriter;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -307,7 +307,7 @@
 
   protected String getNodesAsJavascript(FacesContext facesContext, UITreeOldNode root) throws IOException {
     ResponseWriter writer = facesContext.getResponseWriter();
-    StringWriter stringWriter = new StringWriter();
+    FastStringWriter stringWriter = new FastStringWriter();
     facesContext.setResponseWriter(writer.cloneWithWriter(stringWriter));
     RenderUtil.encode(facesContext, root);
     facesContext.setResponseWriter(writer);