aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/yaml/snakeyaml
diff options
context:
space:
mode:
authorAndrey Somov <public.somov@gmail.com>2022-05-31 16:01:04 +0400
committerAndrey Somov <public.somov@gmail.com>2022-05-31 16:01:04 +0400
commit5056a448f09c46250346c338e821386caa751182 (patch)
tree388c97227256693f359d0bd289a11598a49c465f /src/main/java/org/yaml/snakeyaml
parent4ef36c5b15429bca51f04ac00f5559570a22822f (diff)
downloadsnakeyaml-5056a448f09c46250346c338e821386caa751182.tar.gz
Issue 531: improve
Diffstat (limited to 'src/main/java/org/yaml/snakeyaml')
-rw-r--r--src/main/java/org/yaml/snakeyaml/constructor/BaseConstructor.java42
-rw-r--r--src/main/java/org/yaml/snakeyaml/constructor/Constructor.java3
-rw-r--r--src/main/java/org/yaml/snakeyaml/constructor/SafeConstructor.java19
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);
+ }
+ }
}
}