package sos.stacks.jasperreports;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import sos.connection.SOSConnection;
import sos.connection.SOSConnectionFileProcessor;
import sos.documentfactory.DocumentFactoryClass;
import sos.net.SOSMailOrder;
import sos.settings.SOSConnectionSettings;
import sos.spooler.Order;
import sos.spooler.Variable_set;
import sos.spooler.Web_service_request;
import sos.spooler.Web_service_response;
import sos.spooler.Xslt_stylesheet;
import sos.util.SOSClassUtil;
import sos.util.SOSDate;
import sos.util.SOSPlainTextProcessor;
import sos.util.SOSSchedulerLogger;
import sos.util.SOSString;
import sos.xml.SOSXMLXPath;


/**
 * Klasse JobSchedulerJasperReportJob
 
 *  <br>Der Job erzeugt aus einer Report-Konfiguration mit JasperReports einen Bericht, 
 *      (siehe http://jasperreports.sourceforge.net)
 *  <br>
 *  <br>
 *  <br>Eine Report-Konfiguration legen Sie i.d.R. mit einem visuellen Report-Editor an, 
 *      z.B. mit iReport (siehe http://ireport.sourceforge.net).
 *  <br>
 *  <br> 
 *  <br>Es kann wahlweise die Datenbankverbindung des Job Schedulers oder eine separat angebbare 
 *  <br>Datenbankverbindung für die Abfrage der Berichtsdaten verwendet werden.
 *  <br>
 *  <br>
 *  <br>Die Berichtsdaten können auch mittels Parameter generiert werden. Alle Jobparameter werden den JasperReport als 
 *      Parameter zum Weiterverarbeiten weitergegeben.
 *  <br>
 *  <br>
 *  <br>Der Job unterstützt die Ausgabe in die Berichtsformate PDF, HTML, RTF, XML und XLS.
 *  <br>
 *  <br>Alle Generierten Reports können als emails versendet werden.
 *  <br>
 *  <br>Generieren von Reports mit JasperReport:
 *  <br>
 *  <br>Über die Jobparameter bzw. Orderparameter können folgende Parametern übergeben werden:
 *  <br> - Name der Jasper Vorlage. Die jasper-Vorlage mit Pfadangabe angeben.
 *  <br> <b>parameter:</b> name="<i>report_filename</i>" value="<i>jasperreports/config/dod/dod.jasper</i>"
 *  <br>              
 *  <br> - Ausgabeverzeichnis 
 *  <br> <b>parameter:</b> name="<i>output_filename</i>" value="<i>jasperreports/reports/dod_intervall.pdf"                                               
 *  <br>
 *  <br> - Das Report wird hier zweimal erzeugt. Einmal in html und einmal in pdf
 *  <br> <b>parameter:</b> name="<i>output_type</i>" value="<i>html;pdf</i>"
 *  <br>
 *  <br> - Titel des Reports (gilt nur für dod-reports)
 *  <br> <b>parameter:</b> name="<i>title</i>" value="<i>DOD Yearly Order Report: ETH Zuerich</i>"   
 *  <br>
 *  <br> - Verzeichnis der Sub Reports, falls Unterformulare vorhanden ist. Bitte schließende Slash nicht vergessen  
 *  <br> <b>parameter:</b> name="<i>SUBREPORT_DIR</i>" value="<i>/home/test/scheduler.jasper/jasperreports/config/dod/dod_sub_report/</i>"        
 *  <br>
 *  <br> - Konfigurationsdatei der Datenbankverbindung. Ist kein "settings_filename" angegeben, dann wird der Connection des schedulers übergeben  
 *  <br> <b>parameter:</b> name="<i>settings_filename</i>" value="<i>/home/test/scheduler.jasper/config/sos_settings_dod.ini</i>
 *  <br>
 *  <br> - Der Parameter benennt den Pfad und Namen einer Eingabedatei mit SQL-Statements. 
 *  <br> Wird dem Parameter ein Dateiname zugewiesen, dann wird die in dieser Datei enthaltene Abfrage für den Report verwendet 
 *  <br> anstelle der in der Berichtskonfiguration enthaltenen Abfrage, siehe Parameterreport_filename.
 *  <br> <b>parameter:</b> name="<i>query_filename</i>" value="<i>dod.sql</i>"
 *  <br>
 *  <br> - Der Parameter gibt eine SQL-Dateiname an. Ist dem Parameter eine Dateiname zugewiesen, 
 *  <br> dann wird die Abfrage ausgeführt und das Resultat der Abfrage mit den Datenbankverbindungen 
 *  <br> den JasperReports als Parameter übergeben. 
 *  <br> Die Resultat der Abfrage sind freier Parametern, der zur weitergabe an den JasperReports 
 *  <br> Parameter verwendet wird. In DOD-Report werden z.B. dated_from und dated_to als 
 *  <br> Parameter gebraucht, die aus der SQL-Statements selektiert werden 
 *  <br> <b>parameter:</b> name="<i>parameter_query_filename</i>" value="<i>dod_report_year.sql</i>
 *  <br> 
 *  <br>
 *  <br> -die Parameter dated_from und dated_to direkt übergeben z.B. 
 *  <br> Die Parameter ist ein freier Parameter, der zur weitergabe an den JasperReports Parameter 
 *  <br> verwendet wird. Es handelt sich um die Titel des Reports und wird in DOD-Reports verwendet.
 *  <br> <b>parameter:</b> name="<i>dated_from</i>" value="<i>2000-01-01</i>
 *  <br> <b>parameter:</b> name="<i>dated_to</i>" value="<i>2007-01-01</i>
 *  <br>
 *  <br> - Ist ein Druckername angegeben, dann wird das Dokument gedruckt.  
 *  <br> <b>parameter:</b> name="<i>printer_name</i>" value=""
 *  <br> 
 *  <br> - Anzahl zu druckenden Exemplarer 
 *  <br> <b>parameter:</b> name="<i>printer_copies" value =""
 *  <br>
 *  <br> - Sprache der Reports festlegen 
 *  <br> <b>parameter:</b> name="<i>report_locale" value ="de oder en"
 *  <br>
 *  <br>
 *  <br>- Parameter zur Mailversenden    
 *  <br>mail_it funktion. Ist eine mail_it Parameter angegeben bzw auf true gesetzt, dann wird mit
 *  <br>der Scheduler Mail Funktion emails versendet. Es wird überprüft, ob zusätzlich
 *  <br>die Parameter "mail_to", "mail_cc", "mail_bcc", "mail_subject" und "mail_body" angegeben 
 *  <br>sind. Wenn ja, dann werden zu diesen Adressanten mit den Betreff und body emails versendet. 
 *  <br>Wenn diese Parametern nicht existieren, dann werden die Empfänger aus den Einstellungen 
 *  <br>des Schedulers (factory.ini) genommen. 
 *  <br>Ist der Jobparameter mail_it nicht vorhanden bzw. als false gesetzt, dann wird der email mit 
 *  <br>Hilfe der Klasse SOSMailOrder versendet. 
 *  <br>Die Voraussetzung zum email versenden mit der Klasse SOSMailOrder ist 
 *  <br>  1. Datenbankverbindung ( hier ist die Datenbankverbindung des Schedulers oder die Datengemeint)
 *  <br>  2. das Existieren der Tabelle "SETTINGS"
 *  <br>  3. Einträge zum email versenden in der Tabelle "SETTINGS"   
 *  <br> Die Empfänger und der Subject und Body werden aus der Jobparameter ausgelesen. 
 *  <br>
 *  <br><b>parameter:</b> name="<i>mail_it</i>" value="true/false"
 *  
 *  <br>-Geben Sie hier eine oder mehrere eMail Adressen an, die den Report erhalten. Mehrere eMail Adressen werden durch Komma getrennt.
 *  <br>Ist diese Einstellung leer, dann werden Reports nicht per eMail versendet.
 *  <br><b>parameter:</b> name="<i>mail_to</i>" value="" 
 *  
 *  <br>-Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als carbon copy erhalten. 
 *  Mehrere eMail Adressen werden durch Komma getrennt.
 *  <br><b>parameter:</b> name="<i>mail_cc</i>" value=""
 *  
 *  <br>-Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als blind carbon copy erhalten. Mehrere eMail Adressen werden durch Komma getrennt.
 *  <br><b>parameter:</b> name="<i>mail_bcc</i>" value=""
 *  
 *  <br>-Der Inhalt des Parameters wird als Betreff der eMail des Reports verwendet und muss ausgefüllt sein, wenn Reports per eMail versendet werden.
 *  <br>Mit diesem Parameter kann das Layout des Reports im HTML-Format oder als plain text angegeben werden. Zur Bestimmen des Layout Typs wird dem Parameter folgender Prefix zugeordnet:
 *  <br>  - factory: 
 *  <br>  - factory_file: 
 *  <br>  - plain: 
 *  <br>  - plain_file: 
 *  <br>Es können folgende Platzhalter verwendet werden, die durch [ und] geklammert werden, z.B. in der Form [date]:
 *  <br>  - [date] - aktuelles Datum 
 *  <br>  - [datetime] - aktuelles Datum und Uhrzeit 
 *  <br>  - [orderid] - ID des Auftrags 
 *  <br>  - [jobname] - Name des Jobs 
 *  <br>  - [taskid] - ID der Task 
 *  <br><b>parameter:</b> name="<i>mail_subject</i>" value="<i>JasperReports: Report Delivery</i>"
 *  <br>
 *  <br>-Mit diesem Parameter kann das Layout des Reports im HTML-Format oder als plain text angegeben werden. Zur Bestimmen des Layout Typs wird dem Parameter folgender Prefix zugeordnet:
 *  <br>  - factory: 
 *  <br>  - factory_file: 
 *  <br>  - plain: 
 *  <br>  - plain_file: 
 *  <br>
 *  <br>Innerhalb des Layouts können folgende Platzhalter verwendet werden, die jeweils mit [ und ] geklammert werden, z.B. in der Form [date]:
 *  <br>  - [date] - aktuelles Datum 
 *  <br>  - [datetime] - aktuelles Datum und Uhrzeit 
 *  <br>  - [orderid] - ID des Auftrags 
 *  <br>  - [jobname] - Name des Jobs 
 *  <br>  - [taskid] - ID der Task 
 *  <br>  - [sql] - SQL-Query, aus der der Report erstellt wurde 
 *  <br>  - [xml] - aus dem Ergebnis der Abfrage generiertes xml vor der Transformation 
 *  <br><b>parameter:</b> name="<i>mail_body</i>" value=""     
 *  <br>
 *  <br>
 *  <br>@author andreas.pueschel@sos-berlin.com; mueruevet.oeksuez@sos-berlin.com
 *  <br>@version 1.0
 *  <br>@resource sos.scheduler.jar, sos.spooler.jar, sos.stacks.jar, sos.util.jar,
 *      sos.xml.jar, sos.connection.jar, jasperreports-1.2.3.jar, poi-2.0-final-20040126.jar, 
 *      itext-1.3.1.jar, commons-digester-1.7.jar, commons-javaflow-20060411.jar, commons-collections-2.1.jar, 
 *      org.apache.commons.jar, sos.documentfactory.jar, sos.mail.jar, sos.settings.jar, sos.net.jar,
 *      activation, sos.hostware.jar,   
 *  <br>
 *  <br>
 *  <br>@see job documentation in the package jobdoc for details
 */
