All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zuunr.forms.generation.FieldMerger Maven / Gradle / Ivy

/*
 * Copyright 2018 Zuunr AB
 *
 * 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 com.zuunr.forms.generation;

import com.zuunr.forms.FormField;
import com.zuunr.json.JsonObject;
import com.zuunr.json.JsonObjectMerger;

/**
 * @author Niklas Eldberger
 */
public class FieldMerger {

    private static final JsonObjectMerger jsonObjectMerger = new JsonObjectMerger();
    private static final ObjectMerger objectMerger = new ObjectMerger();
    private static final StringMerger stringMerger = new StringMerger();
    private static final ArrayMerger arrayMerger = new ArrayMerger();
    private static final EqualsMerger equalsMerger = new EqualsMerger();
    private static final TypeMerger typeMerger = new TypeMerger();
    private static final IntegerMerger integerMerger = new IntegerMerger();
    private static final DecimalMerger decimalMerger = new DecimalMerger();
    private static final DateMerger dateMerger = new DateMerger();
    private static final OptionsMerger optionsMerger = new OptionsMerger();


    public FormField mergeFormField(FormField formField1, FormField formField2, MergeStrategy mergeStrategy) {

        FormField result;
        if (mergeStrategy.hardenFormField) {

            if (formField1 == null) {
                result = formField2;
            } else if (formField2 == null) {
                result = formField1;
            } else {
                result = mergeFormFieldInternal(formField1, formField2, mergeStrategy).as(FormField.class).builder()
                        .required((
                                formField1 != null && formField1.required() != null && formField1.required()) ||
                                (formField2 != null && formField2.required() != null && formField2.required())
                        ).build();
            }
        } else if (mergeStrategy.patchFormField) {
            if (formField1 == null) {
                result = null;
            } else if (formField2 == null) {
                result = formField1;
            } else {
                result = mergeFormFieldInternal(formField1, formField2, mergeStrategy).as(FormField.class).builder().type(formField1.type()).required(formField1.required() != null && formField1.required()).build();
            }
        } else if (mergeStrategy == MergeStrategy.SOFTEN) {
            Boolean required = formField1 != null && formField2 != null && formField1.required() != null && formField1.required() && formField2.required() != null && formField2.required();
            result = mergeFormFieldInternal(
                    formField1,
                    formField2,
                    mergeStrategy).as(FormField.class)
                    .builder().required(required).build();
        } else {
            throw new RuntimeException("Only HARDEN, PATCH and SOFTEN is supported");
        }
        return result;
    }

    private JsonObject mergeFormFieldInternal(FormField formField1, FormField formField2, MergeStrategy mergeStrategy) {


        JsonObject result;
        if (mergeStrategy.patchFormField) {

            String type = formField2.type() == null ? formField1.type().toString() : formField2.type().toString();
            result = jsonObjectMerger.merge(formField1.asJsonObject(), formField2.asJsonObject());

            if ("object".equals(type)) {
                result = objectMerger.merge(formField1, formField2, result, mergeStrategy);
            } else if ("array".equals(type) || "set".equals(type)) {
                result = arrayMerger.mergeArray(formField1, formField2, result, mergeStrategy);
            }

        } else if (mergeStrategy.softenFormField) {

            if (formField1 == null) {
                formField1 = formField2;
            } else if (formField2 == null) {
                formField2 = formField1;
            }

            String name = formField1.name() != null ? formField1.name() : formField2.name();

            result = JsonObject.EMPTY.put("name", name);

            // required
            result = result.put("required", formField1.required() != null && formField1.required() && formField2.required() != null && formField2.required());

            // nullable
            result = result.put("nullable", (formField1.nullable() != null && formField1.nullable()) || (formField2.nullable() != null && formField2.nullable()));

            // mustBeNull
            result = result.put("mustBeNull", formField1.mustBeNull() != null && formField1.mustBeNull() && formField2.mustBeNull() != null && formField2.mustBeNull());

            JsonObject r = result;
            result = equalsMerger.merge(formField1.asJsonObject(), formField2.asJsonObject(), result);

            // type
            result = typeMerger.merge(formField1.asJsonObject(), formField2.asJsonObject(), result, mergeStrategy);

            String type = result.get("type", "string").getValue(String.class);
            if ("string".equals(type)) {
                result = stringMerger.mergeString(formField1, formField2, mergeStrategy, result);
            } else if ("integer".equals(type)) {
                result = integerMerger.merge(formField1, formField2, result, mergeStrategy);
            } else if ("decimal".equals(type)) {
                result = decimalMerger.merge(formField1, formField2, result, mergeStrategy);
            } else if ("object".equals(type)) {
                result = objectMerger.merge(formField1, formField2, result, mergeStrategy);
            } else if ("array".equals(type) || "set".equals(type)) {
                result = arrayMerger.mergeArray(formField1, formField2, result, mergeStrategy);
            } else if ("date".equals(type)){
                result = dateMerger.mergeDate(formField1, formField2, result, mergeStrategy);
            } else if ("datetime".equals(type)){
                result = dateMerger.mergeDate(formField1, formField2, result, mergeStrategy);
            }

            result = optionsMerger.soften(formField1, formField2, result);


        } else if (mergeStrategy.hardenFormField) {
            if (formField1 == null) {
                formField1 = formField2;
            } else if (formField2 == null) {
                formField2 = formField1;
            }

            String name = formField1.name() != null ? formField1.name() : formField2.name();

            result = JsonObject.EMPTY.put("name", name);

            // required
            Boolean required = formField1.required() != null && formField1.required() || formField2.required() != null && formField2.required();
            result = result.put("required", required);

            // nullable

            Boolean nullable = formField1 != null && formField1.nullable() != null && formField1.nullable() && formField2 != null && formField2.nullable() != null && formField2.nullable();
            result = result.put("nullable", nullable);

            // mustBeNull
            Boolean mustBeNull = (formField1.mustBeNull() != null && formField1.mustBeNull()) || (formField2.mustBeNull() != null && formField2.mustBeNull());
            result = result.put("mustBeNull", mustBeNull);

            if (mustBeNull && !nullable && required) {
                result = null; // Maybe throw exception here?
            } else {

                JsonObject r = result;
                result = equalsMerger.merge(formField1.asJsonObject(), formField2.asJsonObject(), result);

                // type
                result = typeMerger.merge(formField1.asJsonObject(), formField2.asJsonObject(), result, mergeStrategy);

                String type = result.get("type", "string").getValue(String.class);
                if ("string".equals(type)) {
                    result = stringMerger.mergeString(formField1, formField2, mergeStrategy, result);
                } else if ("integer".equals(type)) {
                    result = integerMerger.merge(formField1, formField2, result, mergeStrategy);
                } else if ("decimal".equals(type)) {
                    result = decimalMerger.merge(formField1, formField2, result, mergeStrategy);
                } else if ("object".equals(type)) {
                    result = objectMerger.merge(formField1, formField2, result, mergeStrategy);
                } else if ("array".equals(type) || "set".equals(type)) {
                    result = arrayMerger.mergeArray(formField1, formField2, result, mergeStrategy);
                } else if ("date".equals(type)){
                    result = dateMerger.mergeDate(formField1, formField2, result, mergeStrategy);
                }
            }

            result = optionsMerger.harden(formField1, formField2, result);

        } else {
            throw new RuntimeException("Merge strategy is not implemented");
        }
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy