Index: lams_common/src/java/org/lamsfoundation/lams/util/ChartUtil.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/util/ChartUtil.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/util/ChartUtil.java (revision 8ac899b7d4b4fb15385b284920c66a40bf30c086) @@ -0,0 +1,111 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ +/* $$Id$$ */ +package org.lamsfoundation.lams.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartUtilities; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.category.DefaultCategoryDataset; +import org.jfree.data.general.DefaultPieDataset; + + +/** + * Utility classes for JFreeChart. Ensures all our charts are of a consistent size. Depending on the size of the legend, the chart will be + * either 400x400 or 750x550. + */ +public class ChartUtil +{ + static Logger log = Logger.getLogger(ChartUtil.class); + + private static final Integer SMALL_WIDTH = new Integer(400); + private static final Integer SMALL_HEIGHT = new Integer(400); + private static final Integer LARGE_WIDTH = new Integer(750); + private static final Integer LARGE_HEIGHT = new Integer(550); + + public static final String CHART_TYPE_PIE = "pie"; + public static final String CHART_TYPE_BAR = "bar"; + + public static void outputPieChart(HttpServletResponse response, OutputStream out, String title, DefaultPieDataset data) throws IOException + { + boolean useSmall = determineSize(data.getKeys()); + + JFreeChart chart=null; + chart=ChartFactory.createPieChart3D(title , data, true, true, false); + + if ( chart != null ) { + response.setContentType("image/png"); + if ( useSmall ) + ChartUtilities.writeChartAsPNG(out, chart, SMALL_WIDTH, SMALL_HEIGHT); + else + ChartUtilities.writeChartAsPNG(out, chart, LARGE_WIDTH, LARGE_HEIGHT); + } else { + log.error("Unable to output chart. No chart returned by JFreeChart. Data "+data); + } + } + + public static void outputBarChart( HttpServletResponse response, OutputStream out, String title, DefaultCategoryDataset data, + String categoryAxisLabel, String valueAxisLabel ) throws IOException + { + boolean useSmall = determineSize(data.getColumnKeys()); + + JFreeChart chart=ChartFactory.createBarChart3D(title , categoryAxisLabel, valueAxisLabel, + data, PlotOrientation.VERTICAL, true, true, false); + + if ( chart != null ) { + response.setContentType("image/png"); + if ( useSmall ) + ChartUtilities.writeChartAsPNG(out, chart, SMALL_WIDTH, SMALL_HEIGHT); + else + ChartUtilities.writeChartAsPNG(out, chart, LARGE_WIDTH, LARGE_HEIGHT); + } else { + log.error("Unable to output chart. No chart returned by JFreeChart. Data "+data); + } + } + + private static boolean determineSize(Collection legendEntries) { + int numLines = 0; + int numInCurrentLine = 0; + Iterator iter = legendEntries.iterator(); + while (iter.hasNext()) { + Object object = (Object) iter.next(); + int textLength = object.toString().length(); + numInCurrentLine = numInCurrentLine + textLength + 3; + if ( numInCurrentLine > 50) { + numInCurrentLine = textLength; + numLines++; + } + } + return numLines < 4; + } + +} Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/ChartAction.java =================================================================== diff -u -rde91e6d736e56d514d840e128bd06c9238b5871b -r8ac899b7d4b4fb15385b284920c66a40bf30c086 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/ChartAction.java (.../ChartAction.java) (revision de91e6d736e56d514d840e128bd06c9238b5871b) +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/web/action/ChartAction.java (.../ChartAction.java) (revision 8ac899b7d4b4fb15385b284920c66a40bf30c086) @@ -59,6 +59,7 @@ import org.lamsfoundation.lams.tool.survey.model.SurveyOption; import org.lamsfoundation.lams.tool.survey.model.SurveyQuestion; import org.lamsfoundation.lams.tool.survey.service.ISurveyService; +import org.lamsfoundation.lams.util.ChartUtil; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.web.context.WebApplicationContext; @@ -72,7 +73,7 @@ */ public class ChartAction extends Action { - static Logger logger = Logger.getLogger(ChartAction.class.getName()); + static Logger logger = Logger.getLogger(ChartAction.class); private MessageResources resource; public ActionForward execute(ActionMapping mapping, ActionForm form, @@ -95,27 +96,25 @@ } //Try to create chart - JFreeChart chart=null; - if (type.equals("pie")){ - chart = createPieChart (answer); - }else if (type.equals("bar")){ - chart = createBarChart (answer); - } - - //send chart to response output stream - if (chart != null){ - response.setContentType("image/png"); - ChartUtilities.writeChartAsPNG(out, chart, 400, 300); - return null; - }else{ + try { + if (type.equals(ChartUtil.CHART_TYPE_PIE)){ + DefaultPieDataset data = createPieDataset (answer); + ChartUtil.outputPieChart(response, out, resource.getMessage(MSG_PIECHART_TITLE,answer.getSequenceId()), data); + }else if (type.equals(ChartUtil.CHART_TYPE_BAR)){ + DefaultCategoryDataset data = createBarDataset(answer); + ChartUtil.outputBarChart( response, out, resource.getMessage(MSG_BARCHART_TITLE,answer.getSequenceId()), data, + resource.getMessage(MSG_BARCHART_CATEGORY_AXIS_LABEL), resource.getMessage(MSG_BARCHART_VALUE_AXIS_LABEL) ); + } + } catch ( IOException e ) { + logger.error("Error creating chart for sessionId "+sessionId,e); response.getWriter().print(resource.getMessage(ERROR_MSG_CHART_ERROR)); - return null; - } - + } + + return null; } - public JFreeChart createPieChart(AnswerDTO answer){ + public DefaultPieDataset createPieDataset(AnswerDTO answer){ DefaultPieDataset data= new DefaultPieDataset(); @@ -126,17 +125,13 @@ optIdx++; } - if(answer.isAppendText()) + if(answer.isAppendText()) data.setValue(resource.getMessage(MSG_OPEN_RESPONSE), (Number)answer.getOpenResponse()); - - JFreeChart chart=null; - chart=ChartFactory.createPieChart3D(resource.getMessage(MSG_PIECHART_TITLE,answer.getSequenceId()) , data, true, true, false); - - return chart; + return data; } - public JFreeChart createBarChart(AnswerDTO answer){ + public DefaultCategoryDataset createBarDataset(AnswerDTO answer){ DefaultCategoryDataset data= new DefaultCategoryDataset(); @@ -150,14 +145,7 @@ if(answer.isAppendText()) data.setValue((Number)answer.getOpenResponse(), resource.getMessage(MSG_OPEN_RESPONSE), resource.getMessage(MSG_OPEN_RESPONSE)); - JFreeChart chart=null; - - - chart=ChartFactory.createBarChart3D(resource.getMessage(MSG_BARCHART_TITLE,answer.getSequenceId()), - resource.getMessage(MSG_BARCHART_CATEGORY_AXIS_LABEL), - resource.getMessage(MSG_BARCHART_VALUE_AXIS_LABEL), - data, PlotOrientation.VERTICAL, true, true, false); - return chart; + return data; } //************************************************************************************* // Private method Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/ExportServlet.java =================================================================== diff -u -re7046600ee8bfa53d053e0aee33a16b52ad0e8e2 -r8ac899b7d4b4fb15385b284920c66a40bf30c086 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/ExportServlet.java (.../ExportServlet.java) (revision e7046600ee8bfa53d053e0aee33a16b52ad0e8e2) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/ExportServlet.java (.../ExportServlet.java) (revision 8ac899b7d4b4fb15385b284920c66a40bf30c086) @@ -36,8 +36,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.jfree.chart.ChartUtilities; -import org.jfree.chart.JFreeChart; import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.vote.ExportPortfolioDTO; import org.lamsfoundation.lams.tool.vote.VoteAppConstants; @@ -48,6 +46,7 @@ import org.lamsfoundation.lams.tool.vote.pojos.VoteSession; import org.lamsfoundation.lams.tool.vote.service.IVoteService; import org.lamsfoundation.lams.tool.vote.service.VoteServiceProxy; +import org.lamsfoundation.lams.util.ChartUtil; import org.lamsfoundation.lams.web.servlet.AbstractExportPortfolioServlet; /** *
Enables exporting portfolio for teacher and learner modes.
@@ -76,8 +75,8 @@ if ( generateCharts ) { logger.debug("writing out chart to directoryName: " + directoryName); - writeOutChart(request, response, VoteChartGenerator.CHART_TYPE_PIE, directoryName); - writeOutChart(request, response, VoteChartGenerator.CHART_TYPE_BAR, directoryName); + writeOutChart(request, response, ChartUtil.CHART_TYPE_PIE, directoryName); + writeOutChart(request, response, ChartUtil.CHART_TYPE_BAR, directoryName); logger.debug("basePath: " + basePath); } @@ -246,11 +245,7 @@ try{ OutputStream out = new FileOutputStream(directoryName + File.separator + fileName); VoteChartGenerator voteChartGenerator= new VoteChartGenerator(); - JFreeChart chart = voteChartGenerator.createChart(request, chartType); - if ( chart != null ) { - response.setContentType("image/png"); - ChartUtilities.writeChartAsPNG(out, chart, 400, 300); - } + voteChartGenerator.outputChart(request, response, chartType, out); } catch(FileNotFoundException e) { Index: lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/VoteChartGenerator.java =================================================================== diff -u -r040ca18cc1cfa0972682b6572502802d7a4ad54b -r8ac899b7d4b4fb15385b284920c66a40bf30c086 --- lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/VoteChartGenerator.java (.../VoteChartGenerator.java) (revision 040ca18cc1cfa0972682b6572502802d7a4ad54b) +++ lams_tool_vote/src/java/org/lamsfoundation/lams/tool/vote/web/VoteChartGenerator.java (.../VoteChartGenerator.java) (revision 8ac899b7d4b4fb15385b284920c66a40bf30c086) @@ -24,8 +24,10 @@ import java.io.IOException; import java.io.OutputStream; +import java.util.Collection; import java.util.Iterator; import java.util.Map; +import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -45,6 +47,7 @@ import org.lamsfoundation.lams.tool.vote.pojos.VoteSession; import org.lamsfoundation.lams.tool.vote.service.IVoteService; import org.lamsfoundation.lams.tool.vote.service.VoteServiceProxy; +import org.lamsfoundation.lams.util.ChartUtil; /** *Enables generation of JFreeCharts
@@ -54,8 +57,6 @@ */ public class VoteChartGenerator extends HttpServlet implements VoteAppConstants { static Logger logger = Logger.getLogger(VoteChartGenerator.class.getName()); - public static final String CHART_TYPE_PIE = "pie"; - public static final String CHART_TYPE_BAR = "bar"; public VoteChartGenerator(){ } @@ -74,47 +75,35 @@ String currentSessionId=request.getParameter("currentSessionId"); logger.debug("currentSessionId: " + currentSessionId); - logger.debug("getServletContext() is : " + getServletContext()); if (currentSessionId != null) { logger.debug("currentSessionId is specified, generating data for all sessions dto: "); - IVoteService voteService = VoteServiceProxy.getVoteService(getServletContext()); - logger.debug("voteService: " + voteService); VoteSession voteSession=voteService.retrieveVoteSession(new Long(currentSessionId)); logger.debug("voteSession uid:" + voteSession.getUid()); VoteContent voteContent=voteSession.getVoteContent(); - logger.debug("existing voteContent:" + voteContent); VoteGeneralMonitoringDTO voteGeneralMonitoringDTO=new VoteGeneralMonitoringDTO(); MonitoringUtil.prepareChartData(request, voteService, null, voteContent.getVoteContentId().toString(), voteSession.getUid().toString(), null, voteGeneralMonitoringDTO); - logger.debug("creating maps MAP_STANDARD_NOMINATIONS_CONTENT and MAP_STANDARD_RATES_CONTENT: " + currentSessionId); - - logger.debug("post prepareChartData : MAP_STANDARD_NOMINATIONS_CONTENT: " + request.getSession().getAttribute(MAP_STANDARD_NOMINATIONS_CONTENT)); - logger.debug("post prepareChartData : MAP_STANDARD_RATES_CONTENT: " + request.getSession().getAttribute(MAP_STANDARD_RATES_CONTENT)); + + if ( logger.isDebugEnabled() ) { + logger.debug("creating maps MAP_STANDARD_NOMINATIONS_CONTENT and MAP_STANDARD_RATES_CONTENT: " + currentSessionId); + logger.debug("post prepareChartData : MAP_STANDARD_NOMINATIONS_CONTENT: " + request.getSession().getAttribute(MAP_STANDARD_NOMINATIONS_CONTENT)); + logger.debug("post prepareChartData : MAP_STANDARD_RATES_CONTENT: " + request.getSession().getAttribute(MAP_STANDARD_RATES_CONTENT)); + } } - - JFreeChart chart=null; - logger.debug("creating pie chart" + type); - chart=createChart(request, type); - - logger.debug("chart:" + chart); - if (chart != null) - { - response.setContentType("image/png"); - ChartUtilities.writeChartAsPNG(out, chart, 400, 300); - } + outputChart(request, response, type, out); } catch(Exception e) { - logger.error("error occurred generating chart: " + e); + logger.error("Error occurred generating chart",e); } finally { @@ -123,19 +112,21 @@ } - public JFreeChart createChart(HttpServletRequest request, String type) + public void outputChart(HttpServletRequest request, HttpServletResponse response, String type, OutputStream out) throws IOException { - if (type.equals(CHART_TYPE_PIE)) + if (type.equals(ChartUtil.CHART_TYPE_PIE)) { - return createPieChart (request); + DefaultPieDataset dataset = createPieDataset(request); + ChartUtil.outputPieChart (response, out, SESSION_VOTES_CHART, dataset); } else { - return createBarChart (request); + DefaultCategoryDataset dataset = createCategoryDataset(request); + ChartUtil.outputBarChart (response, out, SESSION_VOTES_CHART, dataset, "Open Vote", "Percentage"); } } - public JFreeChart createPieChart(HttpServletRequest request) + public DefaultPieDataset createPieDataset(HttpServletRequest request) throws IOException { logger.debug("starting createPieChart..."); DefaultPieDataset data= new DefaultPieDataset(); @@ -144,7 +135,6 @@ Map mapVoteRatesContent=(Map)request.getSession().getAttribute(MAP_STANDARD_RATES_CONTENT); if ( mapNominationsContent == null || mapNominationsContent == null ) { logger.debug("No voting data, unable to create pie chart"); - return null; } Iterator itMap = mapNominationsContent.entrySet().iterator(); @@ -154,18 +144,11 @@ String voteRate=(String) mapVoteRatesContent.get(pairs.getKey()); data.setValue(pairs.getValue().toString(), new Double(voteRate)); } - - JFreeChart chart=null; - chart=ChartFactory.createPieChart3D(SESSION_VOTES_CHART , data, true, true, false); - - if ( logger.isDebugEnabled() ) { - logger.debug("chart: " + chart+" data: "+data) ; - } - - return chart; + return data; } - public JFreeChart createBarChart(HttpServletRequest request) + + public DefaultCategoryDataset createCategoryDataset(HttpServletRequest request) { logger.debug("starting createBarChart..."); DefaultCategoryDataset data= new DefaultCategoryDataset(); @@ -174,7 +157,6 @@ Map mapVoteRatesContent=(Map)request.getSession().getAttribute(MAP_STANDARD_RATES_CONTENT); if ( mapNominationsContent == null || mapNominationsContent == null ) { logger.debug("No voting data, unable to create pie chart"); - return null; } Iterator itMap = mapNominationsContent.entrySet().iterator(); @@ -184,16 +166,9 @@ String voteRate=(String) mapVoteRatesContent.get(pairs.getKey()); data.setValue(new Double(voteRate), pairs.getValue().toString(), pairs.getValue().toString()); } - - JFreeChart chart=null; - chart=ChartFactory.createBarChart3D(SESSION_VOTES_CHART , "Open Vote", "Percentage", - data, PlotOrientation.VERTICAL, true, true, false); - if ( logger.isDebugEnabled() ) { - logger.debug("chart: " + chart+" data: "+data) ; - } - - return chart; + return data; } + }