view flys-artifacts/src/main/java/de/intevation/flys/collections/OutputParser.java @ 444:932a5e3c7fa1

ISSUE-72 Repaired broken XPath expression in MainValuesService to extract start and end kilometer. flys-artifacts/trunk@1936 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 17 May 2011 11:53:02 +0000
parents 6167ae622ce0
children 68c6c75a6f7c
line wrap: on
line source
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.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++) {
            Node out = 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, Node out) {
        String name = XMLUtils.xpathString(
            out, "@art:name", ArtifactNamespaceContext.INSTANCE);

        if (outs.get(name) == null) {
            logger.debug("Create new output: " + name);
            newOutput(out, name);
        }

        parseItems(uuid, out, name);
    }


    protected void newOutput(Node out, String name) {
        String desc = XMLUtils.xpathString(
            out, "@art:description", ArtifactNamespaceContext.INSTANCE);

        String mimetype = XMLUtils.xpathString(
            out, "@art:mime-type", ArtifactNamespaceContext.INSTANCE);

        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;

        logger.debug("Output has " + num + " facets.");

        for (int i = 0; i < num; i++) {
            Node facet = facets.item(i);

            String name = XMLUtils.xpathString(
                facet, "@art:name", ArtifactNamespaceContext.INSTANCE);

            ManagedFacet item = new ManagedFacet(name, null, uuid, 1, 1);

            addItem(outname, item);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org