use of org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.FieldDefinition in project kie-wb-common by kiegroup.
the class FormDefinitionsProcessor method processFieldDefinition.
private void processFieldDefinition(TypeElement fieldDefinitionElement) throws Exception {
final Messager messager = processingEnv.getMessager();
messager.printMessage(Diagnostic.Kind.NOTE, "Discovered FieldDefinition class [" + fieldDefinitionElement.getSimpleName() + "]");
Collection<FieldInfo> fieldInfos = extractFieldInfos(fieldDefinitionElement, null);
String modelClassName = fieldDefinitionElement.getQualifiedName().toString();
String fieldModifierName = fixClassName(modelClassName) + "_FieldStatusModifier";
Map<String, String> fieldDefinition = new HashMap<>();
fieldDefinition.put("className", modelClassName);
fieldDefinition.put("fieldModifierName", fieldModifierName);
Map<String, Object> templateContext = new HashMap<>();
templateContext.put("modelClassName", modelClassName);
templateContext.put("fieldModifierName", fieldModifierName);
FieldDefinition fieldDefinitionAnnotation = fieldDefinitionElement.getAnnotation(FieldDefinition.class);
for (FieldInfo fieldInfo : fieldInfos) {
AnnotationMirror annotation = GeneratorUtils.getAnnotation(elementUtils, fieldInfo.fieldElement, FieldValue.class.getName());
if (annotation != null) {
if (fieldDefinition.containsKey("value")) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: it should have only one @FieldValue");
}
if (fieldInfo.getter == null || fieldInfo.setter == null) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldValue should have setter & getter");
}
fieldDefinition.put("value", fieldInfo.fieldElement.getSimpleName().toString());
} else {
annotation = GeneratorUtils.getAnnotation(elementUtils, fieldInfo.fieldElement, FieldReadOnly.class.getName());
if (annotation != null) {
if (templateContext.containsKey("readOnly")) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: it should have only one @FieldReadOnly");
}
if (!fieldInfo.fieldElement.asType().getKind().equals(TypeKind.BOOLEAN) && !fieldInfo.fieldElement.asType().toString().equals(Boolean.class.getName())) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldReadOnly must be boolean or Boolean");
}
if (fieldInfo.getter == null) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldReadOnly should have getter");
}
templateContext.put("readOnly", fieldInfo.getter);
}
annotation = GeneratorUtils.getAnnotation(elementUtils, fieldInfo.fieldElement, FieldRequired.class.getName());
if (annotation != null) {
if (templateContext.containsKey("required")) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: it should have only one @FieldRequired");
}
if (!fieldInfo.fieldElement.asType().getKind().equals(TypeKind.BOOLEAN) && !fieldInfo.fieldElement.asType().toString().equals(Boolean.class.getName())) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldRequired must be boolean or Boolean");
}
if (fieldInfo.getter == null) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldRequired should have getter");
}
templateContext.put("required", fieldInfo.getter);
}
if (fieldDefinitionAnnotation.i18nMode().equals(I18nMode.OVERRIDE)) {
annotation = GeneratorUtils.getAnnotation(elementUtils, fieldInfo.fieldElement, FieldLabel.class.getName());
if (annotation != null) {
if (templateContext.containsKey("label")) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: it should have only one @FieldLabel");
}
if (!fieldInfo.fieldElement.asType().toString().equals(String.class.getName())) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldLabel must be a String");
}
if (fieldInfo.getter == null) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldLabel should have getter");
}
templateContext.put("label", fieldInfo.getter);
}
annotation = GeneratorUtils.getAnnotation(elementUtils, fieldInfo.fieldElement, FieldHelp.class.getName());
if (annotation != null) {
if (templateContext.containsKey("helpMessage")) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: it has more than one field marked as @FieldHelp");
}
if (!fieldInfo.fieldElement.asType().toString().equals(String.class.getName())) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldHelp must be a String");
}
if (fieldInfo.getter == null) {
throw new Exception("Problem processing FieldDefinition [" + modelClassName + "]: field marked as @FieldHelp should have getter");
}
templateContext.put("helpMessage", fieldInfo.getter);
}
}
}
}
StringBuffer source = writeTemplate("templates/FieldDefinitionModifier.ftl", templateContext);
fieldDefinition.put("sourceCode", source.toString());
context.getFieldDefinitions().add(fieldDefinition);
}
use of org.kie.workbench.common.forms.adf.definitions.annotations.metaModel.FieldDefinition in project kie-wb-common by kiegroup.
the class FormDefinitionsProcessor method extracFormFields.
private List<Map<String, String>> extracFormFields(TypeElement type, FieldPolicy policy, I18nSettings i18nSettings) throws Exception {
final Elements elementUtils = processingEnv.getElementUtils();
Collection<FieldInfo> fieldInfos = extractFieldInfos(type, fieldElement -> {
if (policy.equals(FieldPolicy.ALL)) {
AnnotationMirror annotation = GeneratorUtils.getAnnotation(elementUtils, fieldElement, SkipFormField.class.getName());
if (annotation != null) {
return false;
}
} else {
AnnotationMirror annotation = GeneratorUtils.getAnnotation(elementUtils, fieldElement, FormField.class.getName());
if (annotation == null) {
return false;
}
}
return true;
});
List<Map<String, String>> elementsSettings = new ArrayList<>();
for (FieldInfo fieldInfo : fieldInfos) {
if (fieldInfo.getter != null && fieldInfo.setter != null) {
String fieldName = fieldInfo.fieldElement.getSimpleName().toString();
String fieldLabel = fieldName;
String helpMessage = "";
String binding = fieldName;
String methodName = "getFormElement_" + fieldName;
Map<String, Object> elementContext = new HashMap<>();
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.fieldElement.asType();
String fieldModifier = "";
if (finalType instanceof DeclaredType) {
Element finalTypeElement = processingEnv.getTypeUtils().asElement(finalType);
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)) {
fieldLabel = finalType.toString() + i18nSettings.separator() + fieldDefinitionAnnotation.labelKeySuffix();
Collection<FieldInfo> labelInfos = extractFieldInfos((TypeElement) finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldLabel.class) != null);
if (labelInfos != null && labelInfos.size() == 1) {
FieldInfo labelInfo = labelInfos.iterator().next();
fieldLabel = finalType.toString() + i18nSettings.separator() + labelInfo.fieldElement.getSimpleName();
}
helpMessage = finalType.toString() + i18nSettings.separator() + fieldDefinitionAnnotation.helpMessageKeySuffix();
Collection<FieldInfo> helpMessages = extractFieldInfos((TypeElement) finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldHelp.class) != null);
if (helpMessages != null && helpMessages.size() == 1) {
FieldInfo helpInfo = helpMessages.iterator().next();
helpMessage = finalType.toString() + i18nSettings.separator() + helpInfo.fieldElement.getSimpleName();
}
}
Collection<FieldInfo> fieldValue = extractFieldInfos((TypeElement) 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();
binding += "." + valueInfo.getFieldElement().getSimpleName();
fieldModifier = fixClassName(finalType.toString()) + "_FieldStatusModifier";
finalType = valueInfo.getFieldElement().asType();
overrideI18n = !fieldDefinitionAnnotation.i18nMode().equals(I18nMode.DONT_OVERRIDE);
} else {
FormDefinition formDefinitionAnnotation = finalTypeElement.getAnnotation(FormDefinition.class);
if (formDefinitionAnnotation != null) {
fieldLabel = finalType.toString() + i18nSettings.separator() + FieldDefinition.LABEL;
Collection<FieldInfo> labelInfos = extractFieldInfos((TypeElement) finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldLabel.class) != null);
if (labelInfos != null && labelInfos.size() == 1) {
FieldInfo labelInfo = labelInfos.iterator().next();
fieldLabel = finalType.toString() + i18nSettings.separator() + labelInfo.fieldElement.getSimpleName();
overrideI18n = true;
}
helpMessage = finalType.toString() + i18nSettings.separator() + FieldDefinition.HELP_MESSAGE;
Collection<FieldInfo> helpMessages = extractFieldInfos((TypeElement) finalTypeElement, fieldElement -> fieldElement.getAnnotation(FieldHelp.class) != null);
if (helpMessages != null && helpMessages.size() == 1) {
FieldInfo helpInfo = helpMessages.iterator().next();
helpMessage = finalType.toString() + i18nSettings.separator() + helpInfo.fieldElement.getSimpleName();
overrideI18n = true;
}
typeKind = org.kie.workbench.common.forms.model.TypeKind.OBJECT;
}
}
}
DeclaredType fieldType = (DeclaredType) finalType;
if (processingEnv.getTypeUtils().isAssignable(fieldType.asElement().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);
if (FormModelPropertiesUtil.isBaseType(finalType.toString())) {
typeKind = org.kie.workbench.common.forms.model.TypeKind.BASE;
} else if (elementUtils.getTypeElement(finalType.toString()).getSuperclass().toString().startsWith("java.lang.Enum")) {
typeKind = org.kie.workbench.common.forms.model.TypeKind.ENUM;
} else {
typeKind = org.kie.workbench.common.forms.model.TypeKind.OBJECT;
}
} else if (elementUtils.getTypeElement(finalType.toString()).getSuperclass().toString().startsWith("java.lang.Enum")) {
typeKind = org.kie.workbench.common.forms.model.TypeKind.ENUM;
}
}
elementContext.put("formModel", type.getQualifiedName().toString());
elementContext.put("methodName", methodName);
elementContext.put("fieldName", fieldName);
elementContext.put("binding", binding);
elementContext.put("type", typeKind.toString());
elementContext.put("className", finalType.toString());
elementContext.put("isList", String.valueOf(isList));
elementContext.put("fieldModifier", fieldModifier);
Map<String, String> params = new HashMap<>();
elementContext.put("params", params);
String afterElement = "";
FormField settings = fieldInfo.fieldElement.getAnnotation(FormField.class);
if (settings != null) {
String typeName;
try {
typeName = settings.type().getName();
} catch (MirroredTypeException exception) {
typeName = exception.getTypeMirror().toString();
}
if (StringUtils.isEmpty(typeName)) {
typeName = FieldType.class.getName();
}
afterElement = settings.afterElement();
elementContext.put("preferredType", typeName);
if (!overrideI18n && !isEmpty(settings.labelKey())) {
fieldLabel = settings.labelKey();
}
if (!overrideI18n && !isEmpty(settings.helpMessageKey())) {
helpMessage = settings.helpMessageKey();
}
elementContext.put("required", Boolean.valueOf(settings.required()).toString());
elementContext.put("readOnly", Boolean.valueOf(settings.readonly()).toString());
for (FieldParam fieldParam : settings.settings()) {
params.put(fieldParam.name(), fieldParam.value());
}
elementContext.put("wrap", Boolean.valueOf(settings.layoutSettings().wrap()).toString());
elementContext.put("horizontalSpan", String.valueOf(settings.layoutSettings().horizontalSpan()));
elementContext.put("verticalSpan", String.valueOf(settings.layoutSettings().verticalSpan()));
} else {
elementContext.put("preferredType", FieldType.class.getName());
elementContext.put("required", Boolean.FALSE.toString());
elementContext.put("readOnly", Boolean.FALSE.toString());
elementContext.put("wrap", Boolean.FALSE.toString());
elementContext.put("horizontalSpan", "1");
elementContext.put("verticalSpan", "1");
}
if (!overrideI18n) {
if (!isEmpty(i18nSettings.keyPreffix())) {
fieldLabel = i18nSettings.keyPreffix() + i18nSettings.separator() + fieldLabel;
helpMessage = i18nSettings.keyPreffix() + i18nSettings.separator() + helpMessage;
}
}
elementContext.put("labelKey", fieldLabel);
elementContext.put("helpMessageKey", helpMessage);
elementContext.put("afterElement", afterElement);
extractFieldExtraSettings(elementContext, fieldInfo.fieldElement);
StringBuffer methodCode = writeTemplate("templates/FieldElement.ftl", elementContext);
Map<String, String> fieldSettings = new HashMap<>();
fieldSettings.put("elementName", fieldName);
fieldSettings.put("afterElement", afterElement);
fieldSettings.put("methodName", methodName);
fieldSettings.put("method", methodCode.toString());
elementsSettings.add(fieldSettings);
}
}
return elementsSettings;
}
Aggregations