All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aliyun.oss.internal.OSSMultipartOperation Maven / Gradle / Ivy

Go to download

The Aliyun OSS SDK for Java used for accessing Aliyun Object Storage Service, includes all service and dependent JARs.

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.aliyun.oss.internal;

import static com.aliyun.oss.internal.RequestParameters.*;
import static com.aliyun.oss.common.parser.RequestMarshallers.completeMultipartUploadRequestMarshaller;
import static com.aliyun.oss.common.utils.CodingUtils.assertParameterNotNull;
import static com.aliyun.oss.common.utils.CodingUtils.assertStringNotNullOrEmpty;
import static com.aliyun.oss.common.utils.CodingUtils.checkParamRange;
import static com.aliyun.oss.common.utils.IOUtils.newRepeatableInputStream;
import static com.aliyun.oss.common.utils.LogUtils.logException;
import static com.aliyun.oss.event.ProgressPublisher.publishProgress;
import static com.aliyun.oss.internal.OSSUtils.OSS_RESOURCE_MANAGER;
import static com.aliyun.oss.internal.OSSUtils.addDateHeader;
import static com.aliyun.oss.internal.OSSUtils.addStringListHeader;
import static com.aliyun.oss.internal.OSSUtils.ensureCallbackValid;
import static com.aliyun.oss.internal.OSSUtils.populateRequestCallback;
import static com.aliyun.oss.internal.OSSUtils.removeHeader;
import static com.aliyun.oss.internal.OSSUtils.ensureBucketNameValid;
import static com.aliyun.oss.internal.OSSUtils.ensureObjectKeyValid;
import static com.aliyun.oss.internal.OSSUtils.populateRequestMetadata;
import static com.aliyun.oss.internal.OSSUtils.trimQuotes;
import static com.aliyun.oss.internal.OSSConstants.DEFAULT_FILE_SIZE_LIMIT;
import static com.aliyun.oss.internal.OSSConstants.DEFAULT_CHARSET_NAME;
import static com.aliyun.oss.internal.ResponseParsers.completeMultipartUploadResponseParser;
import static com.aliyun.oss.internal.ResponseParsers.completeMultipartUploadProcessResponseParser;
import static com.aliyun.oss.internal.ResponseParsers.initiateMultipartUploadResponseParser;
import static com.aliyun.oss.internal.ResponseParsers.listMultipartUploadsResponseParser;
import static com.aliyun.oss.internal.ResponseParsers.listPartsResponseParser;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.comm.RequestMessage;
import com.aliyun.oss.common.comm.ResponseHandler;
import com.aliyun.oss.common.comm.ResponseMessage;
import com.aliyun.oss.common.comm.ServiceClient;
import com.aliyun.oss.common.comm.io.FixedLengthInputStream;
import com.aliyun.oss.common.utils.CRC64;
import com.aliyun.oss.common.utils.HttpUtil;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.oss.event.ProgressListener;
import com.aliyun.oss.internal.ResponseParsers.UploadPartCopyResponseParser;
import com.aliyun.oss.model.AbortMultipartUploadRequest;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CompleteMultipartUploadRequest;
import com.aliyun.oss.model.CompleteMultipartUploadResult;
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
import com.aliyun.oss.model.InitiateMultipartUploadResult;
import com.aliyun.oss.model.ListMultipartUploadsRequest;
import com.aliyun.oss.model.ListPartsRequest;
import com.aliyun.oss.model.MultipartUploadListing;
import com.aliyun.oss.model.PartETag;
import com.aliyun.oss.model.PartListing;
import com.aliyun.oss.model.UploadPartCopyRequest;
import com.aliyun.oss.model.UploadPartCopyResult;
import com.aliyun.oss.model.UploadPartRequest;
import com.aliyun.oss.model.UploadPartResult;
import com.aliyun.oss.model.Payer;
import com.aliyun.oss.model.VoidResult;
import com.aliyun.oss.model.WebServiceRequest;

/**
 * Multipart operation.
 */
public class OSSMultipartOperation extends OSSOperation {

