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