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

net.sf.jasperreports.engine.base.JRVirtualPrintPage Maven / Gradle / Ivy

There is a newer version: 6.21.2
Show newest version
/*
 * JasperReports - Free Java Reporting Library.
 * Copyright (C) 2005 Works, Inc. All rights reserved.
 * http://www.works.com
 * Copyright (C) 2005 - 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 .
 */

/*
 * Licensed to Jaspersoft Corporation under a Contributer Agreement
 */
package net.sf.jasperreports.engine.base;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sf.jasperreports.annotations.properties.Property;
import net.sf.jasperreports.annotations.properties.PropertyScope;
import net.sf.jasperreports.engine.JRConstants;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRPrintPage;
import net.sf.jasperreports.engine.JRPropertiesUtil;
import net.sf.jasperreports.engine.JRVirtualizer;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.fill.JRTemplateElement;
import net.sf.jasperreports.engine.fill.JRVirtualizationContext;
import net.sf.jasperreports.engine.fill.VirtualizationObjectInputStream;
import net.sf.jasperreports.properties.PropertyConstants;
import net.sf.jasperreports.renderers.Renderable;

/**
 * A print page that can be virtualized to free heap memory.
 * 
 * @author John Bindel
 */
public class JRVirtualPrintPage implements JRPrintPage, Serializable
{
	protected static final Log log = LogFactory.getLog(JRVirtualPrintPage.class);

	private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
	
	/**
	 * Property that determines how many print elements will make up a virtual page
	 * handled as a unit by the virtualizer.
	 * 
	 * 

* For most paginated reports, a virtual page corresponds to a report page. * But for non-paginated reports and for reports having very large pages, a report * page is broken into several virtual pages which are handled individually by the * virtualizer. * *

* This property provides the size of a virtual page in print elements. Note that * virtual page sizes will actually vary around the configured size since there * are cases when fewer elements remain on a report page and cases when the configured * size is exceeded due to print frames being included at the end of virtual page. * *

* If set to 0 or negative, report pages will not be broken into several virtual pages. * *

* The property can be set at report and global levels or sent as a parameter value * (as an integer, using the property name as parameter name). * The default value is 2000. */ @Property( category = PropertyConstants.CATEGORY_FILL, defaultValue = "2000", scopes = {PropertyScope.CONTEXT, PropertyScope.REPORT}, sinceVersion = PropertyConstants.VERSION_4_1_3, valueType = Integer.class ) public static final String PROPERTY_VIRTUAL_PAGE_ELEMENT_SIZE = JRPropertiesUtil.PROPERTY_PREFIX + "virtual.page.element.size"; protected VirtualizableElementList elements; /** * Constructs a virtualizable page. * * @deprecated the virtualizer should be passed as part of the virtualization context, * use {@link #JRVirtualPrintPage(JasperPrint, JRVirtualizationContext)} instead */ public JRVirtualPrintPage(JasperPrint printObject, JRVirtualizer virtualizer, JRVirtualizationContext virtualizationContext) { this(printObject, virtualizationContext); } /** * Constructs a virtualizable page. * * @param printObject * @param virtualizationContext * @deprecated replaced by {@link #JRVirtualPrintPage(JRVirtualizationContext)} */ @Deprecated public JRVirtualPrintPage(JasperPrint printObject, JRVirtualizationContext virtualizationContext) { this(virtualizationContext); } /** * Constructs a virtualizable page. */ public JRVirtualPrintPage(JRVirtualizationContext virtualizationContext) { super(); this.elements = new VirtualizableElementList(virtualizationContext, this); if (log.isDebugEnabled()) { log.debug("created list " + this.elements + " for page " + this); } } protected JRVirtualPrintPage() { } @Override public List getElements() { return elements; } @Override public void setElements(List elements) { this.elements.set(elements); } @Override public void addElement(JRPrintElement element) { elements.add(element); } /** * Dummy image renderer that only stores the ID of a cached renderer. * When a page gets serialized, all image renderers that are cached in the * virtualization context are replaced with dummy renderers that only store the ID. * When a page gets deserialized, the original renderers are restored from the * virtualization context based on the ID. */ // we have to keep these two classes here so that we're able to deserialize old reports public static class JRIdHolderRenderer implements Renderable { private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID; protected final String id; public JRIdHolderRenderer(Renderable renderer) { this.id = renderer.getId(); } @Override public String getId() { return id; } } public static class JRIdHolderTemplateElement extends JRTemplateElement { private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID; public JRIdHolderTemplateElement(String id) { super(id); } @Override public int getHashCode() { throw new UnsupportedOperationException(); } @Override public boolean isIdentical(Object object) { throw new UnsupportedOperationException(); } } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { Object object = in.readObject(); if (object instanceof VirtualizableElementList) { elements = (VirtualizableElementList) object; } else { // page serialized by old version String oldUid = (String) object; if (log.isDebugEnabled()) { log.debug("Original page uid " + oldUid); } JRVirtualizationContext virtualizationContext = (JRVirtualizationContext) in.readObject(); int length = in.readInt(); byte[] buffer = new byte[length]; in.readFully(buffer); ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer, 0, buffer.length); VirtualizationObjectInputStream elementsStream = new VirtualizationObjectInputStream(inputStream, virtualizationContext); try { @SuppressWarnings("unchecked") List elementsList = (List) elementsStream.readObject(); // create a new list for the elements elements = new VirtualizableElementList(virtualizationContext, this); elements.addAll(elementsList); } finally { elementsStream.close(); } } } private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.writeObject(elements); } /** * Disposes this page's data. */ public void dispose() { elements.dispose(); } public JRVirtualizationContext getVirtualizationContext() { return elements.getVirtualizationContext(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy