Mercurial > dive4elements > http-client
view src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactProtocolUtils.java @ 21:79a5a2455d6d
Use Apache HTTP Client as the underlaying transport agent. Use thread local instances to re-use agents.
http-client/trunk@2042 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 01 Jun 2011 14:32:24 +0000 |
parents | a1db30b33f43 |
children | 73b211b559e2 |
line wrap: on
line source
/* * Copyright (c) 2010 by Intevation GmbH * * This program is free software under the LGPL (>=v2.1) * Read the file LGPL.txt coming with the software for details * or visit http://www.gnu.org/licenses/ if it does not exist. */ package de.intevation.artifacts.httpclient.utils; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.xml.xpath.XPathConstants; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import de.intevation.artifacts.httpclient.objects.Artifact; import de.intevation.artifacts.httpclient.objects.ArtifactFactory; public class ArtifactProtocolUtils { private static final Logger logger = Logger.getLogger(ArtifactProtocolUtils.class); public static ArtifactFactory[] extractArtifactFactories(Document doc) { NodeList elements = (NodeList) XMLUtils.getXPath( doc, "/art:result/art:factories/art:factory", XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE); if (elements == null || elements.getLength() == 0) { return null; } ArtifactFactory[] facs = new ArtifactFactory[elements.getLength()]; for (int idx = 0; idx < elements.getLength(); idx++) { Node factory = elements.item(idx); String desc = XMLUtils.getStringXPath(factory, "@art:description"); String name = XMLUtils.getStringXPath(factory, "@art:name"); if (name != null) { facs[idx] = new ArtifactFactory(name, desc); } } return facs; } public static Document createCreateDocument(String fis) { Document document = XMLUtils.newDocument(); XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( document, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX ); Element action = creator.create("action"); Element type = creator.create("type"); type.setAttribute("name", "create"); Element factory = creator.create("factory"); factory.setAttribute("name", fis); action.appendChild(type); action.appendChild(factory); document.appendChild(action); return document; } /** * Returns a new artifact defined by uuid and hash values of the document * returned by the artifact server after creating a new artifact. * * @param document Contains information about the server-side created * artifact. * @return a new artifact object. */ public static Artifact extractArtifact(Document document) { String uuid = XMLUtils.getStringXPath( document, "/art:result/art:uuid/@value"); String hash = XMLUtils.getStringXPath( document, "/art:result/art:hash/@value"); logger.info("NEW Artifact: " + uuid + " / " + hash); return new Artifact(uuid, hash); } private static Element createArtifactAction( XMLUtils.ElementCreator creator, Artifact artifact, String artifactAction) { Element action = creator.create("action"); Element type = creator.create("type"); type.setAttribute("name", artifactAction); Element uuid = creator.create("uuid"); uuid.setAttribute("value", artifact.getUuid()); Element hash = creator.create("hash"); hash.setAttribute("value", artifact.getHash()); action.appendChild(type); action.appendChild(uuid); action.appendChild(hash); return action; } public static Document createFeedDocument(Artifact artifact, Map attr) { Document document = XMLUtils.newDocument(); XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( document, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX ); Element action = createArtifactAction(creator, artifact, "feed"); Element data = creator.create("data"); Set keys = attr.keySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { String key = (String) iter.next(); Object values = attr.get(key); if (values instanceof Object[]) { appendInputNodes(creator, data, key, (Object[]) values); } else { appendInputNodes(creator, data, key, values); } } action.appendChild(data); document.appendChild(action); return document; } private static void appendInputNodes( XMLUtils.ElementCreator creator, Element root, String key, Object value) { Element input = creator.create("input"); input.setAttribute("name", key); input.setAttribute("value", (String) value); root.appendChild(input); } private static void appendInputNodes( XMLUtils.ElementCreator creator, Element root, String key, Object[] values) { for (Object value: values) { Element input = creator.create("input"); input.setAttribute("name", key); input.setAttribute("value", (String) value); root.appendChild(input); } } public static Document createDescribeDocument(Artifact art, boolean ui) { Document document = XMLUtils.newDocument(); XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( document, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX ); Element action = createArtifactAction(creator, art, "describe"); Element includeUi = creator.create("include-ui"); includeUi.setTextContent(String.valueOf(ui)); action.appendChild(includeUi); document.appendChild(action); return document; } public static Document createAdvanceDocument(Artifact art, String target) { Document document = XMLUtils.newDocument(); XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( document, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX ); Element action = createArtifactAction(creator, art, "advance"); Element targetEle = creator.create("target"); targetEle.setAttribute("name", target); action.appendChild(targetEle); document.appendChild(action); return document; } public static Document createChartDocument(Artifact artifact, Map opts) { Document document = XMLUtils.newDocument(); XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( document, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX ); Element action = createArtifactAction(creator, artifact, "out"); Element out = creator.create("out"); out.setAttribute("name", "chart"); Element export = creator.create("export"); export.setAttribute("name", "img"); Element mimetype = creator.create("mime-type"); export.setAttribute("value", (String) opts.get("mime-type")); Element params = creator.create("params"); Element width = creator.create("input"); width.setAttribute("name", "width"); width.setAttribute("value", (String) opts.get("width")); Element height = creator.create("input"); height.setAttribute("name", "height"); height.setAttribute("value", (String) opts.get("height")); Element points = creator.create("input"); points.setAttribute("name", "points"); points.setAttribute("value", (String) opts.get("points")); params.appendChild(width); params.appendChild(height); params.appendChild(points); out.appendChild(export); out.appendChild(mimetype); out.appendChild(params); action.appendChild(out); document.appendChild(action); return document; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: