New: Reporter.setEscapeHtml(boolean).
diff --git a/src/main/java/org/testng/Reporter.java b/src/main/java/org/testng/Reporter.java
index 8abdba2..01f8f36 100755
--- a/src/main/java/org/testng/Reporter.java
+++ b/src/main/java/org/testng/Reporter.java
@@ -2,6 +2,7 @@
import org.testng.collections.Lists;
import org.testng.collections.Maps;
+import org.testng.util.Strings;
import java.util.List;
import java.util.Map;
@@ -38,6 +39,8 @@
private static Map<ITestResult, List<Integer>> m_methodOutputMap = Maps.newHashMap();
+ private static boolean m_escapeHtml = false;
+
public static void setCurrentTestResult(ITestResult m) {
m_currentTestResult.set(m);
}
@@ -54,9 +57,18 @@
m_output.clear();
}
+ /**
+ * @param escapeHtml If true, use HTML entities for special HTML characters (<, >, &, ...).
+ */
+ public static void setEscapeHtml(boolean escapeHtml) {
+ m_escapeHtml = escapeHtml;
+ }
+
private static synchronized void log(String s, ITestResult m) {
// Escape for the HTML reports
- s = s.replace("<", "[").replace(">", "]") + "<br>";
+ if (m_escapeHtml) {
+ s = Strings.escapeHtml(s);
+ }
// synchronization needed to ensure the line number and m_output are updated atomically
int n = getOutput().size();
diff --git a/src/main/java/org/testng/collections/Lists.java b/src/main/java/org/testng/collections/Lists.java
index 222bc97..a0cba2d 100755
--- a/src/main/java/org/testng/collections/Lists.java
+++ b/src/main/java/org/testng/collections/Lists.java
@@ -14,6 +14,14 @@
return new ArrayList<K>(c);
}
+ public static <K> List<K> newArrayList(K... elements) {
+ List<K> result = new ArrayList<K>();
+ for (K e : elements) {
+ result.add(e);
+ }
+ return result;
+ }
+
public static <K> List<K> newArrayList(int size) {
return new ArrayList<K>(size);
}
diff --git a/src/main/java/org/testng/util/Strings.java b/src/main/java/org/testng/util/Strings.java
index c8fc146..56faee8 100644
--- a/src/main/java/org/testng/util/Strings.java
+++ b/src/main/java/org/testng/util/Strings.java
@@ -1,7 +1,40 @@
package org.testng.util;
+import com.google.inject.internal.Maps;
+
+import org.testng.collections.Lists;
+
+import java.util.List;
+import java.util.Map;
+
public class Strings {
public static boolean isNullOrEmpty(String string) {
return string == null || string.length() == 0; // string.isEmpty() in Java 6
}
+
+ private static List<String> ESCAPE_HTML_LIST = Lists.newArrayList(
+ "<", "<",
+ ">", ">",
+ "&", "&"
+ );
+
+ private static final Map<String, String> ESCAPE_HTML_MAP = Maps.newHashMap();
+
+ static {
+ for (int i = 0; i < ESCAPE_HTML_LIST.size(); i += 2) {
+ ESCAPE_HTML_MAP.put(ESCAPE_HTML_LIST.get(i), ESCAPE_HTML_LIST.get(i + 1));
+ }
+ }
+
+ public static String escapeHtml(String text) {
+ String result = text;
+ for (Map.Entry<String, String> entry : ESCAPE_HTML_MAP.entrySet()) {
+ result = result.replace(entry.getKey(), entry.getValue());
+ }
+ return result;
+ }
+
+ public static void main(String[] args) {
+ System.out.println(escapeHtml("10 < 20 && 30 > 20"));
+ }
}