diff options
author | Andrey Somov <public.somov@gmail.com> | 2022-05-31 16:01:04 +0400 |
---|---|---|
committer | Andrey Somov <public.somov@gmail.com> | 2022-05-31 16:01:04 +0400 |
commit | 5056a448f09c46250346c338e821386caa751182 (patch) | |
tree | 388c97227256693f359d0bd289a11598a49c465f /src/main/java/org/yaml/snakeyaml | |
parent | 4ef36c5b15429bca51f04ac00f5559570a22822f (diff) | |
download | snakeyaml-5056a448f09c46250346c338e821386caa751182.tar.gz |
Issue 531: improve
Diffstat (limited to 'src/main/java/org/yaml/snakeyaml')
3 files changed, 37 insertions, 27 deletions
diff --git a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java index a9ad9cd4..454ea4c9 100644 --- a/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java +++ b/src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java @@ -15,21 +15,6 @@ */ package org.yaml.snakeyaml.constructor; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.TypeDescription; -import org.yaml.snakeyaml.composer.Composer; -import org.yaml.snakeyaml.composer.ComposerException; -import org.yaml.snakeyaml.error.YAMLException; -import org.yaml.snakeyaml.introspector.PropertyUtils; -import org.yaml.snakeyaml.nodes.CollectionNode; -import org.yaml.snakeyaml.nodes.MappingNode; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.nodes.NodeId; -import org.yaml.snakeyaml.nodes.NodeTuple; -import org.yaml.snakeyaml.nodes.ScalarNode; -import org.yaml.snakeyaml.nodes.SequenceNode; -import org.yaml.snakeyaml.nodes.Tag; - import java.lang.reflect.Array; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -48,6 +33,21 @@ import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.TypeDescription; +import org.yaml.snakeyaml.composer.Composer; +import org.yaml.snakeyaml.composer.ComposerException; +import org.yaml.snakeyaml.error.YAMLException; +import org.yaml.snakeyaml.introspector.PropertyUtils; +import org.yaml.snakeyaml.nodes.CollectionNode; +import org.yaml.snakeyaml.nodes.MappingNode; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeId; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.ScalarNode; +import org.yaml.snakeyaml.nodes.SequenceNode; +import org.yaml.snakeyaml.nodes.Tag; + public abstract class BaseConstructor { /** * It maps the node kind to the the Construct implementation. When the @@ -214,6 +214,8 @@ public abstract class BaseConstructor { * @return Java instance */ protected Object constructObject(Node node) { +// System.out.println(" <<<< " + node.getAnchor() + " : " + node.getTag() + " : " +// + System.identityHashCode(node)); if (constructedObjects.containsKey(node)) { return constructedObjects.get(node); } @@ -221,10 +223,6 @@ public abstract class BaseConstructor { } protected Object constructObjectNoCheck(Node node) { - if (recursiveObjects.contains(node)) { - throw new ConstructorException(null, null, "found unconstructable recursive node", - node.getStartMark()); - } recursiveObjects.add(node); Construct constructor = getConstructor(node); Object data = (constructedObjects.containsKey(node)) ? constructedObjects.get(node) @@ -232,10 +230,10 @@ public abstract class BaseConstructor { finalizeConstruction(node, data); constructedObjects.put(node, data); - recursiveObjects.remove(node); if (node.isTwoStepsConstruction()) { constructor.construct2ndStep(node, data); } + recursiveObjects.remove(node); return data; } @@ -467,6 +465,10 @@ public abstract class BaseConstructor { for (NodeTuple tuple : nodeValue) { Node keyNode = tuple.getKeyNode(); Node valueNode = tuple.getValueNode(); + +// System.out.println( +// " >>>> " + keyNode.isTwoStepsConstruction() + " : " + keyNode.getStartMark()); + Object key = constructObject(keyNode); if (key != null) { try { diff --git a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java index ee887dcd..7ef83854 100644 --- a/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java +++ b/src/main/java/org/yaml/snakeyaml/constructor/Constructor.java @@ -298,7 +298,8 @@ public class Constructor extends SafeConstructor { Object newInstance = memberDescription.newInstance(propertyName, node); if (newInstance != null) { constructedObjects.put(node, newInstance); - return constructObjectNoCheck(node); + return + constructObjectNoCheck(node); } return constructObject(node); } diff --git a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java index f38c4e9a..190d93ad 100644 --- a/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java +++ b/src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java @@ -107,12 +107,19 @@ public class SafeConstructor extends BaseConstructor { } Object key = constructObject(keyNode); if (key != null && !forceStringKeys) { - try { - key.hashCode();// check circular dependencies - } catch (Exception e) { - throw new ConstructorException("while constructing a mapping", - node.getStartMark(), "found unacceptable key " + key, - tuple.getKeyNode().getStartMark(), e); + if (keyNode.isTwoStepsConstruction()) { + if(!loadingConfig.getAllowRecursiveKeys()) { + throw new YAMLException( + "Recursive key is detected but it is not configured to be allowed."); + } else { + try { + key.hashCode();// check circular dependencies + } catch (Exception e) { + throw new ConstructorException("while constructing a mapping", + node.getStartMark(), "found unacceptable key " + key, + tuple.getKeyNode().getStartMark(), e); + } + } } } |