/*
* 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;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletResponse;
import net.sf.jsfcomp.chartcreator.model.ChartData;
import net.sf.jsfcomp.chartcreator.utils.ChartUtils;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
/**
* @author Cagatay Civici (latest modification by $Author: cagatay_civici $)
* @version $Revision: 745 $ $Date: 2007-05-08 10:16:19 +0300 (Tue, 08 May 2007) $
*
* PhaseListener generating the chart image
*/
public class ChartListener implements PhaseListener {
/**
* The serialization id.
*/
private static final long serialVersionUID = -5471196494131856482L;
public void afterPhase(PhaseEvent phaseEvent) {
String chartId = (String)phaseEvent.getFacesContext().getExternalContext().getRequestParameterMap().get("chartId");
if (chartId != null) {
handleChartRequest(phaseEvent, chartId);
}
}
private void handleChartRequest(PhaseEvent phaseEvent, String id) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
Map sessionMap = externalContext.getSessionMap();
ChartData chartData = (ChartData) sessionMap.get(id);
JFreeChart chart = ChartUtils.createChartWithType(chartData);
ChartUtils.setGeneralChartProperties(chart, chartData);
try {
if(externalContext.getResponse() instanceof HttpServletResponse)
writeChartWithServletResponse((HttpServletResponse)externalContext.getResponse(),chart, chartData);
else if(externalContext.getResponse() instanceof RenderResponse)
writeChartWithPortletResponse((RenderResponse)externalContext.getResponse(), chart, chartData);
} catch (Exception e) {
e.printStackTrace();
} finally {
emptySession(sessionMap, id);
facesContext.responseComplete();
}
}
public void beforePhase(PhaseEvent phaseEvent) {
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
private void writeChartWithServletResponse(HttpServletResponse response, JFreeChart chart, ChartData chartData) throws IOException{
OutputStream stream = response.getOutputStream();
response.setContentType(ChartUtils.resolveContentType(chartData.getOutput()));
writeChart(stream, chart, chartData);
}
private void writeChartWithPortletResponse(RenderResponse response, JFreeChart chart, ChartData chartData) throws IOException{
OutputStream stream = response.getPortletOutputStream();
response.setContentType(ChartUtils.resolveContentType(chartData.getOutput()));
writeChart(stream, chart, chartData);
}
private void writeChart(OutputStream stream, JFreeChart chart, ChartData chartData) throws IOException{
if(chartData.getOutput().equalsIgnoreCase("png"))
ChartUtilities.writeChartAsPNG(stream, chart, chartData.getWidth(), chartData.getHeight());
else if (chartData.getOutput().equalsIgnoreCase("jpeg"))
ChartUtilities.writeChartAsJPEG(stream, chart, chartData.getWidth(), chartData.getHeight());
stream.flush();
stream.close();
}
private void emptySession(Map sessionMap, String id) {
sessionMap.remove(id);
}
}