private JasperPrint runAndRender(Report report) throws Exception, JRException {
    JasperPrint jasperPrint = new JasperPrint();

    JasperReport jasperReport =
        JasperCompileManager.compileReport(
            System.getProperty("opennms.home")
                + File.separator
                + "etc"
                + File.separator
                + "report-templates"
                + File.separator
                + report.getReportTemplate());

    if (report.getReportEngine().equals("jdbc")) {
      Connection connection = DataSourceFactory.getDataSource().getConnection();
      jasperPrint =
          JasperFillManager.fillReport(
              jasperReport, paramListToMap(report.getParameterCollection()), connection);
      connection.close();
    } else if (report.getReportEngine().equals("opennms")) {
      LogUtils.errorf(this, "Sorry the OpenNMS Data source engine is not yet available");
      jasperPrint = null;
    } else {
      LogUtils.errorf(this, "Unknown report engine: %s ", report.getReportEngine());
      jasperPrint = null;
    }

    return jasperPrint;
  }
  /**
   * {@inheritDoc}
   *
   * @throws ReportRunException
   */
  public synchronized String runReport(Report report, String reportDirectory)
      throws ReportRunException {

    String outputFile = null;
    try {
      outputFile =
          generateReportName(reportDirectory, report.getReportName(), report.getReportFormat());
      JasperPrint print = runAndRender(report);
      outputFile = saveReport(print, report.getReportFormat(), outputFile);

    } catch (JRException e) {
      LogUtils.errorf(this, e, "Error running report: %s", e.getMessage());
      throw new ReportRunException("Caught JRException: " + e.getMessage());
    } catch (Throwable e) {
      LogUtils.errorf(this, e, "Unexpected exception: %s", e.getMessage());
      throw new ReportRunException(
          "Caught unexpected " + e.getClass().getName() + ": " + e.getMessage());
    }

    return outputFile;
  }