diff --git a/bobfile b/bobfile
index 51ad46f..898c3b3 100644
--- a/bobfile
+++ b/bobfile
@@ -5,7 +5,7 @@ packaging: jar
enablePreview: false
release: 19
dependencies:
- - repository: org.objenesis:objenesis:3.3
+ - repository: org.objenesis:objenesis:3.4
- repository: junit:junit:4.13.2
scope: test
- repository: org.unitils:unitils-core:3.4.6
diff --git a/pom.xml b/pom.xml
index a67e88f..a5f2e25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
com.github.codemonstur
simplexml
- 3.1.1
+ 3.1.2
${project.groupId}:${project.artifactId}
A clean and simple XML parser, serializer, and deserializer.
@@ -41,7 +41,7 @@
19
19
- 3.3
+ 3.4
4.13.2
3.4.6
1.12.0
diff --git a/src/test/java/unittests/EscapeMapTagIsKeyTest.java b/src/test/java/unittests/EscapeMapTagIsKeyTest.java
new file mode 100644
index 0000000..a96c046
--- /dev/null
+++ b/src/test/java/unittests/EscapeMapTagIsKeyTest.java
@@ -0,0 +1,103 @@
+package unittests;
+
+import org.junit.Test;
+import xmlparser.XmlParser;
+import xmlparser.annotations.XmlMapTagIsKey;
+import xmlparser.annotations.XmlMapWithAttributes;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static xmlparser.XmlParser.newXmlParser;
+
+public class EscapeMapTagIsKeyTest {
+
+ private final XmlParser parserDefault = new XmlParser();
+ private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build();
+
+ private static class PojoMap {
+ @XmlMapTagIsKey
+ private final Map map;
+
+ private PojoMap(final Map map) {
+ this.map = map;
+ }
+ }
+
+ @Test
+ public void serializeMapWithDangerousChars() {
+ final PojoMap inputPojo = new PojoMap(Map.of("key", "<>&\"'"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMapWithEscapedChars() {
+ final String inputXml = "\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("key", "<>&\"'"));
+
+ final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map.get("key"), actual.map.get("key"));
+ }
+
+ @Test
+ public void serializeMapUTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserEncodeUTF8.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void dontSerializeMapUTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMapUTF8Characters() {
+ final String inputXml = "\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ"));
+
+ final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map.get("key"), actual.map.get("key"));
+ }
+
+}
diff --git a/src/test/java/unittests/EscapeMapWithAttributesTest.java b/src/test/java/unittests/EscapeMapWithAttributesTest.java
new file mode 100644
index 0000000..2d60b57
--- /dev/null
+++ b/src/test/java/unittests/EscapeMapWithAttributesTest.java
@@ -0,0 +1,161 @@
+package unittests;
+
+import org.junit.Test;
+import xmlparser.XmlParser;
+import xmlparser.annotations.XmlMapWithAttributes;
+import xmlparser.annotations.XmlMapWithChildNodes;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static xmlparser.XmlParser.newXmlParser;
+
+public class EscapeMapWithAttributesTest {
+
+ private final XmlParser parserDefault = new XmlParser();
+ private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build();
+
+ private static class PojoMap {
+ @XmlMapWithAttributes(keyName = "key")
+ private final Map map1;
+ @XmlMapWithAttributes(keyName = "key", valueName = "value")
+ private final Map map2;
+
+ private PojoMap(final Map map1, final Map map2) {
+ this.map1 = map1;
+ this.map2 = map2;
+ }
+ }
+
+ @Test
+ public void serializeMap1WithDangerousChars() {
+ final PojoMap inputPojo = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null);
+ final String expected = "\n" +
+ " <>&"'\n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void serializeMap2WithDangerousChars() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("<>&\"'", "<>&\"'"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap1WithEscapedChars() {
+ final String inputXml = "\n" +
+ " <>&"'\n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null);
+
+ final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map1.get("<>&\"'"), actual.map1.get("<>&\"'"));
+ }
+
+ @Test
+ public void deserializeMap2WithEscapedChars() {
+ final String inputXml = "\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(null, Map.of("<>&\"'", "<>&\"'"));
+
+ final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map2.get("<>&\"'"), actual.map2.get("<>&\"'"));
+ }
+
+ @Test
+ public void serializeMap1UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+ final String expected = "\n" +
+ " ƑƟƠƄǠȒ\n" +
+ "\n";
+
+ final String actual = parserEncodeUTF8.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void dontSerializeMap1UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+ final String expected = "\n" +
+ " ƑƟƠƄǠȒ\n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap1UTF8Characters() {
+ final String inputXml = "\n" +
+ " ƑƟƠƄǠȒ\n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+
+ final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map1.get("ƑƟƠƄǠȒ"), actual.map1.get("ƑƟƠƄǠȒ"));
+ }
+
+ @Test
+ public void serializeMap2UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserEncodeUTF8.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void dontSerializeMap2UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap2UTF8Characters() {
+ final String inputXml = "\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+
+ final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map2.get("ƑƟƠƄǠȒ"), actual.map2.get("ƑƟƠƄǠȒ"));
+ }
+
+}
diff --git a/src/test/java/unittests/EscapeMapWithChildNodesTest.java b/src/test/java/unittests/EscapeMapWithChildNodesTest.java
new file mode 100644
index 0000000..9f51842
--- /dev/null
+++ b/src/test/java/unittests/EscapeMapWithChildNodesTest.java
@@ -0,0 +1,192 @@
+package unittests;
+
+import model.Pojo;
+import model.PojoWithAttribute;
+import org.junit.Test;
+import xmlparser.XmlParser;
+import xmlparser.annotations.XmlMapWithChildNodes;
+
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static xmlparser.XmlParser.newXmlParser;
+
+public class EscapeMapWithChildNodesTest {
+
+ private final XmlParser parserDefault = new XmlParser();
+ private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build();
+
+ private static class PojoMap {
+ @XmlMapWithChildNodes(keyName = "key")
+ private final Map map1;
+ @XmlMapWithChildNodes(keyName = "key", valueName = "value")
+ private final Map map2;
+
+ private PojoMap(final Map map1, final Map map2) {
+ this.map1 = map1;
+ this.map2 = map2;
+ }
+ }
+
+ @Test
+ public void serializeMap1WithDangerousChars() {
+ final PojoMap inputPojo = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null);
+ final String expected = "\n" +
+ " \n" +
+ " <>&"'\n" +
+ " <>&"'\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void serializeMap2WithDangerousChars() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("<>&\"'", "<>&\"'"));
+ final String expected = "\n" +
+ " \n" +
+ " <>&"'\n" +
+ " <>&"'\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap1WithEscapedChars() {
+ final String inputXml = "\n" +
+ " \n" +
+ " <>&"'\n" +
+ " <>&"'\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null);
+
+ final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map1.get("<>&\"'"), actual.map1.get("<>&\"'"));
+ }
+
+ @Test
+ public void deserializeMap2WithEscapedChars() {
+ final String inputXml = "\n" +
+ " \n" +
+ " <>&"'\n" +
+ " <>&"'\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(null, Map.of("<>&\"'", "<>&\"'"));
+
+ final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map2.get("<>&\"'"), actual.map2.get("<>&\"'"));
+ }
+
+ @Test
+ public void serializeMap1UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+ final String expected = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserEncodeUTF8.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void dontSerializeMap1UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+ final String expected = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap1UTF8Characters() {
+ final String inputXml = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null);
+
+ final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map1.get("ƑƟƠƄǠȒ"), actual.map1.get("ƑƟƠƄǠȒ"));
+ }
+
+ @Test
+ public void serializeMap2UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserEncodeUTF8.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void dontSerializeMap2UTF8Characters() {
+ final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+ final String expected = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+
+ final String actual = parserDefault.toXml(inputPojo);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected, actual);
+ }
+
+ @Test
+ public void deserializeMap2UTF8Characters() {
+ final String inputXml = "\n" +
+ " \n" +
+ " ƑƟƠƄǠȒ\n" +
+ " ƑƟƠƄǠȒ\n" +
+ " \n" +
+ "\n";
+ final PojoMap expected = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"));
+
+ final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class);
+
+ assertNotNull("No serialization response", actual);
+ assertEquals("Invalid serialized output", expected.map2.get("ƑƟƠƄǠȒ"), actual.map2.get("ƑƟƠƄǠȒ"));
+ }
+
+}