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));
