Files
apollinare-catering-software/docs/packages/XLIB_JASPERREPORTS.md
2025-12-17 13:02:12 +01:00

32 KiB

XLIB_JASPERREPORTS

Package Specification

PACKAGE "XLIB_JASPERREPORTS"
AS
/*=========================================================================
  Purpose  :

  License  : Copyright (c) 2010 Dietmar Aust (opal-consulting.de)
             Licensed under a BSD style license (license.txt)
             http://www.opal-consulting.de/pls/apex/f?p=20090928:14

  $LastChangedDate: 2018-09-30 09:00:44 +0200 (So, 30 Sep 2018) $
  $LastChangedBy: dietmar.aust $

  Version  Date        Author          Comment
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           06.01.2010  D. Aust   Initial creation
           06.05.2011  D. Aust   added constants for xlsx and docx
           05.08.2012  D. Aust   added version 2.0.0 features:
                                 - direct printing
                                 - save file on server
           11.05.2013  D. Aust   added support for tunneling images for html
                                   exports only
  2.3.0.0  19.05.2014  D. Aust   - #294 - Fix chunked encoding problem in
                                     xlib_http.get_report
                                 - added version information to this package
  2.4.0.0  15.10.2017  D. Aust   FEATURE: #3941 - Support for timeZones
                                 (report parameter REPORT_TIME_ZONE)
  2.5.0.0  29.09.2018  D. Aust   FEATURE: #9 - Ability to set Printjob name (programmatically)
  2.5.0.1  30.09.2018  D. Aust     fix bool2string issue
  2.6.1    01.10.2020  D. Aust   add get_default_configuration() and set_default_configuration()
  2.6.2    13.10.2020  D. Aust   #54 - Timeout value from default table not working

=========================================================================*/

  -- version of this package
  version_c constant varchar2(20 char) := '2.6.2';

   -- constants
   -- supported formats
   c_rep_format_pdf    CONSTANT VARCHAR2 (20) := 'pdf';
   c_rep_format_rtf    CONSTANT VARCHAR2 (20) := 'rtf';
   c_rep_format_xls    CONSTANT VARCHAR2 (20) := 'xls';
   c_rep_format_html   constant varchar2 (20) := 'html';
   c_rep_format_html2   CONSTANT VARCHAR2 (20) := 'html2';
   c_rep_format_csv    CONSTANT VARCHAR2 (20) := 'csv';
   c_rep_format_docx    CONSTANT VARCHAR2 (20) := 'docx';
   c_rep_format_pptx    CONSTANT VARCHAR2 (20) := 'pptx';
   c_rep_format_xlsx    CONSTANT VARCHAR2 (20) := 'xlsx';

   -- images uri
   --c_images_uri_tunnel constant varchar2(100 char)
   --       := 'xlib_jasperreports_img.get_image?p_url=#REPORT_URL#&p_image=';
   -- #IMAGE_NAME# and #J2EE_CONTEXT# will be substituted on the J2EE server side
   m_jri_cookie_name_c      CONSTANT VARCHAR2 (50) := 'JRI_SESSIONID';
   m_jri_path_cookie_name_c CONSTANT VARCHAR2 (50) := 'JRI_PATH';
   c_images_uri_tunnel constant varchar2(500 char) := 'wwv_flow.show?p_request=APPLICATION_PROCESS%3DJRI_SHOW_IMAGE&p_flow_id=#APP_ID#&p_flow_step_id=0&p_instance=#APP_SESSION#&x01=#IMAGE_NAME#';
   c_images_uri_no_tunnel constant varchar2(500 char) := '#J2EE_CONTEXT_PATH#/report_image?image=#IMAGE_NAME#';

   -- exceptions
   report_url_not_defined       EXCEPTION;

----------------------------------------------------------------------------
-- sets the url for the report server for all requests in the
-- current session
----------------------------------------------------------------------------
   PROCEDURE set_report_url (p_report_url IN VARCHAR2);

   FUNCTION get_report_url
      RETURN VARCHAR2;

