view flys-artifacts/src/main/java/de/intevation/flys/exports/ChartSettings.java @ 5130:b11f3563a117

Part of fix for flys/issue1128: Use rivers unit in cross section diagrams.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Thu, 28 Feb 2013 12:18:21 +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