com.sos.jitl.jasperreports.JobSchedulerJasperReportJob.java Source code

Java tutorial

Introduction

Here is the source code for com.sos.jitl.jasperreports.JobSchedulerJasperReportJob.java

Source

/**
 * Copyright (C) 2014 BigLoupe http://bigloupe.github.io/SoS-JobScheduler/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */
/********************************************************* begin of preamble
**
** Copyright (C) 2003-2012 Software- und Organisations-Service GmbH. 
** All rights reserved.
**
** This file may be used under the terms of either the 
**
**   GNU General Public License version 2.0 (GPL)
**
**   as published by the Free Software Foundation
**   http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
**   LICENSE.GPL included in the packaging of this file. 
**
** or the
**  
**   Agreement for Purchase and Licensing
**
**   as offered by Software- und Organisations-Service GmbH
**   in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package com.sos.jitl.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.net.SOSMailOrder;
import sos.scheduler.managed.JobSchedulerManagedJob;
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.textprocessor.SOSPlainTextProcessor;
import sos.util.SOSClassUtil;
import sos.util.SOSDate;
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 fr die Abfrage der Berichtsdaten verwendet werden.
 *  <br>
 *  <br>
 *  <br>Die Berichtsdaten knnen auch mittels Parameter generiert werden. Alle Jobparameter werden den JasperReport als 
 *      Parameter zum Weiterverarbeiten weitergegeben.
 *  <br>
 *  <br>
 *  <br>Der Job untersttzt die Ausgabe in die Berichtsformate PDF, HTML, RTF, XML und XLS.
 *  <br>
 *  <br>Alle Generierten Reports knnen als emails versendet werden.
 *  <br>
 *  <br>Generieren von Reports mit JasperReport:
 *  <br>
 *  <br>ber die Jobparameter bzw. Orderparameter knnen 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 fr 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 schlieende 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 fr 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 ausgefhrt 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 berprft, ob zustzlich
 *  <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 Empfnger 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. Eintrge zum email versenden in der Tabelle "SETTINGS"   
 *  <br> Die Empfnger 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 ausgefllt 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 knnen 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 knnen 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 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:" enthlt, dann wird dieser 
     * ber die Documentfactory ermittelt. Sonst wird ber diesen Druckername gedruckt. */
    private String printerName = "";

    /** Einstellungsdatei fr Datenbankverbindung, wenn Documentfactory printerName / mail von einer 
     * anderen Datenbank ermittelt werden soll */
    private String factorySettingsFile = "";

    /** sos.util.SOSString Objekt*/
    private SOSString sosString = new SOSString();

    /** temporre 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 ausgefhrt und das 
     * Ergebis als Parameter den jasperreport bergebenden */
    private String parameterQueryFilename = "";

    /** sos.spooler.Order Objekt */
    protected Order order = null;

    /** sos.spooler.Variable_set Objekt */
    protected 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 berprft, ob zustzlich
     * 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 Empfnger 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 ausgefllt sein, wenn Reports per
     * eMail versendet werden.
     * <p>
     *  Es knnen 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 = "";

    /**
     * Lscht 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 knnen 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 anschlieend wird der
     * Inhalt ausgefhrt und der ResultSet den JasperReport ohne Datenbankverbindung bergeben.*/
    private String queryStatement = "";

    /** Schalter fr 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 currQueryFile = 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 lschen
                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(),
                            new sos.util.SOSSchedulerLogger(spooler_log));
                } else {
                    if (this.getConnection() == null)
                        throw new Exception("job scheduler runs without database");
                    queryProcessor = new SOSConnectionFileProcessor(this.getConnection(),
                            new sos.util.SOSSchedulerLogger(spooler_log));
                }

                //alle Jobparametern werden den jasperreport bergeben
                Map parameters = new HashMap();
                Variable_set params = spooler_task.params();

                if (orderData != null) {
                    spooler_log.debug6(".......orderDatanames: " + orderData.names());
                    java.util.StringTokenizer tokenizero = new java.util.StringTokenizer(orderData.names(), ";");
                    while (tokenizero.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(), ";");
                while (tokenizer.hasMoreTokens()) {
                    String name = tokenizer.nextToken();
                    parameters.put(name, params.var(name));
                    spooler_log.debug6(".......jobparameter: " + name + "=" + params.var(name));
                }

                //Ausfhren 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("com.sos.jitl.jasperreports.dod").toString();   
                //parameters.put(JRParameter.REPORT_RESOURCE_BUNDLE, java.util.ResourceBundle.getBundle("com.sos.jitl.jasperreports.dod").toString());

                if (sosString.parseToString(queryStatement).length() > 0) {
                    queryStatementFile = this.decodeBase64(this.queryStatement);
                    this.spooler_log.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());
                    currQueryFile = processor_.process(queryFile, (HashMap) parameters);
                    currQueryFile.deleteOnExit();
                    queryProcessor.process(currQueryFile);

                    this.spooler_log.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") > -1 || 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);
                }

                stateText = printDocument();

                stateText = stateText + "..report generated in output file: " + tmpOutputFileWithoutExtension + "["
                        + getOutputType() + "] " + stateText;

                stateText = sendEmail(stateText);

                spooler_log.info(stateText);

                spooler_job.set_state_text(stateText);

            } catch (Exception e) {
                throw new Exception("error occurred processing report: " + e);
            }

            try { // to fetch parameters from orders that have precedence to job parameters
                if (spooler_task.job().order_queue() != null) {
                    order = spooler_task.order();

                    // create response for web service request
                    if (order.web_service_operation_or_null() != null) {
                        Web_service_response response = order.web_service_operation().response();

                        if (this.getOutputFilename() != null && this.getOutputFilename().length() > 0) {
                            // return SOAP response
                            // should the response be previously transformed ...
                            if (order.web_service().params().var("response_stylesheet") != null
                                    && order.web_service().params().var("response_stylesheet").length() > 0) {
                                Xslt_stylesheet stylesheet = spooler.create_xslt_stylesheet();
                                stylesheet.load_file(order.web_service().params().var("response_stylesheet"));
                                String xml_document = stylesheet.apply_xml(order.xml());
                                spooler_log.debug3("content of response transformation:/n" + xml_document);
                                response.set_string_content(xml_document);
                            } else {
                                response.set_string_content(order.xml());
                            }
                        } else {
                            // return binary content
                            BufferedInputStream in = new BufferedInputStream(new FileInputStream(outputFile));
                            ByteArrayOutputStream out = new ByteArrayOutputStream();
                            byte buffer[] = new byte[1024];
                            int bytesRead;
                            while ((bytesRead = in.read(buffer)) != -1) {
                                out.write(buffer, 0, bytesRead);
                            }
                            order.web_service_operation().response().set_binary_content(out.toByteArray());
                        }

                        response.send();
                        spooler_log.debug3(
                                "web service response successfully processed for order \"" + order.id() + "\"");
                    }
                }
            } catch (Exception e) {
                throw new Exception("error occurred processing web service response: " + e.getMessage());
            }

            if (filledReportFile != null && filledReportFile.exists())
                spooler_log.debug5(
                        "..delete " + filledReportFile.getCanonicalPath() + ": " + filledReportFile.delete());

            if (currQueryFile != null && currQueryFile.exists())
                spooler_log.debug5("delete " + currQueryFile.getCanonicalPath() + ": " + currQueryFile.delete());

            // return value for classic and order driven processing
            return (spooler_task.job().order_queue() != null);

        } catch (Exception e) {
            spooler_job.set_state_text(e.getMessage());
            try {
                if (filledReportFile != null && filledReportFile.exists())
                    spooler_log.debug("could delete " + filledReportFile.getCanonicalPath() + ": "
                            + filledReportFile.delete());
            } catch (Exception se) {
            }
            spooler_log.warn(e.getMessage());
            return false;
        } finally {

        }
    }

    /**
     * Liefert true, wenn in output_type gltige Typen definiert ist:
     * Gltige output_type sind: [pdf, htm, xml, xls, rtfl]
     * @return
     * @throws Exception
     */
    private boolean isValidOutputType() throws Exception {
        try {
            if ((this.getOutputType().indexOf("pdf") > -1) || (this.getOutputType().indexOf("htm") > -1)
                    || (this.getOutputType().indexOf("html") > -1) || (this.getOutputType().indexOf("xml") > -1)
                    || (this.getOutputType().indexOf("xls") > -1) || (this.getOutputType().indexOf("rtf") > -1)) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getClassName() + ": " + e);
        }

    }

    public File decodeBase64(String sencode) throws Exception {
        try {
            /*String hallo = "Hallo";         
            byte[] b = hallo.getBytes();
            String sencode = new sun.misc.BASE64Encoder().encode(b);
            byte[] buf = new sun.misc.BASE64Decoder().decodeBuffer(sencode);
                
            // writes to the file            
               FileOutputStream fos = new FileOutputStream( "C:/temp/a.sql" );
               fos.write( buf );
               fos.close();
               */
            //sencode = sencode.replaceAll("\r","");
            //sencode = sencode.replaceAll("\n","");
            //this.getLogger().debug("lsch mich: " + sencode);

            byte[] buf = new sun.misc.BASE64Decoder().decodeBuffer(sencode.trim());

            File f = File.createTempFile("query_statement", ".sql");
            //File f = new File("C:/temp/a.sql");
            f.deleteOnExit();
            //this.getLogger().info("test lsch mich "+ f.getCanonicalPath());
            // writes to the file            
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(buf);
            fos.close();

            return f;
        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getClassName() + ": " + e);
        }
    }

    /**
     * Dokument drucken.
     * 
     * @throws Exception
     */
    private String printDocument() throws Exception {
        try {
            //         druckername bestimmen
            String prName = getPrinter();
            if (sosString.parseToString(prName).length() > 0) {
                JasperPrint jasperPrint = (JasperPrint) JRLoader.loadObject(filledReportFile);
                net.sf.jasperreports.engine.export.JRPrintServiceExporter exporter = new net.sf.jasperreports.engine.export.JRPrintServiceExporter();
                //            set the report to print
                exporter.setParameter(
                        net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter.JASPER_PRINT,
                        jasperPrint);
                //            count of report to print            
                javax.print.attribute.PrintRequestAttributeSet aset = new javax.print.attribute.HashPrintRequestAttributeSet();
                aset.add(new Copies(getPrinterCopies()));
                aset.add(MediaSizeName.ISO_A4);
                exporter.setParameter(
                        net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET,
                        aset);
                //            let the exporter know which printer we want to print on
                javax.print.attribute.PrintServiceAttributeSet serviceAttributeSet = new javax.print.attribute.HashPrintServiceAttributeSet();
                serviceAttributeSet.add(new javax.print.attribute.standard.PrinterName(prName, null));
                exporter.setParameter(
                        net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET,
                        serviceAttributeSet);
                //            print it
                exporter.exportReport();
                spooler_log.info("..report successfully printed " + getPrinterCopies() + "x.");
                return "..report successfully printed " + getPrinterCopies() + "x.";
            }
            return "";
        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getMethodName() + " " + e);
        }
    }

    /**
     * Name der Ausgabedatei auslesen
     * @return String
     */
    public String getOutputFilename() {
        return outputFilename;
    }

    /**
     * Name der Ausgabedatei setzen
     * @param outputFilename The outputFilename to set.
     */
    public void setOutputFilename(String outputFilename) {
        this.outputFilename = outputFilename;
    }

    /**
     * Liefert den Ausgabedateitypen. Es knnen mehrere in semikolon getrennt angegeben werden:
     * Gltige Typen sind: [pdf, html, xml, xls, rtf]
     * @return String
     */
    public String getOutputType() {
        return outputType;
    }

    /**
     * Setzen der Ausgabedateitypen:Es knnen mehrere in semikolon getrennt angegeben werden:
     * Gltige Typen sind: [pdf, html, xml, xls, rtf]
     * @param outputType
     */
    public void setOutputType(String outputType) {
        this.outputType = outputType;
    }

    /**
     * Jasper Report Dateiname auslesen. 
     * Die Jasper Report Dateiname ist die Vorlage, die parsiert wird.
     * Die Extension ist jasper.
     * 
     * @return String
     */
    public String getReportFilename() {
        return reportFilename;
    }

    /**
     * Jasper Report Dateiname setzen. 
     * Die Jasper Report Dateiname ist die Vorlage, die parsiert wird.
     * Die Extension ist jasper.
     * 
     * @param reportFilename
     */
    public void setReportFilename(String reportFilename) {
        this.reportFilename = reportFilename;
    }

    /**
     * SQL Dateiname auslesen. Beinhaltet eine SQL-Select-Statement. 
     * 
     * Wird dieser Parameter gesetzt dann wird den JasperReport
     * die ResultSet der SQL-Select-Statement ohne Datenbankverbindung bergeben.
     * 
     * @return String
     */
    public String getQueryFilename() {
        return queryFilename;
    }

    /**
     * SQL Dateiname auslesen. Beinhaltet eine SQL-Select-Statement. 
     * 
     * Wird dieser Parameter gesetzt dann wird den JasperReport
     * die ResultSet der SQL-Select-Statement ohne Datenbankverbindung bergeben.
     * 
     * Ist dieser Parameter leer bzw. existiert nicht, dann wird dem JasperReport 
     * der Datenbankverbindung bergeben.
     * 
     * @return queryFilename
     */
    public void setQueryFilename(String queryFilename) {
        this.queryFilename = queryFilename;
    }

    /**
     * SQL Dateiname auslesen. Beinhaltet eine SQL-Select-Statement. 
     * 
     * Ist ein parameter_query_filename angegeben, so wird dieser hier in java ausgefhrt und das 
     * Ergebis als Parameter den jasperreport mit der Datenbankverbindungen bergebenden
     * 
     * @return String
     */
    public String getParameterQueryFilename() {
        return parameterQueryFilename;
    }

    /**
     * SQL Dateiname setzen. Beinhaltet eine SQL-Select-Statement. 
     * 
     * Ist ein parameter_query_filename angegeben, so wird dieser hier in java ausgefhrt und das 
     * Ergebis als Parameter den jasperreport mit der Datenbankverbindungen bergebenden
     * 
     * @return String
     */
    public void setParameterQueryFilename(String parameterQueryFilename) {
        this.parameterQueryFilename = parameterQueryFilename;
    }

    /**
     * Konfigurationsdatei der Datenbankverbindungen auslesen.
     * Ist eine Angabe nicht vorhanden, dann wird der Scheduler Datenbanken
     * bergeben.
     * 
     * @return String
     */
    public String getSettingsFilename() {
        return settingsFilename;
    }

    /**
     * Konfigurationsdatei der Datenbankverbindungen setzen.
     * Ist eine Angabe nicht vorhanden, dann wird der Scheduler Datenbanken
     * bergeben.
     *  
     * @param settingsFilename The settingsFilename to set.
     */
    public void setSettingsFilename(String settingsFilename) {
        this.settingsFilename = settingsFilename;
    }

    /**
     * Auslesen der Druckername.
     * Wenn der Druckername eine prefix = "factory:" enthlt, dann wird dieser 
     * ber die Documentfactory ermittelt. Sonst wird ber diesen Druckername gedruckt.
     * 
     * @return String
     */
    public String getPrinterName() {
        return printerName;
    }

    /**
     * Druckername setzen.
     * 
     * Wenn der Druckername eine prefix = "factory:" enthlt, dann wird dieser 
     * ber die Documentfactory ermittelt. Sonst wird ber diesen Druckername gedruckt.
     * @param printerName
     */
    public void setPrinterName(String printerName) {
        this.printerName = printerName;
    }

    /**
     * E-Mail Adresse auslesen.
     * 
     * Der Inhalt der Parameter "scheduler_order_report_mailto" ist die E-Mail-Adresse.
     * Existiert ein Eintrag, dann wird versucht ber diesen Adresse eine E-Mail zu versenden. 
     * 
     * @return String
     */
    /*public String getEmailAddress() {
     return emailAddress;
     }*/

    /**
     * E-Mail Adresse setzen.
     * 
     * Der Inhalt der Parameter "scheduler_order_report_mailto" ist die E-Mail-Adresse.
     * Existiert ein Eintrag, dann wird versucht ber diesen Adresse eine E-Mail zu versenden. 
     * 
     * @return String
     */
    /*public void setEmailAddress(String emailAddress) {
     this.emailAddress = emailAddress;
     }*/

    /**
     * Name der Konfigurationsdatei fr Datenbankverbindung, wenn Documentfactory printerName  von einer 
     * anderen Datenbank ermittelt werden soll. 
     * 
     * Oder der Emailversand soll per Dokumentfactory laufen und diese Datenbank verwenden.
     * 
     * @return String
     */
    public String getFactorySettingsFile() {
        return factorySettingsFile;
    }

    /**
     * Setzen der Name der Konfigurationsdatei fr Datenbankverbindung, wenn 
     * Documentfactory printerName / mail von einer anderen Datenbank ermittelt werden soll. 
     * 
     * @param factorySettingsFile
     */
    public void setFactorySettingsFile(String factorySettingsFile) {
        this.factorySettingsFile = factorySettingsFile;
    }

    /**
     * Anzahl zu druckenden Exemplarer auslesen.
     * 
     * @return int
     */
    public int getPrinterCopies() {
        return printerCopies;
    }

    /**
     * Anzahl zu druckenden Exemplarer setzen.
     * 
     * @param printerCopies
     */
    public void setPrinterCopies(int printerCopies) {
        this.printerCopies = printerCopies;
    }

    /**
     * Auslesen eine oder mehrere eMail Adressen an, die den Report als blind carbon copy erhalten.
     * Mehrere eMail Adressen werden durch Komma getrennt.
     * @return String          
     */
    public String getMailBcc() {
        return mailBcc;
    }

    /**
     * Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als blind carbon copy erhalten.
     * Mehrere eMail Adressen werden durch Komma getrennt.          
     */
    public void setMailBcc(String mailBcc) {
        this.mailBcc = mailBcc;
    }

    /**
     * <p>
     * Mit diesem Parameter kann das Layout des Reports im HTML-Format oder als plain text angegeben
     * werden. Zur Bestimmen des Layouts wird dem Parameter folgender Prefix zugeordnet:
     * 
     * <ul>
     *  <li> factory:</li>
     *  <li> factory_file:</li>
     *  <li> plain:</li>
     *  <li> plain_file:</li>
     * </ul>
     *  
     * Innerhalb des Layouts knnen 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>
     * 
     * @return String
     */
    public String getMailBody() {
        return mailBody;
    }

    /**
     * <p>
     * Mit diesem Parameter kann das Layout des Reports im HTML-Format oder als plain text angegeben
     * werden. Zur Bestimmen des Layouts wird dem Parameter folgender Prefix zugeordnet:
     * 
     * <ul>
     *  <li> factory:</li>
     *  <li> factory_file:</li>
     *  <li> plain:</li>
     *  <li> plain_file:</li>
     * </ul>
     *  
     * Innerhalb des Layouts knnen 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>
     * 
     * @param String
     */
    public void setMailBody(String mailBody) {
        this.mailBody = mailBody;
    }

    /** Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als carbon copy erhalten.
     * Mehrere eMail Adressen werden durch Komma getrennt.     
     * @return String
     * */
    public String getMailCc() {
        return mailCc;
    }

    /** Geben Sie hier eine oder mehrere eMail Adressen an, die den Report als carbon copy erhalten.
     * Mehrere eMail Adressen werden durch Komma getrennt.     
     * @param mailCc - String
     * */
    public void setMailCc(String mailCc) {
        this.mailCc = mailCc;
    }

    /** Der Inhalt des Parameters wird als Betreff der eMail des
     * Reports verwendet und muss ausgefllt sein, wenn Reports per
     * eMail versendet werden. 
     * Zur Bestimmen des Layouts wird dem Parameter folgender Prefix zugeordnet:
     * 
     * <ul>
     *  <li> factory:</li>
     *  <li> factory_file:</li>
     *  <li> plain:</li>
     *  <li> plain_file:</li>
     * </ul>
     * <p>
     *  Es knnen 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>
     *
     *@return String
     */
    public String getMailSubject() {
        return mailSubject;
    }

    /** Der Inhalt des Parameters wird als Betreff der eMail des
     * Reports verwendet und muss ausgefllt sein, wenn Reports per
     * eMail versendet werden. 
     * Zur Bestimmen des Layouts wird dem Parameter folgender Prefix zugeordnet:
     * 
     * <ul>
     *  <li> factory:</li>
     *  <li> factory_file:</li>
     *  <li> plain:</li>
     *  <li> plain_file:</li>
     * </ul>
     * <p>
     *  Es knnen 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>
     *
     *@param String
     */
    public void setMailSubject(String mailsubject) {
        this.mailSubject = mailsubject;
    }

    /** Auslesen 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.
     * @return String 
     * */

    public String getMailTo() {
        return mailTo;
    }

    /**
     * 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.
     * @return mailTo - String*/
    public void setMailTo(String mailTo) {
        this.mailTo = mailTo;
    }

    /** Ist eine mail_it Parameter angegeben bzw auf true gesetzt, dann wird mit
     * der Scheduler Mail Funktion emails versendet. Es wird berprft, ob zustzlich
     * 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 Empfnger aus den Einstellungen
     * des Schedulers (factory.ini) genommen.
     * 
     * @return boolean
     * */
    public boolean isMailIt() {
        return mailIt;
    }

    /** Ist eine mail_it Parameter angegeben bzw auf true gesetzt, dann wird mit
     * der Scheduler Mail Funktion emails versendet. Es wird berprft, ob zustzlich
     * 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 Empfnger aus den Einstellungen
     * des Schedulers (factory.ini) genommen.
     * @param boolean
     * */
    public void setMailIt(boolean mailIt) {
        this.mailIt = mailIt;
    }

    /**
     * Datenbankverbindung holen, wenn Documentfactory printerName von einer anderen Datenbank 
     * ermittelt werden soll.
     * 
     * @return sos.connection.SOSConnection
     * @throws Exception
     */
    private SOSConnection getFactoryConnection() throws Exception {

        SOSConnection factoryConnection = null;
        try {
            spooler_log.debug5("DB Connecting.. .");
            factoryConnection = SOSConnection.createInstance(this.getFactorySettingsFile(),
                    new sos.util.SOSSchedulerLogger(spooler_log));
            factoryConnection.connect();
            spooler_log.debug5("DB Connected");
            return factoryConnection;
        } catch (Exception e) {
            throw new Exception("\n -> ..error occurred in " + SOSClassUtil.getMethodName() + ": " + e);
        }
    }

    /**
     * Ermittelt den Druckername.
     * Entweder der Druckername ist direkt angegeben oder 
     * es wird ber die Druckerid ber die Tabelle Dokumentfactory.LF_PPRINTERS ermittelt, wenn der .   
     * 
     * @throws Exception
     */
    private String getPrinter() throws Exception {

        SOSConnection facConn = null;
        String printName = "";
        String prefix = "";
        try {
            if (this.getPrinterName().toLowerCase().startsWith("factory:")) {
                prefix = "factory";
                printName = getPrinterName().substring("factory:".length());
            } else {
                printName = getPrinterName();
            }

            if (sosString.parseToString(prefix).length() == 0) {
                //druckername ist direkt angegeben
                printName = this.getPrinterName();

            } else {
                //druckername ber die Tabelle Dokumentfactory.LF_PPRINTERS ermittelt.
                if (sosString.parseToString(getFactorySettingsFile()).length() > 0) {
                    facConn = getFactoryConnection();
                } else {
                    facConn = this.getConnection();
                }
                //printName = DocumentFactoryClass.getActiveFactoryPrinter(facConn, printName );
                printName = getActiveFactoryPrinter(facConn, printName);
            }
            spooler_log.debug4("..gedruckt wird auf der Drucker: " + printName + " ");
            return printName;

        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getClassName() + ": " + e);
        } finally {
            if (facConn != null) {
                facConn.rollback();
                facConn.disconnect();
            }
        }
    }

    /**
     * @param sosConnection connection zur Document Factory Datenbank
     * @param queue Name der Print Queue
     * @return Name des Druckers oder Leerstring falls der Drucker nicht gefunden wurde
     * @throws Exception falls Drucker, Queue oder Resource gesperrt ist
     */
    public static String getActiveFactoryPrinter(SOSConnection sosConnection, String queue) throws Exception {
        String rv = "";
        /** Tabelle der Warteschlangen */
        String tableQueues = "LF_QUEUES";
        /** Tabelle der Drucker */
        String tablePrinters = "LF_PRINTERS";
        /** Tabelle der Ressourcen */
        String tableResources = "LF_RESOURCES";

        HashMap printer = sosConnection.getSingle("SELECT d.\"SYSTEM_NAME\", q.\"STATUS\", "
                + "d.\"STATUS\" as \"PRINTER_STATUS\", r.\"STATUS\" as \"RESOURCE_STATUS\" FROM " + tableQueues
                + " q, " + "( " + tablePrinters + " d LEFT OUTER JOIN " + tableResources
                + " r ON d.\"SYSTEM_NAME\"=r.\"RESOURCE_KEY\")" + " WHERE q.\"NAME\"='" + queue
                + "' AND d.\"PRINTER\"=q.\"PRINTER\" AND"
                + " (r.\"RESOURCE\" IS NULL OR r.\"RESOURCE_TYPE\"='printer')");

        if (!printer.isEmpty()) {
            rv = printer.get("system_name").toString();
            String status = printer.get("status").toString();
            if (status.equals("0"))
                throw new Exception("Queue " + queue + " is suspended.");
            String printerStatus = printer.get("printer_status").toString();
            if (printerStatus.equals("0"))
                throw new Exception("Printer " + rv + " is suspended.");
            if (printer.get("resource_status") != null) {
                String resourceStatus = printer.get("resource_status").toString();
                if (resourceStatus.equals("0"))
                    throw new Exception("Resource for printer " + rv + " is suspended.");
            }
        }

        return rv;
    }

    /**
     * Email versenden.
     * 
     * 1. mail_it funktion. Ist eine mail_it Parameter angegeben bzw auf true gesetzt, dann wird mit
     * der Scheduler Mail Funktion emails versendet. Es wird berprft, ob zustzlich
     * die Parameter "mail_to", "mail_cc", "mail_bcc", "mail_subject" und "mail_body" angegeben 
     * sind. Wenn ja, dann werden zu diesen Adressanten emails versendet. 
     * Wenn diese Parametern nicht existieren, dann werden die Empfnger aus den Einstellungen 
     * des Schedulers (factory.ini) genommen. 
     * 
     * Ist der Jobparameter mail_it nicht 
     * vorhanden bzw. als false gesetzt, dann wird der email mit Hilfe der Klasse SOSMailOrder versendet. 
     * Die Voraussetzung zum email versenden mit der Klasse SOSMailOrder ist <br/><br/>
     *   1. Datenbankverbindung ( entweder die Datenbankverbindung des Schedulers oder die Datenbankverbindung des Factorys 
     *      Siehe Parameter factory_settings_file)
     *   2. das Existieren der Tabelle "SETTINGS"
     *   3. Eintrge zum email versenden in der Tabelle "SETTINGS"   
     *  Die Empfnger und der Subject und Body werden aus der Jobparameter ausgelesen. 
     * 
     * @param stateText
     * @throws Exception
     */
    private String sendEmail(String stateText) throws Exception {
        SOSSchedulerLogger sosLogger = null;
        SOSConnection currConn = null;
        String currSubject = "";
        String currBody = "";
        try {
            sosLogger = new SOSSchedulerLogger(this.spooler_log);
            //mail_it Lsung         
            if (isMailIt()) {
                sosLogger.debug("..email sending with mail_it Parameter.");
                //email erzwingen. Einstellungen wie sender/empfnder siehe factory.ini
                //            Sollen attachment mitversendet werden?
                if (!getSuspendAttachment()) {
                    for (int i = 0; i < listOfOutputFilename.size(); i++) {
                        this.spooler_log.mail().add_file(sosString.parseToString(listOfOutputFilename.get(i)));
                    }
                }

                if (sosString.parseToString(getMailSubject()).length() > 0) {
                    currSubject = this.maskFilename(getMailSubject());
                    spooler_log.mail().set_subject(currSubject);
                    sosLogger.debug("..email subject: " + currSubject);
                } else {
                    spooler_log.mail().set_subject("JasperReports: report delivery");
                }

                if (sosString.parseToString(getMailBody()).length() > 0) {
                    currBody = this.maskFilename(getMailBody());
                    spooler_log.mail().set_body(currBody);
                    sosLogger.debug("..email body: " + currBody);
                } else {
                    spooler_log.mail().set_body(stateText);
                }

                if (sosString.parseToString(getMailTo()).length() > 0) {
                    spooler_log.mail().set_to(getMailTo());
                    sosLogger.debug("..email send to: " + getMailTo());
                }

                if (sosString.parseToString(getMailCc()).length() > 0) {
                    spooler_log.mail().set_cc(getMailCc());
                    sosLogger.debug("..email CC send to: " + getMailCc());
                }

                if (sosString.parseToString(getMailBcc()).length() > 0) {
                    spooler_log.mail().set_bcc(getMailBcc());
                    sosLogger.debug("..email BCC send to: " + getMailBcc());
                }

                spooler_log.set_mail_it(true);
                sosLogger.debug("..email successfully send with mail_it Paramater. ");
                return stateText + "..email successfully send. ";
            }
            //ende mail_it Lsung

            //keine emails zum versenden vorhanden
            if ((sosString.parseToString(getMailTo()).length() == 0)
                    && (sosString.parseToString(getMailCc()).length() == 0)
                    && (sosString.parseToString(getMailBcc()).length() == 0)) {
                sosLogger.debug("..there is no Recipient to send email.");
                return stateText;
            }

            SOSConnectionSettings sett = null;
            SOSMailOrder mailOrder = null;
            try {
                if (sosString.parseToString(getFactorySettingsFile()).length() > 0) {
                    sosLogger.debug9(".. get new Connection from " + this.getFactorySettingsFile());
                    currConn = getFactoryConnection();

                } else {
                    currConn = getConnection();
                }
                sett = new SOSConnectionSettings(currConn, "SETTINGS", sosLogger);
                //berprfen, ob die Tabelle Settings vorhanden ist bzw. Eintrge hat.                     
                //java.util.Properties entries = sett.getSection("email", "mail_server");            
                String val = currConn.getSingleValue(
                        "SELECT \"NAME\" FROM SETTINGS WHERE \"APPLICATION\" = 'email' AND \"SECTION\" = 'mail_server' AND \"SECTION\" <> \"NAME\"");
                if (sosString.parseToString(val).length() > 0) {
                    mailOrder = new SOSMailOrder(sett, currConn);
                } else {
                    //mailOrder = new SOSMailOrder(spooler_log.mail().smtp(), this.getConnection());
                    sosLogger.warn("..error could not get application [email] and [mail_server] from SETTINGS ");
                    throw new Exception(
                            "..error could not get application [email] and [mail_server] from SETTINGS ");
                }
            } catch (Exception e) {
                sosLogger.warn("..error could not get application [email] and [mail_server] from SETTINGS "
                        + e.toString());
                throw new Exception("..error could not get application [email] and [mail_server] from SETTINGS "
                        + e.toString());
                //mailOrder = new SOSMailOrder(spooler_log.mail().smtp(), this.getConnection());
            }
            mailOrder.setSOSLogger(sosLogger);
            //subject
            if (sosString.parseToString(this.getMailSubject()).length() > 0) {
                currSubject = this.maskFilename(getMailSubject());
                sosLogger.debug("Mail subject: " + currSubject);
                if (getMailSubject().startsWith("factory:")) {
                    mailOrder.setSubjectTemplateType(SOSMailOrder.TEMPLATE_TYPE_FACTORY);
                    mailOrder.setSubjectTemplate(currSubject.substring("factory:".length()));
                } else if (getMailSubject().startsWith("factory_file:")) {
                    mailOrder.setSubjectTemplateType(SOSMailOrder.TEMPLATE_TYPE_FACTORY_FILE);
                    mailOrder.setSubjectTemplate(currSubject.substring("factory_file:".length()));
                } else if (getMailSubject().startsWith("plain:")) {
                    mailOrder.setSubjectTemplateType(SOSMailOrder.TEMPLATE_TYPE_PLAIN);
                    mailOrder.setSubjectTemplate(currSubject.substring("plain:".length()));
                } else if (getMailSubject().startsWith("plain_file:")) {
                    mailOrder.setSubjectTemplateType(SOSMailOrder.TEMPLATE_TYPE_PLAIN_FILE);
                    mailOrder.setSubjectTemplate(currSubject.substring("plain_file:".length()));
                } else {
                    //mailOrder.setFrom(spooler_log.mail().from());
                    mailOrder.setSOSLogger(sosLogger);
                    mailOrder.setSubject(currSubject);
                }
            }

            if (sosString.parseToString(this.getMailBody()).length() > 0) {
                currBody = this.maskFilename(getMailBody());
                sosLogger.debug("Mail body: " + currBody);
                if (getMailBody().startsWith("factory:")) {
                    mailOrder.setBodyTemplateType(SOSMailOrder.TEMPLATE_TYPE_FACTORY);
                    mailOrder.setBodyTemplate(currBody.substring("factory:".length()));
                } else if (getMailBody().startsWith("factory_file:")) {
                    mailOrder.setBodyTemplateType(SOSMailOrder.TEMPLATE_TYPE_FACTORY_FILE);
                    mailOrder.setBodyTemplate(currBody.substring("factory_file:".length()));
                } else if (getMailBody().startsWith("plain:")) {
                    mailOrder.setBodyTemplateType(SOSMailOrder.TEMPLATE_TYPE_PLAIN);
                    mailOrder.setBodyTemplate(currBody.substring("plain:".length()));
                } else if (getMailBody().startsWith("plain_file:")) {
                    mailOrder.setBodyTemplateType(SOSMailOrder.TEMPLATE_TYPE_PLAIN_FILE);
                    mailOrder.setBodyTemplate(currBody.substring("plain_file:".length()));
                } else {
                    mailOrder.setSOSLogger(sosLogger);
                    mailOrder.setBody(currBody);
                }
            }

            mailOrder.addRecipient(this.getMailTo());

            if (sosString.parseToString(getMailBcc()).length() > 0)
                mailOrder.addBCC(this.getMailBcc());

            if (sosString.parseToString(getMailCc()).length() > 0)
                mailOrder.addCC(this.getMailCc());

            //Sollen attachment mitversendet werden?
            if (!getSuspendAttachment()) {
                for (int i = 0; i < listOfOutputFilename.size(); i++) {
                    mailOrder.addAttachment(sosString.parseToString(listOfOutputFilename.get(i)));
                }
            }

            sosLogger.debug("..replacement job_name = " + this.spooler_task.job().name());
            mailOrder.addReplacement("job_name", this.spooler_task.job().name());

            sosLogger.debug("..replacement job_title = " + this.spooler_task.job().title());
            mailOrder.addReplacement("job_title", this.spooler_task.job().title());

            sosLogger.debug("..replacement state_text = " + stateText);
            mailOrder.addReplacement("state_text", stateText);

            mailOrder.send();

            spooler_log.debug("..email successfully send. ");
            return stateText + "..email successfully send. ";

        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getClassName() + ": " + e);
        } finally {
            if (sosString.parseToString(getFactorySettingsFile()).length() > 0) {
                if (currConn != null) {
                    currConn.rollback();
                    currConn.disconnect();
                }
            }
        }
    }

    /**
     * get job parameters from job configuration (scheduler.xml)
     */
    protected void getJobParameters() throws Exception {

        try { // to fetch default job parameters
            if (sosString.parseToString(spooler_task.params().var("settings_filename")).length() > 0) {
                this.setSettingsFilename(spooler_task.params().var("settings_filename"));
                spooler_log.debug1(".. job parameter [settings_filename]: " + this.getSettingsFilename());
            }

            if (sosString.parseToString(spooler_task.params().var("report_filename")).length() > 0) {
                this.setReportFilename(spooler_task.params().var("report_filename"));
                spooler_log.debug1(".. job parameter [report_filename]: " + this.getReportFilename());
            }

            if (sosString.parseToString(spooler_task.params().var("query_filename")).length() > 0) {
                this.setQueryFilename(spooler_task.params().var("query_filename"));
                spooler_log.debug1(".. job parameter [query_filename]: " + this.getQueryFilename());
            }

            if (sosString.parseToString(spooler_task.params().var("query_statement")).length() > 0) {
                this.setQueryStatement(spooler_task.params().var("query_statement"));
                spooler_log.debug1(".. job parameter [query_statement]: " + this.getQueryStatement());
            }

            if (sosString.parseToString(spooler_task.params().var("output_type")).length() > 0) {
                this.setOutputType(spooler_task.params().var("output_type"));
                spooler_log.debug1(".. job parameter [output_type]: " + this.getOutputType());
            }

            if (sosString.parseToString(spooler_task.params().var("output_filename")).length() > 0) {
                this.setOutputFilename(spooler_task.params().var("output_filename"));
                spooler_log.debug1(".. job parameter [output_filename]: " + this.getOutputFilename());
            }

            /*if (spooler_task.params().var("scheduler_order_report_mailto") != null && spooler_task.params().var("scheduler_order_report_mailto").length() > 0) {
             this.setEmailAddress(spooler_task.params().var("scheduler_order_report_mailto"));
             spooler_log.debug1(".. job parameter [scheduler_order_report_mailto]: " + this.getEmailAddress());
             }*/

            if (sosString.parseToString(spooler_task.params().var("printer_name")).length() > 0) {
                this.setPrinterName(spooler_task.params().var("printer_name"));
                spooler_log.debug1(".. job parameter [printer_name]: " + this.getPrinterName());
            }

            if (sosString.parseToString(spooler_task.params().var("factory_settings_file")).length() > 0) {
                this.setFactorySettingsFile(spooler_task.params().var("factory_settings_file"));
                spooler_log.debug1(".. job parameter [factory_settings_file]: " + this.getFactorySettingsFile());
            }

            if (sosString.parseToString(spooler_task.params().var("mail_it")).length() > 0) {
                this.setMailIt(sosString.parseToBoolean((spooler_task.params().var("mail_it"))));
                spooler_log.debug1(".. job parameter [mail_it]: " + this.isMailIt());
            }

            if (sosString.parseToString(spooler_task.params().var("parameter_query_filename")).length() > 0) {
                this.parameterQueryFilename = sosString
                        .parseToString((spooler_task.params().var("parameter_query_filename")));
                spooler_log.debug1(".. job parameter [parameter_query_filename]: " + parameterQueryFilename);
            }

            if (sosString.parseToString(spooler_task.params().var("printer_copies")).length() > 0) {
                String pc = sosString.parseToString((spooler_task.params().var("printer_copies")));
                if (pc.equals("0")) {
                    spooler_log.warn(".. job parameter [printer_copies] is 0 not in range 1..2147483647 ");
                    throw new Exception(".. job parameter [printer_copies] is 0 not in range 1..2147483647 ");
                }
                //berprfen, ob der Parameter printer_copies ziffern ist
                char c[] = pc.toCharArray();
                for (int i = 0; i < c.length; i++) {
                    if (!(Character.isDigit(c[i]))) {
                        spooler_log.warn(".. job parameter [printer_copies] is not digit: " + pc);
                        throw new Exception(".. job parameter [printer_copies] is not digit: " + pc);
                    }
                }
                this.printerCopies = Integer.parseInt(pc);
                spooler_log.debug1(".. job parameter [printer_copies]: " + printerCopies);
            }

            if (sosString.parseToString(spooler_task.params().var("mail_to")).length() > 0) {
                this.setMailTo(sosString.parseToString((spooler_task.params().var("mail_to"))));
                spooler_log.debug1(".. job parameter [mail_to]: " + this.getMailTo());
            }

            if (sosString.parseToString(spooler_task.params().var("mail_cc")).length() > 0) {
                this.setMailCc(sosString.parseToString((spooler_task.params().var("mail_cc"))));
                spooler_log.debug1(".. job parameter [mail_cc]: " + this.getMailCc());
            }

            if (sosString.parseToString(spooler_task.params().var("mail_bcc")).length() > 0) {
                this.setMailBcc(sosString.parseToString((spooler_task.params().var("mail_bcc"))));
                spooler_log.debug1(".. job parameter [mail_bcc]: " + this.getMailBcc());
            }

            if (sosString.parseToString(spooler_task.params().var("mail_subject")).length() > 0) {
                this.setMailSubject(sosString.parseToString((spooler_task.params().var("mail_subject"))));
                spooler_log.debug1(".. job parameter [mail_subject]: " + this.getMailSubject());
            }

            if (sosString.parseToString(spooler_task.params().var("mail_body")).length() > 0) {
                this.setMailBody(sosString.parseToString((spooler_task.params().var("mail_body"))));
                spooler_log.debug1(".. job parameter [mail_body]: " + this.getMailBody());
            }
            if (sosString.parseToString(spooler_task.params().var("suspend_attachment")).length() > 0) {
                this.setSuspendAttachment(
                        sosString.parseToBoolean((spooler_task.params().var("suspend_attachment"))));
                spooler_log.debug1(".. job parameter [suspend_attachment]: " + this.getSuspendAttachment());
            }
            //Lscht zuerst das alte Bericht, bevor eine neue erstellt wird         
            if (sosString.parseToString(spooler_task.params().var("delete_old_output_file")).length() > 0) {
                this.setDeleteOldFilename(
                        sosString.parseToBoolean((spooler_task.params().var("delete_old_output_file"))));
                spooler_log.debug1(".. job parameter [delete_old_output_file]: " + this.isDeleteOldFilename());
            }

        } catch (Exception e) {
            throw new Exception("..error occurred processing job parameters: " + e.getMessage());
        }
    }

    /**
     * to fetch parameters from orders that have precedence to job parameters
     * @throws Exception
     */
    private void getOrderParameters() throws Exception {
        try {
            if (spooler_task.job().order_queue() != null) {

                order = spooler_task.order();
                //order = createOrderPayload(order);

                // create order payload and xml payload from web service request
                if (order.web_service_operation_or_null() != null) {
                    SOSXMLXPath xpath = null;
                    Web_service_request request = order.web_service_operation().request();

                    // should the request be previously transformed ...
                    if (order.web_service().params().var("request_stylesheet") != null
                            && order.web_service().params().var("request_stylesheet").length() > 0) {
                        Xslt_stylesheet stylesheet = spooler.create_xslt_stylesheet();
                        stylesheet.load_file(order.web_service().params().var("request_stylesheet"));
                        String xml_document = stylesheet.apply_xml(request.string_content());
                        spooler_log.debug3("content of request:\n" + request.string_content());
                        spooler_log.debug3("content of request transformation:\n" + xml_document);

                        xpath = new sos.xml.SOSXMLXPath(new java.lang.StringBuffer(xml_document));
                        // add order parameters from transformed request
                        Variable_set params = spooler.create_variable_set();
                        if (xpath.selectSingleNodeValue("//param[@name[.='settings_filename']]/@value") != null) {
                            params.set_var("settings_filename",
                                    xpath.selectSingleNodeValue("//param[@name[.='settings_filename']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='report_filename']]/@value") != null) {
                            params.set_var("report_filename",
                                    xpath.selectSingleNodeValue("//param[@name[.='report_filename']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='query_filename']]/@value") != null) {
                            params.set_var("query_filename",
                                    xpath.selectSingleNodeValue("//param[@name[.='query_filename']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='query_statement']]/@value") != null) {
                            params.set_var("query_statement",
                                    xpath.selectSingleNodeValue("//param[@name[.='query_statement']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='output_type']]/@value") != null) {
                            params.set_var("output_type",
                                    xpath.selectSingleNodeValue("//param[@name[.='output_type']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='output_filename']]/@value") != null) {
                            params.set_var("output_filename",
                                    xpath.selectSingleNodeValue("//param[@name[.='output_filename']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[@name[.='scheduler_order_report_mailto']]/@value") != null) {
                            params.set_var("scheduler_order_report_mailto", xpath.selectSingleNodeValue(
                                    "//param[@name[.='scheduler_order_report_mailto']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[@name[.='scheduler_order_report_printer_id']]/@value") != null) {
                            params.set_var("scheduler_order_report_printer_id", xpath.selectSingleNodeValue(
                                    "//param[@name[.='scheduler_order_report_printer_id']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='printer_name']]/@value") != null) {
                            params.set_var("printer_name",
                                    xpath.selectSingleNodeValue("//param[@name[.='printer_name']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[@name[.='factory_settings_file']]/@value") != null) {
                            params.set_var("factory_settings_file", xpath
                                    .selectSingleNodeValue("//param[@name[.='factory_settings_file']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[@name[.='parameter_query_filename']]/@value") != null) {
                            params.set_var("parameter_query_filename", xpath
                                    .selectSingleNodeValue("//param[@name[.='parameter_query_filename']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='printer_copies']]/@value") != null) {
                            params.set_var("printer_copies",
                                    xpath.selectSingleNodeValue("//param[@name[.='printer_copies']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_it']]/@value") != null) {
                            params.set_var("mail_it",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_it']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_to']]/@value") != null) {
                            params.set_var("mail_to",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_to']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_cc']]/@value") != null) {
                            params.set_var("mail_cc",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_cc']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_bcc']]/@value") != null) {
                            params.set_var("mail_bcc",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_bcc']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_subject']]/@value") != null) {
                            params.set_var("mail_subject",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_subject']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='mail_body']]/@value") != null) {
                            params.set_var("mail_body",
                                    xpath.selectSingleNodeValue("//param[@name[.='mail_body']]/@value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[@name[.='suspend_attachment']]/@value") != null) {
                            params.set_var("suspend_attachment",
                                    xpath.selectSingleNodeValue("//param[@name[.='suspend_attachment']]/@value"));
                        }
                        //                  Lscht zuerst das alte Bericht, bevor eine neue erstellt wird
                        if (xpath.selectSingleNodeValue(
                                "//param[@name[.='delete_old_output_file']]/@value") != null) {
                            params.set_var("delete_old_output_file", xpath
                                    .selectSingleNodeValue("//param[@name[.='delete_old_output_file']]/@value"));
                        }

                        order.set_payload(params);
                    } else {
                        xpath = new sos.xml.SOSXMLXPath(new java.lang.StringBuffer(request.string_content()));
                        // add order parameters from request
                        Variable_set params = spooler.create_variable_set();
                        if (xpath
                                .selectSingleNodeValue("//param[name[text()='settings_filename']]/value") != null) {
                            params.set_var("settings_filename",
                                    xpath.selectSingleNodeValue("//param[name[text()='settings_filename']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='report_filename']]/value") != null) {
                            params.set_var("report_filename",
                                    xpath.selectSingleNodeValue("//param[name[text()='report_filename']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='query_filename']]/value") != null) {
                            params.set_var("query_filename",
                                    xpath.selectSingleNodeValue("//param[name[text()='query_filename']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='query_statement']]/value") != null) {
                            params.set_var("query_statement",
                                    xpath.selectSingleNodeValue("//param[name[text()='query_statement']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='output_type']]/value") != null) {
                            params.set_var("output_filename",
                                    xpath.selectSingleNodeValue("//param[name[text()='output_type']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='output_filename']]/value") != null) {
                            params.set_var("output_filename",
                                    xpath.selectSingleNodeValue("//param[name[text()='output_filename']]/value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='scheduler_order_report_mailto']]/value") != null) {
                            params.set_var("scheduler_order_report_mailto", xpath.selectSingleNodeValue(
                                    "//param[name[text()='scheduler_order_report_mailto']]/value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='scheduler_order_report_printer_id']]/value") != null) {
                            params.set_var("scheduler_order_report_printer_id", xpath.selectSingleNodeValue(
                                    "//param[name[text()='scheduler_order_report_printer_id']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='printer_name']]/value") != null) {
                            params.set_var("printer_name",
                                    xpath.selectSingleNodeValue("//param[name[text()='printer_name']]/value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='factory_settings_file']]/value") != null) {
                            params.set_var("factory_settings_file", xpath
                                    .selectSingleNodeValue("//param[name[text()='factory_settings_file']]/value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='parameter_query_filename']]/value") != null) {
                            params.set_var("parameter_query_filename", xpath.selectSingleNodeValue(
                                    "//param[name[text()='parameter_query_filename']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='printer_copies']]/value") != null) {
                            params.set_var("printer_copies",
                                    xpath.selectSingleNodeValue("//param[name[text()='printer_copies']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_it']]/value") != null) {
                            params.set_var("mail_it",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_it']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_to']]/value") != null) {
                            params.set_var("mail_to",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_to']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_cc']]/value") != null) {
                            params.set_var("mail_cc",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_cc']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_bcc']]/value") != null) {
                            params.set_var("mail_bcc",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_bcc']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_subject']]/value") != null) {
                            params.set_var("mail_subject",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_subject']]/value"));
                        }
                        if (xpath.selectSingleNodeValue("//param[name[text()='mail_body']]/value") != null) {
                            params.set_var("mail_body",
                                    xpath.selectSingleNodeValue("//param[name[text()='mail_body']]/value"));
                        }
                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='suspend_attachment']]/value") != null) {
                            params.set_var("suspend_attachment", xpath
                                    .selectSingleNodeValue("//param[name[text()='suspend_attachment']]/value"));
                        }

                        if (xpath.selectSingleNodeValue(
                                "//param[name[text()='delete_old_output_file']]/value") != null) {
                            params.set_var("delete_old_output_file", xpath
                                    .selectSingleNodeValue("//param[name[text()='delete_old_output_file']]/value"));
                        }

                        order.set_payload(params);
                    }

                }

                orderData = (Variable_set) order.payload();
                if (orderData != null && orderData.var("settings_filename") != null
                        && orderData.var("settings_filename").toString().length() > 0) {
                    this.setSettingsFilename(orderData.var("settings_filename").toString());
                    spooler_log.debug1(".. order parameter [settings_filename]: " + this.getSettingsFilename());
                }
                if (orderData != null && orderData.var("report_filename") != null
                        && orderData.var("report_filename").toString().length() > 0) {
                    this.setReportFilename(orderData.var("report_filename").toString());
                    spooler_log.debug1(".. order parameter [report_filename]: " + this.getReportFilename());
                }
                if (orderData != null && orderData.var("query_filename") != null
                        && orderData.var("query_filename").toString().length() > 0) {
                    this.setQueryFilename(orderData.var("query_filename").toString());
                    spooler_log.debug1(".. order parameter [query_filename]: " + this.getQueryFilename());
                }
                if (orderData != null && orderData.var("query_statement") != null
                        && orderData.var("query_statement").toString().length() > 0) {
                    this.setQueryStatement(orderData.var("query_statement").toString());
                    spooler_log.debug1(".. order parameter [query_statement]: " + this.getQueryStatement());
                }

                if (orderData != null && orderData.var("output_type") != null
                        && orderData.var("output_type").toString().length() > 0) {
                    this.setOutputType(orderData.var("output_type").toString());
                    spooler_log.debug1(".. order parameter [output_type]: " + this.getOutputType());
                }
                if (orderData != null && orderData.var("output_filename") != null
                        && orderData.var("output_filename").toString().length() > 0) {
                    this.setOutputFilename(orderData.var("output_filename").toString());
                    spooler_log.debug1(".. order parameter [output_filename]: " + this.getOutputFilename());
                }
                /*if ( orderData != null && orderData.var("scheduler_order_report_mailto") != null && orderData.var("scheduler_order_report_mailto").toString().length() > 0) {
                 this.setEmailAddress(orderData.var("scheduler_order_report_mailto").toString());
                 spooler_log.debug1(".. order parameter [scheduler_order_report_mailto]: " + this.getEmailAddress());
                 }*/

                if (orderData != null && orderData.var("printer_name") != null
                        && orderData.var("printer_name").toString().length() > 0) {
                    this.setPrinterName(orderData.var("printer_name").toString());
                    spooler_log.debug1(".. order parameter [printer_name]: " + this.getPrinterName());
                }
                if (orderData != null && orderData.var("factory_settings_file") != null
                        && orderData.var("factory_settings_file").toString().length() > 0) {
                    this.setFactorySettingsFile(orderData.var("factory_settings_file").toString());
                    spooler_log
                            .debug1(".. order parameter [factory_settings_file]: " + this.getFactorySettingsFile());
                }
                if (orderData != null && orderData.var("parameter_query_filename") != null
                        && orderData.var("parameter_query_filename").toString().length() > 0) {
                    this.parameterQueryFilename = this.sosString
                            .parseToString((orderData.var("parameter_query_filename")));
                    spooler_log.debug1(".. order parameter [parameter_query_filename]: " + parameterQueryFilename);
                }
                if (orderData != null && orderData.var("printer_copies") != null
                        && orderData.var("printer_copies").toString().length() > 0) {
                    this.setPrinterCopies(
                            Integer.parseInt(this.sosString.parseToString((orderData.var("printer_copies")))));
                    spooler_log.debug1(".. order parameter [printer_copies]: " + this.getPrinterCopies());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_it")).length() > 0) {
                    this.setMailIt(sosString.parseToBoolean((orderData.var("mail_it"))));
                    spooler_log.debug1(".. order parameter [mail_it]: " + this.isMailIt());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_to")).length() > 0) {
                    this.setMailTo(sosString.parseToString((orderData.var("mail_to"))));
                    spooler_log.debug1(".. order parameter [mail_to]: " + this.getMailTo());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_cc")).length() > 0) {
                    this.setMailCc(sosString.parseToString((orderData.var("mail_cc"))));
                    spooler_log.debug1(".. order parameter [mail_cc]: " + this.getMailCc());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_bcc")).length() > 0) {
                    this.setMailBcc(sosString.parseToString((orderData.var("mail_bcc"))));
                    spooler_log.debug1(".. order parameter [mail_bcc]: " + this.getMailBcc());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_subject")).length() > 0) {
                    this.setMailSubject(sosString.parseToString((orderData.var("mail_subject"))));
                    spooler_log.debug1(".. order parameter [mail_subject]: " + this.getMailSubject());
                }
                if (orderData != null && sosString.parseToString(orderData.var("mail_body")).length() > 0) {
                    this.setMailBody(sosString.parseToString((orderData.var("mail_body"))));
                    spooler_log.debug1(".. order parameter [mail_body]: " + this.getMailBody());
                }
                if (orderData != null
                        && sosString.parseToString(orderData.var("suspend_attachment")).length() > 0) {
                    this.setSuspendAttachment(sosString.parseToBoolean((orderData.var("suspend_attachment"))));
                    spooler_log.debug1(".. order parameter [suspend_attachment]: " + this.getSuspendAttachment());
                }

                if (orderData != null
                        && sosString.parseToString(orderData.var("delete_old_output_file")).length() > 0) {
                    this.setDeleteOldFilename(sosString.parseToBoolean((orderData.var("delete_old_output_file"))));
                    spooler_log
                            .debug1(".. order parameter [delete_old_output_file]: " + this.isDeleteOldFilename());
                }
            }
        } catch (Exception e) {
            throw new Exception("error occurred processing parameters: " + e.toString());
        }
    }

    /**
     * Angabe der Pflichtfelder/-parameter berprfen.
     * 
     * @throws Exception
     */
    private void checkParams() throws Exception {
        try {
            if (this.getReportFilename() == null || this.getReportFilename().length() == 0)
                throw new Exception("no report filename was given");
            if (this.getOutputType() == null || this.getOutputType().length() == 0)
                throw new Exception("no output type [pdf, html, xml, xls, rtf] was given");
            if (!isValidOutputType()) {
                throw new Exception("unsupported output type [pdf, htm, xml, xls, rtf]: " + this.getOutputType());
            }
            if (sosString.parseToString(this.queryFilename).length() > 0
                    && sosString.parseToString(this.queryStatement).length() > 0) {
                throw new Exception("to many parameter [query_filename] and [query_statement]");
            }
        } catch (Exception e) {
            throw new Exception("error occurred checking parameters: " + e.toString());
        }
    }

    public String getQueryStatement() {
        return queryStatement;
    }

    public void setQueryStatement(String queryStatement) {
        this.queryStatement = queryStatement;
    }

    public boolean getSuspendAttachment() {
        return suspendAttachment;
    }

    public void setSuspendAttachment(boolean suspendAttachment) {
        this.suspendAttachment = suspendAttachment;
    }

    /**
     * neu initialisieren der Variablen
     * @throws Exception
     */
    private void init() throws Exception {
        try {
            settingsFilename = "";
            reportFilename = "";
            queryFilename = "";
            outputType = "pdf";
            outputFilename = "";
            printerName = "";
            factorySettingsFile = "";
            sosString = new SOSString();
            filledReportFile = null;
            listOfOutputFilename = null;
            parameterQueryFilename = "";
            order = null;
            orderData = null;
            printerCopies = 1;
            mailIt = false;
            mailTo = "";
            mailCc = "";
            mailBcc = "";
            mailSubject = "";
            mailBody = "";
            queryStatement = "";
            suspendAttachment = false;

        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getMethodName() + " :" + e);
        }
    }

    private String maskFilename(String filename) throws Exception {

        String targetFilename = filename;
        try {

            // check for a date format string given in the file mask
            if (targetFilename.matches("(.*)(\\[date\\:)([^\\]]+)(\\])(.*)")) {
                int posBegin = targetFilename.indexOf("[date:");
                if (posBegin > -1) {
                    int posEnd = targetFilename.indexOf("]", posBegin + 6);
                    if (posEnd > -1) {
                        targetFilename = ((posBegin > 0) ? targetFilename.substring(0, posBegin) : "")
                                + SOSDate.getCurrentTimeAsString(targetFilename.substring(posBegin + 6, posEnd))
                                + ((targetFilename.length() > posEnd) ? targetFilename.substring(posEnd + 1) : "");
                    }
                }
            }
            //         liefert das letzte Monat in der Form MM-YYYY
            if (targetFilename.indexOf("[lastmonth]") > -1) {
                String lastMonth_ = SOSDate
                        .getDateAsString(getLastMonth(SOSDate.getCurrentTimeAsString("dd-MM-yyyy")), "MM-yyyy");
                targetFilename = targetFilename.replaceAll("\\[lastmonth\\]", lastMonth_);
            }

            // should any opening and closing brackets be found in the file name, then this is an error
            Matcher m = Pattern.compile("\\[[^\\]]*\\]").matcher(targetFilename);
            if (m.find())
                throw new Exception("unsupported file mask found:" + m.group());

            spooler_log.debug(filename + " mask in " + targetFilename);

            return targetFilename;
        } catch (Exception e) {
            throw new Exception("..error in " + SOSClassUtil.getMethodName() + " : " + e.getMessage());
        }
    }

    private Date getLastMonth(String MMyy) throws Exception {
        try {
            Date d = SOSDate.getDate(MMyy, "dd-MM-yy");

            //Date d = SOSDate.getDate("112007", "MMyy");

            Calendar cal = Calendar.getInstance();
            cal.setTime(d);

            //System.out.println("..get the last day of the month " + new java.text.SimpleDateFormat("MMMM yyyy").format( cal.getTime()) );
            cal.add(cal.MONTH, -1); // add one month
            //cal.set(Calendar.DAY_OF_MONTH, 1);       // set the date to the 1st of the month
            //cal.add(Calendar.DAY_OF_MONTH, 1);     // go one day back
            //System.out.println("... is " + cal.get(Calendar.DAY_OF_MONTH) );
            //Date s = SOSDate.getDate(cal.get(Calendar.DAY_OF_MONTH) + "0212", "ddMMyy");
            Date s = cal.getTime();
            return s;

        } catch (Exception e) {
            throw e;
        }
    }

    public boolean isDeleteOldFilename() {
        return deleteOldFilename;
    }

    public void setDeleteOldFilename(boolean deleteOldFilename) {
        this.deleteOldFilename = deleteOldFilename;
    }

}