view flys-artifacts/src/main/java/de/intevation/flys/exports/ChartSettings.java @ 4282:8b4988815974

Added marker for Ws and Qs in Historical Discharge WQ charts. Therefore, the XYChartGenerator got two new methods addDomainMarker(Marker, boolean) and addValueMarker(Marker, boolean). The boolean parameters determine, if the marker should be visible or not. This is analogous to addAxisSeries(XYSeries, int, boolean).
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 29 Oct 2012 05:59:27 +0100
parents b7867c03760a
children
line wrap: on
line source
package de.intevation.flys.exports;

import javax.xml.xpath.XPathConstants;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.apache.log4j.Logger;

import de.intevation.artifacts.common.utils.XMLUtils;

import de.intevation.artifactdatabase.state.DefaultSection;
import de.intevation.artifactdatabase.state.DefaultSettings;
import de.intevation.artifactdatabase.state.Section;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class ChartSettings extends DefaultSettings {

    private static final Logger logger = Logger.getLogger(ChartSettings.class);

    protected ChartSection  chartSection;
    protected LegendSection legendSection;
    protected ExportSection exportSection;
    protected Section       axesSection;


    public ChartSettings() {
        super();

        axesSection = new DefaultSection("axes");
        addSection(axesSection);
    }


    /**
     * Sets the chart section. Old chart sections are removed.
     *
     * @param chartSection A new Section that stores chart specific attributes.
     */
    public void setChartSection(ChartSection chartSection) {
        ChartSection oldChartSection = getChartSection();

        if (oldChartSection != null) {
            removeSection(oldChartSection);
        }

        this.chartSection = chartSection;
        addSection(chartSection);
    }


    /**
     * Returns the Section that stores chart specific attributes.
     *
     * @return the Section that stores chart specific attributes.
     */
    public ChartSection getChartSection() {
        return chartSection;
    }


    /**
     * Sets the legend section. Old legend sections are removed.
     *
     * @param legendSection A new Section that stores legend specific
     * attributes.
     */
    public void setLegendSection(LegendSection legendSection) {
        LegendSection oldLegendSection = getLegendSection();

        if (oldLegendSection != null) {
            removeSection(oldLegendSection);
        }

        this.legendSection = legendSection;
        addSection(legendSection);
    }


    /**
     * Returns the Section that stores legend specific attributes.
     *
     * @return the Section that stores legend specific attributes.
     */
    public LegendSection getLegendSection() {
        return legendSection;
    }


    /**
     * Sets the export section. Old export sections are removed.
     *
     * @param exportSection A new Section that stores export specific
     * attributes.
     */
    public void setExportSection(ExportSection exportSection) {
        ExportSection oldExportSection = getExportSection();

        if (oldExportSection != null) {
            removeSection(oldExportSection);
        }

        this.exportSection = exportSection;
        addSection(exportSection);
    }


    /**
     * Returns the Section that stores export specific attributes.
     *
     * @return the Section that stores export specific attributes.
     */
    public ExportSection getExportSection() {
        return exportSection;
    }


    /**
     * Adds a Section for a new axis of the chart.
     *
     * @param axisSection The Section specific for a chart axis.
     */
    public void addAxisSection(AxisSection axisSection) {
        if (axisSection != null) {
            axesSection.addSubsection(axisSection);
        }
    }


    /**
     * This method returns an AxisSection specified by <i>axisId</i> or null if
     * no AxisSection is existing with identifier <i>axisId</i>.
     *
     * @param axisId The identifier of the wanted AxisSection.
     *
     * @return the AxisSection specified by <i>axisId</i> or null.
     */
    public AxisSection getAxisSection(String axisId) {
        for (int i = 0, n = axesSection.getSubsectionCount(); i < n; i++) {
            AxisSection as = (AxisSection) axesSection.getSubsection(i);
            String      id = as.getIdentifier();

            if (id != null && id.equals(axisId)) {
                return as;
            }
        }

        return null;
    }


    /**
     * Parses the settings from <i>settings</i>. The result is a new
     * ChartSettings instance.
     *
     * @param settings A <i>settings</i> node.
     *
     * @return a new <i>ChartSettings</i> instance.
     */
    public static ChartSettings parse(Node settings) {
        if (settings == null) {
            logger.warn("Tried to parse ChartSettings from empty Node!");
            return null;
        }

        ChartSettings chartSettings = new ChartSettings();

        parseAxes(chartSettings, settings);
        parseChart(chartSettings, settings);
        parseLegend(chartSettings, settings);
        parseExport(chartSettings, settings);

        return chartSettings;
    }


    protected static void parseAxes(ChartSettings target, Node settings) {
        NodeList axesList = (NodeList) XMLUtils.xpath(
            settings, "axes/axis", XPathConstants.NODESET, null);

        int num = axesList != null ? axesList.getLength() : 0;

        if (num <= 0) {
            logger.debug("No axis sections found.");
            return;
        }

        for (int i = 0; i < num; i++) {
            parseAxis(target, axesList.item(i));
        }
    }


    protected static void parseAxis(ChartSettings target, Node axis) {
        AxisSection section = new AxisSection();

        String id       = XMLUtils.xpathString(axis, "id", null);
        String label    = XMLUtils.xpathString(axis, "label", null);
        String fSize    = XMLUtils.xpathString(axis, "font-size", null);
        String fixation = XMLUtils.xpathString(axis, "fixation", null);
        String low      = XMLUtils.xpathString(axis, "lower", null);
        String up       = XMLUtils.xpathString(axis, "upper", null);

        if (logger.isDebugEnabled()) {
            logger.debug("Fount axis id:        '" + id + "'");
            logger.debug("Fount axis label:     '" + label + "'");
            logger.debug("Fount axis font size: '" + fSize + "'");
            logger.debug("Fount axis fixation:  '" + fixation + "'");
            logger.debug("Fount axis lower:     '" + low + "'");
            logger.debug("Fount axis upper:     '" + up + "'");
        }

        section.setIdentifier(id);
        section.setLabel(label);
        section.setFontSize(Integer.parseInt(fSize.length() > 0 ? fSize : "-1"));
        section.setFixed(Boolean.valueOf(fixation));
        section.setLowerRange(Double.parseDouble(low.length() > 0 ? low : "0"));
        section.setUpperRange(Double.parseDouble(up.length() > 0 ? up : "0"));

        target.addAxisSection(section);
    }


    /**
     * From document chart create ChartSection and populate it with attributes.
     * Give this object to target as chartsection.
     */
    protected static void parseChart(ChartSettings target, Node chart) {
        ChartSection chartSection = new ChartSection();

        String title = XMLUtils.xpathString(chart, "chart/title", null);
        String sub   = XMLUtils.xpathString(chart, "chart/subtitle", null);
        String grid  = XMLUtils.xpathString(chart, "chart/display-grid", null);
        String logo  = XMLUtils.xpathString(chart, "chart/display-logo", null);
        String placeh = XMLUtils.xpathString(chart, "chart/logo-placeh", null);
        String placev = XMLUtils.xpathString(chart, "chart/logo-placev", null);

        if (logger.isDebugEnabled()) {
            logger.debug("Found chart title:    '" + title + "'");
            logger.debug("Found chart subtitle: '" + sub + "'");
            logger.debug("Found chart grid:     '" + grid + "'");
            logger.debug("Found chart logo:     '" + logo + "'");
            logger.debug("Found chart logo placeh: '" + placeh + "'");
            logger.debug("Found chart logo placev: '" + placev + "'");
        }

        chartSection.setTitle(title);
        chartSection.setSubtitle(sub);
        chartSection.setDisplayGrid(Boolean.valueOf(grid));
        chartSection.setDisplayLogo(logo);
        chartSection.setLogoHPlacement(placeh);
        chartSection.setLogoVPlacement(placev);

        target.setChartSection(chartSection);
    }


    protected static void parseLegend(ChartSettings target, Node legend) {
        LegendSection section = new LegendSection();

        String vis   = XMLUtils.xpathString(legend, "legend/visibility", null);
        String fSize = XMLUtils.xpathString(legend, "legend/font-size", null);
        String lthre = XMLUtils.xpathString(legend, "legend/aggregation-threshold", null);

        if (logger.isDebugEnabled()) {
            logger.debug("Found legend visibility: '" + vis + "'");
            logger.debug("Found legend font size : '" + fSize + "'");
            logger.debug("Found legend aggregation threshold : '" + lthre + "'");
        }

        section.setVisibility(Boolean.valueOf(vis));
        section.setFontSize(Integer.valueOf(fSize.length() > 0 ? fSize : "-1"));
        section.setAggregationThreshold(Integer.valueOf(lthre.length() >0 ? lthre : "-1"));

        target.setLegendSection(section);
    }


    protected static void parseExport(ChartSettings target, Node export) {
        ExportSection section = new ExportSection();

        String width  = XMLUtils.xpathString(export, "export/width", null);
        String height = XMLUtils.xpathString(export, "export/height", null);

        if (logger.isDebugEnabled()) {
            logger.debug("Found export width : '" + width + "'");
            logger.debug("Found export height: '" + height + "'");
        }

        section.setWidth(Integer.valueOf(width.length() > 0 ? width : "-1"));
        section.setHeight(Integer.valueOf(height.length() > 0 ? height : "-1"));

        target.setExportSection(section);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org