/*!
* 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.components;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.actionsequence.dom.IActionResource;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.api.engine.IPentahoRequestContext;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
import org.pentaho.platform.engine.core.system.PentahoRequestContextHolder;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.action.jfreereport.AbstractJFreeReportComponent;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoResourceLoader;
import org.pentaho.platform.plugin.action.jfreereport.helper.ReportUtils;
import org.pentaho.platform.plugin.action.messages.Messages;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.modules.parser.base.ReportGenerator;
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.pentaho.util.messages.LocaleHelper;
import org.xml.sax.InputSource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
/**
* A JFreeReport run contains at least three steps. Step 1: Parse the report definition. Step 2: Grab some data. Step 3:
* Spit out some content. Alternativly, show the print-preview.
* <p/>
* This class loads or parses the report definition.
*
*
* @deprecated This code has known bugs and it is highly recommended that it not be used by any sane person
* @author Thomas Morgner
*/
@Deprecated
public class JFreeReportLoadComponent extends AbstractJFreeReportComponent {
private static final long serialVersionUID = -2240691437049710246L;
public JFreeReportLoadComponent() {
}
@Override
protected boolean validateAction() {
if ( isDefinedResource( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN ) ) {
return true;
}
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN ) ) {
IActionParameter o = getInputParameter( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN );
if ( ( o != null ) && ( o.getValue() instanceof String ) ) {
return true;
}
return false;
}
// Handle late-bind of report resource name
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTLOAD_RESOURCENAME ) ) {
if ( isDefinedResource( getInputStringValue( AbstractJFreeReportComponent.REPORTLOAD_RESOURCENAME ) ) ) {
return true;
} else {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0004_REPORT_DEFINITION_UNREADABLE" ) ); //$NON-NLS-1$
return false;
}
}
if ( isDefinedResource( AbstractJFreeReportComponent.DATACOMPONENT_JARINPUT ) ) {
if ( !isDefinedInput( AbstractJFreeReportComponent.REPORTLOAD_REPORTLOC ) ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0011_REPORT_LOCATION_MISSING" ) ); //$NON-NLS-1$
return false;
}
final IActionSequenceResource resource = getResource( AbstractJFreeReportComponent.DATACOMPONENT_JARINPUT );
final InputStream in;
in = resource.getInputStream( RepositoryFilePermission.READ, LocaleHelper.getLocale() );
try {
// not being able to read a single char is definitly a big boo ..
if ( in.read() == -1 ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE" ) ); //$NON-NLS-1$
return false;
}
} catch ( Exception e ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE" ) ); //$NON-NLS-1$
return false;
}
if ( !isDefinedInput( AbstractJFreeReportComponent.REPORTLOAD_REPORTLOC ) ) {
error( Messages.getInstance().getErrorString( "JFreeReport.ERROR_0012_CLASS_LOCATION_MISSING" ) ); //$NON-NLS-1$
return false;
}
return true;
}
return false;
}
@Override
protected boolean validateSystemSettings() {
return true;
}
@Override
public void done() {
}
private MasterReport getReportFromResource() throws ResourceException, IOException {
MasterReport report = null;
if ( isDefinedResource( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN ) ) {
final IActionSequenceResource resource = getResource(
AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN );
if ( resource.getSourceType() == IActionResource.XML ) {
String repDef = resource.getAddress();
ReportGenerator generator = ReportGenerator.getInstance();
report =
generator.parseReport( new InputSource( new ByteArrayInputStream( repDef.getBytes() ) ),
getDefinedResourceURL( null ) );
}
report = parseReport( resource );
} else if ( isDefinedInput( AbstractJFreeReportComponent.REPORTLOAD_RESOURCENAME ) ) {
final String resName = getInputStringValue( AbstractJFreeReportComponent.REPORTLOAD_RESOURCENAME );
if ( isDefinedResource( resName ) ) {
final IActionSequenceResource resource = getResource( resName );
report = parseReport( resource );
}
}
return report;
}
private MasterReport getReportFromInputParam() throws ResourceException, UnsupportedEncodingException, IOException {
MasterReport report = null;
if ( isDefinedInput( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN ) ) {
IActionParameter o = getInputParameter( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN );
if ( o != null ) {
String repDef = o.getStringValue();
ReportGenerator generator = ReportGenerator.getInstance();
IPentahoRequestContext requestContext = PentahoRequestContextHolder.getRequestContext();
URL url = null;
try {
url = new URL( requestContext.getContextPath() );
} catch ( Exception e ) {
// a null URL is ok
warn( Messages.getInstance().getString( "JFreeReportLoadComponent.WARN_COULD_NOT_CREATE_URL" ) ); //$NON-NLS-1$
}
report =
generator
.parseReport(
new InputSource( new ByteArrayInputStream( repDef.getBytes( "UTF-8" ) ) ),
getDefinedResourceURL( url ) ); //$NON-NLS-1$
}
}
return report;
}
private MasterReport getReportFromJar() throws Exception {
MasterReport report;
final IActionSequenceResource resource = getResource( AbstractJFreeReportComponent.DATACOMPONENT_JARINPUT );
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 = getInputStringValue( AbstractJFreeReportComponent.REPORTLOAD_REPORTLOC );
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();
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;
}
public MasterReport getReport() throws Exception {
MasterReport report = getReportFromResource();
if ( report == null ) {
report = getReportFromInputParam();
if ( report == null ) {
report = getReportFromJar();
}
}
return report;
}
@Override
protected boolean executeAction() throws Throwable {
boolean result = false;
try {
MasterReport report = getReport();
if ( report != null ) {
addTempParameterObject( AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT, report );
result = true;
}
} catch ( Exception ex ) {
error( ex.getMessage() );
}
return result;
}
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 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 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;
}
/**
* Parses the report, using the given ActionResource as initial report definition.
*
* @param resource
* @return
*/
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 helperObjects = new HashMap();
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();
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;
}
}
@Override
public boolean init() {
return true;
}
@Override
public Log getLogger() {
return LogFactory.getLog( JFreeReportLoadComponent.class );
}
}