Search in sources :

Example 1 with CopyObjectResultHandler

use of com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.CopyObjectResultHandler in project aws-sdk-android by aws-amplify.

the class AmazonS3Client method copyPart.

/**
 * Copies a source object to a part of a multipart upload. To copy an
 * object, the caller's account must have read access to the source object
 * and write access to the destination bucket. </p>
 * <p>
 * If constraints are specified in the <code>CopyPartRequest</code> (e.g.
 * {@link CopyPartRequest#setMatchingETagConstraints(List)}) and are not
 * satisfied when Amazon S3 receives the request, this method returns
 * <code>null</code>. This method returns a non-null result under all other
 * circumstances.
 * </p>
 *
 * @param copyPartRequest The request object containing all the options for
 *            copying an Amazon S3 object.
 * @return A {@link CopyPartResult} object containing the information
 *         returned by Amazon S3 about the newly created object, or
 *         <code>null</code> if constraints were specified that weren't met
 *         when Amazon S3 attempted to copy the object.
 * @throws AmazonClientException If any errors are encountered in the client
 *             while making the request or handling the response.
 * @throws AmazonServiceException If any errors occurred in Amazon S3 while
 *             processing the request.
 * @see AmazonS3#copyObject(CopyObjectRequest)
 * @see AmazonS3#initiateMultipartUpload(InitiateMultipartUploadRequest)
 */
@Override
public CopyPartResult copyPart(CopyPartRequest copyPartRequest) {
    assertParameterNotNull(copyPartRequest.getSourceBucketName(), "The source bucket name must be specified when copying a part");
    assertParameterNotNull(copyPartRequest.getSourceKey(), "The source object key must be specified when copying a part");
    assertParameterNotNull(copyPartRequest.getDestinationBucketName(), "The destination bucket name must be specified when copying a part");
    assertParameterNotNull(copyPartRequest.getUploadId(), "The upload id must be specified when copying a part");
    assertParameterNotNull(copyPartRequest.getDestinationKey(), "The destination object key must be specified when copying a part");
    assertParameterNotNull(copyPartRequest.getPartNumber(), "The part number must be specified when copying a part");
    final String destinationKey = copyPartRequest.getDestinationKey();
    final String destinationBucketName = copyPartRequest.getDestinationBucketName();
    final Request<CopyPartRequest> request = createRequest(destinationBucketName, destinationKey, copyPartRequest, HttpMethodName.PUT);
    populateRequestWithCopyPartParameters(request, copyPartRequest);
    request.addParameter("uploadId", copyPartRequest.getUploadId());
    request.addParameter("partNumber", Integer.toString(copyPartRequest.getPartNumber()));
    /*
         * We can't send a non-zero length Content-Length header if the user
         * specified it, otherwise it messes up the HTTP connection when the
         * remote server thinks there's more data to pull.
         */
    setZeroContentLength(request);
    CopyObjectResultHandler copyObjectResultHandler = null;
    try {
        @SuppressWarnings("unchecked") final ResponseHeaderHandlerChain<CopyObjectResultHandler> handler = new ResponseHeaderHandlerChain<CopyObjectResultHandler>(// xml payload unmarshaller
        new Unmarshallers.CopyObjectUnmarshaller(), // header handlers
        new ServerSideEncryptionHeaderHandler<CopyObjectResultHandler>(), new S3VersionHeaderHandler<CopyObjectResultHandler>());
        copyObjectResultHandler = invoke(request, handler, destinationBucketName, destinationKey);
    } catch (final AmazonS3Exception ase) {
        /*
             * If the request failed because one of the specified constraints
             * was not met (ex: matching ETag, modified since date, etc.), then
             * return null, so that users don't have to wrap their code in
             * try/catch blocks and check for this status code if they want to
             * use constraints.
             */
        if (ase.getStatusCode() == Constants.FAILED_PRECONDITION_STATUS_CODE) {
            return null;
        }
        throw ase;
    }
    /*
         * CopyPart has two failure modes: 1 - An HTTP error code is returned
         * and the error is processed like any other error response. 2 - An HTTP
         * 200 OK code is returned, but the response content contains an XML
         * error response. This makes it very difficult for the client runtime
         * to cleanly detect this case and handle it like any other error
         * response. We could extend the runtime to have a more
         * flexible/customizable definition of success/error (per request), but
         * it's probably overkill for this one special case.
         */
    if (copyObjectResultHandler.getErrorCode() != null) {
        final String errorCode = copyObjectResultHandler.getErrorCode();
        final String errorMessage = copyObjectResultHandler.getErrorMessage();
        final String requestId = copyObjectResultHandler.getErrorRequestId();
        final String hostId = copyObjectResultHandler.getErrorHostId();
        final AmazonS3Exception ase = new AmazonS3Exception(errorMessage);
        ase.setErrorCode(errorCode);
        ase.setErrorType(ErrorType.Service);
        ase.setRequestId(requestId);
        ase.setExtendedRequestId(hostId);
        ase.setServiceName(request.getServiceName());
        ase.setStatusCode(200);
        throw ase;
    }
    final CopyPartResult copyPartResult = new CopyPartResult();
    copyPartResult.setETag(copyObjectResultHandler.getETag());
    copyPartResult.setPartNumber(copyPartRequest.getPartNumber());
    copyPartResult.setLastModifiedDate(copyObjectResultHandler.getLastModified());
    copyPartResult.setVersionId(copyObjectResultHandler.getVersionId());
    copyPartResult.setSSEAlgorithm(copyObjectResultHandler.getSSEAlgorithm());
    copyPartResult.setSSECustomerAlgorithm(copyObjectResultHandler.getSSECustomerAlgorithm());
    copyPartResult.setSSECustomerKeyMd5(copyObjectResultHandler.getSSECustomerKeyMd5());
    return copyPartResult;
}
Also used : Unmarshallers(com.amazonaws.services.s3.model.transform.Unmarshallers) CopyObjectResultHandler(com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.CopyObjectResultHandler) ResponseHeaderHandlerChain(com.amazonaws.services.s3.internal.ResponseHeaderHandlerChain)

