private List extracFormFields()

in packages/stunner-editors/kie-wb-common-forms/kie-wb-common-forms-core/kie-wb-common-forms-adf/kie-wb-common-forms-adf-processors/src/main/java/org/kie/workbench/common/forms/adf/processors/FormDefinitionGenerator.java [181:350]


    private List<FormDefinitionFieldData> extracFormFields(TypeElement type, FieldPolicy policy, I18nSettings i18nSettings, Map<String, String> defaultParams) throws Exception {

        final Types typeUtils = context.getProcessingEnvironment().getTypeUtils();

        Collection<FieldInfo> fieldInfos = FormGenerationUtils.extractFieldInfos(type, fieldElement -> filter(fieldElement, policy));

        List<FormDefinitionFieldData> fieldSettings = new ArrayList<>();

        for (FieldInfo fieldInfo : fieldInfos) {

            if (fieldInfo.getSetter() != null && fieldInfo.getGetter() != null) {

                String fieldName = fieldInfo.getFieldElement().getSimpleName().toString();

                FormDefinitionFieldData fieldData = new FormDefinitionFieldData(type.getQualifiedName().toString(), fieldName);

                fieldData.setLabel(fieldName);
                fieldData.setBinding(fieldName);
                fieldData.setMethodName("getFormElement_" + fieldName);

                boolean isList = false;

                org.kie.workbench.common.forms.model.TypeKind typeKind = org.kie.workbench.common.forms.model.TypeKind.BASE;

                boolean overrideI18n = false;

                TypeMirror finalType = fieldInfo.getFieldElement().asType();
                TypeElement finalTypeElement = (TypeElement) typeUtils.asElement(finalType);

                String fieldModifier = "";

                if (finalTypeElement.getKind().equals(ElementKind.CLASS)) {
                    FieldDefinition fieldDefinitionAnnotation = finalTypeElement.getAnnotation(FieldDefinition.class);
                    if (fieldDefinitionAnnotation != null) {

                        // Override the using the i18n mechanism
                        if (fieldDefinitionAnnotation.i18nMode().equals(I18nMode.OVERRIDE_I18N_KEY)) {
                            fieldData.setLabel(finalType.toString() + i18nSettings.separator() + fieldDefinitionAnnotation.labelKeySuffix());
                            Collection<FieldInfo> labelInfos = FormGenerationUtils.extractFieldInfos(finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldLabel.class) != null);

                            if (labelInfos != null && labelInfos.size() == 1) {
                                FieldInfo labelInfo = labelInfos.iterator().next();
                                fieldData.setLabel(finalType.toString() + i18nSettings.separator() + labelInfo.getFieldElement().getSimpleName());
                            }

                            fieldData.setHelpMessage(finalType.toString() + i18nSettings.separator() + fieldDefinitionAnnotation.helpMessageKeySuffix());
                            Collection<FieldInfo> helpMessages = FormGenerationUtils.extractFieldInfos(finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldHelp.class) != null);

                            if (helpMessages != null && helpMessages.size() == 1) {
                                FieldInfo helpInfo = helpMessages.iterator().next();
                                fieldData.setHelpMessage(finalType.toString() + i18nSettings.separator() + helpInfo.getFieldElement().getSimpleName());
                            }
                        }

                        Collection<FieldInfo> fieldValue = FormGenerationUtils.extractFieldInfos(finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldValue.class) != null);

                        if (fieldValue == null || fieldValue.size() != 1) {
                            throw new Exception("Problem processing FieldDefinition [" + finalType + "]: it should have one field marked as @FieldValue");
                        }
                        FieldInfo valueInfo = fieldValue.iterator().next();

                        fieldData.setBinding(fieldData.getBinding() + "." + valueInfo.getFieldElement().getSimpleName());

                        fieldModifier = FormGenerationUtils.fixClassName(finalType.toString()) + "_FieldStatusModifier";

                        finalType = valueInfo.getFieldElement().asType();
                        finalTypeElement = (TypeElement) typeUtils.asElement(finalType);

                        overrideI18n = !fieldDefinitionAnnotation.i18nMode().equals(I18nMode.DONT_OVERRIDE);
                    } else {
                        FormDefinition formDefinitionAnnotation = finalTypeElement.getAnnotation(FormDefinition.class);

                        if (formDefinitionAnnotation != null) {
                            fieldData.setLabel(finalType.toString() + i18nSettings.separator() + FieldDefinition.LABEL);
                            Collection<FieldInfo> labelInfos = FormGenerationUtils.extractFieldInfos(finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldLabel.class) != null);

                            if (labelInfos != null && labelInfos.size() == 1) {
                                FieldInfo labelInfo = labelInfos.iterator().next();
                                fieldData.setLabel(finalType.toString() + i18nSettings.separator() + labelInfo.getFieldElement().getSimpleName());
                                overrideI18n = true;
                            }

                            fieldData.setHelpMessage(finalType.toString() + i18nSettings.separator() + FieldDefinition.HELP_MESSAGE);
                            Collection<FieldInfo> helpMessages = FormGenerationUtils.extractFieldInfos(finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldHelp.class) != null);

                            if (helpMessages != null && helpMessages.size() == 1) {
                                FieldInfo helpInfo = helpMessages.iterator().next();
                                fieldData.setHelpMessage(finalType.toString() + i18nSettings.separator() + helpInfo.getFieldElement().getSimpleName());
                                overrideI18n = true;
                            }

                            typeKind = org.kie.workbench.common.forms.model.TypeKind.OBJECT;
                        }
                    }
                }

                DeclaredType fieldType = (DeclaredType) finalType;

                if (typeUtils.isAssignable(finalTypeElement.asType(), listType)) {
                    if (fieldType.getTypeArguments().size() != 1) {
                        throw new IllegalArgumentException("Impossible to generate a field for type " + fieldType.toString() + ". Type should have one and only one Type arguments.");
                    }
                    isList = true;
                    finalType = fieldType.getTypeArguments().get(0);
                    finalTypeElement = (TypeElement) typeUtils.asElement(finalType);

                    if (FormModelPropertiesUtil.isBaseType(finalTypeElement.getQualifiedName().toString())) {
                        typeKind = org.kie.workbench.common.forms.model.TypeKind.BASE;
                    } else if (typeUtils.isAssignable(finalTypeElement.asType(), enumType)) {
                        typeKind = org.kie.workbench.common.forms.model.TypeKind.ENUM;
                    } else {
                        typeKind = org.kie.workbench.common.forms.model.TypeKind.OBJECT;
                    }
                } else if (typeUtils.isAssignable(finalTypeElement.asType(), enumType)) {
                    typeKind = org.kie.workbench.common.forms.model.TypeKind.ENUM;
                }

                fieldData.setType(typeKind.toString());
                fieldData.setClassName(finalTypeElement.getQualifiedName().toString());
                fieldData.setList(String.valueOf(isList));
                fieldData.setFieldModifier(fieldModifier);
                fieldData.getParams().putAll(defaultParams);

                FormField settings = fieldInfo.getFieldElement().getAnnotation(FormField.class);

                if (settings != null) {
                    try {
                        fieldData.setPreferredType(settings.type().getName());
                    } catch (MirroredTypeException exception) {
                        fieldData.setPreferredType(exception.getTypeMirror().toString());
                    }

                    fieldData.setAfterElement(settings.afterElement());

                    if (!overrideI18n && !isEmpty(settings.labelKey())) {
                        fieldData.setLabel(settings.labelKey());
                    }

                    if (!overrideI18n && !isEmpty(settings.helpMessageKey())) {
                        fieldData.setHelpMessage(settings.helpMessageKey());
                    }

                    fieldData.setRequired(Boolean.valueOf(settings.required()).toString());
                    fieldData.setReadOnly(Boolean.valueOf(settings.readonly()).toString());

                    for (FieldParam fieldParam : settings.settings()) {
                        fieldData.getParams().put(fieldParam.name(), fieldParam.value());
                    }

                    fieldData.setWrap(Boolean.valueOf(settings.layoutSettings().wrap()).toString());
                    fieldData.setHorizontalSpan(String.valueOf(settings.layoutSettings().horizontalSpan()));
                    fieldData.setVerticalSpan(String.valueOf(settings.layoutSettings().verticalSpan()));
                }

                if (!overrideI18n) {
                    if (!isEmpty(i18nSettings.keyPreffix())) {
                        fieldData.setLabel(i18nSettings.keyPreffix() + i18nSettings.separator() + fieldData.getLabel());
                        if(!isEmpty(fieldData.getHelpMessage())) {
                            fieldData.setHelpMessage(i18nSettings.keyPreffix() + i18nSettings.separator() + fieldData.getHelpMessage());
                        }
                    }
                }

                extractFieldExtraSettings(fieldData, fieldInfo.getFieldElement());

                fieldSettings.add(fieldData);
            }
        }
        return fieldSettings;
    }