You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by co...@apache.org on 2020/03/03 07:59:46 UTC

[camel] branch camel-2.25.x updated: Updating to SnakeYaml 1.26

This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch camel-2.25.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-2.25.x by this push:
     new 707b025  Updating to SnakeYaml 1.26
707b025 is described below

commit 707b025aab2560aa1ce28bca63359d2f2f6f8a68
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Tue Mar 3 07:22:55 2020 +0000

    Updating to SnakeYaml 1.26
---
 .../component/snakeyaml/SnakeYAMLDataFormat.java   | 35 +++++-----
 .../custom/CustomClassLoaderConstructor.java       | 75 ++++------------------
 .../component/snakeyaml/SnakeYAMLDoSTest.java      |  2 +-
 parent/pom.xml                                     |  2 +-
 4 files changed, 35 insertions(+), 79 deletions(-)

diff --git a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
index 2218bc8..96b955c 100644
--- a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
+++ b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
@@ -34,17 +34,17 @@ import java.util.function.Function;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.snakeyaml.custom.CustomClassLoaderConstructor;
-import org.apache.camel.component.snakeyaml.custom.CustomConstructor;
-import org.apache.camel.component.snakeyaml.custom.CustomSafeConstructor;
-import org.apache.camel.component.snakeyaml.custom.Yaml;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatName;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.IOHelper;
 import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.LoaderOptions;
 import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.BaseConstructor;
 import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
 import org.yaml.snakeyaml.nodes.Tag;
 import org.yaml.snakeyaml.representer.Representer;
 import org.yaml.snakeyaml.resolver.Resolver;
@@ -131,12 +131,16 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
         }
 
         if (yaml == null) {
+            LoaderOptions options = new LoaderOptions();
+            options.setAllowRecursiveKeys(allowRecursiveKeys);
+            options.setMaxAliasesForCollections(maxAliasesForCollections);
+
             yaml = new Yaml(
                 this.constructor.apply(context),
                 this.representer.apply(context),
                 this.dumperOptions.apply(context),
-                this.resolver.apply(context),
-                maxAliasesForCollections
+                options,
+                this.resolver.apply(context)
             );
 
             yamlCache.set(new WeakReference<>(yaml));
@@ -370,6 +374,10 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
             yamlTypeFilters = Collections.singletonList(TypeFilters.allowAll());
         }
 
+        LoaderOptions options = new LoaderOptions();
+        options.setAllowRecursiveKeys(allowRecursiveKeys);
+        options.setMaxAliasesForCollections(maxAliasesForCollections);
+
         BaseConstructor yamlConstructor;
         if (yamlTypeFilters != null) {
             ClassLoader yamlClassLoader = this.classLoader;
@@ -378,11 +386,10 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
             }
 
             yamlConstructor = yamlClassLoader != null
