/* * 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 + "')\""; } }