1 19 20 package org.efs.openreports.providers.impl; 21 22 import java.math.BigDecimal ; 23 import java.sql.*; 24 import java.util.*; 25 26 import com.opensymphony.xwork.ActionContext; 27 import com.opensymphony.xwork.interceptor.component.ComponentManager; 28 29 import org.apache.log4j.Logger; 30 import org.efs.openreports.objects.*; 31 import org.efs.openreports.providers.*; 32 import org.efs.openreports.providers.persistence.ParameterPersistenceProvider; 33 import org.efs.openreports.util.*; 34 35 import net.sf.jasperreports.engine.design.JRDesignQuery; 36 import net.sf.jasperreports.engine.util.JRQueryExecuter; 37 38 public class ParameterProviderImpl 39 implements ParameterProvider, DataSourceProviderAware, DateProviderAware 40 { 41 protected static Logger log = 42 Logger.getLogger(ParameterProviderImpl.class.getName()); 43 44 private ParameterPersistenceProvider paramPersistenceProvider; 45 46 private DataSourceProvider dataSourceProvider; 47 private DateProvider dateProvider; 48 49 public ParameterProviderImpl(DataSourceProvider dataSourceProvider, DateProvider dateProvider) throws ProviderException 51 { 52 this.dataSourceProvider = dataSourceProvider; 53 this.dateProvider = dateProvider; 54 55 init(); 56 } 57 58 public ParameterProviderImpl() throws ProviderException 60 { 61 ComponentManager container = 62 (ComponentManager) ActionContext.getContext().get( 63 "com.opensymphony.xwork.interceptor.component.ComponentManager"); 64 65 container.initializeObject(this); 66 67 init(); 68 } 69 70 protected void init() throws ProviderException 71 { 72 paramPersistenceProvider = new ParameterPersistenceProvider(); 73 log.info("Created"); 74 } 75 76 public ReportParameterValue[] getParamValues( 77 ReportParameter reportParameter, 78 Map parameters) 79 throws ProviderException 80 { 81 if (reportParameter.getType().equals(ReportParameter.QUERY_PARAM)) 82 { 83 return getParamValuesFromDataSource(reportParameter, parameters); 84 } 85 else if (reportParameter.getType().equals(ReportParameter.LIST_PARAM)) 86 { 87 return parseListValues(reportParameter); 88 } 89 else if (reportParameter.getType().equals(ReportParameter.BOOLEAN_PARAM)) 90 { 91 if (reportParameter.getData().indexOf("|") == -1) 93 { 94 reportParameter.setData("true:Yes|false:No"); 95 } 96 97 return parseListValues(reportParameter); 98 } 99 100 throw new ProviderException( 101 reportParameter.getName() 102 + ": param-type " 103 + reportParameter.getType() 104 + " not supported!"); 105 } 106 107 protected ReportParameterValue[] parseListValues(ReportParameter reportParameter) 108 throws ProviderException 109 { 110 StringTokenizer st = 111 new StringTokenizer(reportParameter.getData(), "|"); 112 113 ReportParameterValue[] values = 114 new ReportParameterValue[st.countTokens()]; 115 116 int index = 0; 117 while (st.hasMoreTokens()) 118 { 119 String token = st.nextToken(); 120 String id = token; 121 String description = token; 122 123 StringTokenizer paramValue = new StringTokenizer(token,":"); 124 if (paramValue.countTokens() == 2) 125 { 126 id = paramValue.nextToken(); 127 description = paramValue.nextToken(); 128 } 129 130 try 131 { 132 if (reportParameter.getClassName().equals("java.lang.Integer")) 133 { 134 values[index] = 135 new ReportParameterValue(Integer.valueOf(id), description); 136 } 137 else if ( 138 reportParameter.getClassName().equals("java.lang.Double")) 139 { 140 values[index] = 141 new ReportParameterValue(Double.valueOf(id), description); 142 } 143 else if ( 144 reportParameter.getClassName().equals("java.lang.Long")) 145 { 146 values[index] = 147 new ReportParameterValue(Long.valueOf(id), description); 148 } 149 else if ( 150 reportParameter.getClassName().equals( 151 "java.math.BigDecimal")) 152 { 153 values[index] = 154 new ReportParameterValue(new BigDecimal (id), description); 155 } 156 else 157 { 158 values[index] = new ReportParameterValue(id, description); 159 } 160 } 161 catch (Exception e) 162 { 163 throw new ProviderException( 164 reportParameter.getData() 165 + " contains invalid " 166 + reportParameter.getClassName()); 167 } 168 169 index++; 170 } 171 172 return values; 173 } 174 175 protected ReportParameterValue[] getParamValuesFromDataSource( 176 ReportParameter param, 177 Map parameters) 178 throws ProviderException 179 { 180 Connection conn = null; 181 PreparedStatement pStmt = null; 182 ResultSet rs = null; 183 184 try 185 { 186 ReportDataSource dataSource = param.getDataSource(); 187 conn = dataSourceProvider.getConnection(dataSource.getId()); 188 189 if (parameters == null || parameters.isEmpty()) 190 { 191 pStmt = conn.prepareStatement(param.getData()); 192 } 193 else 194 { 195 198 JRDesignQuery query = new JRDesignQuery(); 199 query.setText(param.getData()); 200 201 Map jrParameters = ORUtil.buildJRDesignParameters(parameters); 204 205 pStmt = 206 JRQueryExecuter.getStatement( 207 query, 208 jrParameters, 209 parameters, 210 conn); 211 } 212 213 rs = pStmt.executeQuery(); 214 215 ResultSetMetaData rsMetaData = rs.getMetaData(); 216 217 boolean multipleColumns = false; 218 if (rsMetaData.getColumnCount() > 1) 219 multipleColumns = true; 220 221 Vector v = new Vector(); 222 223 while (rs.next()) 224 { 225 ReportParameterValue value = new ReportParameterValue(); 226 227 if (param.getClassName().equals("java.lang.String")) 228 { 229 value.setId(rs.getString(1)); 230 } 231 else if (param.getClassName().equals("java.lang.Double")) 232 { 233 value.setId(new Double (rs.getDouble(1))); 234 } 235 else if (param.getClassName().equals("java.lang.Integer")) 236 { 237 value.setId(new Integer (rs.getInt(1))); 238 } 239 else if (param.getClassName().equals("java.lang.Long")) 240 { 241 value.setId(new Long (rs.getLong(1))); 242 } 243 else if (param.getClassName().equals("java.math.BigDecimal")) 244 { 245 value.setId(rs.getBigDecimal(1)); 246 } 247 else if (param.getClassName().equals("java.util.Date")) 248 { 249 value.setId(rs.getDate(1)); 250 } 251 else if (param.getClassName().equals("java.sql.Date")) 252 { 253 value.setId(rs.getDate(1)); 254 } 255 else if (param.getClassName().equals("java.sql.Timestamp")) 256 { 257 value.setId(rs.getTimestamp(1)); 258 } 259 260 if (multipleColumns) 261 { 262 value.setDescription(rs.getString(2)); 263 } 264 265 v.add(value); 266 } 267 268 rs.close(); 269 270 ReportParameterValue[] values = new ReportParameterValue[v.size()]; 271 v.copyInto(values); 272 273 return values; 274 } 275 catch (Exception e) 276 { 277 throw new ProviderException( 278 "Error retreiving param values from database: " 279 + e.getMessage()); 280 } 281 finally 282 { 283 try 284 { 285 if (pStmt != null) 286 pStmt.close(); 287 if (conn != null) 288 conn.close(); 289 } 290 catch (Exception c) 291 { 292 log.error("Error closing"); 293 } 294 } 295 } 296 297 protected void validateParameter(ReportParameter parameter, String value) 298 throws ProviderException 299 { 300 try 301 { 302 if (parameter.getClassName().equals("java.lang.Double")) 303 { 304 new Double (value); 305 } 306 else if (parameter.getClassName().equals("java.lang.Integer")) 307 { 308 new Integer (value); 309 } 310 else if (parameter.getClassName().equals("java.lang.Long")) 311 { 312 new Long (value); 313 } 314 else if (parameter.getClassName().equals("java.math.BigDecimal")) 315 { 316 new BigDecimal (value); 317 } 318 else if ( 319 parameter.getClassName().equals("java.util.Date") 320 || parameter.getClassName().equals("java.sql.Date") 321 || parameter.getClassName().equals("java.sql.Timestamp")) 322 { 323 try 324 { 325 dateProvider.parseDate(value); 326 } 327 catch (Exception e) 328 { 329 throw new ProviderException(e.getMessage()); 330 } 331 } 332 } 333 catch (Exception e) 334 { 335 throw new ProviderException( 336 parameter.getDescription() + " Invalid: " + e.getMessage()); 337 } 338 } 339 340 protected Object parseParameter(ReportParameter parameter, String value) 341 throws ProviderException 342 { 343 try 344 { 345 if (parameter.getClassName().equals("java.lang.String")) 346 { 347 return value; 348 } 349 else if (parameter.getClassName().equals("java.lang.Double")) 350 { 351 return new Double (value); 352 } 353 else if (parameter.getClassName().equals("java.lang.Integer")) 354 { 355 return new Integer (value); 356 } 357 else if (parameter.getClassName().equals("java.lang.Long")) 358 { 359 return new Long (value); 360 } 361 else if (parameter.getClassName().equals("java.math.BigDecimal")) 362 { 363 return new BigDecimal (value); 364 } 365 else if (parameter.getClassName().equals("java.util.Date")) 366 { 367 return dateProvider.parseDate(value); 368 } 369 else if (parameter.getClassName().equals("java.sql.Date")) 370 { 371 return dateProvider.parseDate(value); 372 } 373 else if (parameter.getClassName().equals("java.sql.Timestamp")) 374 { 375 long time = dateProvider.parseDate(value).getTime(); 376 return new Timestamp(time); 377 } 378 else if (parameter.getClassName().equals("java.lang.Boolean")) 379 { 380 return new Boolean (value); 381 } 382 } 383 catch (Exception e) 384 { 385 throw new ProviderException( 386 parameter.getName() + " Invalid: " + e.getMessage()); 387 } 388 389 throw new ProviderException( 390 parameter.getName() + " currently unsupported!"); 391 } 392 393 public List getReportParameters(Report report, String type) 394 throws ProviderException 395 { 396 List parameters = new ArrayList(); 397 398 List allParameters = report.getParameters(); 399 400 if (allParameters != null) 401 { 402 Iterator iterator = allParameters.iterator(); 403 404 while (iterator.hasNext()) 405 { 406 ReportParameterMap rpMap = (ReportParameterMap) iterator.next(); 407 408 if (rpMap.getReportParameter().getType().equals(type)) 409 { 410 parameters.add(rpMap.getReportParameter()); 411 } 412 } 413 } 414 415 return parameters; 416 } 417 418 public void loadReportParameterValues( 419 List reportParameters, 420 Map parameters) 421 throws ProviderException 422 { 423 for (int i = 0; i < reportParameters.size(); i++) 424 { 425 ReportParameterMap rpMap = 426 (ReportParameterMap) reportParameters.get(i); 427 ReportParameter rp = rpMap.getReportParameter(); 428 429 try 430 { 431 if (rp.getType().equals(ReportParameter.LIST_PARAM) 432 || rp.getType().equals(ReportParameter.QUERY_PARAM) 433 || rp.getType().equals(ReportParameter.BOOLEAN_PARAM)) 434 { 435 if (rp.getValues() == null) { 437 log.debug("loading parameter values: " + rp.getName()); 438 rp.setValues(getParamValues(rp, parameters)); 439 } 440 } 441 } 442 catch (Exception e) 443 { 444 log.error("Error loading parameter values: " + rp.getName()); 445 throw new ProviderException( 446 "loadReportParameterValues: " + e.getMessage()); 447 } 448 } 449 } 450 451 public Map getReportParametersMap( 452 List reportParameters, 453 Map origParameters) 454 throws ProviderException 455 { 456 Map map = new HashMap(); 457 458 Map parameters = new SingleValueMap(origParameters); 461 462 Iterator iterator = reportParameters.iterator(); 463 while (iterator.hasNext()) 464 { 465 ReportParameterMap rpMap = (ReportParameterMap) iterator.next(); 466 467 ReportParameter reportParameter = rpMap.getReportParameter(); 468 469 if (reportParameter.isMultipleSelect()) 475 { 476 Object [] values = 477 (String []) origParameters.get(reportParameter.getName()); 478 479 String s = buildMultipleSelectString(reportParameter, values); 481 482 if (rpMap.isRequired() || s.length() > 0) 484 { 485 map.put(reportParameter.getName(), s); 486 487 log.debug( 488 reportParameter.getName() 489 + " => " 490 + map.get(reportParameter.getName())); 491 } 492 } 493 else 494 { 495 String value = 496 (String ) parameters.get(reportParameter.getName()); 497 498 if (value != null) 499 { 500 try 501 { 502 Object object = parseParameter(reportParameter, value); 503 504 if (rpMap.isRequired() || value.length() > 0) 505 { 506 map.put(reportParameter.getName(), object); 507 } 508 } 509 catch (Exception e) 510 { 511 log.warn( 512 "Error setting parameter: " 513 + reportParameter.getName() 514 + " : " 515 + e.getMessage()); 516 } 517 } 518 } 519 } 520 521 523 String value = (String ) parameters.get(ReportChart.DRILLDOWN_PARAMETER); 524 525 if (value != null) map.put(ReportChart.DRILLDOWN_PARAMETER, parameters 526 .get(ReportChart.DRILLDOWN_PARAMETER)); 527 528 530 return map; 531 } 532 533 private String buildMultipleSelectString( 534 ReportParameter reportParameter, 535 Object [] values) 536 { 537 StringBuffer sb = new StringBuffer (); 538 539 if (values[0].equals("")) return ""; 540 541 for (int j = 0; j < values.length; j++) 542 { 543 String value = ""; 544 545 if (values[j] instanceof ReportParameterValue) 546 { 547 value = ((ReportParameterValue) values[j]).getId().toString(); 548 } 549 else 550 { 551 value = (String ) values[j]; 552 } 553 554 if (j > 0) 555 { 556 sb.append(","); 557 } 558 559 if (reportParameter.getClassName().equals("java.lang.String")) 560 { 561 sb.append("'" + value + "'"); 562 } 563 else 564 { 565 sb.append(value); 566 } 567 } 568 569 return sb.toString(); 570 } 571 572 public boolean validateParameters(List reportParameters, Map parameters) 573 throws ProviderException 574 { 575 parameters = new SingleValueMap(parameters); 576 577 if (reportParameters != null && reportParameters.size() > 0) 578 { 579 Iterator iterator = reportParameters.iterator(); 580 while (iterator.hasNext()) 581 { 582 ReportParameterMap rpMap = (ReportParameterMap) iterator.next(); 583 584 ReportParameter param = rpMap.getReportParameter(); 585 586 if (!parameters.containsKey(param.getName()) 587 && rpMap.isRequired()) 588 { 589 throw new ProviderException(LocalStrings 590 .getString(LocalStrings.ERROR_PARAMETER_REQUIRED) 591 + ": " + param.getDescription()); 592 } 593 594 if (param.getType().equals(ReportParameter.TEXT_PARAM) 595 || param.getType().equals(ReportParameter.DATE_PARAM)) 596 { 597 String value = (String ) parameters.get(param.getName()); 598 599 if (value != null && value.length() > 0) 600 { 601 try 602 { 603 validateParameter(param, value); 604 } 605 catch (Exception e) 606 { 607 throw new ProviderException(e.getMessage()); 608 } 609 } 610 else if (rpMap.isRequired()) 611 { 612 throw new ProviderException(LocalStrings 613 .getString(LocalStrings.ERROR_PARAMETER_REQUIRED) 614 + ": " + param.getDescription()); 615 } 616 } 617 } 618 } 619 620 return true; 621 } 622 623 public List getAvailableParameters(Report report) throws ProviderException 624 { 625 List parameters = getReportParameters(); 626 627 Iterator iterator = parameters.iterator(); 628 while (iterator.hasNext()) 629 { 630 ReportParameter rp = (ReportParameter) iterator.next(); 631 632 Iterator reportIterator = report.getParameters().iterator(); 633 while (reportIterator.hasNext()) 634 { 635 ReportParameterMap rpMap = 636 (ReportParameterMap) reportIterator.next(); 637 638 if (rp.getId().equals(rpMap.getReportParameter().getId())) 639 { 640 parameters.remove(rp); 641 iterator = parameters.iterator(); 642 } 643 } 644 } 645 646 return parameters; 647 } 648 649 public ReportParameter getReportParameter(Integer id) 650 throws ProviderException 651 { 652 return paramPersistenceProvider.getReportParameter(id); 653 } 654 655 public ReportParameter getReportParameter(String name) 656 throws ProviderException 657 { 658 return paramPersistenceProvider.getReportParameter(name); 659 } 660 661 public List getReportParameters() throws ProviderException 662 { 663 return paramPersistenceProvider.getReportParameters(); 664 } 665 666 public ReportParameter insertReportParameter(ReportParameter reportParameter) 667 throws ProviderException 668 { 669 return paramPersistenceProvider.insertReportParameter(reportParameter); 670 } 671 672 public void updateReportParameter(ReportParameter reportParameter) 673 throws ProviderException 674 { 675 paramPersistenceProvider.updateReportParameter(reportParameter); 676 } 677 678 public void deleteReportParameter(ReportParameter reportParameter) 679 throws ProviderException 680 { 681 paramPersistenceProvider.deleteReportParameter(reportParameter); 682 } 683 684 public void setDataSourceProvider(DataSourceProvider dataSourceProvider) 685 { 686 this.dataSourceProvider = dataSourceProvider; 687 } 688 689 public void setDateProvider(DateProvider dateProvider) 690 { 691 this.dateProvider = dateProvider; 692 } 693 694 } | Popular Tags |