ingo@0: /* ingo@0: * Copyright (c) 2010 by Intevation GmbH ingo@0: * ingo@0: * This program is free software under the LGPL (>=v2.1) ingo@0: * Read the file LGPL.txt coming with the software for details ingo@0: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@0: */ teichmann@72: package org.dive4elements.artifacts.httpclient.utils; ingo@0: ingo@0: import java.util.Map; ingo@0: ingo@0: import javax.xml.xpath.XPathConstants; ingo@0: tom@125: import org.apache.logging.log4j.Logger; tom@125: import org.apache.logging.log4j.LogManager; ingo@0: ingo@0: import org.w3c.dom.Document; ingo@0: import org.w3c.dom.Element; ingo@0: import org.w3c.dom.NodeList; ingo@0: teichmann@72: import org.dive4elements.artifacts.httpclient.objects.Artifact; teichmann@72: import org.dive4elements.artifacts.httpclient.objects.ArtifactFactory; ingo@0: ingo@0: public class ArtifactProtocolUtils { ingo@0: ingo@0: private static final Logger logger = tom@125: LogManager.getLogger(ArtifactProtocolUtils.class); ingo@0: ingo@0: ingo@0: public static ArtifactFactory[] extractArtifactFactories(Document doc) { ingo@0: NodeList elements = (NodeList) XMLUtils.getXPath( ingo@0: doc, ingo@0: "/art:result/art:factories/art:factory", ingo@0: XPathConstants.NODESET, ingo@0: ArtifactNamespaceContext.INSTANCE); ingo@0: ingo@0: if (elements == null || elements.getLength() == 0) { ingo@0: return null; ingo@0: } ingo@0: ingo@0: ArtifactFactory[] facs = new ArtifactFactory[elements.getLength()]; ingo@0: sascha@27: String uri = ArtifactNamespaceContext.NAMESPACE_URI; ingo@0: sascha@28: for (int idx = 0; idx < facs.length; idx++) { sascha@27: Element factory = (Element)elements.item(idx); sascha@27: String desc = factory.getAttributeNS(uri, "description"); sascha@27: String name = factory.getAttributeNS(uri, "name"); sascha@27: sascha@27: if (name.length() != 0) { ingo@0: facs[idx] = new ArtifactFactory(name, desc); ingo@0: } ingo@0: } ingo@0: ingo@0: return facs; ingo@0: } ingo@0: ingo@0: ingo@0: public static Document createCreateDocument(String fis) { ingo@0: Document document = XMLUtils.newDocument(); ingo@0: ingo@0: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@0: document, ingo@0: ArtifactNamespaceContext.NAMESPACE_URI, ingo@0: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@0: ); ingo@0: ingo@0: Element action = creator.create("action"); ingo@0: ingo@0: Element type = creator.create("type"); ingo@0: type.setAttribute("name", "create"); ingo@0: ingo@0: Element factory = creator.create("factory"); ingo@0: factory.setAttribute("name", fis); ingo@0: ingo@0: action.appendChild(type); ingo@0: action.appendChild(factory); ingo@0: document.appendChild(action); ingo@0: ingo@0: return document; ingo@0: } ingo@0: ingo@0: ingo@0: /** ingo@0: * Returns a new artifact defined by uuid and hash values of the document ingo@0: * returned by the artifact server after creating a new artifact. ingo@0: * ingo@0: * @param document Contains information about the server-side created ingo@0: * artifact. ingo@0: * @return a new artifact object. ingo@0: */ ingo@0: public static Artifact extractArtifact(Document document) { ingo@0: String uuid = XMLUtils.getStringXPath( ingo@0: document, ingo@0: "/art:result/art:uuid/@value"); ingo@0: ingo@0: String hash = XMLUtils.getStringXPath( ingo@0: document, ingo@0: "/art:result/art:hash/@value"); ingo@0: ingo@0: logger.info("NEW Artifact: " + uuid + " / " + hash); ingo@0: return new Artifact(uuid, hash); ingo@0: } ingo@0: ingo@0: ingo@0: private static Element createArtifactAction( ingo@0: XMLUtils.ElementCreator creator, ingo@0: Artifact artifact, ingo@0: String artifactAction) ingo@0: { ingo@0: Element action = creator.create("action"); ingo@0: ingo@0: Element type = creator.create("type"); ingo@0: type.setAttribute("name", artifactAction); ingo@0: ingo@0: Element uuid = creator.create("uuid"); ingo@0: uuid.setAttribute("value", artifact.getUuid()); ingo@0: ingo@0: Element hash = creator.create("hash"); ingo@0: hash.setAttribute("value", artifact.getHash()); ingo@0: ingo@0: action.appendChild(type); ingo@0: action.appendChild(uuid); ingo@0: action.appendChild(hash); ingo@0: ingo@0: return action; ingo@0: } ingo@0: ingo@0: ingo@0: public static Document createFeedDocument(Artifact artifact, Map attr) { ingo@0: Document document = XMLUtils.newDocument(); ingo@0: ingo@0: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@0: document, ingo@0: ArtifactNamespaceContext.NAMESPACE_URI, ingo@0: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@0: ); ingo@0: ingo@0: Element action = createArtifactAction(creator, artifact, "feed"); ingo@0: Element data = creator.create("data"); ingo@0: sascha@28: for (Map.Entry entry: sascha@28: ((Map)attr).entrySet()) { sascha@28: sascha@28: String key = entry.getKey(); sascha@28: Object values = entry.getValue(); ingo@0: ingo@0: if (values instanceof Object[]) { ingo@0: appendInputNodes(creator, data, key, (Object[]) values); ingo@0: } ingo@0: else { ingo@0: appendInputNodes(creator, data, key, values); ingo@0: } ingo@0: } ingo@0: ingo@0: action.appendChild(data); ingo@0: document.appendChild(action); ingo@0: ingo@0: return document; ingo@0: } ingo@0: ingo@0: ingo@0: private static void appendInputNodes( ingo@0: XMLUtils.ElementCreator creator, ingo@0: Element root, ingo@0: String key, ingo@0: Object value) ingo@0: { ingo@0: Element input = creator.create("input"); ingo@0: input.setAttribute("name", key); ingo@0: input.setAttribute("value", (String) value); ingo@0: root.appendChild(input); ingo@0: } ingo@0: ingo@0: ingo@0: private static void appendInputNodes( ingo@0: XMLUtils.ElementCreator creator, ingo@0: Element root, ingo@0: String key, ingo@0: Object[] values) ingo@0: { ingo@0: for (Object value: values) { ingo@0: Element input = creator.create("input"); ingo@0: input.setAttribute("name", key); ingo@0: input.setAttribute("value", (String) value); ingo@0: root.appendChild(input); ingo@0: } ingo@0: } ingo@0: ingo@0: ingo@0: public static Document createDescribeDocument(Artifact art, boolean ui) { ingo@0: Document document = XMLUtils.newDocument(); ingo@0: ingo@0: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@0: document, ingo@0: ArtifactNamespaceContext.NAMESPACE_URI, ingo@0: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@0: ); ingo@0: ingo@0: Element action = createArtifactAction(creator, art, "describe"); ingo@0: Element includeUi = creator.create("include-ui"); ingo@0: includeUi.setTextContent(String.valueOf(ui)); ingo@0: ingo@0: action.appendChild(includeUi); ingo@0: document.appendChild(action); ingo@0: ingo@0: return document; ingo@0: } ingo@0: ingo@0: ingo@0: public static Document createAdvanceDocument(Artifact art, String target) { ingo@0: Document document = XMLUtils.newDocument(); ingo@0: ingo@0: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@0: document, ingo@0: ArtifactNamespaceContext.NAMESPACE_URI, ingo@0: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@0: ); ingo@0: ingo@0: Element action = createArtifactAction(creator, art, "advance"); ingo@0: Element targetEle = creator.create("target"); ingo@0: targetEle.setAttribute("name", target); ingo@0: ingo@0: action.appendChild(targetEle); ingo@0: document.appendChild(action); ingo@0: ingo@0: return document; ingo@0: } ingo@0: ingo@0: ingo@0: public static Document createChartDocument(Artifact artifact, Map opts) { ingo@0: Document document = XMLUtils.newDocument(); ingo@0: ingo@0: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@0: document, ingo@0: ArtifactNamespaceContext.NAMESPACE_URI, ingo@0: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@0: ); ingo@0: ingo@0: Element action = createArtifactAction(creator, artifact, "out"); ingo@0: Element out = creator.create("out"); ingo@0: out.setAttribute("name", "chart"); ingo@0: ingo@0: Element export = creator.create("export"); ingo@0: export.setAttribute("name", "img"); ingo@0: ingo@0: Element mimetype = creator.create("mime-type"); ingo@0: export.setAttribute("value", (String) opts.get("mime-type")); ingo@0: ingo@0: Element params = creator.create("params"); ingo@0: ingo@0: Element width = creator.create("input"); ingo@0: width.setAttribute("name", "width"); ingo@0: width.setAttribute("value", (String) opts.get("width")); ingo@0: ingo@0: Element height = creator.create("input"); ingo@0: height.setAttribute("name", "height"); ingo@0: height.setAttribute("value", (String) opts.get("height")); ingo@0: ingo@0: Element points = creator.create("input"); ingo@0: points.setAttribute("name", "points"); ingo@0: points.setAttribute("value", (String) opts.get("points")); ingo@0: ingo@0: params.appendChild(width); ingo@0: params.appendChild(height); ingo@0: params.appendChild(points); ingo@0: ingo@0: out.appendChild(export); ingo@0: out.appendChild(mimetype); ingo@0: out.appendChild(params); ingo@0: ingo@0: action.appendChild(out); ingo@0: document.appendChild(action); ingo@0: ingo@0: return document; ingo@0: } ingo@0: } ingo@0: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: