/* * 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.adf.engine.shared.formGeneration; import java.util.HashMap; import java.util.Map; import org.kie.workbench.common.forms.adf.engine.shared.formGeneration.layout.LayoutGenerator; import org.kie.workbench.common.forms.adf.engine.shared.formGeneration.processing.FormElementProcessor; import org.kie.workbench.common.forms.adf.service.building.FieldStatusModifier; import org.kie.workbench.common.forms.adf.service.building.FormGenerationResourcesProvider; import org.kie.workbench.common.forms.adf.service.definitions.FormDefinitionSettings; import org.kie.workbench.common.forms.adf.service.definitions.I18nSettings; import org.kie.workbench.common.forms.adf.service.definitions.elements.FormElement; import org.kie.workbench.common.forms.adf.service.definitions.layout.LayoutColumnDefinition; import org.kie.workbench.common.forms.adf.service.definitions.layout.LayoutDefinition; import org.kie.workbench.common.forms.model.FormDefinition; import org.uberfire.ext.layout.editor.api.editor.LayoutComponent; public abstract class AbstractFormGenerator implements FormGenerator { protected LayoutGenerator layoutGenerator; protected Map<Class<? extends FormElement>, FormElementProcessor> processors = new HashMap<>(); protected Map<String, FormDefinitionSettings> formDefinitionSettings = new HashMap<>(); protected Map<String, FieldStatusModifier> fieldModifiers = new HashMap<>(); protected Map<String, String> fieldModifierReferences = new HashMap<>(); public AbstractFormGenerator(LayoutGenerator layoutGenerator) { this.layoutGenerator = layoutGenerator; } protected void registerProcessor(FormElementProcessor processor) { if (processor != null) { processors.put(processor.getSupportedElementType(), processor); } } protected void registerResources(FormGenerationResourcesProvider provider) { if (provider != null) { if (isValid(provider.getDefinitionSettings())) { formDefinitionSettings.putAll(provider.getDefinitionSettings()); } if (isValid(provider.getFieldModifiers())) { fieldModifiers.putAll(provider.getFieldModifiers()); } if (isValid(provider.getFieldModifierReferences())) { fieldModifierReferences.putAll(provider.getFieldModifierReferences()); } } } private boolean isValid(Map map) { return map != null && !map.isEmpty(); } @Override public FormDefinition generateFormForModel(Object model) { FormDefinitionSettings settings = formDefinitionSettings.get(model.getClass().getName()); if (settings != null) { return generateFormDefinition(settings, model); } return null; } @Override public FormDefinition generateFormForClass(Class clazz) { return generateFormForClassName(clazz.getName()); } @Override public FormDefinition generateFormForClassName(String className) { FormDefinitionSettings settings = formDefinitionSettings.get(className); if (settings != null) { return generateFormDefinition(settings, null); } return null; } protected FormDefinition generateFormDefinition(FormDefinitionSettings settings, Object model) { FormGenerationContext context = new FormGenerationContext(model, settings, getI18nHelper(settings.getI18nSettings())); context.setFieldStatusModifierReferences(fieldModifierReferences); context.setFieldStatusModifiers(fieldModifiers); if (settings.getLayout() == null || settings.getLayout().getColumns() == null || settings.getLayout().getColumns().length == 0) { settings.setLayout(new LayoutDefinition(new LayoutColumnDefinition())); } layoutGenerator.init(settings.getLayout().getColumns()); processElements(context); FormDefinition form = context.getFormDefinition(); form.setLayoutTemplate(layoutGenerator.build()); return form; } protected abstract I18nHelper getI18nHelper(I18nSettings settings); protected void processElements(FormGenerationContext context) { context.getFormDefinitionSettings().getFormElements().forEach(formElement -> { FormElementProcessor processor = processors.get(formElement.getClass()); if (processor != null) { LayoutComponent layoutComponent = processor.processFormElement(formElement, context); if (layoutComponent != null) { layoutGenerator.addComponent(layoutComponent, formElement.getLayoutSettings()); } } }); } }