/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.plugin.action.jfreereport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jfree.ui.RefineryUtilities;
import org.pentaho.actionsequence.dom.ActionInput;
import org.pentaho.actionsequence.dom.ActionResource;
import org.pentaho.actionsequence.dom.IActionInput;
import org.pentaho.actionsequence.dom.IActionOutput;
import org.pentaho.actionsequence.dom.IActionResource;
import org.pentaho.actionsequence.dom.actions.ActionDefinition;
import org.pentaho.actionsequence.dom.actions.ActionFactory;
import org.pentaho.actionsequence.dom.actions.JFreeReportAction;
import org.pentaho.commons.connection.ActivationHelper;
import org.pentaho.commons.connection.IPentahoMetaData;
import org.pentaho.commons.connection.IPentahoResultSet;
import org.pentaho.platform.api.data.IDataComponent;
import org.pentaho.platform.api.data.IPreparedComponent;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.api.engine.IApplicationContext;
import org.pentaho.platform.api.engine.IComponent;
import org.pentaho.platform.api.engine.IPentahoRequestContext;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.engine.core.system.PentahoRequestContextHolder;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.action.jfreereport.components.JFreeReportValidateParametersComponent;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoDataFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoResourceBundleFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoResourceLoader;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoTableDataFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoTableModel;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoURLRewriter;
import org.pentaho.platform.plugin.action.jfreereport.helper.ReportUtils;
import org.pentaho.platform.plugin.action.messages.Messages;
import org.pentaho.platform.util.xml.XmlHelper;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.DataFactory;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ParameterDataRow;
import org.pentaho.reporting.engine.classic.core.ReportProcessingException;
import org.pentaho.reporting.engine.classic.core.ResourceBundleFactory;
import org.pentaho.reporting.engine.classic.core.layout.output.YieldReportListener;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.PreviewDialog;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.ReportController;
import org.pentaho.reporting.engine.classic.core.modules.gui.print.PrintUtil;
import org.pentaho.reporting.engine.classic.core.modules.output.pageable.base.PageableReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PdfOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.FlowReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.StreamReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.csv.StreamCSVOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.AllItemsHtmlPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.StreamHtmlOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.URLRewriter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.rtf.StreamRTFOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.FlowExcelOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.xml.XMLProcessor;
import org.pentaho.reporting.engine.classic.core.modules.parser.base.ReportGenerator;
import org.pentaho.reporting.engine.classic.core.util.ReportParameterValues;
import org.pentaho.reporting.engine.classic.extensions.modules.java14print.Java14PrintUtil;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.config.ModifiableConfiguration;
import org.pentaho.reporting.libraries.base.util.IOUtils;
import org.pentaho.reporting.libraries.repository.ContentIOException;
import org.pentaho.reporting.libraries.repository.ContentLocation;
import org.pentaho.reporting.libraries.repository.DefaultNameGenerator;
import org.pentaho.reporting.libraries.repository.NameGenerator;
import org.pentaho.reporting.libraries.repository.file.FileRepository;
import org.pentaho.reporting.libraries.repository.stream.StreamRepository;
import org.pentaho.reporting.libraries.resourceloader.FactoryParameterKey;
import org.pentaho.reporting.libraries.resourceloader.ResourceException;
import org.pentaho.reporting.libraries.resourceloader.ResourceKey;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import org.xml.sax.InputSource;
import javax.activation.DataSource;
import javax.print.DocFlavor;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.swing.table.TableModel;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* The JFreeReportComponent provides a simple-to-use frontend for the reporting process.
* <p/>
* This component will execute JFreeReport reports in one of two different modes:
* <p/>
* <h3>sqlMode = true</h3>
* <p/>
* This means that the JFreeReport component is expected to execute an SQL query, wrap the resulting SQL Resultset in a
* TableModel, and use that to execute a report whose definition is in the file system. In this mode, the
* action-sequence definition must contain the following elements: In the resource-definition section, there must be a
* resource called "report-definition" which defines the location of the jfreereport xml document.
* <p/>
* In the component-definition sction, there must be the following entries:
* <ul>
* <li>A "query" parameter which contains an SQL query.</li>
* <li>Either for connecting to the SQL datasource:
* <ul>
* <li>A "jndi" parameter (with the jndi name of the datasource)</li>
* <li>or The database parameters "driver", "user-id", "password" and "connection" so that a database connection can be
* established for running the afore-mentioned "query".</li>
* </ul>
* </li>
* </ul>
* <h3>sqlMode = false</h3>
* <p/>
* This means that the JFreeReport component is expected to execute a report that exists in a .jar file (like the
* reporting demo reports) along with the TableModel class that provides the data for the report. In this mode, the
* action-sequence definition must contain the following elements: In the resource-definition section, there must be a
* resource called "report-jar" that points to the .jar file that contains the report .xml file, and the TableModel
* implementation.
* <p/>
* In the component-definition section, there must be two entries:
* <ul>
* <li>"report-location" - This is the location of the report .xml document (e.g. org/jfree/report/demo/report1.xml)
* </li>
* <li>"class-location" - This is the package-qualified class that implements TableModel (e.g.
* org.jfree.report.demo.SampleData1).</li>
* </ul>
*
* @author mbatchel
* @created Sep 8, 2005
*/
@SuppressWarnings( "deprecation" )
public class JFreeReportComponent extends AbstractJFreeReportComponent {
protected static final Log logger = LogFactory.getLog( JFreeReportComponent.class );
private static final long serialVersionUID = -4185151399689983507L;
private static final int INIT_REPORT_PARAMS_STATUS_PASSED = 1;
private static final int INIT_REPORT_PARAMS_STATUS_FAILED = 2;
private static final int INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING = 3;
private static final String PROGRESS_DIALOG_ENABLED_KEY = "org.jfree.report.modules.gui.base.ProgressDialogEnabled"; //$NON-NLS-1$
private static final String PROGRESS_BAR_ENABLED_KEY = "org.jfree.report.modules.gui.base.ProgressBarEnabled"; //$NON-NLS-1$
private static final boolean DO_NOT_USE_THE_CONTENT_REPOSITORY = true;
private JFreeReportValidateParametersComponent validateParametersComponent;
public JFreeReportComponent() {
}
@Override
public boolean init() {
return true;
}
@Override
public void done() {
}
@Override
public boolean validateSystemSettings() {
return true;
}
@Override
public Log getLogger() {
return LogFactory.getLog( JFreeReportComponent.class );
}
protected boolean initAndValidate( final IComponent component ) {
component.setInstanceId( getInstanceId() );
component.setActionName( getActionName() );
component.setProcessId( getProcessId() );
component.setComponentDefinition( getComponentDefinition() );
component.setRuntimeContext( getRuntimeContext() );
component.setSession( getSession() );
component.setLoggingLevel( getLoggingLevel() );
component.setMessages( getMessages() );
return ( component.validate() == IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK );
}
/**
* We cannot validate the parameters of all components, as the required parameters might not have been created.
*
* @return
*/
@Override
public boolean validateAction() {
boolean result = true;
if ( !( getActionDefinition() instanceof JFreeReportAction ) ) {
error( Messages.getInstance().getErrorString(
"ComponentBase.ERROR_0001_UNKNOWN_ACTION_TYPE", getActionDefinition().getElement().asXML() ) ); //$NON-NLS-1$
result = false;
} else {
validateParametersComponent = new JFreeReportValidateParametersComponent();
if ( initAndValidate( validateParametersComponent ) == false ) {
error( Messages.getInstance().getString( "JFreeReportComponent.ERROR_0025_COULD_NOT_VALIDATE" ) ); //$NON-NLS-1$
result = false;
}
}
return result;
}
private boolean isParameterUIAvailable() {
/*
* See if we are allowed to generate a parameter selection user interface. If we are being called as part of a
* process, this will not be allowed.
*/
if ( !feedbackAllowed() ) {
// We could not get an output stream for the feedback, but we are
// allowed
// to generate UI, so return an error
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0020_INVALID_FEEDBACK_STREAM" ) ); //$NON-NLS-1$
return false;
}
// We need input from the user, we have delivered an input form into the
// feeback stream
setFeedbackMimeType( "text/html" ); //$NON-NLS-1$
return true;
}
private int initReportParams() {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
int result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PASSED;
final String defaultValue = ""; //$NON-NLS-1$
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for ( IActionInput element : actionInputs ) {
Object paramValue = element.getValue();
String inputName = element.getName();
if ( ( paramValue == null ) || ( "".equals( paramValue ) ) ) //$NON-NLS-1$
{
IActionParameter paramParameter = getInputParameter( inputName );
if ( paramParameter.getPromptStatus() == IActionParameter.PROMPT_PENDING ) {
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING;
continue;
}
if ( isParameterUIAvailable() ) {
// The parameter value was not provided, and we are allowed
// to
// create user interface forms
createFeedbackParameter( inputName, inputName, "", defaultValue, true ); //$NON-NLS-1$
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING;
} else {
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_FAILED;
}
}
}
return result;
}
/**
* This method gets called from the outside. Based upon our mode call the correct function.
*/
@Override
public boolean executeAction() {
int initParamsResult = initReportParams();
boolean result = false;
if ( initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_FAILED ) {
result = false;
} else if ( ( initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING )
|| isPromptPending() ) {
result = true;
} else if ( initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PASSED ) {
result = executeReportAction();
}
return result;
}
protected boolean executeReportAction() {
boolean result = false;
try {
MasterReport report = getReport();
if ( report != null ) {
addTempParameterObject( AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT, report );
if ( initReportConfigParameters( report ) && ( initReportInputs( report ) ) ) {
result = generateReport( report, getDataFactory() );
}
}
} catch ( ClassNotFoundException ex ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED" ), ex ); //$NON-NLS-1$
} catch ( InstantiationException ex ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED" ), ex ); //$NON-NLS-1$
} catch ( IllegalAccessException ex ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED" ), ex ); //$NON-NLS-1$
} catch ( IOException ex ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0008_INVALID_OUTPUT_STREAM" ), ex ); //$NON-NLS-1$
} catch ( Exception ex ) {
error( ex.getMessage() );
}
return result;
}
protected PentahoTableDataFactory getDataFactory() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, Exception {
PentahoTableDataFactory factory = null;
factory = getQueryComponentDataFactory();
if ( factory == null ) {
factory = getInputParamDataFactory();
}
if ( factory == null ) {
factory = getJarDataFactory();
}
if ( factory == null ) {
throw new Exception( Messages.getInstance().getString( "JFreeReport.ERROR_0022_DATA_INPUT_INVALID_OBJECT" ) ); //$NON-NLS-1$
}
return factory;
}
private PentahoTableDataFactory getQueryComponentDataFactory() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
PentahoTableDataFactory factory = null;
String dataComponentName = jFreeReportAction.getDataComponent().getStringValue();
String origComponentName = jFreeReportAction.getComponentName();
if ( dataComponentName != null ) {
if ( JFreeReportAction.SQL_DATA_SOURCE.equalsIgnoreCase( dataComponentName ) ) {
dataComponentName = AbstractJFreeReportComponent.DATACOMPONENT_SQLCLASS;
} else if ( JFreeReportAction.MDX_DATA_SOURCE.equalsIgnoreCase( dataComponentName ) ) {
dataComponentName = AbstractJFreeReportComponent.DATACOMPONENT_MDXCLASS;
}
try {
// This is a giant hack and a big no, no. Basically we're going to transform the JFreeReportAction into a
// SQL or MDX lookup action, by changing its component name. Then we create the appropriate component to run the
// transformed action.
// All this to support the DB and Query info being embedded in the JFreeReport action. This is definitely
// deprecated functionality
// that should not be relied upon. The correct way to do this is to create an SQL or MDX action prior to the
// JFreeReport
// action in the action sequence. That action performs the desired query, then pass the results of that query to
// the JFreeReport
// action.
jFreeReportAction.setComponentName( dataComponentName );
ActionDefinition tmpActionDefinition =
ActionFactory.getActionDefinition( jFreeReportAction.getElement(), jFreeReportAction
.getActionParameterMgr() );
final Class componentClass = Class.forName( dataComponentName );
IDataComponent dataComponent = (IDataComponent) componentClass.newInstance();
dataComponent.setInstanceId( getInstanceId() );
dataComponent.setActionName( getActionName() );
dataComponent.setProcessId( getProcessId() );
dataComponent.setActionDefinition( tmpActionDefinition );
dataComponent.setComponentDefinition( getComponentDefinition() );
dataComponent.setRuntimeContext( getRuntimeContext() );
dataComponent.setSession( getSession() );
dataComponent.setLoggingLevel( getLoggingLevel() );
dataComponent.setMessages( getMessages() );
// if that fails, then we know we messed up again.
// Abort, we cant continue anyway.
if ( ( dataComponent.validate() == IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK ) && dataComponent.init()
&& ( dataComponent.execute() == IRuntimeContext.RUNTIME_STATUS_SUCCESS ) ) {
final IPentahoResultSet resultset = dataComponent.getResultSet();
factory =
new PentahoTableDataFactory( AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT,
new PentahoTableModel( resultset ) );
} else {
throw new IllegalArgumentException( Messages.getInstance().getErrorString(
"JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED" ) ); //$NON-NLS-1$
}
} catch ( ClassNotFoundException e ) {
JFreeReportComponent.logger.error( null, e );
} catch ( InstantiationException e ) {
JFreeReportComponent.logger.error( null, e );
} catch ( IllegalAccessException e ) {
JFreeReportComponent.logger.error( null, e );
} finally {
jFreeReportAction.setComponentName( origComponentName );
}
}
return factory;
}
private PentahoTableDataFactory getJarDataFactory() throws Exception {
PentahoTableDataFactory factory = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
try {
org.pentaho.actionsequence.dom.IActionResource actionResource = jFreeReportAction.getDataJar().getJar();
if ( actionResource != null ) {
DataSource dataSource = new ActivationHelper.PentahoStreamSourceWrapper( actionResource.getDataSource() );
InputStream in = dataSource.getInputStream();
try {
// not being able to read a single char is definitly a big boo ..
if ( in.read() == -1 ) {
throw new Exception( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE" ) ); //$NON-NLS-1$
} else {
final ClassLoader loader =
ReportUtils.createJarLoader( getSession(), getResource( actionResource.getName() ) );
if ( loader == null ) {
throw new Exception( Messages.getInstance().getString(
"JFreeReportDataComponent.ERROR_0035_COULD_NOT_CREATE_CLASSLOADER" ) ); //$NON-NLS-1$
} else if ( !isDefinedInput( AbstractJFreeReportComponent.DATACOMPONENT_CLASSLOCINPUT ) ) {
throw new Exception( Messages.getInstance().getErrorString(
"JFreeReport.ERROR_0012_CLASS_LOCATION_MISSING" ) ); //$NON-NLS-1$
} else {
// Get input parameters, and set them as properties in the report
// object.
final ReportParameterValues reportProperties = new ReportParameterValues();
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for ( IActionInput element : actionInputs ) {
final Object paramValue = element.getValue();
if ( paramValue instanceof Object[] ) {
final Object[] values = (Object[]) paramValue;
final StringBuffer valuesBuffer = new StringBuffer();
// TODO support non-string items
for ( int z = 0; z < values.length; z++ ) {
if ( z == 0 ) {
valuesBuffer.append( values[z].toString() );
} else {
valuesBuffer.append( ',' ).append( values[z].toString() );
}
}
reportProperties.put( element.getName(), valuesBuffer.toString() );
} else {
reportProperties.put( element.getName(), paramValue );
}
}
final DataFactory dataFactory = new PentahoDataFactory( loader );
final TableModel model =
dataFactory.queryData( jFreeReportAction.getDataJar().getDataClass(), new ParameterDataRow(
reportProperties ) );
factory = new PentahoTableDataFactory( AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, model );
}
}
} catch ( Exception e ) {
throw new Exception( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE" ) ); //$NON-NLS-1$
}
}
} catch ( FileNotFoundException e1 ) {
throw new Exception( Messages.getInstance().getErrorString(
"JFreeReport.ERROR_0010_REPORT_JAR_MISSING", jFreeReportAction //$NON-NLS-1$
.getDataJar().toString() ) );
}
return factory;
}
private PentahoTableDataFactory getInputParamDataFactory() {
PentahoTableDataFactory factory = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
ActionInput reportDataParam = (ActionInput) jFreeReportAction.getData();
Object dataObject = reportDataParam != null ? reportDataParam.getValue() : null;
if ( ( dataObject instanceof IPentahoResultSet ) || ( dataObject instanceof TableModel ) ) {
factory = new PentahoTableDataFactory();
if ( dataObject instanceof IPentahoResultSet ) {
IPentahoResultSet resultset = (IPentahoResultSet) dataObject;
if ( resultset.isScrollable() ) {
resultset.beforeFirst();
} else {
debug( "ResultSet is not scrollable. Copying into memory" ); //$NON-NLS-1$
IPentahoResultSet memSet = resultset.memoryCopy();
resultset.close();
resultset = memSet;
}
factory.addTable( AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, new PentahoTableModel( resultset ) );
} else if ( dataObject instanceof TableModel ) {
factory.addTable( AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, (TableModel) dataObject );
}
IActionInput[] subreportQueries = jFreeReportAction.getSubreportQueryParams();
for ( IActionInput element : subreportQueries ) {
dataObject = element.getValue();
if ( dataObject instanceof IPreparedComponent ) {
factory.addPreparedComponent( element.getName(), (IPreparedComponent) dataObject );
} else if ( dataObject instanceof IPentahoResultSet ) {
final IPentahoResultSet resultset = (IPentahoResultSet) dataObject;
resultset.beforeFirst();
factory.addTable( element.getName(), new PentahoTableModel( resultset ) );
} else if ( dataObject instanceof TableModel ) {
factory.addTable( element.getName(), (TableModel) dataObject );
}
}
}
return factory;
}
private String getHostColonPort( final String pentahoBaseURL ) {
try {
URL url = new URL( pentahoBaseURL );
return url.getHost() + ":" + url.getPort(); //$NON-NLS-1$
} catch ( Exception e ) {
//ignore
}
return pentahoBaseURL;
}
private String getBaseServerURL( final String pentahoBaseURL ) {
try {
URL url = new URL( pentahoBaseURL );
return url.getProtocol() + "://" + url.getHost() + ":" + url.getPort(); //$NON-NLS-1$ //$NON-NLS-2$
} catch ( Exception e ) {
//ignore
}
return pentahoBaseURL;
}
private MasterReport parseReport( final IActionSequenceResource resource ) {
try {
// define the resource url so that PentahoResourceLoader recognizes the path.
String resourceUrl =
PentahoResourceLoader.SOLUTION_SCHEMA_NAME + PentahoResourceLoader.SCHEMA_SEPARATOR + resource.getAddress();
String fullyQualifiedServerURL = PentahoSystem.getApplicationContext().getFullyQualifiedServerURL();
HashMap<FactoryParameterKey, Object> helperObjects = new HashMap<FactoryParameterKey, Object>();
helperObjects.put( new FactoryParameterKey( "pentahoBaseURL" ), fullyQualifiedServerURL ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// trim out the server and port
helperObjects.put( new FactoryParameterKey( "serverBaseURL" ), getBaseServerURL( fullyQualifiedServerURL ) );
//$NON-NLS-1$
helperObjects.put(
new FactoryParameterKey( "solutionRoot" ), PentahoSystem.getApplicationContext().getSolutionPath( "" ) ); //$NON-NLS-1$ //$NON-NLS-2$
// get the host:port portion only
helperObjects.put( new FactoryParameterKey( "hostColonPort" ), getHostColonPort( fullyQualifiedServerURL ) ); //$NON-NLS-1$
// get the requestContextPath
helperObjects
.put(
new FactoryParameterKey( "requestContextPath" ),
PentahoRequestContextHolder.getRequestContext().getContextPath() ); //$NON-NLS-1$
Iterator it = getInputNames().iterator();
while ( it.hasNext() ) {
try {
String inputName = (String) it.next();
// do not store the data as it would always force a cache refresh and it has no bearing
// on how the report definition would be parsed
if ( AbstractJFreeReportComponent.DATACOMPONENT_DATAINPUT.equals( inputName ) ) {
continue;
}
String inputValue = getInputStringValue( inputName );
helperObjects.put( new FactoryParameterKey( inputName ), inputValue );
} catch ( Exception e ) {
//ignore
}
}
ResourceManager resourceManager = new ResourceManager();
resourceManager.registerDefaults();
ResourceKey contextKey = resourceManager.createKey( resourceUrl, helperObjects );
ResourceKey key = resourceManager.createKey( resourceUrl, helperObjects );
return ReportGenerator.getInstance().parseReport( resourceManager, key, contextKey );
} catch ( Exception ex ) {
error(
Messages.getInstance().getErrorString( "JFreeReport.ERROR_0007_COULD_NOT_PARSE", resource.getAddress() ), ex ); //$NON-NLS-1$
return null;
}
}
public MasterReport getReport() throws Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report = getReportFromResource();
if ( report == null ) {
report = getReportFromInputParam();
if ( report == null ) {
report = getReportFromJar();
}
}
if ( ( report != null ) && jFreeReportAction.getCreatePrivateCopy().getBooleanValue( false ) ) {
report = (MasterReport) report.clone();
}
return report;
}
private MasterReport getReportFromResource() throws ResourceException, IOException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report = null;
Object reportDefinition = jFreeReportAction.getReportDefinition();
IActionSequenceResource resource = null;
if ( reportDefinition instanceof ActionResource ) {
resource = getResource( ( (ActionResource) reportDefinition ).getName() );
}
if ( resource != null ) {
if ( resource.getSourceType() == IActionResource.XML ) {
String repDef = resource.getAddress();
ReportGenerator generator = ReportGenerator.createInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
// Read the encoding from the XML file - see BISERVER-895
final String encoding = XmlHelper.getEncoding( repDef, null );
ByteArrayInputStream inStream = new ByteArrayInputStream( repDef.getBytes( encoding ) );
InputSource repDefInputSource = new InputSource( inStream );
repDefInputSource.setEncoding( encoding );
report = generator.parseReport( repDefInputSource, getDefinedResourceURL( null ) );
} else {
report = parseReport( resource );
}
}
return report;
}
private MasterReport getReportFromInputParam() throws ResourceException, UnsupportedEncodingException, IOException {
MasterReport report = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
Object reportDefinition = jFreeReportAction.getReportDefinition();
if ( reportDefinition instanceof ActionInput ) {
String repDef = ( (ActionInput) reportDefinition ).getStringValue();
report = createReport( repDef );
}
return report;
}
protected MasterReport createReport( final String reportDefinition ) throws ResourceException, IOException {
ReportGenerator generator = ReportGenerator.createInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
URL url = null;
IPentahoRequestContext requestContext = PentahoRequestContextHolder.getRequestContext();
try {
url = new URL( requestContext.getContextPath() ); //$NON-NLS-1$ //$NON-NLS-2$
} catch ( Exception e ) {
// a null URL is ok
warn( Messages.getInstance().getString( "JFreeReportLoadComponent.WARN_COULD_NOT_CREATE_URL" ) ); //$NON-NLS-1$
}
// Read the encoding from the XML file - see BISERVER-895
final String encoding = XmlHelper.getEncoding( reportDefinition, null );
ByteArrayInputStream inStream = new ByteArrayInputStream( reportDefinition.getBytes( encoding ) );
InputSource reportDefinitionInputSource = new InputSource( inStream );
reportDefinitionInputSource.setEncoding( encoding );
return generator.parseReport( reportDefinitionInputSource, getDefinedResourceURL( url ) );
}
private MasterReport getReportFromJar() throws Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report;
org.pentaho.actionsequence.dom.IActionResource reportJar = jFreeReportAction.getReportDefinitionJar().getJar();
final IActionSequenceResource resource = getResource( reportJar.getName() );
final ClassLoader loader = ReportUtils.createJarLoader( getSession(), resource );
if ( loader == null ) {
throw new Exception( Messages.getInstance().getString(
"JFreeReportLoadComponent.ERROR_0035_COULD_NOT_CREATE_CLASSLOADER" ) ); //$NON-NLS-1$
}
String reportLocation = jFreeReportAction.getReportDefinitionJar().getReportLocation();
URL resourceUrl = loader.getResource( reportLocation );
if ( resourceUrl == null ) {
throw new Exception( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0016_REPORT_RESOURCE_INVALID", //$NON-NLS-1$
reportLocation, resource.getAddress() ) );
}
try {
ReportGenerator generator = ReportGenerator.getInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
report = generator.parseReport( resourceUrl, getDefinedResourceURL( resourceUrl ) );
} catch ( Exception ex ) {
throw new Exception( Messages.getInstance().getErrorString(
"JFreeReport.ERROR_0007_COULD_NOT_PARSE", reportLocation ), ex ); //$NON-NLS-1$
}
return report;
}
private URL getDefinedResourceURL( final URL defaultValue ) {
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTLOAD_RESURL ) == false ) {
return defaultValue;
}
try {
final String inputStringValue =
getInputStringValue( Messages.getInstance().getString( AbstractJFreeReportComponent.REPORTLOAD_RESURL ) );
return new URL( inputStringValue );
} catch ( Exception e ) {
return defaultValue;
}
}
private boolean initReportConfigParameters( final MasterReport report ) {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
boolean result = true;
if ( isDefinedInput( AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT ) ) {
Object reportConfigParams = jFreeReportAction.getReportConfig().getValue();
if ( reportConfigParams != null ) {
if ( reportConfigParams instanceof IPentahoResultSet ) {
setReportConfigParameters( report, (IPentahoResultSet) reportConfigParams );
} else if ( reportConfigParams instanceof Map ) {
setReportConfigParameters( report, (Map) reportConfigParams );
} else if ( reportConfigParams instanceof JFreeReportAction.StaticReportConfig ) {
setReportConfigParameters( report, (JFreeReportAction.StaticReportConfig) reportConfigParams );
} else {
error( Messages.getInstance().getErrorString(
"JFreeReport.ERROR_0026_UNKNOWN_REPORT_CONFIGURATION_PARAMETERS" ) ); //$NON-NLS-1$
result = false;
}
}
}
return result;
}
private void setReportConfigParameters( final MasterReport report,
final JFreeReportAction.StaticReportConfig reportConfig ) {
// We have some configuration parameters in the component definition
for ( int i = 0; i < reportConfig.size(); i++ ) {
JFreeReportAction.StaticReportConfigItem staticReportConfigItem =
(JFreeReportAction.StaticReportConfigItem) reportConfig.get( i );
String parmName = staticReportConfigItem.getName();
String parmValue = staticReportConfigItem.getValue();
if ( ( parmName == null ) || ( parmName.length() == 0 ) ) {
// Ignore configuration settings without name=
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED" ) ); //$NON-NLS-1$
continue;
}
if ( parmValue != null ) {
parmValue = parmValue.trim();
if ( parmValue.length() > 0 ) {
report.getReportConfiguration().setConfigProperty( parmName, applyInputsToFormat( parmValue ) );
} else {
error( Messages.getInstance()
.getErrorString( "JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED" ) ); //$NON-NLS-1$
}
} else {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED" ) ); //$NON-NLS-1$
}
}
}
private void setReportConfigParameters( final MasterReport report, final Map values ) {
Map.Entry ent;
ModifiableConfiguration config = report.getReportConfiguration();
Iterator it = values.entrySet().iterator();
while ( it.hasNext() ) {
ent = (Map.Entry) it.next();
if ( ( ent.getKey() != null ) && ( ent.getValue() != null ) ) {
config.setConfigProperty( ent.getKey().toString(), applyInputsToFormat( ent.getValue().toString() ) );
}
}
}
private void setReportConfigParameters( final MasterReport report, final IPentahoResultSet values ) {
int rowCount = values.getRowCount();
int colCount = values.getColumnCount();
ModifiableConfiguration config = report.getReportConfiguration();
if ( colCount >= 2 ) {
IPentahoMetaData md = values.getMetaData();
int nameIdx = md.getColumnIndex( "name" ); //$NON-NLS-1$
int valIdx = md.getColumnIndex( "value" ); //$NON-NLS-1$
if ( nameIdx < 0 ) {
nameIdx = 0;
}
if ( valIdx < 0 ) {
valIdx = 1;
}
for ( int i = 0; i < rowCount; i++ ) {
Object[] aRow = values.getDataRow( i );
if ( ( aRow[nameIdx] != null ) && ( aRow[valIdx] != null ) ) {
config.setConfigProperty( aRow[nameIdx].toString(), applyInputsToFormat( aRow[valIdx].toString() ) );
}
}
} else {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0025_INVALID_REPORT_CONFIGURATION_PARAMETERS" ) ); //$NON-NLS-1$
}
}
private boolean initReportInputs( final MasterReport report ) throws CloneNotSupportedException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
// Get input parameters, and set them as properties in the report
// object.
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for ( IActionInput element : actionInputs ) {
String paramName = element.getName();
Object paramValue = element.getValue();
if ( ( paramValue == null ) || "".equals( paramValue ) ) { //$NON-NLS-1$
continue;
}
// we filter some well-known bad-guys. It is dangerous to have the
// report-object (the parsed JFreeReport object), the "report-data"
// (the tablemodel) or the "data" reference copied to the report.
// also dangerous are result sets and table models.
if ( paramValue instanceof IPentahoResultSet ) {
continue;
}
if ( paramValue instanceof TableModel ) {
continue;
}
if ( AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT.equals( paramName ) ) {
continue;
}
if ( AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_DATAINPUT.equals( paramName ) ) {
continue;
}
if ( AbstractJFreeReportComponent.DATACOMPONENT_DATAINPUT.equals( paramName ) ) {
continue;
}
/*
* WG: Commenting out because this change (SVN: 44880) breaks bi-developers / reporting / subreport.xaction we'll
* need to revisit this when reving to the 4.0 reporting engine.
*
* final ParameterDefinitionEntry[] parameterDefinitions =
* report.getParameterDefinition().getParameterDefinitions(); boolean foundParameter = false; for (int j = 0; j <
* parameterDefinitions.length; j++) { final ParameterDefinitionEntry definition = parameterDefinitions[j]; if
* (paramName.equals(definition.getName())) { foundParameter = true; break; } } if (foundParameter == false) { if
* (report.getParameterDefinition() instanceof ModifiableReportParameterDefinition) { final
* ModifiableReportParameterDefinition parameterDefinition = (ModifiableReportParameterDefinition)
* report.getParameterDefinition(); parameterDefinition.addParameterDefinition(new PlainParameter(paramName)); } }
*/
if ( paramValue instanceof Object[] ) {
Object[] values = (Object[]) paramValue;
StringBuffer valuesBuffer = new StringBuffer();
// TODO support non-string items
for ( int j = 0; j < values.length; j++ ) {
if ( j == 0 ) {
valuesBuffer.append( values[j].toString() );
} else {
valuesBuffer.append( ',' ).append( values[j].toString() );
}
}
report.getParameterValues().put( paramName, valuesBuffer.toString() );
// report.setProperty(paramName, valuesBuffer.toString());
} else {
report.getParameterValues().put( paramName, paramValue );
// report.setProperty(paramName, paramValue);
}
}
return true;
}
private String getMimeType( final String outputFormat ) {
String mimeType = null;
if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals( outputFormat ) ) {
mimeType = "text/html"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals( outputFormat ) ) {
mimeType = "application/pdf"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals( outputFormat ) ) {
mimeType = "application/vnd.ms-excel"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals( outputFormat ) ) {
mimeType = "text/csv"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals( outputFormat ) ) {
mimeType = "application/rtf"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals( outputFormat ) ) {
mimeType = "text/xml"; //$NON-NLS-1$
}
return mimeType;
}
private String getFileExtension( final String outputFormat ) {
String fileExtension = null;
if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals( outputFormat ) ) {
fileExtension = ".html"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals( outputFormat ) ) {
fileExtension = ".pdf"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals( outputFormat ) ) {
fileExtension = ".xls"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals( outputFormat ) ) {
fileExtension = ".csv"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals( outputFormat ) ) {
fileExtension = ".rtf"; //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals( outputFormat ) ) {
fileExtension = ".xml"; //$NON-NLS-1$
}
return fileExtension;
}
private boolean generateReport( final MasterReport report,
final PentahoTableDataFactory factory ) throws IOException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
boolean result = false;
try {
applyThreadPriority();
// this might be invalid in case the action is contained in a sub-directory.
final String baseName = IOUtils.getInstance().stripFileExtension( getActionName() );
final String path = getSolutionPath();
final PentahoResourceBundleFactory bundleFactory =
new PentahoResourceBundleFactory( path, baseName, getSession() );
report.setResourceBundleFactory( bundleFactory );
// set the default resourcebundle. This allows users to override the
// resource-bundle in case they want to keep common strings in a common
// collection.
report.getReportConfiguration().setConfigProperty( ResourceBundleFactory.DEFAULT_RESOURCE_BUNDLE_CONFIG_KEY,
baseName );
if ( factory != null ) {
report.setDataFactory( factory );
}
String printerName = jFreeReportAction.getPrinterName().getStringValue();
String outputFormat = jFreeReportAction.getOutputType().getStringValue();
if ( printerName != null ) {
result = print( report, getActionTitle(), printerName );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_SWING.equals( outputFormat ) ) {
if ( GraphicsEnvironment.isHeadless() ) {
result = writeSwingPreview( report );
}
warn( Messages.getInstance().getString( "JFreeReportAllContentComponent.WARN_HEADLESSMODE_ACTIVE" ) ); //$NON-NLS-1$
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals( outputFormat )
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals( outputFormat )
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals( outputFormat )
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals( outputFormat )
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals( outputFormat )
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals( outputFormat ) ) {
String mimeType = getMimeType( outputFormat );
String fileExtention = getFileExtension( outputFormat );
IContentItem contentItem = getContentItem( mimeType, fileExtention );
OutputStream outputStream = null;
if ( contentItem != null ) {
outputStream = contentItem.getOutputStream( getActionName() );
} else {
outputStream = getDefaultOutputStream( mimeType );
}
result =
writeReport( outputFormat, report, outputStream, jFreeReportAction.getReportGenerationYieldRate()
.getIntValue( 0 ), jFreeReportAction.getHtmlContentHandlerUrlPattern().getStringValue() );
if ( contentItem != null ) {
contentItem.closeOutputStream();
}
} else {
warn( Messages.getInstance().getString( "JFreeReportAllContentComponent.WARN_NO_PRINTER_GIVEN" ) ); //$NON-NLS-1$
}
} finally {
if ( factory != null ) {
// force close the factory
factory.closeTables();
}
}
return result;
}
private void applyThreadPriority() {
String priority = ( (JFreeReportAction) getActionDefinition() ).getReportGenerationPriority().getStringValue();
try {
if ( AbstractJFreeReportComponent.REPORTGENERATE_PRIORITYLOWER.equals( priority ) ) {
Thread.currentThread().setPriority( Math.max( Thread.currentThread().getPriority() - 1, 1 ) );
} else if ( AbstractJFreeReportComponent.REPORTGENERATE_PRIORITYLOWEST.equals( priority ) ) {
Thread.currentThread().setPriority( 1 );
}
} catch ( Exception e ) {
// Non fatal exception.
warn( Messages.getInstance().getString(
"AbstractGenerateContentComponent.JFreeReport.ERROR_0044_UNABLE_T0_SET_THREAD_PRIORITY" ) ); //$NON-NLS-1$
}
}
protected IContentItem getContentItem( final String mimeType, final String extension ) {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
// Try to get the output from the action-sequence document.
IContentItem contentItem = null;
IActionOutput actionOutput = jFreeReportAction.getOutputReport();
if ( actionOutput != null ) {
contentItem = getOutputItem( actionOutput.getName(), mimeType, extension );
contentItem.setMimeType( mimeType );
} else if ( getOutputNames().size() == 1 ) {
String outputName = (String) getOutputNames().iterator().next();
contentItem = getOutputContentItem( outputName, mimeType );
contentItem.setMimeType( mimeType );
}
return contentItem;
}
private boolean writeReport( final String outputFormat, final MasterReport report, final OutputStream outputStream,
final int yieldRate, final String htmlContentHandlerUrlPattern ) {
boolean result = false;
if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals( outputFormat ) ) {
result = writeHtml( report, outputStream, yieldRate, htmlContentHandlerUrlPattern );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals( outputFormat ) ) {
result = writePdf( report, outputStream, yieldRate );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals( outputFormat ) ) {
result = writeXls( report, outputStream, yieldRate );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals( outputFormat ) ) {
result = writeCsv( report, outputStream, yieldRate );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals( outputFormat ) ) {
result = writeRtf( report, outputStream, yieldRate );
} else if ( AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals( outputFormat ) ) {
result = writeXml( report, outputStream );
}
return result;
}
public boolean writeHtml( final MasterReport report, final OutputStream outputStream, final int yieldRate,
String htmlContentHandlerUrlPattern ) {
try {
if ( htmlContentHandlerUrlPattern == null ) {
final Configuration globalConfig = ClassicEngineBoot.getInstance().getGlobalConfig();
htmlContentHandlerUrlPattern = PentahoRequestContextHolder.getRequestContext().getContextPath();
htmlContentHandlerUrlPattern += globalConfig.getConfigProperty( "org.pentaho.web.ContentHandler" ); //$NON-NLS-1$
}
final IApplicationContext ctx = PentahoSystem.getApplicationContext();
final URLRewriter rewriter;
final ContentLocation dataLocation;
final NameGenerator dataNameGenerator;
if ( ctx != null ) {
File dataDirectory = new File( ctx.getFileOutputPath( "system/tmp/" ) ); //$NON-NLS-1$
if ( dataDirectory.exists() && ( dataDirectory.isDirectory() == false ) ) {
dataDirectory = dataDirectory.getParentFile();
if ( dataDirectory.isDirectory() == false ) {
throw new ReportProcessingException( Messages.getInstance().getErrorString(
"JFreeReportDirectoryComponent.ERROR_0001_INVALID_DIR", dataDirectory.getPath() ) ); //$NON-NLS-1$
}
} else if ( dataDirectory.exists() == false ) {
dataDirectory.mkdirs();
}
final FileRepository dataRepository = new FileRepository( dataDirectory );
dataLocation = dataRepository.getRoot();
dataNameGenerator = new DefaultNameGenerator( dataLocation );
rewriter = new PentahoURLRewriter( htmlContentHandlerUrlPattern );
} else {
dataLocation = null;
dataNameGenerator = null;
rewriter = new PentahoURLRewriter( htmlContentHandlerUrlPattern );
}
final StreamRepository targetRepository = new StreamRepository( null, outputStream );
final ContentLocation targetRoot = targetRepository.getRoot();
final HtmlOutputProcessor outputProcessor = new StreamHtmlOutputProcessor( report.getConfiguration() );
final HtmlPrinter printer = new AllItemsHtmlPrinter( report.getResourceManager() );
printer.setContentWriter( targetRoot, new DefaultNameGenerator( targetRoot, "index", "html" ) ); //$NON-NLS-1$//$NON-NLS-2$
printer.setDataWriter( dataLocation, dataNameGenerator );
printer.setUrlRewriter( rewriter );
outputProcessor.setPrinter( printer );
final StreamReportProcessor sp = new StreamReportProcessor( report, outputProcessor );
if ( yieldRate > 0 ) {
sp.addReportProgressListener( new YieldReportListener( yieldRate ) );
}
sp.processReport();
sp.close();
outputStream.flush();
return true;
} catch ( ReportProcessingException e ) {
error( Messages.getInstance().getString( "JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT" ), e ); //$NON-NLS-1$
return false;
} catch ( IOException e ) {
error( Messages.getInstance().getString( "JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT" ), e ); //$NON-NLS-1$
return false;
} catch ( ContentIOException e ) {
error( Messages.getInstance().getString( "JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT" ), e ); //$NON-NLS-1$
return false;
}
}
protected boolean writeXls( final MasterReport report, final OutputStream outputStream, final int yieldRate ) {
boolean result = false;
try {
final FlowExcelOutputProcessor target =
new FlowExcelOutputProcessor( report.getConfiguration(), outputStream, report.getResourceManager() );
final FlowReportProcessor reportProcessor = new FlowReportProcessor( report, target );
if ( isDefinedInput( AbstractJFreeReportComponent.WORKBOOK_PARAM ) ) {
target.setTemplateInputStream( getInputStream( AbstractJFreeReportComponent.WORKBOOK_PARAM ) );
}
if ( yieldRate > 0 ) {
reportProcessor.addReportProgressListener( new YieldReportListener( yieldRate ) );
}
reportProcessor.processReport();
reportProcessor.close();
outputStream.flush();
result = true;
} catch ( Exception e ) {
error( Messages.getInstance().getString( "JFreeReportExcelComponent.ERROR_0037_ERROR_READING_REPORT_INPUT" ), e ); //$NON-NLS-1$
}
return result;
}
protected boolean writePdf( final MasterReport report, final OutputStream outputStream, final int yieldRate ) {
PageableReportProcessor proc = null;
boolean result = false;
try {
final PdfOutputProcessor outputProcessor = new PdfOutputProcessor( report.getConfiguration(), outputStream );
proc = new PageableReportProcessor( report, outputProcessor );
if ( yieldRate > 0 ) {
proc.addReportProgressListener( new YieldReportListener( yieldRate ) );
}
proc.processReport();
proc.close();
proc = null;
result = true;
} catch ( Exception e ) {
error( Messages.getInstance().getErrorString( "JFreeReportPdfComponent.ERROR_0001_WRITING_PDF_FAILED", //$NON-NLS-1$
e.getLocalizedMessage() ), e );
} finally {
if ( proc != null ) {
proc.close();
}
}
return result;
}
public boolean print( final MasterReport report, final String jobName, final String printerName ) {
boolean result = false;
if ( jobName != null ) {
report.getReportConfiguration().setConfigProperty( PrintUtil.PRINTER_JOB_NAME_KEY, String.valueOf( jobName ) );
}
PrintService printer = null;
PrintService[] services = PrintServiceLookup.lookupPrintServices( DocFlavor.SERVICE_FORMATTED.PAGEABLE, null );
for ( final PrintService service : services ) {
if ( service.getName().equals( printerName ) ) {
printer = service;
}
}
if ( ( printer == null ) && ( services.length > 0 ) ) {
printer = services[0];
}
try {
Java14PrintUtil.printDirectly( report, printer );
result = true;
} catch ( PrintException e ) {
//ignore
} catch ( ReportProcessingException e ) {
//ignore
}
return result;
}
protected boolean writeCsv( final MasterReport report, final OutputStream outputStream, final int yieldRate ) {
boolean result = false;
try {
final StreamCSVOutputProcessor target = new StreamCSVOutputProcessor( outputStream );
final StreamReportProcessor reportProcessor = new StreamReportProcessor( report, target );
if ( yieldRate > 0 ) {
reportProcessor.addReportProgressListener( new YieldReportListener( yieldRate ) );
}
reportProcessor.processReport();
reportProcessor.close();
outputStream.flush();
result = true;
} catch ( ReportProcessingException e ) {
//ignore
} catch ( IOException e ) {
//ignore
}
return result;
}
protected boolean writeRtf( final MasterReport report, final OutputStream outputStream, final int yieldRate ) {
boolean result = false;
try {
final StreamRTFOutputProcessor target =
new StreamRTFOutputProcessor( report.getConfiguration(), outputStream, report.getResourceManager() );
final StreamReportProcessor proc = new StreamReportProcessor( report, target );
if ( yieldRate > 0 ) {
proc.addReportProgressListener( new YieldReportListener( yieldRate ) );
}
proc.processReport();
proc.close();
outputStream.close();
result = true;
} catch ( ReportProcessingException e ) {
//ignore
} catch ( IOException e ) {
//ignore
}
return result;
}
protected boolean writeXml( final MasterReport report, final OutputStream outputStream ) {
boolean result = false;
try {
final XMLProcessor processor = new XMLProcessor( report );
final OutputStreamWriter writer = new OutputStreamWriter( outputStream );
processor.setWriter( writer );
processor.processReport();
writer.close();
result = true;
} catch ( ReportProcessingException e ) {
error( Messages.getInstance().getString( "JFreeReportXmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT" ), e ); //$NON-NLS-1$
} catch ( IOException e ) {
error( Messages.getInstance().getString( "JFreeReportXmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT" ), e ); //$NON-NLS-1$
}
return result;
}
protected boolean writeSwingPreview( final MasterReport report ) {
final ModifiableConfiguration reportConfiguration = report.getReportConfiguration();
final boolean progressBar =
getInputBooleanValue( AbstractJFreeReportComponent.REPORTSWING_PROGRESSBAR,
"true".equals( reportConfiguration.getConfigProperty( JFreeReportComponent.PROGRESS_BAR_ENABLED_KEY ) ) ); //$NON-NLS-1$
final boolean progressDialog =
getInputBooleanValue( AbstractJFreeReportComponent.REPORTSWING_PROGRESSDIALOG,
"true".equals( reportConfiguration.getConfigProperty( JFreeReportComponent.PROGRESS_DIALOG_ENABLED_KEY ) ) ); //$NON-NLS-1$
reportConfiguration.setConfigProperty( JFreeReportComponent.PROGRESS_DIALOG_ENABLED_KEY, String
.valueOf( progressDialog ) );
reportConfiguration
.setConfigProperty( JFreeReportComponent.PROGRESS_BAR_ENABLED_KEY, String.valueOf( progressBar ) );
final PreviewDialog dialog = createDialog( report );
final ReportController reportController = getReportController();
if ( reportController != null ) {
dialog.setReportController( reportController );
}
dialog.pack();
if ( dialog.getParent() != null ) {
RefineryUtilities.centerDialogInParent( dialog );
} else {
RefineryUtilities.centerFrameOnScreen( dialog );
}
dialog.setVisible( true );
return true;
}
private ReportController getReportController() {
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTSWING_REPORTCONTROLLER ) ) {
final Object controller = getInputValue( AbstractJFreeReportComponent.REPORTSWING_REPORTCONTROLLER );
if ( controller instanceof ReportController ) {
return (ReportController) controller;
}
}
return null;
}
private PreviewDialog createDialog( final MasterReport report ) {
final boolean modal = getInputBooleanValue( AbstractJFreeReportComponent.REPORTSWING_MODAL, true );
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTSWING_PARENTDIALOG ) ) {
final Object parent = getInputValue( AbstractJFreeReportComponent.REPORTSWING_PARENTDIALOG );
if ( parent instanceof Dialog ) {
return new PreviewDialog( report, (Dialog) parent, modal );
} else if ( parent instanceof Frame ) {
return new PreviewDialog( report, (Frame) parent, modal );
}
}
final PreviewDialog previewDialog = new PreviewDialog( report );
previewDialog.setModal( modal );
return previewDialog;
}
}