package fr.gouv.vitam.access.external.client;
import java.io.InputStream;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.databind.JsonNode;
import fr.gouv.vitam.access.external.api.AdminCollections;
import fr.gouv.vitam.access.external.common.exception.AccessExternalClientException;
import fr.gouv.vitam.access.external.common.exception.AccessExternalClientNotFoundException;
import fr.gouv.vitam.access.external.common.exception.AccessExternalClientServerException;
import fr.gouv.vitam.common.GlobalDataRest;
import fr.gouv.vitam.common.client.DefaultClient;
import fr.gouv.vitam.common.exception.InvalidParseOperationException;
import fr.gouv.vitam.common.exception.VitamClientInternalException;
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.logbook.common.client.ErrorMessage;
/**
* Rest client implementation for Access External
*/
public class AdminExternalClientRest extends DefaultClient implements AdminExternalClient {
private static final VitamLogger LOGGER = VitamLoggerFactory.getInstance(AdminExternalClientRest.class);
private static final String URI_NOT_FOUND = "URI not found";
private static final String REQUEST_PRECONDITION_FAILED = "Request precondition failed";
AdminExternalClientRest(AdminExternalClientFactory factory) {
super(factory);
}
@Override
public Response checkDocuments(AdminCollections documentType, InputStream stream, Integer tenantId)
throws AccessExternalClientException {
Response response = null;
final MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
headers.add(GlobalDataRest.X_TENANT_ID, tenantId);
try {
response = performRequest(HttpMethod.PUT, documentType.getName(), headers,
stream, MediaType.APPLICATION_OCTET_STREAM_TYPE,
MediaType.APPLICATION_JSON_TYPE);
if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
throw new AccessExternalClientNotFoundException(URI_NOT_FOUND);
}
return Response.fromResponse(response).build();
} catch (final VitamClientInternalException e) {
LOGGER.error(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
throw new AccessExternalClientServerException(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public Response createDocuments(AdminCollections documentType, InputStream stream, Integer tenantId)
throws AccessExternalClientException {
Response response = null;
final MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
headers.add(GlobalDataRest.X_TENANT_ID, tenantId);
try {
response = performRequest(HttpMethod.POST, documentType.getName(), headers,
stream, MediaType.APPLICATION_OCTET_STREAM_TYPE,
MediaType.APPLICATION_JSON_TYPE);
if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
staticConsumeAnyEntityAndClose(response);
throw new AccessExternalClientNotFoundException(URI_NOT_FOUND);
}
return response;
} catch (final VitamClientInternalException e) {
LOGGER.error(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
throw new AccessExternalClientServerException(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
}
}
@Override
public RequestResponse findDocuments(AdminCollections documentType, JsonNode select, Integer tenantId)
throws AccessExternalClientException, InvalidParseOperationException {
Response response = null;
final MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
headers.add(GlobalDataRest.X_TENANT_ID, tenantId);
try {
response = performRequest(HttpMethod.GET, documentType.getName(), headers,
select, MediaType.APPLICATION_JSON_TYPE,
MediaType.APPLICATION_JSON_TYPE, false);
if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
throw new AccessExternalClientNotFoundException(URI_NOT_FOUND);
} else if (response.getStatus() == Response.Status.PRECONDITION_FAILED.getStatusCode()) {
throw new AccessExternalClientException(REQUEST_PRECONDITION_FAILED);
}
return RequestResponse.parseFromResponse(response);
} catch (final VitamClientInternalException e) {
LOGGER.error(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
throw new AccessExternalClientServerException(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
// FIXME manque un DSL pour permettre une projection
public RequestResponse findDocumentById(AdminCollections documentType, String documentId, Integer tenantId)
throws AccessExternalClientException, InvalidParseOperationException {
Response response = null;
final MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
headers.add(GlobalDataRest.X_TENANT_ID, tenantId);
try {
response = performRequest(HttpMethod.GET, documentType.getName() + "/" + documentId, headers,
MediaType.APPLICATION_JSON_TYPE);
if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
throw new AccessExternalClientNotFoundException(URI_NOT_FOUND);
} else if (response.getStatus() == Response.Status.PRECONDITION_FAILED.getStatusCode()) {
throw new AccessExternalClientException(REQUEST_PRECONDITION_FAILED);
}
return RequestResponse.parseFromResponse(response);
} catch (final VitamClientInternalException e) {
LOGGER.error(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
throw new AccessExternalClientServerException(ErrorMessage.INTERNAL_SERVER_ERROR.getMessage(), e);
} finally {
consumeAnyEntityAndClose(response);
}
}
}