net.sf.jsfcomp.chartcreator.renderkit.ChartRenderer.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jsfcomp.chartcreator.renderkit.ChartRenderer.java

Source

/*
 * Copyright 2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.sf.jsfcomp.chartcreator.renderkit;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;

import org.esupportail.commons.utils.ContextUtils;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.CategoryLabelEntity;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.imagemap.StandardToolTipTagFragmentGenerator;

import net.sf.jsfcomp.chartcreator.component.UIChart;
import net.sf.jsfcomp.chartcreator.model.ChartData;
import net.sf.jsfcomp.chartcreator.utils.ChartConstants;
import net.sf.jsfcomp.chartcreator.utils.ChartUtils;

/**
 * @author Cagatay Civici (latest modification by $Author: cagatay_civici $)
 * @version $Revision: 745 $ $Date: 2007-05-08 10:16:19 +0300 (Tue, 08 May 2007) $
 * 
 * Renders the img tag and refers to an image that is generated at serverside
 */
public class ChartRenderer extends Renderer {

    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        UIChart chart = (UIChart) component;
        setChartDataAtSession(context, chart);

        String clientId = chart.getClientId(context);

        writer.startElement("img", chart);
        writer.writeAttribute("id", clientId, null);
        writer.writeAttribute("width", String.valueOf(chart.getWidth()), null);
        writer.writeAttribute("border", "0", null);
        writer.writeAttribute("height", String.valueOf(chart.getHeight()), null);

        if (ChartUtils.useServlet(context))
            writer.writeAttribute("src", ChartConstants.CHART_REQUEST + ".chart?ts=" + System.currentTimeMillis()
                    + "&chartId=" + clientId, null);
        else {
            String viewId = context.getViewRoot().getViewId();
            String actionURL = context.getApplication().getViewHandler().getActionURL(context, viewId);
            //         writer.writeAttribute("src", actionURL + "?ts="+ System.currentTimeMillis() + "&chartId=" + clientId, null);
            writer.writeAttribute("src", context.getExternalContext().getRequestContextPath() + "/dummy.chart?ts="
                    + System.currentTimeMillis() + "&chartId=" + clientId, null);
        }

        ChartUtils.renderPassThruImgAttributes(writer, chart);
    }

    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        UIChart chart = (UIChart) component;

        writer.endElement("img");

        if (chart.getGenerateMap() != null)
            writeImageMap(context, chart);
    }

    // creates and puts the chart data to session for this chart object
    private void setChartDataAtSession(FacesContext facesContext, UIChart chart) {
        Map session = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        String clientId = chart.getClientId(facesContext);
        ChartData data = new ChartData(chart);
        //      session.put(clientId, data);
        ContextUtils.setGlobalSessionAttribute(clientId, data);
    }

    private void renderImageMapSupport(FacesContext context, UIChart uichart,
            ChartRenderingInfo chartRenderingInfo) {
        ResponseWriter writer = context.getResponseWriter();

        try {
            Iterator entities = chartRenderingInfo.getEntityCollection().iterator();
            while (entities.hasNext()) {
                ChartEntity entity = (ChartEntity) entities.next();
                if (entity instanceof CategoryLabelEntity) {
                    CategoryLabelEntity categoryEntity = (CategoryLabelEntity) entity;
                    if (categoryEntity.getKey() != null) {
                        categoryEntity.setToolTipText(categoryEntity.getKey().toString());
                        categoryEntity.setURLText("?category=" + categoryEntity.getKey().toString());
                    }
                }
            }

            writer.write("<script>");
            writer.write("function chart" + uichart.getId() + "Click(data) {");

            if (uichart.getOngeneratedimagemapclick() != null)
                writer.write("  " + uichart.getOngeneratedimagemapclick() + "(data);");

            writer.write("}");
            writer.write("</script>");
        } catch (IOException error) {
            error.printStackTrace();
        }
    }

    private void writeImageMap(FacesContext context, UIChart uichart) {
        ResponseWriter writer = context.getResponseWriter();
        ExternalContext externalContext = context.getExternalContext();
        Map sessionMap = externalContext.getSessionMap();
        String clientId = uichart.getClientId(context);
        ChartData data = (ChartData) sessionMap.get(clientId);
        JFreeChart chart = ChartUtils.createChartWithType(data);
        ChartUtils.setGeneralChartProperties(chart, data);

        ChartRenderingInfo chartRenderingInfo = new ChartRenderingInfo();
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            if (data.getOutput().equalsIgnoreCase("png"))
                ChartUtilities.writeChartAsPNG(out, chart, data.getWidth(), data.getHeight(), chartRenderingInfo);
            else if (data.getOutput().equalsIgnoreCase("jpeg"))
                ChartUtilities.writeChartAsJPEG(out, chart, data.getWidth(), data.getHeight(), chartRenderingInfo);

            renderImageMapSupport(context, uichart, chartRenderingInfo);

            writer.write(ChartUtilities.getImageMap(uichart.getGenerateMap(), chartRenderingInfo,
                    new StandardToolTipTagFragmentGenerator(), new URLTagFragmentGenerator(uichart.getId())));
        } catch (IOException error) {
            error.printStackTrace();
        }
    }
}

class ToolTipTagFragmentGenerator implements org.jfree.chart.imagemap.ToolTipTagFragmentGenerator {

    public String generateToolTipFragment(String toolTipText) {
        return " title=\"" + toolTipText + "\" alt=\"" + toolTipText + "\"";
    }
}

class URLTagFragmentGenerator implements org.jfree.chart.imagemap.URLTagFragmentGenerator {

    private String chartId = null;

    public URLTagFragmentGenerator(String chartId) {
        this.chartId = chartId;
    }

    public String generateURLFragment(String urlText) {
        return " href=\"#\" onclick=\"chart" + chartId + "Click('" + urlText + "')\"";
    }
}