X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fsa%2Fsearchdbabstraction%2Felasticsearch%2Fdao%2FElasticSearchHttpController.java;h=de38d28c1d1363d23f5461fd9eb165160bc86781;hb=0ed6c8a6bc6a2b067d11b14bb0a5be8e8680dd4f;hp=841f4775ec67003ae3af9629a032aab3558b671b;hpb=f98e76c39e2ba70abb573cea50cc78ef54c90105;p=aai%2Fsearch-data-service.git diff --git a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchHttpController.java b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchHttpController.java index 841f477..de38d28 100644 --- a/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchHttpController.java +++ b/src/main/java/org/onap/aai/sa/searchdbabstraction/elasticsearch/dao/ElasticSearchHttpController.java @@ -21,6 +21,10 @@ package org.onap.aai.sa.searchdbabstraction.elasticsearch.dao; +import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; +import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; + import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; @@ -47,6 +51,9 @@ import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.atomic.AtomicBoolean; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.Response.Status.Family; +import org.eclipse.jetty.http.HttpStatus; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -70,6 +77,8 @@ import org.onap.aai.sa.searchdbabstraction.entity.Document; import org.onap.aai.sa.searchdbabstraction.entity.DocumentOperationResult; import org.onap.aai.sa.searchdbabstraction.entity.ErrorResult; import org.onap.aai.sa.searchdbabstraction.entity.OperationResult; +import org.onap.aai.sa.searchdbabstraction.entity.OperationResultBuilder; +import org.onap.aai.sa.searchdbabstraction.entity.OperationResultBuilder.Type; import org.onap.aai.sa.searchdbabstraction.entity.SearchHit; import org.onap.aai.sa.searchdbabstraction.entity.SearchHits; import org.onap.aai.sa.searchdbabstraction.entity.SearchOperationResult; @@ -80,7 +89,6 @@ import org.onap.aai.sa.searchdbabstraction.util.AggregationParsingUtil; import org.onap.aai.sa.searchdbabstraction.util.DocumentSchemaUtil; import org.onap.aai.sa.searchdbabstraction.util.ElasticSearchPayloadTranslator; import org.onap.aai.sa.searchdbabstraction.util.SearchDbConstants; -import org.springframework.http.HttpStatus; /** * This class has the Elasticsearch implementation of the DB operations defined in DocumentStoreInterface. @@ -94,6 +102,22 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { private static final Logger metricsLogger = LoggerFactory.getInstance().getMetricsLogger(ElasticSearchHttpController.class.getName()); + private static final String JSON_ATTR_VERSION = "_version"; + private static final String JSON_ATTR_ERROR = "error"; + private static final String JSON_ATTR_REASON = "reason"; + + private static final String DEFAULT_TYPE = "default"; + private static final String QUERY_PARAM_VERSION = "?version="; + + private static final String MSG_RESOURCE_MISSING = "Specified resource does not exist: "; + private static final String MSG_RESPONSE_CODE = "Response Code : "; + private static final String MSG_INVALID_DOCUMENT_URL = "Invalid document URL: "; + private static final String MSG_HTTP_PUT_FAILED = "Failed to set HTTP request method to PUT."; + private static final String MSG_HTTP_POST_FAILED = "Failed to set HTTP request method to POST."; + private static final String FAILED_TO_GET_THE_RESPONSE_CODE_FROM_THE_CONNECTION = + "Failed to get the response code from the connection."; + private static final String FAILED_TO_PARSE_ELASTIC_SEARCH_RESPONSE = "Failed to parse Elastic Search response."; + private static final String BULK_CREATE_WITHOUT_INDEX_TEMPLATE = "{\"create\":{\"_index\" : \"%s\", \"_type\" : \"%s\"} }\n"; private static final String BULK_CREATE_WITH_INDEX_TEMPLATE = @@ -103,20 +127,28 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { private static final String BULK_DELETE_TEMPLATE = "{ \"delete\": { \"_index\": \"%s\", \"_type\": \"%s\", \"_id\": \"%s\", \"_version\":\"%s\"}}\n"; - private static final String INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT = - "Internal Error: ElasticSearch operation fault occurred"; private final ElasticSearchConfig config; - private static final String DEFAULT_TYPE = "default"; - protected AnalysisConfiguration analysisConfig; - public static ElasticSearchHttpController getInstance() { - synchronized (ElasticSearchHttpController.class) { + public ElasticSearchHttpController(ElasticSearchConfig config) { + this.config = config; + analysisConfig = new AnalysisConfiguration(); - if (instance == null) { + try { + logger.info(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_ATTEMPT, getFullUrl("", false)); + checkConnection(); + logger.info(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_SUCCESS, getFullUrl("", false)); + } catch (Exception e) { + logger.error(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_FAILURE, null, e, getFullUrl("", false), + e.getMessage()); + } + } + public static ElasticSearchHttpController getInstance() { + synchronized (ElasticSearchHttpController.class) { + if (instance == null) { Properties properties = new Properties(); File file = new File(SearchDbConstants.ES_CONFIG_FILE); try { @@ -134,83 +166,56 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { return instance; } - public ElasticSearchHttpController(ElasticSearchConfig config) { - this.config = config; - analysisConfig = new AnalysisConfiguration(); - - try { - logger.info(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_ATTEMPT, getFullUrl("", false)); - checkConnection(); - logger.info(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_SUCCESS, getFullUrl("", false)); - } catch (Exception e) { - logger.error(SearchDbMsgs.ELASTIC_SEARCH_CONNECTION_FAILURE, null, e, getFullUrl("", false), - e.getMessage()); - } - } - - public AnalysisConfiguration getAnalysisConfig() { return analysisConfig; } @Override public OperationResult createIndex(String index, DocumentSchema documentSchema) { - - OperationResult result = new OperationResult(); - result.setResultCode(500); - try { - - // Submit the request to ElasticSearch to create the index using a - // default document type. - result = createTable(index, DEFAULT_TYPE, analysisConfig.getEsIndexSettings(), + // Submit the request to ElasticSearch to create the index using a default document type. + OperationResult result = createTable(index, DEFAULT_TYPE, analysisConfig.getEsIndexSettings(), DocumentSchemaUtil.generateDocumentMappings(documentSchema)); // ElasticSearch will return us a 200 code on success when we // want to report a 201, so translate the result here. - result.setResultCode((result.getResultCode() == 200) ? 201 : result.getResultCode()); + if (result.getResultCode() == Status.OK.getStatusCode()) { + result.setResultCode(Status.CREATED.getStatusCode()); + } + if (isSuccess(result)) { result.setResult("{\"url\": \"" + ApiUtils.buildIndexUri(index) + "\"}"); } - + return result; } catch (DocumentStoreOperationException | IOException e) { - - result.setFailureCause("Document store operation failure. Cause: " + e.getMessage()); + return new OperationResultBuilder().useDefaults() + .failureCause("Document store operation failure. Cause: " + e.getMessage()).build(); } - return result; } @Override public OperationResult createDynamicIndex(String index, String dynamicSchema) { - OperationResult result = new OperationResult(); - result.setResultCode(500); - try { - result = createTable(index, dynamicSchema); + OperationResult result = createTable(index, dynamicSchema); // ElasticSearch will return us a 200 code on success when we // want to report a 201, so translate the result here. - result.setResultCode((result.getResultCode() == 200) ? 201 : result.getResultCode()); + if (result.getResultCode() == Status.OK.getStatusCode()) { + result.setResultCode(Status.CREATED.getStatusCode()); + } if (isSuccess(result)) { result.setResult("{\"url\": \"" + ApiUtils.buildIndexUri(index) + "\"}"); } + return result; } catch (DocumentStoreOperationException e) { - result.setFailureCause("Document store operation failure. Cause: " + e.getMessage()); + return new OperationResultBuilder().useDefaults() + .failureCause("Document store operation failure. Cause: " + e.getMessage()).build(); } - - return result; } - @Override public OperationResult deleteIndex(String indexName) throws DocumentStoreOperationException { - - // Initialize operation result with a failure codes / fault string - OperationResult opResult = new OperationResult(); - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -226,23 +231,14 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { throw new DocumentStoreOperationException("Failed to set HTTP request method to DELETE.", e); } - handleResponse(conn, opResult); - - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.DELETE_INDEX_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName); - + OperationResult opResult = handleResponse(conn); + logMetricsInfo(override, SearchDbMsgs.DELETE_INDEX_TIME, opResult, indexName); shutdownConnection(conn); return opResult; } - - private OperationResult checkConnection() throws Exception { - + private OperationResult checkConnection() throws IOException { String fullUrl = getFullUrl("/_cluster/health", false); URL url = null; HttpURLConnection conn = null; @@ -255,12 +251,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { int resultCode = conn.getResponseCode(); logger.debug("getClusterHealth() response Code : " + resultCode); - OperationResult opResult = new OperationResult(); - opResult.setResultCode(resultCode); shutdownConnection(conn); - return opResult; + return new OperationResultBuilder().resultCode(resultCode).build(); } private String getFullUrl(String resourceUrl, boolean isSecure) { @@ -280,20 +274,20 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { return; } + final String methodName = "shutdownConnection"; InputStream inputstream = null; OutputStream outputstream = null; try { inputstream = connection.getInputStream(); } catch (IOException e) { - logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "shutdownConnection", e.getLocalizedMessage()); + logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, methodName, e.getLocalizedMessage()); } finally { if (inputstream != null) { try { inputstream.close(); } catch (IOException e) { - logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "shutdownConnection", - e.getLocalizedMessage()); + logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, methodName, e.getLocalizedMessage()); } } } @@ -301,14 +295,13 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { outputstream = connection.getOutputStream(); } catch (IOException e) { - logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "shutdownConnection", e.getLocalizedMessage()); + logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, methodName, e.getLocalizedMessage()); } finally { if (outputstream != null) { try { outputstream.close(); } catch (IOException e) { - logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "shutdownConnection", - e.getLocalizedMessage()); + logger.debug(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, methodName, e.getLocalizedMessage()); } } } @@ -319,7 +312,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // @Override protected OperationResult createTable(String indexName, String typeName, String indexSettings, String indexMappings) throws DocumentStoreOperationException { - if (indexSettings == null) { logger.debug("No settings provided."); } @@ -328,12 +320,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.debug("No mappings provided."); } - OperationResult opResult = new OperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -342,10 +328,9 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { conn.setRequestMethod("PUT"); - conn.setRequestProperty("Content-Type", "application/json"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to PUT.", e); + throw new DocumentStoreOperationException(MSG_HTTP_PUT_FAILED, e); } StringBuilder sb = new StringBuilder(128); @@ -366,18 +351,11 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } logger.debug("\ncreateTable(), Sending 'PUT' request to URL : " + conn.getURL()); - logger.debug("Request content: " + sb.toString()); - - handleResponse(conn, opResult); + logger.debug("Request content: " + sb); + OperationResult opResult = handleResponse(conn); shutdownConnection(conn); - - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.CREATE_INDEX_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResultCode()), - override, indexName); + logMetricsInfo(override, SearchDbMsgs.CREATE_INDEX_TIME, opResult, indexName); return opResult; } @@ -393,10 +371,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { */ protected OperationResult createTable(String indexName, String settingsAndMappings) throws DocumentStoreOperationException { - OperationResult result = new OperationResult(); - result.setResultCode(500); - result.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -405,10 +379,9 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { conn.setRequestMethod("PUT"); - conn.setRequestProperty("Content-Type", "application/json"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to PUT.", e); + throw new DocumentStoreOperationException(MSG_HTTP_PUT_FAILED, e); } try { @@ -417,14 +390,9 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.error(SearchDbMsgs.INDEX_CREATE_FAILURE, e); throw new DocumentStoreOperationException(e.getMessage()); } - handleResponse(conn, result); - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.CREATE_INDEX_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, result.getResultCode()), - override, indexName); + OperationResult result = handleResponse(conn); + logMetricsInfo(override, SearchDbMsgs.CREATE_INDEX_TIME, result, indexName); return result; } @@ -434,19 +402,15 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { boolean allowImplicitIndexCreation) throws DocumentStoreOperationException { if (!allowImplicitIndexCreation) { - // Before we do anything, make sure that the specified index actually exists in the // document store - we don't want to rely on ElasticSearch to fail the document // create because it could be configured to implicitly create a non-existent index, // which can lead to hard-to-debug behaviour with queries down the road. OperationResult indexExistsResult = checkIndexExistence(indexName); - if ((indexExistsResult.getResultCode() < 200) || (indexExistsResult.getResultCode() >= 300)) { - - DocumentOperationResult opResult = new DocumentOperationResult(); - opResult.setResultCode(HttpStatus.NOT_FOUND.value()); - opResult.setResult("Document Index '" + indexName + "' does not exist."); - opResult.setFailureCause("Document Index '" + indexName + "' does not exist."); - return opResult; + if (!isSuccess(indexExistsResult)) { + String resultMsg = "Document Index '" + indexName + "' does not exist."; + return (DocumentOperationResult) new OperationResultBuilder(Type.DOCUMENT).status(Status.NOT_FOUND) + .result(resultMsg).failureCause(resultMsg).build(); } } @@ -462,22 +426,16 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // check if the document already exists DocumentOperationResult opResult = checkDocumentExistence(indexName, document.getId()); - - if (opResult.getResultCode() != HttpStatus.NOT_FOUND.value()) { - if (opResult.getResultCode() == HttpStatus.CONFLICT.value()) { + if (opResult.getResultCode() != Status.NOT_FOUND.getStatusCode()) { + if (opResult.getResultCode() == Status.CONFLICT.getStatusCode()) { opResult.setFailureCause("A document with the same id already exists."); } else { opResult.setFailureCause("Failed to verify a document with the specified id does not already exist."); } - opResult.setResultCode(HttpStatus.CONFLICT.value()); + opResult.setResultCode(Status.CONFLICT.getStatusCode()); return opResult; } - opResult = new DocumentOperationResult(); - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -488,37 +446,25 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { conn.setRequestMethod("PUT"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to PUT.", e); + throw new DocumentStoreOperationException(MSG_HTTP_PUT_FAILED, e); } attachDocument(conn, document); logger.debug("Sending 'PUT' request to: " + conn.getURL()); - handleResponse(conn, opResult); + opResult = getOperationResult(conn); buildDocumentResult(opResult, indexName); - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.CREATE_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName); + logMetricsInfo(override, SearchDbMsgs.CREATE_DOCUMENT_TIME, opResult, indexName); shutdownConnection(conn); return opResult; - } private DocumentOperationResult createDocumentWithoutId(String indexName, DocumentStoreDataEntity document) throws DocumentStoreOperationException { - - DocumentOperationResult response = new DocumentOperationResult(); - // Initialize operation result with a failure codes / fault string - response.setResultCode(500); - response.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -529,22 +475,17 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { conn.setRequestMethod("POST"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to POST.", e); + throw new DocumentStoreOperationException(MSG_HTTP_POST_FAILED, e); } attachDocument(conn, document); logger.debug("Sending 'POST' request to: " + conn.getURL()); - handleResponse(conn, response); + DocumentOperationResult response = getOperationResult(conn); buildDocumentResult(response, indexName); - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.CREATE_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, response.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, response.getResult()), - override, indexName); + logMetricsInfo(override, SearchDbMsgs.CREATE_DOCUMENT_TIME, response, indexName); shutdownConnection(conn); @@ -553,18 +494,12 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { private void attachDocument(HttpURLConnection conn, DocumentStoreDataEntity doc) throws DocumentStoreOperationException { - conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Connection", "Close"); attachContent(conn, doc.getContentInJson()); } private DocumentOperationResult checkDocumentExistence(String indexName, String docId) throws DocumentStoreOperationException { - DocumentOperationResult opResult = new DocumentOperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -585,20 +520,15 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { resultCode = conn.getResponseCode(); } catch (IOException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to get the response code from the connection.", e); + throw new DocumentStoreOperationException(FAILED_TO_GET_THE_RESPONSE_CODE_FROM_THE_CONNECTION, e); } - logger.debug("Response Code : " + resultCode); - - opResult.setResultCode(resultCode); + logger.debug(MSG_RESPONSE_CODE + resultCode); - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.GET_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, docId); + DocumentOperationResult opResult = (DocumentOperationResult) new OperationResultBuilder(Type.DOCUMENT) + .useDefaults().resultCode(resultCode).build(); + logMetricsInfo(override, SearchDbMsgs.GET_DOCUMENT_TIME, opResult, indexName, docId); shutdownConnection(conn); return opResult; @@ -614,50 +544,38 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // create because it could be configured to implicitly create a non-existent index, // which can lead to hard-to-debug behaviour with queries down the road. OperationResult indexExistsResult = checkIndexExistence(indexName); - if ((indexExistsResult.getResultCode() < 200) || (indexExistsResult.getResultCode() >= 300)) { - + if (!isSuccess(indexExistsResult)) { DocumentOperationResult opResult = new DocumentOperationResult(); - opResult.setResultCode(HttpStatus.NOT_FOUND.value()); - opResult.setResult("Document Index '" + indexName + "' does not exist."); - opResult.setFailureCause("Document Index '" + indexName + "' does not exist."); + opResult.setResultCode(Status.NOT_FOUND.getStatusCode()); + String resultMsg = "Document Index '" + indexName + "' does not exist."; + opResult.setResult(resultMsg); + opResult.setFailureCause(resultMsg); return opResult; } } - DocumentOperationResult opResult = new DocumentOperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); - String fullUrl = getFullUrl( - "/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + "?version=" + document.getVersion(), - false); + String fullUrl = getFullUrl("/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + QUERY_PARAM_VERSION + + document.getVersion(), false); HttpURLConnection conn = initializeConnection(fullUrl); try { conn.setRequestMethod("PUT"); - conn.setRequestProperty("Content-Type", "application/json"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to PUT.", e); + throw new DocumentStoreOperationException(MSG_HTTP_PUT_FAILED, e); } attachDocument(conn, document); logger.debug("Sending 'PUT' request to: " + conn.getURL()); - handleResponse(conn, opResult); + DocumentOperationResult opResult = getOperationResult(conn); buildDocumentResult(opResult, indexName); - // Generate a metrics log so we can track how long the operation took. - metricsLogger.info(SearchDbMsgs.UPDATE_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, document.getId()); + logMetricsInfo(override, SearchDbMsgs.UPDATE_DOCUMENT_TIME, opResult, indexName, document.getId()); shutdownConnection(conn); @@ -667,18 +585,11 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { @Override public DocumentOperationResult deleteDocument(String indexName, DocumentStoreDataEntity document) throws DocumentStoreOperationException { - DocumentOperationResult opResult = new DocumentOperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); - String fullUrl = getFullUrl( - "/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + "?version=" + document.getVersion(), - false); + String fullUrl = getFullUrl("/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + QUERY_PARAM_VERSION + + document.getVersion(), false); HttpURLConnection conn = initializeConnection(fullUrl); try { @@ -690,7 +601,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.debug("\nSending 'DELETE' request to " + conn.getURL()); - handleResponse(conn, opResult); + DocumentOperationResult opResult = getOperationResult(conn); buildDocumentResult(opResult, indexName); // supress the etag and url in response for delete as they are not required if (opResult.getDocument() != null) { @@ -698,11 +609,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { opResult.getDocument().setUrl(null); } - // Generate a metrics log so we can track how long the operation took. - metricsLogger.info(SearchDbMsgs.DELETE_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResult()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResultCode()), - override, indexName, document.getId()); + logMetricsInfo(override, SearchDbMsgs.DELETE_DOCUMENT_TIME, opResult, indexName, document.getId()); shutdownConnection(conn); @@ -712,12 +619,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { @Override public DocumentOperationResult getDocument(String indexName, DocumentStoreDataEntity document) throws DocumentStoreOperationException { - DocumentOperationResult opResult = new DocumentOperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -725,22 +626,17 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (document.getVersion() == null) { fullUrl = getFullUrl("/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId(), false); } else { - fullUrl = getFullUrl( - "/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + "?version=" + document.getVersion(), - false); + fullUrl = getFullUrl("/" + indexName + "/" + DEFAULT_TYPE + "/" + document.getId() + QUERY_PARAM_VERSION + + document.getVersion(), false); } HttpURLConnection conn = initializeConnection(fullUrl); logger.debug("\nSending 'GET' request to: " + conn.getURL()); - handleResponse(conn, opResult); + DocumentOperationResult opResult = getOperationResult(conn); buildDocumentResult(opResult, indexName); - // Generate a metrics log so we can track how long the operation took. - metricsLogger.info(SearchDbMsgs.GET_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, document.getId()); + logMetricsInfo(override, SearchDbMsgs.GET_DOCUMENT_TIME, opResult, indexName, document.getId()); shutdownConnection(conn); @@ -749,11 +645,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { @Override public SearchOperationResult search(String indexName, String queryString) throws DocumentStoreOperationException { - SearchOperationResult opResult = new SearchOperationResult(); - - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); String fullUrl = getFullUrl("/" + indexName + "/_search" + "?" + queryString, false); @@ -771,14 +662,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.debug("\nsearch(), Sending 'GET' request to URL : " + conn.getURL()); - handleResponse(conn, opResult); + SearchOperationResult opResult = getSearchOperationResult(conn); buildSearchResult(opResult, indexName); - - metricsLogger.info(SearchDbMsgs.QUERY_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, queryString); + logMetricsInfo(override, SearchDbMsgs.QUERY_DOCUMENT_TIME, opResult, indexName, queryString); return opResult; } @@ -786,16 +673,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { @Override public SearchOperationResult searchWithPayload(String indexName, String query) throws DocumentStoreOperationException { - SearchOperationResult opResult = new SearchOperationResult(); - if (logger.isDebugEnabled()) { logger.debug("Querying index: " + indexName + " with query string: " + query); } - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - String fullUrl = getFullUrl("/" + indexName + "/_search", false); // Grab the current time so we can use it to generate a metrics log. @@ -805,10 +686,9 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { conn.setRequestMethod("POST"); - conn.setRequestProperty("Content-Type", "application/json"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to POST.", e); + throw new DocumentStoreOperationException(MSG_HTTP_POST_FAILED, e); } attachContent(conn, query); @@ -816,14 +696,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.debug("\nsearch(), Sending 'POST' request to URL : " + conn.getURL()); logger.debug("Request body = Elasticsearch query = " + query); - handleResponse(conn, opResult); + SearchOperationResult opResult = getSearchOperationResult(conn); buildSearchResult(opResult, indexName); - metricsLogger - .info(SearchDbMsgs.QUERY_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, query); + logMetricsInfo(override, SearchDbMsgs.QUERY_DOCUMENT_TIME, opResult, indexName, query); shutdownConnection(conn); @@ -834,17 +710,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { @Override public SearchOperationResult suggestionQueryWithPayload(String indexName, String query) throws DocumentStoreOperationException { - - SearchOperationResult opResult = new SearchOperationResult(); - if (logger.isDebugEnabled()) { logger.debug("Querying Suggestion index: " + indexName + " with query string: " + query); } - // Initialize operation result with a failure codes / fault string - opResult.setResultCode(500); - opResult.setResult(INTERNAL_SERVER_ERROR_ELASTIC_SEARCH_OPERATION_FAULT); - String fullUrl = getFullUrl("/" + indexName + "/_suggest", false); // Grab the current time so we can use it to generate a metrics log. @@ -854,10 +723,9 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { conn.setRequestMethod("POST"); - conn.setRequestProperty("Content-Type", "application/json"); } catch (ProtocolException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to set HTTP request method to POST.", e); + throw new DocumentStoreOperationException(MSG_HTTP_POST_FAILED, e); } attachContent(conn, query); @@ -865,14 +733,10 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { logger.debug("\nsearch(), Sending 'POST' request to URL : " + conn.getURL()); logger.debug("Request body = Elasticsearch query = " + query); - handleResponse(conn, opResult); + SearchOperationResult opResult = getSearchOperationResult(conn); buildSuggestResult(opResult, indexName); - metricsLogger - .info(SearchDbMsgs.QUERY_DOCUMENT_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResult()), - override, indexName, query); + logMetricsInfo(override, SearchDbMsgs.QUERY_DOCUMENT_TIME, opResult, indexName, query); shutdownConnection(conn); @@ -913,6 +777,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { try { conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); conn.setDoOutput(true); } catch (IOException e) { shutdownConnection(conn); @@ -922,22 +787,26 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { return conn; } - private void handleResponse(HttpURLConnection conn, OperationResult opResult) + private OperationResult handleResponse(HttpURLConnection conn) throws DocumentStoreOperationException { + return handleResponse(conn, new OperationResultBuilder().useDefaults()); + } + + private OperationResult handleResponse(HttpURLConnection conn, OperationResultBuilder rb) throws DocumentStoreOperationException { - int resultCode = 200; + int resultCode; try { resultCode = conn.getResponseCode(); } catch (IOException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to get the response code from the connection.", e); + throw new DocumentStoreOperationException(FAILED_TO_GET_THE_RESPONSE_CODE_FROM_THE_CONNECTION, e); } - logger.debug("Response Code : " + resultCode); + logger.debug(MSG_RESPONSE_CODE + resultCode); InputStream inputStream = null; - if (!(resultCode >= 200 && resultCode <= 299)) { // 2xx response indicates success + if (!isSuccessCode(resultCode)) { inputStream = conn.getErrorStream(); } else { try { @@ -963,16 +832,17 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { throw new DocumentStoreOperationException("Failed getting the response body payload.", e); } - if (resultCode == HttpStatus.CONFLICT.value()) { - opResult.setResultCode(HttpStatus.PRECONDITION_FAILED.value()); + if (resultCode == Status.CONFLICT.getStatusCode()) { + rb.resultCode(Status.PRECONDITION_FAILED.getStatusCode()); } else { - opResult.setResultCode(resultCode); + rb.resultCode(resultCode); } if (logger.isDebugEnabled()) { logger.debug("Raw result string from ElasticSearch = " + result.toString()); } - opResult.setResult(result.toString()); - opResult.setResultVersion(extractVersion(result.toString())); + rb.result(result.toString()); + rb.resultVersion(extractVersion(result.toString())); + return rb.build(); } private String extractVersion(String result) { @@ -980,8 +850,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { String version = null; try { JSONObject root = (JSONObject) parser.parse(result); - if (root.get("_version") != null) { - version = root.get("_version").toString(); + if (root.get(JSON_ATTR_VERSION) != null) { + version = root.get(JSON_ATTR_VERSION).toString(); } } catch (ParseException e) { // Not all responses from ElasticSearch include a version, so @@ -1020,27 +890,23 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } private boolean isSuccess(OperationResult result) { - return isSuccessCode(result.getResultCode()); } - private boolean isSuccessCode(int statusCode) { - return ((statusCode >= 200) && (statusCode < 300)); + return Family.familyOf(statusCode).equals(Family.SUCCESSFUL); } - @Override public OperationResult performBulkOperations(BulkRequest[] requests) throws DocumentStoreOperationException { - if (logger.isDebugEnabled()) { - String dbgString = "ESController: performBulkOperations - Operations: "; + StringBuilder dbgString = new StringBuilder("ESController: performBulkOperations - Operations: "); for (BulkRequest request : requests) { - dbgString += "[" + request.toString() + "] "; + dbgString.append("[").append(request).append("] "); } - logger.debug(dbgString); + logger.debug(dbgString.toString()); } // Grab the current time so we can use it to generate a metrics log. @@ -1073,7 +939,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("PUT"); conn.setDoOutput(true); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_FORM_URLENCODED); conn.setRequestProperty("Connection", "Close"); } catch (IOException e) { @@ -1146,28 +1012,28 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } } - // Finally, build the operation result and return it to the caller. - OperationResult result = new OperationResult(); - result.setResultCode(207); - result.setResult(buildGenericBulkResultSet(opResult, rejected)); + OperationResult result = new OperationResultBuilder() // + .resultCode(HttpStatus.MULTI_STATUS_207) // + .result(buildGenericBulkResultSet(opResult, rejected)) // + .build(); - // In the success case we don't want the entire result string to be - // dumped into the metrics log, so concatenate it. + // In the success case we don't want the entire result string to be dumped into the metrics log, so concatenate + // it. String resultStringForMetricsLog = result.getResult(); - if ((result.getResultCode() >= 200) && (result.getResultCode() < 300)) { + if (isSuccess(result)) { resultStringForMetricsLog = resultStringForMetricsLog.substring(0, Math.max(resultStringForMetricsLog.length(), 85)) + "..."; } metricsLogger.info(SearchDbMsgs.BULK_OPERATIONS_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getResultCode()) + new LogFields() // + .setField(LogLine.DefinedFields.RESPONSE_CODE, result.getResultCode()) .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, resultStringForMetricsLog), override); return result; } - /** * This method converts a {@link BulkRequest} object into a json structure which can be understood by ElasticSearch. * @@ -1197,7 +1063,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // correctly. if (!ApiUtils.validateDocumentUri(request.getOperation().getMetaData().getUrl(), false)) { fails.add(generateRejectionEntry(request.getOperationType(), - "Invalid document URL: " + request.getOperation().getMetaData().getUrl(), + MSG_INVALID_DOCUMENT_URL + request.getOperation().getMetaData().getUrl(), request.getIndex(), "", 400, request.getOperation().getMetaData().getUrl())); return false; } @@ -1207,8 +1073,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (!indexExists(ApiUtils.extractIndexFromUri(request.getOperation().getMetaData().getUrl()))) { fails.add(generateRejectionEntry(request.getOperationType(), - "Specified resource does not exist: " + request.getOperation().getMetaData().getUrl(), - request.getIndex(), request.getId(), 404, request.getOperation().getMetaData().getUrl())); + MSG_RESOURCE_MISSING + request.getOperation().getMetaData().getUrl(), request.getIndex(), + request.getId(), 404, request.getOperation().getMetaData().getUrl())); return false; } @@ -1249,7 +1115,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // correctly. if (!ApiUtils.validateDocumentUri(request.getOperation().getMetaData().getUrl(), true)) { fails.add(generateRejectionEntry(request.getOperationType(), - "Invalid document URL: " + request.getOperation().getMetaData().getUrl(), + MSG_INVALID_DOCUMENT_URL + request.getOperation().getMetaData().getUrl(), request.getIndex(), "", 400, request.getOperation().getMetaData().getUrl())); return false; } @@ -1259,8 +1125,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (!indexExists(request.getIndex())) { fails.add(generateRejectionEntry(request.getOperationType(), - "Specified resource does not exist: " + request.getOperation().getMetaData().getUrl(), - request.getIndex(), request.getId(), 404, request.getOperation().getMetaData().getUrl())); + MSG_RESOURCE_MISSING + request.getOperation().getMetaData().getUrl(), request.getIndex(), + request.getId(), 404, request.getOperation().getMetaData().getUrl())); return false; } @@ -1269,8 +1135,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (!documentExists(request.getIndex(), request.getId())) { fails.add(generateRejectionEntry(request.getOperationType(), - "Specified resource does not exist: " + request.getOperation().getMetaData().getUrl(), - request.getIndex(), request.getId(), 404, request.getOperation().getMetaData().getUrl())); + MSG_RESOURCE_MISSING + request.getOperation().getMetaData().getUrl(), request.getIndex(), + request.getId(), 404, request.getOperation().getMetaData().getUrl())); return false; } @@ -1302,7 +1168,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // correctly. if (!ApiUtils.validateDocumentUri(request.getOperation().getMetaData().getUrl(), true)) { fails.add(generateRejectionEntry(request.getOperationType(), - "Invalid document URL: " + request.getOperation().getMetaData().getUrl(), + MSG_INVALID_DOCUMENT_URL + request.getOperation().getMetaData().getUrl(), request.getIndex(), "", 400, request.getOperation().getMetaData().getUrl())); return false; } @@ -1312,8 +1178,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (!indexExists(request.getIndex())) { fails.add(generateRejectionEntry(request.getOperationType(), - "Specified resource does not exist: " + request.getOperation().getMetaData().getUrl(), - request.getIndex(), request.getId(), 404, request.getOperation().getMetaData().getUrl())); + MSG_RESOURCE_MISSING + request.getOperation().getMetaData().getUrl(), request.getIndex(), + request.getId(), 404, request.getOperation().getMetaData().getUrl())); return false; } @@ -1322,8 +1188,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { if (!documentExists(request.getIndex(), request.getId())) { fails.add(generateRejectionEntry(request.getOperationType(), - "Specified resource does not exist: " + request.getOperation().getMetaData().getUrl(), - request.getIndex(), request.getId(), 404, request.getOperation().getMetaData().getUrl())); + MSG_RESOURCE_MISSING + request.getOperation().getMetaData().getUrl(), request.getIndex(), + request.getId(), 404, request.getOperation().getMetaData().getUrl())); return false; } @@ -1347,17 +1213,11 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } private boolean indexExists(String index) throws DocumentStoreOperationException { - - OperationResult indexExistsResult = checkIndexExistence(index); - - return ((indexExistsResult.getResultCode() >= 200) && (indexExistsResult.getResultCode() < 300)); + return isSuccess(checkIndexExistence(index)); } private boolean documentExists(String index, String id) throws DocumentStoreOperationException { - - OperationResult docExistsResult = checkDocumentExistence(index, id); - - return ((docExistsResult.getResultCode() >= 200) && (docExistsResult.getResultCode() < 300)); + return isSuccess(checkDocumentExistence(index, id)); } /** @@ -1488,11 +1348,6 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { * @throws DocumentStoreOperationException */ public OperationResult checkIndexExistence(String indexName) throws DocumentStoreOperationException { - - // Initialize operation result with a failure codes / fault string - OperationResult opResult = new OperationResult(); - opResult.setResultCode(500); - // Grab the current time so we can use it to generate a metrics log. MdcOverride override = getStartTime(new MdcOverride()); @@ -1514,24 +1369,25 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { resultCode = conn.getResponseCode(); } catch (IOException e) { shutdownConnection(conn); - throw new DocumentStoreOperationException("Failed to get the response code from the connection.", e); + throw new DocumentStoreOperationException(FAILED_TO_GET_THE_RESPONSE_CODE_FROM_THE_CONNECTION, e); } - logger.debug("Response Code : " + resultCode); - - opResult.setResultCode(resultCode); - - // Generate a metrics log so we can track how long the operation took. - metricsLogger - .info(SearchDbMsgs.CHECK_INDEX_TIME, - new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, opResult.getResultCode()) - .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, opResult.getResultCode()), - override, indexName); + logger.debug(MSG_RESPONSE_CODE + resultCode); + OperationResult opResult = new OperationResultBuilder().useDefaults().resultCode(resultCode).build(); + logMetricsInfo(override, SearchDbMsgs.CHECK_INDEX_TIME, opResult, indexName); shutdownConnection(conn); return opResult; } + private DocumentOperationResult getOperationResult(HttpURLConnection conn) throws DocumentStoreOperationException { + return (DocumentOperationResult) handleResponse(conn, new OperationResultBuilder(Type.DOCUMENT).useDefaults()); + } + + private SearchOperationResult getSearchOperationResult(HttpURLConnection conn) + throws DocumentStoreOperationException { + return (SearchOperationResult) handleResponse(conn, new OperationResultBuilder(Type.SEARCH).useDefaults()); + } private void buildDocumentResult(DocumentOperationResult result, String index) throws DocumentStoreOperationException { @@ -1540,8 +1396,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { JSONObject root; try { root = (JSONObject) parser.parse(result.getResult()); - - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + if (isSuccess(result)) { // Success response object Document doc = new Document(); doc.setEtag(result.getResultVersion()); @@ -1552,17 +1407,16 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } else { // Error response object - JSONObject error = (JSONObject) root.get("error"); + JSONObject error = (JSONObject) root.get(JSON_ATTR_ERROR); if (error != null) { - result.setError(new ErrorResult(error.get("type").toString(), error.get("reason").toString())); + result.setError( + new ErrorResult(error.get("type").toString(), error.get(JSON_ATTR_REASON).toString())); } } } catch (Exception e) { - throw new DocumentStoreOperationException("Failed to parse Elastic Search response." + result.getResult()); + throw new DocumentStoreOperationException(FAILED_TO_PARSE_ELASTIC_SEARCH_RESPONSE + result.getResult()); } - - } private String buildDocumentResponseUrl(String index, String id) { @@ -1570,13 +1424,12 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { } private void buildSearchResult(SearchOperationResult result, String index) throws DocumentStoreOperationException { - JSONParser parser = new JSONParser(); JSONObject root; try { root = (JSONObject) parser.parse(result.getResult()); - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + if (isSuccess(result)) { JSONObject hits = (JSONObject) root.get("hits"); JSONArray hitArray = (JSONArray) hits.get("hits"); SearchHits searchHits = new SearchHits(); @@ -1588,8 +1441,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { SearchHit searchHit = new SearchHit(); searchHit.setScore((hit.get("_score") != null) ? hit.get("_score").toString() : ""); Document doc = new Document(); - if (hit.get("_version") != null) { - doc.setEtag((hit.get("_version") != null) ? hit.get("_version").toString() : ""); + if (hit.get(JSON_ATTR_VERSION) != null) { + doc.setEtag((hit.get(JSON_ATTR_VERSION) != null) ? hit.get(JSON_ATTR_VERSION).toString() : ""); } doc.setUrl( @@ -1611,15 +1464,15 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // success } else { - JSONObject error = (JSONObject) root.get("error"); + JSONObject error = (JSONObject) root.get(JSON_ATTR_ERROR); if (error != null) { - result.setError(new ErrorResult(error.get("type").toString(), error.get("reason").toString())); + result.setError( + new ErrorResult(error.get("type").toString(), error.get(JSON_ATTR_REASON).toString())); } } } catch (Exception e) { - throw new DocumentStoreOperationException("Failed to parse Elastic Search response." + result.getResult()); + throw new DocumentStoreOperationException(FAILED_TO_PARSE_ELASTIC_SEARCH_RESPONSE + result.getResult()); } - } private void buildSuggestResult(SearchOperationResult result, String index) throws DocumentStoreOperationException { @@ -1627,7 +1480,7 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { JSONObject root; try { root = (JSONObject) parser.parse(result.getResult()); - if (result.getResultCode() >= 200 && result.getResultCode() <= 299) { + if (isSuccess(result)) { JSONArray hitArray = (JSONArray) root.get("suggest-vnf"); JSONObject hitdata = (JSONObject) hitArray.get(0); JSONArray optionsArray = (JSONArray) hitdata.get("options"); @@ -1643,8 +1496,8 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { suggestHit.setScore((hit.get("score") != null) ? hit.get("score").toString() : ""); suggestHit.setText((hit.get("text") != null) ? hit.get("text").toString() : ""); Document doc = new Document(); - if (hit.get("_version") != null) { - doc.setEtag((hit.get("_version") != null) ? hit.get("_version").toString() : ""); + if (hit.get(JSON_ATTR_VERSION) != null) { + doc.setEtag((hit.get(JSON_ATTR_VERSION) != null) ? hit.get(JSON_ATTR_VERSION).toString() : ""); } doc.setUrl( buildDocumentResponseUrl(index, (hit.get("_id") != null) ? hit.get("_id").toString() : "")); @@ -1666,13 +1519,27 @@ public class ElasticSearchHttpController implements DocumentStoreInterface { // success } else { - JSONObject error = (JSONObject) root.get("error"); + JSONObject error = (JSONObject) root.get(JSON_ATTR_ERROR); if (error != null) { - result.setError(new ErrorResult(error.get("type").toString(), error.get("reason").toString())); + result.setError( + new ErrorResult(error.get("type").toString(), error.get(JSON_ATTR_REASON).toString())); } } } catch (Exception e) { - throw new DocumentStoreOperationException("Failed to parse Elastic Search response." + result.getResult()); + throw new DocumentStoreOperationException(FAILED_TO_PARSE_ELASTIC_SEARCH_RESPONSE + result.getResult()); } } + + /** + * Record the timing of the operation in the metrics log. + * + */ + private void logMetricsInfo(MdcOverride override, SearchDbMsgs message, OperationResult operationResult, + String... args) { + metricsLogger.info(message, + new LogFields() // + .setField(LogLine.DefinedFields.RESPONSE_CODE, operationResult.getResultCode()) + .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, operationResult.getResult()), + override, args); + } }