Repository: camel Updated Branches: refs/heads/master 2820ca76b -> 1935ddfe1
CAMEL-9744: camel-bindy - Add support for Java 8 date and time API. Thanks to Arno Noordover for the patch. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1935ddfe Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1935ddfe Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1935ddfe Branch: refs/heads/master Commit: 1935ddfe1c4339e0269062212eef90c595b03d61 Parents: 2820ca7 Author: Claus Ibsen <davscl...@apache.org> Authored: Sun May 8 07:50:09 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun May 8 07:50:09 2016 +0200 ---------------------------------------------------------------------- .../camel/dataformat/bindy/FormatFactory.java | 12 +++ .../bindy/format/LocalDatePatternFormat.java | 85 ++++++++++++++++++ .../format/LocalDateTimePatternFormat.java | 94 +++++++++++++++++++ .../bindy/format/LocalTimePatternFormat.java | 95 ++++++++++++++++++++ .../date/BindyDatePatternCsvUnmarshallTest.java | 38 +++++++- 5 files changed, 323 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1935ddfe/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 7a63f77..1971012 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 @@ -19,6 +19,9 @@ package org.apache.camel.dataformat.bindy; import java.math.BigDecimal; import java.math.BigInteger; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.Date; import java.util.Locale; @@ -40,6 +43,9 @@ import org.apache.camel.dataformat.bindy.format.FloatFormat; import org.apache.camel.dataformat.bindy.format.FloatPatternFormat; import org.apache.camel.dataformat.bindy.format.IntegerFormat; import org.apache.camel.dataformat.bindy.format.IntegerPatternFormat; +import org.apache.camel.dataformat.bindy.format.LocalDatePatternFormat; +import org.apache.camel.dataformat.bindy.format.LocalDateTimePatternFormat; +import org.apache.camel.dataformat.bindy.format.LocalTimePatternFormat; import org.apache.camel.dataformat.bindy.format.LongFormat; import org.apache.camel.dataformat.bindy.format.LongPatternFormat; import org.apache.camel.dataformat.bindy.format.ShortFormat; @@ -112,6 +118,12 @@ public final class FormatFactory { return new CharacterFormat(); } else if (clazz == boolean.class || clazz == Boolean.class) { return new BooleanFormat(); + } else if (clazz == LocalDate.class) { + return new LocalDatePatternFormat(pattern, getLocale(locale)); + } else if (clazz == LocalDateTime.class) { + return new LocalDateTimePatternFormat(pattern, timezone, getLocale(locale)); + } else if (clazz == LocalTime.class) { + return new LocalTimePatternFormat(pattern, timezone, getLocale(locale)); } else if (clazz.isEnum()) { @SuppressWarnings({"rawtypes", "unchecked"}) Format<?> fmt = new EnumFormat(clazz); http://git-wip-us.apache.org/repos/asf/camel/blob/1935ddfe/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDatePatternFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDatePatternFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDatePatternFormat.java new file mode 100644 index 0000000..0b4daee --- /dev/null +++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDatePatternFormat.java @@ -0,0 +1,85 @@ +/** + * 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; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import org.apache.camel.dataformat.bindy.PatternFormat; +import org.apache.camel.util.ObjectHelper; + +public class LocalDatePatternFormat implements PatternFormat<LocalDate> { + + private String pattern; + private Locale locale; + + public LocalDatePatternFormat() { + } + + public LocalDatePatternFormat(String pattern, Locale locale) { + this.pattern = pattern; + this.locale = locale; + } + + public String format(LocalDate object) throws Exception { + ObjectHelper.notNull(this.pattern, "pattern"); + return this.getDateFormat().format(object); + } + + public LocalDate parse(String string) throws Exception { + + LocalDate date; + DateTimeFormatter df = this.getDateFormat(); + + ObjectHelper.notNull(this.pattern, "pattern"); + + if (doesStringFitLengthOfPattern(string)) { + date = LocalDate.parse(string, df); + return date; + } else { + throw new FormatException("Date provided does not fit the pattern defined"); + } + + } + + private boolean doesStringFitLengthOfPattern(String string) { + return string.length() <= this.pattern.length(); + } + + protected DateTimeFormatter getDateFormat() { + DateTimeFormatter result; + if (locale != null) { + result = DateTimeFormatter.ofPattern(pattern, locale); + } else { + result = DateTimeFormatter.ofPattern(pattern); + } + return result; + } + + public String getPattern() { + return pattern; + } + + /** + * Sets the pattern + * + * @param pattern the pattern + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1935ddfe/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDateTimePatternFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDateTimePatternFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDateTimePatternFormat.java new file mode 100644 index 0000000..62a0399 --- /dev/null +++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalDateTimePatternFormat.java @@ -0,0 +1,94 @@ +/** + * 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; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import org.apache.camel.dataformat.bindy.PatternFormat; +import org.apache.camel.util.ObjectHelper; + +public class LocalDateTimePatternFormat implements PatternFormat<LocalDateTime> { + + private String pattern; + private Locale locale; + private ZoneId zone; + + public LocalDateTimePatternFormat() { + } + + public LocalDateTimePatternFormat(String pattern, String timezone, Locale locale) { + this.pattern = pattern; + this.locale = locale; + if (timezone.isEmpty()) { + this.zone = ZoneId.systemDefault(); + } else { + this.zone = ZoneId.of(timezone); + } + } + + public String format(LocalDateTime object) throws Exception { + ObjectHelper.notNull(this.pattern, "pattern"); + return this.getDateFormat().format(object); + } + + public LocalDateTime parse(String string) throws Exception { + + LocalDateTime date; + DateTimeFormatter df = this.getDateFormat(); + + ObjectHelper.notNull(this.pattern, "pattern"); + + if (doesStringFitLengthOfPattern(string)) { + date = LocalDateTime.parse(string, df); + return date; + } else { + throw new FormatException("Date provided does not fit the pattern defined"); + } + + } + + private boolean doesStringFitLengthOfPattern(String string) { + return string.length() <= this.pattern.length(); + } + + protected DateTimeFormatter getDateFormat() { + DateTimeFormatter result; + if (locale != null) { + result = DateTimeFormatter.ofPattern(pattern, locale) + .withZone(zone); + } else { + result = DateTimeFormatter.ofPattern(pattern) + .withZone(zone); + } + return result; + } + + public String getPattern() { + return pattern; + } + + /** + * Sets the pattern + * + * @param pattern the pattern + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1935ddfe/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalTimePatternFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalTimePatternFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalTimePatternFormat.java new file mode 100644 index 0000000..dbab92f --- /dev/null +++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/LocalTimePatternFormat.java @@ -0,0 +1,95 @@ +/** + * 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; + +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import org.apache.camel.dataformat.bindy.PatternFormat; +import org.apache.camel.util.ObjectHelper; + + +public class LocalTimePatternFormat implements PatternFormat<LocalTime> { + + private String pattern; + private Locale locale; + private ZoneId zone; + + public LocalTimePatternFormat() { + } + + public LocalTimePatternFormat(String pattern, String timezone, Locale locale) { + this.pattern = pattern; + this.locale = locale; + if (timezone.isEmpty()) { + this.zone = ZoneId.systemDefault(); + } else { + this.zone = ZoneId.of(timezone); + } + } + + public String format(LocalTime object) throws Exception { + ObjectHelper.notNull(this.pattern, "pattern"); + return this.getDateFormat().format(object); + } + + public LocalTime parse(String string) throws Exception { + + LocalTime date; + DateTimeFormatter df = this.getDateFormat(); + + ObjectHelper.notNull(this.pattern, "pattern"); + + if (doesStringFitLengthOfPattern(string)) { + date = LocalTime.parse(string, df); + return date; + } else { + throw new FormatException("Date provided does not fit the pattern defined"); + } + + } + + private boolean doesStringFitLengthOfPattern(String string) { + return string.length() <= this.pattern.length(); + } + + protected DateTimeFormatter getDateFormat() { + DateTimeFormatter result; + if (locale != null) { + result = DateTimeFormatter.ofPattern(pattern, locale) + .withZone(zone); + } else { + result = DateTimeFormatter.ofPattern(pattern) + .withZone(zone); + } + return result; + } + + public String getPattern() { + return pattern; + } + + /** + * Sets the pattern + * + * @param pattern the pattern + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/1935ddfe/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 e3bd410..04f1857 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 @@ -16,6 +16,9 @@ */ package org.apache.camel.dataformat.bindy.model.date; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.Date; import org.apache.camel.EndpointInject; @@ -48,7 +51,7 @@ public class BindyDatePatternCsvUnmarshallTest extends AbstractJUnit4SpringConte @Test @DirtiesContext public void testUnMarshallMessage() throws Exception { - expected = "10,Christian,Mueller,12-24-2013"; + expected = "10,Christian,Mueller,12-24-2013,12-26-2015,01-06-2016 12:14:49,13:15:01"; result.expectedBodiesReceived(expected + "\r\n"); @@ -85,6 +88,15 @@ public class BindyDatePatternCsvUnmarshallTest extends AbstractJUnit4SpringConte @DataField(pos = 4, pattern = "MM-dd-yyyy") private Date orderDate; + @DataField(pos = 5, pattern = "MM-dd-yyyy") + private LocalDate deliveryDate; + + @DataField(pos = 6, pattern = "MM-dd-yyyy HH:mm:ss") + private LocalDateTime returnedDateTime; + + @DataField(pos = 7, pattern = "HH:mm:ss") + private LocalTime receivedTime; + public int getOrderNr() { return orderNr; } @@ -121,5 +133,29 @@ public class BindyDatePatternCsvUnmarshallTest extends AbstractJUnit4SpringConte public String toString() { return "Model : " + Order.class.getName() + " : " + this.orderNr + ", " + this.firstName + ", " + this.lastName + ", " + String.valueOf(this.orderDate); } + + public LocalDate getDeliveryDate() { + return deliveryDate; + } + + public void setDeliveryDate(LocalDate deliveryDate) { + this.deliveryDate = deliveryDate; + } + + public LocalDateTime getReturnedDateTime() { + return returnedDateTime; + } + + public void setReturnedDateTime(LocalDateTime returnedDateTime) { + this.returnedDateTime = returnedDateTime; + } + + public LocalTime getReceivedTime() { + return receivedTime; + } + + public void setReceivedTime(LocalTime receivedTime) { + this.receivedTime = receivedTime; + } } }