package at.ac.ait.archistar.engine.userinterface; import java.io.StringWriter; import java.io.Writer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.jboss.resteasy.util.Hex; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; import at.ac.ait.archistar.engine.dataobjects.SimpleFile; public class XmlDocumentBuilder { private final DocumentBuilderFactory docFactory; private final DocumentBuilder docBuilder; public XmlDocumentBuilder() throws ParserConfigurationException { this.docFactory = DocumentBuilderFactory.newInstance(); this.docBuilder = docFactory.newDocumentBuilder(); } private Element createElement(Document doc, String name, String value) { Element xmlKey = doc.createElement(name); xmlKey.setTextContent(value); return xmlKey; } public Document listElements(String prefix, String bucketName, int maxKeys, Set<SimpleFile> results) { Document doc = this.docBuilder.newDocument(); doc.setXmlVersion("1.0"); Element rootElement = doc.createElement("ListBucketResult"); rootElement.setAttribute("xmlns", "http://doc.s3.amazonaws.com/2006-03-01"); doc.appendChild(rootElement); Element name = doc.createElement("Name"); name.setTextContent(bucketName); rootElement.appendChild(name); rootElement.appendChild(doc.createElement("Prefix")); rootElement.appendChild(doc.createElement("Marker")); rootElement.appendChild(createElement(doc, "MaxKeys", "1000")); rootElement.appendChild(createElement(doc, "isTruncated", "false")); for (SimpleFile entry : results) { Element contents = doc.createElement("Contents"); String eTag = "could not compute"; try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] thedigest = md.digest(entry.getData()); eTag = Hex.encodeHex(thedigest); } catch (NoSuchAlgorithmException e) { assert(false); } contents.appendChild(createElement(doc, "Key", entry.getPath())); contents.appendChild(createElement(doc, "Size", "" + entry.getData().length)); contents.appendChild(createElement(doc, "LastModified", "2006-02-03T16:41:58.000Z")); contents.appendChild(createElement(doc, "ETag", eTag)); rootElement.appendChild(contents); } return doc; } public Document bucketNotFound(String bucket) { Document doc = this.docBuilder.newDocument(); doc.setXmlVersion("1.0"); Element rootElement = doc.createElement("Error"); rootElement.setAttribute("xmlns", "http://doc.s3.amazonaws.com/2006-03-01"); doc.appendChild(rootElement); rootElement.appendChild(createElement(doc, "Code", "NoSuchBucket")); rootElement.appendChild(createElement(doc, "Resource", bucket)); rootElement.appendChild(createElement(doc, "Resource", bucket)); return doc; } public Document listBuckets(Map<String, FakeBucket> bucketList) { Document doc = this.docBuilder.newDocument(); doc.setXmlVersion("1.0"); Element rootElement = doc.createElement("ListAllMyBucketsResult"); rootElement.setAttribute("xmlns", "http://doc.s3.amazonaws.com/2006-03-01"); doc.appendChild(rootElement); Element owner = doc.createElement("Owner"); Element id = doc.createElement("ID"); id.setTextContent("deadbeef"); Element name = doc.createElement("DisplayName"); name.setTextContent("Andreas Happe"); owner.appendChild(id); owner.appendChild(name); rootElement.appendChild(owner); Element buckets = doc.createElement("Buckets"); for (Entry<String, FakeBucket> e : bucketList.entrySet()) { Element bucket = doc.createElement("Bucket"); bucket.appendChild(createElement(doc, "Name", e.getKey())); bucket.appendChild(createElement(doc, "CreationDate", "1982-07-07T16:41:58.000Z")); buckets.appendChild(bucket); } rootElement.appendChild(buckets); return doc; } public String stringFromDoc(Document doc) { DOMImplementation impl = doc.getImplementation(); DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); LSSerializer lsSerializer = implLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter("format-pretty-print", true); LSOutput lsOutput = implLS.createLSOutput(); lsOutput.setEncoding("UTF-8"); Writer stringWriter = new StringWriter(); lsOutput.setCharacterStream(stringWriter); lsSerializer.write(doc, lsOutput); return stringWriter.toString(); } Document noSuchKey(String id) { Document doc = this.docBuilder.newDocument(); doc.setXmlVersion("1.0"); Element rootElement = doc.createElement("Error"); rootElement.setAttribute("xmlns", "http://doc.s3.amazonaws.com/2006-03-01"); doc.appendChild(rootElement); rootElement.appendChild(createElement(doc, "Message", "The resource you requested does not exist")); rootElement.appendChild(createElement(doc, "Code", "NoSuchKey")); rootElement.appendChild(createElement(doc, "Resource", id)); return doc; } }