You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2018/03/23 14:55:18 UTC

[camel] 02/05: CAMEL-12334: Mapped date to LocalDate and time to OffsetTime. Added properties to control the behavior

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

zregvart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 9499be837d2f2ca3d79e5c678fa4111c51ddb1b6
Author: Ajmera, Hemang /External <he...@teliacompany.com>
AuthorDate: Tue Mar 20 11:05:12 2018 +0530

    CAMEL-12334: Mapped date to LocalDate and time to OffsetTime. Added properties to control the behavior
---
 .../camel-salesforce-component/README.md           |  2 +-
 .../src/main/docs/salesforce-component.adoc        | 32 ++--------------------
 .../salesforce/api/utils/DateTimeUtils.java        | 12 +++++---
 .../salesforce/api/utils/TimeConverter.java        | 10 +++----
 .../salesforce/api/utils/TimeDeserializer.java     |  8 +++---
 .../component/salesforce/api/utils/TimeModule.java |  6 ++--
 .../salesforce/api/utils/TimeSerializer.java       | 10 +++----
 .../salesforce/api/utils/DateTimeUtilsTest.java    | 16 ++++++-----
 .../camel-salesforce-maven-plugin/README.md        |  6 ++--
 .../java/org/apache/camel/maven/GenerateMojo.java  | 21 ++++++++++++--
 10 files changed, 60 insertions(+), 63 deletions(-)

diff --git a/components/camel-salesforce/camel-salesforce-component/README.md b/components/camel-salesforce/camel-salesforce-component/README.md
index b923dfa..00c65cc 100644
--- a/components/camel-salesforce/camel-salesforce-component/README.md
+++ b/components/camel-salesforce/camel-salesforce-component/README.md
@@ -1,7 +1,7 @@
 # Camel Salesforce component #
 
 This component supports producer and consumer endpoints to communicate with Salesforce using Java DTOs. 
-There is a companion maven plugin [camel-salesforce-plugin](https://github.com/dhirajsb/camel-salesforce-maven-plugin) that generates these DTOs. 
+There is a companion maven plugin [camel-salesforce-plugin](https://github.com/apache/camel/tree/master/components/camel-salesforce/camel-salesforce-maven-plugin) that generates these DTOs. 
 
 The component supports the following Salesforce APIs
 
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
index 5926d6f..1cbb4e8 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
@@ -22,7 +22,7 @@ for this component:
 ----
 
 NOTE: Developers wishing to contribute to the component are instructed
-to look at the README.md file on instructions on how to get started and
+to look at the https://github.com/apache/camel/tree/master/components/camel-salesforce/camel-salesforce-component/README.md[README.md] file on instructions on how to get started and
 setup your environment for running integration tests.
 
 === Authenticating to Salesforce
@@ -535,8 +535,7 @@ final SObjectCompositeResult contactCreationResult = results.stream().filter(r -
 
 === Camel Salesforce Maven Plugin
 
-This Maven plugin generates DTOs for the Camel
-<<salesforce-component,Salesforce>>.
+This Maven plugin generates DTOs for the Camel. Please refer to https://github.com/apache/camel/tree/master/components/camel-salesforce/camel-salesforce-maven-plugin[README.md] for details on how to generated the DTO.
 
 === Options
 
@@ -666,29 +665,4 @@ with the following path and query parameters:
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
-// endpoint options: END
-
-
-
-
-For obvious security reasons it is recommended that the clientId,
-clientSecret, userName and password fields be not set in the pom.xml.  
-The plugin should be configured for the rest of the properties, and can
-be executed using the following command:
-
-[source,java]
-----
-mvn camel-salesforce:generate -DcamelSalesforce.clientId=<clientid> -DcamelSalesforce.clientSecret=<clientsecret> \
-    -DcamelSalesforce.userName=<username> -DcamelSalesforce.password=<password>
-----
-
-The generated DTOs use Jackson and XStream annotations. All Salesforce
-field types are supported. Date and time fields are mapped to Joda
-DateTime, and picklist fields are mapped to generated Java Enumerations.
-
-=== See Also
-
-* Configuring Camel
-* Component
-* Endpoint
-* Getting Started
+// endpoint options: END
\ No newline at end of file
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtils.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtils.java
index 518a78a..881da39 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtils.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtils.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.salesforce.api.utils;
 import java.time.DateTimeException;
 import java.time.LocalDate;
 import java.time.LocalTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
@@ -67,12 +69,14 @@ public abstract class DateTimeUtils {
         return ISO_LOCAL_DATE.parse(date,LocalDate::from);
     }
         
-    public static String formatTime(LocalTime time) {
-        return ISO_LOCAL_TIME.format(time);
+    public static String formatTime(OffsetTime time) {
+        // Sets the timezone as UTC for the time before sending to salesforce
+        return ISO_LOCAL_TIME.format(time.withOffsetSameInstant(ZoneOffset.UTC).toLocalTime());
     }
     
-    public static LocalTime parseTime(String time) {
-        return ISO_LOCAL_TIME.parse(time, LocalTime::from);
+    public static OffsetTime parseTime(String time) {
+        // Sets the timezone as UTC for the time which comes from salesforce
+        return OffsetTime.of(ISO_LOCAL_TIME.parse(time, LocalTime::from), ZoneOffset.UTC);
     }
  
 }
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeConverter.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeConverter.java
index e12d7e6..4f87b59 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeConverter.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeConverter.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.component.salesforce.api.utils;
 
-import java.time.LocalTime;
+import java.time.OffsetTime;
 
 import com.thoughtworks.xstream.converters.ConversionException;
 import com.thoughtworks.xstream.converters.Converter;
@@ -26,13 +26,13 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader;
 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 
 /**
- * XStream converter for handling {@link LocalTime} fields.
+ * XStream converter for handling {@link OffsetTime} fields.
  */
 public class TimeConverter implements Converter {
 
     @Override
     public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext context) {
-        LocalTime time = (LocalTime) o;
+        OffsetTime time = (OffsetTime) o;
         writer.setValue(DateTimeUtils.formatTime(time));
     }
 
@@ -42,7 +42,7 @@ public class TimeConverter implements Converter {
             return DateTimeUtils.parseTime(reader.getValue());
         } catch (Exception e) {
             throw new ConversionException(
-                    String.format("Error reading LocalTime from value %s: %s",
+                    String.format("Error reading OffsetTime from value %s: %s",
                         reader.getValue(), e.getMessage()),
                     e);
         }
@@ -50,7 +50,7 @@ public class TimeConverter implements Converter {
 
     @Override
     public boolean canConvert(Class aClass) {
-        return LocalTime.class.isAssignableFrom(aClass);
+        return OffsetTime.class.isAssignableFrom(aClass);
     }
 
 }
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeDeserializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeDeserializer.java
index 5085254..7363db4 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeDeserializer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeDeserializer.java
@@ -17,7 +17,7 @@
 package org.apache.camel.component.salesforce.api.utils;
 
 import java.io.IOException;
-import java.time.LocalTime;
+import java.time.OffsetTime;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonToken;
@@ -26,14 +26,14 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.JsonMappingException;
 
 
-public class TimeDeserializer extends JsonDeserializer<LocalTime> {
+public class TimeDeserializer extends JsonDeserializer<OffsetTime> {
 
     public TimeDeserializer() {
         super();
     }
 
     @Override
-    public LocalTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
+    public OffsetTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
         JsonToken currentToken = jsonParser.getCurrentToken();
         if (currentToken == JsonToken.VALUE_STRING) {
             return DateTimeUtils.parseTime(jsonParser.getText().trim());
@@ -43,6 +43,6 @@ public class TimeDeserializer extends JsonDeserializer<LocalTime> {
 
     @Override
     public Class<?> handledType() {
-        return LocalTime.class;
+        return OffsetTime.class;
     }
 }
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeModule.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeModule.java
index cdd5b88..3cfea55 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeModule.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeModule.java
@@ -17,7 +17,7 @@
 package org.apache.camel.component.salesforce.api.utils;
 
 
-import java.time.LocalTime;
+import java.time.OffsetTime;
 
 import com.fasterxml.jackson.databind.module.SimpleModule;
 
@@ -25,7 +25,7 @@ public class TimeModule extends SimpleModule {
 
     public TimeModule() {
         super();
-        addSerializer(LocalTime.class, new TimeSerializer());
-        addDeserializer(LocalTime.class, new TimeDeserializer());
+        addSerializer(OffsetTime.class, new TimeSerializer());
+        addDeserializer(OffsetTime.class, new TimeDeserializer());
     }
 }
\ No newline at end of file
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeSerializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeSerializer.java
index 1c83b8a..f8d684a 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeSerializer.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/TimeSerializer.java
@@ -17,7 +17,7 @@
 package org.apache.camel.component.salesforce.api.utils;
 
 import java.io.IOException;
-import java.time.LocalTime;
+import java.time.OffsetTime;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JavaType;
@@ -27,20 +27,20 @@ import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
 
 
-public class TimeSerializer extends JsonSerializer<LocalTime> {
+public class TimeSerializer extends JsonSerializer<OffsetTime> {
 
     public TimeSerializer() {
         super();
     }
 
     @Override
-    public void serialize(LocalTime time, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+    public void serialize(OffsetTime time, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
         jsonGenerator.writeString(DateTimeUtils.formatTime(time));
     }
 
     @Override
-    public Class<LocalTime> handledType() {
-        return LocalTime.class;
+    public Class<OffsetTime> handledType() {
+        return OffsetTime.class;
     }
 
     @Override
diff --git a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtilsTest.java b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtilsTest.java
index d50ba79..f2bb8fe 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtilsTest.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/api/utils/DateTimeUtilsTest.java
@@ -18,7 +18,9 @@ package org.apache.camel.component.salesforce.api.utils;
 
 import java.time.LocalDate;
 import java.time.LocalTime;
+import java.time.OffsetTime;
 import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 
 import org.junit.Test;
@@ -63,16 +65,16 @@ public class DateTimeUtilsTest {
 
     @Test
     public void testFormatTime() {
-        assertEquals("12:13:14.007", DateTimeUtils.formatTime(LocalTime.of(12, 13, 14, 7000000)));
-        assertEquals("01:00:00", DateTimeUtils.formatTime(LocalTime.of(1, 0, 0, 0)));
-        assertEquals("00:00:00", DateTimeUtils.formatTime(LocalTime.of(0, 0, 0)));
+        assertEquals("12:13:14.007", DateTimeUtils.formatTime(OffsetTime.of(12, 13, 14, 7000000,ZoneOffset.UTC)));
+        assertEquals("01:00:00", DateTimeUtils.formatTime(OffsetTime.of(1, 0, 0, 0,ZoneOffset.UTC)));
+        assertEquals("00:00:00", DateTimeUtils.formatTime(OffsetTime.of(LocalTime.MIDNIGHT,ZoneOffset.UTC)));
     }
 
     @Test
     public void testParseTime() {
-        assertEquals(LocalTime.of(0,0,0), DateTimeUtils.parseTime("00:00:00.000"));
-        assertEquals(LocalTime.of(1,0,0,100), DateTimeUtils.parseTime("01:00:00.0000001"));
-        assertEquals(LocalTime.of(12,13,14,7000000), DateTimeUtils.parseTime("12:13:14.007"));
-        assertEquals(LocalTime.of(12,13,0), DateTimeUtils.parseTime("12:13"));
+        assertEquals(OffsetTime.of(LocalTime.MIDNIGHT, ZoneOffset.UTC), DateTimeUtils.parseTime("00:00:00.000"));
+        assertEquals(OffsetTime.of(1, 0, 0, 100, ZoneOffset.UTC), DateTimeUtils.parseTime("01:00:00.0000001"));
+        assertEquals(OffsetTime.of(12, 13, 14, 7000000, ZoneOffset.UTC), DateTimeUtils.parseTime("12:13:14.007"));
+        assertEquals(OffsetTime.of(12, 13, 0, 0, ZoneOffset.UTC), DateTimeUtils.parseTime("12:13"));
     }
 }
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/README.md b/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
index 54f42c4..67bbeeb 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
@@ -1,6 +1,6 @@
 # Maven plugin for camel-salesforce component #
 
-This plugin generates DTOs for the [Camel Salesforce Component](https://github.com/dhirajsb/camel-salesforce). 
+This plugin generates DTOs for the [Camel Salesforce Component](https://github.com/apache/camel/tree/master/components/camel-salesforce/camel-salesforce-component). 
 
 ## Usage ##
 
@@ -18,6 +18,8 @@ The plugin configuration has the following properties.
 * includePattern - Java RegEx for SObject types to include
 * excludePattern - Java RegEx for SObject types to exclude
 * packageName - Java package name for generated DTOs, defaults to org.apache.camel.salesforce.dto.
+* useZonedTimeDateForDate - it will use ZonedTimeDate for Date if set to true. By default it will use LocalDate.
+* useZonedTimeDateForTime - it will use ZonedTimeDate for Time if set to true. By default it will use OffsetTime, with timezone offset set to UTC.
 
 Additonal properties to provide proxy information, if behind a firewall.
 
@@ -89,4 +91,4 @@ The plugin should be configured for the rest of the properties, and can be execu
 
 	mvn camel-salesforce:generate -DcamelSalesforce.clientId=<clientid> -DcamelSalesforce.clientSecret=<clientsecret> -DcamelSalesforce.userName=<username> -DcamelSalesforce.password=<password>
 
-The generated DTOs use Jackson and XStream annotations. All Salesforce field types are supported. Date and time fields are mapped to java.time.ZonedDateTime, and picklist fields are mapped to generated Java Enumerations.
+The generated DTOs use Jackson and XStream annotations. All Salesforce field types are supported. DateTime and Timestamp fields are mapped to java.time.ZonedDateTime, and picklist fields are mapped to generated Java Enumerations.
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
index 9c40e8d..32ac514 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
@@ -116,8 +116,11 @@ public class GenerateMojo extends AbstractSalesforceMojo {
                 return description.getName() + "_" + enumTypeName(field.getName()) + "[]";
             } else {
                 // map field to Java type
-                final String soapType = field.getSoapType();
-                final String type = LOOKUP_MAP.get(soapType.substring(soapType.indexOf(':') + 1));
+                final String soapType = field.getSoapType().split(":",2)[1];
+                final String type = (
+                        (soapType.equals("date")&&useZonedTimeDateForDate) ||
+                        (soapType.equals("time")&&useZonedTimeDateForTime) )
+                        ? "java.time.ZonedDateTime" : LOOKUP_MAP.get(soapType);
                 if (type == null) {
                     getLog().warn(String.format("Unsupported field type %s in field %s of object %s", soapType,
                         field.getName(), description.getName()));
@@ -316,6 +319,18 @@ public class GenerateMojo extends AbstractSalesforceMojo {
     @Parameter(property = "camelSalesforce.useStringsForPicklists", defaultValue = "false")
     private Boolean useStringsForPicklists;
 
+    /**
+     * Generator will use java.time.ZonedTimeDate for Date if set to true, else it will default to java.time.LocalDate
+     */
+    @Parameter(property = "camelSalesforce.useZonedTimeDateForDate", defaultValue = "false")
+    private boolean useZonedTimeDateForDate;
+ 
+    /**
+     * Generator will use java.time.ZonedTimeDate for Time if set to true, else it will default to java.time.OffsetTime
+     */
+    @Parameter(property = "camelSalesforce.useZonedTimeDateForTime", defaultValue = "false")
+    private boolean useZonedTimeDateForTime;
+    
     void processDescription(final File pkgDir, final SObjectDescription description, final GeneratorUtility utility,
         final String generatedDate) throws IOException {
         // generate a source file for SObject
@@ -475,7 +490,7 @@ public class GenerateMojo extends AbstractSalesforceMojo {
             {"unsignedInt", "Long"}, //
             {"unsignedShort", "Integer"}, //
             {"unsignedByte", "Short"}, //
-            {"time", "java.time.LocalTime"}, //
+            {"time", "java.time.OffsetTime"}, //
             {"date", "java.time.LocalDate"}, //
             {"g", "java.time.ZonedDateTime"}, //
             // Salesforce maps any types like string, picklist, reference, etc.

-- 
To stop receiving notification emails like this one, please contact
zregvart@apache.org.