[Help] Fix JSON generation to create conformant JSON

Change-Id: I5ac232360beff296d1c256a14a759912d9218cb7
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/AboutParser.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/AboutParser.java
index d0c21f9..d24570b 100644
--- a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/AboutParser.java
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/AboutParser.java
@@ -102,13 +102,13 @@
 		buf.append(JSonHelper.BEGIN_BRACE);
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
 
-		buf.append(JSonHelper.IDENTIFIER);
+		buf.append(JSonHelper.getQuotes(JSonHelper.IDENTIFIER));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(id));
 		buf.append(JSonHelper.COMMA);
 
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-		buf.append(JSonHelper.LABEL);
+		buf.append(JSonHelper.getQuotes(JSonHelper.LABEL));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(label));
 		buf.append(JSonHelper.COMMA);
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/NavParser.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/NavParser.java
index 0dcab04..c1446fa 100644
--- a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/NavParser.java
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/NavParser.java
@@ -60,13 +60,13 @@
 		buf.append(JSonHelper.BEGIN_BRACE);
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
 
-		buf.append(JSonHelper.IDENTIFIER);
+		buf.append(JSonHelper.getQuotes(JSonHelper.IDENTIFIER));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(id));
 		buf.append(JSonHelper.COMMA);
 
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-		buf.append(JSonHelper.LABEL);
+		buf.append(JSonHelper.getQuotes(JSonHelper.LABEL));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(label));
 		buf.append(JSonHelper.COMMA);
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ParseElement.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ParseElement.java
index 2e72fca..909d383 100644
--- a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ParseElement.java
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ParseElement.java
@@ -82,7 +82,7 @@
 				String val = props.getProperty(key);
 
 				buff.append(JSonHelper.NEWLINE + space + JSonHelper.SPACE);
-				buff.append(key);
+				buff.append(JSonHelper.getQuotes(key));
 				buff.append(JSonHelper.COLON);
 				try {
 					val = URLEncoder.encode(val, "UTF-8"); //$NON-NLS-1$
@@ -105,7 +105,7 @@
 		} else {
 
 			buff.append(JSonHelper.NEWLINE + space + JSonHelper.SPACE);
-			buff.append(JSonHelper.CHILDREN);
+			buff.append(JSonHelper.getQuotes(JSonHelper.CHILDREN));
 			buff.append(JSonHelper.COLON);
 			buff.append(JSonHelper.BEGIN_BRACKET);
 
@@ -141,7 +141,7 @@
 				String val = props.getProperty(key);
 
 				buff.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-				buff.append(key);
+				buff.append(JSonHelper.getQuotes(key));
 				buff.append(JSonHelper.COLON);
 				try {
 					val = URLEncoder.encode(val, "UTF-8"); //$NON-NLS-1$
@@ -164,7 +164,7 @@
 		} else {
 
 			buff.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-			buff.append(JSonHelper.ITEMS);
+			buff.append(JSonHelper.getQuotes(JSonHelper.ITEMS));
 			buff.append(JSonHelper.COLON);
 			buff.append(JSonHelper.BEGIN_BRACKET);
 
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ResultParser.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ResultParser.java
index 48c905c..cd38295 100644
--- a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ResultParser.java
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/parser/ResultParser.java
@@ -77,19 +77,19 @@
 		buf.append(JSonHelper.BEGIN_BRACE);
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
 
-		buf.append(JSonHelper.IDENTIFIER);
+		buf.append(JSonHelper.getQuotes(JSonHelper.IDENTIFIER));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(id));
 		buf.append(JSonHelper.COMMA);
 
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-		buf.append(JSonHelper.LABEL);
+		buf.append(JSonHelper.getQuotes(JSonHelper.LABEL));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.getQuotes(label));
 		buf.append(JSonHelper.COMMA);
 
 		buf.append(JSonHelper.NEWLINE + JSonHelper.SPACE);
-		buf.append(JSonHelper.ITEMS);
+		buf.append(JSonHelper.getQuotes(JSonHelper.ITEMS));
 		buf.append(JSonHelper.COLON);
 		buf.append(JSonHelper.BEGIN_BRACKET);
 
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/utils/JSonHelper.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/utils/JSonHelper.java
index 2255730..1043d55 100644
--- a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/utils/JSonHelper.java
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/utils/JSonHelper.java
@@ -15,7 +15,7 @@
 	//JSON Characters
 	public static final String BEGIN_BRACE = "{"; //$NON-NLS-1$
 	public static final String END_BRACE  = "}"; //$NON-NLS-1$
-	public static final String QUOTE  = "\'"; //$NON-NLS-1$
+	public static final String DOUBLEQUOTE  = "\""; //$NON-NLS-1$
 	public static final String COLON  = ":"; //$NON-NLS-1$
 	public static final String BEGIN_BRACKET  = "["; //$NON-NLS-1$
 	public static final String END_BRACKET  =   "]"; //$NON-NLS-1$
@@ -52,8 +52,14 @@
 	public static final String TOPIC			= "Topic"; //$NON-NLS-1$
 	public static final String NUMERIC_PATH		= "NumericPath"; //$NON-NLS-1$
 
-	public static String getQuotes(String str){
-		return ((str != null)?QUOTE + str + QUOTE:""); //$NON-NLS-1$
+	public static String getQuotes(String str) {
+		if (str == null) {
+			return ""; //$NON-NLS-1$
+		}
+		if (str.indexOf(DOUBLEQUOTE) < 0) {
+			return DOUBLEQUOTE + str + DOUBLEQUOTE;
+		}
+		return DOUBLEQUOTE + str.replaceAll(DOUBLEQUOTE, "\\\\" + DOUBLEQUOTE) + DOUBLEQUOTE; //$NON-NLS-1$
 	}
 
 }
diff --git a/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/AllWebappTests.java b/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/AllWebappTests.java
index 8ec2d1b..fb29123 100644
--- a/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/AllWebappTests.java
+++ b/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/AllWebappTests.java
@@ -32,7 +32,8 @@
 	HelpServerInterrupt.class,
 	HelpServerBinding.class,
 	HtmlCoderTest.class,
-	TocZipTest.class
+	TocZipTest.class,
+	JsonHelperTests.class
 })
 public class AllWebappTests {
 }
diff --git a/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/JsonHelperTests.java b/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/JsonHelperTests.java
new file mode 100644
index 0000000..6df0223
--- /dev/null
+++ b/org.eclipse.ua.tests/help/org/eclipse/ua/tests/help/webapp/JsonHelperTests.java
@@ -0,0 +1,17 @@
+package org.eclipse.ua.tests.help.webapp;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.help.internal.webapp.utils.JSonHelper;
+import org.junit.Test;
+
+public class JsonHelperTests {
+	@Test
+	public void testQuoted() {
+		assertEquals("\"test\"", JSonHelper.getQuotes("test"));
+		assertEquals("\"test test\"", JSonHelper.getQuotes("test test"));
+		assertEquals("\"test\\\"test\"", JSonHelper.getQuotes("test\"test"));
+		assertEquals("\"\\\"test test\\\"\"", JSonHelper.getQuotes("\"test test\""));
+		assertEquals("\"\\\\\"test test\\\\\"\"", JSonHelper.getQuotes("\\\"test test\\\""));
+	}
+}