X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fdatarouter%2Fpolicy%2FEntityEventPolicy.java;h=b6b7fd860e9d54d37a752dace1a74d5fe72ef3df;hb=837e78b35e405bb3a9450e73eb47632089041fb9;hp=7c7965e5c88756fb49a63a48e7e455b9e61adebb;hpb=7af00564f04e1b8f441536fce5bdf31d59fe722c;p=aai%2Fdata-router.git diff --git a/src/main/java/org/onap/aai/datarouter/policy/EntityEventPolicy.java b/src/main/java/org/onap/aai/datarouter/policy/EntityEventPolicy.java index 7c7965e..b6b7fd8 100644 --- a/src/main/java/org/onap/aai/datarouter/policy/EntityEventPolicy.java +++ b/src/main/java/org/onap/aai/datarouter/policy/EntityEventPolicy.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 Amdocs + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 Amdocs * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.datarouter.policy; @@ -39,26 +37,27 @@ import org.apache.camel.Processor; import org.eclipse.persistence.dynamic.DynamicType; import org.eclipse.persistence.internal.helper.DatabaseField; import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; +import org.eclipse.persistence.oxm.MediaType; import org.json.JSONException; import org.json.JSONObject; import org.onap.aai.datarouter.entity.AaiEventEntity; import org.onap.aai.datarouter.entity.AggregationEntity; import org.onap.aai.datarouter.entity.DocumentStoreDataEntity; -import org.onap.aai.datarouter.entity.OxmEntityDescriptor; import org.onap.aai.datarouter.entity.SuggestionSearchEntity; import org.onap.aai.datarouter.entity.TopographicalEntity; import org.onap.aai.datarouter.entity.UebEventHeader; import org.onap.aai.datarouter.logging.EntityEventPolicyMsgs; -import org.onap.aai.datarouter.util.CrossEntityReference; -import org.onap.aai.datarouter.util.EntityOxmReferenceHelper; -import org.onap.aai.datarouter.util.ExternalOxmModelProcessor; import org.onap.aai.datarouter.util.NodeUtils; -import org.onap.aai.datarouter.util.OxmModelLoader; import org.onap.aai.datarouter.util.RouterServiceUtil; import org.onap.aai.datarouter.util.SearchServiceAgent; import org.onap.aai.datarouter.util.SearchSuggestionPermutation; -import org.onap.aai.datarouter.util.Version; -import org.onap.aai.datarouter.util.VersionedOxmEntities; +import org.onap.aai.entity.OxmEntityDescriptor; +import org.onap.aai.util.CrossEntityReference; +import org.onap.aai.util.EntityOxmReferenceHelper; +import org.onap.aai.util.ExternalOxmModelProcessor; +import org.onap.aai.schema.OxmModelLoader; +import org.onap.aai.util.Version; +import org.onap.aai.util.VersionedOxmEntities; import org.onap.aai.cl.api.Logger; import org.onap.aai.cl.eelf.LoggerFactory; import org.onap.aai.cl.mdc.MdcContext; @@ -76,20 +75,20 @@ import com.fasterxml.jackson.databind.node.ObjectNode; public class EntityEventPolicy implements Processor { public static final String additionalInfo = "Response of AAIEntityEventPolicy"; - private static final String entitySearchSchema = "entitysearch_schema.json"; - private static final String topographicalSearchSchema = "topographysearch_schema.json"; + private static final String ENTITY_SEARCH_SCHEMA = "entitysearch_schema.json"; + private static final String TOPOGRAPHICAL_SEARCH_SCHEMA = "topographysearch_schema.json"; private Collection externalOxmModelProcessors; - private final String EVENT_HEADER = "event-header"; - private final String ENTITY_HEADER = "entity"; - private final String ACTION_CREATE = "create"; - private final String ACTION_DELETE = "delete"; - private final String ACTION_UPDATE = "update"; - private final String PROCESS_AAI_EVENT = "Process AAI Event"; - private final String TOPO_LAT = "latitude"; - private final String TOPO_LONG = "longitude"; + private static final String EVENT_HEADER = "event-header"; + private static final String ENTITY_HEADER = "entity"; + private static final String ACTION_CREATE = "create"; + private static final String ACTION_DELETE = "delete"; + private static final String ACTION_UPDATE = "update"; + private static final String PROCESS_AAI_EVENT = "Process AAI Event"; + private static final String TOPO_LAT = "latitude"; + private static final String TOPO_LONG = "longitude"; - private final List SUPPORTED_ACTIONS = + private static final List SUPPORTED_ACTIONS = Arrays.asList(ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE); Map oxmVersionContextMap = new HashMap<>(); @@ -97,16 +96,16 @@ public class EntityEventPolicy implements Processor { /** Agent for communicating with the Search Service. */ private SearchServiceAgent searchAgent = null; - + /** Search index name for storing AAI event entities. */ private String entitySearchIndex; /** Search index name for storing topographical search data. */ private String topographicalSearchIndex; - + /** Search index name for suggestive search data. */ private String aggregateGenericVnfIndex; - + private String autosuggestIndex; private String srcDomain; @@ -130,7 +129,8 @@ public class EntityEventPolicy implements Processor { entitySearchIndex = config.getSearchEntitySearchIndex(); topographicalSearchIndex = config.getSearchTopographySearchIndex(); aggregateGenericVnfIndex = config.getSearchAggregationVnfIndex(); - + autosuggestIndex = config.getSearchEntityAutoSuggestIndex(); + // Instantiate the agent that we will use for interacting with the Search Service. searchAgent = new SearchServiceAgent(config.getSearchCertName(), config.getSearchKeystore(), @@ -171,11 +171,11 @@ public class EntityEventPolicy implements Processor { } public void startup() { - + // Create the indexes in the search service if they do not already exist. - searchAgent.createSearchIndex(entitySearchIndex, entitySearchSchema); - searchAgent.createSearchIndex(topographicalSearchIndex, topographicalSearchSchema); - + searchAgent.createSearchIndex(entitySearchIndex, ENTITY_SEARCH_SCHEMA); + searchAgent.createSearchIndex(topographicalSearchIndex, TOPOGRAPHICAL_SEARCH_SCHEMA); + logger.info(EntityEventPolicyMsgs.ENTITY_EVENT_POLICY_REGISTERED); } @@ -203,11 +203,11 @@ public class EntityEventPolicy implements Processor { } public void returnWithError(Exchange exchange, String payload, String errorMsg){ - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, errorMsg); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, errorMsg, payload); + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, errorMsg); + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, errorMsg, payload); setResponse(exchange, ResponseType.FAILURE, additionalInfo); } - + @Override public void process(Exchange exchange) throws Exception { @@ -230,7 +230,7 @@ public class EntityEventPolicy implements Processor { returnWithError(exchange, uebPayload, "Payload is missing " + EVENT_HEADER); return; } - + JSONObject uebObjEntity = getUebContentAsJson(uebPayload, ENTITY_HEADER); if (uebObjEntity == null) { returnWithError(exchange, uebPayload, "Payload is missing " + ENTITY_HEADER); @@ -243,19 +243,19 @@ public class EntityEventPolicy implements Processor { // Get src domain from header; discard event if not originated from same domain String payloadSrcDomain = eventHeader.getDomain(); if (payloadSrcDomain == null || !payloadSrcDomain.equalsIgnoreCase(this.srcDomain)) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Unrecognized source domain '" + payloadSrcDomain + "'", uebPayload); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Unrecognized source domain '" + payloadSrcDomain + "'"); setResponse(exchange, ResponseType.SUCCESS, additionalInfo); return; } - DynamicJAXBContext oxmJaxbContext = loadOxmContext(oxmVersion.toLowerCase()); + DynamicJAXBContext oxmJaxbContext = loadOxmContext(oxmVersion); if (oxmJaxbContext == null) { logger.error(EntityEventPolicyMsgs.OXM_VERSION_NOT_SUPPORTED, oxmVersion); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, "OXM version mismatch", + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "OXM version mismatch", uebPayload); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -264,9 +264,9 @@ public class EntityEventPolicy implements Processor { String action = eventHeader.getAction(); if (action == null || !SUPPORTED_ACTIONS.contains(action.toLowerCase())) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Unrecognized action '" + action + "'", uebPayload); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Unrecognized action '" + action + "'"); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -275,9 +275,9 @@ public class EntityEventPolicy implements Processor { String entityType = eventHeader.getEntityType(); if (entityType == null) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Payload header missing entity type", uebPayload); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload header missing entity type"); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -286,9 +286,9 @@ public class EntityEventPolicy implements Processor { String topEntityType = eventHeader.getTopEntityType(); if (topEntityType == null) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Payload header missing top entity type", uebPayload); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload header top missing entity type"); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -297,9 +297,9 @@ public class EntityEventPolicy implements Processor { String entityLink = eventHeader.getEntityLink(); if (entityLink == null) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Payload header missing entity link", uebPayload); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload header missing entity link"); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -307,25 +307,21 @@ public class EntityEventPolicy implements Processor { } // log the fact that all data are in good shape - logger.info(EntityEventPolicyMsgs.PROCESS_AAI_ENTITY_EVENT_POLICY_NONVERBOSE, action, + logger.info(EntityEventPolicyMsgs.PROCESS_ENTITY_EVENT_POLICY_NONVERBOSE, action, entityType); - logger.debug(EntityEventPolicyMsgs.PROCESS_AAI_ENTITY_EVENT_POLICY_VERBOSE, action, entityType, + logger.debug(EntityEventPolicyMsgs.PROCESS_ENTITY_EVENT_POLICY_VERBOSE, action, entityType, uebPayload); // Process for building AaiEventEntity object - String[] entityTypeArr = entityType.split("-"); - String oxmEntityType = ""; - for (String entityWord : entityTypeArr) { - oxmEntityType += entityWord.substring(0, 1).toUpperCase() + entityWord.substring(1); - } + String oxmEntityType = new OxmEntityTypeConverter().convert(entityType); List searchableAttr = getOxmAttributes(uebPayload, oxmJaxbContext, oxmEntityType, entityType, "searchable"); if (searchableAttr == null) { - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Searchable attribute not found for payload entity type '" + entityType + "'"); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Searchable attribute not found for payload entity type '" + entityType + "'", uebPayload); @@ -337,9 +333,9 @@ public class EntityEventPolicy implements Processor { getEntityPrimaryKeyFieldName(oxmJaxbContext, uebPayload, oxmEntityType, entityType); String entityPrimaryKeyFieldValue = lookupValueUsingKey(uebPayload, entityPrimaryKeyFieldName); if (entityPrimaryKeyFieldValue == null || entityPrimaryKeyFieldValue.isEmpty()) { - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload missing primary key attribute"); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Payload missing primary key attribute", uebPayload); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -358,9 +354,9 @@ public class EntityEventPolicy implements Processor { aaiEventEntity.setLink(entityLink); if (!getSearchTags(aaiEventEntity, searchableAttr, uebPayload, action)) { - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload missing searchable attribute for entity type '" + entityType + "'"); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Payload missing searchable attribute for entity type '" + entityType + "'", uebPayload); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -372,9 +368,9 @@ public class EntityEventPolicy implements Processor { aaiEventEntity.deriveFields(); } catch (NoSuchAlgorithmException e) { - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Cannot create unique SHA digest"); - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, "Cannot create unique SHA digest", uebPayload); setResponse(exchange, ResponseType.FAILURE, additionalInfo); @@ -390,20 +386,20 @@ public class EntityEventPolicy implements Processor { * Use the versioned OXM Entity class to get access to cross-entity reference helper collections */ VersionedOxmEntities oxmEntities = - EntityOxmReferenceHelper.getInstance().getVersionedOxmEntities(Version.valueOf(oxmVersion)); + EntityOxmReferenceHelper.getInstance().getVersionedOxmEntities(Version.valueOf(oxmVersion.toLowerCase())); /** * NOTES: * 1. If the entity type is "customer", the below check will return true if any nested entityType * in that model could contain a CER based on the OXM model version that has been loaded. - * 2. For a DELETE operation on outer/parent entity (handled by the regular flow: + * 2. For a DELETE operation on outer/parent entity (handled by the regular flow: * handleSearchServiceOperation()), ignore processing for cross-entity-reference under the * assumption that AAI will push down all required cascade-deletes for nested entities as well * 3. Handling the case where UEB events arrive out of order: CREATE customer is received before * CREATE service-instance. */ - if (!action.equalsIgnoreCase(ACTION_DELETE) && oxmEntities != null + if (!action.equalsIgnoreCase(ACTION_DELETE) && oxmEntities != null && oxmEntities.entityModelContainsCrossEntityReference(topEntityType)) { // We know the model "can" contain a CER reference definition, let's process a bit more @@ -413,122 +409,116 @@ public class EntityEventPolicy implements Processor { JSONObject entityJsonObject = getUebEntity(uebPayload); - JsonNode entityJsonNode = convertToJsonNode(entityJsonObject.toString()); - - String parentEntityType = entityType; - - String targetEntityUrl = entityLink; + if (entityJsonObject != null) { + JsonNode entityJsonNode = convertToJsonNode(entityJsonObject.toString()); - for (Map.Entry entry : crossEntityRefMap.entrySet()) { + String parentEntityType = entityType; - /* - * if we know service-subscription is in the tree, then we can pull our all instances and - * process from there. - */ + String targetEntityUrl = entityLink; - String key = entry.getKey(); - CrossEntityReference cerDescriptor = entry.getValue(); + for (Map.Entry entry : crossEntityRefMap.entrySet()) { - ArrayList foundNodes = new ArrayList<>(); + /* + * if we know service-subscription is in the tree, then we can pull our all instances and process + * from there. + */ - RouterServiceUtil.extractObjectsByKey(entityJsonNode, key, foundNodes); + String key = entry.getKey(); + CrossEntityReference cerDescriptor = entry.getValue(); - if (!foundNodes.isEmpty()) { + ArrayList foundNodes = new ArrayList<>(); - for (JsonNode n : foundNodes) { - if ("customer".equalsIgnoreCase(parentEntityType)){ - /* - * NOTES: - * 1. prepare to hand-create url for service-instance - * 2. this will break if the URL structure for service-instance changes - */ - if (n.has("service-type")){ - targetEntityUrl += "/service-subscriptions/service-subscription/" - + RouterServiceUtil.getNodeFieldAsText(n, "service-type") - + "/service-instances/service-instance/"; - } - - } + RouterServiceUtil.extractObjectsByKey(entityJsonNode, key, foundNodes); - List extractedParentEntityAttributeValues = new ArrayList<>(); + if (!foundNodes.isEmpty()) { - RouterServiceUtil.extractFieldValuesFromObject(n, cerDescriptor.getAttributeNames(), - extractedParentEntityAttributeValues); + for (JsonNode n : foundNodes) { + if ("customer".equalsIgnoreCase(parentEntityType)) { + /* + * NOTES: 1. prepare to hand-create url for service-instance 2. this will break if the + * URL structure for service-instance changes + */ + if (n.has("service-type")) { + targetEntityUrl += "/service-subscriptions/service-subscription/" + + RouterServiceUtil.getNodeFieldAsText(n, "service-type") + + "/service-instances/service-instance/"; + } + } - List nestedTargetEntityInstances = new ArrayList<>(); - RouterServiceUtil.extractObjectsByKey(n, cerDescriptor.getTargetEntityType(), - nestedTargetEntityInstances); + List extractedParentEntityAttributeValues = new ArrayList<>(); - for (JsonNode targetEntityInstance : nestedTargetEntityInstances) { - /* - * Now: - * 1. build the AAIEntityType (IndexDocument) based on the extract entity - * 2. Get data from ES - * 3. Extract ETAG - * 4. Merge ES Doc + AAIEntityType + Extracted Parent Cross-Entity-Reference Values - * 5. Put data into ES with ETAG + updated doc - */ + RouterServiceUtil.extractFieldValuesFromObject(n, cerDescriptor.getAttributeNames(), + extractedParentEntityAttributeValues); - // Get the complete URL for target entity - if (targetEntityInstance.has("link")) { // nested SI has url mentioned - targetEntityUrl = RouterServiceUtil.getNodeFieldAsText(targetEntityInstance, - "link"); - } else if ("customer".equalsIgnoreCase(parentEntityType) && - targetEntityInstance.has("service-instance-id")){ - targetEntityUrl += "/" + RouterServiceUtil.getNodeFieldAsText(targetEntityInstance, - "service-instance-id"); - } - - OxmEntityDescriptor searchableDescriptor = - oxmEntities.getSearchableEntityDescriptor(cerDescriptor.getTargetEntityType()); + List nestedTargetEntityInstances = new ArrayList<>(); + RouterServiceUtil.extractObjectsByKey(n, cerDescriptor.getTargetEntityType(), + nestedTargetEntityInstances); + + for (JsonNode targetEntityInstance : nestedTargetEntityInstances) { + /* + * Now: 1. build the AAIEntityType (IndexDocument) based on the extract entity 2. Get + * data from ES 3. Extract ETAG 4. Merge ES Doc + AAIEntityType + Extracted Parent + * Cross-Entity-Reference Values 5. Put data into ES with ETAG + updated doc + */ - if (searchableDescriptor != null) { + // Get the complete URL for target entity + if (targetEntityInstance.has("link")) { // nested SI has url mentioned + targetEntityUrl = RouterServiceUtil.getNodeFieldAsText(targetEntityInstance, "link"); + } else if ("customer".equalsIgnoreCase(parentEntityType) && targetEntityInstance.has("service-instance-id")) { + targetEntityUrl += RouterServiceUtil.getNodeFieldAsText(targetEntityInstance, "service-instance-id"); + } - if (!searchableDescriptor.getSearchableAttributes().isEmpty()) { + OxmEntityDescriptor searchableDescriptor = oxmEntities.getSearchableEntityDescriptor(cerDescriptor.getTargetEntityType()); - AaiEventEntity entityToSync = null; + if (searchableDescriptor != null) { - try { + if (!searchableDescriptor.getSearchableAttributes().isEmpty()) { - entityToSync = getPopulatedEntity(targetEntityInstance, searchableDescriptor); + AaiEventEntity entityToSync = null; - /* - * Ready to do some ElasticSearch ops - */ + try { - for (String parentCrossEntityReferenceAttributeValue : extractedParentEntityAttributeValues) { - entityToSync - .addCrossEntityReferenceValue(parentCrossEntityReferenceAttributeValue); - } + entityToSync = getPopulatedEntity(targetEntityInstance, searchableDescriptor); - entityToSync.setLink(targetEntityUrl); - entityToSync.deriveFields(); + /* + * Ready to do some ElasticSearch ops + */ - updateCerInEntity(entityToSync); + for (String parentCrossEntityReferenceAttributeValue : extractedParentEntityAttributeValues) { + entityToSync.addCrossEntityReferenceValue(parentCrossEntityReferenceAttributeValue); + } + + entityToSync.setLink(targetEntityUrl); + entityToSync.deriveFields(); + + updateCerInEntity(entityToSync); + + } catch (NoSuchAlgorithmException e) { + logger.debug(e.getMessage()); + } + } + } else { + logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, + "failure to find searchable descriptor for type " + + cerDescriptor.getTargetEntityType()); + } + } - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); } - } + } else { - logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, - "failure to find searchable descriptor for type " - + cerDescriptor.getTargetEntityType()); + logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, + "failed to find 0 instances of cross-entity-reference with entity " + key); } - } } - - } else { - logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, - "failed to find 0 instances of cross-entity-reference with entity " + key); - } - + } else { + logger.info(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, "Unable to get UEB object"); } } else { - logger.info(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, "skipped due to OXM model for " - + topEntityType + " does not contain a cross-entity-reference entity"); + logger.info(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, "skipped due to OXM model for " + + topEntityType + " does not contain a cross-entity-reference entity"); } /* @@ -613,7 +603,7 @@ public class EntityEventPolicy implements Processor { } OxmEntityDescriptor desc = rootDescriptor.get(entityType); - + if (desc == null) { return Collections.emptyList(); } @@ -814,9 +804,9 @@ public class EntityEventPolicy implements Processor { try { uebJsonObj = new JSONObject(payload); } catch (JSONException e) { - logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, - "Payload has invalid JSON Format", payload.toString()); - logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, + logger.debug(EntityEventPolicyMsgs.DISCARD_EVENT_VERBOSE, + "Payload has invalid JSON Format", payload); + logger.error(EntityEventPolicyMsgs.DISCARD_EVENT_NONVERBOSE, "Payload has invalid JSON Format"); return null; } @@ -824,8 +814,7 @@ public class EntityEventPolicy implements Processor { if (uebJsonObj.has(ENTITY_HEADER)) { return uebJsonObj.getJSONObject(ENTITY_HEADER); } else { - logger.debug(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing", - payload.toString()); + logger.debug(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing", payload); logger.error(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing"); return null; } @@ -847,8 +836,6 @@ public class EntityEventPolicy implements Processor { primaryKeyValues.add(pkeyValue); primaryKeyNames.add(keyName); } else { - // logger.warn("getPopulatedDocument(), pKeyValue is null for entityType = " + - // resultDescriptor.getEntityName()); logger.error(EntityEventPolicyMsgs.PRIMARY_KEY_NULL_FOR_ENTITY_TYPE, resultDescriptor.getEntityName()); } @@ -891,20 +878,20 @@ public class EntityEventPolicy implements Processor { if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) { /* - * NOTES: aaiEventEntity (ie the nested entity) may contain a subset of properties of - * the pre-existing object, + * NOTES: aaiEventEntity (ie the nested entity) may contain a subset of properties of + * the pre-existing object, * so all we want to do is update the CER on the pre-existing object (if needed). */ - + List etag = storedEntity.getHeaders().get(Headers.ETAG); if (etag != null && !etag.isEmpty()) { headers.put(Headers.IF_MATCH, etag); } else { logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, - entitySearchIndex, entityId); + entitySearchIndex, entityId); } - + ArrayList sourceObject = new ArrayList<>(); NodeUtils.extractObjectsByKey( NodeUtils.convertJsonStrToJsonNode(storedEntity.getResult()), @@ -912,7 +899,7 @@ public class EntityEventPolicy implements Processor { if (!sourceObject.isEmpty()) { JsonNode node = sourceObject.get(0); - final String sourceCer = NodeUtils.extractFieldValueFromObject(node, + final String sourceCer = NodeUtils.extractFieldValueFromObject(node, "crossEntityReferenceValues"); String newCer = aaiEventEntity.getCrossReferenceEntityValues(); boolean hasNewCer = true; @@ -923,7 +910,7 @@ public class EntityEventPolicy implements Processor { hasNewCer = false; } } - + if (hasNewCer){ // Do the PUT with new CER ((ObjectNode)node).put("crossEntityReferenceValues", newCer); @@ -950,13 +937,13 @@ public class EntityEventPolicy implements Processor { /** * Perform create, read, update or delete (CRUD) operation on search engine's suggestive search * index - * + * * @param eventEntity Entity/data to use in operation * @param action The operation to perform * @param target Resource to perform the operation on * @param allowDeleteEvent Allow delete operation to be performed on resource */ - protected void handleSearchServiceOperation(DocumentStoreDataEntity eventEntity, + protected void handleSearchServiceOperation(DocumentStoreDataEntity eventEntity, String action, String index) { try { @@ -967,8 +954,6 @@ public class EntityEventPolicy implements Processor { String entityId = eventEntity.getId(); - // System.out.println("aaiEventEntity as json = " + aaiEventEntity.getAsJson()); - if ((action.equalsIgnoreCase(ACTION_CREATE) && entityId != null) || action.equalsIgnoreCase(ACTION_UPDATE)) { @@ -992,7 +977,7 @@ public class EntityEventPolicy implements Processor { } else if (action.equalsIgnoreCase(ACTION_CREATE)) { // Write the entry to the search service. searchAgent.postDocument(index, eventEntity.getAsJson(), headers); - + } else if (action.equalsIgnoreCase(ACTION_DELETE)) { // Run the GET to retrieve the ETAG from the search service OperationResult storedEntity = searchAgent.getDocument(index, entityId); @@ -1007,6 +992,13 @@ public class EntityEventPolicy implements Processor { entityId); } + /* + * The Spring-Boot version of the search-data-service rejects the DELETE operation unless + * we specify a Content-Type. + */ + + headers.put("Content-Type", Arrays.asList(MediaType.APPLICATION_JSON.getMediaType())); + searchAgent.deleteDocument(index, eventEntity.getId(), headers); } else { logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, index, @@ -1071,7 +1063,7 @@ public class EntityEventPolicy implements Processor { // put this here until we find a better spot /** * Helper utility to concatenate substrings of a URI together to form a proper URI. - * + * * @param suburis the list of substrings to concatenate together * @return the concatenated list of substrings */