/*
* 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;
import java.io.IOException;
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;
public class S3SoapServiceImpl implements AmazonS3SkeletonInterface {
protected final static Logger logger = Logger.getLogger(S3SoapServiceImpl.class);
private S3Engine engine;
public S3SoapServiceImpl(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) {
// 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()));
S3Response basicResponse = engine.handleRequest(request);
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());
}
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;
}
}