/******************************************************************************* * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2019) * * contact.vitam@culture.gouv.fr * * This software is a computer program whose purpose is to implement a digital archiving back-office system managing * high volumetry securely and efficiently. * * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as * circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". * * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the * successive licensors have only limited liability. * * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or * developing or reproducing the software by the user in light of its specific status of free software, that may mean * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data * to be ensured and, more generally, to use and operate it in the same conditions as regards security. * * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you * accept its terms. *******************************************************************************/ package fr.gouv.vitam.access.external.rest; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.eq; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.HEAD; import javax.ws.rs.HeaderParam; import javax.ws.rs.HttpMethod; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; import com.fasterxml.jackson.databind.JsonNode; import fr.gouv.vitam.access.internal.client.AccessInternalClient; import fr.gouv.vitam.access.internal.client.AccessInternalClientFactory; import fr.gouv.vitam.access.internal.common.exception.AccessInternalClientNotFoundException; import fr.gouv.vitam.access.internal.common.exception.AccessInternalClientServerException; import fr.gouv.vitam.common.CharsetUtils; import fr.gouv.vitam.common.GlobalDataRest; import fr.gouv.vitam.common.ParametersChecker; import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; import fr.gouv.vitam.common.database.builder.request.multiple.Select; import fr.gouv.vitam.common.database.parser.request.single.SelectParserSingle; import fr.gouv.vitam.common.error.VitamError; import fr.gouv.vitam.common.exception.InvalidParseOperationException; import fr.gouv.vitam.common.guid.GUIDFactory; import fr.gouv.vitam.common.logging.VitamLogger; import fr.gouv.vitam.common.logging.VitamLoggerFactory; import fr.gouv.vitam.common.model.RequestResponse; import fr.gouv.vitam.common.model.RequestResponseOK; import fr.gouv.vitam.common.parameter.ParameterHelper; import fr.gouv.vitam.common.security.SanityChecker; import fr.gouv.vitam.common.server.application.AsyncInputStreamHelper; import fr.gouv.vitam.common.server.application.HttpHeaderHelper; import fr.gouv.vitam.common.server.application.VitamHttpHeader; import fr.gouv.vitam.common.server.application.resources.ApplicationStatusResource; import fr.gouv.vitam.common.thread.VitamThreadPoolExecutor; import fr.gouv.vitam.common.thread.VitamThreadUtils; import fr.gouv.vitam.functional.administration.client.AdminManagementClient; import fr.gouv.vitam.functional.administration.client.AdminManagementClientFactory; import fr.gouv.vitam.functional.administration.common.exception.ReferentialNotFoundException; /** * AccessResourceImpl implements AccessResource */ @Path("/access-external/v1") @javax.ws.rs.ApplicationPath("webresources") public class AccessExternalResourceImpl extends ApplicationStatusResource { // FIXME P0 : Add a filter to protect the tenantId (check if it exists + return Unauthorized response or so). @see : // AuthorizationFilter private static final String ORIGINATING_AGENCY = "OriginatingAgency"; private static final String PREDICATES_FAILED_EXCEPTION = "Predicates Failed Exception "; private static final String ACCESS_EXTERNAL_MODULE = "ACCESS_EXTERNAL"; private static final String CODE_VITAM = "code_vitam"; private static final VitamLogger LOGGER = VitamLoggerFactory.getInstance(AccessExternalResourceImpl.class); /** * Constructor */ public AccessExternalResourceImpl() { LOGGER.debug("AccessExternalResource initialized"); } /** * get units list by query * * @param queryJson * @return Response */ @GET @Path("/units") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getUnits(JsonNode queryJson) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); Status status; JsonNode result = null; try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { result = client.selectUnits(queryJson); return Response.status(Status.OK).entity(result).build(); } catch (final InvalidParseOperationException e) { LOGGER.error("Predicate Failed Exception ", e); status = Status.PRECONDITION_FAILED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientServerException e) { LOGGER.error("Request unauthorized ", e); status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error("Request resources does not exits ", e); status = Status.NOT_FOUND; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * get units list by query with POST method * * @param queryJson * @param xhttpOverride * @return Response */ @POST @Path("/units") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getPostUnits(JsonNode queryJson, @HeaderParam(GlobalDataRest.X_HTTP_METHOD_OVERRIDE) String xhttpOverride) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return getUnits(queryJson); } /** * update units list by query * * @param queryDsl * @return Response */ @PUT @Path("/units") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response updateUnits(JsonNode queryDsl) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); final Status status = Status.NOT_IMPLEMENTED; return Response.status(status).entity(getErrorEntity(status)).build(); } /** * get units list by query based on identifier * * @param queryJson query as String * @param idUnit * @return Archive Unit */ @GET @Path("/units/{idu}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getUnitById(JsonNode queryJson, @PathParam("idu") String idUnit) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); Status status; JsonNode result = null; ParametersChecker.checkParameter("unit id is required", idUnit); try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { result = client.selectUnitbyId(queryJson, idUnit); return Response.status(Status.OK).entity(result).build(); } catch (final InvalidParseOperationException e) { LOGGER.error(PREDICATES_FAILED_EXCEPTION, e); status = Status.PRECONDITION_FAILED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientServerException e) { LOGGER.error("Unauthorized request Exception ", e); status = Status.UNAUTHORIZED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error("Request resources does not exits", e); status = Status.NOT_FOUND; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * get units list by query based on identifier * * @param queryJson * @param xhttpOverride * @param idUnit * @return Response */ @POST @Path("/units/{idu}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response createOrSelectUnitById(JsonNode queryJson, @HeaderParam(GlobalDataRest.X_HTTP_METHOD_OVERRIDE) String xhttpOverride, @PathParam("idu") String idUnit) { ParametersChecker.checkParameter("unit id is required", idUnit); Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return getUnitById(queryJson, idUnit); } /** * update archive units by Id with Json query * * @param queryJson null not allowed * @param idUnit units identifier * @return a archive unit result list */ @PUT @Path("/units/{idu}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response updateUnitById(JsonNode queryJson, @PathParam("idu") String idUnit) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); Status status; JsonNode result = null; try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { result = client.updateUnitbyId(queryJson, idUnit); return Response.status(Status.OK).entity(result).build(); } catch (final InvalidParseOperationException e) { LOGGER.error(PREDICATES_FAILED_EXCEPTION, e); status = Status.PRECONDITION_FAILED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientServerException e) { LOGGER.error(e.getMessage(), e); status = Status.UNAUTHORIZED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error(e.getMessage(), e); status = Status.NOT_FOUND; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * check existence of an unit * * @param idUnit * @return check result */ @HEAD @Path("/units/{idu}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response checkExitsUnitById(@PathParam("idu") String idUnit) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); final Status status = Status.NOT_IMPLEMENTED; return Response.status(status).build(); } /** * Get the ObjectGroup linked to the unit * * @param idu * @param queryJson * @param asyncResponse * @return ObjectGroup as a Response containing a RequestResponseOK or VitamError as Body */ @GET @Path("/units/{idu}/object") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectGroupByUnit(@PathParam("idu") String idu, JsonNode queryJson) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); JsonNode result; Status status; try { try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { String idObjectGroup = idObjectGroup(idu); result = client.selectObjectbyId(queryJson, idObjectGroup); return Response.status(Status.OK).entity(RequestResponseOK.getFromJsonNode(result)).build(); } } catch (final InvalidParseOperationException e) { LOGGER.error(e); status = Status.PRECONDITION_FAILED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientServerException e) { LOGGER.error(e); status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error(e); status = Status.NOT_FOUND; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * Get the ObjectGroup linked to the unit * * @param xhttpOverride * @param idu * @param queryJson * @param asyncResponse * @return ObjectGroup as a Response containing a RequestResponseOK or VitamError as Body */ @POST @Path("/units/{idu}/object") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectGroupByUnitPost(@HeaderParam(GlobalDataRest.X_HTTP_METHOD_OVERRIDE) String xhttpOverride, @PathParam("idu") String idu, JsonNode queryJson) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return getObjectGroupByUnit(idu, queryJson); } /** * Get the ObjectGroup binary content according to X-Qualifier and X-Version * * @param headers * @param idu * @param query * @param asyncResponse */ @GET @Path("/units/{idu}/object") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_OCTET_STREAM) public void getObject(@Context HttpHeaders headers, @PathParam("idu") String idu, JsonNode query, @Suspended final AsyncResponse asyncResponse) { Status status; try { String idObjectGroup = idObjectGroup(idu); getObject(headers, idObjectGroup, query, asyncResponse, false); } catch (final InvalidParseOperationException e) { LOGGER.error(PREDICATES_FAILED_EXCEPTION, e); status = Status.PRECONDITION_FAILED; AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(status).build()); } catch (final AccessInternalClientServerException e) { LOGGER.error("Unauthorized request Exception ", e); status = Status.UNAUTHORIZED; AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(status).build()); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error("Request resources does not exits", e); status = Status.NOT_FOUND; AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(status).build()); } } /** * Get the ObjectGroup binary content according to X-Qualifier and X-Version * * @param headers * @param idu * @param query * @param asyncResponse */ @POST @Path("/units/{idu}/object") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_OCTET_STREAM) public void getObjectPost(@Context HttpHeaders headers, @PathParam("idu") String idu, JsonNode query, @Suspended final AsyncResponse asyncResponse) { final String xHttpOverride = headers.getRequestHeader(GlobalDataRest.X_HTTP_METHOD_OVERRIDE).get(0); if (xHttpOverride == null || !HttpMethod.GET.equalsIgnoreCase(xHttpOverride)) { AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(Status.PRECONDITION_FAILED) .entity(getErrorEntity(Status.PRECONDITION_FAILED).toString()).build()); } else { getObject(headers, idu, query, asyncResponse); } } /** * get object group list by query * * @param queryDsl * @return ObjectGroups as a Response containing a RequestResponseOK or VitamError as Body */ @GET @Path("/objects") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectsList(JsonNode queryDsl) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); final Status status = Status.NOT_IMPLEMENTED; return Response.status(status).entity(getErrorEntity(status)).build(); } /** * @param xhttpOverride * @param query * @return ObjectGroups as a Response containing a RequestResponseOK or VitamError as Body */ @POST @Path("/objects") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectListPost(@HeaderParam(GlobalDataRest.X_HTTP_METHOD_OVERRIDE) String xhttpOverride, JsonNode query) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return getObjectsList(query); } /** * get object group list by query and id * * @param idObjectGroup * @param queryJson * @return ObjectGroup as a Response containing a RequestResponseOK or VitamError as Body */ @GET @Path("/objects/{ido}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectGroup(@PathParam("ido") String idObjectGroup, JsonNode queryJson) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); JsonNode result; Status status; try { try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { result = client.selectObjectbyId(queryJson, idObjectGroup); return Response.status(Status.OK).entity(RequestResponseOK.getFromJsonNode(result)).build(); } } catch (final InvalidParseOperationException e) { LOGGER.error(e); status = Status.PRECONDITION_FAILED; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientServerException e) { LOGGER.error(e); status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final AccessInternalClientNotFoundException e) { LOGGER.error(e); status = Status.NOT_FOUND; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * get object group list by query and id * * @param headers * @param idObjectGroup * @param queryJson * @return ObjectGroup as a Response containing a RequestResponseOK or VitamError as Body */ @POST @Path("/objects/{ido}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getObjectGroupPost(@Context HttpHeaders headers, @PathParam("ido") String idObjectGroup, JsonNode queryJson) { final String xHttpOverride = headers.getRequestHeader(GlobalDataRest.X_HTTP_METHOD_OVERRIDE).get(0); Response response = checkXHttpOverrideMethodGet(xHttpOverride); if (response != null) { return response; } return getObjectGroup(idObjectGroup, queryJson); } /** * Get the ObjectGroup binary content according to X-Qualifier and X-Version * * @param headers * @param idObjectGroup * @param query * @param asyncResponse */ @GET @Path("/objects/{ido}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_OCTET_STREAM) public void getObjectIdoGet(@Context HttpHeaders headers, @PathParam("ido") String idObjectGroup, JsonNode query, @Suspended final AsyncResponse asyncResponse) { getObject(headers, idObjectGroup, query, asyncResponse, false); } /** * Get the ObjectGroup binary content according to X-Qualifier and X-Version * * @param headers * @param idObjectGroup * @param query * @param asyncResponse */ @POST @Path("/objects/{ido}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_OCTET_STREAM) public void getObjectIdoPost(@Context HttpHeaders headers, @PathParam("ido") String idObjectGroup, JsonNode query, @Suspended final AsyncResponse asyncResponse) { getObject(headers, idObjectGroup, query, asyncResponse, true); } private VitamError getErrorEntity(Status status) { return new VitamError(status.name()).setHttpCode(status.getStatusCode()).setContext(ACCESS_EXTERNAL_MODULE) .setState(CODE_VITAM).setMessage(status.getReasonPhrase()).setDescription(status.getReasonPhrase()); } private String idObjectGroup(String idu) throws InvalidParseOperationException, AccessInternalClientServerException, AccessInternalClientNotFoundException { // Select "Object from ArchiveUNit idu JsonNode result = null; ParametersChecker.checkParameter("unit id is required", idu); try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { Select select = new Select(); select.addUsedProjection("#object"); result = client.selectUnitbyId(select.getFinalSelect(), idu); SanityChecker.checkJsonAll(result); return result.findValue("#object").textValue(); } } private void getObject(HttpHeaders headers, String idObjectGroup, JsonNode query, final AsyncResponse asyncResponse, boolean post) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); VitamThreadPoolExecutor.getDefaultExecutor() .execute(() -> asyncObjectStream(asyncResponse, headers, idObjectGroup, query, post)); } private void asyncObjectStream(AsyncResponse asyncResponse, HttpHeaders headers, String idObjectGroup, JsonNode query, boolean post) { try { if (post) { if (!HttpHeaderHelper.hasValuesFor(headers, VitamHttpHeader.METHOD_OVERRIDE)) { AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(Status.PRECONDITION_FAILED) .entity(getErrorEntity(Status.PRECONDITION_FAILED).toString()).build()); return; } final String xHttpOverride = headers.getRequestHeader(GlobalDataRest.X_HTTP_METHOD_OVERRIDE).get(0); if (xHttpOverride == null || !HttpMethod.GET.equalsIgnoreCase(xHttpOverride)) { AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(Status.METHOD_NOT_ALLOWED).entity(getErrorEntity(Status.METHOD_NOT_ALLOWED) .toString()).build()); return; } } if (!HttpHeaderHelper.hasValuesFor(headers, VitamHttpHeader.QUALIFIER) || !HttpHeaderHelper.hasValuesFor(headers, VitamHttpHeader.VERSION)) { LOGGER.error("At least one required header is missing. Required headers: (" + VitamHttpHeader.QUALIFIER.name() + ", " + VitamHttpHeader.VERSION.name() + ")"); AsyncInputStreamHelper.asyncResponseResume(asyncResponse, Response.status(Status.PRECONDITION_FAILED) .entity(getErrorEntity(Status.PRECONDITION_FAILED).toString()).build()); return; } } catch (final IllegalArgumentException e) { LOGGER.error(e); final Response errorResponse = Response.status(Status.PRECONDITION_FAILED) .entity(getErrorEntity(Status.PRECONDITION_FAILED).toString()) .build(); AsyncInputStreamHelper.asyncResponseResume(asyncResponse, errorResponse); return; } final String xQualifier = headers.getRequestHeader(GlobalDataRest.X_QUALIFIER).get(0); final String xVersion = headers.getRequestHeader(GlobalDataRest.X_VERSION).get(0); AsyncInputStreamHelper helper; try (AccessInternalClient client = AccessInternalClientFactory.getInstance().getClient()) { HttpHeaderHelper.checkVitamHeaders(headers); final Response response = client.getObject(query, idObjectGroup, xQualifier, Integer.valueOf(xVersion)); helper = new AsyncInputStreamHelper(asyncResponse, response); final ResponseBuilder responseBuilder = Response.status(Status.OK).header(GlobalDataRest.X_QUALIFIER, xQualifier) .header(GlobalDataRest.X_VERSION, xVersion) .header("Content-Disposition", response.getHeaderString("Content-Disposition")) .type(response.getMediaType()); helper.writeResponse(responseBuilder); } catch (final InvalidParseOperationException | IllegalArgumentException exc) { LOGGER.error(exc); final Response errorResponse = Response.status(Status.PRECONDITION_FAILED) .entity(getErrorEntity(Status.PRECONDITION_FAILED).toString()) .build(); AsyncInputStreamHelper.asyncResponseResume(asyncResponse, errorResponse); } catch (final AccessInternalClientServerException | AccessInternalClientNotFoundException exc) { LOGGER.error(exc.getMessage(), exc); final Response errorResponse = Response.status(Status.INTERNAL_SERVER_ERROR).entity(getErrorEntity(Status.INTERNAL_SERVER_ERROR) .toString()).build(); AsyncInputStreamHelper.asyncResponseResume(asyncResponse, errorResponse); } } /** * findDocuments * * @param select * @return Response */ @Path("/accession-register") @GET @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response findAccessionRegister(JsonNode select) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); try (AdminManagementClient client = AdminManagementClientFactory.getInstance().getClient()) { final RequestResponse result = client.getAccessionRegister(select); return Response.status(Status.OK).entity(result).build(); } catch (final ReferentialNotFoundException e) { LOGGER.error(e); return Response.status(Status.OK).entity(new RequestResponseOK()).build(); } catch (final InvalidParseOperationException e) { LOGGER.error(e); final Status status = Status.BAD_REQUEST; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (final Exception e) { LOGGER.error(e); final Status status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * findDocuments * * @param select * @param xhttpOverride * @return Response */ @Path("/accession-register") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response findPostAccessionRegister(JsonNode select, @HeaderParam("X-HTTP-Method-Override") String xhttpOverride) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return findAccessionRegister(select); } /** * findDocumentByID * * @param documentId * @return Response */ @GET @Path("/accession-register/{id_document}") @Produces(MediaType.APPLICATION_JSON) // FIXME manque un DSL pour permettre une projection public Response findAccessionRegisterById(@PathParam("id_document") String documentId) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); final Status status = Status.NOT_IMPLEMENTED; return Response.status(status).entity(getErrorEntity(status)).build(); } /** * findDocumentByID * * @param documentId * @param xhttpOverride * @return Response */ @POST @Path("/accession-register/{id_document}") @Produces(MediaType.APPLICATION_JSON) // FIXME manque un DSL pour permettre une projection public Response findPostAccessionRegisterById(@PathParam("id_document") String documentId, @HeaderParam("X-HTTP-Method-Override") String xhttpOverride) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return findAccessionRegisterById(documentId); } /** * findAccessionRegisterDetail * * @param documentId * @param select * @return Response */ @GET @Path("/accession-register/{id_document}/accession-register-detail") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response findAccessionRegisterDetail(@PathParam("id_document") String documentId, JsonNode select) { Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); ParametersChecker.checkParameter("accession register id is a mandatory parameter", documentId); try (AdminManagementClient client = AdminManagementClientFactory.getInstance().getClient()) { final SelectParserSingle parser = new SelectParserSingle(); parser.parse(select); parser.addCondition(eq(ORIGINATING_AGENCY, URLDecoder.decode(documentId, CharsetUtils.UTF_8))); RequestResponse accessionRegisterDetail = client.getAccessionRegisterDetail(parser.getRequest().getFinalSelect()); return Response.status(Status.OK).entity(accessionRegisterDetail).build(); } catch (final ReferentialNotFoundException e) { LOGGER.debug(e); return Response.status(Status.OK).entity(new RequestResponseOK()).build(); } catch (InvalidParseOperationException | UnsupportedEncodingException | InvalidCreateOperationException e) { LOGGER.error(e); final Status status = Status.BAD_REQUEST; return Response.status(status).entity(getErrorEntity(status)).build(); } catch (Exception e) { LOGGER.error(e); final Status status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(getErrorEntity(status)).build(); } } /** * findAccessionRegisterDetail * * @param documentId * @param select * @param xhttpOverride * @return Response */ @POST @Path("/accession-register/{id_document}/accession-register-detail") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response findPostAccessionRegisterDetail(@PathParam("id_document") String documentId, JsonNode select, @HeaderParam("X-HTTP-Method-Override") String xhttpOverride) { Response response = checkXHttpOverrideMethodGet(xhttpOverride); if (response != null) { return response; } return findAccessionRegisterDetail(documentId, select); } private Response checkXHttpOverrideMethodGet(String xhttpOverride) { if (xhttpOverride == null || !HttpMethod.GET.equalsIgnoreCase(xhttpOverride)) { final Status status = Status.PRECONDITION_FAILED; Integer tenantId = ParameterHelper.getTenantParameter(); VitamThreadUtils.getVitamSession().setRequestId(GUIDFactory.newRequestIdGUID(tenantId)); return Response.status(status).entity(status).build(); } return null; } }