You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2021/04/14 09:13:17 UTC

[plc4x] branch feat/abstract_fields created (now 11a5ee1)

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

hutcheb pushed a change to branch feat/abstract_fields
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


      at 11a5ee1  bug: abstract fields don't get declared in base type. feat: fix for using virtual fields as discriminators bug: integration tests can now be skipped with the -DskipTests switch

This branch includes the following new commits:

     new 11a5ee1  bug: abstract fields don't get declared in base type. feat: fix for using virtual fields as discriminators bug: integration tests can now be skipped with the -DskipTests switch

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[plc4x] 01/01: bug: abstract fields don't get declared in base type. feat: fix for using virtual fields as discriminators bug: integration tests can now be skipped with the -DskipTests switch

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hutcheb pushed a commit to branch feat/abstract_fields
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 11a5ee1d69d5f4185808b4035ffa694167f12fa9
Author: hutcheb <be...@gmail.com>
AuthorDate: Wed Apr 14 05:12:35 2021 -0400

    bug: abstract fields don't get declared in base type.
    feat: fix for using virtual fields as discriminators
    bug: integration tests can now be skipped with the -DskipTests switch
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |  8 +++++++
 build-utils/language-c/pom.xml                     |  1 +
 build-utils/language-go/pom.xml                    |  1 +
 build-utils/language-java/pom.xml                  |  1 +
 .../templates/java/pojo-template.java.ftlh         | 23 ++++++++++----------
 .../definitions/DefaultComplexTypeDefinition.java  |  5 +++++
 .../src/main/resources/protocols/test/test.mspec   | 25 +++++++++++++++++++++-
 7 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 25bb065..a61e429 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -255,6 +255,14 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
             final ImplicitField implicitField = implicitFieldOptional.get();
             return Optional.of(implicitField.getType());
         }
+        // Check if the expression is a VirtualField
+        final Optional<VirtualField> virtualFieldOptional = baseType.getFields().stream().filter(
+            field -> field instanceof VirtualField).map(field -> (VirtualField) field).filter(
+            virtualField -> virtualField.getName().equals(propertyName)).findFirst();
+        if(virtualFieldOptional.isPresent()) {
+            final VirtualField virtualField = virtualFieldOptional.get();
+            return Optional.of(virtualField.getType());
+        }
         // Check if the expression root is referencing an argument
         if (baseType.getParserArguments() != null) {
             final Optional<Argument> argumentOptional = Arrays.stream(baseType.getParserArguments()).filter(
diff --git a/build-utils/language-c/pom.xml b/build-utils/language-c/pom.xml
index 623761d..991ec46 100644
--- a/build-utils/language-c/pom.xml
+++ b/build-utils/language-c/pom.xml
@@ -39,6 +39,7 @@
         <artifactId>maven-invoker-plugin</artifactId>
         <version>3.2.2</version>
         <configuration>
+          <skipInvocation>${skipTests}</skipInvocation>
           <debug>true</debug>
           <projectsDirectory>src/test/resources</projectsDirectory>
           <cloneProjectsTo>${project.build.directory}/integration-tests</cloneProjectsTo>
diff --git a/build-utils/language-go/pom.xml b/build-utils/language-go/pom.xml
index 7bd2f1b..e5c1aca 100644
--- a/build-utils/language-go/pom.xml
+++ b/build-utils/language-go/pom.xml
@@ -80,6 +80,7 @@
         <artifactId>maven-invoker-plugin</artifactId>
         <version>3.2.2</version>
         <configuration>
+          <skipInvocation>${skipTests}</skipInvocation>
           <debug>true</debug>
           <projectsDirectory>src/test/resources</projectsDirectory>
           <cloneProjectsTo>${project.build.directory}/integration-tests</cloneProjectsTo>
diff --git a/build-utils/language-java/pom.xml b/build-utils/language-java/pom.xml
index 85438f6..6735743 100644
--- a/build-utils/language-java/pom.xml
+++ b/build-utils/language-java/pom.xml
@@ -108,6 +108,7 @@
         <artifactId>maven-invoker-plugin</artifactId>
         <version>3.2.2</version>
         <configuration>
+          <skipInvocation>${skipTests}</skipInvocation>
           <debug>true</debug>
           <projectsDirectory>src/test/resources</projectsDirectory>
           <cloneProjectsTo>${project.build.directory}/integration-tests</cloneProjectsTo>
diff --git a/build-utils/language-java/src/main/resources/templates/java/pojo-template.java.ftlh b/build-utils/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
index 04a9dec..d44a549 100644
--- a/build-utils/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/pojo-template.java.ftlh
@@ -23,7 +23,7 @@
 <#-- @ftlvariable name="protocolName" type="java.lang.String" -->
 <#-- @ftlvariable name="outputFlavor" type="java.lang.String" -->
 <#-- @ftlvariable name="helper" type="org.apache.plc4x.language.java.JavaLanguageTemplateHelper" -->
-<#-- @ftlvariable name="type" type="org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition" -->
+<#-- @ftlvariable name="type" type="org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultComplexTypeDefinition" -->
 <#-- Declare the name and type of variables declared locally inside the template -->
 <#-- @ftlvariable name="arrayField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField" -->
 <#-- @ftlvariable name="checksumField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField" -->
@@ -149,20 +149,22 @@ public<#if helper.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${
 </#list>
     }
 
+<#list type.getAbstractFields() as field>
+    public abstract ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}();
+
+</#list>
 <#list type.propertyFields as field>
