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