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>