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/16 11:34:55 UTC
[plc4x] 06/06: Fixed issue with NodeId in mspec
This is an automated email from the ASF dual-hosted git repository.
hutcheb pushed a commit to branch feature/native_opua_client
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit d4444a3bc2e38f7cecbe4607f8ee47ea0cd258f7
Author: hutcheb <be...@gmail.com>
AuthorDate: Fri Apr 16 07:34:19 2021 -0400
Fixed issue with NodeId in mspec
---
.../BaseFreemarkerLanguageTemplateHelper.java | 23 +++++++++++++++++--
.../templates/java/pojo-template.java.ftlh | 2 ++
.../definitions/DefaultComplexTypeDefinition.java | 6 +----
protocols/opcua/src/main/xslt/opc-types.xsl | 26 +++++++++++++---------
4 files changed, 40 insertions(+), 17 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 a61e429..19fceaa 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
@@ -643,8 +643,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
final SwitchField switchField = getSwitchField(baseType);
List<String> discriminatorNames = new ArrayList<>();
- for (Term discriminatorExpression : switchField.getDiscriminatorExpressions()) {
- discriminatorNames.add(getDiscriminatorName(discriminatorExpression));
+ if (switchField != null) {
+ for (Term discriminatorExpression : switchField.getDiscriminatorExpressions()) {
+ discriminatorNames.add(getDiscriminatorName(discriminatorExpression));
+ }
}
return discriminatorNames;
}
@@ -663,6 +665,23 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
}
/**
+ * Check if there's any field with the given name.
+ * This is required to suppress the generation of a virtual field
+ * in case a discriminated field is providing the information.
+ *
+ * @param discriminatorName name of the virtual name
+ * @return true if a field with the given name already exists in the same type.
+ */
+ public boolean isDiscriminatorField(String discriminatorName) {
+ List<String> names = getDiscriminatorNames();
+ if (names != null) {
+ return getDiscriminatorNames().stream().anyMatch(
+ field -> field.equals(discriminatorName));
+ }
+ return false;
+ }
+
+ /**
* Converts a given discriminator description into a symbolic name.
*
* @param discriminatorExpression discriminator expression
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 8a86eec..11d5fb5 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
@@ -163,6 +163,7 @@ public<#if helper.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${
</#list>
<#list type.virtualFields as field>
+ <#if !helper.isDiscriminatorField(field.name)>
public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
<#if helper.getLanguageTypeNameForField(field) = 'String'>
return ${helper.getLanguageTypeNameForField(field)}.valueOf(${helper.toParseExpression(field, field.valueExpression, type.parserArguments)});
@@ -170,6 +171,7 @@ public<#if helper.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${
return (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.valueExpression, type.parserArguments)});
</#if>
}
+ </#if>
</#list>
@Override
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 006e297..ac2dc4f 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
@@ -66,11 +66,6 @@ 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<AbstractField> getAbstractFields() {
return fields.stream().filter(field -> field instanceof AbstractField).map(
@@ -89,6 +84,7 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
if (getParentType() != null) {
fields.addAll(((ComplexTypeDefinition) getParentType()).getAllPropertyFields());
}
+
fields.addAll(getPropertyFields());
return fields;
}
diff --git a/protocols/opcua/src/main/xslt/opc-types.xsl b/protocols/opcua/src/main/xslt/opc-types.xsl
index 52530f8..2d96d04 100644
--- a/protocols/opcua/src/main/xslt/opc-types.xsl
+++ b/protocols/opcua/src/main/xslt/opc-types.xsl
@@ -368,47 +368,53 @@
]
[discriminatedType 'NodeIdTypeDefinition'
- [abstract Object 'identifier']
- [simple NodeIdType 'nodeType']
+ [abstract string '-1' 'identifier']
+ [discriminator NodeIdType 'nodeType']
[typeSwitch 'nodeType'
['nodeIdTypeTwoByte' NodeIdTwoByte
[simple uint 8 'namespaceIndex']
- [simple uint 8 'identifier']
+ [simple uint 8 'id']
+ [virtual string '-1' 'identifier' 'id']
]
['nodeIdTypeFourByte' NodeIdFourByte
[simple uint 8 'namespaceIndex']
- [simple uint 16 'identifier']
+ [simple uint 16 'id']
+ [virtual string '-1' 'identifier' 'id']
]
['nodeIdTypeNumeric' NodeIdNumeric
[simple uint 16 'namespaceIndex']
- [simple uint 32 'identifier']
+ [simple uint 32 'id']
+ [virtual string '-1' 'identifier' 'id']
]
['nodeIdTypeString' NodeIdString
[simple uint 16 'namespaceIndex']
- [simple string '-1' 'identifier']
+ [simple string '-1' 'id']
+ [virtual string '-1' 'identifier' 'id']
]
['nodeIdTypeGuid' NodeIdGuid
[simple uint 16 'namespaceIndex']
- [simple string '-1' 'identifier']
+ [simple string '-1' 'id']
+ [virtual string '-1' 'identifier' 'id']
]
['nodeIdTypeByteString' NodeIdByteString
[simple uint 16 'namespaceIndex']
- [simple uint 32 'identifier']
+ [simple uint 32 'id']
+ [virtual string '-1' 'identifier' 'id']
]
]
]
[type 'NodeId'
[reserved int 2 '0x00']
- [virtual string '-1' 'id' 'nodeId.identifier.toString']
[simple NodeIdTypeDefinition 'nodeId']
+ [virtual string '-1' 'id' 'nodeId.identifier']
]
[type 'ExpandedNodeId'
[simple bit 'namespaceURISpecified']
[simple bit 'serverIndexSpecified']
- [virtual string '-1' 'utf-8' 'identifier' 'nodeId.identifier.toString']
[simple NodeIdTypeDefinition 'nodeId']
+ [virtual string '-1' 'utf-8' 'identifier' 'nodeId.identifier']
[optional PascalString 'namespaceURI' 'namespaceURISpecified']
[optional uint 32 'serverIndex' 'serverIndexSpecified']
]