diff flys-artifacts/src/main/java/de/intevation/flys/collections/OutputParser.java @ 751:8d5bd3a08dd1

merged flys-artifacts/2.4
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:14 +0200
parents 853dceead0f4
children 9ff7e06bcb77
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/OutputParser.java	Fri Sep 28 12:14:14 2012 +0200
@@ -0,0 +1,148 @@
+package de.intevation.flys.collections;
+
+import java.util.HashMap;
+import java.util.Map;
+
+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.ArtifactDatabase;
+import de.intevation.artifacts.ArtifactDatabaseException;
+import de.intevation.artifacts.ArtifactNamespaceContext;
+import de.intevation.artifacts.CallMeta;
+
+import de.intevation.artifactdatabase.state.DefaultOutput;
+import de.intevation.artifactdatabase.state.Output;
+
+import de.intevation.artifacts.common.utils.XMLUtils;
+
+import de.intevation.flys.artifacts.model.ManagedFacet;
+
+
+public class OutputParser {
+
+    /** Constant XPath that points to the outputmodes of an artifact.*/
+    public static final String XPATH_ARTIFACT_OUTPUTMODES =
+        "/art:result/art:outputmodes/art:output";
+
+
+    private static Logger logger = Logger.getLogger(OutputParser.class);
+
+    protected ArtifactDatabase db;
+    protected CallMeta         meta;
+
+    protected Map<String, Output> outs;
+
+
+    public OutputParser(ArtifactDatabase db, CallMeta meta) {
+        this.db   = db;
+        this.meta = meta;
+        this.outs = new HashMap<String, Output>();
+    }
+
+
+    public void parse(String uuid)
+    throws ArtifactDatabaseException
+    {
+        logger.debug("OutputParser.parse: " + uuid);
+
+        // XXX I am not sure if it works well every time with an empty
+        // document in the describe operation of an artifact.
+        Document description = db.describe(uuid, null, meta);
+
+        NodeList outs = (NodeList) XMLUtils.xpath(
+            description,
+            XPATH_ARTIFACT_OUTPUTMODES,
+            XPathConstants.NODESET,
+            ArtifactNamespaceContext.INSTANCE);
+
+        int num = outs != null ? outs.getLength() : 0;
+
+        logger.debug("Artifact has " + num + " outputs.");
+
+        for (int i = 0; i < num; i++) {
+            Element out = (Element)outs.item(i);
+
+            parseOutput(uuid, out);
+        }
+    }
+
+
+    public Map<String, Output> getOuts() {
+        return outs;
+    }
+
+
+    protected void addItem(String out, ManagedFacet item) {
+        Output o = outs.get(out);
+
+        if (o != null) {
+            int num = o.getFacets().size();
+            item.setPosition(num+1);
+
+            o.addFacet(item);
+        }
+    }
+
+
+    protected void parseOutput(String uuid, Element out) {
+
+        String uri = ArtifactNamespaceContext.NAMESPACE_URI;
+
+        String name = out.getAttributeNS(uri, "name");
+
+        if (outs.get(name) == null) {
+            logger.debug("Create new output: " + name);
+            newOutput(out, name);
+        }
+
+        parseItems(uuid, out, name);
+    }
+
+
+    protected void newOutput(Element out, String name) {
+
+        String uri = ArtifactNamespaceContext.NAMESPACE_URI;
+
+        String desc     = out.getAttributeNS(uri, "description");
+        String mimetype = out.getAttributeNS(uri, "mime-type");
+
+        Output o = new DefaultOutput(name, desc, mimetype);
+
+        outs.put(name, o);
+    }
+
+
+    protected void parseItems(String uuid, Node out, String outname) {
+        NodeList facets = (NodeList) XMLUtils.xpath(
+            out, "art:facets/art:facet",
+            XPathConstants.NODESET,
+            ArtifactNamespaceContext.INSTANCE);
+
+        int num = facets != null ? facets.getLength() : 0;
+
+        String uri = ArtifactNamespaceContext.NAMESPACE_URI;
+
+        logger.debug("Output has " + num + " facets.");
+
+        for (int i = 0; i < num; i++) {
+            Element facet = (Element) facets.item(i);
+
+            String name  = facet.getAttributeNS(uri, "name");
+            String desc  = facet.getAttributeNS(uri, "description");
+            String index = facet.getAttributeNS(uri, "index");
+
+            ManagedFacet item = new ManagedFacet(
+                name, Integer.parseInt(index), desc, uuid, 1, 1);
+
+            addItem(outname, item);
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org