-                ? typeFilterConstructor(yamlClassLoader, yamlTypeFilters, allowRecursiveKeys)
-                : typeFilterConstructor(yamlTypeFilters, allowRecursiveKeys);
+                ? typeFilterConstructor(yamlClassLoader, yamlTypeFilters, options)
+                : typeFilterConstructor(yamlTypeFilters, options);
         } else {
-            yamlConstructor = new CustomSafeConstructor();
-            ((CustomSafeConstructor)yamlConstructor).setAllowRecursiveKeys(allowRecursiveKeys);
+            yamlConstructor = new SafeConstructor(options);
         }
 
         if (typeDescriptions != null && yamlConstructor instanceof Constructor) {
@@ -421,8 +428,8 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
     // Constructors
     // ***************************
 
-    private static Constructor typeFilterConstructor(final Collection<TypeFilter> typeFilters, boolean allowRecursiveKeys) {
-        CustomConstructor constructor = new CustomConstructor() {
+    private static Constructor typeFilterConstructor(final Collection<TypeFilter> typeFilters, LoaderOptions options) {
+        Constructor constructor = new Constructor(options) {
             @Override
             protected Class<?> getClassForName(String name) throws ClassNotFoundException {
                 if (typeFilters.stream().noneMatch(f -> f.test(name))) {
@@ -432,13 +439,12 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
                 return super.getClassForName(name);
             }
         };
-        constructor.setAllowRecursiveKeys(allowRecursiveKeys);
         return constructor;
     }
 
     private static Constructor typeFilterConstructor(final ClassLoader classLoader, final Collection<TypeFilter> typeFilters,
-                                                     boolean allowRecursiveKeys) {
-        CustomClassLoaderConstructor constructor = new CustomClassLoaderConstructor(classLoader) {
+                                                     LoaderOptions options) {
+        CustomClassLoaderConstructor constructor = new CustomClassLoaderConstructor(classLoader, options) {
             @Override
             protected Class<?> getClassForName(String name) throws ClassNotFoundException {
                 if (typeFilters.stream().noneMatch(f -> f.test(name))) {
@@ -448,7 +454,6 @@ public final class SnakeYAMLDataFormat extends ServiceSupport implements DataFor
                 return super.getClassForName(name);
             }
         };
-        constructor.setAllowRecursiveKeys(allowRecursiveKeys);
         return constructor;
     }
 }
diff --git a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/custom/CustomClassLoaderConstructor.java b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/custom/CustomClassLoaderConstructor.java
index b6cb6bf..f9e8497 100644
--- a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/custom/CustomClassLoaderConstructor.java
+++ b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/custom/CustomClassLoaderConstructor.java
@@ -16,75 +16,26 @@
  */
 package org.apache.camel.component.snakeyaml.custom;
 
-import java.util.List;
-import java.util.Map;
-
-import org.yaml.snakeyaml.constructor.ConstructorException;
-import org.yaml.snakeyaml.error.Mark;
-import org.yaml.snakeyaml.error.YAMLException;
-import org.yaml.snakeyaml.nodes.MappingNode;
-import org.yaml.snakeyaml.nodes.Node;
-import org.yaml.snakeyaml.nodes.NodeTuple;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.constructor.Constructor;
 
 /**
- * A CustomClassLoaderConstructor which picks up the options to disallow recursive keys
- *
- * NOTE - If this PR gets applied then we can remove it:
- * https://bitbucket.org/asomov/snakeyaml/pull-requests/55/allow-configuration-for-preventing-billion/diff
+ * A CustomClassLoaderConstructor which allows to set the LoaderOptions
  */
-public class CustomClassLoaderConstructor extends org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor {
+public class CustomClassLoaderConstructor extends Constructor {
 
-    private boolean allowRecursiveKeys;
-
-    public CustomClassLoaderConstructor(ClassLoader cLoader) {
-        super(cLoader);
-    }
+    private ClassLoader loader = this.getClass().getClassLoader();
 
-    public CustomClassLoaderConstructor(Class<? extends Object> theRoot, ClassLoader theLoader) {
-        super(theRoot, theLoader);
-    }
-
-    @Override
-    protected void constructMapping2ndStep(MappingNode node, Map<Object, Object> mapping) {
-        List<NodeTuple> nodeValue = node.getValue();
-        for (NodeTuple tuple : nodeValue) {
-            Node keyNode = tuple.getKeyNode();
-            Node valueNode = tuple.getValueNode();
-            Object key = constructObject(keyNode);
-            if (key != null) {
-                try {
-                    key.hashCode(); // check circular dependencies
-                } catch (Exception e) {
-                    throw new CustomConstructorException("while constructing a mapping",
-                            node.getStartMark(), "found unacceptable key " + key,
-                            tuple.getKeyNode().getStartMark(), e);
-                }
-            }
-            Object value = constructObject(valueNode);
-            if (keyNode.isTwoStepsConstruction()) {
-                if (allowRecursiveKeys) {
-                    postponeMapFilling(mapping, key, value);
-                } else {
-                    throw new YAMLException("Recursive key for mapping is detected but it is not configured to be allowed.");
-                }
-            } else {
-                mapping.put(key, value);
-            }
+    public CustomClassLoaderConstructor(ClassLoader theLoader, LoaderOptions options) {
+        super(Object.class, options);
+        if (theLoader == null) {
+            throw new NullPointerException("Loader must be provided.");
         }
+        this.loader = theLoader;
     }
 
-    public boolean isAllowRecursiveKeys() {
-        return allowRecursiveKeys;
-    }
-
-    public void setAllowRecursiveKeys(boolean allowRecursiveKeys) {
-        this.allowRecursiveKeys = allowRecursiveKeys;
-    }
-
-    private static class CustomConstructorException extends ConstructorException {
-        public CustomConstructorException(String context, Mark contextMark, String problem,
-                                       Mark problemMark, Throwable cause) {
-            super(context, contextMark, problem, problemMark, cause);
-        }
+    @Override
+    protected Class<?> getClassForName(String name) throws ClassNotFoundException {
+        return Class.forName(name, true, loader);
     }
 }
diff --git a/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLDoSTest.java b/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLDoSTest.java
index b338419..5acd223 100644
--- a/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLDoSTest.java
+++ b/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLDoSTest.java
@@ -24,9 +24,9 @@ import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.snakeyaml.custom.Yaml;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
+import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.SafeConstructor;
 
 public class SnakeYAMLDoSTest extends CamelTestSupport {
diff --git a/parent/pom.xml b/parent/pom.xml
index a237eb9..ce4dc80 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -627,7 +627,7 @@
     <slf4j-api-version>1.7.26</slf4j-api-version>
     <slf4j-version>1.7.26</slf4j-version>
     <smack-version>4.3.1</smack-version>
-    <snakeyaml-version>1.25</snakeyaml-version>
+    <snakeyaml-version>1.26</snakeyaml-version>
     <snappy-version>1.1.4</snappy-version>
     <snmp4j-version>2.6.3_1</snmp4j-version>
     <solr-bundle-version>7.5.0_1</solr-bundle-version>