Package com.cloud.bridge.service.controller.s3

Source Code of com.cloud.bridge.service.controller.s3.S3SerializableServiceImplementation

// 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.cloud.bridge.service.controller.s3;

import java.util.Calendar;

import org.apache.axis2.AxisFault;
import org.apache.log4j.Logger;

import com.amazon.s3.AccessControlList;
import com.amazon.s3.AccessControlPolicy;
import com.amazon.s3.AmazonS3SkeletonInterface;
import com.amazon.s3.CanonicalUser;
import com.amazon.s3.CopyObject;
import com.amazon.s3.CopyObjectResponse;
import com.amazon.s3.CopyObjectResult;
import com.amazon.s3.CreateBucket;
import com.amazon.s3.CreateBucketResponse;
import com.amazon.s3.CreateBucketResult;
import com.amazon.s3.DeleteBucket;
import com.amazon.s3.DeleteBucketResponse;
import com.amazon.s3.DeleteObject;
import com.amazon.s3.DeleteObjectResponse;
import com.amazon.s3.GetBucketAccessControlPolicy;
import com.amazon.s3.GetBucketAccessControlPolicyResponse;
import com.amazon.s3.GetBucketLoggingStatus;
import com.amazon.s3.GetBucketLoggingStatusResponse;
import com.amazon.s3.GetObject;
import com.amazon.s3.GetObjectAccessControlPolicy;
import com.amazon.s3.GetObjectAccessControlPolicyResponse;
import com.amazon.s3.GetObjectExtended;
import com.amazon.s3.GetObjectExtendedResponse;
import com.amazon.s3.GetObjectResponse;
import com.amazon.s3.GetObjectResult;
import com.amazon.s3.Grant;
import com.amazon.s3.Grantee;
import com.amazon.s3.Group;
import com.amazon.s3.ListAllMyBuckets;
import com.amazon.s3.ListAllMyBucketsEntry;
import com.amazon.s3.ListAllMyBucketsList;
import com.amazon.s3.ListAllMyBucketsResponse;
import com.amazon.s3.ListAllMyBucketsResult;
import com.amazon.s3.ListBucket;
import com.amazon.s3.ListBucketResponse;
import com.amazon.s3.ListBucketResult;
import com.amazon.s3.ListEntry;
import com.amazon.s3.MetadataDirective;
import com.amazon.s3.MetadataEntry;
import com.amazon.s3.Permission;
import com.amazon.s3.PrefixEntry;
import com.amazon.s3.PutObject;
import com.amazon.s3.PutObjectInline;
import com.amazon.s3.PutObjectInlineResponse;
import com.amazon.s3.PutObjectResponse;
import com.amazon.s3.PutObjectResult;
import com.amazon.s3.SetBucketAccessControlPolicy;
import com.amazon.s3.SetBucketAccessControlPolicyResponse;
import com.amazon.s3.SetBucketLoggingStatus;
import com.amazon.s3.SetBucketLoggingStatusResponse;
import com.amazon.s3.SetObjectAccessControlPolicy;
import com.amazon.s3.SetObjectAccessControlPolicyResponse;
import com.amazon.s3.Status;
import com.amazon.s3.StorageClass;

