view flys-artifacts/src/main/java/de/intevation/flys/collections/OutputParser.java @ 940:f4439e015278

Append artifact recommendations to the artifact's describe document. flys-artifacts/trunk@2334 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 14 Jul 2011 15:30:55 +0000
parents 9ff7e06bcb77
children c256061287d7
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.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");
        String type     = out.getAttributeNS(uri, "type");

        Output o = new DefaultOutput(name, desc, mimetype, type);

        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