    private static final int LIST_PART_MAX_RETURNS = 1000;
    private static final int LIST_UPLOAD_MAX_RETURNS = 1000;
    private static final int MAX_PART_NUMBER = 10000;

    public OSSMultipartOperation(ServiceClient client, CredentialsProvider credsProvider) {
        super(client, credsProvider);
    }

    @Override
    protected boolean isRetryablePostRequest(WebServiceRequest request) {
        if (request instanceof InitiateMultipartUploadRequest) {
            return true;
        }
        return super.isRetryablePostRequest(request);
    }

    /**
     * Abort multipart upload.
     */
    public VoidResult abortMultipartUpload(AbortMultipartUploadRequest abortMultipartUploadRequest)
            throws OSSException, ClientException {

        assertParameterNotNull(abortMultipartUploadRequest, "abortMultipartUploadRequest");

        String key = abortMultipartUploadRequest.getKey();
        String bucketName = abortMultipartUploadRequest.getBucketName();
        String uploadId = abortMultipartUploadRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");

        Map parameters = new HashMap();
        parameters.put(UPLOAD_ID, uploadId);

        Map headers = new HashMap();
        populateRequestPayerHeader(headers, abortMultipartUploadRequest.getRequestPayer());

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(abortMultipartUploadRequest))
                .setMethod(HttpMethod.DELETE).setBucket(bucketName).setKey(key).setHeaders(headers).setParameters(parameters)
                .setOriginalRequest(abortMultipartUploadRequest).build();

