+/**\r
+ * ============LICENSE_START=======================================================\r
+ * org.onap.aai\r
+ * ================================================================================\r
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.\r
+ * Copyright © 2017-2018 Amdocs\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+package org.onap.aai.datarouter.policy;\r
+\r
+import com.google.gson.JsonArray;\r
+import com.google.gson.JsonElement;\r
+import com.google.gson.JsonObject;\r
+import com.google.gson.JsonParser;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import org.apache.camel.Exchange;\r
+import org.onap.aai.cl.api.Logger;\r
+import org.onap.aai.cl.eelf.LoggerFactory;\r
+import org.onap.aai.cl.mdc.MdcContext;\r
+import org.onap.aai.restclient.client.Headers;\r
+import org.onap.aai.datarouter.logging.ServiceIntegrityValidationsMsgs;\r
+import org.onap.aai.datarouter.util.SearchServiceAgent;\r
+import org.slf4j.MDC;\r
+\r
+/**\r
+ * This class handles the logic which transformers the POA-AUDIT-RESULT event message to the ElasticSearch validation/violation message\r
+ * in order to prepare two Json structures, one for validation index and one for violation index and then submit POST request to\r
+ * Search-Data-Service to insert the document into ES.\r
+ *\r
+ */\r
+public class ServiceIntegrityValidationPolicy {\r
+\r
+ private static final String SERVICE_VALIDATION_SCHEMA_FILE = "auditservice_validation_schema.json";\r
+ private static final String SERVICE_VIOLATION_SCHEMA_FILE = "auditservice_violation_schema.json";\r
+\r
+ private static Logger logger = LoggerFactory.getInstance()\r
+ .getLogger(ServiceIntegrityValidationPolicy.class.getSimpleName());\r
+\r
+ private static JsonParser jsonParser = new JsonParser();\r
+\r
+ private String validationIndexName = null;\r
+ private String violationIndexName = null;\r
+\r
+ private SearchServiceAgent searchAgent = null;\r
+\r
+ public ServiceIntegrityValidationPolicy(String searchCertPath,\r
+ String searchCertTruststore,\r
+ String searchCertPassword,\r
+ String searchBaseURL,\r
+ String endpoint,\r
+ String validationIndexName,\r
+ String violationIndexName) {\r
+ searchAgent = new SearchServiceAgent(searchCertPath,\r
+ searchCertTruststore,\r
+ searchCertPassword,\r
+ concatSubURI(searchBaseURL, endpoint),\r
+ "documents",\r
+ logger);\r
+\r
+ this.validationIndexName = validationIndexName;\r
+ this.violationIndexName = violationIndexName;\r
+ }\r
+\r
+ public void startup(){\r
+\r
+ searchAgent.createSearchIndex(validationIndexName, SERVICE_VALIDATION_SCHEMA_FILE);\r
+ searchAgent.createSearchIndex(violationIndexName, SERVICE_VIOLATION_SCHEMA_FILE);\r
+\r
+ logger.info(ServiceIntegrityValidationsMsgs.SI_POLICY_REGISTRATION);\r
+ }\r
+\r
+ public void process(Exchange exchange) throws Exception {\r
+\r
+ logger.debug("Invoking ServiceIntegrityViolationPolicy with payload" + exchange.getIn().getBody());\r
+\r
+ String payload = (String)exchange.getIn().getBody();\r
+\r
+ JsonObject serviceValidation = jsonParser.parse(payload).getAsJsonObject();\r
+ JsonElement serviceViolationsElement = serviceValidation.get("violations");\r
+ // Calculate the document id to use for this entity.\r
+ JsonElement id = serviceValidation.get("validationId");\r
+\r
+ if(serviceViolationsElement == null || serviceViolationsElement.getAsJsonArray().size() == 0) {\r
+ serviceValidation.addProperty("result", "Pass");\r
+ logger.debug("Service integrity validation event processing for event with ID " + id + " as a Pass due to no violations.");\r
+ }else {\r
+ serviceValidation.addProperty("result", "Fail");\r
+ logger.debug("Service integrity validation event processing for event with ID " + id + " as a Fail due to one or more violations.");\r
+ }\r
+\r
+ if(serviceViolationsElement != null) {\r
+ JsonArray violationsArray = serviceViolationsElement.getAsJsonArray();\r
+ Iterator<JsonElement> vit = violationsArray.iterator();\r
+ while(vit.hasNext()) {\r
+ JsonObject currentViolation = vit.next().getAsJsonObject();\r
+ JsonObject oldViolationDetails = currentViolation.getAsJsonObject("violationDetails");\r
+ JsonObject newViolationDetails = new JsonObject();\r
+ for (Map.Entry<String, JsonElement> e : oldViolationDetails.entrySet()) {\r
+ String oldKey = e.getKey();\r
+ String newKey = oldKey.replace(".","-");\r
+ newViolationDetails.add(newKey,e.getValue());\r
+ }\r
+ currentViolation.remove("violationDetails");\r
+ currentViolation.remove("modelName");\r
+ currentViolation.add("violationDetails",newViolationDetails);\r
+ logger.debug("new violation:" + currentViolation.toString());\r
+ JsonObject formattedViolation = buildViolation(serviceValidation, currentViolation);\r
+\r
+ handleSearchDataServiceOperation(violationIndexName, null, formattedViolation.toString(), "POST");\r
+\r
+ }\r
+ }\r
+ logger.debug("validation: " + serviceValidation.toString());\r
+\r
+ JsonObject formattedValidation = buildValidation(serviceValidation);\r
+ // Persist the entity that we received from the event to the Search Service.\r
+ handleSearchDataServiceOperation(validationIndexName, id.getAsString(), formattedValidation.toString(), "PUT");\r
+\r
+ }\r
+\r
+\r
+ private JsonObject buildViolation(JsonObject validation, JsonObject violation) {\r
+ JsonObject formattedViolation = new JsonObject();\r
+\r
+ formattedViolation.addProperty("validationId", validation.get("validationId").getAsString());\r
+ formattedViolation.addProperty("validationTimestamp", validation.get("validationTimestamp").getAsString());\r
+ formattedViolation.addProperty("modelVersionId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelVersionId").getAsString());\r
+ formattedViolation.addProperty("modelInvariantId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelInvariantId").getAsString());\r
+ formattedViolation.addProperty("serviceInstanceId",validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("serviceInstanceId").getAsString());\r
+\r
+ formattedViolation.addProperty("violationId", violation.get("violationId").getAsString());\r
+ formattedViolation.addProperty("violationTimestamp", validation.get("validationTimestamp").getAsString());\r
+ formattedViolation.addProperty("category", violation.get("category").getAsString());\r
+ formattedViolation.addProperty("severity", violation.get("severity").getAsString());\r
+ formattedViolation.addProperty("violationType", violation.get("violationType").getAsString());\r
+ formattedViolation.addProperty("validationRule", violation.get("validationRule").getAsString());\r
+ formattedViolation.addProperty("message", violation.get("errorMessage").getAsString());\r
+\r
+ //formattedViolation.add("violationDetails",violation.get("violationDetails"));\r
+ return formattedViolation;\r
+ }\r
+\r
+ private JsonObject buildValidation(JsonObject validation) {\r
+ JsonObject formattedValidation = new JsonObject();\r
+\r
+ formattedValidation.add("violations", validation.get("violations"));\r
+ formattedValidation.addProperty("validationId", validation.get("validationId").getAsString());\r
+ formattedValidation.addProperty("validationTimestamp", validation.get("validationTimestamp").getAsString());\r
+ formattedValidation.addProperty("modelVersionId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelVersionId").getAsString());\r
+ formattedValidation.addProperty("modelInvariantId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelInvariantId").getAsString());\r
+ formattedValidation.addProperty("serviceInstanceId",validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("serviceInstanceId").getAsString());\r
+\r
+ try {\r
+ formattedValidation.addProperty("modelName", validation.get("entity").getAsJsonObject().get("context-list").getAsJsonObject().get("sdc").getAsJsonObject().get("service").getAsJsonObject().get("name").getAsString());\r
+ logger.debug("model name: " + validation.get("entity").getAsJsonObject().get("context-list").getAsJsonObject().get("sdc").getAsJsonObject().get("service").getAsJsonObject().get("name").getAsString());\r
+ }catch (NullPointerException ex){\r
+ ex.printStackTrace();\r
+ formattedValidation.addProperty("modelName","");\r
+ }\r
+\r
+ return formattedValidation;\r
+ }\r
+\r
+\r
+ private static String concatSubURI(String... suburis) {\r
+ String finalURI = "";\r
+\r
+ for (String suburi : suburis) {\r
+\r
+ if (suburi != null) {\r
+ // Remove any leading / since we only want to append /\r
+ suburi = suburi.replaceFirst("^/*", "");\r
+\r
+ // Add a trailing / if one isn't already there\r
+ finalURI += suburi.endsWith("/") ? suburi : suburi + "/";\r
+ }\r
+ }\r
+\r
+ return finalURI;\r
+ }\r
+\r
+\r
+ public void handleSearchDataServiceOperation(String index, String id, String payload, String action) {\r
+\r
+ Map<String, List<String>> headers = new HashMap<>();\r
+ headers.put(Headers.FROM_APP_ID, Arrays.asList("DataRouter"));\r
+ headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));\r
+\r
+ if (action.equalsIgnoreCase("PUT")) {\r
+ searchAgent.putDocument(index, id, payload, headers);\r
+\r
+ }else if (action.equalsIgnoreCase("POST")) {\r
+ searchAgent.postDocument(index, payload, headers);\r
+ }\r
+\r
+ }\r
+}\r