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 2008/12/18 20:42:40 UTC

svn commit: r727801 - in /tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom: AbstractMarkupModel.java Element.java

Author: hlship
Date: Thu Dec 18 11:42:40 2008
New Revision: 727801

URL: http://svn.apache.org/viewvc?rev=727801&view=rev
Log:
TAP5-417: Tapestry 5.0 Performance Improvements
- Optimize the filtering of text inside MarkupModel.encode()

Modified:
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/AbstractMarkupModel.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/AbstractMarkupModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/AbstractMarkupModel.java?rev=727801&r1=727800&r2=727801&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/AbstractMarkupModel.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/AbstractMarkupModel.java Thu Dec 18 11:42:40 2008
@@ -19,54 +19,97 @@
     /**
      * Passes all characters but '<', '>' and '&' through unchanged.
      */
-    public void encode(String content, StringBuilder buffer)
-    {
-        encode(content, false, buffer);
-    }
-
     public String encode(String content)
     {
-        StringBuilder buffer = new StringBuilder(content.length() * 2);
+        int length = content.length();
 
-        encode(content, false, buffer);
+        StringBuilder builder = null;
 
-        return buffer.toString();
-    }
+        for (int i = 0; i < length; i++)
+        {
+            char ch = content.charAt(i);
 
-    public void encodeQuoted(String content, StringBuilder buffer)
-    {
-        encode(content, true, buffer);
+            switch (ch)
+            {
+                case '<':
+
+                    if (builder == null)
+                    {
+                        builder = new StringBuilder(2 * length);
+
+                        builder.append(content.substring(0, i));
+                    }
+
+                    builder.append("&lt;");
+                    continue;
+
+                case '>':
+
+                    if (builder == null)
+                    {
+                        builder = new StringBuilder(2 * length);
+
+                        builder.append(content.substring(0, i));
+                    }
+
+                    builder.append("&gt;");
+                    continue;
+
+                case '&':
+
+                    if (builder == null)
+                    {
+                        builder = new StringBuilder(2 * length);
+
+                        builder.append(content.substring(0, i));
+                    }
+
+                    builder.append("&amp;");
+                    continue;
+
+                default:
+
+                    if (builder != null)
+                        builder.append(ch);
+            }
+        }
+
+        return builder == null ? content : builder.toString();
     }
 
-    private void encode(String content, boolean encodeQuotes, StringBuilder buffer)
+    public void encodeQuoted(String content, StringBuilder builder)
     {
-        char[] array = content.toCharArray();
+        int length = content.length();
 
-        for (char ch : array)
+        for (int i = 0; i < length; i++)
         {
+            char ch = content.charAt(i);
+
             switch (ch)
             {
                 case '<':
-                    buffer.append("&lt;");
+
+                    builder.append("&lt;");
                     continue;
 
                 case '>':
-                    buffer.append("&gt;");
+
+                    builder.append("&gt;");
                     continue;
 
                 case '&':
-                    buffer.append("&amp;");
+
+                    builder.append("&amp;");
                     continue;
 
                 case '"':
-                    if (encodeQuotes)
-                    {
-                        buffer.append("&quot;");
-                        continue;
-                    }
+
+                    builder.append("&quot;");
+                    continue;
 
                 default:
-                    buffer.append(ch);
+
+                    builder.append(ch);
             }
         }
     }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java?rev=727801&r1=727800&r2=727801&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java Thu Dec 18 11:42:40 2008
@@ -347,7 +347,13 @@
 
         if (style == EndTagStyle.OMIT) return;
 
-        if (hasChildren || style == EndTagStyle.REQUIRE) writer.printf("</%s>", prefixedElementName);
+        if (hasChildren || style == EndTagStyle.REQUIRE)
+        {
+            // TAP5-471: Avoid use of printf().
+            writer.print("</");
+            writer.print(prefixedElementName);
+            writer.print(">");
+        }
     }
 
     private String toPrefixedName(Map<String, String> namespaceURIToPrefix, String namespace, String name)