KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > cowsultants > itracker > web > reports > predefined > ITrackerSeverityReport


1 /*
2  * This software was designed and created by Jason Carroll.
3  * Copyright (c) 2002, 2003, 2004 Jason Carroll.
4  * The author can be reached at jcarroll@cowsultants.com
5  * ITracker website: http://www.cowsultants.com
6  * ITracker forums: http://www.cowsultants.com/phpBB/index.php
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it only under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  */

18
19 package cowsultants.itracker.web.reports.predefined;
20
21 import java.awt.*;
22 import java.awt.image.*;
23 import java.io.*;
24 import java.net.*;
25 import java.util.*;
26 import javax.servlet.ServletOutputStream JavaDoc;
27 import javax.servlet.http.HttpServletRequest JavaDoc;
28 import javax.servlet.http.HttpServletResponse JavaDoc;
29 import javax.servlet.http.HttpSession JavaDoc;
30
31 import org.apache.struts.action.ActionMapping;
32 import org.apache.struts.util.RequestUtils;
33
34 import dori.jasper.engine.*;
35 import dori.jasper.engine.data.*;
36 import dori.jasper.engine.design.*;
37
38 import org.jfree.chart.*;
39 import org.jfree.chart.axis.*;
40 import org.jfree.chart.plot.*;
41 import org.jfree.chart.renderer.*;
42 import org.jfree.data.*;
43
44 import cowsultants.itracker.web.reports.AbstractITrackerJasperReport;
45 import cowsultants.itracker.web.reports.ProjectTableModel;
46 import cowsultants.itracker.ejb.client.exceptions.*;
47 import cowsultants.itracker.ejb.client.models.*;
48 import cowsultants.itracker.ejb.client.resources.*;
49 import cowsultants.itracker.ejb.client.util.*;
50
51 /**
52   * This class generates the ITracker issue severity report. The class generates
53   * the entire report
54   */

55 public class ITrackerSeverityReport extends AbstractITrackerJasperReport {
56
57     public ITrackerSeverityReport() {
58     }
59
60     /**
61       * Initializes the JasperReport. For this report the entire report is built in java. Then the
62       * charts are built and set in the report. If this report didn't require that it be built in
63       * java, the chart generation could have been done in the augmentReport method.
64       */

65     public void initializeReport(IssueModel[] issues, ReportModel report, Locale locale, String JavaDoc reportOutput, HttpSession JavaDoc session) throws ReportException {
66         storeInputs(issues, report, locale, reportOutput, session);
67
68         if(session == null) {
69             throw new ReportException("Unable to access user session.");
70         }
71
72         JRTableModelDataSource data = null;
73
74         try {
75             NameValuePairModel[] severities = IssueUtilities.getSeverities(locale);
76
77             System.setProperty("jasper.reports.compile.class.path",
78                                session.getServletContext().getRealPath("/WEB-INF/lib/jasperreports-0.5.2.jar") +
79                                    System.getProperty("path.separator") + session.getServletContext().getRealPath("/WEB-INF/classes/"));
80
81             jasperReport = JasperCompileManager.compileReport(getReportDesign(severities));
82             ProjectTableModel projectData = new ProjectTableModel(issues, locale);
83
84             Map parameters = new HashMap();
85             String JavaDoc reportTitle = report.getName();
86             if(report.getNameKey() != null) {
87                 reportTitle = ITrackerResources.getString(report.getNameKey(), locale);
88             }
89             parameters.put("ReportTitle", reportTitle);
90             parameters.put("BaseDir", new File("."));
91             generateCharts(parameters, severities, projectData);
92
93             data = new JRTableModelDataSource(projectData);
94             jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, data);
95         } catch(JRException jre) {
96             Logger.logDebug("Error initializing report.", jre);
97             jasperPrint = null;
98             jasperReport = null;
99             throw new ReportException();
100         }
101     }
102
103     /**
104       * This creates the charts and sets the data for them.
105       */

106     public void augmentReport() throws ReportException {
107     }
108
109     private JasperDesign getReportDesign(NameValuePairModel[] severities) throws ReportException {
110             JasperDesign jasperDesign = new JasperDesign();
111
112         try {
113                 //JasperDesign
114
jasperDesign.setName("IssueSeverityReport");
115                 jasperDesign.setPageWidth(612);
116                 jasperDesign.setPageHeight(792);
117                 jasperDesign.setColumnWidth(515);
118                 jasperDesign.setColumnSpacing(0);
119                 jasperDesign.setLeftMargin(20);
120                 jasperDesign.setRightMargin(20);
121                 jasperDesign.setTopMargin(30);
122                 jasperDesign.setBottomMargin(30);
123
124                 //Fonts
125
JRDesignReportFont normalFont = new JRDesignReportFont();
126                 normalFont.setName("Arial_Normal");
127                 normalFont.setDefault(true);
128                 normalFont.setFontName("Arial");
129                 normalFont.setSize(10);
130                 normalFont.setPdfFontName("Helvetica");
131                 normalFont.setPdfEncoding("Cp1252");
132                 normalFont.setPdfEmbedded(false);
133                 jasperDesign.addFont(normalFont);
134
135                 JRDesignReportFont smallFont = new JRDesignReportFont();
136                 smallFont.setName("Arial_Small");
137                 smallFont.setDefault(true);
138                 smallFont.setFontName("Arial");
139                 smallFont.setSize(8);
140                 smallFont.setPdfFontName("Helvetica");
141                 smallFont.setPdfEncoding("Cp1252");
142                 smallFont.setPdfEmbedded(false);
143                 jasperDesign.addFont(smallFont);
144
145                 JRDesignReportFont boldFont = new JRDesignReportFont();
146                 boldFont.setName("Arial_Bold");
147                 boldFont.setDefault(false);
148                 boldFont.setFontName("Arial");
149                 boldFont.setSize(10);
150                 boldFont.setBold(true);
151                 boldFont.setPdfFontName("Helvetica-Bold");
152                 boldFont.setPdfEncoding("Cp1252");
153                 boldFont.setPdfEmbedded(false);
154                 jasperDesign.addFont(boldFont);
155
156                 JRDesignReportFont italicFont = new JRDesignReportFont();
157                 italicFont.setName("Arial_Italic");
158                 italicFont.setDefault(false);
159                 italicFont.setFontName("Arial");
160                 italicFont.setSize(10);
161                 italicFont.setItalic(true);
162                 italicFont.setPdfFontName("Helvetica-Oblique");
163                 italicFont.setPdfEncoding("Cp1252");
164                 italicFont.setPdfEmbedded(false);
165                 jasperDesign.addFont(italicFont);
166
167                 //Parameters
168
JRDesignParameter parameter = new JRDesignParameter();
169                 parameter.setName("ReportTitle");
170                 parameter.setValueClass(java.lang.String JavaDoc.class);
171                 jasperDesign.addParameter(parameter);
172                 parameter = new JRDesignParameter();
173                 parameter.setName("severityOpenChart");
174                 parameter.setValueClass(java.awt.Image JavaDoc.class);
175                 jasperDesign.addParameter(parameter);
176                 parameter = new JRDesignParameter();
177                 parameter.setName("severityResolvedChart");
178                 parameter.setValueClass(java.awt.Image JavaDoc.class);
179                 jasperDesign.addParameter(parameter);
180
181                 //Fields
182
JRDesignField field = new JRDesignField();
183                 field.setName("projectname");
184                 field.setValueClass(java.lang.String JavaDoc.class);
185                 jasperDesign.addField(field);
186                 field = new JRDesignField();
187                 field.setName("severityopen");
188                 field.setValueClass(java.lang.Object JavaDoc.class);
189                 jasperDesign.addField(field);
190                 field = new JRDesignField();
191                 field.setName("severityresolved");
192                 field.setValueClass(java.lang.Object JavaDoc.class);
193                 jasperDesign.addField(field);
194                 field = new JRDesignField();
195                 field.setName("totalopen");
196                 field.setValueClass(java.lang.Integer JavaDoc.class);
197                 jasperDesign.addField(field);
198                 field = new JRDesignField();
199                 field.setName("totalresolved");
200                 field.setValueClass(java.lang.Integer JavaDoc.class);
201                 jasperDesign.addField(field);
202
203                 //Groups
204
JRDesignGroup group = new JRDesignGroup();
205                 group.setName("ProjectGroup");
206                 group.setMinHeightToStartNewPage(60);
207                 JRDesignExpression expression = new JRDesignExpression();
208                 expression.setValueClass(java.lang.String JavaDoc.class);
209                 expression.setText("$F{projectname}");
210                 group.setExpression(expression);
211
212                 JRDesignBand band = new JRDesignBand();
213                 group.setGroupHeader(band);
214                 band = new JRDesignBand();
215                 group.setGroupFooter(band);
216                 jasperDesign.addGroup(group);
217
218             // Variables
219
JRDesignVariable variable;
220             for(int i = 0; i < severities.length; i++) {
221                     variable = new JRDesignVariable();
222                     variable.setName("severityopen" + i);
223                     variable.setValueClass(java.lang.Integer JavaDoc.class);
224                     variable.setResetType(JRVariable.RESET_TYPE_GROUP);
225                     variable.setResetGroup(group);
226                     variable.setCalculation(JRVariable.CALCULATION_SYSTEM);
227                     expression = new JRDesignExpression();
228                     expression.setValueClass(java.lang.Integer JavaDoc.class);
229                     expression.setText("((Integer[]) $F{severityopen})[" + i + "]");
230                     variable.setInitialValueExpression(expression);
231                     jasperDesign.addVariable(variable);
232                     variable = new JRDesignVariable();
233                     variable.setName("severityresolved" + i);
234                     variable.setValueClass(java.lang.Integer JavaDoc.class);
235                     variable.setResetType(JRVariable.RESET_TYPE_GROUP);
236                     variable.setResetGroup(group);
237                     variable.setCalculation(JRVariable.CALCULATION_SYSTEM);
238                     expression = new JRDesignExpression();
239                     expression.setValueClass(java.lang.Integer JavaDoc.class);
240                     expression.setText("((Integer[]) $F{severityresolved})[" + i + "]");
241                     variable.setInitialValueExpression(expression);
242                     jasperDesign.addVariable(variable);
243             }
244
245                 //Title
246
band = new JRDesignBand();
247                 band.setHeight(50);
248                 JRDesignTextField textField = new JRDesignTextField();
249                 textField.setBlankWhenNull(true);
250                 textField.setX(0);
251                 textField.setY(10);
252                 textField.setWidth(515);
253                 textField.setHeight(30);
254                 textField.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
255                 JRDesignReportFont bigFont = new JRDesignReportFont();
256                 bigFont.setName("Arial_Normal");
257                 bigFont.setDefault(true);
258                 bigFont.setFontName("Arial");
259                 bigFont.setSize(22);
260                 bigFont.setPdfFontName("Helvetica");
261                 bigFont.setPdfEncoding("Cp1252");
262                 bigFont.setPdfEmbedded(false);
263                 textField.setFont(bigFont);
264                 expression = new JRDesignExpression();
265                 expression.setValueClass(java.lang.String JavaDoc.class);
266                 expression.setText("$P{ReportTitle}");
267                 textField.setExpression(expression);
268                 band.addElement(textField);
269                 jasperDesign.setTitle(band);
270
271             // Page Header
272
band = new JRDesignBand();
273                 band.setHeight(40);
274                 JRDesignStaticText staticText = new JRDesignStaticText();
275                 staticText.setX(0);
276                 staticText.setY(20);
277                 staticText.setWidth(100);
278                 staticText.setHeight(15);
279                 staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_LEFT);
280                 staticText.setFont(boldFont);
281                 staticText.setText(ITrackerResources.getString("itracker.web.attr.project", locale));
282                 band.addElement(staticText);
283             for(int i = 0; i < severities.length; i++) {
284                     staticText = new JRDesignStaticText();
285                     staticText.setX(110 + (i * 70));
286                     staticText.setY(2);
287                     staticText.setWidth(70);
288                     staticText.setHeight(15);
289                     staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
290                     staticText.setFont(normalFont);
291                     staticText.setText(severities[i].getName());
292                     band.addElement(staticText);
293                     staticText = new JRDesignStaticText();
294                     staticText.setX(110 + (i * 70));
295                     staticText.setY(25);
296                     staticText.setWidth(35);
297                     staticText.setHeight(11);
298                     staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
299                     staticText.setFont(smallFont);
300                     staticText.setText(ITrackerResources.getString("itracker.web.attr.open", locale));
301                     band.addElement(staticText);
302                     staticText = new JRDesignStaticText();
303                     staticText.setX(110 + (i * 70) + 35);
304                     staticText.setY(25);
305                     staticText.setWidth(35);
306                     staticText.setHeight(11);
307                     staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
308                     staticText.setFont(smallFont);
309                     staticText.setText(ITrackerResources.getString("itracker.web.attr.resolved", locale));
310                     band.addElement(staticText);
311             }
312                 staticText = new JRDesignStaticText();
313                 staticText.setX(110 + (severities.length * 70));
314                 staticText.setY(2);
315                 staticText.setWidth(70);
316                 staticText.setHeight(15);
317                 staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
318                 staticText.setFont(normalFont);
319                 staticText.setText(ITrackerResources.getString("itracker.web.attr.total", locale));
320                 band.addElement(staticText);
321                 staticText = new JRDesignStaticText();
322                 staticText.setX(110 + (severities.length * 70));
323                 staticText.setY(25);
324                 staticText.setWidth(35);
325                 staticText.setHeight(11);
326                 staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
327                 staticText.setFont(smallFont);
328                 staticText.setText(ITrackerResources.getString("itracker.web.attr.open", locale));
329                 band.addElement(staticText);
330                 staticText = new JRDesignStaticText();
331                 staticText.setX(110 + (severities.length * 70) + 35);
332                 staticText.setY(25);
333                 staticText.setWidth(35);
334                 staticText.setHeight(11);
335                 staticText.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
336                 staticText.setFont(smallFont);
337                 staticText.setText(ITrackerResources.getString("itracker.web.attr.resolved", locale));
338                 band.addElement(staticText);
339                 JRDesignLine line = new JRDesignLine();
340                 line.setX(0);
341                 line.setY(39);
342                 line.setWidth(515);
343                 line.setHeight(0);
344                 band.addElement(line);
345             jasperDesign.setPageHeader(band);
346
347                 //Detail
348
band = new JRDesignBand();
349                 band.setHeight(20);
350                 textField = new JRDesignTextField();
351                 textField.setX(0);
352                 textField.setY(4);
353                 textField.setWidth(100);
354                 textField.setHeight(15);
355                 textField.setTextAlignment(JRTextElement.TEXT_ALIGN_LEFT);
356                 textField.setFont(normalFont);
357                 expression = new JRDesignExpression();
358                 expression.setValueClass(java.lang.String JavaDoc.class);
359                 expression.setText("$F{projectname}");
360                 textField.setExpression(expression);
361                 band.addElement(textField);
362             for(int i = 0; i < severities.length; i++) {
363                     textField = new JRDesignTextField();
364                     textField.setX(110 + (i * 70));
365                     textField.setY(4);
366                     textField.setWidth(35);
367                     textField.setHeight(15);
368                     textField.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
369                     textField.setFont(normalFont);
370                     expression = new JRDesignExpression();
371                     expression.setValueClass(java.lang.Integer JavaDoc.class);
372                     expression.setText("$V{severityopen" + i + "}");
373                     textField.setExpression(expression);
374                     band.addElement(textField);
375                     textField = new JRDesignTextField();
376                     textField.setX(110 + (i * 70) + 35);
377                     textField.setY(4);
378                     textField.setWidth(35);
379                     textField.setHeight(15);
380                     textField.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
381                     textField.setFont(normalFont);
382                     expression = new JRDesignExpression();
383                     expression.setValueClass(java.lang.Integer JavaDoc.class);
384                     expression.setText("$V{severityresolved" + i + "}");
385                     textField.setExpression(expression);
386                     band.addElement(textField);
387             }
388                 textField = new JRDesignTextField();
389                 textField.setX(110 + (severities.length * 70));
390                 textField.setY(4);
391                 textField.setWidth(35);
392                 textField.setHeight(15);
393                 textField.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
394                 textField.setFont(normalFont);
395                 expression = new JRDesignExpression();
396                 expression.setValueClass(java.lang.Integer JavaDoc.class);
397                 expression.setText("$F{totalopen}");
398                 textField.setExpression(expression);
399                 band.addElement(textField);
400                 textField = new JRDesignTextField();
401                 textField.setX(110 + (severities.length * 70) + 35);
402                 textField.setY(4);
403                 textField.setWidth(35);
404                 textField.setHeight(15);
405                 textField.setTextAlignment(JRTextElement.TEXT_ALIGN_CENTER);
406                 textField.setFont(normalFont);
407                 expression = new JRDesignExpression();
408                 expression.setValueClass(java.lang.Integer JavaDoc.class);
409                 expression.setText("$F{totalresolved}");
410                 textField.setExpression(expression);
411                 band.addElement(textField);
412                 line = new JRDesignLine();
413                 line.setX(0);
414                 line.setY(19);
415                 line.setWidth(515);
416                 line.setHeight(0);
417                 line.setForecolor(new Color(0x80, 0x80, 0x80));
418                 line.setPositionType(JRElement.POSITION_TYPE_FLOAT);
419                 band.addElement(line);
420                 jasperDesign.setDetail(band);
421
422                 //Column footer
423
band = new JRDesignBand();
424                 jasperDesign.setColumnFooter(band);
425
426                 //Page footer
427
band = new JRDesignBand();
428                 jasperDesign.setPageFooter(band);
429
430                 //Summary
431
band = new JRDesignBand();
432                 band.setHeight(270);
433             JRDesignImage imageField = new JRDesignImage();
434                 imageField.setX(0);
435                 imageField.setY(0);
436                 imageField.setWidth(280);
437                 imageField.setHeight(250);
438             imageField.setScaleImage(JRDesignImage.SCALE_IMAGE_CLIP);
439                 expression = new JRDesignExpression();
440                 expression.setValueClass(java.awt.Image JavaDoc.class);
441                 expression.setText("$P{severityOpenChart}");
442                 imageField.setExpression(expression);
443                 band.addElement(imageField);
444             imageField = new JRDesignImage();
445                 imageField.setX(291);
446                 imageField.setY(0);
447                 imageField.setWidth(280);
448                 imageField.setHeight(250);
449             imageField.setScaleImage(JRDesignImage.SCALE_IMAGE_CLIP);
450                 expression = new JRDesignExpression();
451                 expression.setValueClass(java.awt.Image JavaDoc.class);
452                 expression.setText("$P{severityResolvedChart}");
453                 imageField.setExpression(expression);
454                 band.addElement(imageField);
455                 jasperDesign.setSummary(band);
456         } catch(Exception JavaDoc e) {
457             Logger.logDebug("Error generating severity report design.", e);
458             throw new ReportException("Error generating report: " + e.getMessage());
459         }
460             return jasperDesign;
461     }
462
463     private void generateCharts(Map parameters, NameValuePairModel[] severities, ProjectTableModel projectData) {
464         try {
465             String JavaDoc[] severityNames = new String JavaDoc[severities.length];
466             String JavaDoc[] projectNames = new String JavaDoc[projectData.getRowCount()];
467             double[][] chartDataOpen = new double[projectData.getRowCount()][0];
468             double[][] chartDataResolved = new double[projectData.getRowCount()][0];
469             for(int i = 0; i < projectNames.length; i++) {
470                 projectNames[i] = (String JavaDoc) projectData.getValueAt(i, ProjectTableModel.COLUMN_PROJECTNAME);
471                 Integer JavaDoc[] openData = (Integer JavaDoc[]) projectData.getValueAt(i, ProjectTableModel.COLUMN_SEVERITYOPEN);
472                 Integer JavaDoc[] resolvedData = (Integer JavaDoc[]) projectData.getValueAt(i, ProjectTableModel.COLUMN_SEVERITYRESOLVED);
473                 chartDataOpen[i] = new double[openData.length];
474                 for(int j = 0; j < openData.length; j++) {
475                     Logger.logDebug("Open i = " + i + " j = " + j);
476                     chartDataOpen[i][j] = openData[j].intValue();
477                 }
478                 chartDataResolved[i] = new double[resolvedData.length];
479                 for(int j = 0; j < resolvedData.length; j++) {
480                     Logger.logDebug("Res i = " + i + " j = " + j);
481                     chartDataResolved[i][j] = resolvedData[j].intValue();
482                 }
483             }
484             for(int i = 0; i < severities.length; i++) {
485                 severityNames[i] = severities[i].getName();
486             }
487
488             if(chartDataOpen != null) {
489                 CategoryDataset categoryData = DatasetUtilities.createCategoryDataset(projectNames, severityNames, chartDataOpen);
490                 JFreeChart chart = ChartFactory.createBarChart3D(ITrackerResources.getString("itracker.report.issueseverity.openchart.title", locale),
491                                                                          ITrackerResources.getString("itracker.web.attr.severity", locale),
492                                                                          ITrackerResources.getString("itracker.web.attr.number", locale),
493                                                                          categoryData, PlotOrientation.VERTICAL, true, false, false);
494                 chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 1000, 0, Color.white));
495                 CategoryPlot plot = chart.getCategoryPlot();
496
497                 NumberAxis vAxis = (NumberAxis) plot.getRangeAxis();
498                 vAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
499
500                     BufferedImage bufferedImage = chart.createBufferedImage(280, 250);
501                 parameters.put("severityOpenChart", bufferedImage);
502             }
503             if(chartDataResolved != null) {
504                 CategoryDataset categoryData = DatasetUtilities.createCategoryDataset(projectNames, severityNames, chartDataResolved);
505                 JFreeChart chart = ChartFactory.createBarChart3D(ITrackerResources.getString("itracker.report.issueseverity.resolvedchart.title", locale),
506                                                                          ITrackerResources.getString("itracker.web.attr.severity", locale),
507                                                                          ITrackerResources.getString("itracker.web.attr.number", locale),
508                                                                          categoryData, PlotOrientation.VERTICAL, true, false, false);
509                 chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 1000, 0, Color.white));
510                 CategoryPlot plot = chart.getCategoryPlot();
511
512                 NumberAxis vAxis = (NumberAxis) plot.getRangeAxis();
513                 vAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
514
515                     BufferedImage bufferedImage = chart.createBufferedImage(280, 250);
516                 parameters.put("severityResolvedChart", bufferedImage);
517             }
518         } catch(Exception JavaDoc e) {
519             e.printStackTrace();
520         }
521     }
522 }
523
Popular Tags