----------------------------------------------------------------------------
-- set the image uri for html reports only!
----------------------------------------------------------------------------
   PROCEDURE set_images_uri (p_images_uri IN VARCHAR2 default null);
   procedure use_images_no_tunnel (p_server_uri in varchar2 default null, p_cookie_path varchar2 default null);
   function get_use_images_no_tunnel return boolean;

   FUNCTION get_images_uri
      return varchar2;
   FUNCTION get_cookie_path_no_tunnel
      RETURN VARCHAR2;


/**  make a callout with utl_http to the j2ee container running the
 *   JasperReportsIntegration web application
 *   => return the results
 *
 * @param p_rep_name      name of the report (needs a name.jasper file deployed on the server)
 * @param p_rep_format    report format, e.g. pdf, rtf, etc, see constants
 * @param p_data_source   data source name, needs to be configured in J2EE application
 * @param p_out_filename  filename if the file should be downloaded
 * @param p_rep_locale    report locale setting, e.g. de_DE or en_US
 * @param p_rep_encoding  encoding, e.g. UTF-8
 * @param p_additional_params additional parameters, e.g.: p1=1&p2=2
 * @param p_print_is_enabled shall the report be sent to the printer directly?
 * @param p_print_printer_name  name or substring of printer name
 * @param p_print_media   media used, either the paper size or the tray
 * @param p_print_copies  number of copies to be printed
 * @param p_print_duplex  duplex printing?
 * @param p_print_collate sorting the print output?
 * @param p_save_is_enabled shall the generated file be saved on the server?
 * @param p_rep_time_zone "time zone" parameter for the execution of the report,
                          a list of valid entries can be found here:
                          https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
                          E.g.: Europe/Berlin, UCT, US/Central, US/Pacific,
                          Etc/Greenwich, Europe/London
 * @param p_save_filename filename for the file to be saved on the server
 * @param p_print_job_name name of the print job name, by default it uses: JasperReports - <report name>
 *
 */
   PROCEDURE show_report (
      p_rep_name            IN   VARCHAR2 DEFAULT 'test',
      p_rep_format          IN   VARCHAR2 DEFAULT c_rep_format_pdf,
      p_data_source         IN   VARCHAR2 DEFAULT 'default',
      p_out_filename        IN   VARCHAR2 DEFAULT NULL,
      p_rep_locale          in   varchar2 default 'de_DE',
      p_rep_encoding        in   varchar2 default 'UTF-8',
      p_additional_params   in   varchar2 default null,
      p_print_is_enabled    in   boolean default false,
      p_print_printer_name  in   varchar2 default null,
      p_print_media         in   varchar2 default null,
      p_print_copies        in   number default 1,
      p_print_duplex        in   boolean default false,
      p_print_collate       in   boolean default false,
      p_save_is_enabled     in   boolean default false,
      p_save_filename       in   varchar2 default null,
      p_rep_time_zone       in   varchar2 default null,
      p_print_job_name      in   varchar2 default null
   );

   /* tunnels images for html reports */
   procedure show_image(p_image_name IN   VARCHAR2);


