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 2019/05/31 13:18:05 UTC

[plc4x] branch feature/code-gen updated: - Implemented the parsing of arrayFields

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

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


The following commit(s) were added to refs/heads/feature/code-gen by this push:
     new 341fd14  - Implemented the parsing of arrayFields
341fd14 is described below

commit 341fd142e0dd27617d081dc8374200bdcdce7558
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri May 31 15:17:56 2019 +0200

    - Implemented the parsing of arrayFields
---
 .../language/java/JavaLanguageTemplateHelper.java    |  5 +++++
 .../main/resources/templates/java/io-template.ftlh   | 20 +++++++++++++++++++-
 .../java/org/apache/plc4x/java/utils/IoBuffer.java   |  4 ++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index d8e3608..43e6769 100644
--- a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.language.java;
 
 import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
 import org.apache.plc4x.language.definitions.TypeDefinition;
+import org.apache.plc4x.language.fields.ArrayField;
 import org.apache.plc4x.language.references.ComplexTypeReference;
 import org.apache.plc4x.language.references.SimpleTypeReference;
 import org.apache.plc4x.language.references.TypeReference;
@@ -197,4 +198,8 @@ public class JavaLanguageTemplateHelper {
         return typeDefinition instanceof DiscriminatedComplexTypeDefinition;
     }
 
+    public boolean isCountArray(ArrayField arrayField) {
+        return arrayField.getLengthType() == ArrayField.LengthType.COUNT;
+    }
+
 }
diff --git a/sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh b/sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh
index ff4ac0b..1bd0927 100644
--- a/sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh
+++ b/sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh
@@ -45,6 +45,10 @@ import org.apache.plc4x.java.utils.ParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
 public class ${typeName}IO  {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(${typeName}IO.class);
@@ -61,7 +65,21 @@ public class ${typeName}IO  {
     <#case "array">
 
         // Array field
-        array ${field.name}
+        JexlExpression ex${field.name} = jexl.createExpression("${field.lengthExpression}");
+        int size = (int) ex${field.name}.evaluate(jc);
+        List<${helper.getLanguageTypeNameForSpecType(field.type)}> ${field.name}List = <#if helper.isCountArray(field)>new ArrayList<>(size)<#else>new LinkedList<>()</#if>;
+        <#if helper.isCountArray(field)>
+        for(int i = 0; i < size; i++) {
+            ${field.name}List.add(<#if helper.isSimpleType(field.type)>io.${helper.getIoBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${parserArgument}<#sep>, </#sep></#list></#if>)</#if>);
+        }
+        <#else>
+        int endPos = io.getPos() + size;
+        while(io.getPos() < endPos) {
+            ${field.name}List.add(<#if helper.isSimpleType(field.type)>io.${helper.getIoBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${parserArgument}<#sep>, </#sep></#list></#if>)</#if>);
+        }
+        </#if>
+        ${helper.getLanguageTypeNameForSpecType(field.type)}[] ${field.name} = ${field.name}List.toArray(new ${helper.getLanguageTypeNameForSpecType(field.type)}[0]);
+        jc.set("${field.name}", ${field.name});
         <#break>
     <#case "const">
 
diff --git a/sandbox/code-generation/test-java-s7-driver/src/main/java/org/apache/plc4x/java/utils/IoBuffer.java b/sandbox/code-generation/test-java-s7-driver/src/main/java/org/apache/plc4x/java/utils/IoBuffer.java
index cc782ca..18652e6 100644
--- a/sandbox/code-generation/test-java-s7-driver/src/main/java/org/apache/plc4x/java/utils/IoBuffer.java
+++ b/sandbox/code-generation/test-java-s7-driver/src/main/java/org/apache/plc4x/java/utils/IoBuffer.java
@@ -24,6 +24,10 @@ import java.math.BigInteger;
 
 public class IoBuffer {
 
+    public int getPos() {
+        return 0;
+    }
+
     public boolean readBit() {
         return false;
     }