aboutsummaryrefslogtreecommitdiffstats
path: root/utils/src/main
diff options
context:
space:
mode:
authoradheli.tavares <adheli.tavares@est.tech>2024-07-19 12:14:20 +0100
committeradheli.tavares <adheli.tavares@est.tech>2024-07-19 14:02:08 +0100
commit119c725def8de2593bdd8e356212fd3078740643 (patch)
tree491b9b73e76cfb8b93cb6569a2f30ca0fb66b306 /utils/src/main
parent936d289bc32ac46baf4230a582d5020e94e39f8f (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')
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/CoderException.java7
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/CoderRuntimeException.java35
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoder.java4
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardCoderObject.java19
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardValCoder.java79
-rw-r--r--utils/src/main/java/org/onap/policy/common/utils/coder/StandardYamlCoder.java5
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;