public class JobSchedulerJasperReportJob extends sos.scheduler.managed.JobSchedulerManagedJob {  
   
  /** Konfigurationsdatei der Datenbankverbindungen   */
  private String settingsFilename                     = "";
  
  /** Vorlagenname: Extention ist jasper*/
  private String reportFilename                       = "";
  
  /** SQL-Dateiname, wird dieser Parameter gesetzt dann wird den JasperReport
   * die ResultSet ohne Datenbankverbindung übergeben.*/
  private String queryFilename                        = "";
  
  /** Ausgabetyp der Reportdatei*/
  private String outputType                           = "pdf";
  
  /** Name der Ausgabedatei oder eine Verzeichnisname */
  private String outputFilename                       = "";
    
  /** Wenn der Druckername eine prefix = "factory:" enthält, dann wird dieser 
   * über die Documentfactory ermittelt. Sonst wird über diesen Druckername gedruckt. */
  private String printerName                = "";
  
  /** Einstellungsdatei für Datenbankverbindung, wenn Documentfactory printerName / mail von einer 
   * anderen Datenbank ermittelt werden soll */
  private String factorySettingsFile                  = "";
  
  /** sos.util.SOSString Objekt*/
  private SOSString sosString             = new SOSString();
  
  /** temporäre Ausgabe hilfsdateiname */
  private File filledReportFile             = null;
  
  /** Liste aller generierten Report Dokumente*/
  private ArrayList listOfOutputFilename              = null;
  
  /** Ist ein parameter_query_filename angegeben, so wird dieser hier in java ausgeführt und das 
   * Ergebis als Parameter den jasperreport übergebenden */
  private String parameterQueryFilename        = "";
  
  /** sos.spooler.Order Objekt */
  private Order order                 = null;
  
  /** sos.spooler.Variable_set Objekt */
  private Variable_set orderData             = null;
  
  /** Anzahl zu druckenden Exemplarer*/
  private int printerCopies              = 1;
  
  /** Ist eine mail_it Parameter angegeben bzw auf true gesetzt, dann wird mit
   * der Scheduler Mail Funktion emails versendet. Es wird überprüft, ob zusätzlich
   * die Parameter "mail_to", "mail_cc", "mail_bcc", "mail_subject" und "mail_body" angegeben
   * sind. Wenn ja, dann werden zu diesen Adressanten mit den Betreff und body emails versendet.
   * Wenn diese Parametern nicht existieren, dann werden die Empfänger aus den Einstellungen
   * des Schedulers (factory.ini) genommen.*/
  private boolean mailIt                = false;
  
  /** Geben Sie hier eine oder mehrere eMail Adressen an, die den Report erhalten.
   * Mehrere eMail Adressen werden durch Komma getrennt.<br/>
   * Ist diese Einstellung leer, dann werden Reports nicht per eMail versendet.*/
  private String mailTo                = "";
  
