From 2391d248cc77202eb31d0e4df0edecfbde4ab2dc Mon Sep 17 00:00:00 2001 From: Tamas Perger Date: Fri, 10 Feb 2023 01:45:34 +0000 Subject: [PATCH] fix: amend XMLParserConfiguration.clone() to include the new maxNestingDepth param. Amend Javadoc for XML and XMLParserConfiguration classes. --- src/main/java/org/json/XML.java | 24 ++++++---- .../java/org/json/XMLParserConfiguration.java | 48 ++++++++++--------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/json/XML.java b/src/main/java/org/json/XML.java index db3c79fff..925f056b1 100644 --- a/src/main/java/org/json/XML.java +++ b/src/main/java/org/json/XML.java @@ -98,7 +98,7 @@ public void remove() { /** * Replace special characters with XML escapes: * - *
{@code 
+     * 
{@code
      * & (ampersand) is replaced by &
      * < (less than) is replaced by &lt;
      * > (greater than) is replaced by &gt;
@@ -229,8 +229,12 @@ public static void noSpace(String string) throws JSONException {
      *            The JSONObject that will include the new material.
      * @param name
      *            The tag name.
+     * @param config
+     *            The XML parser configuration.
+     * @param currentNestingDepth
+     *            The current nesting depth.
      * @return true if the close tag is processed.
-     * @throws JSONException
+     * @throws JSONException Thrown if any parsing error occurs.
      */
     private static boolean parse(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config, int currentNestingDepth)
             throws JSONException {
@@ -427,7 +431,7 @@ private static boolean parse(XMLTokener x, JSONObject context, String name, XMLP
                                         context.accumulate(tagName, jsonObject);
                                     }
                                 }
-                                
+
                                 return false;
                             }
                         }
@@ -491,7 +495,7 @@ public static Object stringToValue(String string) {
         }
         return string;
     }
-    
+
     /**
      * direct copy of {@link JSONObject#stringToNumber(String)} to maintain Android support.
      */
@@ -538,7 +542,7 @@ private static Number stringToNumber(final String val) throws NumberFormatExcept
             // integer representation.
             // This will narrow any values to the smallest reasonable Object representation
             // (Integer, Long, or BigInteger)
-            
+
             // BigInteger down conversion: We use a similar bitLength compare as
             // BigInteger#intValueExact uses. Increases GC, but objects hold
             // only what they need. i.e. Less runtime overhead if the value is
@@ -554,7 +558,7 @@ private static Number stringToNumber(final String val) throws NumberFormatExcept
         }
         throw new NumberFormatException("val ["+val+"] is not a valid number.");
     }
-    
+
     /**
      * direct copy of {@link JSONObject#isDecimalNotation(String)} to maintain Android support.
      */