import com.cloud.bridge.model.SAcl;
import com.cloud.bridge.service.core.s3.S3AccessControlList;
import com.cloud.bridge.service.core.s3.S3AccessControlPolicy;
import com.cloud.bridge.service.core.s3.S3CanonicalUser;
import com.cloud.bridge.service.core.s3.S3ConditionalHeaders;
import com.cloud.bridge.service.core.s3.S3CopyObjectRequest;
import com.cloud.bridge.service.core.s3.S3CopyObjectResponse;
import com.cloud.bridge.service.core.s3.S3CreateBucketRequest;
import com.cloud.bridge.service.core.s3.S3CreateBucketResponse;
import com.cloud.bridge.service.core.s3.S3DeleteBucketRequest;
import com.cloud.bridge.service.core.s3.S3DeleteObjectRequest;
import com.cloud.bridge.service.core.s3.S3Engine;
import com.cloud.bridge.service.core.s3.S3GetBucketAccessControlPolicyRequest;
import com.cloud.bridge.service.core.s3.S3GetObjectAccessControlPolicyRequest;
import com.cloud.bridge.service.core.s3.S3GetObjectRequest;
import com.cloud.bridge.service.core.s3.S3GetObjectResponse;
import com.cloud.bridge.service.core.s3.S3Grant;
import com.cloud.bridge.service.core.s3.S3ListAllMyBucketsEntry;
import com.cloud.bridge.service.core.s3.S3ListAllMyBucketsRequest;
import com.cloud.bridge.service.core.s3.S3ListAllMyBucketsResponse;
import com.cloud.bridge.service.core.s3.S3ListBucketObjectEntry;
import com.cloud.bridge.service.core.s3.S3ListBucketPrefixEntry;
import com.cloud.bridge.service.core.s3.S3ListBucketRequest;
import com.cloud.bridge.service.core.s3.S3ListBucketResponse;
import com.cloud.bridge.service.core.s3.S3MetaDataEntry;
import com.cloud.bridge.service.core.s3.S3PutObjectInlineRequest;
import com.cloud.bridge.service.core.s3.S3PutObjectInlineResponse;
import com.cloud.bridge.service.core.s3.S3Response;
import com.cloud.bridge.service.core.s3.S3SetBucketAccessControlPolicyRequest;
import com.cloud.bridge.service.core.s3.S3SetObjectAccessControlPolicyRequest;
import com.cloud.bridge.service.exception.InternalErrorException;

/*
*  Implementation of S3 service requests as operations defined by the interface, com.amazon.s3.AmazonS3SkeletonInterface.
* The operations dispatched from this class are of the form of SOAP operations which define business logic to be executed by the request.
* The methods required for S3 services in accordance with the skeleton are either implementations of the following
* getBucketLoggingStatus
* copyObject
* getBucketAccessControlPolicy
* listBucket
* putObject
* createBucket
* listAllMyBuckets
* getObject
* deleteBucket
* setBucketLoggingStatus
* getObjectAccessControlPolicy
* deleteObject
* setBucketAccessControlPolicy
* setObjectAccessControlPolicy
* putObjectInline
* getObjectExtended
* or throw and Axis2 fault otherwise.
* These skeleton methods can be used as the implementation of services to satisfy SOAP calls, but also to provide the output
* to be serialized by the AXIOM XML processor.
*
* */

public class S3SerializableServiceImplementation implements AmazonS3SkeletonInterface {
    protected final static Logger logger = Logger.getLogger(S3SerializableServiceImplementation.class);

    private S3Engine engine;

    public S3SerializableServiceImplementation(S3Engine engine) {
        this.engine = engine;
    }

    public GetBucketLoggingStatusResponse getBucketLoggingStatus(GetBucketLoggingStatus getBucketLoggingStatus) {
        throw new UnsupportedOperationException("Unsupported API");
    }

    public SetBucketLoggingStatusResponse setBucketLoggingStatus(SetBucketLoggingStatus setBucketLoggingStatus) {
        throw new UnsupportedOperationException("Unsupported API");
    }

    public CopyObjectResponse copyObject(CopyObject copyObject) throws AxisFault {
        S3CopyObjectRequest request = new S3CopyObjectRequest();

        request.setSourceBucketName(copyObject.getSourceBucket());
        request.setSourceKey(copyObject.getSourceKey());
        request.setDestinationBucketName(copyObject.getDestinationBucket());
        request.setDestinationKey(copyObject.getDestinationKey());

        MetadataDirective mdd = copyObject.getMetadataDirective();
        if (null != mdd)
            request.setDataDirective(mdd.getValue());

        request.setMetaEntries(toEngineMetaEntries(copyObject.getMetadata()));
        request.setAcl(toEngineAccessControlList(copyObject.getAccessControlList()));

        S3ConditionalHeaders conds = new S3ConditionalHeaders();
        conds.setModifiedSince(copyObject.getCopySourceIfModifiedSince());
        conds.setUnModifiedSince(copyObject.getCopySourceIfUnmodifiedSince());
        conds.setMatch(copyObject.getCopySourceIfMatch());
        conds.setNoneMatch(copyObject.getCopySourceIfNoneMatch());
        request.setConditions(conds);

        return toCopyObjectResponse(engine.handleRequest(request));
    }

