view flys-artifacts/src/main/java/de/intevation/flys/collections/OutputParser.java @ 3273:739aa90eb79e

Fix issue694. flys-artifacts/trunk@4917 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Tue, 10 Jul 2012 16:04:44 +0000
parents 1203e12c97a6
children
line wrap: on
line source
package de.intevation.flys.collections;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import de.intevation.artifacts.ArtifactDatabase;
import de.intevation.artifacts.ArtifactDatabaseException;
import de.intevation.artifacts.CallContext;
import de.intevation.artifacts.CallMeta;

import de.intevation.artifactdatabase.state.DefaultOutput;
import de.intevation.artifactdatabase.state.Facet;
import de.intevation.artifactdatabase.state.Output;

import de.intevation.flys.artifacts.FLYSArtifact;
import de.intevation.flys.artifacts.model.ManagedFacetAdapter;


/**
 * The OutputParsers task is to pull Artifacts from database and put
 * its outputs and facets into some structures.
 */
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 CallContext      context;

    /** Map outputs name to Output. */
    protected Map<String, Output> outs;

    /** Map facets name to list of Facets. */
    protected List<Facet> facets;


    /**
     * @param db Database used to fetch artifacts, outputs and facets.
     */
    public OutputParser(ArtifactDatabase db, CallContext context) {
        this.db      = db;
        this.meta    = context.getMeta();
        this.context = context;
        this.outs    = new HashMap<String, Output>();
        this.facets  = new ArrayList<Facet>();
    }


    /**
     * Gets raw artifact with given id and sorts outputs in mapping.
     * Converts Facets to ManagedFacets on the way.
     * @param uuid uuid of artifact to load from database.
     */
    public void parse(String uuid)
    throws ArtifactDatabaseException
    {
        logger.debug("OutputParser.parse: " + uuid);

        FLYSArtifact flys = (FLYSArtifact) db.getRawArtifact(uuid);

        List<Output> outList = flys.getOutputs(context);

        logger.debug("   has " + outList.size() + " Outputs.");

        for (Output out: outList) {
            String name = out.getName();
            logger.debug("Process Output '" + name + "'");

            Output o = outs.get(name);
            int  pos = 1;

            if (o == null) {
                o = new DefaultOutput(
                    out.getName(),
                    out.getDescription(),
                    out.getMimeType(),
                    new ArrayList<Facet>(),
                    out.getType());
                outs.put(name, o);
            }
            else {
                logger.debug("OutputParser.parse: Use 'old' Output");
                pos = o.getFacets().size() + 1;
            }

            List<Facet> mfacets = facet2ManagedFacet(uuid, out.getFacets(), pos);
            o.addFacets(mfacets);
            this.facets.addAll(mfacets);
        }
    }


    /**
     * Access mapping of Outputname to Output.
     */
    public Map<String, Output> getOuts() {
        return outs;
    }


    /**
     * Access all facets.
     */
    public List<Facet> getFacets() {
        return this.facets;
    }


    /**
     * Creates a list of ManagedFacets from list of Facets.
     * @param pos Position of first facet (for each other the positions
     *            will be increased).
     */
    protected List<Facet> facet2ManagedFacet(
        String      uuid,
        List<Facet> old,
        int         pos)
    {
        List<Facet> newFacets = new ArrayList<Facet>(old.size());

        logger.debug("There are " + old.size() + " Facets for this Output.");

        for (Facet f: old) {
            newFacets.add(new ManagedFacetAdapter(f, uuid, pos++, 1, 1));
        }

        return newFacets;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org