Repository: camel
Updated Branches:
  refs/heads/master b8a9afc28 -> 76a10b773


CAMEL-9954: OSGi ready, FactoryRegistry via Registry, Annotation for class to 
provide additional factories


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

Branch: refs/heads/master
Commit: 76a10b773bb5cc387886f70cee53a87415d1af6a
Parents: 311d429
Author: Arno Noordover <[email protected]>
Authored: Fri May 20 23:10:32 2016 +0200
Committer: Claus Ibsen <[email protected]>
Committed: Sat May 21 12:37:16 2016 +0200

----------------------------------------------------------------------
 .../bindy/BindyAbstractDataFormat.java          |  93 +++++++++++--
 .../dataformat/bindy/BindyAbstractFactory.java  |   6 +-
 .../bindy/BindyFixedLengthFactory.java          |   2 -
 .../bindy/BindyKeyValuePairFactory.java         |   1 -
 .../camel/dataformat/bindy/FormatFactory.java   |  70 ++--------
 .../bindy/annotation/FormatFactories.java       |  32 +++++
 .../bindy/csv/BindyCsvDataFormat.java           |   7 +-
 .../bindy/fixed/BindyFixedLengthDataFormat.java |   6 +-
 .../factories/BigIntegerFormatFactory.java      |   4 +-
 .../format/factories/BooleanFormatFactory.java  |   4 +-
 .../format/factories/ByteFormatFactory.java     |   4 +-
 .../factories/CharacterFormatFactory.java       |   4 +-
 .../factories/DefaultFactoryRegistry.java       | 134 +++++++++++++++++++
 .../bindy/format/factories/FactoryRegistry.java |  25 ++++
 .../bindy/format/factories/FormatFactories.java |  99 --------------
 .../format/factories/IntegerFormatFactory.java  |   4 +-
 .../format/factories/LongFormatFactory.java     |   4 +-
 .../format/factories/ShortFormatFactory.java    |   4 +-
 .../format/factories/StringFormatFactory.java   |   4 +-
 .../bindy/kvp/BindyKeyValuePairDataFormat.java  |   7 +-
 .../csv/BindyCarQuoteAndCommaDelimiterTest.java |  12 ++
 .../BindyComplexKeyValuePairStandaloneTest.java |   7 +-
 .../date/BindyDatePatternCsvUnmarshallTest.java |  45 ++++++-
 .../bindy/util/AnnotationModuleLoaderTest.java  |   2 +-
 24 files changed, 383 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
index f34a06e..9099a46 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractDataFormat.java
@@ -17,21 +17,37 @@
 package org.apache.camel.dataformat.bindy;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.dataformat.bindy.annotation.FormatFactories;
+import 
org.apache.camel.dataformat.bindy.format.factories.DefaultFactoryRegistry;
+import org.apache.camel.dataformat.bindy.format.factories.FactoryRegistry;
+import 
org.apache.camel.dataformat.bindy.format.factories.FormatFactoryInterface;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatName;
+import org.apache.camel.spi.Registry;
 import org.apache.camel.support.ServiceSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-public abstract class BindyAbstractDataFormat extends ServiceSupport 
