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 <[email protected]>
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']
 ]

Reply via email to