Rewrite inefficient string functions
authorJakub Skoczen <jakub@indexdata.dk>
Fri, 22 Jul 2011 12:59:39 +0000 (14:59 +0200)
committerJakub Skoczen <jakub@indexdata.dk>
Fri, 22 Jul 2011 12:59:39 +0000 (14:59 +0200)
src/main/java/org/z3950/zing/cql/CQLTermNode.java
src/main/java/org/z3950/zing/cql/Utils.java

index b45abdc..5966700 100644 (file)
@@ -173,7 +173,7 @@ public class CQLTermNode extends CQLNode {
        String attr, s = "";
        for (int i = 0; i < attrs.size(); i++) {
            attr = (String) attrs.get(i);
-           s += "@attr " + Utils.replaceString(attr, " ", " @attr ") + " ";
+           s += "@attr " + attr.replace(" ", " @attr ") + " ";
        }
 
        String text = term;
@@ -201,7 +201,7 @@ public class CQLTermNode extends CQLNode {
            str.indexOf('/') != -1 ||
            str.indexOf('(') != -1 ||
            str.indexOf(')') != -1) {
-           str = '"' + Utils.replaceString(str, "\"", "\\\"") + '"';
+           str = '"' + str.replace("\"", "\\\"") + '"';
        }
 
        return str;
index 6777e46..9224d36 100644 (file)
@@ -22,30 +22,25 @@ class Utils {
     // s/&/&amp;/g;
     // s/</&lt;/g;
     // s/>/&gt;/g;
-    // This is hideously inefficient, but I just don't see a better
-    // way using the standard JAVA library.
-    //
     static String xq(String str) {
-       str = replaceString(str, "&", "&amp;");
-       str = replaceString(str, "<", "&lt;");
-       str = replaceString(str, ">", "&gt;");
-       return str;
-    }
-
-    // I can't _believe_ I have to write this by hand in 2002 ...
-    static String replaceString(String str, String from, String to) {
-       StringBuffer sb = new StringBuffer();
-       int ix;                 // index of next `from'
-       int offset = 0;         // index of previous `from' + length(from)
-
-       while ((ix = str.indexOf(from, offset)) != -1) {
-           sb.append(str.substring(offset, ix));
-           sb.append(to);
-           offset = ix + from.length();
-       }
-
-       // End of string: append last bit and we're done
-       sb.append(str.substring(offset));
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i<str.length(); i++) {
+            char c = str.charAt(i);
+            switch (c) {
+                case '<':
+                    sb.append("&lt;");
+                    break;
+                case '>':
+                    sb.append("&gt;");
+                    break;
+                case '&':
+                    sb.append("&amp;");
+                    break;
+                default:
+                    sb.append(c);
+            }
+        }
        return sb.toString();
     }
+
 }