    public GetBucketAccessControlPolicyResponse getBucketAccessControlPolicy(GetBucketAccessControlPolicy getBucketAccessControlPolicy) {
        // TODO - after authentication, we should setup user context
        return toGetBucketAccessControlPolicyResponse(engine.handleRequest(toEngineGetBucketAccessControlPolicyRequest(getBucketAccessControlPolicy)));
    }

    private S3GetBucketAccessControlPolicyRequest toEngineGetBucketAccessControlPolicyRequest(GetBucketAccessControlPolicy getBucketAccessControlPolicy) {
        S3GetBucketAccessControlPolicyRequest request = new S3GetBucketAccessControlPolicyRequest();

        request.setAccessKey(getBucketAccessControlPolicy.getAWSAccessKeyId());
        request.setRequestTimestamp(getBucketAccessControlPolicy.getTimestamp());
        request.setSignature(getBucketAccessControlPolicy.getSignature());
        request.setBucketName(getBucketAccessControlPolicy.getBucket());
        return request;
    }

    public static GetBucketAccessControlPolicyResponse toGetBucketAccessControlPolicyResponse(S3AccessControlPolicy policy) {
        GetBucketAccessControlPolicyResponse response = new GetBucketAccessControlPolicyResponse();
        response.setGetBucketAccessControlPolicyResponse(toAccessControlPolicy(policy));
        return response;
    }

    public SetBucketAccessControlPolicyResponse setBucketAccessControlPolicy(SetBucketAccessControlPolicy setBucketAccessControlPolicy) {
        S3SetBucketAccessControlPolicyRequest request = new S3SetBucketAccessControlPolicyRequest();
        request.setAccessKey(setBucketAccessControlPolicy.getAWSAccessKeyId());
        request.setRequestTimestamp(setBucketAccessControlPolicy.getTimestamp());
        request.setSignature(setBucketAccessControlPolicy.getSignature());
        request.setBucketName(setBucketAccessControlPolicy.getBucket());
        request.setAcl(toEngineAccessControlList(setBucketAccessControlPolicy.getAccessControlList()));

        SetBucketAccessControlPolicyResponse response = new SetBucketAccessControlPolicyResponse();
        return response;
    }

    public ListBucketResponse listBucket(ListBucket listBucket) {
        // after authentication, we should setup user context
        return toListBucketResponse(engine.listBucketContents(toEngineListBucketRequest(listBucket), false));
    }

    private S3ListBucketRequest toEngineListBucketRequest(ListBucket listBucket) {
        S3ListBucketRequest request = new S3ListBucketRequest();

        request.setAccessKey(listBucket.getAWSAccessKeyId());
        request.setRequestTimestamp(listBucket.getTimestamp());
        request.setSignature(listBucket.getSignature());

        request.setBucketName(listBucket.getBucket());
        request.setDelimiter(listBucket.getDelimiter());
        request.setMarker(listBucket.getMarker());
        request.setMaxKeys(listBucket.getMaxKeys());
        request.setPrefix(listBucket.getPrefix());
        return request;
    }

    public static ListBucketResponse toListBucketResponse(S3ListBucketResponse engineResponse) {
        ListBucketResponse response = new ListBucketResponse();
        ListBucketResult result = new ListBucketResult();
        result.setName(engineResponse.getBucketName());
        result.setDelimiter(engineResponse.getDelimiter());
        result.setPrefix(engineResponse.getPrefix());
        result.setMarker(engineResponse.getMarker());
        result.setMaxKeys(engineResponse.getMaxKeys());
        result.setIsTruncated(engineResponse.isTruncated());
        result.setNextMarker(engineResponse.getNextMarker());
        result.setCommonPrefixes(toPrefixEntry(engineResponse.getCommonPrefixes()));
        result.setContents(toListEntry(engineResponse.getContents()));
        response.setListBucketResponse(result);
        return response;
    }

    private static PrefixEntry[] toPrefixEntry(S3ListBucketPrefixEntry[] engineEntries) {
        if (engineEntries != null) {
            PrefixEntry[] entries = new PrefixEntry[engineEntries.length];
            for (int i = 0; i < engineEntries.length; i++) {
                entries[i] = new PrefixEntry();
                entries[i].setPrefix(engineEntries[i].getPrefix());
            }

            return entries;
        }
        return null;
    }

