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 2021/10/19 20:47:43 UTC

[plc4x] branch feature/mspec-ng updated: - Implemented the reading of padding fields

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

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


The following commit(s) were added to refs/heads/feature/mspec-ng by this push:
     new c1255a4  - Implemented the reading of padding fields
c1255a4 is described below

commit c1255a4b7abd2b46fddb48d45ff2198c1acc94ea
Author: cdutz <ch...@c-ware.de>
AuthorDate: Tue Oct 19 22:47:33 2021 +0200

    - Implemented the reading of padding fields
---
 .../resources/templates/java/io-template.java.ftlh | 13 +++-------
 .../spi/codegen/fields/FieldReaderFactory.java     |  4 +++
 .../spi/codegen/fields/FieldReaderPadding.java     | 19 +++++++++++++-
 .../plc4x/java/spi/codegen/io/DataReader.java      |  5 ++++
 .../spi/codegen/io/DataReaderComplexDefault.java   | 11 ++++++++
 .../java/spi/codegen/io/DataReaderEnumDefault.java | 11 ++++++++
 ...edBigInteger.java => DataReaderSimpleBase.java} | 27 +++++++++++---------
 .../spi/codegen/io/DataReaderSimpleBigDecimal.java | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleBoolean.java    | 26 ++-----------------
 .../java/spi/codegen/io/DataReaderSimpleByte.java  | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleByteArray.java  | 27 ++------------------
 .../spi/codegen/io/DataReaderSimpleDouble.java     | 29 ++++------------------
 .../java/spi/codegen/io/DataReaderSimpleFloat.java | 29 ++++------------------
 .../io/DataReaderSimpleSignedBigInteger.java       | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleSignedByte.java | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleSignedInt.java  | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleSignedLong.java | 29 ++++------------------
 .../codegen/io/DataReaderSimpleSignedShort.java    | 29 ++++------------------
 .../spi/codegen/io/DataReaderSimpleString.java     | 26 ++-----------------
 .../io/DataReaderSimpleUnsignedBigInteger.java     | 26 ++-----------------
 .../codegen/io/DataReaderSimpleUnsignedByte.java   | 29 ++++------------------
 .../codegen/io/DataReaderSimpleUnsignedInt.java    | 29 ++++------------------
 .../codegen/io/DataReaderSimpleUnsignedLong.java   | 29 ++++------------------
 .../codegen/io/DataReaderSimpleUnsignedShort.java  | 26 ++-----------------
 .../plc4x/java/spi/codegen/io/DataWriter.java      |  3 ++-
 .../java/spi/codegen/io/DataWriterBigDecimal.java  |  4 ++-
 .../java/spi/codegen/io/DataWriterBoolean.java     |  4 ++-
 .../plc4x/java/spi/codegen/io/DataWriterByte.java  |  4 ++-
 .../java/spi/codegen/io/DataWriterByteArray.java   |  4 ++-
 .../java/spi/codegen/io/DataWriterDouble.java      |  4 ++-
 .../spi/codegen/io/DataWriterSignedBigInteger.java |  4 ++-
 .../java/spi/codegen/io/DataWriterSignedByte.java  |  4 ++-
 .../java/spi/codegen/io/DataWriterSignedInt.java   |  4 ++-
 .../java/spi/codegen/io/DataWriterSignedLong.java  |  4 ++-
 .../java/spi/codegen/io/DataWriterSignedShort.java |  4 ++-
 .../codegen/io/DataWriterUnsignedBigInteger.java   |  4 ++-
 .../spi/codegen/io/DataWriterUnsignedByte.java     |  4 ++-
 .../java/spi/codegen/io/DataWriterUnsignedInt.java |  4 ++-
 .../spi/codegen/io/DataWriterUnsignedLong.java     |  4 ++-
 .../java/spi/generation/ReadBufferXmlBased.java    | 14 +++++------
 40 files changed, 188 insertions(+), 454 deletions(-)

diff --git a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
index 6e24051..01b8ef5 100644
--- a/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/io-template.java.ftlh
@@ -513,18 +513,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#break>
     <#case "padding">
         <#assign paddingField = field.asPaddingField().orElseThrow()>
