commit f660e24be80b2efed1423b9ebf912377ccea49d5
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Oct 27 09:06:30 2014 +0100
Avoid String.replaceAll() because of memory issues.
From a quick look at the sources it seems that they're using
String.indexOf() to find patterns rather than regular expressions which
is what String.replaceAll() uses.
---
.../java/org/torproject/onionoo/docs/DetailsDocument.java | 9 +++++----
src/main/java/org/torproject/onionoo/docs/DetailsStatus.java | 9 +++++----
src/main/java/org/torproject/onionoo/docs/DocumentStore.java | 5 +++--
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java b/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java
index bda9865..7d351ee 100644
--- a/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java
+++ b/src/main/java/org/torproject/onionoo/docs/DetailsDocument.java
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
public class DetailsDocument extends Document {
@@ -18,12 +19,12 @@ public class DetailsDocument extends Document {
* we'll have to do is to change back the '\\' that Gson writes for the
* '\'. */
private static String escapeJSON(String s) {
- return s == null ? null :
- StringEscapeUtils.escapeJavaScript(s).replaceAll("\\\\'", "'");
+ return StringUtils.replaceEach(StringEscapeUtils.escapeJavaScript(s),
+ new String[] { "\\\\'" }, new String[] { "'" });
}
private static String unescapeJSON(String s) {
- return s == null ? null :
- StringEscapeUtils.unescapeJavaScript(s.replaceAll("'", "\\'"));
+ return StringEscapeUtils.unescapeJavaScript(StringUtils.replaceEach(s,
+ new String[] { "'" }, new String[] { "\\'" }));
}
private String nickname;
diff --git a/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java b/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java
index 6fe0d80..6d987df 100644
--- a/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java
+++ b/src/main/java/org/torproject/onionoo/docs/DetailsStatus.java
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
public class DetailsStatus extends Document {
@@ -18,12 +19,12 @@ public class DetailsStatus extends Document {
* we'll have to do is to change back the '\\' that Gson writes for the
* '\'. */
private static String escapeJSON(String s) {
- return s == null ? null :
- StringEscapeUtils.escapeJavaScript(s).replaceAll("\\\\'", "'");
+ return StringUtils.replaceEach(StringEscapeUtils.escapeJavaScript(s),
+ new String[] { "\\\\'" }, new String[] { "'" });
}
private static String unescapeJSON(String s) {
- return s == null ? null :
- StringEscapeUtils.unescapeJavaScript(s.replaceAll("'", "\\'"));
+ return StringEscapeUtils.unescapeJavaScript(StringUtils.replaceEach(s,
+ new String[] { "'" }, new String[] { "\\'" }));
}
private String desc_published;
diff --git a/src/main/java/org/torproject/onionoo/docs/DocumentStore.java b/src/main/java/org/torproject/onionoo/docs/DocumentStore.java
index e3261e4..9a808ac 100644
--- a/src/main/java/org/torproject/onionoo/docs/DocumentStore.java
+++ b/src/main/java/org/torproject/onionoo/docs/DocumentStore.java
@@ -21,6 +21,7 @@ import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
+import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.torproject.onionoo.util.FormattingUtils;
@@ -275,8 +276,8 @@ public class DocumentStore {
* objects are escaped JSON, e.g., \u00F2. When Gson serlializes
* this string, it escapes the \ to \\, hence writes \\u00F2. We
* need to undo this and change \\u00F2 back to \u00F2. */
- documentString = gson.toJson(document).replaceAll("\\\\\\\\u",
- "\\\\u");
+ documentString = StringUtils.replace(gson.toJson(document),
+ "\\\\\\\\u", "\\\\u");
/* Existing details statuses don't contain opening and closing curly
* brackets, so we should remove them from new details statuses,
* too. */