/**  run the report and return the result as a blob
 *
 * @param p_rep_name      name of the report (needs a name.jasper file deployed on the server)
 * @param p_rep_format    report format, e.g. pdf, rtf, etc, see constants
 * @param p_data_source   data source name, needs to be configured in J2EE application
 * @param p_out_filename  filename if the file should be downloaded
 * @param p_rep_locale    report locale setting, e.g. de_DE or en_US
 * @param p_rep_encoding  encoding, e.g. UTF-8
 * @param p_additional_params additional parameters, e.g.: p1=1&p2=2
 * @param p_print_is_enabled shall the report be sent to the printer directly?
 * @param p_print_printer_name  name or substring of printer name
 * @param p_print_media   media used, either the paper size or the tray
 * @param p_print_copies  number of copies to be printed
 * @param p_print_duplex  duplex printing?
 * @param p_print_collate sorting the print output?
 * @param p_save_is_enabled shall the generated file be saved on the server?
 * @param p_save_filename filename for the file to be saved on the server
 * @param p_rep_time_zone "time zone" parameter for the execution of the report,
                          a list of valid entries can be found here:
                          https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
                          E.g.: Europe/Berlin, UCT, US/Central, US/Pacific,
                          Etc/Greenwich, Europe/London
 * @param p_out_blob      the blob will be returned here
 * @param p_out_mime_type the proper mime type of the generated file
 * @param p_print_job_name name of the print job name, by default it uses: JasperReports - <report name>
 *
 */
   PROCEDURE get_report (
      p_rep_name            IN   VARCHAR2 DEFAULT 'test',
      p_rep_format          in   varchar2 default c_rep_format_pdf,
      p_data_source         IN   VARCHAR2 DEFAULT 'default',
      p_rep_locale          in   varchar2 default 'de_DE',
      p_rep_encoding        IN   VARCHAR2 DEFAULT 'UTF-8',
      p_additional_params   in   varchar2 default null,
      p_print_is_enabled    in   boolean default  false,
      p_print_printer_name  in   varchar2 default null,
      p_print_media         in   varchar2 default null,
      p_print_copies        in   number default 1,
      p_print_duplex        in   boolean default false,
      p_print_collate       in   boolean default false,
      p_save_is_enabled     in   boolean default false,
      p_save_filename       in   varchar2 default null,
      p_rep_time_zone       in   varchar2 default null,
      p_out_blob            IN OUT   BLOB,
      p_out_mime_type       IN OUT   VARCHAR2,
      p_print_job_name      in   varchar2 default null
   );

----------------------------------------------------------------------------
-- get default configuration
----------------------------------------------------------------------------
   FUNCTION get_default_configuration
      return xlib_jasperreports_conf%rowtype;

----------------------------------------------------------------------------
-- set default configuration
----------------------------------------------------------------------------
    PROCEDURE set_default_configuration(p_conf in out xlib_jasperreports_conf%rowtype);

    PROCEDURE set_default_configuration (
    p_protocol                IN xlib_jasperreports_conf.conf_protocol%TYPE default 'http',
    p_server                  IN xlib_jasperreports_conf.conf_server%TYPE default 'localhost',
    p_port                    IN xlib_jasperreports_conf.conf_port%TYPE default '80',
    p_context_path            IN xlib_jasperreports_conf.conf_context_path%TYPE default 'jri',
    p_wallet_path             IN xlib_jasperreports_conf.conf_wallet_path%TYPE default null,
    p_wallet_pwd              IN xlib_jasperreports_conf.conf_wallet_pwd%TYPE default null,
    p_http_transfer_timeout   IN xlib_jasperreports_conf.conf_http_transfer_timeout%TYPE default 60);