+        <#assign typedField = field.asTypedField().orElseThrow()>
         <#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
 
-        // Padding Field (padding)
-        {
-            readBuffer.pullContext("padding", WithReaderWriterArgs.WithRenderAsList(true));
-            int _timesPadding = (int) (${helper.toParseExpression(paddingField, paddingField.paddingCondition, parserArguments)});
-            while ((readBuffer.hasMore(${helper.getNumBits(simpleTypeReference)})) && (_timesPadding-- > 0)) {
-                // Just read the padding data and ignore it
-                Object ignore = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "", paddingField)};
-            }
-            readBuffer.closeContext("padding", WithReaderWriterArgs.WithRenderAsList(true));
-        }
+        // ${field.typeName?cap_first} Field (padding)
+        read${field.typeName?cap_first}Field(${helper.getDataReaderCall(typedField.type)}, (int) (${helper.toParseExpression(paddingField, paddingField.paddingCondition, parserArguments)}));
         <#break>
     <#case "reserved">
         <#assign reservedField = field.asReservedField().orElseThrow()>
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderFactory.java
index b483a0a..f81a75d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderFactory.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderFactory.java
@@ -52,6 +52,10 @@ public class FieldReaderFactory {
         return new FieldReaderImplicit<T>().readField(logicalName, dataReader, readerArgs);
     }
 
