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

com.zuunr.jsonschema.JsonSchemaMerger Maven / Gradle / Ivy

package com.zuunr.jsonschema;

import com.zuunr.forms.ValueFormat;
import com.zuunr.forms.generation.FormMerger;
import com.zuunr.json.JsonArray;
import com.zuunr.json.JsonObject;
import com.zuunr.json.JsonValue;

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

    public static final JsonSchemaMerger JSON_SCHEMA_2019_09 = new JsonSchemaMerger(new ValueFormatConverter());
    public static final JsonSchemaMerger OPENAPI_3_0_STYLE = new JsonSchemaMerger(openApiStyleValueFormatConverter());

    private final JsonSchemaConverter jsonSchemaConverter = new JsonSchemaConverter();
    private final FormMerger formMerger = new FormMerger();
    private final ValueFormatConverter valueFormatConverter;

    public JsonSchemaMerger() {
        this(new ValueFormatConverter());
    }

    public JsonSchemaMerger(ValueFormatConverter valueFormatConverter) {
        this.valueFormatConverter = valueFormatConverter;
    }

    private static ValueFormatConverter openApiStyleValueFormatConverter() {
        return new ValueFormatConverter(valueFormat -> {
            JsonObject result = JsonObject.EMPTY;

            String valueFormatType = valueFormat.asExplicitValueFormat().type().toString();
            String schemaType = ValueFormatConverter.TYPE_MAPPING.get(JsonArray.of(valueFormatType, "type", 0), JsonValue.NULL).asString();
            if (schemaType != null) {
                result = result.put("type", schemaType);
            }
            if (valueFormat.asExplicitValueFormat().nullable()) {
                result = result.put("nullable", true);
            }
            return result;
        });
    }

    public JsonValue intersectionOf (JsonValue jsonSchema1, JsonValue jsonSchema2, boolean simplifyAlwaysFailingSchema) {
        ValueFormat valueFormat1 = jsonSchemaConverter.translate(jsonSchema1);
        ValueFormat valueFormat2 = jsonSchemaConverter.translate(jsonSchema2);
        ValueFormat intersection = formMerger.intersectionOf(valueFormat1, valueFormat2);
        if (simplifyAlwaysFailingSchema && intersection.alwaysFails()) {
            return JsonValue.FALSE;
        } else {
            return valueFormatConverter.translate(intersection.asCompactValueFormat()).jsonValue();
        }
    }

    public JsonValue unionOf(JsonValue jsonSchema1, JsonValue jsonSchema2) {
        ValueFormat valueFormat1 = jsonSchemaConverter.translate(jsonSchema1);
        ValueFormat valueFormat2 = jsonSchemaConverter.translate(jsonSchema2);
        ValueFormat union = formMerger.unionOf(valueFormat1.asFormatOfTypeObjectWithElementField().form(), valueFormat2.asFormatOfTypeObjectWithElementField().form()).formField("element").asValueFormat();
        return valueFormatConverter.translate(union.asCompactValueFormat()).jsonValue();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy