You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/09/17 12:53:10 UTC

[incubator-plc4x] branch master updated: ADS/General fixed date handling

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

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/master by this push:
     new 38febac  ADS/General fixed date handling
38febac is described below

commit 38febac069288cda77accd5c0e4eb463758ac2e3
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Sep 17 14:52:58 2018 +0200

    ADS/General fixed date handling
---
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   |  2 +-
 .../ads/protocol/util/LittleEndianDecoder.java     | 43 +++++++++-------------
 ...eldItem.java => DefaultLocalDateFieldItem.java} | 34 ++---------------
 ...tem.java => DefaultLocalDateTimeFieldItem.java} |  4 +-
 ...eldItem.java => DefaultLocalTimeFieldItem.java} | 34 ++---------------
 ...ieldItem.java => S7LocalDateTimeFieldItem.java} |  6 +--
 .../java/s7/netty/util/S7PlcFieldHandler.java      |  4 +-
 .../apache/plc4x/java/test/TestFieldHandler.java   |  6 +--
 8 files changed, 35 insertions(+), 98 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
index 668f926..11dc8c8 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
@@ -936,7 +936,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
             case TIME:
             case DATE:
             case DATE_AND_TIME:
-                return new DefaultTimeFieldItem((LocalDateTime[]) values);
+                return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign temporal values to " + adsField.getAdsDataType().name() + " fields.");
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
index 70cbd21..2c689a3 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
@@ -27,10 +27,12 @@ import org.apache.plc4x.java.base.messages.items.*;
 
 import java.io.ByteArrayOutputStream;
 import java.math.BigInteger;
-import java.time.Instant;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.ZoneId;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
 import java.util.LinkedList;
