You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2018/11/26 10:25:24 UTC

[myfaces] branch 2.3.x updated: MYFACES-4266 optimized performance

This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch 2.3.x
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/2.3.x by this push:
     new 2472a69  MYFACES-4266 optimized performance
2472a69 is described below

commit 2472a6903f39cdf0e242166b320f7b6cfe4d31fe
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Mon Nov 26 11:25:28 2018 +0100

    MYFACES-4266 optimized performance
---
 .../util/IllegalXmlCharacterFilterWriter.java      | 49 ++++++++++++++++++----
 1 file changed, 41 insertions(+), 8 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/util/IllegalXmlCharacterFilterWriter.java b/impl/src/main/java/org/apache/myfaces/util/IllegalXmlCharacterFilterWriter.java
index f7011e3..11f07bc 100644
--- a/impl/src/main/java/org/apache/myfaces/util/IllegalXmlCharacterFilterWriter.java
+++ b/impl/src/main/java/org/apache/myfaces/util/IllegalXmlCharacterFilterWriter.java
@@ -31,6 +31,8 @@ import java.io.Writer;
  */
 public class IllegalXmlCharacterFilterWriter extends FilterWriter
 {
+    private static final char[] EMPTY_CHAR_ARRAY = new char[0];
+    
     public IllegalXmlCharacterFilterWriter(Writer out)
     {
         super(out);
@@ -39,31 +41,62 @@ public class IllegalXmlCharacterFilterWriter extends FilterWriter
     @Override
     public void write(int c) throws IOException 
     {
-        super.write(xmlEncode((char) c));
+        super.write(encodeChar((char) c));
     }
 
     @Override
     public void write(char[] cbuf, int off, int len) throws IOException 
     {
-        super.write(xmlEncode(cbuf), off, len);
+        super.write(encodeCharArray(cbuf, off, len), off, len);
     }
 
     @Override
     public void write(String str, int off, int len) throws IOException 
     {
-        super.write(new String(xmlEncode(str.toCharArray())), off, len);
+        super.write(encodeString(str, off, len), off, len);
     }
 
-    private char[] xmlEncode(char[] ca)
+    private static String encodeString(String str, int off, int len)
     {
-        for (int i = 0; i < ca.length; i++)
+        boolean containsInvalidChar = false;
+        char[] encodedCharArray = EMPTY_CHAR_ARRAY;
+        
+        int to = off + len;
+        for (int i = off; i < to; i++)
         {
-            ca[i] = xmlEncode(ca[i]);
+            char charOld = str.charAt(i);
+            char charNew = encodeChar(charOld);
+            
+            if (charNew != charOld)
+            {
+                if (!containsInvalidChar)
+                {
+                    containsInvalidChar = true;
+                    encodedCharArray = str.toCharArray();
+                }
+                encodedCharArray[i] = charNew;
+            }
         }
-        return ca;
+
+        if (containsInvalidChar)
+        {
+            return String.valueOf(encodedCharArray);
+        }
+
+        return str;
+    }
+    
+    private static char[] encodeCharArray(char[] cbuf, int off, int len)
+    {
+        int to = off + len;
+        for (int i = off; i < to; i++)
+        {
+            cbuf[i] = encodeChar(cbuf[i]);
+        }
+        return cbuf;
     }
 
-    private char xmlEncode(char c)
+    private static char encodeChar(char c)
     {
         if (Character.isSurrogate(c)) 
         {