END;```

## Package Body

```sql
PACKAGE BODY "XLIB_JASPERREPORTS"
AS
/*=========================================================================
  Purpose  :

  License  : Copyright (c) 2010 Dietmar Aust (opal-consulting.de)
             Licensed under a BSD style license (license.txt)
             http://www.opal-consulting.de/pls/apex/f?p=20090928:14

  $LastChangedDate: 2018-09-30 09:00:44 +0200 (So, 30 Sep 2018) $
  $LastChangedBy: dietmar.aust $

  Version  Date        Author          Comment
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           06.01.2010  D. Aust   Initial creation
           06.05.2011  D. Aust   added constants for xlsx and docx
           05.08.2012  D. Aust   added version 2.0.0 features:
                                 - direct printing
                                 - save file on server
           11.05.2013  D. Aust   added support for tunneling images for html
                                   exports only
  2.3.0.0  19.05.2014  D. Aust   - #294 - Fix chunked encoding problem in
                                     xlib_http.get_report
                                 - added version information to this package
  2.4.0.0  15.10.2017  D. Aust   FEATURE: #3941 - Support for timeZones
                                 (report parameter REPORT_TIME_ZONE)
  2.5.0.0  29.09.2018  D. Aust   FEATURE: #9 - Ability to set Printjob name (programmatically)
  2.5.0.1  30.09.2018  D. Aust     fix bool2string issue
  2.6.1    01.10.2020  D. Aust   add get_default_configuration() and set_default_configuration()
  2.6.2    13.10.2020  D. Aust   #54 - Timeout value from default table not working

=========================================================================*/


   m_module       constant varchar2 (100) := $$plsql_unit;
   m_report_url   VARCHAR2 (32767) := NULL;
   m_images_uri   VARCHAR2 (32767) := NULL;
   m_use_images_no_tunnel boolean := false;
   m_cookie_path_no_tunnel varchar2(200 char) := null;

   -- convert boolean to 'true' or 'false'
   FUNCTION bool2string (b IN BOOLEAN)
      RETURN VARCHAR2
   IS
   BEGIN
      IF b
      THEN
         RETURN 'true';
      ELSE
         RETURN 'false';
      END IF;
   END;

    procedure setup_configuration_defaults
    is
      l_conf xlib_jasperreports_conf%rowtype;
      l_timeout PLS_INTEGER;
    begin
        l_conf := get_default_configuration();

        -- override report url if not defined
        if m_report_url is null then
          m_report_url := l_conf.conf_protocol || '://'||l_conf.conf_server||':'||l_conf.conf_port||'/'||l_conf.conf_context_path||'/report';
          xlog(p_module => m_module, p_msg => 'Override report url from defaults: '|| m_report_url, p_type=> 'DEBUG');
        end if;

        -- set wallet path and pwd
        -- will ALWAYS override the settings, will ignore previous calls to set_wallet
        -- at least we check whether the config table has an entry for the wallet or not.
        -- thus it could work relying on the wallet set by APEX through the internal workspace! :)
        if lower(m_report_url) like 'https%' and l_conf.conf_wallet_path is not null then
            utl_http.set_wallet(l_conf.conf_wallet_path, l_conf.conf_wallet_pwd);
            xlog(p_module => m_module, p_msg => 'Override wallet location/pwd from defaults', p_type=> 'DEBUG');
        end if;

        -- override http transfer timeout it not defined
        utl_http.get_transfer_timeout( timeout => l_timeout );
        --xlog(p_module => m_module, p_msg => 'Current setting of transfer_timeout: '||l_timeout, p_type=> 'DEBUG');
        if (l_timeout is null or l_timeout=60 /*60 is the default*/) then
            utl_http.set_transfer_timeout(l_conf.conf_http_transfer_timeout);
            xlog(p_module => m_module, p_msg => 'Override http transfer timeout ('||l_timeout||'s) from defaults: '|| l_conf.conf_http_transfer_timeout ||'s', p_type=> 'DEBUG');
        end if;

    end;

   PROCEDURE dump_all_cookies
   IS
      l_proc       VARCHAR2 (100) := m_module || '.dump_all_cookies';
      l_name_arr   OWA_COOKIE.vc_arr;
      l_vals_arr   OWA_COOKIE.vc_arr;
      l_vals_ret   INTEGER;
   BEGIN
      xlog (l_proc, 'start');
      OWA_COOKIE.get_all (names => l_name_arr, vals => l_vals_arr, num_vals => l_vals_ret);

      xlog (l_proc, '#num of cookies: ' || l_vals_ret);

      FOR i IN 1 .. l_name_arr.COUNT
      LOOP
         xlog (l_proc, i || ':' || l_name_arr (i) || '=' || l_vals_arr (i));
      END LOOP;

      xlog (l_proc, 'end');
   END;

   ----------------------------------------------------------------------------
   -- sets the url for the report server for all requests in the
   -- current session
   ----------------------------------------------------------------------------
   PROCEDURE set_report_url (p_report_url IN VARCHAR2)
   IS
   BEGIN
      xlog ('set_report_url:', p_report_url);
      m_report_url := p_report_url;
   END;

   FUNCTION get_report_url
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN m_report_url;
   END;

   ----------------------------------------------------------------------------
   -- sets the images_uri only for http reports!
   ----------------------------------------------------------------------------
   PROCEDURE set_images_uri (p_images_uri IN VARCHAR2)
   IS
   BEGIN
      m_images_uri := p_images_uri;
   END;

   /* use the images from the application server when both /ords and /jri are
      installed on the same application server

      the p_server_uri parameter is rarely used, only when they are not run on the same application server
      and the uri differs. But that comes with a lot of CORS and other cookie issues.
    */
   procedure use_images_no_tunnel (p_server_uri in varchar2 default null, p_cookie_path varchar2 default null)
   is
   begin
     m_use_images_no_tunnel := true;
     m_cookie_path_no_tunnel := p_cookie_path;

     -- the placeholders #J2EE_CONTEXT_PATH# and #IMAGE_NAME# will be replaced
     -- inside the J2EE application with the current values of the deployment
     set_images_uri( p_images_uri => p_server_uri || '#J2EE_CONTEXT_PATH#/report_image?image=#IMAGE_NAME#');
   end;

   function get_use_images_no_tunnel return boolean
   is
   begin
     return m_use_images_no_tunnel;
   end;

    FUNCTION get_cookie_path_no_tunnel
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN m_cookie_path_no_tunnel;
   END;


   FUNCTION get_images_uri
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN m_images_uri;
   END;

   FUNCTION compute_images_uri_tunnel
      RETURN VARCHAR2
   IS
      l_uri   VARCHAR2 (32767 CHAR);
   BEGIN
      --l_uri := sys_context( 'userenv', 'current_schema' )
      --                                  || '.' || c_images_uri_tunnel;

      /*
          c_images_uri_tunnel
              :='xlib_jasperreports_img.get_image?p_url=#REPORT_URL#&p_image=';
       */

      --l_uri := replace(l_uri, '#REPORT_URL#', APEX_UTIL.URL_ENCODE(m_report_url));
      --l_uri := replace(l_uri, '#REPORT_URL#', m_report_url);

      --   c_images_uri_tunnel constant varchar2(100 char) := 'wwv_flow.show?p_request=APPLICATION_PROCESS%3DJRI_SHOW_IMAGE&p_flow_id=#APP_ID#&p_flow_step_id=0&p_instance=#APP_SESSION#&x01=#IMG_NAME#';
      l_uri := c_images_uri_tunnel;
      l_uri := REPLACE (l_uri, '#APP_ID#', v ('APP_ID'));
      l_uri := REPLACE (l_uri, '#APP_SESSION#', v ('APP_SESSION'));

      xlog ('compute tunnel', l_uri);

      RETURN l_uri;
   END;

   ----------------------------------------------------------------------------
   -- displays an image for html reports
   ----------------------------------------------------------------------------
   PROCEDURE show_image (p_image_name IN VARCHAR2)
   IS
      l_proc               VARCHAR2 (100) := m_module || '.show_image';
      l_url                VARCHAR2 (32767);

      l_header_name_arr    xlib_http.vc_arr_t;
      l_header_value_arr   xlib_http.vc_arr_t;

      PROCEDURE get_headers_to_pass2j2ee (p_header_name_arr    OUT xlib_http.vc_arr_t,
                                          p_header_value_arr   OUT xlib_http.vc_arr_t)
      IS
         l_proc                 VARCHAR2 (100) := m_module || '.get_headers_to_pass2j2ee';
         jsession_cookie        OWA_COOKIE.cookie;
         jsession_path_cookie   OWA_COOKIE.cookie;
      BEGIN
         jsession_cookie := OWA_COOKIE.get (name => m_jri_cookie_name_c);
         jsession_path_cookie := OWA_COOKIE.get (name => m_jri_path_cookie_name_c);

         xlog (l_proc, 'show jsession_id and path: ');
         xlog (l_proc, jsession_cookie.vals (1));
         xlog (l_proc, jsession_path_cookie.vals (1));


         p_header_name_arr (p_header_name_arr.COUNT + 1) := 'Cookie';
         p_header_value_arr (p_header_value_arr.COUNT + 1) :=
            'JSESSIONID=' || jsession_cookie.vals (1) || ';Path=' || jsession_path_cookie.vals (1);
      --xlog(l_proc, 'end');
      EXCEPTION
         WHEN OTHERS
         THEN
            xlog (l_proc, DBMS_UTILITY.format_error_backtrace, 'ERROR');
      END;
   BEGIN
      xlog (l_proc, 'start: ### SHOW IMAGE: ' || p_image_name);
      dump_all_cookies;

      -- pick up defaults from table xlib_jasperreports_conf
      setup_configuration_defaults();

      -------------------------------------------------------
      -- assert valid values for the input variables
      -------------------------------------------------------
      IF m_report_url IS NULL
      THEN
         RAISE report_url_not_defined;
      END IF;

      -------------------------------------------------------
      -- construct URL
      -------------------------------------------------------
      -- _image?image=img_0_0_15&uuid=b41eb881-7ca5-4919-bd8f-5afa8d10b398
      l_url := m_report_url || '_image';
      l_url := l_url || '?image=' || p_image_name;
      l_url := l_url || '&JSESSIONID=' || OWA_COOKIE.get (name => m_jri_cookie_name_c).vals (1);

      -------------------------------------------------------
      -- determine cookies for calling the j2ee server
      -- JSESSIONID needs to be passed, the path needs to
      -- be modified for the j2ee server context
      -------------------------------------------------------
      get_headers_to_pass2j2ee (p_header_name_arr => l_header_name_arr, p_header_value_arr => l_header_value_arr);

      -------------------------------------------------------
      -- call J2EE server
      -------------------------------------------------------
      xlib_http.
       display_url_raw (p_url => l_url, p_header_name_arr => l_header_name_arr, p_header_value_arr => l_header_value_arr);
   END;



   ----------------------------------------------------------------------------
   -- make a callout with utl_http to the j2ee container running the
   -- JasperReportsIntegration webapp
   -- => return the results
   ----------------------------------------------------------------------------
   PROCEDURE show_report (p_rep_name             IN VARCHAR2 DEFAULT 'test',
                          p_rep_format           IN VARCHAR2 DEFAULT c_rep_format_pdf,
                          p_data_source          IN VARCHAR2 DEFAULT 'default',
                          p_out_filename         IN VARCHAR2 DEFAULT NULL,
                          p_rep_locale           IN VARCHAR2 DEFAULT 'de_DE',
                          p_rep_encoding         IN VARCHAR2 DEFAULT 'UTF-8',
                          p_additional_params    IN VARCHAR2 DEFAULT NULL,
                          p_print_is_enabled     IN BOOLEAN DEFAULT FALSE,
                          p_print_printer_name   IN VARCHAR2 DEFAULT NULL,
                          p_print_media          IN VARCHAR2 DEFAULT NULL,
                          p_print_copies         IN NUMBER DEFAULT 1,
                          p_print_duplex         IN BOOLEAN DEFAULT FALSE,
                          p_print_collate        IN BOOLEAN DEFAULT FALSE,
                          p_save_is_enabled      IN BOOLEAN DEFAULT FALSE,
                          p_save_filename        IN VARCHAR2 DEFAULT NULL,
                          p_rep_time_zone        IN VARCHAR2 DEFAULT NULL,
                          p_print_job_name       IN VARCHAR2 DEFAULT NULL)
   IS
      l_proc   VARCHAR2 (100) := m_module || '.SHOW_REPORT';
      l_url    VARCHAR2 (32767);
   BEGIN
      -- pick up defaults from table xlib_jasperreports_conf
      setup_configuration_defaults();

      -------------------------------------------------------
      -- assert valid values for the input variables
      -------------------------------------------------------
      IF m_report_url IS NULL
      THEN
         xlog(p_module => m_module, p_msg => 'The report url is empty', p_type=> 'ERROR');

         RAISE report_url_not_defined;
      END IF;

      -------------------------------------------------------
      -- construct URL
      -------------------------------------------------------
      l_url := m_report_url;
      l_url := l_url || '?_repName=' || p_rep_name;
      l_url := l_url || '&_repFormat=' || p_rep_format;
      l_url := l_url || '&_dataSource=' || p_data_source;
      l_url := l_url || '&_outFilename=' || p_out_filename;
      l_url := l_url || '&_repLocale=' || p_rep_locale;
      l_url := l_url || '&_repEncoding=' || p_rep_encoding;
      l_url := l_url || '&_repTimeZone=' || APEX_UTIL.URL_ENCODE (p_rep_time_zone);

      -- per default use the tunnel through the database
      IF m_images_uri IS NULL OR m_images_uri = c_images_uri_tunnel
      THEN
         -- tunnel through database
         l_url := l_url || '&_imagesURI=' || APEX_UTIL.URL_ENCODE (compute_images_uri_tunnel);
      ELSE
         -- use parameter, mostly for direct access to servlet
         l_url := l_url || '&_imagesURI=' || APEX_UTIL.URL_ENCODE (m_images_uri);
      END IF;

      -- direct printing
      l_url := l_url || '&_printIsEnabled=' || bool2string (p_print_is_enabled);
      l_url := l_url || '&_printPrinterName=' || p_print_printer_name;
      l_url := l_url || '&_printPrinterTray=' || p_print_media;
      l_url := l_url || '&_printCopies=' || p_print_copies;
      l_url := l_url || '&_printDuplex=' || bool2string (p_print_duplex);
      l_url := l_url || '&_printCollate=' || bool2string (p_print_collate);
      l_url := l_url || '&_printJobName=' || p_print_job_name;

      -- save file on server
      l_url := l_url || '&_saveIsEnabled=' || bool2string (p_save_is_enabled);
      l_url := l_url || '&_saveFileName=' || p_save_filename;


/*
      Each additional parameter needs to be escaped using utl_url.escape()
       utl_url.escape(
        url                    => p_additional_params,
        escape_reserved_chars  => true,
                   url_charset            => 'UTF-8'
        );
*/

      -- additional report parameter passed?
      IF (p_additional_params IS NOT NULL)
      THEN
--         l_url := l_url || '&' || p_additional_params;
         l_url := l_url || '&' || utl_url.escape(
                                        url                    => p_additional_params,
                                        escape_reserved_chars  => false,
                                                   url_charset            => 'UTF-8'
        );
      END IF;

      -------------------------------------------------------
      -- call J2EE server
      -------------------------------------------------------
      xlib_http.display_url_raw (p_url => l_url);
   END;

   ----------------------------------------------------------------------------
   -- run the report and return the result as a blob
   ----------------------------------------------------------------------------
   PROCEDURE get_report (p_rep_name             IN     VARCHAR2 DEFAULT 'test',
                         p_rep_format           IN     VARCHAR2 DEFAULT c_rep_format_pdf,
                         p_data_source          IN     VARCHAR2 DEFAULT 'default',
                         p_rep_locale           IN     VARCHAR2 DEFAULT 'de_DE',
                         p_rep_encoding         IN     VARCHAR2 DEFAULT 'UTF-8',
                         p_additional_params    IN     VARCHAR2 DEFAULT NULL,
                         p_print_is_enabled     IN     BOOLEAN DEFAULT FALSE,
                         p_print_printer_name   IN     VARCHAR2 DEFAULT NULL,
                         p_print_media          IN     VARCHAR2 DEFAULT NULL,
                         p_print_copies         IN     NUMBER DEFAULT 1,
                         p_print_duplex         IN     BOOLEAN DEFAULT FALSE,
                         p_print_collate        IN     BOOLEAN DEFAULT FALSE,
                         p_save_is_enabled      IN     BOOLEAN DEFAULT FALSE,
                         p_save_filename        IN     VARCHAR2 DEFAULT NULL,
                         p_rep_time_zone        IN     VARCHAR2 DEFAULT NULL,
                         p_out_blob             IN OUT BLOB,
                         p_out_mime_type        IN OUT VARCHAR2,
                         p_print_job_name       IN     VARCHAR2 DEFAULT NULL)
   IS
      l_proc   VARCHAR2 (100) := m_module || '.GET_REPORT';
      l_url    VARCHAR2 (32767);
   BEGIN
      -- pick up defaults from table xlib_jasperreports_conf
      setup_configuration_defaults();

      -------------------------------------------------------
      -- assert valid values for the input variables
      -------------------------------------------------------
      IF m_report_url IS NULL
      THEN
         RAISE report_url_not_defined;
      END IF;

      -------------------------------------------------------
      -- construct URL
      -------------------------------------------------------
      l_url := m_report_url;
      l_url := l_url || '?_repName=' || p_rep_name;
      l_url := l_url || '&_repFormat=' || p_rep_format;
      l_url := l_url || '&_dataSource=' || p_data_source;
      l_url := l_url || '&_repLocale=' || p_rep_locale;
      l_url := l_url || '&_repEncoding=' || p_rep_encoding;
      l_url := l_url || '&_repTimeZone=' || APEX_UTIL.URL_ENCODE (p_rep_time_zone);

      -- per default use the tunnel through the database
      IF m_images_uri IS NULL OR m_images_uri = c_images_uri_tunnel
      THEN
         -- tunnel through database
         l_url := l_url || '&_imagesURI=' || APEX_UTIL.URL_ENCODE (compute_images_uri_tunnel);
      ELSE
         -- use parameter, mostly for direct access to servlet
         l_url := l_url || '&_imagesURI=' || APEX_UTIL.URL_ENCODE (m_images_uri);
      END IF;

      -- direct printing
      l_url := l_url || '&_printIsEnabled=' || bool2string (p_print_is_enabled);
      l_url := l_url || '&_printPrinterName=' || p_print_printer_name;
      l_url := l_url || '&_printPrinterTray=' || p_print_media;
      l_url := l_url || '&_printCopies=' || p_print_copies;
      l_url := l_url || '&_printDuplex=' || bool2string (p_print_duplex);
      l_url := l_url || '&_printCollate=' || bool2string (p_print_collate);
      l_url := l_url || '&_printJobName=' || p_print_job_name;

      -- save file on server
      l_url := l_url || '&_saveIsEnabled=' || bool2string (p_save_is_enabled);
      l_url := l_url || '&_saveFileName=' || p_save_filename;

      -- additional report parameter passed?
      IF (p_additional_params IS NOT NULL)
      THEN
