Search in sources :

Example 1 with DataUploadPartCopy

use of com.pspace.ifs.ksan.gw.data.DataUploadPartCopy in project ksan by infinistor.

the class UploadPartCopy method process.

@Override
public void process() throws GWException {
    logger.info(GWConstants.LOG_UPLOAD_PART_COPY_START);
    String bucket = s3Parameter.getBucketName();
    initBucketInfo(bucket);
    String object = s3Parameter.getObjectName();
    S3Bucket s3Bucket = new S3Bucket();
    s3Bucket.setCors(getBucketInfo().getCors());
    s3Bucket.setAccess(getBucketInfo().getAccess());
    s3Parameter.setBucket(s3Bucket);
    GWUtils.checkCors(s3Parameter);
    if (s3Parameter.isPublicAccess() && GWUtils.isIgnorePublicAcls(s3Parameter)) {
        throw new GWException(GWErrorCode.ACCESS_DENIED, s3Parameter);
    }
    checkGrantBucket(s3Parameter.isPublicAccess(), String.valueOf(s3Parameter.getUser().getUserId()), GWConstants.GRANT_WRITE);
    DataUploadPartCopy dataUploadPartCopy = new DataUploadPartCopy(s3Parameter);
    dataUploadPartCopy.extract();
    String partNumber = dataUploadPartCopy.getPartNumber();
    String uploadId = dataUploadPartCopy.getUploadId();
    String copySource = dataUploadPartCopy.getCopySource();
    String copySourceRange = dataUploadPartCopy.getCopySourceRange();
    String copySourceIfMatch = dataUploadPartCopy.getCopySourceIfMatch();
    String copySourceIfNoneMatch = dataUploadPartCopy.getCopySourceIfNoneMatch();
    ;
    String copySourceIfModifiedSince = dataUploadPartCopy.getCopySourceIfModifiedSince();
    String copySourceIfUnmodifiedSince = dataUploadPartCopy.getCopySourceIfUnmodifiedSince();
    String customerAlgorithm = dataUploadPartCopy.getServerSideEncryptionCustomerAlgorithm();
    String customerKey = dataUploadPartCopy.getServerSideEncryptionCustomerKey();
    String customerKeyMD5 = dataUploadPartCopy.getServerSideEncryptionCustomerKeyMD5();
    String copySourceCustomerAlgorithm = dataUploadPartCopy.getCopySourceServerSideEncryptionCustomerAlgorithm();
    String copySourceCustomerKey = dataUploadPartCopy.getCopySourceServerSideEncryptionCustomerKey();
    String copySourceCustomerKeyMD5 = dataUploadPartCopy.getCopySourceServerSideEncryptionCustomerKeyMD5();
    // Check copy source
    if (Strings.isNullOrEmpty(copySource)) {
        logger.error(GWConstants.LOG_COPY_SOURCE_IS_NULL);
        throw new GWException(GWErrorCode.BAD_REQUEST, s3Parameter);
    }
    try {
        copySource = URLDecoder.decode(copySource, GWConstants.CHARSET_UTF_8);
        logger.info(GWConstants.LOG_UPLOAD_PART_COPY_SOURCE, copySource);
    } catch (UnsupportedEncodingException e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.SERVER_ERROR, s3Parameter);
    }
    if (copySource.startsWith(GWConstants.SLASH)) {
        copySource = copySource.substring(1);
    } else if (copySource.contains(GWConstants.S3_ARN)) {
        logger.error(GWConstants.LOG_COPY_SOURCE_IS_NOT_IMPLEMENTED, copySource);
        throw new GWException(GWErrorCode.NOT_IMPLEMENTED, s3Parameter);
    }
    String[] sourcePath = copySource.split(GWConstants.SLASH, 2);
    if (sourcePath.length != 2) {
        throw new GWException(GWErrorCode.INVALID_ARGUMENT, s3Parameter);
    }
    String srcBucket = sourcePath[0];
    String srcObjectName = sourcePath[1];
    String srcVersionId = null;
    if (!isExistBucket(srcBucket)) {
        logger.error(GWConstants.LOG_BUCKET_IS_NOT_EXIST, srcBucket);
        throw new GWException(GWErrorCode.NO_SUCH_BUCKET, s3Parameter);
    }
    if (srcObjectName.contains(GWConstants.SUB_PARAMETER_VERSIONID) == true) {
        String[] source = sourcePath[1].split(GWConstants.PARAMETER_BACKSLASH_VERSIONID, 2);
        srcObjectName = source[0];
        srcVersionId = source[1].replaceAll(GWConstants.DOUBLE_QUOTE, "");
    }
    String versioningStatus = getBucketVersioning(srcBucket);
    Metadata srcMeta = null;
    if (GWConstants.VERSIONING_ENABLED.equalsIgnoreCase(versioningStatus)) {
        if (!Strings.isNullOrEmpty(srcVersionId)) {
            srcMeta = open(srcBucket, srcObjectName, srcVersionId);
        } else {
            srcMeta = open(srcBucket, srcObjectName);
            srcVersionId = srcMeta.getVersionId();
        }
    } else {
        srcMeta = open(srcBucket, srcObjectName);
        srcVersionId = srcMeta.getVersionId();
    }
    s3Parameter.setSrcVersionId(srcVersionId);
    s3Parameter.setSrcPath(srcObjectName);
    s3Parameter.setPartNumber(partNumber);
    logger.debug(GWConstants.LOG_SOURCE_INFO, srcBucket, srcObjectName, srcVersionId);
    srcMeta.setAcl(GWUtils.makeOriginalXml(srcMeta.getAcl(), s3Parameter));
    checkGrantObject(s3Parameter.isPublicAccess(), srcMeta, String.valueOf(s3Parameter.getUser().getUserId()), GWConstants.GRANT_READ);
    // get metadata
    S3Metadata s3Metadata = new S3Metadata();
    ObjectMapper jsonMapper = new ObjectMapper();
    try {
        s3Metadata = jsonMapper.readValue(srcMeta.getMeta(), S3Metadata.class);
    } catch (JsonProcessingException e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.INTERNAL_SERVER_ERROR, s3Parameter);
    }
    // Check match
    if (!Strings.isNullOrEmpty(copySourceIfMatch)) {
        logger.debug(GWConstants.LOG_SOURCE_ETAG_MATCH, s3Metadata.getETag(), copySourceIfMatch.replace(GWConstants.DOUBLE_QUOTE, ""));
        if (!GWUtils.maybeQuoteETag(s3Metadata.getETag()).equals(copySourceIfMatch.replace(GWConstants.DOUBLE_QUOTE, ""))) {
            throw new GWException(GWErrorCode.PRECONDITION_FAILED, s3Parameter);
        }
    }
    if (!Strings.isNullOrEmpty(copySourceIfNoneMatch)) {
        logger.debug(GWConstants.LOG_SOURCE_ETAG_MATCH, s3Metadata.getETag(), copySourceIfNoneMatch.replace(GWConstants.DOUBLE_QUOTE, ""));
        if (GWUtils.maybeQuoteETag(s3Metadata.getETag()).equals(copySourceIfNoneMatch.replace(GWConstants.DOUBLE_QUOTE, ""))) {
            throw new GWException(GWErrorCode.DOES_NOT_MATCH, String.format(GWConstants.LOG_ETAG_IS_MISMATCH), s3Parameter);
        }
    }
    if (!Strings.isNullOrEmpty(copySourceIfModifiedSince)) {
        long copySourceIfModifiedSinceLong = Long.parseLong(copySourceIfModifiedSince);
        if (copySourceIfModifiedSinceLong != -1) {
            Date modifiedSince = new Date(copySourceIfModifiedSinceLong);
            if (s3Metadata.getLastModified().before(modifiedSince)) {
                throw new GWException(GWErrorCode.DOES_NOT_MATCH, String.format(GWConstants.LOG_MATCH_BEFORE, s3Metadata.getLastModified(), modifiedSince), s3Parameter);
            }
        }
    }
    if (!Strings.isNullOrEmpty(copySourceIfUnmodifiedSince)) {
        long copySourceIfUnmodifiedSinceLong = Long.parseLong(copySourceIfUnmodifiedSince);
        if (copySourceIfUnmodifiedSinceLong != -1) {
            Date unmodifiedSince = new Date(copySourceIfUnmodifiedSinceLong);
            if (s3Metadata.getLastModified().after(unmodifiedSince)) {
                throw new GWException(GWErrorCode.PRECONDITION_FAILED, String.format(GWConstants.LOG_MATCH_AFTER, s3Metadata.getLastModified(), unmodifiedSince), s3Parameter);
            }
        }
    }
    // Check copy source Range
    S3Range s3Range = new S3Range(s3Parameter);
    if (!Strings.isNullOrEmpty(copySourceRange)) {
        logger.info(GWConstants.LOG_UPLOAD_PART_COPY_SOURCE_RANGE, copySourceRange, s3Metadata.getSize());
        s3Range.parseRange(copySourceRange, s3Metadata.getSize(), true);
    }
    Metadata objMeta = createCopy(srcBucket, srcObjectName, srcVersionId, bucket, object);
    String path = GWDiskConfig.getInstance().getLocalPath();
    S3Object s3Object = null;
    S3ObjectOperation objectOperation = new S3ObjectOperation(objMeta, null, s3Parameter, null, null);
    try {
        s3Object = objectOperation.uploadPartCopy(path, srcMeta, s3Range);
    } catch (GWException e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.SERVER_ERROR, s3Parameter);
    }
    ObjMultipart objMultipart = null;
    try {
        objMultipart = new ObjMultipart(bucket);
    } catch (UnknownHostException e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.SERVER_ERROR, s3Parameter);
    } catch (Exception e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.SERVER_ERROR, s3Parameter);
    }
    objMultipart.startSingleUpload(object, uploadId, Integer.parseInt(partNumber), "", "", s3Object.getEtag(), s3Object.getFileSize(), objMeta.getPrimaryDisk().getId());
    objMultipart.finishSingleUpload(uploadId, Integer.parseInt(partNumber));
    s3Parameter.setFileSize(s3Object.getFileSize());
    s3Parameter.getResponse().setCharacterEncoding(GWConstants.CHARSET_UTF_8);
    XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
    try (Writer writer = s3Parameter.getResponse().getWriter()) {
        s3Parameter.getResponse().setContentType(GWConstants.XML_CONTENT_TYPE);
        XMLStreamWriter xmlout = xmlOutputFactory.createXMLStreamWriter(writer);
        xmlout.writeStartDocument();
        xmlout.writeStartElement(GWConstants.COPY_PART_RESULT);
        xmlout.writeDefaultNamespace(GWConstants.AWS_XMLNS);
        writeSimpleElement(xmlout, GWConstants.LAST_MODIFIED, formatDate(s3Object.getLastModified()));
        writeSimpleElement(xmlout, GWConstants.ETAG, GWUtils.maybeQuoteETag(s3Object.getEtag()));
        xmlout.writeEndElement();
        xmlout.flush();
    } catch (XMLStreamException | IOException e) {
        PrintStack.logging(logger, e);
        throw new GWException(GWErrorCode.SERVER_ERROR, s3Parameter);
    }
    s3Parameter.getResponse().setStatus(HttpServletResponse.SC_OK);
}
Also used : S3Range(com.pspace.ifs.ksan.gw.object.S3Range) ObjMultipart(com.pspace.ifs.ksan.objmanager.ObjMultipart) XMLOutputFactory(javax.xml.stream.XMLOutputFactory) UnknownHostException(java.net.UnknownHostException) S3Metadata(com.pspace.ifs.ksan.gw.identity.S3Metadata) Metadata(com.pspace.ifs.ksan.objmanager.Metadata) UnsupportedEncodingException(java.io.UnsupportedEncodingException) IOException(java.io.IOException) DataUploadPartCopy(com.pspace.ifs.ksan.gw.data.DataUploadPartCopy) Date(java.util.Date) GWException(com.pspace.ifs.ksan.gw.exception.GWException) XMLStreamException(javax.xml.stream.XMLStreamException) IOException(java.io.IOException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) UnknownHostException(java.net.UnknownHostException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) S3ObjectOperation(com.pspace.ifs.ksan.gw.object.S3ObjectOperation) S3Bucket(com.pspace.ifs.ksan.gw.identity.S3Bucket) XMLStreamException(javax.xml.stream.XMLStreamException) S3Metadata(com.pspace.ifs.ksan.gw.identity.S3Metadata) XMLStreamWriter(javax.xml.stream.XMLStreamWriter) GWException(com.pspace.ifs.ksan.gw.exception.GWException) S3Object(com.pspace.ifs.ksan.gw.object.S3Object) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) XMLStreamWriter(javax.xml.stream.XMLStreamWriter) Writer(java.io.Writer)

Aggregations

JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 DataUploadPartCopy (com.pspace.ifs.ksan.gw.data.DataUploadPartCopy)1 GWException (com.pspace.ifs.ksan.gw.exception.GWException)1 S3Bucket (com.pspace.ifs.ksan.gw.identity.S3Bucket)1 S3Metadata (com.pspace.ifs.ksan.gw.identity.S3Metadata)1 S3Object (com.pspace.ifs.ksan.gw.object.S3Object)1 S3ObjectOperation (com.pspace.ifs.ksan.gw.object.S3ObjectOperation)1 S3Range (com.pspace.ifs.ksan.gw.object.S3Range)1 Metadata (com.pspace.ifs.ksan.objmanager.Metadata)1 ObjMultipart (com.pspace.ifs.ksan.objmanager.ObjMultipart)1 IOException (java.io.IOException)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 Writer (java.io.Writer)1 UnknownHostException (java.net.UnknownHostException)1 Date (java.util.Date)1 XMLOutputFactory (javax.xml.stream.XMLOutputFactory)1 XMLStreamException (javax.xml.stream.XMLStreamException)1 XMLStreamWriter (javax.xml.stream.XMLStreamWriter)1