    private static ListEntry[] toListEntry(S3ListBucketObjectEntry[] engineEntries) {
        if (engineEntries != null) {
            ListEntry[] entries = new ListEntry[engineEntries.length];
            for (int i = 0; i < engineEntries.length; i++) {
                entries[i] = new ListEntry();
                entries[i].setETag(engineEntries[i].getETag());
                entries[i].setKey(engineEntries[i].getKey());
                entries[i].setLastModified(engineEntries[i].getLastModified());
                entries[i].setSize(engineEntries[i].getSize());
                entries[i].setStorageClass(StorageClass.STANDARD);

                CanonicalUser owner = new CanonicalUser();
                owner.setID(engineEntries[i].getOwnerCanonicalId());
                owner.setDisplayName(engineEntries[i].getOwnerDisplayName());
                entries[i].setOwner(owner);
            }
            return entries;
        }

        return null;
    }

    public PutObjectResponse putObject(PutObject putObject) {
        //TODO : fill this with the necessary business logic
        throw new UnsupportedOperationException("Please implement " + this.getClass().getName() + "#putObject");
    }

    public CreateBucketResponse createBucket(CreateBucket createBucket) {
        return toCreateBucketResponse(engine.handleRequest(toEngineCreateBucketRequest(createBucket)));
    }

    private S3CreateBucketRequest toEngineCreateBucketRequest(CreateBucket createBucket) {
        S3CreateBucketRequest request = new S3CreateBucketRequest();
        request.setAccessKey(createBucket.getAWSAccessKeyId());
        request.setRequestTimestamp(createBucket.getTimestamp());
        request.setSignature(createBucket.getSignature());
        request.setBucketName(createBucket.getBucket());
        request.setAcl(toEngineAccessControlList(createBucket.getAccessControlList()));
        return request;
    }

    private CreateBucketResponse toCreateBucketResponse(S3CreateBucketResponse engineResponse) {
        CreateBucketResponse response = new CreateBucketResponse();
        CreateBucketResult result = new CreateBucketResult();
        result.setBucketName(engineResponse.getBucketName());
        response.setCreateBucketReturn(result);
        return response;
    }

    public ListAllMyBucketsResponse listAllMyBuckets(ListAllMyBuckets listAllMyBuckets) {
        return toListAllMyBucketsResponse(engine.handleRequest(toEngineListAllMyBucketsRequest(listAllMyBuckets)));
    }

    private S3ListAllMyBucketsRequest toEngineListAllMyBucketsRequest(ListAllMyBuckets listAllMyBuckets) {
        S3ListAllMyBucketsRequest request = new S3ListAllMyBucketsRequest();
        request.setAccessKey(listAllMyBuckets.getAWSAccessKeyId());
        request.setRequestTimestamp(listAllMyBuckets.getTimestamp());
        request.setSignature(listAllMyBuckets.getSignature());
        return request;
    }

    public static ListAllMyBucketsResponse toListAllMyBucketsResponse(S3ListAllMyBucketsResponse engineResponse) {
        ListAllMyBucketsResponse response = new ListAllMyBucketsResponse();
        ListAllMyBucketsResult result = new ListAllMyBucketsResult();
        ListAllMyBucketsEntry[] entries = null;

        S3CanonicalUser ownerEngine = engineResponse.getOwner();
        CanonicalUser owner = new CanonicalUser();
        owner.setID(ownerEngine.getID());
        owner.setDisplayName(ownerEngine.getDisplayName());
        result.setOwner(owner);
        S3ListAllMyBucketsEntry[] engineEntries = engineResponse.getBuckets();
        if (engineEntries != null) {
            entries = new ListAllMyBucketsEntry[engineEntries.length];
            for (int i = 0; i < engineEntries.length; i++) {
                entries[i] = new ListAllMyBucketsEntry();
                entries[i].setName(engineEntries[i].getName());
                entries[i].setCreationDate(engineEntries[i].getCreationDate());   //setTimeZone(TimeZone.getTimeZone("Z"));
            }

            ListAllMyBucketsList list = new ListAllMyBucketsList();
            list.setBucket(entries);
            result.setBuckets(list);
        }
        response.setListAllMyBucketsResponse(result);
        return response;
    }

