class ConnectionImpl extends AbstractConnection {

    @Override
    public StoragePutResult putObject(StoragePutRequest request) throws StorageDriverException {
        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());
        } catch (final IllegalArgumentException exc) {
            throw new StorageDriverPreconditionFailedException(getDriverName(), exc);
        }

        VitamRequestBuilder requestBuilder = put()
            .withPath(OBJECTS_PATH + "/" + DataCategory.getByFolder(request.getType()) + "/" + request.getGuid())
            .withHeader(GlobalDataRest.X_TENANT_ID, request.getTenantId())
            .withHeader(GlobalDataRest.X_DIGEST_ALGORITHM, request.getDigestAlgorithm())
            .withHeader(GlobalDataRest.VITAM_CONTENT_LENGTH, request.getSize())
            .withBody(request.getDataStream())
            .withOctetContentType()
            .withJsonAccept();

        try (Response response = make(requestBuilder)) {
            checkStorageException(response);
            final JsonNode json = response.readEntity(JsonNode.class);

            if (Status.CREATED.getStatusCode() != response.getStatus()) {
                throw new StorageDriverException(getDriverName(),
                    "Error while performing put object operation for object " + request.getGuid() + " (" +
                        request.getType() + ")", true);
            }

            return new StoragePutResult(request.getTenantId(), request.getType(), request.getGuid(), request.getGuid(),
                json.get("digest").textValue(), json.get("size").longValue());
        } catch (final VitamClientInternalException e) {
            throw new StorageDriverException(getDriverName(), true, e);
        }
    }

      ConnectionImpl(String driverName, VitamClientFactoryInterface<? extends AbstractConnection> factory);

}