- private static final String REQUEST_HEADER_RESOURCE_VERSION = "If-Match";
- private static final String RESPONSE_HEADER_RESOURCE_VERSION = "ETag";
- private static final String REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION = "X-CreateIndex";
-
- protected SearchServiceApi searchService = null;
-
- private Logger logger = LoggerFactory.getInstance().getLogger(DocumentApi.class.getName());
- private Logger auditLogger = LoggerFactory.getInstance()
- .getAuditLogger(DocumentApi.class.getName());
-
- public DocumentApi(SearchServiceApi searchService) {
- this.searchService = searchService;
- }
-
- public Response processPost(String content, HttpServletRequest request, HttpHeaders headers,
- HttpServletResponse httpResponse, String index,
- DocumentStoreInterface documentStore) {
-
- // Initialize the MDC Context for logging purposes.
- ApiUtils.initMdcContext(request, headers);
-
- try {
- ObjectMapper mapper = new ObjectMapper();
- mapper.setSerializationInclusion(Include.NON_EMPTY);
- if (content == null) {
- return handleError(request, content, Status.BAD_REQUEST);
- }
-
- boolean isValid;
- try {
- isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST,
- ApiUtils.SEARCH_AUTH_POLICY_NAME);
- } catch (Exception e) {
- logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL,
- "DocumentApi.processPost",
- e.getMessage());
- return handleError(request, content, Status.FORBIDDEN);
- }
-
- if (!isValid) {
- return handleError(request, content, Status.FORBIDDEN);
- }
-
- DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl();
- document.setContent(content);
-
- DocumentOperationResult result = documentStore.createDocument(index, document, implicitlyCreateIndex(headers));
- String output = null;
- if (result.getResultCode() >= 200 && result.getResultCode() <= 299) {
- output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument());
- } else {
- output = result.getError() != null
- ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError())
- : result.getFailureCause();
- }
-
- if (httpResponse != null) {
- httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion());
- }
- Response response = Response.status(result.getResultCode()).entity(output).build();
- logResult(request, Response.Status.fromStatusCode(response.getStatus()));
-
- // Clear the MDC context so that no other transaction inadvertently
- // uses our transaction id.
- ApiUtils.clearMdcContext();
-
- return response;
- } catch (Exception e) {
- return handleError(request, e.getMessage(), Status.INTERNAL_SERVER_ERROR);
+ private static final String MSG_REQUEST_BODY = "Request Body: ";
+ private static final String REQUEST_HEADER_RESOURCE_VERSION = "If-Match";
+ private static final String RESPONSE_HEADER_RESOURCE_VERSION = "ETag";
+ private static final String REQUEST_HEADER_ALLOW_IMPLICIT_INDEX_CREATION = "X-CreateIndex";
+
+ protected SearchServiceApi searchService = null;
+
+ private Logger logger = LoggerFactory.getInstance().getLogger(DocumentApi.class.getName());
+ private Logger auditLogger = LoggerFactory.getInstance().getAuditLogger(DocumentApi.class.getName());
+
+ public DocumentApi(SearchServiceApi searchService) {
+ this.searchService = searchService;
+ }
+
+ public ResponseEntity<String> processPost(String content, HttpServletRequest request, HttpHeaders headers,
+ HttpServletResponse httpResponse, String index, DocumentStoreInterface documentStore) {
+
+ // Initialize the MDC Context for logging purposes.
+ ApiUtils.initMdcContext(request, headers);
+
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(Include.NON_EMPTY);
+ if (content == null) {
+ return handleError(request, content, HttpStatus.BAD_REQUEST);
+ }
+
+ boolean isValid;
+ try {
+ isValid = searchService.validateRequest(headers, request, ApiUtils.Action.POST,
+ ApiUtils.SEARCH_AUTH_POLICY_NAME);
+ } catch (Exception e) {
+ logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processPost", e.getMessage());
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ if (!isValid) {
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl();
+ document.setContent(content);
+
+ DocumentOperationResult result =
+ documentStore.createDocument(index, document, implicitlyCreateIndex(headers));
+ String output = null;
+ if (ApiUtils.isSuccessStatusCode(result.getResultCode())) {
+ output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument());
+ } else {
+ output = result.getError() != null
+ ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError())
+ : result.getFailureCause();
+ }
+
+ if (httpResponse != null) {
+ httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion());
+ }
+ ResponseEntity<String> response =
+ ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output);
+ logResult(request, HttpStatus.valueOf(response.getStatusCodeValue()));
+ logResult(request, HttpStatus.valueOf(response.getStatusCodeValue()));
+
+ // Clear the MDC context so that no other transaction inadvertently
+ // uses our transaction id.
+ ApiUtils.clearMdcContext();
+
+ return response;
+ } catch (Exception e) {
+ return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ public ResponseEntity<String> processPut(String content, HttpServletRequest request, HttpHeaders headers,
+ HttpServletResponse httpResponse, String index, String id, DocumentStoreInterface documentStore) {
+
+ // Initialize the MDC Context for logging purposes.
+ ApiUtils.initMdcContext(request, headers);
+
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(Include.NON_EMPTY);
+ if (content == null) {
+ return handleError(request, content, HttpStatus.BAD_REQUEST);
+ }
+
+ boolean isValid;
+ try {
+ isValid = searchService.validateRequest(headers, request, ApiUtils.Action.PUT,
+ ApiUtils.SEARCH_AUTH_POLICY_NAME);
+ } catch (Exception e) {
+ logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processPut", e.getMessage());
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ if (!isValid) {
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION);
+
+ DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl();
+ document.setId(id);
+ document.setContent(content);
+ document.setVersion(resourceVersion);
+
+ DocumentOperationResult result = null;
+ if (resourceVersion == null) {
+ result = documentStore.createDocument(index, document, implicitlyCreateIndex(headers));
+ } else {
+ result = documentStore.updateDocument(index, document, implicitlyCreateIndex(headers));
+ }
+
+ String output = null;
+ if (ApiUtils.isSuccessStatusCode(result.getResultCode())) {
+ output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getDocument());
+ } else {
+ output = result.getError() != null
+ ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError())
+ : result.getFailureCause();
+ }
+ if (httpResponse != null) {
+ httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion());
+ }
+ ResponseEntity<String> response =
+ ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON).body(output);
+ logResult(request, HttpStatus.valueOf(response.getStatusCodeValue()));
+
+ // Clear the MDC context so that no other transaction inadvertently
+ // uses our transaction id.
+ ApiUtils.clearMdcContext();
+
+ return response;
+ } catch (Exception e) {
+ return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ public ResponseEntity<String> processDelete(String content, HttpServletRequest request, HttpHeaders headers,
+ HttpServletResponse httpResponse, String index, String id, DocumentStoreInterface documentStore) {
+
+ // Initialize the MDC Context for logging purposes.
+ ApiUtils.initMdcContext(request, headers);
+
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setSerializationInclusion(Include.NON_EMPTY);
+ boolean isValid;
+ try {
+ isValid = searchService.validateRequest(headers, request, ApiUtils.Action.DELETE,
+ ApiUtils.SEARCH_AUTH_POLICY_NAME);
+ } catch (Exception e) {
+ logger.info(SearchDbMsgs.EXCEPTION_DURING_METHOD_CALL, "DocumentApi.processDelete", e.getMessage());
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ if (!isValid) {
+ return handleError(request, content, HttpStatus.FORBIDDEN);
+ }
+
+ String resourceVersion = headers.getFirst(REQUEST_HEADER_RESOURCE_VERSION);
+ if (resourceVersion == null || resourceVersion.isEmpty()) {
+ return handleError(request, "Request header 'If-Match' missing", HttpStatus.BAD_REQUEST);
+ }
+
+ DocumentStoreDataEntityImpl document = new DocumentStoreDataEntityImpl();
+ document.setId(id);
+ document.setVersion(resourceVersion);
+
+ DocumentOperationResult result = documentStore.deleteDocument(index, document);
+ String output = null;
+ if (ApiUtils.isSuccessStatusCode(result.getResultCode())) {
+ output = result.getError() != null
+ ? mapper.writerWithDefaultPrettyPrinter().writeValueAsString(result.getError())
+ : result.getFailureCause();
+ }
+
+ if (httpResponse != null) {
+ httpResponse.setHeader(RESPONSE_HEADER_RESOURCE_VERSION, result.getResultVersion());
+ }
+ ResponseEntity<String> response;
+ if (output == null) {
+ response = ResponseEntity.status(result.getResultCode()).build();
+ } else {
+ response = ResponseEntity.status(result.getResultCode()).contentType(MediaType.APPLICATION_JSON)
+ .body(output);
+ }
+
+ logResult(request, HttpStatus.valueOf(response.getStatusCodeValue()));
+
+ // Clear the MDC context so that no other transaction inadvertently
+ // uses our transaction id.
+ ApiUtils.clearMdcContext();
+
+ return response;
+ } catch (Exception e) {
+ return handleError(request, e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+ }