1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
Description: Fixes the compatibility with the version of SnakeYAML in Debian
Origin: backport, https://github.com/spring-projects/spring-framework/commit/138b0d0bbdf65b0da181a06e5fc79cda05fb1e71
--- a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.Reader;
-import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -26,14 +25,11 @@
import java.util.List;
import java.util.Map;
import java.util.Properties;
-import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.nodes.MappingNode;
-import org.yaml.snakeyaml.parser.ParserException;
import org.yaml.snakeyaml.reader.UnicodeReader;
import org.springframework.core.CollectionFactory;
@@ -141,9 +137,14 @@
/**
* Create the {@link Yaml} instance to use.
+ * <p>The default implementation sets the "allowDuplicateKeys" flag to {@code false},
+ * enabling built-in duplicate key handling in SnakeYAML 1.18+.
+ * @see LoaderOptions#setAllowDuplicateKeys(boolean)
*/
protected Yaml createYaml() {
- return new Yaml(new StrictMapAppenderConstructor());
+ LoaderOptions options = new LoaderOptions();
+ options.setAllowDuplicateKeys(false);
+ return new Yaml(options);
}
private boolean process(MatchCallback callback, Yaml yaml, Resource resource) {
@@ -387,45 +388,4 @@
FIRST_FOUND
}
-
- /**
- * A specialized {@link Constructor} that checks for duplicate keys.
- */
- protected static class StrictMapAppenderConstructor extends Constructor {
-
- // Declared as public for use in subclasses
- public StrictMapAppenderConstructor() {
- super();
- }
-
- @Override
- protected Map<Object, Object> constructMapping(MappingNode node) {
- try {
- return super.constructMapping(node);
- }
- catch (IllegalStateException ex) {
- throw new ParserException("while parsing MappingNode",
- node.getStartMark(), ex.getMessage(), node.getEndMark());
- }
- }
-
- @Override
- protected Map<Object, Object> createDefaultMap() {
- final Map<Object, Object> delegate = super.createDefaultMap();
- return new AbstractMap<Object, Object>() {
- @Override
- public Object put(Object key, Object value) {
- if (delegate.containsKey(key)) {
- throw new IllegalStateException("Duplicate key: " + key);
- }
- return delegate.put(key, value);
- }
- @Override
- public Set<Entry<Object, Object>> entrySet() {
- return delegate.entrySet();
- }
- };
- }
- }
-
}
|