This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 9289c8be4e99e757f46e9e7db4036b8614732795 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Wed Apr 21 16:59:45 2021 +0200 plc4j: json based read and write buffers. Are now 100% compatible to plc4go + Json now additionally prints the string representation for enums --- .../language/java/JavaLanguageTemplateHelper.java | 44 +++++++++++----------- .../resources/templates/java/io-template.java.ftlh | 4 +- plc4j/drivers/s7/src/test/java/S7IoTest.java | 11 ++++-- .../plc4x/java/spi/generation/BufferCommons.java | 17 +++++++++ .../java/spi/generation/ReadBufferJsonBased.java | 7 +++- .../java/spi/generation/WithReaderWriterArgs.java | 8 ++++ .../java/spi/generation/WriteBufferJsonBased.java | 36 ++++++++++-------- 7 files changed, 83 insertions(+), 44 deletions(-) diff --git a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java index fcd6ec2..268e518 100644 --- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java +++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java @@ -22,14 +22,12 @@ package org.apache.plc4x.language.java; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.text.WordUtils; -import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultTypeDefinition; import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.BaseFreemarkerLanguageTemplateHelper; import org.apache.plc4x.plugins.codegenerator.types.definitions.*; import org.apache.plc4x.plugins.codegenerator.types.fields.*; import org.apache.plc4x.plugins.codegenerator.types.references.*; import org.apache.plc4x.plugins.codegenerator.types.terms.*; -import java.util.List; import java.util.Map; import java.util.function.Function; @@ -362,8 +360,8 @@ public class JavaLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe String typeCast = (floatTypeReference.getSizeInBits() <= 32) ? "float" : "double"; String defaultNull = (floatTypeReference.getSizeInBits() <= 32) ? "0.0f" : "0.0"; // TODO: insert logical name - return "((Supplier<" + type + ">) (() -> {" + - "\n return (" + typeCast + ") toFloat(io, \""+logicalName +"\", "+ + return "((Supplier<" + type + ">) (() -> {" + + "\n return (" + typeCast + ") toFloat(io, \"" + logicalName + "\", " + ((floatTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) ? "true" : "false") + ", " + floatTypeReference.getExponent() + ", " + floatTypeReference.getMantissa() + ");" + @@ -380,61 +378,65 @@ public class JavaLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe @Override public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName, TypedField field) { - return getWriteBufferWriteMethodCall("", simpleTypeReference,fieldName,field); + return getWriteBufferWriteMethodCall("", simpleTypeReference, fieldName, field); } - public String getWriteBufferWriteMethodCall(String logicalName, SimpleTypeReference simpleTypeReference, String fieldName, TypedField field) { + public String getWriteBufferWriteMethodCall(String logicalName, SimpleTypeReference simpleTypeReference, String fieldName, TypedField field, String... writerArgs) { + String writerArgsString = ""; + if (writerArgs.length > 0) { + writerArgsString += ", " + StringUtils.join(writerArgs, ", "); + } switch (simpleTypeReference.getBaseType()) { case BIT: { - return "io.writeBit(\""+logicalName+"\", (boolean) " + fieldName + ")"; + return "io.writeBit(\"" + logicalName + "\", (boolean) " + fieldName + "" + writerArgsString + ")"; } case UINT: { IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference; if (integerTypeReference.getSizeInBits() <= 4) { - return "io.writeUnsignedByte(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())"; + return "io.writeUnsignedByte(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 8) { - return "io.writeUnsignedShort(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())"; + return "io.writeUnsignedShort(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 16) { - return "io.writeUnsignedInt(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())"; + return "io.writeUnsignedInt(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 32) { - return "io.writeUnsignedLong(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())"; + return "io.writeUnsignedLong(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue()" + writerArgsString + ")"; } - return "io.writeUnsignedBigInteger(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", (BigInteger) " + fieldName + ")"; + return "io.writeUnsignedBigInteger(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", (BigInteger) " + fieldName + "" + writerArgsString + ")"; } case INT: { IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference; if (integerTypeReference.getSizeInBits() <= 8) { - return "io.writeByte(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())"; + return "io.writeByte(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 16) { - return "io.writeShort(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())"; + return "io.writeShort(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 32) { - return "io.writeInt(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())"; + return "io.writeInt(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue()" + writerArgsString + ")"; } if (integerTypeReference.getSizeInBits() <= 64) { - return "io.writeLong(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())"; + return "io.writeLong(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue()" + writerArgsString + ")"; } - return "io.writeBigInteger(\""+logicalName+"\", " + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + "))"; + return "io.writeBigInteger(\"" + logicalName + "\", " + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + ")" + writerArgsString + ")"; } case FLOAT: case UFLOAT: { FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference; if (floatTypeReference.getSizeInBits() <= 32) { - return "io.writeFloat(\""+logicalName+"\", " + fieldName + "," + floatTypeReference.getExponent() + "," + floatTypeReference.getMantissa() + ")"; + return "io.writeFloat(\"" + logicalName + "\", " + fieldName + "," + floatTypeReference.getExponent() + "," + floatTypeReference.getMantissa() + "" + writerArgsString + ")"; } else if (floatTypeReference.getSizeInBits() <= 64) { - return "io.writeDouble(\""+logicalName+"\", " + fieldName + "," + floatTypeReference.getExponent() + "," + floatTypeReference.getMantissa() + ")"; + return "io.writeDouble(\"" + logicalName + "\", " + fieldName + "," + floatTypeReference.getExponent() + "," + floatTypeReference.getMantissa() + "" + writerArgsString + ")"; } else { throw new RuntimeException("Unsupported float type"); } } case STRING: { StringTypeReference stringTypeReference = (StringTypeReference) simpleTypeReference; - return "io.writeString(\""+logicalName+"\", " + toSerializationExpression(field, stringTypeReference.getLengthExpression(), getThisTypeDefinition().getParserArguments()) + ", \"" + - stringTypeReference.getEncoding() + "\", (String) " + fieldName + ")"; + return "io.writeString(\"" + logicalName + "\", " + toSerializationExpression(field, stringTypeReference.getLengthExpression(), getThisTypeDefinition().getParserArguments()) + ", \"" + + stringTypeReference.getEncoding() + "\", (String) " + fieldName + "" + writerArgsString + ")"; } } return "Hurz"; diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.java.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.java.ftlh index 341503c..86d038f 100644 --- a/build-utils/language-java/src/main/resources/templates/java/io-template.java.ftlh +++ b/build-utils/language-java/src/main/resources/templates/java/io-template.java.ftlh @@ -521,9 +521,9 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO< // Enum field (${enumField.name}) ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${enumField.name?cap_first}(); <#if enumField.fieldName?has_content> - ${helper.getWriteBufferWriteMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "(" + enumField.name + ".get" + enumField.fieldName?cap_first + "())", field)}; + ${helper.getWriteBufferWriteMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "(" + enumField.name + ".get" + enumField.fieldName?cap_first + "())", field, "WithReaderWriterArgs.WithAdditionalStringRepresentation(${enumField.name}.name())")}; <#else> - ${helper.getWriteBufferWriteMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())", field)}; + ${helper.getWriteBufferWriteMethodCall(helper.getTypeDefinitionForTypeReference(enumField.type).name, helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())", field, "WithReaderWriterArgs.WithAdditionalStringRepresentation(${enumField.name}.name())")}; </#if> io.popContext("${enumField.name}"); <#break> diff --git a/plc4j/drivers/s7/src/test/java/S7IoTest.java b/plc4j/drivers/s7/src/test/java/S7IoTest.java index 332db1c..d63bf19 100644 --- a/plc4j/drivers/s7/src/test/java/S7IoTest.java +++ b/plc4j/drivers/s7/src/test/java/S7IoTest.java @@ -156,12 +156,14 @@ public class S7IoTest { " \"returnCode\": {\n" + " \"DataTransportErrorCode\": 255,\n" + " \"DataTransportErrorCode__plc4x_bitLength\": 8,\n" + - " \"DataTransportErrorCode__plc4x_dataType\": \"uint\"\n" + + " \"DataTransportErrorCode__plc4x_dataType\": \"uint\",\n" + + " \"DataTransportErrorCode__plc4x_stringRepresentation\": \"OK\"\n" + " },\n" + " \"transportSize\": {\n" + " \"DataTransportSize\": 3,\n" + " \"DataTransportSize__plc4x_bitLength\": 8,\n" + - " \"DataTransportSize__plc4x_dataType\": \"uint\"\n" + + " \"DataTransportSize__plc4x_dataType\": \"uint\",\n" + + " \"DataTransportSize__plc4x_stringRepresentation\": \"BIT\"\n" + " }\n" + " }\n" + " }\n" + @@ -197,7 +199,8 @@ public class S7IoTest { " \"tpduSize\": {\n" + " \"COTPTpduSize\": 12,\n" + " \"COTPTpduSize__plc4x_bitLength\": 8,\n" + - " \"COTPTpduSize__plc4x_dataType\": \"int\"\n" + + " \"COTPTpduSize__plc4x_dataType\": \"int\",\n" + + " \"COTPTpduSize__plc4x_stringRepresentation\": \"SIZE_4096\"\n" + " }\n" + " },\n" + " \"parameterLength\": 1,\n" + @@ -221,7 +224,7 @@ public class S7IoTest { " \"reserved__plc4x_bitLength\": 8,\n" + " \"reserved__plc4x_dataType\": \"uint\"\n" + " }\n" + - "}\n"; + "}"; TPKTPacket tpktPacket = new TPKTPacket( diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/BufferCommons.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/BufferCommons.java index 6cec58c..adcacef 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/BufferCommons.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/BufferCommons.java @@ -56,4 +56,21 @@ public interface BufferCommons { } return false; } + + default String extractAdditionalStringRepresentation(WithReaderArgs... readerArgs) { + return extractAdditionalStringRepresentation(Stream.of(readerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new)); + } + + default String extractAdditionalStringRepresentation(WithWriterArgs... writerArgs) { + return extractAdditionalStringRepresentation(Stream.of(writerArgs).map(WithReaderWriterArgs.class::cast).toArray(WithReaderWriterArgs[]::new)); + } + + default String extractAdditionalStringRepresentation(WithReaderWriterArgs... readerWriterArgs) { + for (WithReaderWriterArgs arg : readerWriterArgs) { + if (arg instanceof withAdditionalStringRepresentation) { + return ((withAdditionalStringRepresentation) arg).stringRepresentation(); + } + } + return null; + } } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferJsonBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferJsonBased.java index cd8ea37..6069476 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferJsonBased.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ReadBufferJsonBased.java @@ -37,9 +37,14 @@ public class ReadBufferJsonBased implements ReadBuffer { int pos; - boolean doValidateAttr = true; + boolean doValidateAttr; public ReadBufferJsonBased(InputStream is) { + this(is, true); + } + + public ReadBufferJsonBased(InputStream is, boolean doValidateAttr) { + this.doValidateAttr = doValidateAttr; pos = 1; stack = new Stack<>(); // JsonParser here would be overkill as json is by definition not deterministic (key/value) diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WithReaderWriterArgs.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WithReaderWriterArgs.java index 0e6f241..8af1b5c 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WithReaderWriterArgs.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WithReaderWriterArgs.java @@ -23,8 +23,16 @@ public interface WithReaderWriterArgs extends WithReaderArgs, WithWriterArgs { static WithReaderWriterArgs WithRenderAsList(boolean renderAsList) { return (withRenderAsList) () -> renderAsList; } + + static WithReaderWriterArgs WithAdditionalStringRepresentation(String stringRepresentation) { + return (withAdditionalStringRepresentation) () -> stringRepresentation; + } } interface withRenderAsList extends WithReaderWriterArgs { boolean renderAsList(); } + +interface withAdditionalStringRepresentation extends WithReaderWriterArgs { + String stringRepresentation(); +} diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferJsonBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferJsonBased.java index 223119e..59d20c3 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferJsonBased.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferJsonBased.java @@ -80,7 +80,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeBit(String logicalName, boolean value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwBitKey, 1); + writeAttr(sanitizedLogicalName, rwBitKey, 1, writerArgs); generator.writeBooleanField(sanitizedLogicalName, value); } ); } @@ -89,7 +89,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeUnsignedByte(String logicalName, int bitLength, byte value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwUintKey, bitLength); + writeAttr(sanitizedLogicalName, rwUintKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); } ); } @@ -98,7 +98,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeUnsignedShort(String logicalName, int bitLength, short value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(logicalName, rwUintKey, bitLength); + writeAttr(logicalName, rwUintKey, bitLength, writerArgs); generator.writeNumberField(logicalName, value); }); } @@ -107,7 +107,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeUnsignedInt(String logicalName, int bitLength, int value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwUintKey, bitLength); + writeAttr(sanitizedLogicalName, rwUintKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -116,7 +116,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeUnsignedLong(String logicalName, int bitLength, long value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwUintKey, bitLength); + writeAttr(sanitizedLogicalName, rwUintKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); } ); } @@ -125,7 +125,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeUnsignedBigInteger(String logicalName, int bitLength, BigInteger value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwUintKey, bitLength); + writeAttr(sanitizedLogicalName, rwUintKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -134,7 +134,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeByte(String logicalName, int bitLength, byte value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwIntKey, bitLength); + writeAttr(sanitizedLogicalName, rwIntKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -143,7 +143,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeShort(String logicalName, int bitLength, short value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwIntKey, bitLength); + writeAttr(sanitizedLogicalName, rwIntKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); } ); } @@ -152,7 +152,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeInt(String logicalName, int bitLength, int value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwIntKey, bitLength); + writeAttr(sanitizedLogicalName, rwIntKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -161,7 +161,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeLong(String logicalName, int bitLength, long value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwIntKey, bitLength); + writeAttr(sanitizedLogicalName, rwIntKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -170,7 +170,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeBigInteger(String logicalName, int bitLength, BigInteger value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwIntKey, bitLength); + writeAttr(sanitizedLogicalName, rwIntKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -180,7 +180,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { int bitLength = (value < 0 ? 1 : 0) + bitsExponent + bitsMantissa; - writeAttr(sanitizedLogicalName, rwFloatKey, bitLength); + writeAttr(sanitizedLogicalName, rwFloatKey, bitLength, writerArgs); generator.writeNumberField(logicalName, value); }); } @@ -190,7 +190,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { int bitLength = (value < 0 ? 1 : 0) + bitsExponent + bitsMantissa; - writeAttr(sanitizedLogicalName, rwFloatKey, bitLength); + writeAttr(sanitizedLogicalName, rwFloatKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -199,7 +199,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeBigDecimal(String logicalName, int bitLength, BigDecimal value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwFloatKey, bitLength); + writeAttr(sanitizedLogicalName, rwFloatKey, bitLength, writerArgs); generator.writeNumberField(sanitizedLogicalName, value); }); } @@ -208,7 +208,7 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { public void writeString(String logicalName, int bitLength, String encoding, String value, WithWriterArgs... writerArgs) throws ParseException { final String sanitizedLogicalName = sanitizeLogicalName(logicalName); wrapIfNecessary(() -> { - writeAttr(sanitizedLogicalName, rwStringKey, bitLength); + writeAttr(sanitizedLogicalName, rwStringKey, bitLength, writerArgs); generator.writeStringField(String.format("%s__plc4x_%s", sanitizedLogicalName, rwEncodingKey), encoding); generator.writeStringField(sanitizedLogicalName, value); }); @@ -272,11 +272,15 @@ public class WriteBufferJsonBased implements WriteBuffer, BufferCommons { } } - private void writeAttr(String logicalName, String dataType, int bitLength) throws IOException { + private void writeAttr(String logicalName, String dataType, int bitLength, WithWriterArgs... writerArgs) throws IOException { if (!doRenderAttr) { return; } generator.writeStringField(String.format("%s__plc4x_%s", logicalName, rwDataTypeKey), dataType); generator.writeNumberField(String.format("%s__plc4x_%s", logicalName, rwBitLengthKey), bitLength); + String stringRepresentation = extractAdditionalStringRepresentation(writerArgs); + if (stringRepresentation != null) { + generator.writeStringField(String.format("%s__plc4x_%s", logicalName, rwStringRepresentationKey), stringRepresentation); + } } }