+import java.util.concurrent.TimeUnit;
 
 // TODO: we might user ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).putInt(port).asArray() etc
 public class LittleEndianDecoder {
@@ -258,15 +260,14 @@ public class LittleEndianDecoder {
                 return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
             }
             case ULINT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<BigInteger> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     byte[] bytes = new byte[64];
                     wrappedBuffer.readBytes(bytes);
                     BigInteger bigInteger = new BigInteger(ArrayUtils.add(bytes, (byte) 0x0));
-                    // TODO: potential dataloss here.
-                    values.offer(bigInteger.longValue());
+                    values.offer(bigInteger);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultBigIntegerFieldItem(values.toArray(new BigInteger[0]));
             }
             case REAL: {
                 LinkedList<Double> values = new LinkedList<>();
@@ -297,44 +298,36 @@ public class LittleEndianDecoder {
                 return new DefaultStringFieldItem(values.toArray(new String[0]));
             }
             case TIME: {
-                LinkedList<LocalDateTime> values = new LinkedList<>();
+                LinkedList<Long> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
-                    // TODO: we can't map time to LocalDateTime. Implmentation broken currently
-                    Instant instant = Instant.ofEpochMilli(aByte);
-                    values.offer(LocalDateTime.ofInstant(instant, ZoneId.of("ECT")));
+                    values.offer(aByte);
                 }
-                return new DefaultTimeFieldItem(values.toArray(new LocalDateTime[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
             }
             case TIME_OF_DAY: {
-                LinkedList<LocalDateTime> values = new LinkedList<>();
+                LinkedList<LocalTime> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
-                    // TODO: we can't map time to LocalDateTime. Implmentation broken currently
-                    Instant instant = Instant.ofEpochMilli(aByte);
-                    values.offer(LocalDateTime.ofInstant(instant, ZoneId.of("ECT")));
+                    values.offer(LocalTime.ofNanoOfDay(TimeUnit.MILLISECONDS.toNanos(aByte)));
                 }
-                return new DefaultTimeFieldItem(values.toArray(new LocalDateTime[0]));
+                return new DefaultLocalTimeFieldItem(values.toArray(new LocalTime[0]));
             }
             case DATE: {
-                LinkedList<LocalDateTime> values = new LinkedList<>();
+                LinkedList<LocalDate> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
-                    // TODO: we can't map time to LocalDateTime. Implmentation broken currently
-                    Instant instant = Instant.ofEpochMilli(aByte);
-                    values.offer(LocalDateTime.ofInstant(instant, ZoneId.of("ECT")));
+                    values.offer(LocalDate.ofEpochDay(aByte));
                 }
-                return new DefaultTimeFieldItem(values.toArray(new LocalDateTime[0]));
+                return new DefaultLocalDateFieldItem(values.toArray(new LocalDate[0]));
             }
             case DATE_AND_TIME: {
                 LinkedList<LocalDateTime> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
-                    // TODO: we can't map time to LocalDateTime. Implmentation broken currently
-                    Instant instant = Instant.ofEpochMilli(aByte);
-                    values.offer(LocalDateTime.ofInstant(instant, ZoneId.of("ECT")));
+                    values.offer(LocalDateTime.ofEpochSecond(aByte, 0, ZoneOffset.UTC));
                 }
-                return new DefaultTimeFieldItem(values.toArray(new LocalDateTime[0]));
+                return new DefaultLocalDateTimeFieldItem(values.toArray(new LocalDateTime[0]));
             }
             case ARRAY: {
                 throw new NotImplementedException("not implemented yet " + adsDataType);
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
similarity index 60%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
index 18f2190..6fedf24 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
@@ -19,12 +19,10 @@ under the License.
 package org.apache.plc4x.java.base.messages.items;
 
 import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
 
-public class DefaultTimeFieldItem extends FieldItem<LocalDateTime> {
+public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
 
-    public DefaultTimeFieldItem(LocalDateTime... values) {
+    public DefaultLocalDateFieldItem(LocalDate... values) {
         super(values);
     }
 
@@ -34,39 +32,13 @@ public class DefaultTimeFieldItem extends FieldItem<LocalDateTime> {
     }
 
     @Override
-    public boolean isValidTime(int index) {
-        return (getValue(index) != null);
-    }
-
-    @Override
-    public LocalTime getTime(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalTime();
-        }
-        return null;
-    }
-
-    @Override
     public boolean isValidDate(int index) {
         return (getValue(index) != null);
     }
 
     @Override
     public LocalDate getDate(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalDate();
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isValidDateTime(int index) {
-        return (getValue(index) != null);
-    }
-
-    @Override
-    public LocalDateTime getDateTime(int index) {
-        if(isValidTime(index)) {
+        if (isValidTime(index)) {
             return getValue(index);
         }
         return null;
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
similarity index 92%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
index 18f2190..8e9d371 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
@@ -22,9 +22,9 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 
-public class DefaultTimeFieldItem extends FieldItem<LocalDateTime> {
+public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
 
-    public DefaultTimeFieldItem(LocalDateTime... values) {
+    public DefaultLocalDateTimeFieldItem(LocalDateTime... values) {
         super(values);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
similarity index 60%
rename from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
rename to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
index 18f2190..fcaf0c7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
@@ -18,13 +18,11 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.LocalTime;
 
-public class DefaultTimeFieldItem extends FieldItem<LocalDateTime> {
+public class DefaultLocalTimeFieldItem extends FieldItem<LocalTime> {
 
-    public DefaultTimeFieldItem(LocalDateTime... values) {
+    public DefaultLocalTimeFieldItem(LocalTime... values) {
         super(values);
     }
 
@@ -40,33 +38,7 @@ public class DefaultTimeFieldItem extends FieldItem<LocalDateTime> {
 
     @Override
     public LocalTime getTime(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalTime();
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isValidDate(int index) {
-        return (getValue(index) != null);
-    }
-
-    @Override
-    public LocalDate getDate(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalDate();
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isValidDateTime(int index) {
-        return (getValue(index) != null);
-    }
-
-    @Override
-    public LocalDateTime getDateTime(int index) {
-        if(isValidTime(index)) {
+        if (isValidTime(index)) {
             return getValue(index);
         }
         return null;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LocalDateTimeFieldItem.java
similarity index 84%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
rename to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LocalDateTimeFieldItem.java
index 6d7821e..433dab6 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LocalDateTimeFieldItem.java
@@ -18,16 +18,16 @@
  */
 package org.apache.plc4x.java.s7.messages.items;
 
-import org.apache.plc4x.java.base.messages.items.DefaultTimeFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLocalDateTimeFieldItem;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.time.LocalDateTime;
 
-public class S7TimeFieldItem extends DefaultTimeFieldItem {
+public class S7LocalDateTimeFieldItem extends DefaultLocalDateTimeFieldItem {
 
     private final TransportSize naturalDataType;
 
-    public S7TimeFieldItem(TransportSize naturalDataType, LocalDateTime... values) {
+    public S7LocalDateTimeFieldItem(TransportSize naturalDataType, LocalDateTime... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
index 6e9b36d..d1612ac 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
 import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
-import org.apache.plc4x.java.base.messages.items.DefaultTimeFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLocalDateTimeFieldItem;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
@@ -478,7 +478,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
             case TIME:
             case DATE:
             case DATE_AND_TIME:
-                return new DefaultTimeFieldItem();
+                return new DefaultLocalDateTimeFieldItem();
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign temporal values to " + s7Field.getDataType().name() + " fields.");
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
index 839c89c..36325f4 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
@@ -126,7 +126,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalTime.class) {
-            return new DefaultTimeFieldItem((LocalDateTime[]) values);
+            return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -135,7 +135,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeDate(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalDate.class) {
-            return new DefaultTimeFieldItem((LocalDateTime[]) values);
+            return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -144,7 +144,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeDateTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalDateTime.class) {
-            return new DefaultTimeFieldItem((LocalDateTime[]) values);
+            return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }