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