diff options
author | Norm Traxler <normant@amdocs.com> | 2019-03-06 21:29:17 +0000 |
---|---|---|
committer | Norm Traxler <normant@amdocs.com> | 2019-03-06 21:29:53 +0000 |
commit | bcfaca57048ff16b9a68cc479497fdf0f4f7642d (patch) | |
tree | d93020300df2aa6fd2679cf7dceaf3d8ff09e32c /src/main/java | |
parent | 3b255bbe0265f6310c928485476dcc65d8652651 (diff) |
Add Audit Data Quality Summary
Issue-ID: LOG-665
Change-Id: I3ce6ca51e2d59eb27fafed6326571c24a638a27e
Signed-off-by: Norm Traxler <normant@amdocs.com>
Diffstat (limited to 'src/main/java')
3 files changed, 178 insertions, 55 deletions
diff --git a/src/main/java/org/onap/pomba/contextaggregator/datatypes/AggregatedModels.java b/src/main/java/org/onap/pomba/contextaggregator/datatypes/AggregatedModels.java index a502425..49dbefe 100644 --- a/src/main/java/org/onap/pomba/contextaggregator/datatypes/AggregatedModels.java +++ b/src/main/java/org/onap/pomba/contextaggregator/datatypes/AggregatedModels.java @@ -15,18 +15,27 @@ * limitations under the License. * ============LICENSE_END===================================================== */ + package org.onap.pomba.contextaggregator.datatypes; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; + import org.onap.pomba.common.datatypes.ModelContext; import org.onap.pomba.contextaggregator.config.EventHeaderConfig; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; public class AggregatedModels { @@ -35,53 +44,110 @@ public class AggregatedModels { Header entityHeader; @Expose @SerializedName("entity") - POAEntity poaEntity; - + PoaEntity poaEntity; /** - * Creates an event with an entity header and entity containing the models and poa-event from Dmaap + * Creates an event with an entity header and entity containing the models and + * poa-event from Dmaap. * - * @param headerConfig - * @param jsonContextMap + * @param headerConfig The event header config + * @param jsonContextMap The context map + * @param event The POA Event */ public AggregatedModels(EventHeaderConfig headerConfig, Map<String, String> jsonContextMap, POAEvent event) { entityHeader = new Header(headerConfig); Gson gson = new GsonBuilder().create(); Map<String, ModelContext> contextMap = new HashMap<>(); + List<String> errorTexts = new ArrayList<>(); + for (Entry<String, String> entry : jsonContextMap.entrySet()) { ModelContext context = null; if (entry.getValue().isEmpty()) { context = new ModelContext(); } else { context = gson.fromJson(entry.getValue(), ModelContext.class); + JsonParser parser = new JsonParser(); + JsonElement jsonElement = parser.parse(entry.getValue()); + errorTexts.addAll(extractErrors(entry.getKey(), jsonElement)); } contextMap.put(entry.getKey(), context); } - poaEntity = new POAEntity(contextMap, event); + if (errorTexts.isEmpty()) { + event.setDataQualitySummary(DataQualitySummary.ok()); + } else { + // Fill the errors: + event.setDataQualitySummary(DataQualitySummary.error(errorTexts)); + } + + poaEntity = new PoaEntity(contextMap, event); } + /** + * Recursive method to find all the dataQuality errors in the JsonElement. + * @param errorPath Path to the current element + * @param jsonElement The json element + * @return list of error strings extracted from the json element and it's children. + */ + private static List<String> extractErrors(String errorPath, JsonElement jsonElement) { + List<String> errorTexts = new ArrayList<>(); + if (jsonElement.isJsonArray()) { + JsonArray jsonArray = jsonElement.getAsJsonArray(); + for (int i = 0; i < jsonArray.size(); i++) { + JsonElement indexElement = jsonArray.get(i); + errorTexts.addAll(extractErrors(errorPath + "[" + i + "]", indexElement)); + } + } else if (jsonElement.isJsonObject()) { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + extractErrorsFromJsonObject(errorPath, errorTexts, jsonObject); + } + + return errorTexts; + } + + private static void extractErrorsFromJsonObject(String errorPath, List<String> errorTexts, JsonObject jsonObject) { + for (Entry<String, JsonElement> entrySet : jsonObject.entrySet()) { + if ("dataQuality".equals(entrySet.getKey())) { + JsonElement dqElement = entrySet.getValue(); + + JsonObject dqObject = dqElement.getAsJsonObject(); + JsonElement dqStatusElement = dqObject.get("status"); + if (dqStatusElement == null) { + continue; + } + String statusValue = dqStatusElement.getAsString(); + + if ("error".equals(statusValue)) { + JsonElement dqErrorTextElement = dqObject.get("errorText"); + if (dqErrorTextElement != null) { + String errorTextValue = dqErrorTextElement.getAsString(); + errorTexts.add(errorPath + ": " + errorTextValue); + } + } + } else { + // recursive call to extract errors from other JsonElements: + errorTexts.addAll(extractErrors(errorPath + "/" + entrySet.getKey(), entrySet.getValue())); + } + } + } /** - * Returns this instance as a JSON payload + * Returns this instance as a JSON payload. * * @return */ public String generateJsonPayload() { Gson gson = new GsonBuilder().create(); - String payload = gson.toJson(this); - return payload; + return gson.toJson(this); } public Header getEntityHeader() { return entityHeader; } - - /** - * Entity header class for JSON serialization + * Entity header class for JSON serialization. */ private class Header { @Expose @@ -117,43 +183,9 @@ public class AggregatedModels { topicName = config.getTopicName(); eventId = UUID.randomUUID().toString(); } - - - public String getId() { - return id; - } - - public String getDomain() { - return domain; - } - - public String getSourceName() { - return sourceName; - } - - public String getEventType() { - return eventType; - } - - public String getEntityType() { - return entityType; - } - - public String getTopEntityType() { - return topEntityType; - } - - public String getTopicName() { - return topicName; - } - - public String getEventId() { - return eventId; - } } - - private class POAEntity { + private class PoaEntity { @Expose @SerializedName("poa-event") POAEvent event; @@ -161,7 +193,7 @@ public class AggregatedModels { @SerializedName("context-list") private Map<String, ModelContext> contextMap; - public POAEntity(Map<String, ModelContext> contextMap, POAEvent event) { + public PoaEntity(Map<String, ModelContext> contextMap, POAEvent event) { this.contextMap = contextMap; this.event = event; } diff --git a/src/main/java/org/onap/pomba/contextaggregator/datatypes/DataQualitySummary.java b/src/main/java/org/onap/pomba/contextaggregator/datatypes/DataQualitySummary.java new file mode 100644 index 0000000..21941cc --- /dev/null +++ b/src/main/java/org/onap/pomba/contextaggregator/datatypes/DataQualitySummary.java @@ -0,0 +1,83 @@ +/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2019 Amdocs
+ * ============================================================================
+ * 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.pomba.contextaggregator.datatypes;
+
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DataQualitySummary {
+ @Expose
+ @SerializedName("status")
+ private Status status;
+ @Expose
+ @SerializedName("errors")
+ private List<String> errors = new ArrayList<>();
+
+ public enum Status {
+ ok,
+ error
+ }
+
+ public Status getStatus() {
+ return this.status;
+ }
+
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+ public List<String> getErrors() {
+ return this.errors;
+ }
+
+ public void setErrors(List<String> errors) {
+ this.errors = errors;
+ }
+
+ /**
+ * Creates an "ok" DataQualitySummary instance.
+ * @return
+ */
+ public static DataQualitySummary ok() {
+ DataQualitySummary result = new DataQualitySummary();
+ result.setStatus(Status.ok);
+ return result;
+ }
+
+ /**
+ * Creates an "error" DataQualitySummary instance.
+ * @param errors List of error descriptions
+ * @return
+ */
+ public static DataQualitySummary error(List<String> errors) {
+ DataQualitySummary result = new DataQualitySummary();
+ result.setStatus(Status.error);
+ result.setErrors(errors);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "DataQuality [status=" + this.status + ", errors=" + this.errors + "]";
+ }
+
+}
diff --git a/src/main/java/org/onap/pomba/contextaggregator/datatypes/POAEvent.java b/src/main/java/org/onap/pomba/contextaggregator/datatypes/POAEvent.java index 36b2dc9..15d1b2a 100644 --- a/src/main/java/org/onap/pomba/contextaggregator/datatypes/POAEvent.java +++ b/src/main/java/org/onap/pomba/contextaggregator/datatypes/POAEvent.java @@ -27,8 +27,7 @@ public class POAEvent { private String modelInvariantId; private String xFromAppId; private String xTransactionId; - - public POAEvent() {} + private DataQualitySummary dataQualitySummary; public String getServiceInstanceId() { return serviceInstanceId; @@ -70,6 +69,14 @@ public class POAEvent { this.xTransactionId = xTransactionId; } + public DataQualitySummary getDataQualitySummary() { + return dataQualitySummary; + } + + public void setDataQualitySummary(DataQualitySummary dataQualitySummary) { + this.dataQualitySummary = dataQualitySummary; + } + public boolean validate() throws ContextAggregatorException { final String missing = " is missing"; @@ -108,6 +115,7 @@ public class POAEvent { @Override public String toString() { return "POAEvent [serviceInstanceId=" + serviceInstanceId + ", modelVersionId=" + modelVersionId - + ", modelInvariantId=" + modelInvariantId + ", xFromAppId=" + xFromAppId + ", xTransactionId=" + xTransactionId + "]"; + + ", modelInvariantId=" + modelInvariantId + ", xFromAppId=" + xFromAppId + ", xTransactionId=" + xTransactionId + + ", dataQualitySummary=" + dataQualitySummary + "]"; } } |