    public DeleteBucketResponse deleteBucket(DeleteBucket deleteBucket) {
        return toDeleteBucketResponse(engine.handleRequest(toEngineDeleteBucketRequest(deleteBucket)));
    }

    private S3DeleteBucketRequest toEngineDeleteBucketRequest(DeleteBucket deleteBucket) {
        S3DeleteBucketRequest request = new S3DeleteBucketRequest();
        request.setAccessKey(deleteBucket.getAWSAccessKeyId());
        request.setRequestTimestamp(deleteBucket.getTimestamp());
        request.setSignature(deleteBucket.getSignature());
        request.setBucketName(deleteBucket.getBucket());
        return request;
    }

    private DeleteBucketResponse toDeleteBucketResponse(S3Response engineResponse) {
        DeleteBucketResponse response = new DeleteBucketResponse();
        Status status = new Status();
        status.setCode(engineResponse.getResultCode());
        status.setDescription(engineResponse.getResultDescription());
        response.setDeleteBucketResponse(status);
        return response;
    }

    public GetObjectResponse getObject(com.amazon.s3.GetObject getObject) {
        return toGetObjectResponse(engine.handleRequest(toEngineGetObjectRequest(getObject)));
    }

    public GetObjectExtendedResponse getObjectExtended(GetObjectExtended getObjectExtended) {
        return toGetObjectExtendedResponse(engine.handleRequest(toEngineGetObjectRequest(getObjectExtended)));
    }

    private S3GetObjectRequest toEngineGetObjectRequest(GetObject getObject) {
        S3GetObjectRequest request = new S3GetObjectRequest();

        request.setAccessKey(getObject.getAWSAccessKeyId());
        request.setRequestTimestamp(getObject.getTimestamp());
        request.setSignature(getObject.getSignature());
        request.setBucketName(getObject.getBucket());
        request.setKey(getObject.getKey());
        request.setReturnData(getObject.getGetData());
        request.setReturnMetadata(getObject.getGetMetadata());
        request.setInlineData(getObject.getInlineData());
        return request;
    }

    private S3GetObjectRequest toEngineGetObjectRequest(GetObjectExtended getObjectExtended) {
        S3GetObjectRequest request = new S3GetObjectRequest();
        request.setAccessKey(getObjectExtended.getAWSAccessKeyId());
        request.setRequestTimestamp(getObjectExtended.getTimestamp());
        request.setSignature(getObjectExtended.getSignature());
        request.setBucketName(getObjectExtended.getBucket());
        request.setKey(getObjectExtended.getKey());
        request.setReturnData(getObjectExtended.getGetData());
        request.setReturnMetadata(getObjectExtended.getGetMetadata());
        request.setInlineData(getObjectExtended.getInlineData());

        S3ConditionalHeaders conds = new S3ConditionalHeaders();
        conds.setModifiedSince(getObjectExtended.getIfModifiedSince());
        conds.setUnModifiedSince(getObjectExtended.getIfUnmodifiedSince());
        conds.setMatch(getObjectExtended.getIfMatch());
        conds.setNoneMatch(getObjectExtended.getIfNoneMatch());
        request.setConditions(conds);

        request.setByteRangeStart(getObjectExtended.getByteRangeStart());
        request.setByteRangeEnd(getObjectExtended.getByteRangeEnd());
        request.setReturnCompleteObjectOnConditionFailure(getObjectExtended.getReturnCompleteObjectOnConditionFailure());
        return request;
    }

    private GetObjectResponse toGetObjectResponse(S3GetObjectResponse engineResponse) {
        GetObjectResponse response = new GetObjectResponse();
        int resultCode = engineResponse.getResultCode();

        GetObjectResult result = new GetObjectResult();
        Status param1 = new Status();
        param1.setCode(resultCode);
        param1.setDescription(engineResponse.getResultDescription());
        result.setStatus(param1);

        if (200 == resultCode) {
            result.setData(engineResponse.getData());
            result.setETag(engineResponse.getETag());
            result.setMetadata(toMetadataEntry(engineResponse.getMetaEntries()));
            result.setLastModified(engineResponse.getLastModified());
        } else {
            result.setETag("");
            result.setLastModified(Calendar.getInstance());
        }

        response.setGetObjectResponse(result);
        return response;
    }

