/* * Copyright 2016 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.dynamic.backend.server.context.generation.dynamic.impl.fieldProcessors; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.enterprise.context.Dependent; import org.kie.workbench.common.forms.dynamic.service.context.generation.dynamic.BackendFormRenderingContext; import org.kie.workbench.common.forms.dynamic.service.shared.impl.MapModelRenderingContext; import org.kie.workbench.common.forms.fields.shared.fieldTypes.relations.multipleSubform.definition.MultipleSubFormFieldDefinition; import org.kie.workbench.common.forms.model.FormDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Dependent public class MultipleSubFormFieldValueProcessor extends NestedFormFieldValueProcessor<MultipleSubFormFieldDefinition, List, List<Map<String, Object>>> { private static final Logger logger = LoggerFactory.getLogger(MultipleSubFormFieldValueProcessor.class); @Override public Class<MultipleSubFormFieldDefinition> getSupportedField() { return MultipleSubFormFieldDefinition.class; } @Override public List<Map<String, Object>> toFlatValue(MultipleSubFormFieldDefinition field, List rawValues, BackendFormRenderingContext context) { final FormDefinition creationForm = context.getRenderingContext().getAvailableForms().get( field.getCreationForm()); final FormDefinition editionForm = context.getRenderingContext().getAvailableForms().get( field.getEditionForm()); final List<Map<String, Object>> nestedRawValues = new ArrayList<>(); if (rawValues != null) { rawValues.forEach(nestedValue -> { Map<String, Object> nestedRawValue = new HashMap<>(); nestedRawValues.add(nestedRawValue); prepareNestedRawValues(nestedRawValue, creationForm, nestedValue); prepareNestedRawValues(nestedRawValue, editionForm, nestedValue); }); } List<Map<String, Object>> nestedFormValues = new ArrayList<>(); nestedRawValues.forEach(rawValue -> { Map<String, Object> formValue = processor.readFormValues(creationForm, rawValue, context); formValue.putAll(processor.readFormValues(editionForm, rawValue, context)); formValue.put(MapModelRenderingContext.FORM_ENGINE_OBJECT_IDX, nestedFormValues.size()); formValue.put(MapModelRenderingContext.FORM_ENGINE_EDITED_OBJECT, Boolean.FALSE); nestedFormValues.add(formValue); }); return nestedFormValues; } @Override public List toRawValue(MultipleSubFormFieldDefinition field, List<Map<String, Object>> flatValues, List originalValues, BackendFormRenderingContext context) { final List originalObjects = originalValues != null ? originalValues : new ArrayList<>(); List fieldValue = new ArrayList(); flatValues.forEach(nestedObjectValues -> { if (nestedObjectValues.containsKey(MapModelRenderingContext.FORM_ENGINE_OBJECT_IDX)) { int originalPosition = (Integer) nestedObjectValues.get(MapModelRenderingContext.FORM_ENGINE_OBJECT_IDX); boolean edited = Boolean.TRUE.equals(nestedObjectValues.get(MapModelRenderingContext.FORM_ENGINE_EDITED_OBJECT)); if (originalPosition < originalObjects.size()) { Object originalObject = originalObjects.get(originalPosition); if (edited) { originalObject = writeObjectValues(originalObject, nestedObjectValues, field, context); } fieldValue.add(originalObject); } } else { fieldValue.add(writeObjectValues(null, nestedObjectValues, field, context)); } }); return fieldValue; } @Override public Logger getLogger() { return logger; } }