/*******************************************************************************
* 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.storage.offers.workspace.driver;
import java.io.InputStream;
import java.util.Properties;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import com.fasterxml.jackson.databind.JsonNode;
import fr.gouv.vitam.common.GlobalDataRest;
import fr.gouv.vitam.common.ParametersChecker;
import fr.gouv.vitam.common.client.DefaultClient;
import fr.gouv.vitam.common.digest.DigestType;
import fr.gouv.vitam.common.error.VitamCode;
import fr.gouv.vitam.common.error.VitamCodeHelper;
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.storage.driver.Connection;
import fr.gouv.vitam.storage.driver.exception.StorageDriverException;
import fr.gouv.vitam.storage.driver.model.StorageCapacityResult;
import fr.gouv.vitam.storage.driver.model.StorageCheckRequest;
import fr.gouv.vitam.storage.driver.model.StorageCheckResult;
import fr.gouv.vitam.storage.driver.model.StorageCountResult;
import fr.gouv.vitam.storage.driver.model.StorageGetResult;
import fr.gouv.vitam.storage.driver.model.StorageListRequest;
import fr.gouv.vitam.storage.driver.model.StorageMetadatasResult;
import fr.gouv.vitam.storage.driver.model.StorageObjectRequest;
import fr.gouv.vitam.storage.driver.model.StoragePutRequest;
import fr.gouv.vitam.storage.driver.model.StoragePutResult;
import fr.gouv.vitam.storage.driver.model.StorageRemoveRequest;
import fr.gouv.vitam.storage.driver.model.StorageRemoveResult;
import fr.gouv.vitam.storage.driver.model.StorageRequest;
import fr.gouv.vitam.storage.engine.common.StorageConstants;
import fr.gouv.vitam.storage.engine.common.model.DataCategory;
import fr.gouv.vitam.storage.engine.common.model.ObjectInit;
import fr.gouv.vitam.storage.offers.workspace.driver.DriverImpl.InternalDriverFactory;
/**
* Workspace Connection Implementation
*/
public class ConnectionImpl extends DefaultClient implements Connection {
private static final String X_USED_SPACE = "X-Used-Space";
private static final String X_USABLE_SPACE = "X-Usable-Space";
private static final long DEFAULT_MAX_AVAILABILITY = 100000000000L;
private static final VitamLogger LOGGER = VitamLoggerFactory.getInstance(ConnectionImpl.class);
private static final String OBJECTS_PATH = "/objects";
private static final String COUNT_PATH = "/count";
private static final String METADATAS = "/metadatas";
private static final String REQUEST_IS_A_MANDATORY_PARAMETER = "Request is a mandatory parameter";
private static final String GUID_IS_A_MANDATORY_PARAMETER = "GUID is a mandatory parameter";
private static final String TENANT_IS_A_MANDATORY_PARAMETER = "Tenant is a mandatory parameter";
private static final String ALGORITHM_IS_A_MANDATORY_PARAMETER = "Algorithm is a mandatory parameter";
private static final String STREAM_IS_A_MANDATORY_PARAMETER = "Stream is a mandatory parameter";
private static final String TYPE_IS_A_MANDATORY_PARAMETER = "Type is a mandatory parameter";
private static final String TYPE_IS_NOT_VALID = "Type is not valid";
private static final String FOLDER_IS_A_MANDATORY_PARAMETER = "Folder is a mandatory parameter";
private static final String FOLDER_IS_NOT_VALID = "Folder is not valid";
private static final String DIGEST_IS_A_MANDATORY_PARAMETER = "Digest is a mandatory parameter";
private final String driverName;
private final Properties parameters;
/**
* Constructor
*
* @param factory
* @param parameters
*/
public ConnectionImpl(InternalDriverFactory factory, Properties parameters) {
super(factory);
driverName = factory.getName();
this.parameters = parameters;
}
@Override
public StorageCapacityResult getStorageCapacity(Integer tenantId) throws StorageDriverException {
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, tenantId);
Response response = null;
try {
response = performRequest(HttpMethod.HEAD, OBJECTS_PATH + "/" + DataCategory.OBJECT,
getDefaultHeaders(tenantId, null, null, null), MediaType.APPLICATION_JSON_TYPE, false);
if (Response.Status.OK.getStatusCode() == response.getStatus()) {
long available = DEFAULT_MAX_AVAILABILITY;
if (response.getHeaderString(X_USABLE_SPACE) != null) {
try {
available = Long.parseLong(response.getHeaderString(X_USABLE_SPACE));
} catch (NumberFormatException e) {
LOGGER.info("Not a number", e);
}
}
long used = 0;
if (response.getHeaderString(X_USED_SPACE) != null) {
try {
used = Long.parseLong(response.getHeaderString(X_USED_SPACE));
} catch (NumberFormatException e) {
LOGGER.info("Not a number", e);
}
}
return new StorageCapacityResult(tenantId, available, used);
}
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
response.getStatusInfo().getReasonPhrase());
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public StorageCountResult countObjects(StorageRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(FOLDER_IS_A_MANDATORY_PARAMETER, request.getType());
Response response = null;
try {
response = performRequest(HttpMethod.GET, OBJECTS_PATH + "/" + request.getType() + COUNT_PATH,
getDefaultHeaders(request.getTenantId(), null, null, null), MediaType.APPLICATION_JSON_TYPE, false);
if (Response.Status.OK.getStatusCode() == response.getStatus()) {
JsonNode result = handleResponseStatus(response, JsonNode.class);
return new StorageCountResult(request.getTenantId(), request.getType(), result.get("numberObjects").longValue());
}
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
response.getStatusInfo().getReasonPhrase());
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public StorageGetResult getObject(StorageObjectRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(FOLDER_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter(FOLDER_IS_NOT_VALID, DataCategory.getByFolder(request.getType()));
Response response = null;
try {
response = performRequest(HttpMethod.GET,
OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid(),
getDefaultHeaders(request.getTenantId(), null, null, null), MediaType.APPLICATION_OCTET_STREAM_TYPE);
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case OK:
final StorageGetResult result = new StorageGetResult(request.getTenantId(), request.getType(),
request.getGuid(), response);
return result;
case NOT_FOUND:
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_OBJECT_NOT_FOUND, request.getGuid()));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
"Object " + "not found");
case PRECONDITION_FAILED:
LOGGER.error("Precondition failed");
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED,
"Precondition failed");
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
} catch (final VitamClientInternalException e1) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e1);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e1.getMessage());
} finally {
if (response != null && response.getStatus() != Status.OK.getStatusCode()) {
consumeAnyEntityAndClose(response);
}
}
}
@Override
public StoragePutResult putObject(StoragePutRequest request) throws StorageDriverException {
Response response = null;
try {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(ALGORITHM_IS_A_MANDATORY_PARAMETER, request.getDigestAlgorithm());
ParametersChecker.checkParameter(TYPE_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter(TYPE_IS_NOT_VALID, DataCategory.getByFolder(request.getType()));
ParametersChecker.checkParameter(STREAM_IS_A_MANDATORY_PARAMETER, request.getDataStream());
final InputStream stream = request.getDataStream();
// init
final ObjectInit objectInit = new ObjectInit();
objectInit.setDigestAlgorithm(DigestType.valueOf(request.getDigestAlgorithm()));
objectInit.setType(DataCategory.getByFolder(request.getType()));
response = performRequest(HttpMethod.POST, OBJECTS_PATH + "/" + objectInit.getType() + "/" + request.getGuid(),
getDefaultHeaders(request.getTenantId(), StorageConstants.COMMAND_INIT, null, null), objectInit,
MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE, false);
return performPutRequests(stream, handleResponseStatus(response, ObjectInit.class), request.getTenantId());
} catch (final IllegalArgumentException exc) {
LOGGER.error(exc);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED, exc.getMessage());
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public StorageRemoveResult removeObject(StorageRemoveRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(FOLDER_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter(FOLDER_IS_NOT_VALID, DataCategory.getByFolder(request.getType()));
ParametersChecker.checkParameter(ALGORITHM_IS_A_MANDATORY_PARAMETER, request.getDigestAlgorithm());
ParametersChecker.checkParameter(DIGEST_IS_A_MANDATORY_PARAMETER, request.getDigestHashBase16());
Response response = null;
try {
response = performRequest(HttpMethod.DELETE,
OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid(),
getDefaultHeaders(request.getTenantId(), null, request.getDigestHashBase16(),
request.getDigestAlgorithm().getName()),
MediaType.APPLICATION_JSON_TYPE, false);
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case OK:
final JsonNode json = handleResponseStatus(response, JsonNode.class);
final StorageRemoveResult result = new StorageRemoveResult(request.getTenantId(), request.getType(),
request.getGuid(), request.getDigestAlgorithm(), request.getDigestHashBase16(),
Response.Status.OK.toString().equals(json.get("status").asText()));
return result;
case NOT_FOUND:
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_OBJECT_NOT_FOUND, request.getGuid()));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
"Object " + "not found");
case BAD_REQUEST:
LOGGER.error("Bad request");
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED,
"Bad request");
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public Boolean objectExistsInOffer(StorageObjectRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
Response response = null;
try {
response = performRequest(HttpMethod.HEAD,
OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid(),
getDefaultHeaders(request.getTenantId(), null, null, null), MediaType.APPLICATION_OCTET_STREAM_TYPE, false);
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case OK:
case NO_CONTENT:
return true;
case NOT_FOUND:
return false;
case BAD_REQUEST:
LOGGER.error("Bad request");
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED,
"Bad request");
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
/**
* Common method to handle response status
*
* @param response
* the response to be handled
* @param responseType
* the type to map the response into
* @param <R>
* the class type to be returned
* @return the response mapped as a POJO
* @throws StorageDriverException
* if any from the server
*/
protected <R> R handleResponseStatus(Response response, Class<R> responseType) throws StorageDriverException {
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case CREATED:
case OK:
return response.readEntity(responseType);
case INTERNAL_SERVER_ERROR:
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
status.getReasonPhrase());
case NOT_FOUND:
// FIXME P1 : clean useless case
LOGGER.error(status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
status.getReasonPhrase());
case SERVICE_UNAVAILABLE:
LOGGER.error(status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
status.getReasonPhrase());
case CONFLICT:
LOGGER.error(status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED,
status.getReasonPhrase());
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
}
/**
* Generate the default header map
*
* @param tenantId
* the tenantId
* @param command
* the command to be added
* @param digest
* the digest of the object to be added
* @param digestType
* the type of the digest to be added
* @return header map
*/
private MultivaluedHashMap<String, Object> getDefaultHeaders(Integer tenantId, String command, String digest,
String digestType) {
final MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
if (tenantId != null) {
headers.add(GlobalDataRest.X_TENANT_ID, tenantId);
}
if (command != null) {
headers.add(GlobalDataRest.X_COMMAND, command);
}
if (digest != null) {
headers.add(GlobalDataRest.X_DIGEST, digest);
}
if (digestType != null) {
headers.add(GlobalDataRest.X_DIGEST_ALGORITHM, digestType);
}
return headers;
}
/**
* Method performing a PutRequests
*
* @param stream
* the stream to be chunked if necessary
* @param result
* the result received from the server after the init
* @param tenantId
* the tenant id
* @return a PutObjectResult the final result received from the server
* @throws StorageDriverException
* in case the server encounters an exception
*/
private StoragePutResult performPutRequests(InputStream stream, ObjectInit result, Integer tenantId)
throws StorageDriverException {
StoragePutResult finalResult = null;
Response response = null;
try {
response = performRequest(HttpMethod.PUT, OBJECTS_PATH + "/" + result.getType() + "/" + result.getId(),
getDefaultHeaders(tenantId, StorageConstants.COMMAND_END, null, null), stream,
MediaType.APPLICATION_OCTET_STREAM_TYPE, MediaType.APPLICATION_JSON_TYPE);
final JsonNode json = handleResponseStatus(response, JsonNode.class);
finalResult = new StoragePutResult(tenantId, result.getType().getFolder(), result.getId(), result.getId(),
json.get("digest").textValue(), Long.valueOf(json.get("size").textValue()));
if (Response.Status.CREATED.getStatusCode() != response.getStatus()) {
LOGGER.error("Error to perfom put object");
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
"Error to perfom put object");
}
} catch (final VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
return finalResult;
}
@Override
public StorageCheckResult checkObject(StorageCheckRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(FOLDER_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter(FOLDER_IS_NOT_VALID, DataCategory.getByFolder(request.getType()));
ParametersChecker.checkParameter(ALGORITHM_IS_A_MANDATORY_PARAMETER, request.getDigestAlgorithm());
ParametersChecker.checkParameter(DIGEST_IS_A_MANDATORY_PARAMETER, request.getDigestHashBase16());
Response response = null;
try {
response = performRequest(HttpMethod.HEAD,
OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid(),
getDefaultHeaders(request.getTenantId(), null, request.getDigestHashBase16(),
request.getDigestAlgorithm().getName()),
MediaType.APPLICATION_OCTET_STREAM_TYPE, false);
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case OK:
case CONFLICT:
final StorageCheckResult result = new StorageCheckResult(request.getTenantId(), request.getType(),
request.getGuid(), request.getDigestAlgorithm(), request.getDigestHashBase16(),
status.equals(Status.OK));
return result;
case NOT_FOUND:
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_OBJECT_NOT_FOUND, request.getGuid()));
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
"Object " + "not found");
case PRECONDITION_FAILED:
LOGGER.error("Precondition failed");
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.PRECONDITION_FAILED,
"Precondition failed");
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
} catch (final VitamClientInternalException e1) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e1);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e1.getMessage());
} finally {
if (response != null && response.getStatus() != Status.OK.getStatusCode()) {
consumeAnyEntityAndClose(response);
}
}
}
@Override
public StorageMetadatasResult getMetadatas(StorageObjectRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(FOLDER_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter(GUID_IS_A_MANDATORY_PARAMETER, request.getGuid());
Response response = null;
try {
response = performRequest(HttpMethod.GET,
OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid() + METADATAS,
getDefaultHeaders(request.getTenantId(), null, null, null), MediaType.APPLICATION_JSON_TYPE, false);
final Response.Status status = Response.Status.fromStatusCode(response.getStatus());
switch (status) {
case OK:
return handleResponseStatus(response, StorageMetadatasResult.class);
case NOT_FOUND:
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_OBJECT_NOT_FOUND), request.getGuid());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.NOT_FOUND,
"Object " + "not found");
default:
LOGGER.error(INTERNAL_SERVER_ERROR + " : " + status.getReasonPhrase());
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR,
INTERNAL_SERVER_ERROR);
}
} catch (VitamClientInternalException e) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), e);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
} finally {
consumeAnyEntityAndClose(response);
}
}
@Override
public Response listObjects(StorageListRequest request) throws StorageDriverException {
ParametersChecker.checkParameter(REQUEST_IS_A_MANDATORY_PARAMETER, request);
ParametersChecker.checkParameter(TENANT_IS_A_MANDATORY_PARAMETER, request.getTenantId());
ParametersChecker.checkParameter(TYPE_IS_A_MANDATORY_PARAMETER, request.getType());
ParametersChecker.checkParameter("X-Cursor is mandatory", request.isxCursor());
try {
MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
headers.add(GlobalDataRest.X_TENANT_ID, request.getTenantId());
headers.add(GlobalDataRest.X_CURSOR, request.isxCursor());
if (request.getCursorId() != null) {
headers.add(GlobalDataRest.X_CURSOR_ID, request.getCursorId());
}
return performRequest(HttpMethod.GET, OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()), headers,
MediaType.APPLICATION_JSON_TYPE);
} catch (Exception exc) {
LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_TECHNICAL_INTERNAL_ERROR), exc);
throw new StorageDriverException(driverName, StorageDriverException.ErrorCode.INTERNAL_SERVER_ERROR, exc);
}
}
}