From bcfaca57048ff16b9a68cc479497fdf0f4f7642d Mon Sep 17 00:00:00 2001 From: Norm Traxler Date: Wed, 6 Mar 2019 21:29:17 +0000 Subject: Add Audit Data Quality Summary Issue-ID: LOG-665 Change-Id: I3ce6ca51e2d59eb27fafed6326571c24a638a27e Signed-off-by: Norm Traxler --- .../datatypes/AggregatedModels.java | 136 +++++++++++++-------- .../datatypes/DataQualitySummary.java | 83 +++++++++++++ .../contextaggregator/datatypes/POAEvent.java | 14 ++- 3 files changed, 178 insertions(+), 55 deletions(-) create mode 100644 src/main/java/org/onap/pomba/contextaggregator/datatypes/DataQualitySummary.java (limited to 'src/main/java') 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 jsonContextMap, POAEvent event) { entityHeader = new Header(headerConfig); Gson gson = new GsonBuilder().create(); Map contextMap = new HashMap<>(); + List errorTexts = new ArrayList<>(); + for (Entry 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 extractErrors(String errorPath, JsonElement jsonElement) { + List 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 errorTexts, JsonObject jsonObject) { + for (Entry 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 contextMap; - public POAEntity(Map contextMap, POAEvent event) { + public PoaEntity(Map 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 errors = new ArrayList<>(); + + public enum Status { + ok, + error + } + + public Status getStatus() { + return this.status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public List getErrors() { + return this.errors; + } + + public void setErrors(List 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 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 + "]"; } } -- cgit 1.2.3-korg