/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.forms.jbpm.server.service.formGeneration.impl; import java.util.ArrayList; import java.util.List; import org.kie.workbench.common.forms.commons.layout.FormLayoutTemplateGenerator; import org.kie.workbench.common.forms.data.modeller.model.DataObjectFormModel; import org.kie.workbench.common.forms.editor.service.backend.util.UIDGenerator; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.EntityRelationField; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.HasNestedForm; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.IsCRUDDefinition; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.TableColumnMeta; import org.kie.workbench.common.forms.jbpm.model.authoring.JBPMFormModel; import org.kie.workbench.common.forms.jbpm.server.service.formGeneration.BPMNFormGeneratorService; import org.kie.workbench.common.forms.jbpm.server.service.formGeneration.FormGenerationResult; import org.kie.workbench.common.forms.model.FieldDefinition; import org.kie.workbench.common.forms.model.FormDefinition; import org.kie.workbench.common.forms.model.JavaModel; import org.kie.workbench.common.forms.service.FieldManager; public abstract class AbstractBPMNFormGeneratorService<SOURCE> implements BPMNFormGeneratorService<SOURCE> { protected FieldManager fieldManager; protected FormLayoutTemplateGenerator layoutTemplateGenerator; public AbstractBPMNFormGeneratorService(FieldManager fieldManager, FormLayoutTemplateGenerator layoutTemplateGenerator) { this.fieldManager = fieldManager; this.layoutTemplateGenerator = layoutTemplateGenerator; } @Override public FormGenerationResult generateForms(JBPMFormModel formModel, SOURCE source) { if (formModel == null) { throw new IllegalArgumentException("FormModel cannot be null"); } GenerationContext<SOURCE> context = new GenerationContext<>(formModel, source); FormDefinition rootForm = createRootFormDefinition(context); if (rootForm == null) { throw new IllegalStateException("Impossible to generate form for: " + formModel.getFormName()); } context.setRootForm(rootForm); processFormDefinition(rootForm, context); return new FormGenerationResult(context.getRootForm(), new ArrayList<>(context.getContextForms().values())); } protected void processFormDefinition(final FormDefinition formDefinition, final GenerationContext<SOURCE> context) { formDefinition.getFields().forEach(field -> { processFieldDefinition(field, context); }); } protected void processFieldDefinition(FieldDefinition field, GenerationContext<SOURCE> context) { if (field instanceof EntityRelationField) { if (field instanceof HasNestedForm) { HasNestedForm nestedFormField = (HasNestedForm) field; FormDefinition nestedForm = findFormDefinitionForModelType(field.getStandaloneClassName(), context); if (nestedForm == null) { nestedForm = createModelFormDefinition(field.getStandaloneClassName(), context); } nestedFormField.setNestedForm(nestedForm.getId()); } else if (field instanceof IsCRUDDefinition) { IsCRUDDefinition crudField = (IsCRUDDefinition) field; FormDefinition nestedForm = findFormDefinitionForModelType(field.getStandaloneClassName(), context); if (nestedForm == null) { nestedForm = createModelFormDefinition(field.getStandaloneClassName(), context); crudField.setCreationForm(nestedForm.getId()); crudField.setEditionForm(nestedForm.getId()); List<TableColumnMeta> tableColumnMetas = new ArrayList<>(); nestedForm.getFields().forEach(nestedField -> { tableColumnMetas.add(new TableColumnMeta(nestedField.getLabel(), nestedField.getBinding())); }); crudField.setColumnMetas(tableColumnMetas); } } } } protected FormDefinition createModelFormDefinition(String modelType, GenerationContext<SOURCE> context) { FormDefinition form = context.getContextForms().get(modelType); if (form == null) { String modelName = modelType.substring(modelType.lastIndexOf(".") + 1); String formModelName = modelName; formModelName = formModelName.substring(0, 1).toLowerCase() + formModelName.substring(1); DataObjectFormModel formModel = new DataObjectFormModel(formModelName, modelType); form = new FormDefinition(formModel); context.getContextForms().put(modelType, form); form.setId(UIDGenerator.generateUID()); form.setName(modelName); List<FieldDefinition> fields = extractModelFields(formModel, context); form.getFields().addAll(fields); layoutTemplateGenerator.generateLayoutTemplate(form); processFormDefinition(form, context); } return form; } protected abstract FormDefinition createRootFormDefinition(GenerationContext<SOURCE> context); protected abstract List<FieldDefinition> extractModelFields(JavaModel formModel, GenerationContext<SOURCE> context); protected FormDefinition findFormDefinitionForModelType(String modelType, GenerationContext<SOURCE> context) { return context.getContextForms().get(modelType); } }