  /** Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als carbon copy erhalten.
   * Mehrere eMail Adressen werden durch Komma getrennt.    */
  private String mailCc                = "";
  
  /**
   * Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als blind carbon copy erhalten.
   * Mehrere eMail Adressen werden durch Komma getrennt.          
   */
  private String mailBcc                = "";
  
  /** Der Inhalt des Parameters wird als Betreff der eMail des
   * Reports verwendet und muss ausgefüllt sein, wenn Reports per
   * eMail versendet werden.
   <p>
   *  Es können folgende Platzhalter verwendet werden, die durch [
   *  und] geklammert werden, z.B. in der Form [date]:
   </p>
   <ul>
   *  <li>[date] - aktuelles Datum</li>
   *  <li>[datetime] - aktuelles Datum und Uhrzeit</li>
   *  <li>[orderid] - ID des Auftrags</li>
   *  <li>[jobname] - Name des Jobs</li>
   *  <li>[taskid] - ID der Task</li>
   *</ul>
   */
  private String mailSubject              = "";
  
  /**
   * Löscht den alten Bericht bevor neue generiert wird.
   * Das verhindert, falls keine neue Bericht erstellt wird, z.B. wegen DB oder SQL Fehler,
   * dann soll auch keine alten Bericht abgeholt werden
   */
  private boolean deleteOldFilename                = false;
  
  
  /**
   <p>
   * Mit diesem Parameter kann das Layout
   * des Reports im HTML-Format oder als plain text angegeben
   * werden. Innerhalb des Layouts können folgende Platzhalter verwendet werden, die jeweils mit [
   * und ] geklammert werden, z.B. in der Form [date]:
   </p>
   <ul>
   *  <li>[date] - aktuelles Datum</li>
   *  <li>[datetime] - aktuelles Datum und Uhrzeit</li>
   *  <li>[orderid] - ID des Auftrags</li>
   *  <li>[jobname] - Name des Jobs</li>
   *  <li>[taskid] - ID der Task</li>
   *  <li>[sql] - SQL-Query, aus der der Report erstellt wurde</li>
   *  <li>
   *  [xml] - aus dem Ergebnis der Abfrage generiertes xml vor der
   *  Transformation
   *  </li>
   </ul>
   *
   */
  private String mailBody                = "";
  
