blob: 509e45790ad1d858b30f08f1fc02e13b97d9b944 [file] [log] [blame]
/*
* Copyright (c) 2010-2020 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.sdk.core.s.dto;
import org.eclipse.scout.sdk.core.generator.type.ITypeGenerator;
import org.eclipse.scout.sdk.core.model.api.Flags;
import org.eclipse.scout.sdk.core.model.api.IJavaEnvironment;
import org.eclipse.scout.sdk.core.model.api.IType;
import org.eclipse.scout.sdk.core.model.api.PropertyBean;
import org.eclipse.scout.sdk.core.s.IScoutRuntimeTypes;
import org.eclipse.scout.sdk.core.s.annotation.FormDataAnnotationDescriptor;
import org.eclipse.scout.sdk.core.s.dto.form.FormDataGenerator;
import org.eclipse.scout.sdk.core.s.dto.table.TableFieldDataGenerator;
import org.eclipse.scout.sdk.core.s.dto.table.TableRowDataGenerator;
import org.eclipse.scout.sdk.core.s.generator.method.ScoutMethodGenerator;
import org.eclipse.scout.sdk.core.util.Strings;
/**
* <h3>{@link CompositeFormDataGenerator}</h3>
*
* @since 3.10.0 2013-08-27
*/
public class CompositeFormDataGenerator<TYPE extends CompositeFormDataGenerator<TYPE>> extends FormDataGenerator<TYPE> {
public CompositeFormDataGenerator(IType modelType, FormDataAnnotationDescriptor formDataAnnotation, IJavaEnvironment targetEnv) {
super(modelType, formDataAnnotation, targetEnv);
}
@Override
protected void setupBuilder() {
processInnerTypes(modelType());
super.setupBuilder();
}
protected void processInnerTypes(IType compositeType) {
// step into inner form field
compositeType.innerTypes()
.withFlags(Flags.AccPublic)
.withInstanceOf(IScoutRuntimeTypes.IFormField).stream()
.forEach(this::processFormField);
// step into formFieldMenus (special menu that may contain more form fields)
compositeType.innerTypes()
.withFlags(Flags.AccPublic)
.withInstanceOf(IScoutRuntimeTypes.IFormFieldMenu).stream()
.forEach(this::processInnerTypes);
// step into inner extensions
compositeType.innerTypes()
.withInstanceOf(IScoutRuntimeTypes.ICompositeFieldExtension).stream()
.forEach(this::processInnerTypes);
// step into inner table extensions of table-fields
compositeType.innerTypes()
.withRecursiveInnerTypes(true)
.withInstanceOf(IScoutRuntimeTypes.ITableExtension).stream()
.forEach(this::processTableExtension);
}
protected void processFormField(IType formField) {
FormDataAnnotationDescriptor fieldAnnotation = FormDataAnnotationDescriptor.of(formField);
if (FormDataAnnotationDescriptor.isIgnore(fieldAnnotation)) {
return;
}
boolean fieldExtendsTemplateField = false;
boolean isCompositeField = formField.isInstanceOf(IScoutRuntimeTypes.ICompositeField);
if (FormDataAnnotationDescriptor.isCreate(fieldAnnotation)) {
IType formDataType = fieldAnnotation.getFormDataType();
String formDataTypeName;
if (formDataType == null) {
formDataTypeName = removeFieldSuffix(formField.elementName());
}
else {
formDataTypeName = formDataType.elementName();
}
ITypeGenerator<?> dtoGenerator;
if (fieldAnnotation.getSuperType().isInstanceOf(IScoutRuntimeTypes.AbstractTableFieldBeanData)) {
// fill table bean
dtoGenerator = new TableFieldDataGenerator<>(formField, fieldAnnotation, targetEnvironment());
}
else if (isCompositeField && !formField.isInstanceOf(IScoutRuntimeTypes.IValueField)) {
// field extends a field template.
fieldExtendsTemplateField = true;
dtoGenerator = new CompositeFormDataGenerator<>(formField, fieldAnnotation, targetEnvironment());
}
else {
dtoGenerator = new FormDataGenerator<>(formField, fieldAnnotation, targetEnvironment());
// special case if a property has the same name as a form field -> show warning
methods()
.filter(msb -> (PropertyBean.getterPrefixFor(msb.returnType().get()) + formDataTypeName).equals(msb.elementName().get()))
.findAny()
.ifPresent(msb -> dtoGenerator.withComment(b -> b.appendTodo("Duplicate names '" + formDataTypeName + "'. Rename property or form field.")));
}
// Scout RT requires the first char to be upper-case for a getter.
// See org.eclipse.scout.rt.platform.reflect.FastBeanUtility.BEAN_METHOD_PAT.
CharSequence methodName = Strings.ensureStartWithUpperCase(formDataTypeName);
this
.withType(dtoGenerator.withElementName(formDataTypeName), DtoMemberSortObjectFactory.forTypeFormDataFormField(formDataTypeName))
.withMethod(ScoutMethodGenerator.create()
.asPublic()
.withElementName(PropertyBean.GETTER_PREFIX + methodName)
.withReturnType(formDataTypeName)
.withBody(b -> b.returnClause().appendGetFieldByClass(formDataTypeName).semicolon()),
DtoMemberSortObjectFactory.forMethodFormDataFormField(methodName));
}
if (isCompositeField && !fieldExtendsTemplateField) {
processInnerTypes(formField);
}
}
protected void processTableExtension(IType tableExtension) {
withType(new TableRowDataGenerator<>(tableExtension, tableExtension, targetEnvironment())
.withElementName(getRowDataName(tableExtension.elementName()))
.withExtendsAnnotationIfNecessary(tableExtension),
DtoMemberSortObjectFactory.forTypeTableRowData(tableExtension.elementName()));
}
}