You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/03/17 16:35:44 UTC

[plc4x] 01/04: - Made the code generation output the real type for discriminator constants.

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit ce0f02223da573e9a541c0a96fdad395cb964336
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Mar 17 17:32:20 2020 +0100

    - Made the code generation output the real type for discriminator constants.
---
 .../language/java/JavaLanguageTemplateHelper.java  | 26 ++++++++++++++++++++++
 .../resources/templates/java/pojo-template.ftlh    |  2 +-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index ad867e0..df7ce05 100644
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -428,6 +428,32 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return typeDefinition instanceof DiscriminatedComplexTypeDefinition;
     }
 
+    public String getDiscriminatorConstantType(DiscriminatedComplexTypeDefinition type, int index) {
+        final ComplexTypeDefinition parentType = (ComplexTypeDefinition) type.getParentType();
+        final Optional<Field> typeSwitchField = parentType.getFields().stream().filter(field -> field instanceof SwitchField).findFirst();
+        final SwitchField switchField = (SwitchField) typeSwitchField.get();
+        String fieldName = switchField.getDiscriminatorNames()[index];
+        final Optional<Field> regularField = parentType.getFields().stream().filter(field ->
+            ((field instanceof PropertyField) && ((PropertyField) field).getName().equals(fieldName)) ||
+                ((field instanceof ImplicitField) && ((ImplicitField) field).getName().equals(fieldName)) ||
+                ((field instanceof DiscriminatorField) && ((DiscriminatorField) field).getName().equals(fieldName))).findFirst();
+        if(regularField.isPresent()) {
+            final Field field = regularField.get();
+            if(field instanceof PropertyField) {
+                return getLanguageTypeName(((PropertyField) field).getType(), true);
+            } else if(field instanceof ImplicitField) {
+                return getLanguageTypeName(((ImplicitField) field).getType(), true);
+            } else {
+                return getLanguageTypeName(((DiscriminatorField) field).getType(), true);
+            }
+        }
+        final Optional<Argument> typeArgument = Arrays.stream(type.getParserArguments()).filter(argument -> fieldName.equals(argument.getName())).findFirst();
+        if(typeArgument.isPresent()) {
+            return getLanguageTypeName(typeArgument.get().getType(), true);
+        }
+        return "Object";
+    }
+
     public boolean isAbstractField(Field field) {
         return field instanceof AbstractField;
     }
diff --git a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
index c689e0a..25027ec 100644
--- a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
@@ -63,7 +63,7 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
     public static final Object[] DISCRIMINATOR_VALUES = new Object[] {
     <#list type.discriminatorValues as discriminatorValue>
         <#-- There are rare occasions where the discriminator is defined by a parser argument, in this case we currently can't detect the type -->
-        <#if type.discriminatorField??>(${helper.getLanguageTypeNameForField(type.discriminatorField)}) </#if>${discriminatorValue}<#sep>, </#sep>
+        (${helper.getDiscriminatorConstantType(type, discriminatorValue?index)}) ${discriminatorValue}<#sep>, </#sep>
     </#list>
     };
 </#if>