-    <#if helper.isAbstractField(field)>
-    public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> abstract get${field.name?cap_first}();
-    <#else>
     public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
         return ${field.name};
     }
-    </#if>
 
 </#list>
 <#list type.virtualFields as field>
+    <#if helper.isNonDiscriminatorField(field.name)>
     public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
         return (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.valueExpression, type.parserArguments)});
     }
+    </#if>
 
 </#list>
     @Override
@@ -214,9 +216,9 @@ public<#if helper.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${
         <#if helper.isSimpleTypeReference(discriminatorField.type)>
             <#assign simpleTypeReference = discriminatorField.type>
             <#if helper.getLanguageTypeNameForTypeReference(discriminatorField.type) = "String">
-                lengthInBits += ${toSerializationExpression(discriminatorField, simpleTypeReference.getLengthExpression(), type.parserArguments)};
+        lengthInBits += ${helper.toSerializationExpression(discriminatorField, simpleTypeReference.getLengthExpression(), type.parserArguments)};
             <#else>
-                lengthInBits += ${simpleTypeReference.sizeInBits};
+        lengthInBits += ${simpleTypeReference.sizeInBits};
             </#if>
         <#elseif helper.isEnumField(field)>
             lengthInBits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits};
@@ -256,12 +258,11 @@ public<#if helper.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${
         // Optional Field (${optionalField.name})
         if(${optionalField.name} != null) {
         <#if helper.isSimpleTypeReference(optionalField.type)>
+            <#assign simpleTypeReference = optionalField.type>
             <#if helper.getLanguageTypeNameForTypeReference(optionalField.type) = "String">
-                <#assign simpleTypeReference = optionalField.type>
-    lengthInBits += ${simpleTypeReference.getLength()};
+            lengthInBits += ${helper.toSerializationExpression(discriminatorField, simpleTypeReference.getLengthExpression(), type.parserArguments)};
             <#else>
-                <#assign simpleTypeReference = optionalField.type>
-    lengthInBits += ${simpleTypeReference.sizeInBits};
+            lengthInBits += ${simpleTypeReference.sizeInBits};
             </#if>
         <#elseif helper.isEnumField(field)>
             lengthInBits += ${helper.getEnumBaseTypeReference(optionalField.type).sizeInBits};
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 39d87f4..9cb9bdd 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -65,6 +65,11 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
             .collect(Collectors.toList());
     }
 
+    public List<AbstractField> getAbstractFields() {
+        return fields.stream().filter(field -> field instanceof AbstractField).map(
+            field -> (AbstractField) field).collect(Collectors.toList());
+    }
+
     @Override
     public List<VirtualField> getVirtualFields() {
         return fields.stream().filter(field -> (field instanceof VirtualField)).map(field -> (VirtualField) field)
diff --git a/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec b/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
index c2f5559..e6c3d1d 100644
--- a/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
+++ b/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
@@ -32,7 +32,8 @@
 
 [type 'FieldTypeTest'
     [simple         uint 8 'simpleField']
-    [abstract       unit 8  'abstractField']
+    //Abstract fields can only be used within discriminated base types.
+    //[abstract       unit 8  'abstractField']
     [array          uint 8  'arrayField'        count      '5']
     //TODO: Checksums fields are not supported in C
     //[checksum       uint 8  'checksumField'     '100']
@@ -86,6 +87,28 @@
     [abstract string '8' 'UTF-8' 'stringField']
 ]
 
+[type 'AbstractTypeTest'
+    //Abstract fields can only be used within discriminated base types.
+    [simple   uint 8 'simpleField']
+    [abstract bit 'abstractBitField']
+    [abstract int 8 'abstractIntField']
+    [abstract uint 8 'abstractUintField']
+    [abstract float 8.23 'abstractFloatField']
+    [abstract float 11.52 'abstractDoubleField']
+    [abstract string '8' 'UTF-8' 'abstractStringField']
+    [typeSwitch 'simpleField'
+        ['0' AbstractedType
+            //Abstract fields need to be overriden in child
+            [simple bit 'abstractBitField']
+            [simple int 8 'abstractIntField']
+            [simple uint 8 'abstractUintField']
+            [simple float 8.23 'abstractFloatField']
+            [simple float 11.52 'abstractDoubleField']
+            [simple string '8' 'UTF-8' 'abstractStringField']
+        ]
+    ]
+]
+
 [type 'ArrayTypeTest'
     [array bit 'bitField' count      '5']
     [array int 8 'intField' count      '5']