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/11/13 16:49:00 UTC

[plc4x] branch feature/mspec-ng updated: - Finshed merging the serialize code into the pojos, finished refactoring the code for serialzing simple 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 a16e633  - Finshed merging the serialize code into the pojos, finished refactoring the code for serialzing simple fields
a16e633 is described below

commit a16e633ff188d21f5a36caf0c99913e834d186a5
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Nov 13 17:48:43 2021 +0100

    - Finshed merging the serialize code into the pojos, finished refactoring the code for serialzing simple fields
---
 .../language/java/JavaLanguageTemplateHelper.java  |  4 +-
 .../templates/java/pojo-template.java.ftlh         |  4 +-
 .../protocol/abeth/AbEthParserSerializerTest.java  |  2 +-
 .../ads/AdsDiscoverySerializerParserTest.java      |  2 +-
 .../org/apache/plc4x/protocol/ads/AdsDriverIT.java |  2 +-
 .../protocol/ads/AdsSerializerParserTest.java      |  2 +-
 .../java/eip/readwrite/EIPDriverTestsuite.java     |  2 +-
 .../eip/readwrite/EIPParserSerializerTest.java     |  2 +-
 .../readwrite/FirmataParserSerializerTest.java     |  2 +-
 .../knxnetip/KnxNetIpParserSerializerTest.java     |  2 +-
 .../apache/plc4x/java/modbus/ModbusDriverIT.java   |  2 +-
 .../java/modbus/ModbusParserSerializerTest.java    |  2 +-
 plc4j/drivers/pom.xml                              |  4 +-
 .../apache/plc4x/java/s7/readwrite/S7DriverIT.java |  2 +-
 .../java/s7/readwrite/S7ParserSerializerTest.java  |  2 +-
 .../plc4x/java/s7/readwrite/issues/PLC4X272.java   |  2 +-
 ...ieldWriterFactory.java => FieldWriterEnum.java} | 17 +++++---
 .../spi/codegen/fields/FieldWriterFactory.java     |  4 ++
 .../spi/codegen/io/DataReaderComplexDefault.java   |  6 ++-
 .../spi/codegen/io/DataWriterComplexDefault.java   |  8 ++++
 .../java/spi/codegen/io/DataWriterEnumDefault.java | 18 +++++----
 .../spi/codegen/io/DataWriterSimpleString.java     |  3 +-
 .../plc4x/java/spi/generation/MessageOutput.java   |  2 +-
 .../handlers/IncomingPlcMessageHandler.java        |  8 ++--
 .../plc4x/test/migration/MessageResolver.java      | 46 ++++++++++++----------
 .../migration/MessageValidatorAndMigrator.java     | 24 +++++------
 .../ParserSerializerTestsuiteRunner.java           | 13 +++---
 27 files changed, 106 insertions(+), 81 deletions(-)

diff --git a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index 26554dc..9ea307d 100644
--- a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -432,11 +432,11 @@ public class JavaLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
     }
 
     public String getDataWriterCall(TypeReference typeReference, String fieldName) {
-        String resolverMethod = "enumForValue";
+        String resolverMethod = "getValue";
         if (isEnumTypeReference(typeReference)) {
             final String languageTypeName = getLanguageTypeNameForTypeReference(typeReference);
             final SimpleTypeReference enumBaseTypeReference = getEnumBaseTypeReference(typeReference);
-            return "new DataWriterEnumDefault<>(" + languageTypeName + "::" + resolverMethod + ", " + getDataWriterCall(enumBaseTypeReference, fieldName) + ")";
+            return "new DataWriterEnumDefault<>(" + languageTypeName + "::" + resolverMethod + ", " + languageTypeName + "::name, " + getDataWriterCall(enumBaseTypeReference, fieldName) + ")";
         } else if (typeReference.isSimpleTypeReference()) {
             SimpleTypeReference simpleTypeReference = typeReference.asSimpleTypeReference().orElseThrow(IllegalStateException::new);
             return getDataWriterCall(simpleTypeReference, fieldName);
diff --git a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
index bbee99f..b7c0615 100644
--- a/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
@@ -284,9 +284,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                         <#assign optionalField = field.asOptionalField().orElseThrow()>
 
                         // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
-                        ${helper.getLanguageTypeNameForField(field)} ${optionalField.name} = null;
                         if(${optionalField.name} != null) {
-                        ${optionalField.name} = (${helper.getLanguageTypeNameForField(field)}) ${optionalField.name};
                         <#if optionalField.type.isSimpleTypeReference()>
                             <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
                             ${helper.getWriteBufferWriteMethodCall(optionalField.name, simpleTypeReference, "(" + optionalField.name + ")", optionalField)};
@@ -330,7 +328,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                         <#assign namedField = field.asNamedField().orElseThrow()>
 
                         // Simple Field (${namedField.name})
-                        writeSimpleField("${namedField.name}", ${simpleField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});
+                        <#if helper.isEnumTypeReference(typedField.type)>writeEnumField("${namedField.name}", "${helper.getLanguageTypeNameForField(field)}", ${simpleField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});<#else>writeSimpleField("${namedField.name}", ${simpleField.name}, ${helper.getDataWriterCall(typedField.type, namedField.name)});</#if>
                         <#break>
                     <#case "switch">
                         <#assign switchField = field.asSwitchField().orElseThrow()>
diff --git a/plc4j/drivers/ab-eth/src/test/java/org/apache/plc4x/protocol/abeth/AbEthParserSerializerTest.java b/plc4j/drivers/ab-eth/src/test/java/org/apache/plc4x/protocol/abeth/AbEthParserSerializerTest.java
index e3d9803..7eb4adb 100644
--- a/plc4j/drivers/ab-eth/src/test/java/org/apache/plc4x/protocol/abeth/AbEthParserSerializerTest.java
+++ b/plc4j/drivers/ab-eth/src/test/java/org/apache/plc4x/protocol/abeth/AbEthParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class AbEthParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public AbEthParserSerializerTest() {
-        super("/protocols/abeth/ParserSerializerTestsuite.xml", true);
+        super("/protocols/abeth/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
index 9b842cd..9260353 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class AdsDiscoverySerializerParserTest extends ParserSerializerTestsuiteRunner {
 
     public AdsDiscoverySerializerParserTest() {
-        super("/protocols/ads/AdsDiscoverySerializerTest.xml", true);
+        super("/protocols/ads/AdsDiscoverySerializerTest.xml");
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
index 2db71b5..4caa770 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 public class AdsDriverIT extends DriverTestsuiteRunner {
 
     public AdsDriverIT() {
-        super("/protocols/ads/DriverTestsuite.xml", true);
+        super("/protocols/ads/DriverTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsSerializerParserTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsSerializerParserTest.java
index 69f641e..3dc56b4 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsSerializerParserTest.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsSerializerParserTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class AdsSerializerParserTest extends ParserSerializerTestsuiteRunner {
 
     public AdsSerializerParserTest() {
-        super("/protocols/ads/ParserSerializerTestsuite.xml", true);
+        super("/protocols/ads/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
index 94ee7c2..1933c78 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 public class EIPDriverTestsuite extends DriverTestsuiteRunner {
 
     public EIPDriverTestsuite() {
-        super("/protocols/eip/DriverTestsuite.xml", true);
+        super("/protocols/eip/DriverTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerTest.java
index a6a28d5..cad00cf 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class EIPParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public EIPParserSerializerTest() {
-        super("/protocols/eip/ParserSerializerTestsuite.xml", true);
+        super("/protocols/eip/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/firmata/src/test/java/org/apache/plc4x/java/firmata/readwrite/FirmataParserSerializerTest.java b/plc4j/drivers/firmata/src/test/java/org/apache/plc4x/java/firmata/readwrite/FirmataParserSerializerTest.java
index b3f44c5..33e8ed4 100644
--- a/plc4j/drivers/firmata/src/test/java/org/apache/plc4x/java/firmata/readwrite/FirmataParserSerializerTest.java
+++ b/plc4j/drivers/firmata/src/test/java/org/apache/plc4x/java/firmata/readwrite/FirmataParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class FirmataParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public FirmataParserSerializerTest() {
-        super("/protocols/firmata/ParserSerializerTestsuite.xml", true);
+        super("/protocols/firmata/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/KnxNetIpParserSerializerTest.java b/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/KnxNetIpParserSerializerTest.java
index 810889e..a6326ab 100644
--- a/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/KnxNetIpParserSerializerTest.java
+++ b/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/KnxNetIpParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class KnxNetIpParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public KnxNetIpParserSerializerTest() {
-        super("/protocols/knxnetip/ParserSerializerTestsuite.xml", true);
+        super("/protocols/knxnetip/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
index 765a920..9ee2734 100644
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusDriverIT.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 public class ModbusDriverIT extends DriverTestsuiteRunner {
 
     public ModbusDriverIT() {
-        super("/protocols/modbus/DriverTestsuite.xml", true);
+        super("/protocols/modbus/DriverTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusParserSerializerTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusParserSerializerTest.java
index 598d928..d31ffa3 100644
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusParserSerializerTest.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class ModbusParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public ModbusParserSerializerTest() {
-        super("/protocols/modbus/ParserSerializerTestsuite.xml", true);
+        super("/protocols/modbus/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml
index df9ca94..42d7e3a 100644
--- a/plc4j/drivers/pom.xml
+++ b/plc4j/drivers/pom.xml
@@ -36,8 +36,8 @@
   <modules>
     <module>ab-eth</module>
     <module>ads</module>
-    <module>can</module>
-    <module>canopen</module>
+    <!--module>can</module>
+    <module>canopen</module-->
     <module>eip</module>
     <module>firmata</module>
     <module>knxnetip</module>
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7DriverIT.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7DriverIT.java
index 31eb37e..5ab15d8 100644
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7DriverIT.java
+++ b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7DriverIT.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 public class S7DriverIT extends DriverTestsuiteRunner {
 
     public S7DriverIT() {
-        super("/protocols/s7/DriverTestsuite.xml", true);
+        super("/protocols/s7/DriverTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7ParserSerializerTest.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7ParserSerializerTest.java
index 49b6c66..af94a56 100644
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7ParserSerializerTest.java
+++ b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/S7ParserSerializerTest.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
 public class S7ParserSerializerTest extends ParserSerializerTestsuiteRunner {
 
     public S7ParserSerializerTest() {
-        super("/protocols/s7/ParserSerializerTestsuite.xml", true);
+        super("/protocols/s7/ParserSerializerTestsuite.xml");
     }
 
 }
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/issues/PLC4X272.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/issues/PLC4X272.java
index f753794..3c03ca9 100644
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/issues/PLC4X272.java
+++ b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/issues/PLC4X272.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 public class PLC4X272 extends DriverTestsuiteRunner {
 
     public PLC4X272() {
-        super("/tests/PLC4X-272.xml", true);
+        super("/tests/PLC4X-272.xml");
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
similarity index 54%
copy from plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
index c6a51c5..73e75e1 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterEnum.java
@@ -18,14 +18,21 @@
  */
 package org.apache.plc4x.java.spi.codegen.fields;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.plc4x.java.spi.codegen.io.DataWriter;
-import org.apache.plc4x.java.spi.generation.SerializationException;
-import org.apache.plc4x.java.spi.generation.WithWriterArgs;
+import org.apache.plc4x.java.spi.generation.*;
 
-public class FieldWriterFactory {
+public class FieldWriterEnum<T> implements FieldWriter<T> {
 
-    public static <T> void writeSimpleField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
-        new FieldWriterSimple<T>().writeField(logicalName, value, dataWriter, writerArgs);
+    @Override
+    public void writeField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
+        throw new NotImplementedException();
+    }
+
+    public void writeField(String logicalName, String innerName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
+        dataWriter.pushContext(logicalName);
+        switchSerializeByteOrderIfNecessary(() -> dataWriter.write(innerName, value, writerArgs), dataWriter, extractByteOder(writerArgs).orElse(null));
+        dataWriter.popContext(logicalName);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java
index c6a51c5..3cb8d2f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/fields/FieldWriterFactory.java
@@ -24,6 +24,10 @@ import org.apache.plc4x.java.spi.generation.WithWriterArgs;
 
 public class FieldWriterFactory {
 
+    public static <T> void writeEnumField(String logicalName, String innerName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
+        new FieldWriterEnum<T>().writeField(logicalName, innerName, value, dataWriter, writerArgs);
+    }
+
     public static <T> void writeSimpleField(String logicalName, T value, DataWriter<T> dataWriter, WithWriterArgs... writerArgs) throws SerializationException {
         new FieldWriterSimple<T>().writeField(logicalName, value, dataWriter, writerArgs);
     }
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 cce0239..aded4a6 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
@@ -66,11 +66,13 @@ public class DataReaderComplexDefault<T> implements DataReaderComplex<T> {
     public T read(String logicalName, ComplexTypeSupplier<T> complexSupplier, WithReaderArgs... readerArgs) throws ParseException {
         // TODO: it might be even better if we default to value like in other places... on the other hand a complex type has always a proper logical name so this might be fine like that
         boolean hasLogicalName = StringUtils.isNotBlank(logicalName);
-        if (hasLogicalName)
+        if (hasLogicalName) {
             readBuffer.pullContext(logicalName, readerArgs);
+        }
         final T t = complexSupplier.get();
-        if (hasLogicalName)
+        if (hasLogicalName) {
             readBuffer.closeContext(logicalName, readerArgs);
+        }
         return t;
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
index 3bb1f46..44dc704 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterComplexDefault.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.plc4x.java.spi.generation.*;
 
 public class DataWriterComplexDefault<T extends Message> implements DataWriterComplex<T> {
@@ -50,7 +51,14 @@ public class DataWriterComplexDefault<T extends Message> implements DataWriterCo
 
     @Override
     public T write(String logicalName, T value, WithWriterArgs... writerArgs) throws SerializationException {
+        boolean hasLogicalName = StringUtils.isNotBlank(logicalName);
+        if (hasLogicalName) {
+            writeBuffer.pushContext(logicalName);
+        }
         value.serialize(writeBuffer);
+        if (hasLogicalName) {
+            writeBuffer.popContext(logicalName);
+        }
         return value;
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
index 26e6a59..d27f960 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterEnumDefault.java
@@ -24,12 +24,14 @@ import java.util.function.Function;
 
 public class DataWriterEnumDefault<T, I> implements DataWriterEnum<T> {
 
-    private final Function<I, T> enumResolver;
+    private final Function<T, I> enumSerializer;
+    private final Function<T, String> enumNamer;
     private final DataWriter<I> dataWriter;
 
-    public DataWriterEnumDefault(Function<I, T> enumResolver, DataWriter<I> dataWriter) {
-        this.enumResolver = enumResolver;
+    public DataWriterEnumDefault(Function<T, I> enumSerializer, Function<T, String> enumNamer, DataWriter<I> dataWriter) {
+        this.enumSerializer = enumSerializer;
         this.dataWriter = dataWriter;
+        this.enumNamer = enumNamer;
     }
 
     @Override
@@ -44,13 +46,13 @@ public class DataWriterEnumDefault<T, I> implements DataWriterEnum<T> {
 
     @Override
     public T write(String logicalName, T value, WithWriterArgs... writerArgs) throws SerializationException {
-        throw new SerializationException("Unsupported");
+        return write(logicalName, value, enumSerializer, enumNamer, dataWriter, writerArgs);
     }
 
-    public T write(String logicalName, T value, Function<I, T> enumResolver, DataWriter<T> rawWriter, WithWriterArgs... writerArgs) throws SerializationException {
-        final T enumValue = value;//enumResolver.apply(value);
-        rawWriter.write(logicalName, enumValue, writerArgs);
-        return null;
+    public T write(String logicalName, T value, Function<T, I> enumSerializer, Function<T, String> enumNamer, DataWriter<I> rawWriter, WithWriterArgs... writerArgs) throws SerializationException {
+        final I rawValue = enumSerializer.apply(value);
+        rawWriter.write(logicalName, rawValue, WithReaderWriterArgs.WithAdditionalStringRepresentation(enumNamer.apply(value)));
+        return value;
     }
 
     @Override
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
index 919d906..b9edc83 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/codegen/io/DataWriterSimpleString.java
@@ -18,7 +18,6 @@
  */
 package org.apache.plc4x.java.spi.codegen.io;
 
-import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WithWriterArgs;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -31,7 +30,7 @@ public class DataWriterSimpleString extends DataWriterSimpleBase<String> {
 
     @Override
     public String write(String logicalName, String value, WithWriterArgs... writerArgs) throws SerializationException {
-        writeBuffer.writeString(logicalName, bitLength, value, "UTF-8", writerArgs);
+        writeBuffer.writeString(logicalName, bitLength,"UTF-8", value, writerArgs);
         return value;
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
index 741aebe..22c9e70 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
@@ -20,6 +20,6 @@ package org.apache.plc4x.java.spi.generation;
 
 public interface MessageOutput<SERIALIZER_TYPE> {
 
-    void serialize(WriteBuffer io, SERIALIZER_TYPE value, Object... args) throws ParseException;
+    void serialize(WriteBuffer io, SERIALIZER_TYPE value, Object... args) throws SerializationException;
 
 }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
index f8f867e..4a52bca 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
@@ -53,17 +53,17 @@ public class IncomingPlcMessageHandler {
     @SuppressWarnings({"rawtypes", "unchecked"})
     public byte[] getBytesFromXml(Element referenceXml, ByteOrder byteOrder) throws DriverTestsuiteException {
         final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(1024, byteOrder);
-        MessageIO messageIO = MessageResolver.getMessageIO(driverTestsuiteConfiguration.getOptions(), referenceXml.getName());
+        MessageInput messageInput = MessageResolver.getMessageInput(driverTestsuiteConfiguration.getOptions(), referenceXml.getName());
         // Get Message and Validate
-        Message message = MessageValidatorAndMigrator.validateInboundMessageAndGet(messageIO, referenceXml, parserArguments);
+        Message message = MessageValidatorAndMigrator.validateInboundMessageAndGet(messageInput, referenceXml, parserArguments);
 
         // Get Bytes
         try {
-            messageIO.serialize(writeBuffer, message);
+            message.serialize(writeBuffer);
             final byte[] data = new byte[message.getLengthInBytes()];
             System.arraycopy(writeBuffer.getData(), 0, data, 0, writeBuffer.getPos());
             return data;
-        } catch (ParseException e) {
+        } catch (SerializationException e) {
             throw new DriverTestsuiteException("Error serializing message", e);
         }
     }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
index 42422d7..aa9b00a 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
@@ -20,10 +20,7 @@ package org.apache.plc4x.test.migration;
 
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.spi.generation.MessageIO;
-import org.apache.plc4x.java.spi.generation.ParseException;
-import org.apache.plc4x.java.spi.generation.ReadBuffer;
-import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.generation.*;
 import org.apache.plc4x.test.driver.exceptions.DriverTestsuiteException;
 import org.apache.plc4x.test.parserserializer.exceptions.ParserSerializerTestsuiteException;
 import org.slf4j.Logger;
@@ -49,19 +46,19 @@ public class MessageResolver {
      * @throws DriverTestsuiteException if a MessageIO couldn't be found.
      */
     @SuppressWarnings("rawtypes")
-    public static MessageIO getMessageIO(Map<String, String> options, String name) throws DriverTestsuiteException {
+    public static MessageInput getMessageInput(Map<String, String> options, String name) throws DriverTestsuiteException {
         try {
-            return MessageResolver.getMessageIOType(options, name).getMessageIo().newInstance();
+            return MessageResolver.getMessageIOType(options, name).getMessageInput().newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
             throw new DriverTestsuiteException(e);
         }
     }
 
-    public static MessageIO getMessageIOStaticLinked(Map<String, String> options, String typeName) throws ParserSerializerTestsuiteException {
+    public static MessageInput<Message> getMessageIOStaticLinked(Map<String, String> options, String typeName) throws ParserSerializerTestsuiteException {
         try {
             TypePair typePair = getMessageIOType(options, typeName);
             Class<?> ioRootClass = typePair.getType();
-            Class<?> ioClass = typePair.getMessageIo();
+            Class<?> ioClass = typePair.getMessageInput();
             Method staticParseMethod = null;
             Method staticSerializeMethod = null;
             final List<Class<?>> parameterTypes = new LinkedList<>();
@@ -81,7 +78,7 @@ public class MessageResolver {
                     staticSerializeMethod = method;
                 }
             }
-            if ((staticParseMethod == null) || (staticSerializeMethod == null)) {
+            if (staticParseMethod == null) {
                 throw new ParserSerializerTestsuiteException(
                     "Unable to instantiate IO component. Missing static parse or serialize methods.");
             }
@@ -126,11 +123,18 @@ public class MessageResolver {
                 }
 
                 @Override
-                public void serialize(WriteBuffer io, Object value, Object... args) throws ParseException {
+                public void serialize(WriteBuffer io, Object value, Object... args) throws SerializationException {
                     try {
-                        serializeMethod.invoke(null, io, value);
-                    } catch (IllegalAccessException | InvocationTargetException e) {
-                        throw new ParseException("error serializing", e);
+                        if(serializeMethod != null) {
+                            serializeMethod.invoke(null, io, value);
+                        } else if(value instanceof Message) {
+                            Message message = (Message) value;
+                            message.serialize(io);
+                        } else {
+                            throw new SerializationException("Error finding a serializer for this message");
+                        }
+                    } catch (IllegalAccessException | InvocationTargetException | SerializationException e) {
+                        throw new SerializationException("Error serializing", e);
                     }
                 }
             };
@@ -170,24 +174,24 @@ public class MessageResolver {
         String ioClassName = driverPackage + ".io." + typeName + "IO";
         // make sure both type and it's IO are present
         return new TypePair(
-            Class.forName(ioRootClassName),
-            (Class<? extends MessageIO<?, ?>>) Class.forName(ioClassName)
+            (Class<? extends Message>) Class.forName(ioRootClassName),
+            (Class<? extends MessageInput<?>>) Class.forName(ioClassName)
         );
     }
 
     static class TypePair {
-        private final Class<?> type;
-        private final Class<? extends MessageIO<?, ?>> messageIo;
+        private final Class<? extends Message> type;
+        private final Class<? extends MessageInput<?>> messageInput;
 
-        TypePair(Class<?> type, Class<? extends MessageIO<?, ?>> messageIo) {
+        TypePair(Class<? extends Message> type, Class<? extends MessageInput<?>> messageInput) {
             this.type = type;
-            this.messageIo = messageIo;
+            this.messageInput = messageInput;
         }
         Class<?> getType() {
             return type;
         }
-        Class<? extends MessageIO<?, ?>> getMessageIo() {
-            return messageIo;
+        Class<? extends MessageInput<?>> getMessageInput() {
+            return messageInput;
         }
     }
 
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
index f42c506..ffb6675 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
@@ -64,15 +64,15 @@ public class MessageValidatorAndMigrator {
      */
     @SuppressWarnings({"rawtypes"})
     public static void validateOutboundMessageAndMigrate(String testCaseName, Map<String, String> options, Element referenceXml, List<String> parserArguments, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
-        MessageIO messageIO = MessageResolver.getMessageIO(options, referenceXml.getName());
-        validateOutboundMessageAndMigrate(testCaseName, messageIO, referenceXml, parserArguments, data, byteOrder, autoMigrate, siteURI);
+        MessageInput<Message> messageInput = MessageResolver.getMessageInput(options, referenceXml.getName());
+        validateOutboundMessageAndMigrate(testCaseName, messageInput, referenceXml, parserArguments, data, byteOrder, autoMigrate, siteURI);
     }
 
     /**
      * Validates a outbound message and migrates it to the expectation if the parameter {@code autoMigrate} is set to true
      *
      * @param testCaseName    name of the testcase
-     * @param messageIO       the pre-constructed MessageIO
+     * @param messageInput    the pre-constructed MessageInput
      * @param referenceXml    the xml we expect the outbound message to be
      * @param parserArguments the parser arguments to create an instance of the message
      * @param data            the bytes of the message
@@ -82,16 +82,16 @@ public class MessageValidatorAndMigrator {
      * @throws DriverTestsuiteException if something goes wrong
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static void validateOutboundMessageAndMigrate(String testCaseName, MessageIO messageIO, Element referenceXml, List<String> parserArguments, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
+    public static void validateOutboundMessageAndMigrate(String testCaseName, MessageInput<Message> messageInput, Element referenceXml, List<String> parserArguments, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
         final ReadBufferByteBased readBuffer = new ReadBufferByteBased(data, byteOrder);
 
         try {
-            final Object parsedOutput = messageIO.parse(readBuffer, parserArguments.toArray());
+            final Message parsedOutput = messageInput.parse(readBuffer, parserArguments.toArray());
             final String referenceXmlString = referenceXml.asXML();
             try {
                 // First try to use the native xml writer
                 WriteBufferXmlBased writeBufferXmlBased = new WriteBufferXmlBased();
-                messageIO.serialize(writeBufferXmlBased, parsedOutput);
+                parsedOutput.serialize(writeBufferXmlBased);
                 String xmlString = writeBufferXmlBased.getXmlString();
                 final Diff diff = DiffBuilder.compare(referenceXmlString)
                     .withTest(xmlString).checkForSimilar().ignoreComments().ignoreWhitespace()
@@ -127,7 +127,7 @@ public class MessageValidatorAndMigrator {
                         centeredTestCaseName));
                     throw new MigrationException(xmlString);
                 }
-            } catch (RuntimeException | ParseException e) {
+            } catch (RuntimeException | SerializationException e) {
                 if (!(e instanceof MigrationException)) {
                     LOGGER.error("Error in serializer", e);
                 }
@@ -159,6 +159,8 @@ public class MessageValidatorAndMigrator {
                         throw new RuntimeException(ioException);
                     }
                     LOGGER.info("Done migrating {}", path);
+                } else {
+                    throw new RuntimeException("Output doesn't match", e);
                 }
             }
         } catch (ParseException e) {
@@ -181,23 +183,23 @@ public class MessageValidatorAndMigrator {
      */
     @SuppressWarnings("rawtypes")
     public static Message validateInboundMessageAndGet(Map<String, String> options, Element referenceXml, List<String> parserArguments) {
-        MessageIO messageIO = MessageResolver.getMessageIO(options, referenceXml.getName());
+        MessageInput<Message> messageIO = MessageResolver.getMessageInput(options, referenceXml.getName());
         return validateInboundMessageAndGet(messageIO, referenceXml, parserArguments);
     }
 
     /**
      * Validates a inbound message and migrates it to the expectation if the parameter {@code autoMigrate} is set to true
      *
-     * @param messageIO       the pre-constructed MessageIO
+     * @param messageInput    the pre-constructed MessageInput
      * @param referenceXml    the xml we expect the outbound messag
      * @param parserArguments the parser arguments to create an instance of the message
      * @return the message if all went well
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static Message validateInboundMessageAndGet(MessageIO messageIO, Element referenceXml, List<String> parserArguments) {
+    public static Message validateInboundMessageAndGet(MessageInput messageInput, Element referenceXml, List<String> parserArguments) {
         final String referenceXmlString = referenceXml.asXML();
         try {
-            return (Message) messageIO.parse(new ReadBufferXmlBased(new ByteArrayInputStream(referenceXmlString.getBytes(StandardCharsets.UTF_8))), parserArguments.toArray(new String[0]));
+            return (Message) messageInput.parse(new ReadBufferXmlBased(new ByteArrayInputStream(referenceXmlString.getBytes(StandardCharsets.UTF_8))), parserArguments.toArray(new String[0]));
         } catch (RuntimeException | ParseException e) {
             throw new DriverTestsuiteException(String.format("Error parsing message from:\n%s", referenceXmlString), e);
         }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
index 6e115d3..7651648 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
@@ -44,7 +44,6 @@ import org.slf4j.LoggerFactory;
 
 import java.util.*;
 
-@SuppressWarnings({"unchecked", "rawtypes"})
 public class ParserSerializerTestsuiteRunner extends XmlTestsuiteLoader {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ParserSerializerTestsuiteRunner.class);
@@ -141,14 +140,14 @@ public class ParserSerializerTestsuiteRunner extends XmlTestsuiteLoader {
         ReadBufferByteBased readBuffer = new ReadBufferByteBased(testcase.getRaw(), testSuite.getByteOrder());
 
         try {
-            MessageIO messageIO = MessageResolver.getMessageIOStaticLinked(
+            MessageInput<Message> messageInput = MessageResolver.getMessageIOStaticLinked(
                 testSuite.getOptions(),
                 testcase.getXml().elements().get(0).getName()
             );
-            Object parsedOutput = messageIO.parse(readBuffer, testcase.getParserArguments().toArray());
+            Message parsedOutput = messageInput.parse(readBuffer, testcase.getParserArguments().toArray());
             MessageValidatorAndMigrator.validateOutboundMessageAndMigrate(
                 testcase.getName(),
-                messageIO,
+                messageInput,
                 testcase.getXml().elements().get(0),
                 testcase.getParserArguments(),
                 testcase.getRaw(),
@@ -157,8 +156,8 @@ public class ParserSerializerTestsuiteRunner extends XmlTestsuiteLoader {
                 suiteUri
             );
 
-            WriteBufferByteBased writeBuffer = new WriteBufferByteBased(((Message) parsedOutput).getLengthInBytes(), testSuite.getByteOrder());
-            messageIO.serialize(writeBuffer, parsedOutput);
+            WriteBufferByteBased writeBuffer = new WriteBufferByteBased(parsedOutput.getLengthInBytes(), testSuite.getByteOrder());
+            parsedOutput.serialize(writeBuffer);
             byte[] data = writeBuffer.getData();
             if (testcase.getRaw().length != data.length) {
                 LOGGER.info("Expected a byte array with a length of " + testcase.getRaw().length +
@@ -176,7 +175,7 @@ public class ParserSerializerTestsuiteRunner extends XmlTestsuiteLoader {
                     Hex.encodeHexString(testcase.getRaw()) + "\nBut Got:  " + Hex.encodeHexString(data) +
                     "\n          " + String.join("", Collections.nCopies(i, "--")) + "^");
             }
-        } catch (ParseException e) {
+        } catch (SerializationException | ParseException e) {
             throw new ParserSerializerTestsuiteException("Unable to parse message", e);
         }
     }