@@ -572,7 +576,7 @@ private static boolean isDecimalNotation(final String val) {
      * name/value pairs and arrays of values. JSON does not does not like to
      * distinguish between elements and attributes. Sequences of similar
      * elements are represented as JSONArrays. Content text may be placed in a
-     * "content" member. Comments, prologs, DTDs, and 
{@code 
+     * "content" member. Comments, prologs, DTDs, and 
{@code
      * <[ [ ]]>}
* are ignored. * @@ -593,7 +597,7 @@ public static JSONObject toJSONObject(String string) throws JSONException { * name/value pairs and arrays of values. JSON does not does not like to * distinguish between elements and attributes. Sequences of similar * elements are represented as JSONArrays. Content text may be placed in a - * "content" member. Comments, prologs, DTDs, and
{@code 
+     * "content" member. Comments, prologs, DTDs, and 
{@code
      * <[ [ ]]>}
* are ignored. * @@ -673,7 +677,7 @@ public static JSONObject toJSONObject(Reader reader, XMLParserConfiguration conf * name/value pairs and arrays of values. JSON does not does not like to * distinguish between elements and attributes. Sequences of similar * elements are represented as JSONArrays. Content text may be placed in a - * "content" member. Comments, prologs, DTDs, and
{@code 
+     * "content" member. Comments, prologs, DTDs, and 
{@code
      * <[ [ ]]>}
* are ignored. * @@ -699,7 +703,7 @@ public static JSONObject toJSONObject(String string, boolean keepStrings) throws * name/value pairs and arrays of values. JSON does not does not like to * distinguish between elements and attributes. Sequences of similar * elements are represented as JSONArrays. Content text may be placed in a - * "content" member. Comments, prologs, DTDs, and
{@code 
+     * "content" member. Comments, prologs, DTDs, and 
{@code
      * <[ [ ]]>}
* are ignored. * diff --git a/src/main/java/org/json/XMLParserConfiguration.java b/src/main/java/org/json/XMLParserConfiguration.java index f118a812a..103023ed8 100644 --- a/src/main/java/org/json/XMLParserConfiguration.java +++ b/src/main/java/org/json/XMLParserConfiguration.java @@ -39,14 +39,14 @@ public class XMLParserConfiguration { * they should try to be guessed into JSON values (numeric, boolean, string) */ private boolean keepStrings; - + /** * The name of the key in a JSON Object that indicates a CDATA section. Historically this has * been the value "content" but can be changed. Use null to indicate no CDATA * processing. */ private String cDataTagName; - + /** * When parsing the XML into JSON, specifies if values with attribute xsi:nil="true" * should be kept as attribute(false), or they should be converted to @@ -66,8 +66,7 @@ public class XMLParserConfiguration { private Set forceList; /** - * When parsing the XML into JSON, specifies the tags whose values should be converted - * to arrays + * The maximum nesting depth when parsing a XML document to JSON. */ private int maxNestingDepth = DEFAULT_MAXIMUM_NESTING_DEPTH; @@ -157,15 +156,18 @@ public XMLParserConfiguration (final boolean keepStrings, final String cDataTagN * false to parse values with attribute xsi:nil="true" as {"xsi:nil":true}. * @param xsiTypeMap new HashMap>() to parse values with attribute * xsi:type="integer" as integer, xsi:type="string" as string - * @param forceList new HashSet() to parse the provided tags' values as arrays + * @param forceList new HashSet() to parse the provided tags' values as arrays + * @param maxNestingDepth int to limit the nesting depth */ private XMLParserConfiguration (final boolean keepStrings, final String cDataTagName, - final boolean convertNilAttributeToNull, final Map> xsiTypeMap, final Set forceList ) { + final boolean convertNilAttributeToNull, final Map> xsiTypeMap, final Set forceList, + final int maxNestingDepth) { this.keepStrings = keepStrings; this.cDataTagName = cDataTagName; this.convertNilAttributeToNull = convertNilAttributeToNull; this.xsiTypeMap = Collections.unmodifiableMap(xsiTypeMap); this.forceList = Collections.unmodifiableSet(forceList); + this.maxNestingDepth = maxNestingDepth; } /** @@ -183,14 +185,15 @@ protected XMLParserConfiguration clone() { this.cDataTagName, this.convertNilAttributeToNull, this.xsiTypeMap, - this.forceList + this.forceList, + this.maxNestingDepth ); } - + /** * When parsing the XML into JSON, specifies if values should be kept as strings (true), or if * they should try to be guessed into JSON values (numeric, boolean, string) - * + * * @return The keepStrings configuration value. */ public boolean isKeepStrings() { @@ -200,10 +203,10 @@ public boolean isKeepStrings() { /** * When parsing the XML into JSON, specifies if values should be kept as strings (true), or if * they should try to be guessed into JSON values (numeric, boolean, string) - * + * * @param newVal * new value to use for the keepStrings configuration option. - * + * * @return The existing configuration will not be modified. A new configuration is returned. */ public XMLParserConfiguration withKeepStrings(final boolean newVal) { @@ -216,7 +219,7 @@ public XMLParserConfiguration withKeepStrings(final boolean newVal) { * The name of the key in a JSON Object that indicates a CDATA section. Historically this has * been the value "content" but can be changed. Use null to indicate no CDATA * processing. - * + * * @return The cDataTagName configuration value. */ public String getcDataTagName() { @@ -227,10 +230,10 @@ public String getcDataTagName() { * The name of the key in a JSON Object that indicates a CDATA section. Historically this has * been the value "content" but can be changed. Use null to indicate no CDATA * processing. - * + * * @param newVal * new value to use for the cDataTagName configuration option. - * + * * @return The existing configuration will not be modified. A new configuration is returned. */ public XMLParserConfiguration withcDataTagName(final String newVal) { @@ -243,7 +246,7 @@ public XMLParserConfiguration withcDataTagName(final String newVal) { * When parsing the XML into JSON, specifies if values with attribute xsi:nil="true" * should be kept as attribute(false), or they should be converted to * null(true) - * + * * @return The convertNilAttributeToNull configuration value. */ public boolean isConvertNilAttributeToNull() { @@ -254,10 +257,10 @@ public boolean isConvertNilAttributeToNull() { * When parsing the XML into JSON, specifies if values with attribute xsi:nil="true" * should be kept as attribute(false), or they should be converted to * null(true) - * + * * @param newVal * new value to use for the convertNilAttributeToNull configuration option. - * + * * @return The existing configuration will not be modified. A new configuration is returned. */ public XMLParserConfiguration withConvertNilAttributeToNull(final boolean newVal) { @@ -295,7 +298,7 @@ public XMLParserConfiguration withXsiTypeMap(final Map} to parse the provided tags' values as arrays + * in this configuration {@code Set} to parse the provided tags' values as arrays * @return forceList unmodifiable configuration set. */ public Set getForceList() { @@ -304,8 +307,8 @@ public Set getForceList() { /** * When parsing the XML into JSON, specifies that tags that will be converted to arrays - * in this configuration {@code Set} to parse the provided tags' values as arrays - * @param forceList {@code new HashSet()} to parse the provided tags' values as arrays + * in this configuration {@code Set} to parse the provided tags' values as arrays + * @param forceList {@code new HashSet()} to parse the provided tags' values as arrays * @return The existing configuration will not be modified. A new configuration is returned. */ public XMLParserConfiguration withForceList(final Set forceList) { @@ -327,8 +330,9 @@ public int getMaxNestingDepth() { /** * Defines the maximum nesting depth that the parser will descend before throwing an exception * when parsing the XML into JSON. The default max nesting depth is 512, which means the parser - * will go as deep as the maximum call stack size allows. Using any negative value as a - * parameter is equivalent to setting no limit to the nesting depth. + * will throw a JsonException if the maximum depth is reached. + * Using any negative value as a parameter is equivalent to setting no limit to the nesting depth, + * which means the parses will go as deep as the maximum call stack size allows. * @param maxNestingDepth the maximum nesting depth allowed to the XML parser * @return The existing configuration will not be modified. A new configuration is returned. */