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