Mercurial > dive4elements > http-client
view src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactProtocolUtils.java @ 2:2fdfa20cfa63
Added an interface that is used to create instances of artifacts depending on the framework that includes this lib. The create() method of the HttpClient makes use of this interface.
http-client/trunk@1325 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 17 Feb 2011 11:19:02 +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: