/* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved. * * Licensed 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.CopyObjectResult; import com.amazon.s3.Group; import com.amazon.s3.CopyObjectResponse; 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.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; /* @Author Kelven Yang, John Zucker * 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; } }