* ============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.
* 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;
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;
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<ExternalOxmModelProcessor> 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<String> SUPPORTED_ACTIONS =
+ private static final List<String> SUPPORTED_ACTIONS =
Arrays.asList(ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE);
Map<String, DynamicJAXBContext> oxmVersionContextMap = new HashMap<>();
/** 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;
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(),
}
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);
}
}
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 {
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);
// 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);
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);
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);
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);
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);
}
// 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<String> 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);
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);
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);
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);
* 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
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<String, CrossEntityReference> 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<String, CrossEntityReference> entry : crossEntityRefMap.entrySet()) {
- ArrayList<JsonNode> 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<JsonNode> 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<String> 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<JsonNode> nestedTargetEntityInstances = new ArrayList<>();
- RouterServiceUtil.extractObjectsByKey(n, cerDescriptor.getTargetEntityType(),
- nestedTargetEntityInstances);
+ List<String> 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<JsonNode> 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");
}
/*
}
OxmEntityDescriptor desc = rootDescriptor.get(entityType);
-
+
if (desc == null) {
return Collections.emptyList();
}
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;
}
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;
}
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());
}
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<String> 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<JsonNode> sourceObject = new ArrayList<>();
NodeUtils.extractObjectsByKey(
NodeUtils.convertJsonStrToJsonNode(storedEntity.getResult()),
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;
hasNewCer = false;
}
}
-
+
if (hasNewCer){
// Do the PUT with new CER
((ObjectNode)node).put("crossEntityReferenceValues", newCer);
/**
* 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 {
String entityId = eventEntity.getId();
- // System.out.println("aaiEventEntity as json = " + aaiEventEntity.getAsJson());
-
if ((action.equalsIgnoreCase(ACTION_CREATE) && entityId != null)
|| action.equalsIgnoreCase(ACTION_UPDATE)) {
} 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);
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,
// 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
*/