--         l_url := l_url || '&' || p_additional_params;
         l_url := l_url || '&' || utl_url.escape(
                                        url                    => p_additional_params,
                                        escape_reserved_chars  => false,
                                                   url_charset            => 'UTF-8'
        );
      END IF;

      -------------------------------------------------------
      -- call Tomcat
      -------------------------------------------------------
      xlib_http.retrieve_blob_from_url (p_url => l_url, o_blob => p_out_blob, o_mime_type => p_out_mime_type);
   END;

   ----------------------------------------------------------------------------
   -- get default configuration
   ----------------------------------------------------------------------------
   FUNCTION get_default_configuration
      RETURN xlib_jasperreports_conf%ROWTYPE
   IS
      l_conf   xlib_jasperreports_conf%ROWTYPE;
   BEGIN
      SELECT *
        INTO l_conf
        FROM xlib_jasperreports_conf
       WHERE conf_id = 'MAIN';

      RETURN l_conf;
   END;

   ----------------------------------------------------------------------------
   -- set default configuration
   ----------------------------------------------------------------------------
   PROCEDURE set_default_configuration (p_conf IN OUT xlib_jasperreports_conf%ROWTYPE)
   IS
   BEGIN
      p_conf.conf_id := 'MAIN';

      UPDATE xlib_jasperreports_conf
         SET row = p_conf
       WHERE conf_id = p_conf.conf_id;
   END;


   PROCEDURE set_default_configuration (
      p_protocol                IN xlib_jasperreports_conf.conf_protocol%TYPE default 'http',
      p_server                  IN xlib_jasperreports_conf.conf_server%TYPE default 'localhost',
      p_port                    IN xlib_jasperreports_conf.conf_port%TYPE default '80',
      p_context_path            IN xlib_jasperreports_conf.conf_context_path%TYPE default 'jri',
      p_wallet_path             IN xlib_jasperreports_conf.conf_wallet_path%TYPE default null,
      p_wallet_pwd              IN xlib_jasperreports_conf.conf_wallet_pwd%TYPE default null,
      p_http_transfer_timeout   IN xlib_jasperreports_conf.conf_http_transfer_timeout%TYPE default 60)
   IS
   BEGIN
      UPDATE xlib_jasperreports_conf
         SET conf_protocol = p_protocol,
             conf_server = p_server,
             conf_port = p_port,
             conf_context_path = p_context_path,
             conf_wallet_path = p_wallet_path,
             conf_wallet_pwd = p_wallet_pwd,
             conf_http_transfer_timeout = p_http_transfer_timeout
       WHERE conf_id = 'MAIN';
   END;
END;```