view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/AreaFacet.java @ 2165:637dd38d0e2f

Handle the case in "W auf freier Strecke" where more than ne Q is related to a W. flys-artifacts/trunk@3753 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 23 Jan 2012 17:39:51 +0000
parents bb0dede9294f
children 5642a83420f2
line wrap: on
line source
package de.intevation.flys.artifacts.model;

import java.util.List;

import org.apache.log4j.Logger;

import de.intevation.artifacts.Artifact;
import de.intevation.artifacts.CallContext;

import de.intevation.artifactdatabase.state.DefaultFacet;
import de.intevation.artifactdatabase.state.Facet;

import de.intevation.artifacts.DataProvider;

import de.intevation.flys.artifacts.AreaArtifact;


/**
 * Trival Facet for areas.
 * Note that this Facet comes in two "types" (names):
 *  <ul>
 *    <li>CROSS_SECTION_AREA (cross_section.area) and</li>
 *    <li>LONGITUDINAL_SECTION_AREA (longitudinal.area</li>
 *  </ul>
 * This is to support different diagram types without being painted in both
 * at the same time. The name has to be given when constructing.
 */
public class AreaFacet
extends      DefaultFacet
implements   FacetTypes {

    private static Logger logger = Logger.getLogger(AreaFacet.class);

    /**
     * Constructor, set (maybe localized) description and name.
     * @param idx Index given when querying artifact for data.
     * @param name important to discern areas in different diagram types.
     */
    public AreaFacet(int idx, String name, String description) {
        super(idx, name, description);
    }


    /**
     * Gets Cross Section (profile).
     * @param art artifact to get data from.
     * @param context ignored
     */
    public Object getData(Artifact art, CallContext context) {
        logger.debug("Get data for area.");

        // Get information from artifact about which
        // info to grab from blackboard.
        //
        // All compatible facets should provide their data
        // under the key (Artifact-UUID + Facet-Index).
        AreaArtifact artifact = (AreaArtifact) art;
        Object lowerData      = null;
        Object upperData      = null;
        String stemFacetName  = null;

        List<DataProvider> providers = context.
            getDataProvider(artifact.getLowerDPKey());
        if (providers.size() < 1) {
            logger.warn("No 'lower' provider given for area [" + 
                artifact.getLowerDPKey() + "]");
        }
        else {
            lowerData = providers.get(0).provideData(
                artifact.getLowerDPKey(), null, context);
            logger.debug("'Lower' data provider key for area [" + 
                artifact.getLowerDPKey() + "]");
            stemFacetName = artifact.getLowerDPKey().split(":")[1];
        }

        providers = context.getDataProvider(artifact.getUpperDPKey());
        if (providers.size() < 1) {
            logger.warn("No 'upper' provider given for area [" +
                artifact.getUpperDPKey() + "]");
        }
        else {
            upperData = providers.get(0).provideData(
                artifact.getUpperDPKey(), null, context);
            logger.debug("'Upper' data provider key for area [" +
                artifact.getUpperDPKey() + "]");
            if (stemFacetName == null) {
                stemFacetName = artifact.getUpperDPKey().split(":")[1];
            }
        }

        if (upperData == null && lowerData == null) {
            logger.warn("Not given 'upper' and 'lower' for area");
        }

        return new Data(stemFacetName, lowerData, upperData,
            Boolean.valueOf(artifact.getPaintBetween()));
    }


    /** Do a deep copy. */
    @Override 
    public Facet deepCopy() {
        AreaFacet copy = new AreaFacet(this.index, this.name, this.description);
        copy.set(this);
        return copy;
    }

    /** Result data bundle. */
    public class Data {
        protected String  rootFacetName;
        protected Object  upperData;
        protected Object  lowerData;
        protected boolean doPaintBetween;

        /** Create a new result data bundle. */
        public Data(String rootName, Object low, Object up, boolean between) {
            this.rootFacetName  = rootName;
            this.lowerData      = low;
            this.upperData      = up;
            this.doPaintBetween = between;
        }

        /** Get name of a facet that is involved in area generation
         * to induce type (e.g. longitudinal_section.w -> "W over km"). */
        public String getRootFacetName() {
            return this.rootFacetName;
        }

        /** Get data for 'upper' curve of area. */
        public Object getUpperData() {
            return this.upperData;
        }

        /** Get data for 'lower' curve of area. */
        public Object getLowerData() {
            return this.lowerData;
        }

        /** Whether to fill whole area between (in contrast to 'under'
         *  or 'over'). */
        public boolean doPaintBetween() {
            return this.doPaintBetween;
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org