implements DataFormat, DataFormatName {
+public abstract class BindyAbstractDataFormat extends ServiceSupport 
implements DataFormat, DataFormatName, CamelContextAware {
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(BindyAbstractDataFormat.class);
     private String locale;
     private BindyAbstractFactory modelFactory;
     private Class<?> classType;
+    private CamelContext camelContext;
 
     public BindyAbstractDataFormat() {
     }
-    
+
     protected BindyAbstractDataFormat(Class<?> classType) {
         this.classType = classType;
     }
@@ -51,25 +67,74 @@ public abstract class BindyAbstractDataFormat extends 
ServiceSupport implements
     public void setLocale(String locale) {
         this.locale = locale;
     }
-    
+
     public BindyAbstractFactory getFactory() throws Exception {
         if (modelFactory == null) {
-            modelFactory = createModelFactory();
+            FormatFactory formatFactory = createFormatFactory();
+            registerAdditionalConverter(formatFactory);
+            modelFactory = createModelFactory(formatFactory);
             modelFactory.setLocale(locale);
         }
         return modelFactory;
     }
-    
+
+    private void registerAdditionalConverter(FormatFactory formatFactory) 
throws IllegalAccessException, InstantiationException {
+        Function<Class<?>, FormatFactories> g = aClass -> 
aClass.getAnnotation(FormatFactories.class);
+        Function<FormatFactories, List<Class<? extends 
FormatFactoryInterface>>> h = formatFactories -> 
Arrays.asList(formatFactories.value());
+        List<Class<? extends FormatFactoryInterface>> array = Optional
+                .ofNullable(classType)
+                .map(g)
+                .map(h)
+                .orElse(Collections.emptyList());
+        for (Class<? extends FormatFactoryInterface> l : array) {
+            formatFactory.getFactoryRegistry().register(l.newInstance());
+        }
+    }
+
+    private FormatFactory createFormatFactory() {
+        FormatFactory formatFactory = new FormatFactory();
+        FactoryRegistry factoryRegistry = createFactoryRegistry();
+        formatFactory.setFactoryRegistry(factoryRegistry);
+        return formatFactory;
+    }
+
+    private FactoryRegistry createFactoryRegistry() {
+        return tryToGetFactoryRegistry();
+    }
+
+    private FactoryRegistry tryToGetFactoryRegistry() {
+        Function<CamelContext, Registry> f = CamelContext::getRegistry;
+        Function<Registry, Set<FactoryRegistry>> g = r -> 
r.findByType(FactoryRegistry.class);
+        Function<Set<FactoryRegistry>, FactoryRegistry> h = factoryRegistries 
-> {
+            if (factoryRegistries.size() > 1) {
+                LOGGER.warn("Number of registered {}: {}",
+                        FactoryRegistry.class.getCanonicalName(),
+                        factoryRegistries.size());
+            }
+            if (factoryRegistries.iterator().hasNext()) {
+                return factoryRegistries.iterator().next();
+            } else {
+                return new DefaultFactoryRegistry();
+            }
+        };
+
+        return Optional.ofNullable(camelContext)
+                .map(f)
+                .map(g)
+                .map(h)
+                .orElse(new DefaultFactoryRegistry());
+    }
+
     public void setModelFactory(BindyAbstractFactory modelFactory) {
         this.modelFactory = modelFactory;
     }
-    
-    protected abstract BindyAbstractFactory createModelFactory() throws 
Exception;
+
+    protected abstract BindyAbstractFactory createModelFactory(FormatFactory 
formatFactory) throws Exception;
 
     protected Object extractUnmarshalResult(List<Map<String, Object>> models) {
         if (getClassType() != null) {
-            // we expect to find this type in the models, and grab only that 
type
-            List<Object> answer = new ArrayList<Object>();
+            // we expect to findForFormattingOptions this type in the models, 
and grab only that type
+            List<Object> answer = new ArrayList<>();
             for (Map<String, Object> entry : models) {
                 Object data = entry.get(getClassType().getName());
                 if (data != null) {
@@ -96,4 +161,14 @@ public abstract class BindyAbstractDataFormat extends 
ServiceSupport implements
     protected void doStop() throws Exception {
         // noop
     }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
index d3e96b9..1108a68 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyAbstractFactory.java
@@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
 public abstract class BindyAbstractFactory implements BindyFactory {
     private static final Logger LOG = 
LoggerFactory.getLogger(BindyAbstractFactory.class);
     protected final Map<String, List<Field>> annotatedLinkFields = new 
LinkedHashMap<String, List<Field>>();
-    protected final FormatFactory formatFactory = FormatFactory.getInstance();
+    protected FormatFactory formatFactory;
     protected Set<Class<?>> models;
     protected Set<String> modelClassNames;
     protected String crlf;
@@ -246,4 +246,8 @@ public abstract class BindyAbstractFactory implements 
BindyFactory {
     public void setLocale(String locale) {
         this.locale = locale;
     }
+
+    public void setFormatFactory(FormatFactory formatFactory) {
+        this.formatFactory = formatFactory;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
index 4efddf4..c517852 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyFixedLengthFactory.java
@@ -48,8 +48,6 @@ public class BindyFixedLengthFactory extends 
BindyAbstractFactory implements Bin
 
     boolean isOneToMany;
 
-    private final FormatFactory formatFactory = FormatFactory.getInstance();
-
     private Map<Integer, DataField> dataFields = new TreeMap<Integer, 
DataField>();
     private Map<Integer, Field> annotatedFields = new TreeMap<Integer, 
Field>();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
index 5985939..453e8fb 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyKeyValuePairFactory.java
@@ -47,7 +47,6 @@ import org.slf4j.LoggerFactory;
 public class BindyKeyValuePairFactory extends BindyAbstractFactory implements 
BindyFactory {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(BindyKeyValuePairFactory.class);
-    private final FormatFactory formatFactory = FormatFactory.getInstance();
 
     private Map<Integer, KeyValuePairField> keyValuePairFields = new 
LinkedHashMap<Integer, KeyValuePairField>();
     private Map<Integer, Field> annotatedFields = new LinkedHashMap<Integer, 
Field>();

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
index b9e374a..7055d79 100755
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
@@ -17,30 +17,7 @@
 package org.apache.camel.dataformat.bindy;
 
 
-import 
org.apache.camel.dataformat.bindy.format.factories.BigDecimalFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.BigDecimalPatternFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.BigIntegerFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.BooleanFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.ByteFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.BytePatternFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.CharacterFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.DateFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.DoubleFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.DoublePatternFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.EnumFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.FloatFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.FloatPatternFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.FormatFactories;
-import org.apache.camel.dataformat.bindy.format.factories.IntegerFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.IntegerPatternFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.LocalDateFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.LocalDateTimeFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.LocalTimeFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.LongFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.LongPatternFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.ShortFormatFactory;
-import 
org.apache.camel.dataformat.bindy.format.factories.ShortPatternFormatFactory;
-import org.apache.camel.dataformat.bindy.format.factories.StringFormatFactory;
+import org.apache.camel.dataformat.bindy.format.factories.FactoryRegistry;
 
 
 /**
@@ -48,44 +25,14 @@ import 
org.apache.camel.dataformat.bindy.format.factories.StringFormatFactory;
  */
 public final class FormatFactory {
 
-    private static final FormatFactory INSTANCE = new FormatFactory();
+    private FactoryRegistry factoryRegistry;
 
-    static {
-        FormatFactories.getInstance()
-                .register(new StringFormatFactory())
-                .register(new DateFormatFactory())
-                .register(new BooleanFormatFactory())
-                .register(new BigIntegerFormatFactory())
-                .register(new LocalTimeFormatFactory())
-                .register(new LocalDateTimeFormatFactory())
-                .register(new LocalDateFormatFactory())
-                .register(new CharacterFormatFactory())
-                .register(new EnumFormatFactory())
-                .register(new BigDecimalFormatFactory())
-                .register(new BigDecimalPatternFormatFactory())
-                .register(new DoubleFormatFactory())
-                .register(new DoublePatternFormatFactory())
-                .register(new FloatFormatFactory())
-                .register(new FloatPatternFormatFactory())
-                .register(new LongFormatFactory())
-                .register(new LongPatternFormatFactory())
-                .register(new IntegerFormatFactory())
-                .register(new IntegerPatternFormatFactory())
-                .register(new ShortFormatFactory())
-                .register(new ShortPatternFormatFactory())
-                .register(new ByteFormatFactory())
-                .register(new BytePatternFormatFactory());
-    }
-
-    private FormatFactory() {
-    }
-
-    public static FormatFactory getInstance() {
-        return INSTANCE;
+    public FormatFactory() {
     }
 
     private Format<?> doGetFormat(FormattingOptions formattingOptions) {
-        return FormatFactories.getInstance().build(formattingOptions);
+        return factoryRegistry.findForFormattingOptions(formattingOptions)
+                .build(formattingOptions);
     }
 
     /**
@@ -99,4 +46,11 @@ public final class FormatFactory {
         return doGetFormat(formattingOptions);
     }
 
+    public void setFactoryRegistry(FactoryRegistry factoryRegistry) {
+        this.factoryRegistry = factoryRegistry;
+    }
+
+    public FactoryRegistry getFactoryRegistry() {
+        return factoryRegistry;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/FormatFactories.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/FormatFactories.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/FormatFactories.java
new file mode 100644
index 0000000..d31a24f
--- /dev/null
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/FormatFactories.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.bindy.annotation;
+
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import 
org.apache.camel.dataformat.bindy.format.factories.FormatFactoryInterface;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface FormatFactories {
+    Class<? extends FormatFactoryInterface>[] value();
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
index 1622064..500afe3 100755
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
@@ -32,6 +32,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.dataformat.bindy.BindyAbstractDataFormat;
 import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
 import org.apache.camel.dataformat.bindy.BindyCsvFactory;
+import org.apache.camel.dataformat.bindy.FormatFactory;
 import org.apache.camel.dataformat.bindy.annotation.Link;
 import org.apache.camel.dataformat.bindy.util.ConverterUtils;
 import org.apache.camel.spi.DataFormat;
@@ -277,7 +278,9 @@ public class BindyCsvDataFormat extends 
BindyAbstractDataFormat {
     }
 
     @Override
-    protected BindyAbstractFactory createModelFactory() throws Exception {
-        return new BindyCsvFactory(getClassType());
+    protected BindyAbstractFactory createModelFactory(FormatFactory 
formatFactory) throws Exception {
+        BindyCsvFactory bindyCsvFactory = new BindyCsvFactory(getClassType());
+        bindyCsvFactory.setFormatFactory(formatFactory);
+        return bindyCsvFactory;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
index ffbed62..317c659 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java
@@ -32,6 +32,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.dataformat.bindy.BindyAbstractDataFormat;
 import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
 import org.apache.camel.dataformat.bindy.BindyFixedLengthFactory;
+import org.apache.camel.dataformat.bindy.FormatFactory;
 import org.apache.camel.dataformat.bindy.util.ConverterUtils;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.util.IOHelper;
@@ -290,18 +291,21 @@ public class BindyFixedLengthDataFormat extends 
BindyAbstractDataFormat {
     }
 
     @Override
-    protected BindyAbstractFactory createModelFactory() throws Exception {
+    protected BindyAbstractFactory createModelFactory(FormatFactory 
formatFactory) throws Exception {
 
         BindyFixedLengthFactory factory = new 
BindyFixedLengthFactory(getClassType());
+        factory.setFormatFactory(formatFactory);
         
         // Optionally initialize the header factory... using header model 
classes
         if (factory.hasHeader()) {
             this.headerFactory = new BindyFixedLengthFactory(factory.header());
+            this.headerFactory.setFormatFactory(formatFactory);
         }
         
         // Optionally initialize the footer factory... using footer model 
classes
         if (factory.hasFooter()) {
             this.footerFactory = new BindyFixedLengthFactory(factory.footer());
+            this.footerFactory.setFormatFactory(formatFactory);
         }
         
         return factory;

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BigIntegerFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BigIntegerFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BigIntegerFormatFactory.java
index a8a72fb..9612317 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BigIntegerFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BigIntegerFormatFactory.java
@@ -23,7 +23,7 @@ import 
org.apache.camel.dataformat.bindy.format.AbstractNumberFormat;
 
 public class BigIntegerFormatFactory extends AbstractFormatFactory {
 
-    private static final BigIntegerFormat BIG_INTEGER_FORMAT = new 
BigIntegerFormat();
+    private final BigIntegerFormat bigIntegerFormat = new BigIntegerFormat();
 
     {
         supportedClasses.add(BigInteger.class);
@@ -36,7 +36,7 @@ public class BigIntegerFormatFactory extends 
AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return BIG_INTEGER_FORMAT;
+        return bigIntegerFormat;
     }
 
     private static class BigIntegerFormat extends 
AbstractNumberFormat<BigInteger> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BooleanFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BooleanFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BooleanFormatFactory.java
index bc150e8..2d2a8c6 100755
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BooleanFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/BooleanFormatFactory.java
@@ -21,7 +21,7 @@ import org.apache.camel.dataformat.bindy.FormattingOptions;
 
 public class BooleanFormatFactory extends AbstractFormatFactory {
 
-    private static final BooleanFormat BOOLEAN_FORMAT = new BooleanFormat();
+    private final BooleanFormat booleanFormat = new BooleanFormat();
 
     {
         supportedClasses.add(boolean.class);
@@ -30,7 +30,7 @@ public class BooleanFormatFactory extends 
AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return BOOLEAN_FORMAT;
+        return booleanFormat;
     }
 
     private static class BooleanFormat implements Format<Boolean> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ByteFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ByteFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ByteFormatFactory.java
index 457270f..f8ca4d8 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ByteFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ByteFormatFactory.java
@@ -22,7 +22,7 @@ import org.apache.camel.util.ObjectHelper;
 
 public class ByteFormatFactory extends AbstractFormatFactory {
 
-    private static final ByteFormat BYTE_FORMAT = new ByteFormat();
+    private final ByteFormat byteFormat = new ByteFormat();
 
     {
         supportedClasses.add(byte.class);
@@ -36,7 +36,7 @@ public class ByteFormatFactory extends AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return BYTE_FORMAT;
+        return byteFormat;
     }
 
     private static class ByteFormat implements Format<Byte> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/CharacterFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/CharacterFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/CharacterFormatFactory.java
index 83786c7..e0dba01 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/CharacterFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/CharacterFormatFactory.java
@@ -22,7 +22,7 @@ import org.apache.camel.dataformat.bindy.FormattingOptions;
 
 public class CharacterFormatFactory extends AbstractFormatFactory {
 
-    private static final CharacterFormat CHARACTER_FORMAT = new 
CharacterFormat();
+    private final CharacterFormat characterFormat = new CharacterFormat();
 
     {
         supportedClasses.add(char.class);
@@ -31,7 +31,7 @@ public class CharacterFormatFactory extends 
AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return CHARACTER_FORMAT;
+        return characterFormat;
     }
 
     private static class CharacterFormat implements Format<Character> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/DefaultFactoryRegistry.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/DefaultFactoryRegistry.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/DefaultFactoryRegistry.java
new file mode 100644
index 0000000..9b52b6a
--- /dev/null
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/DefaultFactoryRegistry.java
@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.bindy.format.factories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.camel.dataformat.bindy.FormattingOptions;
+
+/**
+ * This class manages all FormatFactoryInterfaces.
+ * FormatFactoryInterfaces can declare to support one or more classes or
+ * can declare to be generic (e.g. {@link EnumFormatFactory}).
+ * The factories that support one or more classes are stored in a Map.
+ * The generic factories are stored in a list.
+ * The build method first tries to findForFormattingOptions a factory using 
the map.
+ * If it doesn't findForFormattingOptions one it uses the generic list.
+ * If it can't findForFormattingOptions a factory it throws an 
IllegalArgumentException.
+ */
+public final class DefaultFactoryRegistry implements FactoryRegistry {
+
+    private final Map<Class<?>, List<FormatFactoryInterface>> 
classBasedFactories = new HashMap<>();
+    private final List<FormatFactoryInterface> otherFactories = new 
ArrayList<>();
+
+    public DefaultFactoryRegistry() {
+        this.register(new StringFormatFactory())
+                .register(new DateFormatFactory())
+                .register(new BooleanFormatFactory())
+                .register(new BigIntegerFormatFactory())
+                .register(new LocalTimeFormatFactory())
+                .register(new LocalDateTimeFormatFactory())
+                .register(new LocalDateFormatFactory())
+                .register(new CharacterFormatFactory())
+                .register(new EnumFormatFactory())
+                .register(new BigDecimalFormatFactory())
+                .register(new BigDecimalPatternFormatFactory())
+                .register(new DoubleFormatFactory())
+                .register(new DoublePatternFormatFactory())
+                .register(new FloatFormatFactory())
+                .register(new FloatPatternFormatFactory())
+                .register(new LongFormatFactory())
+                .register(new LongPatternFormatFactory())
+                .register(new IntegerFormatFactory())
+                .register(new IntegerPatternFormatFactory())
+                .register(new ShortFormatFactory())
+                .register(new ShortPatternFormatFactory())
+                .register(new ByteFormatFactory())
+                .register(new BytePatternFormatFactory());
+    }
+
+    /**
+     * Registers a {@link FormatFactoryInterface}.
+     * Two types of factories exist:
+     * <ul>
+     * <li>Factories that support one or more classes</li>
+     * <li>Factories that support no specific class (e.g. {@link 
EnumFormatFactory})</li>
+     * </ul>
+     * @param formatFactories
+     * @return the DefaultFactoryRegistry instance
+     */
+    @Override
+    public FactoryRegistry register(FormatFactoryInterface... formatFactories) 
{
+        for (FormatFactoryInterface formatFactory : formatFactories) {
+            if (formatFactory.supportedClasses().isEmpty()) {
+                for (FormatFactoryInterface factory : otherFactories) {
+                    if (factory.getClass() == formatFactory.getClass()) {
+                        return this;
+                    }
+                }
+                otherFactories.add(formatFactory);
+            } else {
+                for (Class<?> clazz : formatFactory.supportedClasses()) {
+                    List<FormatFactoryInterface> factories = getByClass(clazz);
+                    for (FormatFactoryInterface factory : factories) {
+                        if (factory.getClass() == formatFactory.getClass()) {
+                            return this;
+                        }
+                    }
+                    factories.add(formatFactory);
+                }
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public FactoryRegistry unregister(Class<? extends FormatFactoryInterface> 
clazz) {
+        for (Map.Entry<Class<?>, List<FormatFactoryInterface>> entry : 
classBasedFactories.entrySet()) {
+            entry.getValue().stream().filter(factory -> factory.getClass() == 
clazz).forEach(factory -> {
+                entry.getValue().remove(factory);
+            });
+        }
+        return this;
+    }
+
+    @Override
+    public FormatFactoryInterface findForFormattingOptions(FormattingOptions 
formattingOptions) {
+        for (FormatFactoryInterface formatFactory : 
getByClass(formattingOptions.getClazz())) {
+            if (formatFactory.canBuild(formattingOptions)) {
+                return formatFactory;
+            }
+        }
+        for (FormatFactoryInterface formatFactory : otherFactories) {
+            if (formatFactory.canBuild(formattingOptions)) {
+                return formatFactory;
+            }
+        }
+        throw new IllegalArgumentException("Can not findForFormattingOptions a 
suitable formatter for the type: " + 
formattingOptions.getClazz().getCanonicalName());
+    }
+
+    private List<FormatFactoryInterface> getByClass(Class<?> clazz) {
+        List<FormatFactoryInterface> result = classBasedFactories.get(clazz);
+        if (result == null) {
+            result = new ArrayList<>();
+            classBasedFactories.put(clazz, result);
+        }
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FactoryRegistry.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FactoryRegistry.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FactoryRegistry.java
new file mode 100644
index 0000000..53a3dba
--- /dev/null
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FactoryRegistry.java
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.bindy.format.factories;
+
+import org.apache.camel.dataformat.bindy.FormattingOptions;
+
+public interface FactoryRegistry {
+    FactoryRegistry register(FormatFactoryInterface... formatFactory);
+    FactoryRegistry unregister(Class<? extends FormatFactoryInterface> clazz);
+    FormatFactoryInterface findForFormattingOptions(FormattingOptions 
formattingOptions);
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FormatFactories.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FormatFactories.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FormatFactories.java
deleted file mode 100644
index 2b9eec8..0000000
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/FormatFactories.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.dataformat.bindy.format.factories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.camel.dataformat.bindy.Format;
-import org.apache.camel.dataformat.bindy.FormattingOptions;
-
-/**
- * This class manages all FormatFactoryInterfaces.
- * This class is a singleton class.
- * FormatFactoryInterfaces can declare to support one or more classes or
- * can declare to be generic (e.g. {@link EnumFormatFactory}).
- * The factories that support one or more classes are stored in a Map.
- * The generic factories are stored in a list.
- * The build method first tries to find a factory using the map.
- * If it doesn't find one it uses the generic list.
- * If it can't find a factory it throws an IllegalArgumentException.
- */
-public final class FormatFactories extends AbstractFormatFactory {
-
-    private static final FormatFactories INSTANCE = new FormatFactories();
-    private static final Map<Class<?>, List<FormatFactoryInterface>> 
CLASS_BASED_FACTORIES = new HashMap<>();
-    private static final List<FormatFactoryInterface> OTHER_FACTORIES = new 
ArrayList<>();
-
-    private FormatFactories() {
-    }
-
-    public static FormatFactories getInstance() {
-        return INSTANCE;
-    }
-
-    /**
-     * Registers a {@link FormatFactoryInterface}.
-     * Two types of factories exist:
-     * <ul>
-     * <li>Factories that support one or more classes</li>
-     * <li>Factories that support no specific class (e.g. {@link 
EnumFormatFactory})</li>
-     * </ul>
-     * @param formatFactory
-     * @return the FormatFactories instance
-     */
-    public synchronized FormatFactories register(FormatFactoryInterface 
formatFactory) {
-        if (formatFactory.supportedClasses().isEmpty()) {
-            OTHER_FACTORIES.add(formatFactory);
-        } else {
-            for (Class<?> clazz : formatFactory.supportedClasses()) {
-                getByClass(clazz).add(formatFactory);
-            }
-        }
-        return this;
-    }
-
-    @Override
-    public boolean canBuild(FormattingOptions formattingOptions) {
-        return true;
-    }
-
-    @Override
-    public Format<?> build(FormattingOptions formattingOptions) {
-        for (FormatFactoryInterface formatFactory : 
getByClass(formattingOptions.getClazz())) {
-            if (formatFactory.canBuild(formattingOptions)) {
-                return formatFactory.build(formattingOptions);
-            }
-        }
-        for (FormatFactoryInterface formatFactory : OTHER_FACTORIES) {
-            if (formatFactory.canBuild(formattingOptions)) {
-                return formatFactory.build(formattingOptions);
-            }
-        }
-        throw new IllegalArgumentException("Can not find a suitable formatter 
for the type: " + formattingOptions.getClazz().getCanonicalName());
-    }
-
-    private List<FormatFactoryInterface> getByClass(Class<?> clazz) {
-        List<FormatFactoryInterface> result = CLASS_BASED_FACTORIES.get(clazz);
-        if (result == null) {
-            result = new ArrayList<>();
-            CLASS_BASED_FACTORIES.put(clazz, result);
-        }
-        return result;
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/IntegerFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/IntegerFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/IntegerFormatFactory.java
index 5335dbf..24892c6 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/IntegerFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/IntegerFormatFactory.java
@@ -23,7 +23,7 @@ import org.apache.camel.util.ObjectHelper;
 
 public class IntegerFormatFactory extends AbstractFormatFactory {
 
-    private static final IntegerFormat INTEGER_FORMAT = new IntegerFormat();
+    private final IntegerFormat integerFormat = new IntegerFormat();
 
     {
         supportedClasses.add(int.class);
@@ -38,7 +38,7 @@ public class IntegerFormatFactory extends 
AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return  INTEGER_FORMAT;
+        return integerFormat;
     }
 
     private static class IntegerFormat extends AbstractNumberFormat<Integer> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/LongFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/LongFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/LongFormatFactory.java
index 0b3a192..c4a4f93 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/LongFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/LongFormatFactory.java
@@ -23,7 +23,7 @@ import org.apache.camel.util.ObjectHelper;
 
 public class LongFormatFactory extends AbstractFormatFactory {
 
-    private static final LongFormat LONG_FORMAT = new LongFormat();
+    private final LongFormat longFormat = new LongFormat();
 
     {
         supportedClasses.add(long.class);
@@ -37,7 +37,7 @@ public class LongFormatFactory extends AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return LONG_FORMAT;
+        return longFormat;
     }
 
     private static class LongFormat extends AbstractNumberFormat<Long> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ShortFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ShortFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ShortFormatFactory.java
index 1475dd3..fd1965e 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ShortFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/ShortFormatFactory.java
@@ -23,7 +23,7 @@ import org.apache.camel.util.ObjectHelper;
 
 public class ShortFormatFactory extends AbstractFormatFactory {
 
-    private static final ShortFormat SHORT_FORMAT = new ShortFormat();
+    private final ShortFormat shortFormat = new ShortFormat();
 
     {
         supportedClasses.add(short.class);
@@ -38,7 +38,7 @@ public class ShortFormatFactory extends AbstractFormatFactory 
{
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return SHORT_FORMAT;
+        return shortFormat;
     }
 
     private static class ShortFormat extends AbstractNumberFormat<Short> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/StringFormatFactory.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/StringFormatFactory.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/StringFormatFactory.java
index 670440e..d6644f4 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/StringFormatFactory.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/factories/StringFormatFactory.java
@@ -21,7 +21,7 @@ import org.apache.camel.dataformat.bindy.FormattingOptions;
 
 public class StringFormatFactory extends AbstractFormatFactory {
 
-    private static final StringFormat STRING_FORMAT = new StringFormat();
+    private final StringFormat stringFormat = new StringFormat();
 
     {
         supportedClasses.add(String.class);
@@ -29,7 +29,7 @@ public class StringFormatFactory extends 
AbstractFormatFactory {
 
     @Override
     public Format<?> build(FormattingOptions formattingOptions) {
-        return STRING_FORMAT;
+        return stringFormat;
     }
 
     private static class StringFormat implements Format<String> {

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
index 65bc353..6fb8a76 100644
--- 
a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
+++ 
b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/kvp/BindyKeyValuePairDataFormat.java
@@ -30,6 +30,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.dataformat.bindy.BindyAbstractDataFormat;
 import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
 import org.apache.camel.dataformat.bindy.BindyKeyValuePairFactory;
+import org.apache.camel.dataformat.bindy.FormatFactory;
 import org.apache.camel.dataformat.bindy.util.ConverterUtils;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.util.IOHelper;
@@ -151,7 +152,9 @@ public class BindyKeyValuePairDataFormat extends 
BindyAbstractDataFormat {
         }
     }
 
-    protected BindyAbstractFactory createModelFactory() throws Exception {
-        return new BindyKeyValuePairFactory(getClassType());
+    protected BindyAbstractFactory createModelFactory(FormatFactory 
formatFactory) throws Exception {
+        BindyKeyValuePairFactory bindyKeyValuePairFactory = new 
BindyKeyValuePairFactory(getClassType());
+        bindyKeyValuePairFactory.setFormatFactory(formatFactory);
+        return bindyKeyValuePairFactory;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyCarQuoteAndCommaDelimiterTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyCarQuoteAndCommaDelimiterTest.java
 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyCarQuoteAndCommaDelimiterTest.java
index f06874e..a73d906 100644
--- 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyCarQuoteAndCommaDelimiterTest.java
+++ 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindyCarQuoteAndCommaDelimiterTest.java
@@ -18,10 +18,15 @@ package org.apache.camel.dataformat.bindy.csv;
 
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import 
org.apache.camel.dataformat.bindy.format.factories.DefaultFactoryRegistry;
 import org.apache.camel.dataformat.bindy.model.car.Car;
 import org.apache.camel.dataformat.bindy.model.car.Car.Colour;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry;
 import org.apache.camel.model.dataformat.BindyType;
+import org.apache.camel.spi.Registry;
 import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -40,6 +45,13 @@ public class BindyCarQuoteAndCommaDelimiterTest extends 
CamelTestSupport {
             + " Engine Immobiliser, Limited Slip Differential, Power Mirrors, 
Power Steering, Power Windows, Radio CD with 6 Speakers"
             + " CV GOOD KLMS AUTO POWER OPTIONS GOOD KLMS   
\";\"Used\";\"0.0\";\"EZR05I\"\n";
 
+    @Before
+    public void setup() {
+        PropertyPlaceholderDelegateRegistry registry = 
(PropertyPlaceholderDelegateRegistry)context.getRegistry();
+        JndiRegistry reg = (JndiRegistry)registry.getRegistry();
+        reg.bind("defaultFactoryRegistry", new DefaultFactoryRegistry());
+    }
+
     @Test
     public void testBindyUnmarshalQuoteAndCommaDelimiter() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:out");

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexKeyValuePairStandaloneTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexKeyValuePairStandaloneTest.java
 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexKeyValuePairStandaloneTest.java
index a6f826a..79a5ffd 100644
--- 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexKeyValuePairStandaloneTest.java
+++ 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/fix/BindyComplexKeyValuePairStandaloneTest.java
@@ -23,7 +23,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.camel.dataformat.bindy.BindyAbstractFactory;
 import org.apache.camel.dataformat.bindy.BindyKeyValuePairFactory;
+import org.apache.camel.dataformat.bindy.kvp.BindyKeyValuePairDataFormat;
 import org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Header;
 import org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Order;
 import org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Trailer;
@@ -39,14 +41,15 @@ public class BindyComplexKeyValuePairStandaloneTest {
 
     protected Map<String, Object> model = new HashMap<String, Object>();
     protected Set<Class<?>> models = new HashSet<Class<?>>();
-    BindyKeyValuePairFactory factory;
+    BindyAbstractFactory factory;
     int counter;
 
     @Before
     public void init() throws Exception {
 
         // Set factory
-        factory = new 
BindyKeyValuePairFactory(org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Order.class);
+        BindyKeyValuePairDataFormat dataFormat = new 
BindyKeyValuePairDataFormat(org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Order.class);
+        factory = dataFormat.getFactory();
 
         // Set model class
         
models.add(org.apache.camel.dataformat.bindy.model.fix.complex.onetomany.Order.class);

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/date/BindyDatePatternCsvUnmarshallTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/date/BindyDatePatternCsvUnmarshallTest.java
 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/date/BindyDatePatternCsvUnmarshallTest.java
index b3dc526..11d796f 100644
--- 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/date/BindyDatePatternCsvUnmarshallTest.java
+++ 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/date/BindyDatePatternCsvUnmarshallTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.dataformat.bindy.model.date;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.Collection;
 import java.util.Date;
 
 import org.apache.camel.EndpointInject;
@@ -26,9 +27,14 @@ import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.dataformat.bindy.Format;
+import org.apache.camel.dataformat.bindy.FormattingOptions;
 import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
 import org.apache.camel.dataformat.bindy.annotation.DataField;
+import org.apache.camel.dataformat.bindy.annotation.FormatFactories;
 import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat;
+import 
org.apache.camel.dataformat.bindy.format.factories.AbstractFormatFactory;
+import 
org.apache.camel.dataformat.bindy.format.factories.FormatFactoryInterface;
 import org.junit.Test;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
@@ -74,10 +80,11 @@ public class BindyDatePatternCsvUnmarshallTest extends 
AbstractJUnit4SpringConte
     }
 
     @CsvRecord(separator = ",")
+    @FormatFactories({OrderNumberFormatFactory.class})
     public static class Order {
 
         @DataField(pos = 1)
-        private int orderNr;
+        private OrderNumber orderNr;
 
         @DataField(pos = 2)
         private String firstName;
@@ -100,11 +107,11 @@ public class BindyDatePatternCsvUnmarshallTest extends 
AbstractJUnit4SpringConte
         @DataField(pos = 8)
         private ReturnReason returnReason;
 
-        public int getOrderNr() {
+        public OrderNumber getOrderNr() {
             return orderNr;
         }
 
-        public void setOrderNr(int orderNr) {
+        public void setOrderNr(OrderNumber orderNr) {
             this.orderNr = orderNr;
         }
 
@@ -174,4 +181,36 @@ public class BindyDatePatternCsvUnmarshallTest extends 
AbstractJUnit4SpringConte
         broken,
         other
     }
+
+    public static class OrderNumber {
+        private int orderNr;
+
+        public static OrderNumber ofString(String orderNumber) {
+            OrderNumber result = new OrderNumber();
+            result.orderNr = Integer.valueOf(orderNumber);
+            return result;
+        }
+    }
+
+    public static class OrderNumberFormatFactory extends AbstractFormatFactory 
{
+
+        {
+            supportedClasses.add(OrderNumber.class);
+        }
+
+        @Override
+        public Format<?> build(FormattingOptions formattingOptions) {
+            return new Format<OrderNumber>() {
+                @Override
+                public String format(OrderNumber object) throws Exception {
+                    return String.valueOf(object.orderNr);
+                }
+
+                @Override
+                public OrderNumber parse(String string) throws Exception {
+                    return OrderNumber.ofString(string);
+                }
+            };
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76a10b77/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/util/AnnotationModuleLoaderTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/util/AnnotationModuleLoaderTest.java
 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/util/AnnotationModuleLoaderTest.java
index b6a3b4e..8aa7405 100644
--- 
a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/util/AnnotationModuleLoaderTest.java
+++ 
b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/util/AnnotationModuleLoaderTest.java
@@ -31,7 +31,7 @@ public class AnnotationModuleLoaderTest extends Assert {
     public void testLoadModels() throws Exception {
         AnnotationModelLoader loader = new AnnotationModelLoader(new 
DefaultPackageScanClassResolver());
         Set<Class<?>> classes = 
loader.loadModels("org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink");
-        assertNotNull("The find classes should not be null ", classes);
+        assertNotNull("The findForFormattingOptions classes should not be null 
", classes);
         assertEquals("There should have 3 classes", 3, classes.size());
         assertTrue(classes.contains(Client.class));
         assertTrue(classes.contains(Order.class));

Reply via email to