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']