All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jasperreports.engine.fill.package-info Maven / Gradle / Ivy

There is a newer version: 6.21.2
Show newest version
/*
 * JasperReports - Free Java Reporting Library.
 * Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of JasperReports.
 *
 * JasperReports is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * JasperReports is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with JasperReports. If not, see .
 */
/**
 * Contains fill time implementations for the library's main interfaces and the entire 
 * engine used in the filling process (the actual core of JasperReports). 
 * 
*

Filling Report Templates

* The report-filling process is the most important piece of JasperReports library * functionality, because it manipulates sets of data to produce high-quality documents. * This is the main purpose of any reporting tool. *

* The following things should be supplied to the report-filling process as input: *

    *
  • a report template (in the compiled form)
  • *
  • parameters
  • *
  • data source
  • *
* The output is always a single, final {@link net.sf.jasperreports.engine.JasperPrint} * document ready to be viewed, printed, or exported to other formats. *

* The {@link net.sf.jasperreports.engine.JasperFillManager} class is usually used for * filling a report template with data. This class has various methods that fill report * templates located on disk, come from input streams, or are supplied directly as in-memory * {@link net.sf.jasperreports.engine.JasperReport} objects. After getting the report template, * the report filling methods are calling the related fill(...) method in the * {@link net.sf.jasperreports.engine.fill.JRFiller} class, that actually fills the report. *

* The output produced always corresponds to the type of input received. That is, when * receiving a file name for the report template, the generated report is also placed in a file * on disk. When the report template is read from an input stream, the generated report is * written to an output stream, and so forth. *

* The various utility methods for filling the reports may not be sufficient for a particular * application - for example, loading report templates as resources from the classpath and * outputting the generated documents to files on disk at a certain location. *

* In such cases, manually loading the report template objects is to be considered before passing them * to the report-filling routines using the * {@link net.sf.jasperreports.engine.util.JRLoader} utility class. This way, one can * retrieve report template properties, such as the report name, to construct the name of the * resulting document and place it at the desired disk location. *

* The report-filling manager class covers only the most common scenarios. However, you * can always customize the report-filling process using the library's basic functionality just * described. *

*

Generated Reports

* The output of the report-filling process is always a pixel-perfect document, ready for * viewing, printing, or exporting to other formats. These documents come in the form of * {@link net.sf.jasperreports.engine.JasperPrint} objects, which are serializable. This * allows the parent application to store them or transfer them over the network if needed. *

* At the top level, a {@link net.sf.jasperreports.engine.JasperPrint} object contains some document-specific information, * like the name of the document, the page size, and its orientation (portrait or landscape). * Then it points to a collection of page objects * ({@link net.sf.jasperreports.engine.JRPrintPage} instances), each page having a * collection of elements that make up its content. Elements on a page are absolutely * positioned at x and y coordinates within that page and have a specified width and height * in pixels. They can be lines, rectangles, ellipses, images, or text, with various style * settings corresponding to their type. *

*

Filling Order

* JasperReports templates allow the detail section to be smaller than the specified page * width so that the output can be structured into multiple columns, like a newspaper. *

* When multiple-column report templates are used, the order used for filling those * columns is important. * There are two possible column orders, that can be set in the report template using * the printOrder attribute: *

    *
  • Vertical - meaning that they run from top to bottom and then from left to right. * This is the default order. The report filling process is provided by the * {@link net.sf.jasperreports.engine.fill.JRVerticalFiller} class.
  • *
  • Horizontal - meaning that they first run from left to right and then from top to bottom. In this case * the report is filled using methods in the {@link net.sf.jasperreports.engine.fill.JRHorizontalFiller} class.
  • *
* When filling report templates horizontally, dynamic text fields inside the detail section * do not stretch to their entire text content, because this might cause misalignment on the * horizontal axis of subsequent detail sections. The detail band actually behaves the same * as the page and column footers, preserving its declared height when horizontal filling is * used. *

*

Asynchronous Report Filling

* JasperReports provides the * {@link net.sf.jasperreports.engine.fill.AsynchronousFillHandle} class to be used * for asynchronous report filling. The main benefit of this method is that the filling process * can be canceled if it takes too much time. This can be useful, for example, in GUI * applications where the user would be able to abort the filling after some time has elapsed * and no result has been yet produced. *

* When using this method, the filling is started on a new thread. The caller is notified * about the progress of the filling process by way of listeners implementing the * {@link net.sf.jasperreports.engine.fill.AsynchronousFilllListener} interface. The * listeners are notified of the outcome of the filling process, which can be success, failure, * or user cancellation. The handle is used to start the filling process, register listeners, and * cancel the process if wanted. *

* A typical usage of this handle is the following: *

    *
  • The handle is created by calling the static createHandle() methods in {@link net.sf.jasperreports.engine.fill.AsynchronousFillHandle AsynchronousFillHandle} * that take as arguments the report object, the parameter map, and the data source or the database * connection to be used.
  • *
  • One or more listeners are registered with the handle by calling the addListener() * method. In a GUI application, the listener could perform some actions to present to * the user the outcome of the filling process.
  • *
  • The filling is started with a call to the startFill() method. In a GUI application, * this could be the result of some user action; the user can also be notified that the * filling has started and is in progress.
  • *
  • The filling can be canceled by calling cancellFill() on the handle. In a GUI, * this would be the result of a user action.
  • *
  • The listeners are notified when the process finishes. There are three events defined * for the listeners, only one of which will be called, depending on the outcome of the filling: *
      *
    • reportFinished() - called when the filling has finished successfully; the * filled report is passed as a parameter. In a GUI, the user would be presented the * filled report or would be able to save/export it.
    • *
    • reportFillError() - called when the filling ends in error; the exception that * occurred is passed as a parameter.
    • *
    • reportCancelled() - called when the filling is aborted by the user.
    • *
    *
  • *
*

Large File Support

* If very large datasets are used for report filling, the size of the resulting * {@link net.sf.jasperreports.engine.JasperPrint} object could also be very large and might cause * the JVM to run out of memory. *

* To increase the memory available for the Java application, first use the -Xmx option * when launching the JVM, since the default value for this parameter is fairly small. * However, if you do this with large datasets (for example, containing tens of thousands or * more records and resulting in documents that have thousands or more pages), the JVM * may run out of memory. *

* JasperReports offers a simple solution to the problem by introducing * the report virtualizer. The virtualizer is a simple interface * ({@link net.sf.jasperreports.engine.JRVirtualizer}) that enables the reporting engine * to optimize memory consumption during report filling by removing parts of the * JasperPrint object from memory and storing them on disk or in other temporary * locations. If a report virtualizer is used during filling, the engine keeps only a limited * number of pages from the generated JasperPrint object at a time and serializes all the * other pages to a temporary storage location, usually the file system. *

* Using a report virtualizer is very simple. You supply an instance of the * {@link net.sf.jasperreports.engine.JRVirtualizer} interface as the value for the built-in * {@link net.sf.jasperreports.engine.JRParameter#REPORT_VIRTUALIZER REPORT_VIRTUALIZER} * parameter when filling the report. *

* In virtualized form, a generated {@link net.sf.jasperreports.engine.JasperPrint} document still behaves normally and can * be subject to exporting, printing, or viewing processes, and the impact on memory * consumption is minimal even when dealing with very large documents. *

* When produced using a virtualizer (which itself performs partial document serialization * into temporary files), once completed, a {@link net.sf.jasperreports.engine.JasperPrint} document can itself be serialized * normally without any loss of information. During the serialization of a virtualized * {@link net.sf.jasperreports.engine.JasperPrint} object, the program puts back together all the pieces and a single * serialized file is produced. However, because this single file is probably very large, * simple deserialization would not make sense (in fact, it wouldn't be possible, as the JVM * would run out of memory, which is the reason for using virtualization in the first place). * So in order to reload into memory a virtualized document that was serialized to a * permanent storage facility, a report virtualizer is needed. This would be set using a local * thread variable by calling the following: *

 * JRVirtualizationHelper.setThreadVirtualizer(JRVirtualizer virtualizer)
*

File virtualizer

* The library ships with a ready-to-use implementation of this interface called * {@link net.sf.jasperreports.engine.fill.JRFileVirtualizer}, which stores document * pages on disk during the filling process to free up memory. Once a {@link net.sf.jasperreports.engine.JasperPrint} object * is produced using a report virtualizer, it can be exported to other formats or viewed * directly using the library's built-in viewer component, even though this document is not * fully loaded at any one time. The virtualizer ensures that pages are deserialized and * loaded from their temporary storage location as needed during exporting or display. * A single {@link net.sf.jasperreports.engine.fill.JRFileVirtualizer} instance can be shared across multiple report-filling * processes so that the number of document pages kept in-memory at any one time will be * limited by the virtualizer maxSize property, regardless of the number of reports that are * generated simultaneously. *

* Because it works with temporary files on disk, the file virtualizer has a built-in * mechanism to remove those files after they are no longer needed (that is, after the * generated document or the virtualizer itself have been disposed of by the JVM). The * cleanup() method exposed by this virtualizer implementation can be also called * manually so that the temporary files are removed from disk right away instead of after * the finalization of the entities involved. *

* To ensure that no virtualization files are left over on disk by the application that uses the * file virtualizer, all these temporary files are registered with the JVM so that they are * deleted automatically when the JVM exits normally. *

* But using File.deleteOnExit() will accumulate JVM process memory on some * virtual machine implementations (see * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513817); you should * avoid using this feature in long-running applications by turning it off using the * {@link net.sf.jasperreports.engine.fill.JRFileVirtualizer#PROPERTY_TEMP_FILES_SET_DELETE_ON_EXIT net.sf.jasperreports.virtualizer.files.delete.on.exit} configuration property. *

*

Swap File Virtualizer

* On some platforms, working with a large number of files in a single folder, or even the * file manipulating processes themselves, may have a significant impact on performance or * pose additional problems. This makes the use of the {@link net.sf.jasperreports.engine.fill.JRFileVirtualizer} * implementation less effective. *

* Fortunately, there is another implementation of a file-based report virtualizer that uses a * single swap file and can also be shared among multiple report-filling processes. Instead * of having one temporary file per virtualized page, we create a single file into which all * virtualized pages are stored to and then retrieved from. *

* This swap file virtualizer implementation is represented by the * {@link net.sf.jasperreports.engine.fill.JRSwapFileVirtualizer} class that is * part of the JasperReports library core functionality, and works in combination with a * {@link net.sf.jasperreports.engine.util.JRSwapFile} instance representing the target * swap file. *

* The {@link net.sf.jasperreports.engine.util.JRSwapFile} instance has to be created and configured prior to being passed to the * swap virtualizer. You can create such an instance by specifying the target directory * where the swap file will be created, the size of the blocks allocated by the swap file, and * the minimum number of blocks by which the swap file will grow when its current size * becomes insufficient. *

* The {@link net.sf.jasperreports.engine.util.JRConcurrentSwapFile} class * represents an enhanced implementation of the JRSwapFile that only works with JRE * version 1.4 or later, because it uses a java.nio.channels.FileChannel to perform * concurrent I/O on the swap file. *

*

In-Memory GZIP Virtualizer

* The {@link net.sf.jasperreports.engine.fill.JRGzipVirtualizer} is a convenient * report virtualizer implementation that does not rely on the file system to temporarily * store unused/virtualized document pages during the report filling. Rather, it optimizes * memory consumption by compressing those pages in-memory using a GZIP algorithm. * Tests indicate that memory consumption during large report-generating processes is * reduced up to a factor of ten when the in-memory GZIP report virtualizer is used. *

Related Documentation

* JasperReports Tutorial * * @see net.sf.jasperreports.engine.JasperFillManager * @see net.sf.jasperreports.engine.JasperPrint * @see net.sf.jasperreports.engine.JasperReport * @see net.sf.jasperreports.engine.JRPrintPage * @see net.sf.jasperreports.engine.JRVirtualizer * @see net.sf.jasperreports.engine.util.JRConcurrentSwapFile * @see net.sf.jasperreports.engine.util.JRLoader * @see net.sf.jasperreports.engine.util.JRSwapFile */ package net.sf.jasperreports.engine.fill;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy