1 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 ; 27 import javax.servlet.http.HttpServletRequest ; 28 import javax.servlet.http.HttpServletResponse ; 29 import javax.servlet.http.HttpSession ; 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 55 public class ITrackerSeverityReport extends AbstractITrackerJasperReport { 56 57 public ITrackerSeverityReport() { 58 } 59 60 65 public void initializeReport(IssueModel[] issues, ReportModel report, Locale locale, String reportOutput, HttpSession 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 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 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.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 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 JRDesignParameter parameter = new JRDesignParameter(); 169 parameter.setName("ReportTitle"); 170 parameter.setValueClass(java.lang.String .class); 171 jasperDesign.addParameter(parameter); 172 parameter = new JRDesignParameter(); 173 parameter.setName("severityOpenChart"); 174 parameter.setValueClass(java.awt.Image .class); 175 jasperDesign.addParameter(parameter); 176 parameter = new JRDesignParameter(); 177 parameter.setName("severityResolvedChart"); 178 parameter.setValueClass(java.awt.Image .class); 179 jasperDesign.addParameter(parameter); 180 181 JRDesignField field = new JRDesignField(); 183 field.setName("projectname"); 184 field.setValueClass(java.lang.String .class); 185 jasperDesign.addField(field); 186 field = new JRDesignField(); 187 field.setName("severityopen"); 188 field.setValueClass(java.lang.Object .class); 189 jasperDesign.addField(field); 190 field = new JRDesignField(); 191 field.setName("severityresolved"); 192 field.setValueClass(java.lang.Object .class); 193 jasperDesign.addField(field); 194 field = new JRDesignField(); 195 field.setName("totalopen"); 196 field.setValueClass(java.lang.Integer .class); 197 jasperDesign.addField(field); 198 field = new JRDesignField(); 199 field.setName("totalresolved"); 200 field.setValueClass(java.lang.Integer .class); 201 jasperDesign.addField(field); 202 203 JRDesignGroup group = new JRDesignGroup(); 205 group.setName("ProjectGroup"); 206 group.setMinHeightToStartNewPage(60); 207 JRDesignExpression expression = new JRDesignExpression(); 208 expression.setValueClass(java.lang.String .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 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 .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 .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 .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 .class); 240 expression.setText("((Integer[]) $F{severityresolved})[" + i + "]"); 241 variable.setInitialValueExpression(expression); 242 jasperDesign.addVariable(variable); 243 } 244 245 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 .class); 266 expression.setText("$P{ReportTitle}"); 267 textField.setExpression(expression); 268 band.addElement(textField); 269 jasperDesign.setTitle(band); 270 271 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 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 .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 .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 .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 .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 .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 band = new JRDesignBand(); 424 jasperDesign.setColumnFooter(band); 425 426 band = new JRDesignBand(); 428 jasperDesign.setPageFooter(band); 429 430 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 .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 .class); 452 expression.setText("$P{severityResolvedChart}"); 453 imageField.setExpression(expression); 454 band.addElement(imageField); 455 jasperDesign.setSummary(band); 456 } catch(Exception 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 [] severityNames = new String [severities.length]; 466 String [] projectNames = new String [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 ) projectData.getValueAt(i, ProjectTableModel.COLUMN_PROJECTNAME); 471 Integer [] openData = (Integer []) projectData.getValueAt(i, ProjectTableModel.COLUMN_SEVERITYOPEN); 472 Integer [] resolvedData = (Integer []) 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 e) { 519 e.printStackTrace(); 520 } 521 } 522 } 523 | Popular Tags |