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

Reply via email to