        return doOperation(request, requestIdResponseParser, bucketName, key);
    }

    /**
     * Complete multipart upload.
     */
    public CompleteMultipartUploadResult completeMultipartUpload(
            CompleteMultipartUploadRequest completeMultipartUploadRequest) throws OSSException, ClientException {

        assertParameterNotNull(completeMultipartUploadRequest, "completeMultipartUploadRequest");

        String key = completeMultipartUploadRequest.getKey();
        String bucketName = completeMultipartUploadRequest.getBucketName();
        String uploadId = completeMultipartUploadRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");
        ensureCallbackValid(completeMultipartUploadRequest.getCallback());

        Map headers = new HashMap();
        populateCompleteMultipartUploadOptionalHeaders(completeMultipartUploadRequest, headers);
        populateRequestCallback(headers, completeMultipartUploadRequest.getCallback());

        populateRequestPayerHeader(headers, completeMultipartUploadRequest.getRequestPayer());

        Map parameters = new HashMap();
        parameters.put(UPLOAD_ID, uploadId);

        List partETags = completeMultipartUploadRequest.getPartETags();
        FixedLengthInputStream requestInstream;
        if (partETags != null) {
            Collections.sort(partETags, new Comparator() {
                @Override
                public int compare(PartETag p1, PartETag p2) {
                    return p1.getPartNumber() - p2.getPartNumber();
                }
            });
            requestInstream = completeMultipartUploadRequestMarshaller.marshall(completeMultipartUploadRequest);
        } else {
            requestInstream = new FixedLengthInputStream(new ByteArrayInputStream("".getBytes()), 0);
        }

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(completeMultipartUploadRequest))
                .setMethod(HttpMethod.POST).setBucket(bucketName).setKey(key).setHeaders(headers)
                .setParameters(parameters)
                .setInputStreamWithLength(requestInstream)
                .setOriginalRequest(completeMultipartUploadRequest).build();

        List reponseHandlers = new ArrayList();
        reponseHandlers.add(new OSSCallbackErrorResponseHandler());

        CompleteMultipartUploadResult result = null;
        if (!isNeedReturnResponse(completeMultipartUploadRequest)) {
            result = doOperation(request, completeMultipartUploadResponseParser, bucketName, key, true);
        } else {
            result = doOperation(request, completeMultipartUploadProcessResponseParser, bucketName, key, true, null,
                    reponseHandlers);
        }

        if (partETags != null) {
            result.setClientCRC(calcObjectCRCFromParts(partETags));
        }
        if (getInnerClient().getClientConfiguration().isCrcCheckEnabled()) {
            OSSUtils.checkChecksum(result.getClientCRC(), result.getServerCRC(), result.getRequestId());
        }

        return result;
    }

    /**
     * Initiate multipart upload.
     */
    public InitiateMultipartUploadResult initiateMultipartUpload(
            InitiateMultipartUploadRequest initiateMultipartUploadRequest) throws OSSException, ClientException {

        assertParameterNotNull(initiateMultipartUploadRequest, "initiateMultipartUploadRequest");

        String key = initiateMultipartUploadRequest.getKey();
        String bucketName = initiateMultipartUploadRequest.getBucketName();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);

        Map headers = new HashMap();
        if (initiateMultipartUploadRequest.getObjectMetadata() != null) {
            populateRequestMetadata(headers, initiateMultipartUploadRequest.getObjectMetadata());
        }

        populateRequestPayerHeader(headers, initiateMultipartUploadRequest.getRequestPayer());

        // Be careful that we don't send the object's total size as the content
        // length for the InitiateMultipartUpload request.
        removeHeader(headers, OSSHeaders.CONTENT_LENGTH);

        Map params = new HashMap();
        params.put(SUBRESOURCE_UPLOADS, null);

        Boolean sequentialMode = initiateMultipartUploadRequest.getSequentialMode();
        if (sequentialMode != null && sequentialMode.equals(true)) {
            params.put(SEQUENTIAL, null);
        }

        // Set the request content to be empty (but not null) to avoid putting
        // parameters
        // to request body. Set HttpRequestFactory#createHttpRequest for
        // details.
        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(initiateMultipartUploadRequest))
                .setMethod(HttpMethod.POST).setBucket(bucketName).setKey(key).setHeaders(headers).setParameters(params)
                .setInputStream(new ByteArrayInputStream(new byte[0])).setInputSize(0)
                .setOriginalRequest(initiateMultipartUploadRequest).build();

        return doOperation(request, initiateMultipartUploadResponseParser, bucketName, key, true);
    }

    /**
     * List multipart uploads.
     */
    public MultipartUploadListing listMultipartUploads(ListMultipartUploadsRequest listMultipartUploadsRequest)
            throws OSSException, ClientException {

        assertParameterNotNull(listMultipartUploadsRequest, "listMultipartUploadsRequest");

        String bucketName = listMultipartUploadsRequest.getBucketName();
        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);

        // Use a LinkedHashMap to preserve the insertion order.
        Map params = new LinkedHashMap();
        populateListMultipartUploadsRequestParameters(listMultipartUploadsRequest, params);

        Map headers = new HashMap();
        populateRequestPayerHeader(headers, listMultipartUploadsRequest.getRequestPayer());

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(listMultipartUploadsRequest))
                .setMethod(HttpMethod.GET).setBucket(bucketName).setHeaders(headers).setParameters(params)
                .setOriginalRequest(listMultipartUploadsRequest).build();

        return doOperation(request, listMultipartUploadsResponseParser, bucketName, null, true);
    }

    /**
     * List parts.
     */
    public PartListing listParts(ListPartsRequest listPartsRequest) throws OSSException, ClientException {

        assertParameterNotNull(listPartsRequest, "listPartsRequest");

        String key = listPartsRequest.getKey();
        String bucketName = listPartsRequest.getBucketName();
        String uploadId = listPartsRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");

        // Use a LinkedHashMap to preserve the insertion order.
        Map params = new LinkedHashMap();
        populateListPartsRequestParameters(listPartsRequest, params);

        Map headers = new HashMap();
        populateRequestPayerHeader(headers, listPartsRequest.getRequestPayer());

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(listPartsRequest))
                .setMethod(HttpMethod.GET).setBucket(bucketName).setKey(key).setHeaders(headers).setParameters(params)
                .setOriginalRequest(listPartsRequest).build();

        return doOperation(request, listPartsResponseParser, bucketName, key, true);
    }

    /**
     * Upload part.
     */
    public UploadPartResult uploadPart(UploadPartRequest uploadPartRequest) throws OSSException, ClientException {

        assertParameterNotNull(uploadPartRequest, "uploadPartRequest");

        String key = uploadPartRequest.getKey();
        String bucketName = uploadPartRequest.getBucketName();
        String uploadId = uploadPartRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");

        if (uploadPartRequest.getInputStream() == null) {
            throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("MustSetContentStream"));
        }

        InputStream repeatableInputStream = null;
        try {
            repeatableInputStream = newRepeatableInputStream(uploadPartRequest.buildPartialStream());
        } catch (IOException ex) {
            logException("Cannot wrap to repeatable input stream: ", ex);
            throw new ClientException("Cannot wrap to repeatable input stream: ", ex);
        }

        int partNumber = uploadPartRequest.getPartNumber();
        if (!checkParamRange(partNumber, 0, false, MAX_PART_NUMBER, true)) {
            throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("PartNumberOutOfRange"));
        }

        Map headers = new HashMap();
        populateUploadPartOptionalHeaders(uploadPartRequest, headers);

        populateRequestPayerHeader(headers, uploadPartRequest.getRequestPayer());
        populateTrafficLimitHeader(headers, uploadPartRequest.getTrafficLimit());

        // Use a LinkedHashMap to preserve the insertion order.
        Map params = new LinkedHashMap();
        params.put(PART_NUMBER, Integer.toString(partNumber));
        params.put(UPLOAD_ID, uploadId);

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(uploadPartRequest))
                .setMethod(HttpMethod.PUT).setBucket(bucketName).setKey(key).setParameters(params).setHeaders(headers)
                .setInputStream(repeatableInputStream).setInputSize(uploadPartRequest.getPartSize())
                .setUseChunkEncoding(uploadPartRequest.isUseChunkEncoding()).setOriginalRequest(uploadPartRequest)
                .build();

        final ProgressListener listener = uploadPartRequest.getProgressListener();
        ResponseMessage response = null;
        try {
            publishProgress(listener, ProgressEventType.TRANSFER_PART_STARTED_EVENT);
            response = doOperation(request, emptyResponseParser, bucketName, key);
            publishProgress(listener, ProgressEventType.TRANSFER_PART_COMPLETED_EVENT);
        } catch (RuntimeException e) {
            publishProgress(listener, ProgressEventType.TRANSFER_PART_FAILED_EVENT);
            throw e;
        }

        UploadPartResult result = new UploadPartResult();
        result.setPartNumber(partNumber);
        result.setETag(trimQuotes(response.getHeaders().get(OSSHeaders.ETAG)));
        result.setRequestId(response.getRequestId());
        result.setPartSize(uploadPartRequest.getPartSize());
        result.setResponse(response);
        ResponseParsers.setCRC(result, response);

        if (getInnerClient().getClientConfiguration().isCrcCheckEnabled()) {
            OSSUtils.checkChecksum(result.getClientCRC(), result.getServerCRC(), result.getRequestId());
        }

        return result;
    }

    /**
     * Upload part copy.
     */
    public UploadPartCopyResult uploadPartCopy(UploadPartCopyRequest uploadPartCopyRequest)
            throws OSSException, ClientException {

        assertParameterNotNull(uploadPartCopyRequest, "uploadPartCopyRequest");

        String key = uploadPartCopyRequest.getKey();
        String bucketName = uploadPartCopyRequest.getBucketName();
        String uploadId = uploadPartCopyRequest.getUploadId();

        assertParameterNotNull(bucketName, "bucketName");
        ensureBucketNameValid(bucketName);
        assertParameterNotNull(key, "key");
        ensureObjectKeyValid(key);
        assertStringNotNullOrEmpty(uploadId, "uploadId");

        Long partSize = uploadPartCopyRequest.getPartSize();
        if (partSize != null) {
            if (!checkParamRange(partSize, 0, true, DEFAULT_FILE_SIZE_LIMIT, true)) {
                throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("FileSizeOutOfRange"));
            }
        }

        int partNumber = uploadPartCopyRequest.getPartNumber();
        if (!checkParamRange(partNumber, 0, false, MAX_PART_NUMBER, true)) {
            throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("PartNumberOutOfRange"));
        }

        Map headers = new HashMap();
        populateCopyPartRequestHeaders(uploadPartCopyRequest, headers);

        // Use a LinkedHashMap to preserve the insertion order.
        Map params = new LinkedHashMap();
        params.put(PART_NUMBER, Integer.toString(partNumber));
        params.put(UPLOAD_ID, uploadId);

        RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(uploadPartCopyRequest))
                .setMethod(HttpMethod.PUT).setBucket(bucketName).setKey(key).setParameters(params).setHeaders(headers)
                .setOriginalRequest(uploadPartCopyRequest).build();

        return doOperation(request, new UploadPartCopyResponseParser(partNumber), bucketName, key, true);
    }

    private static void populateListMultipartUploadsRequestParameters(
            ListMultipartUploadsRequest listMultipartUploadsRequest, Map params) {

        // Make sure 'uploads' be the first parameter.
        params.put(SUBRESOURCE_UPLOADS, null);

        if (listMultipartUploadsRequest.getDelimiter() != null) {
            params.put(DELIMITER, listMultipartUploadsRequest.getDelimiter());
        }

        if (listMultipartUploadsRequest.getKeyMarker() != null) {
            params.put(KEY_MARKER, listMultipartUploadsRequest.getKeyMarker());
        }

        Integer maxUploads = listMultipartUploadsRequest.getMaxUploads();
        if (maxUploads != null) {
            if (!checkParamRange(maxUploads, 0, true, LIST_UPLOAD_MAX_RETURNS, true)) {
                throw new IllegalArgumentException(
                        OSS_RESOURCE_MANAGER.getFormattedString("MaxUploadsOutOfRange", LIST_UPLOAD_MAX_RETURNS));
            }
            params.put(MAX_UPLOADS, listMultipartUploadsRequest.getMaxUploads().toString());
        }

        if (listMultipartUploadsRequest.getPrefix() != null) {
            params.put(PREFIX, listMultipartUploadsRequest.getPrefix());
        }

        if (listMultipartUploadsRequest.getUploadIdMarker() != null) {
            params.put(UPLOAD_ID_MARKER, listMultipartUploadsRequest.getUploadIdMarker());
        }

        if (listMultipartUploadsRequest.getEncodingType() != null) {
            params.put(ENCODING_TYPE, listMultipartUploadsRequest.getEncodingType());
        }
    }

    private static void populateListPartsRequestParameters(ListPartsRequest listPartsRequest,
            Map params) {

        params.put(UPLOAD_ID, listPartsRequest.getUploadId());

        Integer maxParts = listPartsRequest.getMaxParts();
        if (maxParts != null) {
            if (!checkParamRange(maxParts, 0, true, LIST_PART_MAX_RETURNS, true)) {
                throw new IllegalArgumentException(
                        OSS_RESOURCE_MANAGER.getFormattedString("MaxPartsOutOfRange", LIST_PART_MAX_RETURNS));
            }
            params.put(MAX_PARTS, maxParts.toString());
        }

        Integer partNumberMarker = listPartsRequest.getPartNumberMarker();
        if (partNumberMarker != null) {
            if (!checkParamRange(partNumberMarker, 0, false, MAX_PART_NUMBER, true)) {
                throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("PartNumberMarkerOutOfRange"));
            }
            params.put(PART_NUMBER_MARKER, partNumberMarker.toString());
        }

        if (listPartsRequest.getEncodingType() != null) {
            params.put(ENCODING_TYPE, listPartsRequest.getEncodingType());
        }
    }

    private static void populateCopyPartRequestHeaders(UploadPartCopyRequest uploadPartCopyRequest,
            Map headers) {

        if (uploadPartCopyRequest.getPartSize() != null) {
            headers.put(OSSHeaders.CONTENT_LENGTH, Long.toString(uploadPartCopyRequest.getPartSize()));
        }

        if (uploadPartCopyRequest.getMd5Digest() != null) {
            headers.put(OSSHeaders.CONTENT_MD5, uploadPartCopyRequest.getMd5Digest());
        }

        String copySource = "/" + uploadPartCopyRequest.getSourceBucketName() + "/"
                + HttpUtil.urlEncode(uploadPartCopyRequest.getSourceKey(), DEFAULT_CHARSET_NAME);
        if (uploadPartCopyRequest.getSourceVersionId() != null) {
            copySource += "?versionId=" + uploadPartCopyRequest.getSourceVersionId();
        }
        headers.put(OSSHeaders.COPY_OBJECT_SOURCE, copySource);

        if (uploadPartCopyRequest.getBeginIndex() != null && uploadPartCopyRequest.getPartSize() != null) {
            String range = "bytes=" + uploadPartCopyRequest.getBeginIndex() + "-"
                    + Long.toString(uploadPartCopyRequest.getBeginIndex() + uploadPartCopyRequest.getPartSize() - 1);
            headers.put(OSSHeaders.COPY_SOURCE_RANGE, range);
        }

        if (uploadPartCopyRequest.getRequestPayer() != null) {
            headers.put(OSSHeaders.OSS_REQUEST_PAYER, uploadPartCopyRequest.getRequestPayer().toString().toLowerCase());
        }

        addDateHeader(headers, OSSHeaders.COPY_OBJECT_SOURCE_IF_MODIFIED_SINCE,
                uploadPartCopyRequest.getModifiedSinceConstraint());
        addDateHeader(headers, OSSHeaders.COPY_OBJECT_SOURCE_IF_UNMODIFIED_SINCE,
                uploadPartCopyRequest.getUnmodifiedSinceConstraint());

        addStringListHeader(headers, OSSHeaders.COPY_OBJECT_SOURCE_IF_MATCH,
                uploadPartCopyRequest.getMatchingETagConstraints());
        addStringListHeader(headers, OSSHeaders.COPY_OBJECT_SOURCE_IF_NONE_MATCH,
                uploadPartCopyRequest.getNonmatchingEtagConstraints());
    }

    private static void populateUploadPartOptionalHeaders(UploadPartRequest uploadPartRequest,
            Map headers) {

        if (!uploadPartRequest.isUseChunkEncoding()) {
            long partSize = uploadPartRequest.getPartSize();
            if (!checkParamRange(partSize, 0, true, DEFAULT_FILE_SIZE_LIMIT, true)) {
                throw new IllegalArgumentException(OSS_RESOURCE_MANAGER.getString("FileSizeOutOfRange"));
            }

            headers.put(OSSHeaders.CONTENT_LENGTH, Long.toString(partSize));
        }

        if (uploadPartRequest.getMd5Digest() != null) {
            headers.put(OSSHeaders.CONTENT_MD5, uploadPartRequest.getMd5Digest());
        }
    }

    private static void populateCompleteMultipartUploadOptionalHeaders(
            CompleteMultipartUploadRequest completeMultipartUploadRequest, Map headers) {

        CannedAccessControlList cannedACL = completeMultipartUploadRequest.getObjectACL();
        if (cannedACL != null) {
            headers.put(OSSHeaders.OSS_OBJECT_ACL, cannedACL.toString());
        }
    }

    private static void populateRequestPayerHeader (Map headers, Payer payer) {
        if (payer != null && payer.equals(Payer.Requester)) {
            headers.put(OSSHeaders.OSS_REQUEST_PAYER, payer.toString().toLowerCase());
        }
    }

    private static void populateTrafficLimitHeader(Map headers, int limit) {
        if (limit > 0) {
            headers.put(OSSHeaders.OSS_HEADER_TRAFFIC_LIMIT, String.valueOf(limit));
        }
    }

    private static Long calcObjectCRCFromParts(List partETags) {
        long crc = 0;
        for (PartETag partETag : partETags) {
            if (partETag.getPartCRC() == null || partETag.getPartSize() <= 0) {
                return null;
            }
            crc = CRC64.combine(crc, partETag.getPartCRC(), partETag.getPartSize());
        }
        return new Long(crc);
    }

    private static boolean isNeedReturnResponse(CompleteMultipartUploadRequest completeMultipartUploadRequest) {
        if (completeMultipartUploadRequest.getCallback() != null
                || completeMultipartUploadRequest.getProcess() != null) {
            return true;
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy