/** * Convert the SOAP XML we extract from the DIME message into our local object. Here Axis2 is not * parsing the SOAP for us. I tried to use the Amazon PutObject parser but it keep throwing * exceptions. * * @param putObjectInline * @return * @throws Exception */ public static S3PutObjectRequest toEnginePutObjectRequest(InputStream is) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(is); Node parent = null; Node contents = null; 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; }