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/13 11:35:51 UTC

[incubator-plc4x] 01/02: added support for BigInteger on field handler

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

sruehl pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 26cba520ee590c64e0d614f27c62d586e961625e
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Sep 13 13:35:07 2018 +0200

    added support for BigInteger on field handler
---
 .../apache/plc4x/edgent/mock/MockFieldHandler.java |   5 +
 .../plc4x/java/api/messages/PlcWriteRequest.java   |   3 +
 .../java/base/connection/PlcFieldHandler.java      |   2 +
 .../java/base/messages/DefaultPlcWriteRequest.java |   7 ++
 .../base/protocol/Plc4XSupportedDataTypes.java     |   9 +-
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 108 +++++++++++----------
 .../apache/plc4x/java/test/TestFieldHandler.java   |  34 ++++---
 7 files changed, 105 insertions(+), 63 deletions(-)

diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
index f8d2ac8..3d2c1ad 100644
--- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
+++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
@@ -52,6 +52,11 @@ public class MockFieldHandler implements PlcFieldHandler {
     }
 
     @Override
+    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+        return new MockFieldItem(values);
+    }
+
+    @Override
     public FieldItem encodeLong(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
index c89c003..1dfa4aa 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.api.messages;
 
+import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -36,6 +37,8 @@ public interface PlcWriteRequest extends PlcFieldRequest {
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Integer... values);
 
+        PlcWriteRequest.Builder addItem(String name, String fieldQuery, BigInteger... values);
+
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Long... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Float... values);
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
index d400b5b..2a86796 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
@@ -34,6 +34,8 @@ public interface PlcFieldHandler {
 
     FieldItem encodeInteger(PlcField field, Object[] values);
 
+    FieldItem encodeBigInteger(PlcField field, Object[] values);
+
     FieldItem encodeLong(PlcField field, Object[] values);
 
     FieldItem encodeFloat(PlcField field, Object[] values);
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
index 113bc5b..ec94553 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
@@ -26,6 +26,7 @@ import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 
+import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -90,6 +91,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest {
             handlerMap.put(Byte.class, fieldHandler::encodeByte);
             handlerMap.put(Short.class, fieldHandler::encodeShort);
             handlerMap.put(Integer.class, fieldHandler::encodeInteger);
+            handlerMap.put(BigInteger.class, fieldHandler::encodeBigInteger);
             handlerMap.put(Long.class, fieldHandler::encodeLong);
             handlerMap.put(Float.class, fieldHandler::encodeFloat);
             handlerMap.put(Double.class, fieldHandler::encodeDouble);
@@ -120,6 +122,11 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest {
         }
 
         @Override
+        public PlcWriteRequest.Builder addItem(String name, String fieldQuery, BigInteger... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeBigInteger);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Long... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeLong);
         }
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/protocol/Plc4XSupportedDataTypes.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/protocol/Plc4XSupportedDataTypes.java
index 4b1ca7e..dd48376 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/protocol/Plc4XSupportedDataTypes.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/protocol/Plc4XSupportedDataTypes.java
@@ -182,7 +182,7 @@ public class Plc4XSupportedDataTypes {
     public static class DataTypePair<T extends Serializable> {
         private final Pair<T, byte[]> dataTypePair;
 
-        private DataTypePair(Pair<T, byte[]> dataTypePair) {
+        public DataTypePair(Pair<T, byte[]> dataTypePair) {
             this.dataTypePair = dataTypePair;
         }
 
@@ -211,6 +211,13 @@ public class Plc4XSupportedDataTypes {
             return ArrayUtils.clone(dataTypePair.getRight());
         }
 
+        /**
+         * @return the internal pair.
+         */
+        public Pair<T, byte[]> getDataTypePair() {
+            return dataTypePair;
+        }
+
         @Override
         public boolean equals(Object o) {
             if (this == o) {
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 a34a79a..fd8ad5d 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
@@ -22,7 +22,9 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 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.*;
+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.FieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.types.S7DataType;
@@ -37,7 +39,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
 
     @Override
     public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
-        if(S7Field.matches(fieldQuery)) {
+        if (S7Field.matches(fieldQuery)) {
             return S7Field.of(fieldQuery);
         }
         throw new PlcInvalidFieldException(fieldQuery);
@@ -47,7 +49,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     public FieldItem encodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         // All of these types are declared as Bit or Bit-String types.
-        if((s7Field.getDataType() == S7DataType.BOOL) || (s7Field.getDataType() == S7DataType.BYTE) ||
+        if ((s7Field.getDataType() == S7DataType.BOOL) || (s7Field.getDataType() == S7DataType.BYTE) ||
             (s7Field.getDataType() == S7DataType.WORD) || (s7Field.getDataType() == S7DataType.DWORD) ||
             (s7Field.getDataType() == S7DataType.LWORD)) {
             return internalEncodeBoolean(field, values);
@@ -58,7 +60,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeByte(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if((s7Field.getDataType() == S7DataType.BYTE) || (s7Field.getDataType() == S7DataType.SINT) ||
+        if ((s7Field.getDataType() == S7DataType.BYTE) || (s7Field.getDataType() == S7DataType.SINT) ||
             (s7Field.getDataType() == S7DataType.USINT) || (s7Field.getDataType() == S7DataType.CHAR)) {
             return internalEncodeInteger(field, values);
         }
@@ -68,7 +70,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeShort(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if((s7Field.getDataType() == S7DataType.WORD) || (s7Field.getDataType() == S7DataType.INT) ||
+        if ((s7Field.getDataType() == S7DataType.WORD) || (s7Field.getDataType() == S7DataType.INT) ||
             (s7Field.getDataType() == S7DataType.UINT)) {
             return internalEncodeInteger(field, values);
         }
@@ -78,7 +80,17 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if((s7Field.getDataType() == S7DataType.DWORD) || (s7Field.getDataType() == S7DataType.DINT) ||
+        if ((s7Field.getDataType() == S7DataType.DWORD) || (s7Field.getDataType() == S7DataType.DINT) ||
+            (s7Field.getDataType() == S7DataType.UDINT)) {
+            return internalEncodeInteger(field, values);
+        }
+        throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
+    }
+
+    @Override
+    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+        S7Field s7Field = (S7Field) field;
+        if ((s7Field.getDataType() == S7DataType.DWORD) || (s7Field.getDataType() == S7DataType.DINT) ||
             (s7Field.getDataType() == S7DataType.UDINT)) {
             return internalEncodeInteger(field, values);
         }
@@ -88,7 +100,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeLong(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if((s7Field.getDataType() == S7DataType.LWORD) || (s7Field.getDataType() == S7DataType.LINT) ||
+        if ((s7Field.getDataType() == S7DataType.LWORD) || (s7Field.getDataType() == S7DataType.LINT) ||
             (s7Field.getDataType() == S7DataType.ULINT)) {
             return internalEncodeInteger(field, values);
         }
@@ -98,7 +110,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeFloat(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if(s7Field.getDataType() == S7DataType.REAL) {
+        if (s7Field.getDataType() == S7DataType.REAL) {
             return internalEncodeFloatingPoint(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -107,7 +119,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDouble(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if(s7Field.getDataType() == S7DataType.LREAL) {
+        if (s7Field.getDataType() == S7DataType.LREAL) {
             return internalEncodeFloatingPoint(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -116,7 +128,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if((s7Field.getDataType() == S7DataType.CHAR) || (s7Field.getDataType() == S7DataType.WCHAR) ||
+        if ((s7Field.getDataType() == S7DataType.CHAR) || (s7Field.getDataType() == S7DataType.WCHAR) ||
             (s7Field.getDataType() == S7DataType.STRING) || (s7Field.getDataType() == S7DataType.WSTRING)) {
             return internalEncodeString(field, values);
         }
@@ -126,7 +138,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if(s7Field.getDataType() == S7DataType.TIME) {
+        if (s7Field.getDataType() == S7DataType.TIME) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -135,7 +147,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDate(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if(s7Field.getDataType() == S7DataType.DATE) {
+        if (s7Field.getDataType() == S7DataType.DATE) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -144,7 +156,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDateTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if(s7Field.getDataType() == S7DataType.DATE_AND_TIME) {
+        if (s7Field.getDataType() == S7DataType.DATE_AND_TIME) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -165,31 +177,31 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
         }
         List<Boolean> booleanValues = new LinkedList<>();
         for (Object value : values) {
-            if(value instanceof Boolean) {
+            if (value instanceof Boolean) {
                 Boolean booleanValue = (Boolean) value;
                 booleanValues.add(booleanValue);
-            } else if(value instanceof Byte) {
+            } else if (value instanceof Byte) {
                 Byte byteValue = (Byte) value;
                 BitSet bitSet = BitSet.valueOf(new byte[]{byteValue});
-                for(int i = 0; i < 8; i++) {
+                for (int i = 0; i < 8; i++) {
                     booleanValues.add(bitSet.get(i));
                 }
-            } else if(value instanceof Short) {
+            } else if (value instanceof Short) {
                 Short shortValue = (Short) value;
                 BitSet bitSet = BitSet.valueOf(new long[]{shortValue});
-                for(int i = 0; i < 16; i++) {
+                for (int i = 0; i < 16; i++) {
                     booleanValues.add(bitSet.get(i));
                 }
-            } else if(value instanceof Integer) {
+            } else if (value instanceof Integer) {
                 Integer integerValue = (Integer) value;
                 BitSet bitSet = BitSet.valueOf(new long[]{integerValue});
-                for(int i = 0; i < 32; i++) {
+                for (int i = 0; i < 32; i++) {
                     booleanValues.add(bitSet.get(i));
                 }
-            } else if(value instanceof Long) {
+            } else if (value instanceof Long) {
                 long longValue = (Long) value;
                 BitSet bitSet = BitSet.valueOf(new long[]{longValue});
-                for(int i = 0; i < 64; i++) {
+                for (int i = 0; i < 64; i++) {
                     booleanValues.add(bitSet.get(i));
                 }
             } else {
@@ -271,22 +283,22 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 throw new IllegalArgumentException(
                     "Cannot assign integer values to " + s7Field.getDataType().name() + " fields.");
         }
-        if(fieldType == DefaultIntegerFieldItem.class) {
+        if (fieldType == DefaultIntegerFieldItem.class) {
             Long[] longValues = new Long[values.length];
             for (int i = 0; i < values.length; i++) {
-                if(!((values[i] instanceof Byte) || (values[i] instanceof Short) ||
-                    (values[i] instanceof Integer) || (values[i] instanceof Long))) {
+                if (!((values[i] instanceof Byte) || (values[i] instanceof Short) ||
+                    (values[i] instanceof Integer) || (values[i] instanceof BigInteger) || (values[i] instanceof Long))) {
                     throw new IllegalArgumentException(
                         "Value of type " + values[i].getClass().getName() +
                             " is not assignable to " + s7Field.getDataType().name() + " fields.");
                 }
                 BigInteger value = BigInteger.valueOf(((Number) values[i]).longValue());
-                if(minValue.compareTo(value) > 0) {
+                if (minValue.compareTo(value) > 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed minimum for type "
                             + s7Field.getDataType().name() + " (min " + minValue.toString() + ")");
                 }
-                if(maxValue.compareTo(value) < 0) {
+                if (maxValue.compareTo(value) < 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed maximum for type "
                             + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
@@ -298,9 +310,9 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
                 BigInteger value;
-                if(values[i] instanceof BigInteger) {
+                if (values[i] instanceof BigInteger) {
                     value = (BigInteger) values[i];
-                } else if(((values[i] instanceof Byte) || (values[i] instanceof Short) ||
+                } 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());
                 } else {
@@ -308,12 +320,12 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                         "Value of type " + values[i].getClass().getName() +
                             " is not assignable to " + s7Field.getDataType().name() + " fields.");
                 }
-                if(minValue.compareTo(value) > 0) {
+                if (minValue.compareTo(value) > 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed minimum for type "
                             + s7Field.getDataType().name() + " (min " + minValue.toString() + ")");
                 }
-                if(maxValue.compareTo(value) < 0) {
+                if (maxValue.compareTo(value) < 0) {
                     throw new IllegalArgumentException(
                         "Value of " + value.toString() + " exceeds allowed maximum for type "
                             + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
@@ -345,21 +357,21 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
         }
         Double[] floatingPointValues = new Double[values.length];
         for (int i = 0; i < values.length; i++) {
-            if(values[i] instanceof Float) {
+            if (values[i] instanceof Float) {
                 floatingPointValues[i] = ((Float) values[i]).doubleValue();
-            } else if(values[i] instanceof Double) {
+            } else if (values[i] instanceof Double) {
                 floatingPointValues[i] = (Double) values[i];
             } else {
                 throw new IllegalArgumentException(
                     "Value of type " + values[i].getClass().getName() +
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
-            if(floatingPointValues[i] < minValue) {
+            if (floatingPointValues[i] < minValue) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed minimum for type "
                         + s7Field.getDataType().name() + " (min " + minValue.toString() + ")");
             }
-            if(floatingPointValues[i] > maxValue) {
+            if (floatingPointValues[i] > maxValue) {
                 throw new IllegalArgumentException(
                     "Value of " + floatingPointValues[i] + " exceeds allowed maximum for type "
                         + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
@@ -395,9 +407,9 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
         }
         List<String> stringValues = new LinkedList<>();
         for (Object value : values) {
-            if(value instanceof String) {
+            if (value instanceof String) {
                 String stringValue = (String) value;
-                if(stringValue.length() > maxLength) {
+                if (stringValue.length() > maxLength) {
                     throw new IllegalArgumentException(
                         "String length " + stringValue.length() + " exceeds allowed maximum for type "
                             + s7Field.getDataType().name() + " (max " + maxLength + ")");
@@ -405,40 +417,37 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 stringValues.add(stringValue);
             }
             // All other types just translate to max one String character.
-            else if(value instanceof Byte) {
+            else if (value instanceof Byte) {
                 Byte byteValue = (Byte) value;
                 byte[] stringBytes = new byte[]{byteValue};
-                if(encoding16Bit) {
+                if (encoding16Bit) {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-16")));
                 } else {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-8")));
                 }
-            }
-            else if(value instanceof Short) {
+            } else if (value instanceof Short) {
                 Short shortValue = (Short) value;
                 byte[] stringBytes = new byte[2];
                 stringBytes[0] = (byte) (shortValue >> 8);
                 stringBytes[1] = (byte) (shortValue & 0xFF);
-                if(encoding16Bit) {
+                if (encoding16Bit) {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-16")));
                 } else {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-8")));
                 }
-            }
-            else if(value instanceof Integer) {
+            } else if (value instanceof Integer) {
                 Integer integerValue = (Integer) value;
                 byte[] stringBytes = new byte[4];
                 stringBytes[0] = (byte) ((integerValue >> 24) & 0xFF);
                 stringBytes[1] = (byte) ((integerValue >> 16) & 0xFF);
                 stringBytes[2] = (byte) ((integerValue >> 8) & 0xFF);
                 stringBytes[3] = (byte) (integerValue & 0xFF);
-                if(encoding16Bit) {
+                if (encoding16Bit) {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-16")));
                 } else {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-8")));
                 }
-            }
-            else if(value instanceof Long) {
+            } else if (value instanceof Long) {
                 Long longValue = (Long) value;
                 byte[] stringBytes = new byte[8];
                 stringBytes[0] = (byte) ((longValue >> 56) & 0xFF);
@@ -449,13 +458,12 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 stringBytes[5] = (byte) ((longValue >> 16) & 0xFF);
                 stringBytes[6] = (byte) ((longValue >> 8) & 0xFF);
                 stringBytes[7] = (byte) (longValue & 0xFF);
-                if(encoding16Bit) {
+                if (encoding16Bit) {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-16")));
                 } else {
                     stringValues.add(new String(stringBytes, Charset.forName("UTF-8")));
                 }
-            }
-            else {
+            } else {
                 throw new IllegalArgumentException(
                     "Value of type " + value.getClass().getName() +
                         " is not assignable 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 5953da6..839c89c 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
@@ -25,6 +25,7 @@ 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.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -34,7 +35,7 @@ public class TestFieldHandler implements PlcFieldHandler {
 
     @Override
     public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
-        if(TestField.matches(fieldQuery)) {
+        if (TestField.matches(fieldQuery)) {
             return TestField.of(fieldQuery);
         }
         throw new PlcInvalidFieldException(fieldQuery);
@@ -43,7 +44,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeBoolean(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Boolean.class) {
+        if (testField.getDataType() == Boolean.class) {
             return new DefaultBooleanFieldItem((Boolean[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -52,7 +53,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeByte(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Byte.class) {
+        if (testField.getDataType() == Byte.class) {
             return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Byte) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -61,7 +62,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeShort(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Short.class) {
+        if (testField.getDataType() == Short.class) {
             return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Short) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -70,16 +71,25 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeInteger(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Integer.class) {
+        if (testField.getDataType() == Integer.class) {
             return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Integer) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
 
     @Override
+    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+        TestField testField = (TestField) field;
+        if (testField.getDataType() == BigInteger.class) {
+            return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> ((BigInteger) x).longValue()).toArray(Long[]::new));
+        }
+        throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
+    }
+
+    @Override
     public FieldItem encodeLong(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Long.class) {
+        if (testField.getDataType() == Long.class) {
             return new DefaultIntegerFieldItem((Long[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -88,7 +98,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeFloat(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Float.class) {
+        if (testField.getDataType() == Float.class) {
             return new DefaultFloatingPointFieldItem((Double[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -97,7 +107,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDouble(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == Double.class) {
+        if (testField.getDataType() == Double.class) {
             return new DefaultFloatingPointFieldItem((Double[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -106,7 +116,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeString(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == String.class) {
+        if (testField.getDataType() == String.class) {
             return new DefaultStringFieldItem((String[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -115,7 +125,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == LocalTime.class) {
+        if (testField.getDataType() == LocalTime.class) {
             return new DefaultTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -124,7 +134,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDate(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == LocalDate.class) {
+        if (testField.getDataType() == LocalDate.class) {
             return new DefaultTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
@@ -133,7 +143,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDateTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
-        if(testField.getDataType() == LocalDateTime.class) {
+        if (testField.getDataType() == LocalDateTime.class) {
             return new DefaultTimeFieldItem((LocalDateTime[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());