diff --git a/src/main/java/org/json/XMLParserConfiguration.java b/src/main/java/org/json/XMLParserConfiguration.java index 144c92a..b9e752c 100644 --- a/src/main/java/org/json/XMLParserConfiguration.java +++ b/src/main/java/org/json/XMLParserConfiguration.java @@ -24,6 +24,7 @@ SOFTWARE. */ import java.util.Collections; +import java.util.HashMap; import java.util.Map; @@ -278,7 +279,8 @@ public class XMLParserConfiguration { */ public XMLParserConfiguration withXsiTypeMap(final Map> xsiTypeMap) { XMLParserConfiguration newConfig = this.clone(); - newConfig.xsiTypeMap = Collections.unmodifiableMap(xsiTypeMap); + Map> cloneXsiTypeMap = new HashMap>(xsiTypeMap); + newConfig.xsiTypeMap = Collections.unmodifiableMap(cloneXsiTypeMap); return newConfig; } } diff --git a/src/test/java/org/json/junit/XMLTest.java b/src/test/java/org/json/junit/XMLTest.java index 1cfd6b5..62ee516 100644 --- a/src/test/java/org/json/junit/XMLTest.java +++ b/src/test/java/org/json/junit/XMLTest.java @@ -1033,4 +1033,39 @@ public class XMLTest { Util.compareActualVsExpectedJsonObjects(actualJson,expectedJson); } + @Test + public void testToJsonWithXSITypeWhenTypeConversionNotEnabledOnOne() { + String originalXml = "1234554321"; + String expectedJsonString = "{\"root\":{\"asString\":\"12345\",\"asInt\":54321}}"; + JSONObject expectedJson = new JSONObject(expectedJsonString); + Map> xsiTypeMap = new HashMap>(); + xsiTypeMap.put("string", new XMLXsiTypeConverter() { + @Override public String convert(final String value) { + return value; + } + }); + JSONObject actualJson = XML.toJSONObject(originalXml, new XMLParserConfiguration().withXsiTypeMap(xsiTypeMap)); + Util.compareActualVsExpectedJsonObjects(actualJson,expectedJson); + } + + @Test + public void testXSITypeMapNotModifiable() { + Map> xsiTypeMap = new HashMap>(); + XMLParserConfiguration config = new XMLParserConfiguration().withXsiTypeMap(xsiTypeMap); + xsiTypeMap.put("string", new XMLXsiTypeConverter() { + @Override public String convert(final String value) { + return value; + } + }); + assertEquals("Config Conversion Map size is expected to be 0", 0, config.getXsiTypeMap().size()); + + try { + config.getXsiTypeMap().put("boolean", new XMLXsiTypeConverter() { + @Override public Boolean convert(final String value) { + return Boolean.valueOf(value); + } + }); + fail("Expected to be unable to modify the config"); + } catch (Exception ignored) { } + } }