Repository: camel
Updated Branches:
  refs/heads/master 97c021e47 -> a48ffc0eb


CAMEL-10576: snakeyaml : as the snakeyaml parser is not thread safe, object 
like Constructor, Resolver etc should be provided by a factory/supplier


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a48ffc0e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a48ffc0e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a48ffc0e

Branch: refs/heads/master
Commit: a48ffc0eb4f8689b789668179211815fba827c23
Parents: 97c021e
Author: lburgazzoli <lburgazz...@gmail.com>
Authored: Tue Dec 13 17:23:06 2016 +0100
Committer: lburgazzoli <lburgazz...@gmail.com>
Committed: Tue Dec 13 17:23:06 2016 +0100

----------------------------------------------------------------------
 .../snakeyaml/SnakeYAMLDataFormat.java          | 161 +++++++++++--------
 1 file changed, 91 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a48ffc0e/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
----------------------------------------------------------------------
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 e88994b..e012b7a 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
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Function;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
@@ -51,12 +52,12 @@ import org.yaml.snakeyaml.resolver.Resolver;
  * A <a href="http://camel.apache.org/data-format.html";>data format</a> 
({@link DataFormat})
  * using <a href="http://www.snakeyaml.org";>SnakeYAML</a> to marshal to and 
from YAML.
  */