    private GetObjectExtendedResponse toGetObjectExtendedResponse(S3GetObjectResponse engineResponse) {
        GetObjectExtendedResponse response = new GetObjectExtendedResponse();
        int resultCode = engineResponse.getResultCode();

        GetObjectResult result = new GetObjectResult();
        Status param1 = new Status();
        param1.setCode(resultCode);
        param1.setDescription(engineResponse.getResultDescription());
        result.setStatus(param1);

        if (200 == resultCode || 206 == resultCode) {
            result.setData(engineResponse.getData());
            result.setETag(engineResponse.getETag());
            result.setMetadata(toMetadataEntry(engineResponse.getMetaEntries()));
            result.setLastModified(engineResponse.getLastModified());
        } else {
            result.setETag("");
            result.setLastModified(Calendar.getInstance());
        }

        response.setGetObjectResponse(result);
        return response;
    }

    private MetadataEntry[] toMetadataEntry(S3MetaDataEntry[] engineEntries) {
        if (engineEntries != null) {
            MetadataEntry[] entries = new MetadataEntry[engineEntries.length];
            for (int i = 0; i < engineEntries.length; i++) {
                entries[i] = new MetadataEntry();
                entries[i].setName(engineEntries[i].getName());
                entries[i].setValue(engineEntries[i].getValue());
            }
            return entries;
        }
        return null;
    }

    public GetObjectAccessControlPolicyResponse getObjectAccessControlPolicy(GetObjectAccessControlPolicy getObjectAccessControlPolicy) {
        return toGetObjectAccessControlPolicyResponse(engine.handleRequest(toEngineGetObjectAccessControlPolicyRequest(getObjectAccessControlPolicy)));
    }

    private S3GetObjectAccessControlPolicyRequest toEngineGetObjectAccessControlPolicyRequest(GetObjectAccessControlPolicy getObjectAccessControlPolicy) {
        S3GetObjectAccessControlPolicyRequest request = new S3GetObjectAccessControlPolicyRequest();

        request.setAccessKey(getObjectAccessControlPolicy.getAWSAccessKeyId());
        request.setRequestTimestamp(getObjectAccessControlPolicy.getTimestamp());
        request.setSignature(getObjectAccessControlPolicy.getSignature());
        request.setBucketName(getObjectAccessControlPolicy.getBucket());
        request.setKey(getObjectAccessControlPolicy.getKey());
        return request;
    }

    public static GetObjectAccessControlPolicyResponse toGetObjectAccessControlPolicyResponse(S3AccessControlPolicy policy) {
        GetObjectAccessControlPolicyResponse response = new GetObjectAccessControlPolicyResponse();
        response.setGetObjectAccessControlPolicyResponse(toAccessControlPolicy(policy));
        return response;
    }

    private static AccessControlPolicy toAccessControlPolicy(S3AccessControlPolicy enginePolicy) {
        AccessControlPolicy policy = new AccessControlPolicy();
        CanonicalUser owner = new CanonicalUser();
        owner.setID(enginePolicy.getOwner().getID());
        owner.setDisplayName(enginePolicy.getOwner().getDisplayName());
        policy.setOwner(owner);

        AccessControlList acl = new AccessControlList();
        acl.setGrant(toGrants(enginePolicy.getGrants()));
        policy.setAccessControlList(acl);
        return policy;
    }

    public DeleteObjectResponse deleteObject(DeleteObject deleteObject) {
        return toDeleteObjectResponse(engine.handleRequest(toEngineDeleteObjectRequest(deleteObject)));
    }

    private S3DeleteObjectRequest toEngineDeleteObjectRequest(DeleteObject deleteObject) {
        S3DeleteObjectRequest request = new S3DeleteObjectRequest();
        request.setAccessKey(deleteObject.getAWSAccessKeyId());
        request.setRequestTimestamp(deleteObject.getTimestamp());
        request.setSignature(deleteObject.getSignature());
        request.setBucketName(deleteObject.getBucket());
        request.setKey(deleteObject.getKey());
        return request;
    }

    private DeleteObjectResponse toDeleteObjectResponse(S3Response engineResponse) {
        DeleteObjectResponse response = new DeleteObjectResponse();
        Status status = new Status();
        status.setCode(engineResponse.getResultCode());
        status.setDescription(engineResponse.getResultDescription());
        response.setDeleteObjectResponse(status);
        return response;
    }

