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