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

[incubator-plc4x] 22/29: cleanup AdsPlcFieldHandler. Still needs fixing.

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

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

commit 660f212d350eec4b4ee38cf371f4546817c466ca
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Sep 14 15:12:54 2018 +0200

    cleanup AdsPlcFieldHandler. Still needs fixing.
---
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   | 287 ++-------------------
 1 file changed, 16 insertions(+), 271 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 bb6e70c..a7742a0 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
@@ -24,8 +24,10 @@ import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
 import org.apache.plc4x.java.base.messages.items.*;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
+import java.time.LocalDateTime;
 import java.util.BitSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -661,51 +663,6 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
     private FieldItem internalEncodeBoolean(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        switch (adsField.getAdsDataType()) {
             case BOOL:
             case BYTE:
             case WORD:
@@ -755,118 +712,47 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        BigInteger minValue;
-        BigInteger maxValue;
+        BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
+        BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
         Class<? extends FieldItem> fieldType;
         switch (adsField.getAdsDataType()) {
             case BYTE:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case WORD:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case DWORD:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case SINT:
-                minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case USINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case INT:
-                minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case UINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(((long) Short.MAX_VALUE) * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case DINT:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case UDINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(((long) Integer.MAX_VALUE) * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case LINT:
-                minValue = BigInteger.valueOf(Long.MIN_VALUE);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case ULINT:
-                minValue = BigInteger.valueOf((long) 0);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE).multiply(BigInteger.valueOf((long) 2));
                 fieldType = DefaultBigIntegerFieldItem.class;
                 break;
             case INT32:
-                minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
-                maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             case INT64:
-                minValue = BigInteger.valueOf(Long.MIN_VALUE);
-                maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 break;
             default:
@@ -882,7 +768,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         "Value of type " + values[i].getClass().getName() +
                             " is not assignable to " + adsField.getAdsDataType().name() + " fields.");
                 }
-                BigInteger value = BigInteger.valueOf(((Number) values[i]).longValue());
+                BigDecimal value = BigDecimal.valueOf(((Number) values[i]).longValue());
                 if (minValue.compareTo(value) > 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed minimum for type "
@@ -899,12 +785,12 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
         } else {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
-                BigInteger value;
+                BigDecimal value;
                 if (values[i] instanceof BigInteger) {
-                    value = (BigInteger) values[i];
+                    value = new BigDecimal((BigInteger) values[i]);
                 } else if (((values[i] instanceof Byte) || (values[i] instanceof Short) ||
                     (values[i] instanceof Integer) || (values[i] instanceof Long))) {
-                    value = BigInteger.valueOf(((Number) values[i]).longValue());
+                    value = new BigDecimal(((Number) values[i]).longValue());
                 } else {
                     throw new IllegalArgumentException(
                         "Value of type " + values[i].getClass().getName() +
@@ -920,7 +806,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         "Value of " + value.toString() + " exceeds allowed maximum for type "
                             + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");
                 }
-                bigIntegerValues[i] = value;
+                bigIntegerValues[i] = value.toBigInteger();
             }
             return new DefaultBigIntegerFieldItem(bigIntegerValues);
         }
@@ -928,63 +814,12 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        Double minValue;
-        Double maxValue;
+        BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
+        BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
         switch (adsField.getAdsDataType()) {
             case REAL:
-                // Yes this is actually correct, if I set min to Float.MIN_VALUE (0.0 < Float.MIN_VALUE = true)
-                minValue = (double) -Float.MAX_VALUE;
-                maxValue = (double) Float.MAX_VALUE;
                 break;
             case LREAL:
-                // Yes this is actually correct, if I set min to Double.MIN_VALUE (0.0 < Double.MIN_VALUE = true)
-                minValue = -Double.MAX_VALUE;
-                maxValue = Double.MAX_VALUE;
                 break;
             default:
                 throw new IllegalArgumentException(
@@ -1001,12 +836,13 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                     "Value of type " + values[i].getClass().getName() +
                         " is not assignable to " + adsField.getAdsDataType().name() + " fields.");
             }
-            if (floatingPointValues[i] < minValue) {
+
+            if (minValue.compareTo(new BigDecimal(floatingPointValues[i])) < 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed minimum for type "
                         + adsField.getAdsDataType().name() + " (min " + minValue.toString() + ")");
             }
-            if (floatingPointValues[i] > maxValue) {
+            if (maxValue.compareTo(new BigDecimal(floatingPointValues[i])) > 0) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed maximum for type "
                         + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");
@@ -1017,56 +853,10 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
 
     private FieldItem internalEncodeString(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
-        switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        int maxLength;
+        double maxLength = adsField.getAdsDataType().getUpperBound();
         boolean encoding16Bit;
         switch (adsField.getAdsDataType()) {
             case STRING:
-                maxLength = 254;
                 encoding16Bit = false;
                 break;
             default:
@@ -1143,55 +933,10 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
     private FieldItem internalEncodeTemporal(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
-            case BIT:
-            case BIT8:
-            case BITARR8:
-            case BITARR16:
-            case BITARR32:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case UINT8:
-            case UINT16:
-            case UINT32:
-            case UINT64:
-            case FLOAT:
-            case DOUBLE:
-            case BOOL:
-            case BYTE:
-            case WORD:
-            case DWORD:
-            case SINT:
-            case USINT:
-            case INT:
-            case UINT:
-            case DINT:
-            case UDINT:
-            case LINT:
-            case ULINT:
-            case REAL:
-            case LREAL:
-            case STRING:
-            case TIME:
-            case TIME_OF_DAY:
-            case DATE:
-            case DATE_AND_TIME:
-            case ARRAY:
-            case POINTER:
-            case ENUM:
-            case STRUCT:
-            case ALIAS:
-            case SUB_RANGE_DATA_TYPE:
-            case UNKNOWN:
-            default:
-                //throw new PlcRuntimeException("Invalid encoder for type " + adsField.getAdsDataType().name());
-        }
-        switch (adsField.getAdsDataType()) {
             case TIME:
             case DATE:
             case DATE_AND_TIME:
-                return new DefaultTimeFieldItem();
+                return new DefaultTimeFieldItem((LocalDateTime[]) values);
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign temporal values to " + adsField.getAdsDataType().name() + " fields.");