  /** SQL-Statement in base64 encodiert. Diese Variable wird zuerst decodiert und anschließend wird der
   * Inhalt ausgeführt und der ResultSet den JasperReport ohne Datenbankverbindung übergeben.*/
  private String queryStatement                        = "";
  
  /** Schalter für das versenden bzw. nicht versenden von Reports als Attachment; 
   * Fall: suspend_attachment=true  -> dann werden keine Reports versender
   * Fall: suspend_attachment=false -> dann werden Reports mit versendet
   * default: suspend_attachment=false */
  private boolean suspendAttachment                    = false;
  
  /**
   * initialization
   */  
  public boolean spooler_init() {    
    
    try // to fetch default job parameters      
      if (!super.spooler_init()) 
        return false;
      //init();
      //this.getJobParameters();
      return true;
    catch (Exception e) {
      spooler_log.error("error occurred processing spooler_init(): " + e.getMessage());
      return false;
    }
  }
  
  
  /**
   * process report
   */  
  public boolean spooler_process() {
    
    //Order order = null;
    //Variable_set orderData = null;
    order = null;
    orderData = null;
    
    File settingsFile = null;
    File reportFile = null;
    File queryFile = null;  
    File queryStatementFile = null;
    File outputFile = null;
    File parameterQueryFile = null;
    String stateText = "";
    String tmpOutputFileWithoutExtension = ""//hilfsvariable
    SOSConnectionFileProcessor queryProcessor = null;
    
    try {
      spooler_log.debug3("******************spooler_process*****************************");
      this.prepareParams();
      
      listOfOutputFilename = new ArrayList();      
      this.setSettingsFilename("");
      this.setReportFilename("");
      this.setQueryFilename("");
      this.setOutputType("pdf");
      this.setOutputFilename("");
      this.setQueryStatement("");
      
//      get job parameters from job configuration (scheduler.xml)
      this.getJobParameters();  
//      to fetch parameters from orders that have precedence to job parameters
      this.getOrderParameters();            
//      to check report parameters
      checkParams();      
      
      try // to process report
                    
        
        reportFile = new File(this.getReportFilename());
        if (!reportFile.exists()) 
          throw new Exception("report file does not exist: " + reportFile.getCanonicalPath());
        
        filledReportFile = File.createTempFile("sos"".tmp");
        filledReportFile.deleteOnExit();
        
        queryFile = new File(this.getQueryFilename());
        
        outputFile = null;
        if (this.getOutputFilename() != null && this.getOutputFilename().length() 0) {
          String outputFile_ = maskFilename(this.getOutputFilename());
          outputFile  = new File(outputFile_);          
        else {
          outputFile = File.createTempFile("sos"".tmp");
          outputFile.deleteOnExit();
        }
        
        //eventuell vorhandene alte Berichte löschen
        if(this.isDeleteOldFilename()) {
          if(outputFile.exists()) {
            spooler_log.debug3("..deleting old File " + outputFile.getCanonicalPath());
            if(!outputFile.delete()) {
              spooler_log.warn("..could not delete old File " + outputFile.getCanonicalPath());
            else {
              spooler_log.debug3("..successfully delete old File " + outputFile.getCanonicalPath());
            }
          }
        }
        
        if (this.getSettingsFilename() != null && this.getSettingsFilename().length() 0) {
          settingsFile = new File(this.getSettingsFilename());
          if (!settingsFile.exists()) throw new Exception("settings file does not exist: " + settingsFile.getCanonicalPath());
          queryProcessor = new SOSConnectionFileProcessor(settingsFile.getCanonicalPath()this.getLogger())
        else {
          if (this.getConnection() == nullthrow new Exception("job scheduler runs without database");
          queryProcessor = new SOSConnectionFileProcessor(this.getConnection()this.getLogger());
        }
        
        //alle Jobparametern werden den jasperreport übergeben
        Map parameters = new HashMap();
        Variable_set params = spooler_task.params();
        /*if (orderData != null) 
          params.merge(orderData);
        */
        if (orderData != null) {
          spooler_log.debug6(".......orderDatanames: " + orderData.names());
          java.util.StringTokenizer tokenizero = new java.util.StringTokenizer(orderData.names()";")
          whiletokenizero.hasMoreTokens() ) {
            String name = tokenizero.nextToken();
            parameters.put(name, orderData.var(name));
            spooler_log.debug6(".......orderData: " + name + "=" + orderData.var(name));
          
        }
        
        
        spooler_log.debug6(".......paramsnames: " + params.names());
        java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(params.names()";")
        whiletokenizer.hasMoreTokens() ) {
          String name = tokenizer.nextToken();          
          parameters.put(name, params.var(name));    
          spooler_log.debug6(".......jobparameter: " + name + "=" + params.var(name));
        }   
        
        //Ausführen der sql-script und das Ergebnis den Jasperreport als Parameter übergeben
        if (sosString.parseToString(parameterQueryFilename).length() 0) {
          parameterQueryFile = new File (this.parameterQueryFilename);
          if (parameterQueryFile.exists()) {
            queryProcessor.process(parameterQueryFile);    
            try {
              parameters.putAll(queryProcessor.getConnection().get());
            catch (Exception e) {
              spooler_log.warn("..error while get Resultset from query Processor Connection: " + e.toString());
            }
          else {
            spooler_log.warn(".." +  parameterQueryFilename + " not exists");
          }
        }
        
        
        if (sosString.parseToString(parameters.get("report_locale")).length() 0) {
          parameters.put(JRParameter.REPORT_LOCALE, new Locale(sosString.parseToString(parameters.get("report_locale"))));          
        else {
          parameters.put(JRParameter.REPORT_LOCALE, Locale.GERMAN);
        }
        
        //Ausgaben aller Parametern, die den JasperReport übergeben werden
        Object[] param = parameters.entrySet().toArray();
        for (int i = 0; i < param.length; i++) {
          spooler_log.debug3"..report parameter " + param[i].toString());
        }
        
        //java.util.ResourceBundle.getBundle("sos.stacks.jasperreports.dod").toString();  
        //parameters.put(JRParameter.REPORT_RESOURCE_BUNDLE, java.util.ResourceBundle.getBundle("sos.stacks.jasperreports.dod").toString());
                
        if (sosString.parseToString(queryStatement).length() 0) {
          queryStatementFile = this.decodeBase64(this.queryStatement);
          this.getLogger().debug3("queryStatementFile: " + queryStatementFile);
          if (queryStatementFile.exists()) {
            queryProcessor.process(queryStatementFile);
          }
        }
         
        
        
                 
        //existiert ein queryfile, dann wird das Ergebnis der Queryfile ohne Connection den jasperreport übergeben
        //Vorher werden alle Platzhalter in der query_filname ersetzt mit Parameter
        if (queryFile.exists()) { 
          //queryProcessor.process(queryFile);
//          Paltzhalter in der query_filename parsieren
          SOSPlainTextProcessor processor_ = new SOSPlainTextProcessor();
          //File currQueryFile = File.createTempFile("temp", ".sql", queryFile.getParentFile());
          File currQueryFile = processor_.process(queryFile, (HashMap)parameters);
          currQueryFile.deleteOnExit();
              queryProcessor.process(currQueryFile);
              this.getLogger().debug5("query " + processor_.getDocumentContent());
        }
        
        if (queryFile.exists() || (queryStatementFile != null  && queryStatementFile.exists())) {
          JasperFillManager.fillReportToFile(reportFile.getCanonicalPath(), filledReportFile.getCanonicalPath()
              parameters,
              new JRResultSetDataSource(queryProcessor.getConnection().getResultSet()));
        else {
          JasperFillManager.fillReportToFile(reportFile.getCanonicalPath()
              filledReportFile.getCanonicalPath()
              parameters,
              queryProcessor.getConnection().getConnection());   
        }                    
        
        tmpOutputFileWithoutExtension = outputFile.getCanonicalPath().substring(0, outputFile.getCanonicalPath().lastIndexOf(".") ) ".";
        
        if (getOutputType().indexOf("pdf"> -1) {
          outputFile = new File(tmpOutputFileWithoutExtension + "pdf");          
          JasperExportManager.exportReportToPdfFile(filledReportFile.getCanonicalPath(), outputFile.getCanonicalPath());
          listOfOutputFilename.add(outputFile);
        }
        
        if (getOutputType().indexOf("htm"> -|| getOutputType().indexOf("html"> -1) {
          if (getOutputType().indexOf("html"> -1)
            outputFile = new File(tmpOutputFileWithoutExtension + "html");
          else  
            outputFile = new File(tmpOutputFileWithoutExtension + "htm");
          // JasperExportManager.exportReportToHtmlFile(filledReportFile.getCanonicalPath(), outputFile.getCanonicalPath());
          JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(filledReportFile);
          JRHtmlExporter exporter = new JRHtmlExporter();          
          exporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT, jasperPrint);
          exporter.setParameter(JRHtmlExporterParameter.OUTPUT_FILE_NAME, outputFile.getCanonicalPath());
          exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN , Boolean.FALSE);           
          exporter.exportReport();
          listOfOutputFilename.add(outputFile);
        }
        
        if (this.getOutputType().indexOf("xml"> -1) {
          outputFile = new File(tmpOutputFileWithoutExtension + "xml");
          JasperExportManager.exportReportToXmlFile(filledReportFile.getCanonicalPath(), outputFile.getCanonicalPath()true);
          listOfOutputFilename.add(outputFile);
        }
        
        if (this.getOutputType().indexOf("xls"> -1) {
          outputFile = new File(tmpOutputFileWithoutExtension + "xls");
          JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(filledReportFile);
          JRXlsExporter exporter = new JRXlsExporter();
          exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
          exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputFile.getCanonicalPath());
          exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
          exporter.exportReport();
          listOfOutputFilename.add(outputFile);
        
        
        if (this.getOutputType().indexOf("rtf"> -1) {
          outputFile = new File(tmpOutputFileWithoutExtension + "rtf");
          JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(filledReportFile);
          JRRtfExporter exporter = new JRRtfExporter();
          exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
          exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputFile.getCanonicalPath());
          exporter.exportReport();             
          listOfOutputFilename.add(outputFile);