From 2ce955e7c3c53b16596a18b0f5f68f2b491d1de6 Mon Sep 17 00:00:00 2001 From: jhh Date: Mon, 27 Jan 2020 06:45:07 -0600 Subject: Schema validation extension to StandardCoder Issue-ID: POLICY-2331 Signed-off-by: jhh Change-Id: Ic3e8d21715d17a61ea5d07740dd9f4dd0dbb8641 Signed-off-by: jhh --- .../policy/common/utils/coder/StandardCoder.java | 11 +-- .../common/utils/coder/StandardValCoder.java | 110 +++++++++++++++++++++ 2 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 utils/src/main/java/org/onap/policy/common/utils/coder/StandardValCoder.java (limited to 'utils/src/main/java/org/onap/policy/common') diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java index e84a92f2..26746b79 100644 --- a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java @@ -1,8 +1,8 @@ /* * ============LICENSE_START======================================================= - * ONAP PAP + * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,7 +78,7 @@ public class StandardCoder implements Coder { try { toJson(target, object); - } catch (RuntimeException | IOException e) { + } catch (RuntimeException e) { throw new CoderException(e); } } @@ -238,9 +238,8 @@ public class StandardCoder implements Coder { * * @param target target to which to write the encoded json * @param object object to be encoded - * @throws IOException if an I/O error occurs */ - protected void toJson(Writer target, Object object) throws IOException { + protected void toJson(Writer target, Object object) { GSON.toJson(object, object.getClass(), target); } @@ -286,7 +285,7 @@ public class StandardCoder implements Coder { * @param value value to be converted * @return the converted value */ - private T convertFromDouble(Class clazz, T value) { + protected T convertFromDouble(Class clazz, T value) { if (clazz != Object.class) { return value; } diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardValCoder.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardValCoder.java new file mode 100644 index 00000000..378254b8 --- /dev/null +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardValCoder.java @@ -0,0 +1,110 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.utils.coder; + +import com.worldturner.medeia.api.JsonSchemaVersion; +import com.worldturner.medeia.api.SchemaSource; +import com.worldturner.medeia.api.StringSchemaSource; +import com.worldturner.medeia.api.ValidationFailedException; +import com.worldturner.medeia.api.gson.MedeiaGsonApi; +import com.worldturner.medeia.schema.validation.SchemaValidator; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; +import lombok.NonNull; +import lombok.ToString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Extension to the StandardCoder to support streaming validation + * against a Draft-07 Json schema specification. + */ + +@ToString +public class StandardValCoder extends StandardCoder { + + // The medeia-validator library integrates better than + // other libraries considered with GSON, and therefore + // the StandardCoder. + + private static final Logger logger = LoggerFactory.getLogger(StandardValCoder.class); + + private final MedeiaGsonApi validatorApi = new MedeiaGsonApi(); + private final SchemaValidator validator; + + /** + * StandardCoder with validation. + */ + public StandardValCoder(@NonNull String jsonSchema, @NonNull String name) { + SchemaSource schemaSource = + new StringSchemaSource(jsonSchema, JsonSchemaVersion.DRAFT07, null, name); + this.validator = validatorApi.loadSchema(schemaSource); + } + + @Override + protected String toJson(@NonNull Object object) { + StringWriter output = new StringWriter(); + toJson(output, object); + return String.valueOf(output); + } + + @Override + protected void toJson(@NonNull Writer target, @NonNull Object object) { + getGSON().toJson(object, object.getClass(), validatorApi.createJsonWriter(validator, target)); + } + + @Override + protected T fromJson(@NonNull Reader source, @NonNull Class clazz) { + return convertFromDouble(clazz, getGSON().fromJson(validatorApi.createJsonReader(validator, source), clazz)); + } + + @Override + protected T fromJson(String json, Class clazz) { + StringReader reader = new StringReader(json); + return convertFromDouble(clazz, getGSON().fromJson(validatorApi.createJsonReader(validator, reader), clazz)); + } + + /** + * Is the json conformant?. + */ + public boolean isConformant(@NonNull String json) { + try { + conformance(json); + } catch (CoderException e) { + logger.info("JSON is not conformant to schema {}", e); + return false; + } + return true; + } + + /** + * Check a json string for conformance against its schema definition. + */ + public void conformance(@NonNull String json) throws CoderException { + try { + validatorApi.parseAll(validatorApi.createJsonReader(validator, new StringReader(json))); + } catch (ValidationFailedException e) { + throw new CoderException(e); + } + } +} -- cgit 1.2.3-korg