it.eng.spagobi.engines.chart.bo.charttypes.barcharts.OverlaidStackedBarLine.java Source code

Java tutorial

Introduction

Here is the source code for it.eng.spagobi.engines.chart.bo.charttypes.barcharts.OverlaidStackedBarLine.java

Source

/* SpagoBI, the Open Source Business Intelligence suite
    
 * Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
 * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0, without the "Incompatible With Secondary Licenses" notice. 
 * If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package it.eng.spagobi.engines.chart.bo.charttypes.barcharts;

import it.eng.spago.base.SourceBean;
import it.eng.spago.base.SourceBeanAttribute;
import it.eng.spagobi.commons.constants.SpagoBIConstants;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyCategoryToolTipGenerator;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyCategoryUrlGenerator;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyStandardCategoryItemLabelGenerator;
import it.eng.spagobi.engines.chart.utils.DataSetAccessFunctions;
import it.eng.spagobi.engines.chart.utils.DatasetMap;

import java.awt.Color;
import java.awt.Font;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;

public class OverlaidStackedBarLine extends LinkableBar {

    HashMap seriesDraw = null;
    HashMap seriesCaptions = null;
    boolean additionalLabels = false;
    HashMap catSerLabels = null;
    boolean useBars = false;
    boolean useLines = false;

    boolean secondAxis = false;
    String secondAxisLabel = null;
    boolean freeToolTips = false; //automatically set

    // maps the element with the tooltip information. tip_element or freetip_element
    HashMap<String, String> seriesTooltip = null;
    HashMap<String, String> categoriesTooltip = null;

    private static transient Logger logger = Logger.getLogger(OverlaidStackedBarLine.class);

    public DatasetMap calculateValue() throws Exception {

        seriesNames = new Vector();
        seriesCaptions = new LinkedHashMap();
        categoriesTooltip = new HashMap<String, String>();
        seriesTooltip = new HashMap<String, String>();
        // I must identify different series

        String res = DataSetAccessFunctions.getDataSetResultFromId(profile, getData(), parametersObject);
        categories = new LinkedHashMap();

        //DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        DatasetMap datasetMap = new DatasetMap();

        SourceBean sbRows = SourceBean.fromXMLString(res);
        List listAtts = sbRows.getAttributeAsList("ROW");

        // run all categories (one for each row)
        categoriesNumber = 0;

        // new versione: two datasets one for bar and one for lines
        datasetMap.getDatasets().put("stackedbar", new DefaultCategoryDataset());
        datasetMap.getDatasets().put("line", new DefaultCategoryDataset());

        boolean first = true;
        //categories.put(new Integer(0), "All Categories");
        for (Iterator iterator = listAtts.iterator(); iterator.hasNext();) {
            SourceBean category = (SourceBean) iterator.next();
            List atts = category.getContainedAttributes();

            //HashMap series=new HashMap();
            HashMap series = new LinkedHashMap();
            HashMap additionalValues = new LinkedHashMap();
            String catValue = "";

            String nameP = "";
            String value = "";

            if (first) {
                if (name.indexOf("$F{") >= 0) {
                    setTitleParameter(atts);
                }
                if (getSubName() != null && getSubName().indexOf("$F") >= 0) {
                    setSubTitleParameter(atts);
                }
                first = false;
            }

            //run all the attributes, to define series!
            int contSer = 0;
            for (Iterator iterator2 = atts.iterator(); iterator2.hasNext();) {
                SourceBeanAttribute object = (SourceBeanAttribute) iterator2.next();

                nameP = new String(object.getKey());
                value = new String((String) object.getValue());
                if (nameP.equalsIgnoreCase("x")) {
                    catValue = value;
                    categoriesNumber = categoriesNumber + 1;
                    categories.put(new Integer(categoriesNumber), value);

                } else {
                    if (nameP.startsWith("add_") || nameP.startsWith("ADD_")) {
                        if (additionalLabels) {
                            String ind = nameP.substring(4);
                            additionalValues.put(ind, value);
                        }
                    }
                    // must be after x definition
                    else if (nameP.toUpperCase().startsWith("TIP_X")) { // additional information
                        if (enableToolTips) {
                            categoriesTooltip.put(nameP + "_" + catValue, value);
                        }
                    }

                    else if (nameP.toUpperCase().startsWith("TIP_")) { // additional information
                        if (enableToolTips) {
                            seriesTooltip.put(nameP, value);
                        }
                    } else if (nameP.toUpperCase().startsWith("FREETIP_X")) { // additional information
                        if (enableToolTips) {
                            freeToolTips = true; //help the search later in MyCategoryToolTipGenerator
                            categoriesTooltip.put(nameP + "_" + catValue, value);
                        }
                    } else {
                        if (seriesLabelsMap != null) {
                            if ((this.getNumberSerVisualization() > 0 && contSer < this.getNumberSerVisualization())
                                    && seriesDraw.get(nameP) != null
                                    && ((String) seriesDraw.get(nameP)).equalsIgnoreCase("StackedBar")) {
                                String serieLabel = (String) seriesLabelsMap.get(nameP);
                                series.put(serieLabel, value);
                                seriesCaptions.put(serieLabel, nameP);
                                contSer++;
                            } else if (this.getNumberSerVisualization() == 0 || (seriesDraw.get(nameP) != null
                                    && ((String) seriesDraw.get(nameP)).equalsIgnoreCase("line"))) { //all series
                                String serieLabel = (String) seriesLabelsMap.get(nameP);
                                series.put(serieLabel, value);
                                seriesCaptions.put(serieLabel, nameP);
                            }
                        } else if (this.getNumberSerVisualization() > 0
                                && contSer < this.getNumberSerVisualization()
                                && ((String) seriesDraw.get(nameP)).equalsIgnoreCase("StackedBar")) {
                            series.put(nameP, value);
                            contSer++;
                        } else if (this.getNumberSerVisualization() == 0
                                || ((String) seriesDraw.get(nameP)).equalsIgnoreCase("line")) { //all series
                            series.put(nameP, value);
                        }
                    }

                    // for now I make like if addition value is checked he seek for an attribute with name with value+name_serie
                }
            }

            // for each serie
            for (Iterator iterator3 = series.keySet().iterator(); iterator3.hasNext();) {
                String nameS = (String) iterator3.next();
                String labelS = "";
                String valueS = (String) series.get(nameS);
                Double valueD = null;
                try {
                    valueD = Double.valueOf(valueS);
                } catch (Exception e) {
                    logger.warn("error in double conversion, put default to null");
                    valueD = null;
                }

                if (!hiddenSeries.contains(nameS)) {
                    if (seriesLabelsMap != null && (seriesCaptions != null && seriesCaptions.size() > 0)) {
                        nameS = (String) (seriesCaptions.get(nameS));
                        labelS = (String) seriesLabelsMap.get(nameS);
                    } else
                        labelS = nameS;

                    // if to draw as a line
                    if (seriesDraw.get(nameS) != null
                            && ((String) seriesDraw.get(nameS.toUpperCase())).equalsIgnoreCase("line")) {
                        if (!seriesNames.contains(nameS.toUpperCase()))
                            seriesNames.add(nameS.toUpperCase());
                        ((DefaultCategoryDataset) (datasetMap.getDatasets().get("line")))
                                .addValue(valueD != null ? valueD.doubleValue() : null, labelS, catValue);
                    } else { // if to draw as a bar
                        if (!seriesNames.contains(nameS.toUpperCase()))
                            seriesNames.add(nameS.toUpperCase());
                        ((DefaultCategoryDataset) (datasetMap.getDatasets().get("stackedbar")))
                                .addValue(valueD != null ? valueD.doubleValue() : null, labelS, catValue);

                    }
                    // if there is an additional label are 
                    if (additionalValues.get(nameS) != null) {
                        String val = (String) additionalValues.get(nameS);
                        String index = catValue + "-" + nameS;
                        catSerLabels.put(index, val);
                    }

                }

            }

        }
        return datasetMap;

    }

    public void configureChart(SourceBean content) {
        super.configureChart(content);

        if (confParameters.get("add_labels") != null) {
            String additional = (String) confParameters.get("add_labels");
            if (additional.equalsIgnoreCase("true")) {
                additionalLabels = true;
                catSerLabels = new LinkedHashMap();
            } else
                additionalLabels = false;
        } else {
            additionalLabels = false;
        }

        //reading series colors if present
        SourceBean draws = (SourceBean) content.getAttribute("SERIES_DRAW");

        if (draws == null) {
            draws = (SourceBean) content.getAttribute("CONF.SERIES_DRAW");
        }

        seriesDraw = new LinkedHashMap();
        if (draws != null) {

            List atts = draws.getContainedAttributes();

            String serieName = "";
            String serieDraw = "";
            for (Iterator iterator = atts.iterator(); iterator.hasNext();) {
                SourceBeanAttribute object = (SourceBeanAttribute) iterator.next();
                serieName = new String(object.getKey());
                serieDraw = new String((String) object.getValue());

                if (serieDraw.equalsIgnoreCase("line")) {
                    seriesDraw.put(serieName.toUpperCase(), "line");
                    useLines = true;
                } else {
                    seriesDraw.put(serieName.toUpperCase(), "stackedbar");
                    useBars = true;
                }

            }

        } else {
            useBars = true;
        }

        if (confParameters.get("second_axis_label") != null) {
            secondAxis = true;
            secondAxisLabel = (String) confParameters.get("second_axis_label");
        }

    }

    public JFreeChart createChart(DatasetMap datasets) {

        // create the first renderer...

        CategoryPlot plot = new CategoryPlot();
        NumberFormat nf = NumberFormat.getNumberInstance(locale);

        NumberAxis rangeAxis = new NumberAxis(getValueLabel());
        rangeAxis.setLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
        rangeAxis.setLabelPaint(styleXaxesLabels.getColor());
        rangeAxis
                .setTickLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
        rangeAxis.setTickLabelPaint(styleXaxesLabels.getColor());
        rangeAxis.setNumberFormatOverride(nf);
        plot.setRangeAxis(rangeAxis);
        if (rangeIntegerValues == true) {
            rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        }

        CategoryAxis domainAxis = new CategoryAxis(getCategoryLabel());
        domainAxis.setLabelFont(new Font(styleYaxesLabels.getFontName(), Font.PLAIN, styleYaxesLabels.getSize()));
        domainAxis.setLabelPaint(styleYaxesLabels.getColor());
        domainAxis
                .setTickLabelFont(new Font(styleYaxesLabels.getFontName(), Font.PLAIN, styleYaxesLabels.getSize()));
        domainAxis.setTickLabelPaint(styleYaxesLabels.getColor());
        plot.setDomainAxis(domainAxis);

        plot.setOrientation(PlotOrientation.VERTICAL);
        plot.setRangeGridlinesVisible(true);
        plot.setDomainGridlinesVisible(true);

        DefaultCategoryDataset datasetBar = (DefaultCategoryDataset) datasets.getDatasets().get("stackedbar");

        //I create one bar renderer and one line

        MyStandardCategoryItemLabelGenerator generator = null;
        if (additionalLabels) {
            generator = new MyStandardCategoryItemLabelGenerator(catSerLabels, "{1}", NumberFormat.getInstance());
        }

        if (useBars) {
            CategoryItemRenderer barRenderer = new StackedBarRenderer();

            if (maxBarWidth != null) {
                ((BarRenderer) barRenderer).setMaximumBarWidth(maxBarWidth.doubleValue());
            }

            if (additionalLabels) {
                barRenderer.setBaseItemLabelGenerator(generator);
                double orient = (-Math.PI / 2.0);
                if (styleValueLabels.getOrientation().equalsIgnoreCase("horizontal")) {
                    orient = 0.0;
                }
                barRenderer.setBaseItemLabelFont(
                        new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
                barRenderer.setBaseItemLabelPaint(styleValueLabels.getColor());
                barRenderer.setBaseItemLabelsVisible(true);
                barRenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER,
                        TextAnchor.CENTER, TextAnchor.CENTER, orient));
                barRenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER,
                        TextAnchor.CENTER, TextAnchor.CENTER, orient));

            }

            if (colorMap != null) {
                for (Iterator iterator = datasetBar.getRowKeys().iterator(); iterator.hasNext();) {
                    String serName = (String) iterator.next();
                    String labelName = "";
                    int index = -1;
                    if (seriesCaptions != null && seriesCaptions.size() > 0) {
                        labelName = serName;
                        serName = (String) seriesCaptions.get(serName);
                        index = datasetBar.getRowIndex(labelName);
                    } else
                        index = datasetBar.getRowIndex(serName);

                    Color color = (Color) colorMap.get(serName);
                    if (color != null) {
                        barRenderer.setSeriesPaint(index, color);
                    }
                }
            }
            // add tooltip if enabled
            if (enableToolTips) {
                MyCategoryToolTipGenerator generatorToolTip = new MyCategoryToolTipGenerator(freeToolTips,
                        seriesTooltip, categoriesTooltip, seriesCaptions);
                barRenderer.setToolTipGenerator(generatorToolTip);
            }

            //defines url for drill
            boolean document_composition = false;
            if (mode.equalsIgnoreCase(SpagoBIConstants.DOCUMENT_COMPOSITION))
                document_composition = true;

            logger.debug("Calling Url Generation");

            MyCategoryUrlGenerator mycatUrl = null;
            if (super.rootUrl != null) {
                logger.debug("Set MycatUrl");
                mycatUrl = new MyCategoryUrlGenerator(super.rootUrl);

                mycatUrl.setDocument_composition(document_composition);
                mycatUrl.setCategoryUrlLabel(super.categoryUrlName);
                mycatUrl.setSerieUrlLabel(super.serieUrlname);
                mycatUrl.setDrillDocTitle(drillDocTitle);
                mycatUrl.setTarget(target);
            }
            if (mycatUrl != null) {
                barRenderer.setItemURLGenerator(mycatUrl);
            }

            plot.setDataset(1, datasetBar);
            plot.setRenderer(1, barRenderer);

        }

        if (useLines) {

            LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
            //lineRenderer.setShapesFilled(false);
            lineRenderer.setShapesFilled(true);
            if (additionalLabels) {
                lineRenderer.setBaseItemLabelGenerator(generator);
                lineRenderer.setBaseItemLabelFont(
                        new Font(defaultLabelsStyle.getFontName(), Font.PLAIN, defaultLabelsStyle.getSize()));
                lineRenderer.setBaseItemLabelPaint(defaultLabelsStyle.getColor());
                lineRenderer.setBaseItemLabelsVisible(true);
            }

            DefaultCategoryDataset datasetLine = (DefaultCategoryDataset) datasets.getDatasets().get("line");

            if (enableToolTips) {
                MyCategoryToolTipGenerator generatorToolTip = new MyCategoryToolTipGenerator(freeToolTips,
                        seriesTooltip, categoriesTooltip, seriesCaptions);
                lineRenderer.setToolTipGenerator(generatorToolTip);
            }

            if (colorMap != null) {
                for (Iterator iterator = datasetLine.getRowKeys().iterator(); iterator.hasNext();) {
                    String serName = (String) iterator.next();
                    String labelName = "";
                    int index = -1;

                    if (seriesCaptions != null && seriesCaptions.size() > 0) {
                        labelName = serName;
                        serName = (String) seriesCaptions.get(serName);
                        index = datasetLine.getRowIndex(labelName);
                    } else
                        index = datasetLine.getRowIndex(serName);

                    Color color = (Color) colorMap.get(serName);
                    if (color != null) {
                        lineRenderer.setSeriesPaint(index, color);
                    }
                }
            }
            plot.setDataset(0, datasetLine);
            plot.setRenderer(0, lineRenderer);
        }

        if (secondAxis) {
            NumberAxis na = new NumberAxis(secondAxisLabel);
            na.setLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
            na.setLabelPaint(styleXaxesLabels.getColor());
            na.setTickLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
            na.setTickLabelPaint(styleXaxesLabels.getColor());
            na.setUpperMargin(0.10);
            if (rangeIntegerValues == true) {
                na.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            }
            na.setNumberFormatOverride(nf);
            plot.setRangeAxis(1, na);
            plot.mapDatasetToRangeAxis(0, 1);
        }

        //plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

        plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);
        JFreeChart chart = new JFreeChart(plot);
        TextTitle title = setStyleTitle(name, styleTitle);
        chart.setTitle(title);
        if (subName != null && !subName.equals("")) {
            TextTitle subTitle = setStyleTitle(subName, styleSubTitle);
            chart.addSubtitle(subTitle);
        }

        chart.setBackgroundPaint(Color.white);

        if (legend == true)
            drawLegend(chart);
        return chart;

    }

}