    public SetObjectAccessControlPolicyResponse setObjectAccessControlPolicy(SetObjectAccessControlPolicy setObjectAccessControlPolicy) {
        S3SetObjectAccessControlPolicyRequest request = new S3SetObjectAccessControlPolicyRequest();
        request.setAccessKey(setObjectAccessControlPolicy.getAWSAccessKeyId());
        request.setRequestTimestamp(setObjectAccessControlPolicy.getTimestamp());
        request.setSignature(setObjectAccessControlPolicy.getSignature());
        request.setBucketName(setObjectAccessControlPolicy.getBucket());
        request.setKey(setObjectAccessControlPolicy.getKey());
        request.setAcl(toEngineAccessControlList(setObjectAccessControlPolicy.getAccessControlList()));

        engine.handleRequest(request);
        SetObjectAccessControlPolicyResponse response = new SetObjectAccessControlPolicyResponse();
        return response;
    }

    public PutObjectInlineResponse putObjectInline(PutObjectInline putObjectInline) {
        return toPutObjectInlineResponse(engine.handleRequest(toEnginePutObjectInlineRequest(putObjectInline)));
    }

    private S3PutObjectInlineRequest toEnginePutObjectInlineRequest(PutObjectInline putObjectInline) {
        S3PutObjectInlineRequest request = new S3PutObjectInlineRequest();
        request.setAccessKey(putObjectInline.getAWSAccessKeyId());
        request.setRequestTimestamp(putObjectInline.getTimestamp());
        request.setSignature(putObjectInline.getSignature());
        request.setBucketName(putObjectInline.getBucket());
        request.setContentLength(putObjectInline.getContentLength());
        request.setKey(putObjectInline.getKey());
        request.setData(putObjectInline.getData());
        request.setMetaEntries(toEngineMetaEntries(putObjectInline.getMetadata()));
        request.setAcl(toEngineAccessControlList(putObjectInline.getAccessControlList()));
        return request;
    }

    private S3MetaDataEntry[] toEngineMetaEntries(MetadataEntry[] metaEntries) {
        if (metaEntries != null) {
            S3MetaDataEntry[] engineMetaEntries = new S3MetaDataEntry[metaEntries.length];
            for (int i = 0; i < metaEntries.length; i++) {
                engineMetaEntries[i] = new S3MetaDataEntry();
                engineMetaEntries[i].setName(metaEntries[i].getName());
                engineMetaEntries[i].setValue(metaEntries[i].getValue());
            }
            return engineMetaEntries;
        }
        return null;
    }

    private S3AccessControlList toEngineAccessControlList(AccessControlList acl) {
        if (acl == null)
            return null;

        S3AccessControlList engineAcl = new S3AccessControlList();

        Grant[] grants = acl.getGrant();
        if (grants != null) {
            for (Grant grant : grants) {
                S3Grant engineGrant = new S3Grant();

                Grantee grantee = grant.getGrantee();
                if (grantee instanceof CanonicalUser) {
                    engineGrant.setGrantee(SAcl.GRANTEE_USER);
                    engineGrant.setCanonicalUserID(((CanonicalUser)grantee).getID());
                } else if (grantee instanceof Group) {
                    Group temp = (Group)grantee;
                    String uri = temp.getURI();
                    if (uri.equalsIgnoreCase("http://acs.amazonaws.com/groups/global/AllUsers")) {
                        // -> this allows all public unauthenticated access based on permission given
                        engineGrant.setGrantee(SAcl.GRANTEE_ALLUSERS);
                        engineGrant.setCanonicalUserID("*");
                    } else if (uri.equalsIgnoreCase("http://acs.amazonaws.com/groups/global/Authenticated")) {
                        // -> this allows any authenticated user access based on permission given
                        engineGrant.setGrantee(SAcl.GRANTEE_AUTHENTICATED);
                        engineGrant.setCanonicalUserID("A");
                    } else
                        throw new UnsupportedOperationException("Unsupported grantee group URI: " + uri);

                } else
                    throw new UnsupportedOperationException("Unsupported grantee type: " + grantee.getClass().getCanonicalName());

                Permission permission = grant.getPermission();
                String permissionValue = permission.getValue();
                if (permissionValue.equalsIgnoreCase("READ")) {
                    engineGrant.setPermission(SAcl.PERMISSION_READ);
                } else if (permissionValue.equalsIgnoreCase("WRITE")) {
                    engineGrant.setPermission(SAcl.PERMISSION_WRITE);
                } else if (permissionValue.equalsIgnoreCase("READ_ACP")) {
                    engineGrant.setPermission(SAcl.PERMISSION_READ_ACL);
                } else if (permissionValue.equalsIgnoreCase("WRITE_ACP")) {
                    engineGrant.setPermission(SAcl.PERMISSION_WRITE_ACL);
                } else if (permissionValue.equalsIgnoreCase("FULL_CONTROL")) {
                    engineGrant.setPermission(SAcl.PERMISSION_FULL);
                } else {
                    throw new UnsupportedOperationException("Unsupported permission: " + permissionValue);
                }
                engineAcl.addGrant(engineGrant);
            }
        }
        return engineAcl;
    }

