diff options
author | 2024-07-19 12:14:20 +0100 | |
---|---|---|
committer | 2024-07-19 14:02:08 +0100 | |
commit | 119c725def8de2593bdd8e356212fd3078740643 (patch) | |
tree | 491b9b73e76cfb8b93cb6569a2f30ca0fb66b306 /utils/src/main | |
parent | 936d289bc32ac46baf4230a582d5020e94e39f8f (diff) |
Uplift json schema validator library
Issue-ID: POLICY-5084
Change-Id: Ic0413a07d052b62cf81fb9f128ecca892d76aa73
Signed-off-by: adheli.tavares <adheli.tavares@est.tech>
Diffstat (limited to 'utils/src/main')
6 files changed, 104 insertions, 45 deletions
diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/CoderException.java b/utils/src/main/java/org/onap/policy/common/utils/coder/CoderException.java index 60e85733..8390d175 100644 --- a/utils/src/main/java/org/onap/policy/common/utils/coder/CoderException.java +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/CoderException.java @@ -1,8 +1,7 @@ /* * ============LICENSE_START======================================================= - * ONAP PAP - * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +19,14 @@ package org.onap.policy.common.utils.coder; +import java.io.Serial; + /** * Exceptions generated by coders. */ public class CoderException extends Exception { + + @Serial private static final long serialVersionUID = 1L; public CoderException() { diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/CoderRuntimeException.java b/utils/src/main/java/org/onap/policy/common/utils/coder/CoderRuntimeException.java new file mode 100644 index 00000000..0ffd6077 --- /dev/null +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/CoderRuntimeException.java @@ -0,0 +1,35 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2024 Nordix Foundation. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.utils.coder; + +import java.io.Serial; + +/** + * Exceptions generated by coders. + */ +public class CoderRuntimeException extends RuntimeException { + + @Serial + private static final long serialVersionUID = 1L; + + public CoderRuntimeException(Throwable cause) { + super(cause); + } + +} 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 d6135afd..834a8504 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 @@ -3,6 +3,7 @@ * ONAP * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -179,7 +180,6 @@ public class StandardCoder implements Coder { public <T> T decode(String json, Class<T> clazz) throws CoderException { try { return fromJson(json, clazz); - } catch (RuntimeException e) { throw new CoderException(e); } @@ -378,7 +378,7 @@ public class StandardCoder implements Coder { /** * Used to read/write a JsonElement. */ - private static TypeAdapter<JsonElement> elementAdapter = new Gson().getAdapter(JsonElement.class); + private static final TypeAdapter<JsonElement> elementAdapter = new Gson().getAdapter(JsonElement.class); @Override public void write(JsonWriter out, StandardCoderObject value) throws IOException { diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java index 55f7f9d7..5402f37b 100644 --- a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java @@ -3,6 +3,7 @@ * ONAP * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +22,7 @@ package org.onap.policy.common.utils.coder; import com.google.gson.JsonElement; +import java.io.Serial; import java.io.Serializable; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -33,6 +35,8 @@ import lombok.Getter; */ @AllArgsConstructor(access = AccessLevel.PROTECTED) public class StandardCoderObject implements Serializable { + + @Serial private static final long serialVersionUID = 1L; /** @@ -56,9 +60,8 @@ public class StandardCoderObject implements Serializable { * Gets a field's value from this object, traversing the object hierarchy. * * @param fields field hierarchy. These may be strings, identifying fields within the - * object, or Integers, identifying an index within an array - * @return the field value or {@code null} if the field does not exist or is not a - * primitive + * object, or Integers, identifying an index within an array + * @return the field value or {@code null} if the field does not exist or is not a primitive */ public String getString(Object... fields) { @@ -87,9 +90,8 @@ public class StandardCoderObject implements Serializable { * Gets an item from an object. * * @param element object from which to extract the item - * @param field name of the field from which to extract the item - * @return the item, or {@code null} if the element is not an object or if the field - * does not exist + * @param field name of the field from which to extract the item + * @return the item, or {@code null} if the element is not an object or if the field does not exist */ protected JsonElement getFieldFromObject(JsonElement element, String field) { if (!element.isJsonObject()) { @@ -103,9 +105,8 @@ public class StandardCoderObject implements Serializable { * Gets an item from an array. * * @param element array from which to extract the item - * @param index index of the item to extract - * @return the item, or {@code null} if the element is not an array or if the index is - * out of bounds + * @param index index of the item to extract + * @return the item, or {@code null} if the element is not an array or if the index is out of bounds */ protected JsonElement getItemFromArray(JsonElement element, int index) { if (index < 0) { 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 index 4deeba14..408ae81e 100644 --- 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 @@ -1,6 +1,7 @@ /*-- * ============LICENSE_START======================================================= * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,18 +21,17 @@ 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 net.jimblackler.jsonschemafriend.GenerationException; +import net.jimblackler.jsonschemafriend.Schema; +import net.jimblackler.jsonschemafriend.SchemaStore; +import net.jimblackler.jsonschemafriend.ValidationException; +import net.jimblackler.jsonschemafriend.Validator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,31 +42,29 @@ import org.slf4j.LoggerFactory; @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; + private final Schema schema; /** * 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); + public StandardValCoder(@NonNull String jsonSchema) { + try { + SchemaStore store = new SchemaStore(); + this.schema = store.loadSchemaJson(jsonSchema); + } catch (GenerationException e) { + throw new CoderRuntimeException(e); + } } @Override protected String toPrettyJson(Object object) { - /* - * The validator strips off the "pretty" stuff (i.e., spaces), thus we have to validate and generate the pretty - * JSON in separate steps. - */ - gson.toJson(object, object.getClass(), validatorApi.createJsonWriter(validator, new StringWriter())); - + try { + validate(gsonPretty.toJson(object)); + } catch (CoderException e) { + throw new CoderRuntimeException(e); + } return super.toPrettyJson(object); } @@ -79,18 +77,28 @@ public class StandardValCoder extends StandardCoder { @Override protected void toJson(@NonNull Writer target, @NonNull Object object) { - gson.toJson(object, object.getClass(), validatorApi.createJsonWriter(validator, target)); + try { + validate(gson.toJson(object)); + } catch (CoderException e) { + throw new CoderRuntimeException(e); + } + gson.toJson(object, object.getClass(), target); } @Override protected <T> T fromJson(@NonNull Reader source, @NonNull Class<T> clazz) { - return convertFromDouble(clazz, gson.fromJson(validatorApi.createJsonReader(validator, source), clazz)); + return convertFromDouble(clazz, gson.fromJson(source, clazz)); } @Override protected <T> T fromJson(String json, Class<T> clazz) { + try { + validate(json); + } catch (CoderException e) { + throw new CoderRuntimeException(e); + } var reader = new StringReader(json); - return convertFromDouble(clazz, gson.fromJson(validatorApi.createJsonReader(validator, reader), clazz)); + return convertFromDouble(clazz, gson.fromJson(reader, clazz)); } /** @@ -99,21 +107,32 @@ public class StandardValCoder extends StandardCoder { public boolean isConformant(@NonNull String json) { try { conformance(json); - } catch (CoderException e) { - logger.info("JSON is not conformant to schema", e); + return true; + } catch (Exception e) { + logger.error("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 { + validate(json); + } + + private void validate(Object object) throws CoderException { try { - validatorApi.parseAll(validatorApi.createJsonReader(validator, new StringReader(json))); - } catch (ValidationFailedException e) { - throw new CoderException(e); + final var validator = new Validator(); + validator.validate(schema, object); + } catch (ValidationException exception) { + var error = String.format("JSON validation failed: %s", exception.getMessage()); + logger.error(error); + throw new CoderException(error); } } + + private void validate(String json) throws CoderException { + validate(gson.fromJson(json, Object.class)); + } } diff --git a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardYamlCoder.java b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardYamlCoder.java index d94ddca4..8ee2e81d 100644 --- a/utils/src/main/java/org/onap/policy/common/utils/coder/StandardYamlCoder.java +++ b/utils/src/main/java/org/onap/policy/common/utils/coder/StandardYamlCoder.java @@ -3,6 +3,7 @@ * ONAP * ================================================================================ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +25,8 @@ import java.io.Reader; import java.io.Writer; /** - * YAML encoder and decoder using the "standard" mechanism, which is currently gson. All - * of the methods perform conversion to/from YAML (instead of JSON). + * YAML encoder and decoder using the "standard" mechanism, which is currently gson. + * All the methods perform conversion to/from YAML (instead of JSON). */ public class StandardYamlCoder extends StandardCoder { private final YamlJsonTranslator translator; |