Example 2 with CopyObjectResultHandler

use of com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.CopyObjectResultHandler in project aws-sdk-android by aws-amplify.

the class AmazonS3Client method copyObject.

/*
     * (non-Javadoc)
     * @see
     * com.amazonaws.services.s3.AmazonS3#copyObject(com.amazonaws.services.
     * s3.model.CopyObjectRequest)
     */
@Override
public CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest) throws AmazonClientException, AmazonServiceException {
    assertParameterNotNull(copyObjectRequest.getSourceBucketName(), "The source bucket name must be specified when copying an object");
    assertParameterNotNull(copyObjectRequest.getSourceKey(), "The source object key must be specified when copying an object");
    assertParameterNotNull(copyObjectRequest.getDestinationBucketName(), "The destination bucket name must be specified when copying an object");
    assertParameterNotNull(copyObjectRequest.getDestinationKey(), "The destination object key must be specified when copying an object");
    final String destinationKey = copyObjectRequest.getDestinationKey();
    final String destinationBucketName = copyObjectRequest.getDestinationBucketName();
    final Request<CopyObjectRequest> request = createRequest(destinationBucketName, destinationKey, copyObjectRequest, HttpMethodName.PUT);
    populateRequestWithCopyObjectParameters(request, copyObjectRequest);
    // Populate the SSE AWS KMS parameters to the request header
    populateSSE_KMS(request, copyObjectRequest.getSSEAwsKeyManagementParams());
    /*
         * We can't send a non-zero length Content-Length header if the user
         * specified it, otherwise it messes up the HTTP connection when the
         * remote server thinks there's more data to pull.
         */
    setZeroContentLength(request);
    CopyObjectResultHandler copyObjectResultHandler = null;
    try {
        @SuppressWarnings("unchecked") final ResponseHeaderHandlerChain<CopyObjectResultHandler> handler = new ResponseHeaderHandlerChain<CopyObjectResultHandler>(// xml payload unmarshaller
        new Unmarshallers.CopyObjectUnmarshaller(), // header handlers
        new ServerSideEncryptionHeaderHandler<CopyObjectResultHandler>(), new S3VersionHeaderHandler<CopyObjectResultHandler>(), new ObjectExpirationHeaderHandler<CopyObjectResultHandler>(), new S3RequesterChargedHeaderHandler<CopyObjectResultHandler>());
        copyObjectResultHandler = invoke(request, handler, destinationBucketName, destinationKey);
    } catch (final AmazonS3Exception ase) {
        /*
             * If the request failed because one of the specified constraints
             * was not met (ex: matching ETag, modified since date, etc.), then
             * return null, so that users don't have to wrap their code in
             * try/catch blocks and check for this status code if they want to
             * use constraints.
             */
        if (ase.getStatusCode() == Constants.FAILED_PRECONDITION_STATUS_CODE) {
            return null;
        }
        throw ase;
    }
    /*
         * CopyObject has two failure modes: 1 - An HTTP error code is returned
         * and the error is processed like any other error response. 2 - An HTTP
         * 200 OK code is returned, but the response content contains an XML
         * error response. This makes it very difficult for the client runtime
         * to cleanly detect this case and handle it like any other error
         * response. We could extend the runtime to have a more
         * flexible/customizable definition of success/error (per request), but
         * it's probably overkill for this one special case.
         */
    if (copyObjectResultHandler.getErrorCode() != null) {
        final String errorCode = copyObjectResultHandler.getErrorCode();
        final String errorMessage = copyObjectResultHandler.getErrorMessage();
        final String requestId = copyObjectResultHandler.getErrorRequestId();
        final String hostId = copyObjectResultHandler.getErrorHostId();
        final AmazonS3Exception ase = new AmazonS3Exception(errorMessage);
        ase.setErrorCode(errorCode);
        ase.setErrorType(ErrorType.Service);
        ase.setRequestId(requestId);
        ase.setExtendedRequestId(hostId);
        ase.setServiceName(request.getServiceName());
        ase.setStatusCode(200);
        throw ase;
    }
    // TODO: Might be nice to create this in our custom
    // S3VersionHeaderHandler
    final CopyObjectResult copyObjectResult = new CopyObjectResult();
    copyObjectResult.setETag(copyObjectResultHandler.getETag());
    copyObjectResult.setLastModifiedDate(copyObjectResultHandler.getLastModified());
    copyObjectResult.setVersionId(copyObjectResultHandler.getVersionId());
    copyObjectResult.setSSEAlgorithm(copyObjectResultHandler.getSSEAlgorithm());
    copyObjectResult.setSSECustomerAlgorithm(copyObjectResultHandler.getSSECustomerAlgorithm());
    copyObjectResult.setSSECustomerKeyMd5(copyObjectResultHandler.getSSECustomerKeyMd5());
    copyObjectResult.setExpirationTime(copyObjectResultHandler.getExpirationTime());
    copyObjectResult.setExpirationTimeRuleId(copyObjectResultHandler.getExpirationTimeRuleId());
    copyObjectResult.setRequesterCharged(copyObjectResultHandler.isRequesterCharged());
    return copyObjectResult;
}
Also used : Unmarshallers(com.amazonaws.services.s3.model.transform.Unmarshallers) CopyObjectResultHandler(com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.CopyObjectResultHandler) ResponseHeaderHandlerChain(com.amazonaws.services.s3.internal.ResponseHeaderHandlerChain)

Aggregations

ResponseHeaderHandlerChain (com.amazonaws.services.s3.internal.ResponseHeaderHandlerChain)2 Unmarshallers (com.amazonaws.services.s3.model.transform.Unmarshallers)2 CopyObjectResultHandler (com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.CopyObjectResultHandler)2