-public class SnakeYAMLDataFormat extends ServiceSupport implements DataFormat, 
DataFormatName {
+public final class SnakeYAMLDataFormat extends ServiceSupport implements 
DataFormat, DataFormatName {
     private final ThreadLocal<WeakReference<Yaml>> yamlCache;
-    private BaseConstructor constructor;
-    private Representer representer;
-    private DumperOptions dumperOptions;
-    private Resolver resolver;
+    private Function<CamelContext, BaseConstructor> constructor;
+    private Function<CamelContext, Representer> representer;
+    private Function<CamelContext, DumperOptions> dumperOptions;
+    private Function<CamelContext, Resolver> resolver;
     private ClassLoader classLoader;
     private Class<?> unmarshalType;
     private List<TypeDescription> typeDescriptions;
@@ -75,6 +76,10 @@ public class SnakeYAMLDataFormat extends ServiceSupport 
implements DataFormat, D
         this.useApplicationContextClassLoader = true;
         this.prettyFlow = false;
         this.allowAnyType = false;
+        this.constructor = this::defaultConstructor;
+        this.representer = this::defaultRepresenter;
+        this.dumperOptions = this::defaultDumperOptions;
+        this.resolver = this::defaultResolver;
 
         if (type != null) {
             this.unmarshalType = type;
@@ -103,6 +108,16 @@ public class SnakeYAMLDataFormat extends ServiceSupport 
implements DataFormat, D
         }
     }
 
+    @Override
+    protected void doStart() throws Exception {
+        // noop
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        // noop
+    }
+
     protected Yaml getYaml(CamelContext context) {
         Yaml yaml = null;
         WeakReference<Yaml> ref = yamlCache.get();
@@ -112,111 +127,60 @@ public class SnakeYAMLDataFormat extends ServiceSupport 
implements DataFormat, D
         }
 
         if (yaml == null) {
-            BaseConstructor yamlConstructor = this.constructor;
-            Representer yamlRepresenter = this.representer;
-            DumperOptions yamlDumperOptions = this.dumperOptions;
-            Resolver yamlResolver = this.resolver;
-            ClassLoader yamlClassLoader = this.classLoader;
-            Collection<TypeFilter> yamlTypeFilters = this.typeFilters;
-
-            if (yamlClassLoader == null && useApplicationContextClassLoader) {
-                yamlClassLoader = context.getApplicationContextClassLoader();
-            }
-
-            if (yamlConstructor == null) {
-                if (allowAnyType) {
-                    yamlTypeFilters = 
Collections.singletonList(TypeFilters.allowAll());
-                }
-
-                if (yamlTypeFilters != null) {
-                    yamlConstructor = yamlClassLoader != null
-                        ? typeFilterConstructor(yamlClassLoader, 
yamlTypeFilters)
-                        : typeFilterConstructor(yamlTypeFilters);
-                } else {
-                    yamlConstructor = new SafeConstructor();
-                }
+            yaml = new Yaml(
+                this.constructor.apply(context),
+                this.representer.apply(context),
+                this.dumperOptions.apply(context),
+                this.resolver.apply(context)
+            );
 
-                if (typeDescriptions != null && yamlConstructor instanceof 
Constructor) {
-                    for (TypeDescription typeDescription : typeDescriptions) {
-                        
((Constructor)yamlConstructor).addTypeDescription(typeDescription);
-                    }
-                }
-            }
-            if (yamlRepresenter == null) {
-                yamlRepresenter = new Representer();
-
-                if (classTags != null) {
-                    for (Map.Entry<Class<?>, Tag> entry : 
classTags.entrySet()) {
-                        yamlRepresenter.addClassTag(entry.getKey(), 
entry.getValue());
-                    }
-                }
-            }
-            if (yamlDumperOptions == null) {
-                yamlDumperOptions = new DumperOptions();
-                yamlDumperOptions.setPrettyFlow(prettyFlow);
-            }
-            if (yamlResolver == null) {
-                yamlResolver = new Resolver();
-            }
-
-            yaml = new Yaml(yamlConstructor, yamlRepresenter, 
yamlDumperOptions, yamlResolver);
             yamlCache.set(new WeakReference<>(yaml));
         }
 
         return yaml;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
-
-    public BaseConstructor getConstructor() {
+    public Function<CamelContext, BaseConstructor> getConstructor() {
         return constructor;
     }
 
     /**
      * BaseConstructor to construct incoming documents.
      */
-    public void setConstructor(BaseConstructor constructor) {
+    public void setConstructor(Function<CamelContext, BaseConstructor> 
constructor) {
         this.constructor = constructor;
     }
 
-    public Representer getRepresenter() {
+    public Function<CamelContext, Representer> getRepresenter() {
         return representer;
     }
 
     /**
      * Representer to emit outgoing objects.
      */
-    public void setRepresenter(Representer representer) {
+    public void setRepresenter(Function<CamelContext, Representer> 
representer) {
         this.representer = representer;
     }
 
-    public DumperOptions getDumperOptions() {
+    public Function<CamelContext, DumperOptions> getDumperOptions() {
         return dumperOptions;
     }
 
     /**
      * DumperOptions to configure outgoing objects.
      */
-    public void setDumperOptions(DumperOptions dumperOptions) {
+    public void setDumperOptions(Function<CamelContext, DumperOptions> 
dumperOptions) {
         this.dumperOptions = dumperOptions;
     }
 
-    public Resolver getResolver() {
+    public Function<CamelContext, Resolver> getResolver() {
         return resolver;
     }
 
     /**
      * Resolver to detect implicit type
      */
-    public void setResolver(Resolver resolver) {
+    public void setResolver(Function<CamelContext, Resolver> resolver) {
         this.resolver = resolver;
     }
 
@@ -370,6 +334,63 @@ public class SnakeYAMLDataFormat extends ServiceSupport 
implements DataFormat, D
     }
 
     // ***************************
+    // Defaults
+    // ***************************
+
+    private BaseConstructor defaultConstructor(CamelContext context) {
+        ClassLoader yamlClassLoader = this.classLoader;
+        Collection<TypeFilter> yamlTypeFilters = this.typeFilters;
+
+        if (yamlClassLoader == null && useApplicationContextClassLoader) {
+            yamlClassLoader = context.getApplicationContextClassLoader();
+        }
+
+        if (allowAnyType) {
+            yamlTypeFilters = 
Collections.singletonList(TypeFilters.allowAll());
+        }
+
+        BaseConstructor yamlConstructor;
+        if (yamlTypeFilters != null) {
+            yamlConstructor = yamlClassLoader != null
+                ? typeFilterConstructor(yamlClassLoader, yamlTypeFilters)
+                : typeFilterConstructor(yamlTypeFilters);
+        } else {
+            yamlConstructor = new SafeConstructor();
+        }
+
+        if (typeDescriptions != null && yamlConstructor instanceof 
Constructor) {
+            for (TypeDescription typeDescription : typeDescriptions) {
+                
((Constructor)yamlConstructor).addTypeDescription(typeDescription);
+            }
+        }
+
+        return yamlConstructor;
+    }
+
+    private Representer defaultRepresenter(CamelContext context) {
+        Representer yamlRepresenter = new Representer();
+
+        if (classTags != null) {
+            for (Map.Entry<Class<?>, Tag> entry : classTags.entrySet()) {
+                yamlRepresenter.addClassTag(entry.getKey(), entry.getValue());
+            }
+        }
+
+        return yamlRepresenter;
+    }
+
+    private DumperOptions defaultDumperOptions(CamelContext context) {
+        DumperOptions yamlDumperOptions = new DumperOptions();
+        yamlDumperOptions.setPrettyFlow(prettyFlow);
+
+        return yamlDumperOptions;
+    }
+
+    private Resolver defaultResolver(CamelContext context) {
+        return new Resolver();
+    }
+
+    // ***************************
     // Constructors
     // ***************************
 

Reply via email to