+    public static <T> void readPaddingField(DataReader<T> dataReader, int timesPadding, WithReaderArgs... readerArgs) throws ParseException {
+        new FieldReaderPadding<T>().readPaddingField(dataReader, timesPadding, readerArgs);
+    }
+
     public static <T> T readReservedField(String logicalName, DataReader<T> dataReader, T expectedValue, WithReaderArgs... readerArgs) throws ParseException {
         return new FieldReaderReserved<T>().readReservedField(logicalName, dataReader, expectedValue, readerArgs);
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPadding.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPadding.java
index 0add5c9..c72d4b5 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPadding.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldReaderPadding.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.spi.codegen.fields;
 import org.apache.plc4x.java.spi.codegen.io.DataReader;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
+import org.apache.plc4x.java.spi.generation.WithReaderWriterArgs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,7 +31,23 @@ public class FieldReaderPadding<T> implements FieldReader<T> {
 
     @Override
     public T readField(String logicalName, DataReader<T> dataReader, WithReaderArgs... readerArgs) throws ParseException {
-        return switchByteOrderIfNecessary(() -> dataReader.read(logicalName, readerArgs), dataReader, extractByteOder(readerArgs).orElse(null));
+        throw new IllegalStateException("not possible with padding field");
+    }
+
+    public void readPaddingField(DataReader<T> dataReader, int timesPadding, WithReaderArgs... readerArgs) {
+        dataReader.pullContext("padding", WithReaderWriterArgs.WithRenderAsList(true));
+        while (timesPadding-- > 0) {
+            // Just read the padding data and ignore it
+            try {
+                dataReader.read("value", readerArgs);
+            } catch (Exception e) {
+                // Ignore ...
+                // This could simply be that we're out of data to read for padding.
+                // In protocols like the S7 protocol, this can happen if this is the
+                // last field item, then the packet might end here.
+            }
+        }
+        dataReader.closeContext("padding", WithReaderWriterArgs.WithRenderAsList(true));
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReader.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReader.java
index b3f2ceb..aa3b482 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReader.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReader.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
 public interface DataReader<T> {
+
     T read(String logicalName, WithReaderArgs... readerArgs) throws ParseException;
 
     int getPos();
@@ -32,4 +33,8 @@ public interface DataReader<T> {
     ByteOrder getByteOrder();
 
     void setByteOrder(ByteOrder byteOrder);
+
+    void pullContext(String logicalName, WithReaderArgs... readerArgs);
+    void closeContext(String logicalName, WithReaderArgs... readerArgs);
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderComplexDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderComplexDefault.java
index 00d2016..91944f7 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderComplexDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderComplexDefault.java
@@ -67,5 +67,16 @@ public class DataReaderComplexDefault<T> implements DataReaderComplex<T> {
         readBuffer.closeContext(logicalName,readerArgs);
         return t;
     }
+
+    @Override
+    public void pullContext(String logicalName, WithReaderArgs... readerArgs) {
+        readBuffer.pullContext(logicalName, readerArgs);
+    }
+
+    @Override
+    public void closeContext(String logicalName, WithReaderArgs... readerArgs) {
+        readBuffer.closeContext(logicalName, readerArgs);
+    }
+
 }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
index 0834c96..fc7b398 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderEnumDefault.java
@@ -64,4 +64,15 @@ public class DataReaderEnumDefault<T, I> implements DataReaderEnum<T> {
         I rawValue = (I) dataReader.read(logicalName, readerArgs);
         return enumResolver.apply(rawValue);
     }
+
+    @Override
+    public void pullContext(String logicalName, WithReaderArgs... readerArgs) {
+        dataReader.pullContext(logicalName, readerArgs);
+    }
+
+    @Override
+    public void closeContext(String logicalName, WithReaderArgs... readerArgs) {
+        dataReader.closeContext(logicalName, readerArgs);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBase.java
similarity index 74%
copy from plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBase.java
index f51b89d..dfe1c6e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBase.java
@@ -19,27 +19,19 @@
 package org.apache.plc4x.java.spi.codegen.io;
 
 import org.apache.plc4x.java.spi.generation.ByteOrder;
-import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-import java.math.BigInteger;
+public abstract class DataReaderSimpleBase<T> implements DataReaderSimple<T> {
 
-public class DataReaderSimpleUnsignedBigInteger implements DataReaderSimple<BigInteger> {
+    protected final ReadBuffer readBuffer;
+    protected final int bitLength;
 
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
-
-    public DataReaderSimpleUnsignedBigInteger(ReadBuffer readBuffer, int bitLength) {
+    public DataReaderSimpleBase(ReadBuffer readBuffer, int bitLength) {
         this.readBuffer = readBuffer;
         this.bitLength = bitLength;
     }
 
-    @Override
-    public BigInteger read(String logicalName, WithReaderArgs... readerArgs) throws ParseException {
-        return readBuffer.readUnsignedBigInteger(logicalName, bitLength, readerArgs);
-    }
-
     public int getPos() {
         return readBuffer.getPos();
     }
@@ -57,4 +49,15 @@ public class DataReaderSimpleUnsignedBigInteger implements DataReaderSimple<BigI
     public void setByteOrder(ByteOrder byteOrder) {
         readBuffer.setByteOrder(byteOrder);
     }
+
+    @Override
+    public void pullContext(String logicalName, WithReaderArgs... readerArgs) {
+        readBuffer.pullContext(logicalName, readerArgs);
+    }
+
+    @Override
+    public void closeContext(String logicalName, WithReaderArgs... readerArgs) {
+        readBuffer.closeContext(logicalName, readerArgs);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBigDecimal.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBigDecimal.java
index ccf3789..d4dab12 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBigDecimal.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBigDecimal.java
@@ -18,18 +18,16 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
 import java.math.BigDecimal;
 
-public class DataReaderSimpleBigDecimal implements DataReaderSimple<BigDecimal> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleBigDecimal extends DataReaderSimpleBase<BigDecimal> {
 
     public DataReaderSimpleBigDecimal(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -37,21 +35,4 @@ public class DataReaderSimpleBigDecimal implements DataReaderSimple<BigDecimal>
         return readBuffer.readBigDecimal(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBoolean.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBoolean.java
index 4d4f9ec..7a573ba 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBoolean.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleBoolean.java
@@ -18,19 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-import java.util.Objects;
-
-public class DataReaderSimpleBoolean implements DataReaderSimple<Boolean> {
-
-    private final ReadBuffer readBuffer;
+public class DataReaderSimpleBoolean extends DataReaderSimpleBase<Boolean> {
 
     public DataReaderSimpleBoolean(ReadBuffer readBuffer) {
-        this.readBuffer = Objects.requireNonNull(readBuffer);
+        super(readBuffer, 1);
     }
 
     @Override
@@ -38,21 +33,4 @@ public class DataReaderSimpleBoolean implements DataReaderSimple<Boolean> {
         return readBuffer.readBit(logicalName, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByte.java
index d5f9b7a..17d9633 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByte.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleByte implements DataReaderSimple<Byte> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleByte extends DataReaderSimpleBase<Byte> {
 
     public DataReaderSimpleByte(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -38,21 +36,4 @@ public class DataReaderSimpleByte implements DataReaderSimple<Byte> {
         return readBuffer.readByte(logicalName, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByteArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByteArray.java
index d3d32b2..32a6e8f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByteArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleByteArray.java
@@ -18,20 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleByteArray implements DataReaderSimple<byte[]> {
-
-    private final ReadBuffer readBuffer;
-
-    private final int bitLength;
+public class DataReaderSimpleByteArray extends DataReaderSimpleBase<byte[]> {
 
     public DataReaderSimpleByteArray(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -42,21 +36,4 @@ public class DataReaderSimpleByteArray implements DataReaderSimple<byte[]> {
         return readBuffer.readByteArray(logicalName, bitLength / 8, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleDouble.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleDouble.java
index 08b52dc..4974d46 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleDouble.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleDouble.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleDouble implements DataReaderSimple<Double> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleDouble extends DataReaderSimpleBase<Double> {
 
     public DataReaderSimpleDouble(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleDouble implements DataReaderSimple<Double> {
         return readBuffer.readDouble(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleFloat.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleFloat.java
index 45576f3..a2daa17 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleFloat.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleFloat.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleFloat implements DataReaderSimple<Float> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleFloat extends DataReaderSimpleBase<Float> {
 
     public DataReaderSimpleFloat(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleFloat implements DataReaderSimple<Float> {
         return readBuffer.readFloat(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedBigInteger.java
index 2d41818..621190f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedBigInteger.java
@@ -18,18 +18,16 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
 import java.math.BigInteger;
 
-public class DataReaderSimpleSignedBigInteger implements DataReaderSimple<BigInteger> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleSignedBigInteger extends DataReaderSimpleBase<BigInteger> {
 
     public DataReaderSimpleSignedBigInteger(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -37,21 +35,4 @@ public class DataReaderSimpleSignedBigInteger implements DataReaderSimple<BigInt
         return readBuffer.readBigInteger(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedByte.java
index 93f8875..8e49da0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedByte.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleSignedByte implements DataReaderSimple<Byte> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleSignedByte extends DataReaderSimpleBase<Byte> {
 
     public DataReaderSimpleSignedByte(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleSignedByte implements DataReaderSimple<Byte> {
         return readBuffer.readSignedByte(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedInt.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedInt.java
index 25a46b6..b49837d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedInt.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedInt.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleSignedInt implements DataReaderSimple<Integer> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleSignedInt extends DataReaderSimpleBase<Integer> {
 
     public DataReaderSimpleSignedInt(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleSignedInt implements DataReaderSimple<Integer> {
         return readBuffer.readInt(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedLong.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedLong.java
index 6992b34..9c69bda 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedLong.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedLong.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleSignedLong implements DataReaderSimple<Long> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleSignedLong extends DataReaderSimpleBase<Long> {
 
     public DataReaderSimpleSignedLong(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleSignedLong implements DataReaderSimple<Long> {
         return readBuffer.readLong(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedShort.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedShort.java
index eecc653..7ad1d45 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedShort.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleSignedShort.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleSignedShort implements DataReaderSimple<Short> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleSignedShort extends DataReaderSimpleBase<Short> {
 
     public DataReaderSimpleSignedShort(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleSignedShort implements DataReaderSimple<Short> {
         return readBuffer.readShort(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleString.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleString.java
index 00ce5a1..6da0941 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleString.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleString.java
@@ -18,19 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleString implements DataReaderSimple<String> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleString extends DataReaderSimpleBase<String> {
 
     public DataReaderSimpleString(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -38,21 +33,4 @@ public class DataReaderSimpleString implements DataReaderSimple<String> {
         return readBuffer.readString(logicalName, bitLength, "UTF-8", readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java
index f51b89d..ad47b86 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedBigInteger.java
@@ -18,21 +18,16 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
 import java.math.BigInteger;
 
-public class DataReaderSimpleUnsignedBigInteger implements DataReaderSimple<BigInteger> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleUnsignedBigInteger extends DataReaderSimpleBase<BigInteger> {
 
     public DataReaderSimpleUnsignedBigInteger(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -40,21 +35,4 @@ public class DataReaderSimpleUnsignedBigInteger implements DataReaderSimple<BigI
         return readBuffer.readUnsignedBigInteger(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedByte.java
index b2ed56d..75930e8 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedByte.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleUnsignedByte implements DataReaderSimple<Byte> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleUnsignedByte extends DataReaderSimpleBase<Byte> {
 
     public DataReaderSimpleUnsignedByte(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleUnsignedByte implements DataReaderSimple<Byte> {
         return readBuffer.readUnsignedByte(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedInt.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedInt.java
index 0d3ce80..d008659 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedInt.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedInt.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleUnsignedInt implements DataReaderSimple<Integer> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleUnsignedInt extends DataReaderSimpleBase<Integer> {
 
     public DataReaderSimpleUnsignedInt(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleUnsignedInt implements DataReaderSimple<Integer> {
         return readBuffer.readUnsignedInt(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedLong.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedLong.java
index efe687a..d36ba98 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedLong.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedLong.java
@@ -18,16 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleUnsignedLong implements DataReaderSimple<Long> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleUnsignedLong extends DataReaderSimpleBase<Long> {
 
     public DataReaderSimpleUnsignedLong(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -35,21 +33,4 @@ public class DataReaderSimpleUnsignedLong implements DataReaderSimple<Long> {
         return readBuffer.readUnsignedLong(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedShort.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedShort.java
index 3643d6a..5708435 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedShort.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataReaderSimpleUnsignedShort.java
@@ -18,19 +18,14 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ByteOrder;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.WithReaderArgs;
 
-public class DataReaderSimpleUnsignedShort implements DataReaderSimple<Short> {
-
-    private final ReadBuffer readBuffer;
-    private final int bitLength;
+public class DataReaderSimpleUnsignedShort extends DataReaderSimpleBase<Short> {
 
     public DataReaderSimpleUnsignedShort(ReadBuffer readBuffer, int bitLength) {
-        this.readBuffer = readBuffer;
-        this.bitLength = bitLength;
+        super(readBuffer, bitLength);
     }
 
     @Override
@@ -38,21 +33,4 @@ public class DataReaderSimpleUnsignedShort implements DataReaderSimple<Short> {
         return readBuffer.readUnsignedShort(logicalName, bitLength, readerArgs);
     }
 
-    public int getPos() {
-        return readBuffer.getPos();
-    }
-
-    public void setPos(int position) {
-        readBuffer.reset(position);
-    }
-
-    @Override
-    public ByteOrder getByteOrder() {
-        return readBuffer.getByteOrder();
-    }
-
-    @Override
-    public void setByteOrder(ByteOrder byteOrder) {
-        readBuffer.setByteOrder(byteOrder);
-    }
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriter.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriter.java
index 19617d7..a291421 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriter.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriter.java
@@ -18,7 +18,8 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
 
 public interface DataWriter<T> {
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBigDecimal.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBigDecimal.java
index da4ef23..fc2247a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBigDecimal.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBigDecimal.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.util.Objects;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBoolean.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBoolean.java
index bff5a7c..b7a6fc5 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBoolean.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterBoolean.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByte.java
index b250e30..dc76577 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByte.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByteArray.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByteArray.java
index 37a60c7..5b318ad 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByteArray.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterByteArray.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterDouble.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterDouble.java
index c201e53..4e89b58 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterDouble.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterDouble.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedBigInteger.java
index 33aee9e..d613b2f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedBigInteger.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigInteger;
 import java.util.Objects;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedByte.java
index 88c2c3f..58a7417 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedByte.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedInt.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedInt.java
index effd5be..c50af7b 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedInt.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedInt.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedLong.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedLong.java
index b0f8bd8..6a323b6 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedLong.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedLong.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedShort.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedShort.java
index 5bc64c1..373499a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedShort.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSignedShort.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedBigInteger.java
index a9ab701..c12c65e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedBigInteger.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigInteger;
 import java.util.Objects;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedByte.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedByte.java
index c386c8e..0735575 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedByte.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedByte.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedInt.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedInt.java
index bbe8c24..2bc3ab3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedInt.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedInt.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedLong.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedLong.java
index 3af0c82..f81aa54 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedLong.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterUnsignedLong.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.util.Objects;
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
index 015f6c5..c08d465 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferXmlBased.java
@@ -171,7 +171,7 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
     }
 
     @Override
-    public BigInteger readBigInteger(String logicalName, int bitLength, WithReaderArgs... readerArgs) throws ParseException {
+    public BigInteger readBigInteger(String logicalName, int bitLength, WithReaderArgs... readerArgs) {
         move(bitLength);
         return new BigInteger(decode(logicalName, rwIntKey, bitLength));
     }
@@ -189,7 +189,7 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
     }
 
     @Override
-    public BigDecimal readBigDecimal(String logicalName, int bitLength, WithReaderArgs... readerArgs) throws ParseException {
+    public BigDecimal readBigDecimal(String logicalName, int bitLength, WithReaderArgs... readerArgs) {
         move(bitLength);
         return new BigDecimal(decode(logicalName, rwFloatKey, bitLength));
     }
@@ -223,7 +223,7 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
             if (xmlEvent.isStartElement()) {
                 return xmlEvent.asStartElement();
             } else if (xmlEvent.isEndElement()) {
-                throw new PlcRuntimeException(String.format("Unexpected End element %s", xmlEvent.asEndElement().getName().getLocalPart()));
+                throw new PlcRuntimeException(String.format("Unexpected End element '%s'", xmlEvent.asEndElement().getName().getLocalPart()));
             }
         }
         throw new PlcRuntimeException("EOF");
@@ -238,7 +238,7 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
                 throw new PlcRuntimeException(e);
             }
             if (xmlEvent.isStartElement()) {
-                throw new PlcRuntimeException(String.format("Unexpected Start element %s", xmlEvent.asStartElement().getName().getLocalPart()));
+                throw new PlcRuntimeException(String.format("Unexpected Start element '%s'", xmlEvent.asStartElement().getName().getLocalPart()));
             } else if (xmlEvent.isEndElement()) {
                 return xmlEvent.asEndElement();
             }
@@ -279,7 +279,7 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
             Attribute attribute = attr.next();
             if (attribute.getName().getLocalPart().equals(rwDataTypeKey)) {
                 if (!attribute.getValue().equals(dataType)) {
-                    throw new PlcRuntimeException(String.format("%s: Unexpected dataType :%s. Want %s", logicalName, attribute.getValue(), dataType));
+                    throw new PlcRuntimeException(String.format("%s: Unexpected dataType '%s'. Want '%s'", logicalName, attribute.getValue(), dataType));
                 }
                 dataTypeValidated = true;
             } else if (attribute.getName().getLocalPart().equals(rwBitLengthKey)) {
@@ -290,10 +290,10 @@ public class ReadBufferXmlBased implements ReadBuffer, BufferCommons {
             }
         }
         if (!dataTypeValidated) {
-            throw new PlcRuntimeException(String.format("%s: required attribute %s missing", logicalName, rwDataTypeKey));
+            throw new PlcRuntimeException(String.format("%s: required attribute '%s' missing", logicalName, rwDataTypeKey));
         }
         if (!bitLengthValidate) {
-            throw new PlcRuntimeException(String.format("%s: required attribute %s missing", logicalName, rwBitLengthKey));
+            throw new PlcRuntimeException(String.format("%s: required attribute '%s' missing", logicalName, rwBitLengthKey));
         }
     }