NodeList children = null;
String temp = null;
String element = null;
int count = 0;
S3PutObjectRequest request = new S3PutObjectRequest();
// [A] Pull out the simple nodes first
NodeList part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Bucket" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setBucketName( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Key" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setKey( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "ContentLength" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
{
String length = contents.getFirstChild().getNodeValue();
if (null != length) request.setContentLength( Long.decode( length ));
}
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "AWSAccessKeyId" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setAccessKey( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Signature" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setSignature( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Timestamp" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setRawTimestamp( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "StorageClass" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setStorageClass( contents.getFirstChild().getNodeValue());
}
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Credential" );
if (null != part)
{
if (null != (contents = part.item( 0 )))
request.setCredential( contents.getFirstChild().getNodeValue());
}
// [B] Get a list of all 'Metadata' elements
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Metadata" );
if (null != part)
{
count = part.getLength();
S3MetaDataEntry[] metaEntry = new S3MetaDataEntry[ count ];
for( int i=0; i < count; i++ )
{
parent = part.item(i);
metaEntry[i] = new S3MetaDataEntry();
// -> get a list of all the children elements of the 'Metadata' parent element
if (null != (children = parent.getChildNodes()))
{
int numChildren = children.getLength();
for( int j=0; j < numChildren; j++ )
{
contents = children.item( j );
element = contents.getNodeName().trim();
if ( element.endsWith( "Name" ))
{
temp = contents.getFirstChild().getNodeValue();
if (null != temp) metaEntry[i].setName( temp );
}
else if (element.endsWith( "Value" ))
{
temp = contents.getFirstChild().getNodeValue();
if (null != temp) metaEntry[i].setValue( temp );
}
}
}
}
request.setMetaEntries( metaEntry );
}
// [C] Get a list of all Grant elements in an AccessControlList
part = getElement( doc, "http://s3.amazonaws.com/doc/2006-03-01/", "Grant" );
if (null != part)
{
S3AccessControlList engineAcl = new S3AccessControlList();
count = part.getLength();
for( int i=0; i < count; i++ )
{
parent = part.item(i);
S3Grant engineGrant = new S3Grant();
// -> get a list of all the children elements of the 'Grant' parent element
if (null != (children = parent.getChildNodes()))
{
int numChildren = children.getLength();
for( int j=0; j < numChildren; j++ )
{
contents = children.item( j );
element = contents.getNodeName().trim();
if ( element.endsWith( "Grantee" ))
{
NamedNodeMap attbs = contents.getAttributes();
if (null != attbs)
{
Node type = attbs.getNamedItemNS( "http://www.w3.org/2001/XMLSchema-instance", "type" );
if ( null != type )
temp = type.getFirstChild().getNodeValue().trim();
else temp = null;
if ( null != temp && temp.equalsIgnoreCase( "CanonicalUser" ))
{
engineGrant.setGrantee(SAcl.GRANTEE_USER);
engineGrant.setCanonicalUserID( getChildNodeValue( contents, "ID" ));
}
else throw new UnsupportedOperationException( "Missing http://www.w3.org/2001/XMLSchema-instance:type value" );
}
}
else if (element.endsWith( "Permission" ))
{
temp = contents.getFirstChild().getNodeValue().trim();
if (temp.equalsIgnoreCase("READ" )) engineGrant.setPermission(SAcl.PERMISSION_READ);
else if (temp.equalsIgnoreCase("WRITE" )) engineGrant.setPermission(SAcl.PERMISSION_WRITE);
else if (temp.equalsIgnoreCase("READ_ACP" )) engineGrant.setPermission(SAcl.PERMISSION_READ_ACL);
else if (temp.equalsIgnoreCase("WRITE_ACP" )) engineGrant.setPermission(SAcl.PERMISSION_WRITE_ACL);
else if (temp.equalsIgnoreCase("FULL_CONTROL")) engineGrant.setPermission(SAcl.PERMISSION_FULL);
else throw new UnsupportedOperationException( "Unsupported permission: " + temp );
}
}
engineAcl.addGrant( engineGrant );
}
}
request.setAcl( engineAcl );
}
return request;
}