    private static Grant[] toGrants(S3Grant[] engineGrants) {
        Grantee grantee = null;
        Grant[] grants = null;

        if (engineGrants != null && 0 < engineGrants.length) {
            grants = new Grant[engineGrants.length];
            for (int i = 0; i < engineGrants.length; i++) {
                grants[i] = new Grant();

                switch (engineGrants[i].getGrantee()) {
                    case SAcl.GRANTEE_USER:
                        grantee = new CanonicalUser();
                        ((CanonicalUser)grantee).setID(engineGrants[i].getCanonicalUserID());
                        ((CanonicalUser)grantee).setDisplayName("TODO");
                        grants[i].setGrantee(grantee);
                        break;

                    case SAcl.GRANTEE_ALLUSERS:
                        grantee = new Group();
                        ((Group)grantee).setURI("http://acs.amazonaws.com/groups/global/AllUsers");
                        grants[i].setGrantee(grantee);
                        break;

                    case SAcl.GRANTEE_AUTHENTICATED:
                        grantee = new Group();
                        ((Group)grantee).setURI("http://acs.amazonaws.com/groups/global/Authenticated");
                        grants[i].setGrantee(grantee);
                        break;

                    default:
                        throw new InternalErrorException("Unsupported grantee type");
                }

                switch (engineGrants[i].getPermission()) {
                    case SAcl.PERMISSION_READ:
                        grants[i].setPermission(Permission.READ);
                        break;
                    case SAcl.PERMISSION_WRITE:
                        grants[i].setPermission(Permission.WRITE);
                        break;
                    case SAcl.PERMISSION_READ_ACL:
                        grants[i].setPermission(Permission.READ_ACP);
                        break;
                    case SAcl.PERMISSION_WRITE_ACL:
                        grants[i].setPermission(Permission.WRITE_ACP);
                        break;
                    case SAcl.PERMISSION_FULL:
                        grants[i].setPermission(Permission.FULL_CONTROL);
                        break;
                }
            }
            return grants;
        }
        return null;
    }

    private PutObjectInlineResponse toPutObjectInlineResponse(S3PutObjectInlineResponse engineResponse) {
        PutObjectInlineResponse response = new PutObjectInlineResponse();

        PutObjectResult result = new PutObjectResult();
        result.setETag(engineResponse.getETag());
        result.setLastModified(engineResponse.getLastModified());
        response.setPutObjectInlineResponse(result);
        return response;
    }

    public static CopyObjectResponse toCopyObjectResponse(S3CopyObjectResponse engineResponse) throws AxisFault {
        CopyObjectResponse response = new CopyObjectResponse();
        int resultCode = engineResponse.getResultCode();

        CopyObjectResult result = new CopyObjectResult();
        if (300 <= resultCode) {
            String description = engineResponse.getResultDescription();
            throw new AxisFault("" + resultCode, (null == description ? "" : description));
        }

        result.setETag("\"" + engineResponse.getETag() + "\"");
        result.setLastModified(engineResponse.getLastModified());
        response.setCopyObjectResult(result);
        return response;
    }
}
TOP

Related Classes of com.cloud.bridge.service.controller.s3.S3SerializableServiceImplementation

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.