blob: 9b22a1e418a75bb1a419a1b2926acfd8cb14bf80 [file] [log] [blame]
/*
* Example command-line utility to generate BIRT reports. Shows the basics
* of integrating the BIRT report engine into a simple Java application.
*/
package org.eclipse.birt.demo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.HTMLCompleteImageHandler;
import org.eclipse.birt.report.engine.api.HTMLEmitterConfig;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IGetParameterDefinitionTask;
import org.eclipse.birt.report.engine.api.IParameterDefnBase;
import org.eclipse.birt.report.engine.api.IParameterGroupDefn;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IScalarParameterDefn;
import org.eclipse.birt.report.engine.api.ReportEngine;
/**
* Runs a BIRT report and writes the output to a directory.
*
* RunReport report-name -[h|p] [-i] param=value
*
* -h HTML (default)
* -p PDF
* -i Display report info.
* param=value Set parameter "param" to the value "value".
*/
public class RunReport
{
// Command-line main to parse arguments described above.
public static void main(String[] args)
{
int i = 0;
if ( i >= args.length )
{
System.out.println( "No report specified." );
return;
}
String reportName = args[i++];
String format = null;
boolean showInfo = false;
// Stoare parameter values into a hash map to later pass to the
// BIRT report engine.
HashMap params = new HashMap( );
for ( ; i < args.length; i++ )
{
if ( args[i].charAt(0) == '-' )
{
char flag = Character.toLowerCase( args[i].charAt( 1 ) );
if ( flag == 'p' )
{
format = HTMLRenderOption.OUTPUT_FORMAT_PDF;
}
else if ( flag == 'h' )
{
format = HTMLRenderOption.OUTPUT_FORMAT_HTML;
}
else if ( flag == 'i' )
{
showInfo = true;
}
else
{
usage( );
return;
}
}
else
{
// Get a parameter value. Note, this example code only works
// for string parameters. If you have date or number parameters,
// your application should parse them, then put the corresponding
// objects into the hash map.
String arg = args[i];
int posn = arg.indexOf( '=' );
if ( posn == -1 )
{
usage( );
return;
}
String param = arg.substring( 0, posn );
String value = arg.substring( posn + 1 );
params.put( param, value );
}
}
run( reportName, params, format, showInfo );
}
public static void usage( )
{
System.out.println( "java RunReport rptName [-h|p]\n" );
System.out.println( " param=value ..." );
}
// Example function to run a report given the report name, parameters and
// output type. The output is put into a file in the same directory as the
// report itself.
public static void run( String name, HashMap params,
String format, boolean showInfo )
{
// The EngineConfig is used to set up engine-wide configuration
// information.
EngineConfig config = new EngineConfig( );
// The Engine home is the location of the BIRT engine runtime.
// M3 Note: Use the report engine installed as part of the BIRT web app
// used to preview reports. Alter this path to the location of your
// Eclipse installation.
config.setEngineHome( "c:\\eclipse3.1\\eclipse\\plugins\\org.eclipse.birt.report.viewer_1.0.1\\birt" );
// HTML reports can have embedded images or charts. Set up the configuration
// required to write these into a directory in the output directory.
// The HTMLCompleteImageHandler is one provided by BIRT for this purpose.
// Your application can create a customized version to provide alternative
// ways to handle images.
HTMLEmitterConfig hc = new HTMLEmitterConfig( );
HTMLCompleteImageHandler imageHandler = new HTMLCompleteImageHandler( );
hc.setImageHandler( imageHandler );
config.setEmitterConfiguration( HTMLRenderOption.OUTPUT_FORMAT_HTML, hc );
// Create the report engine itself. This engine can be used to run
// multiple reports.
ReportEngine engine = new ReportEngine( config );
// Open the report design.
IReportRunnable report = null;
try
{
report = engine.openReportDesign( name );
}
catch ( EngineException e )
{
System.err.println( "Report " + name + " not found!\n" );
engine.destroy( );
return;
}
if ( showInfo )
{
showReportInfo( engine, report );
}
// Create a task to run the report and convert the output to HTML
// or PDF.
if ( format != null )
{
parseParams( engine, report, params );
IRunAndRenderTask task = engine.createRunAndRenderTask( report );
HTMLRenderOption options = new HTMLRenderOption( );
options.setOutputFormat( format );
String output = name.replaceFirst( ".rptdesign", "." + format );
options.setOutputFileName( output );
task.setRenderOption( options );
task.setParameterValues( params );
// Run the report.
try
{
task.run( );
}
catch ( EngineException e1 )
{
System.err.println( "Report " + name + " run failed.\n" );
System.err.println( e1.toString( ) );
}
}
engine.destroy( );
}
// Display properties of the report and the list of report parameters.
static void showReportInfo( ReportEngine engine, IReportRunnable report )
{
// Display some of the general report properties.
// See the ROM Design specification for a list of properties.
System.out.print( "Report Name: " + report.getReportName() +
"\nTitle: " + report.getProperty( "title" ) +
"\nComments: " + report.getProperty( "comments" ) +
"\nDescription: " + report.getProperty( "description" ) +
"\nAuthor: " + report.getProperty( "author" ) +
"\nCreated By: " + report.getProperty( "createdBy" ) +
"\n" );
// Display the list of report parameters with their groups.
// Parameters defined outside a group appear inside a default, unnamed
// group.
IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( report );
Collection params = task.getParameterDefns( true );
if ( params.isEmpty() )
{
System.out.print( "This report has no parameters.\n" );
return;
}
Iterator iter = params.iterator( );
while ( iter.hasNext( ) )
{
IParameterDefnBase param = (IParameterDefnBase) iter.next( );
if ( param instanceof IParameterGroupDefn )
{
IParameterGroupDefn group = (IParameterGroupDefn) param;
System.out.println( "Parameter Group: " + group.getDisplayName( ) );
Iterator i2 = group.getContents( ).iterator( );
while ( iter.hasNext( ) )
{
IScalarParameterDefn member = (IScalarParameterDefn) i2.next( );
showParam( task, member, " " );
}
}
else
showParam( task, param, "" );
}
}
// Show information for one parameter.
// Release 1 supports only scalar (single-value) parameters.
static void showParam( IGetParameterDefinitionTask task,
IParameterDefnBase defn,
String prefix )
{
IScalarParameterDefn param = (IScalarParameterDefn) defn;
System.out.println( prefix + "Parameter: " + param.getName( ) );
System.out.println( prefix + " Display Name: " + param.getDisplayName( ) );
System.out.println( prefix + " Type: " + param.getDataType( ) );
System.out.print( prefix + " Default Value: " );
// The default value is an expression. Evaluate it.
Object value = task.getDefaultValue( param );
System.out.println( value == null ? "none" : value.toString( ) );
}
static void parseParams( ReportEngine engine, IReportRunnable report, HashMap values )
{
if ( values.isEmpty( ) )
return;
IGetParameterDefinitionTask task = engine.createGetParameterDefinitionTask( report );
Collection params = task.getParameterDefns( false );
Iterator iter = values.keySet( ).iterator( );
while ( iter.hasNext( ) )
{
String name = (String) iter.next( );
IScalarParameterDefn found = null;
Iterator i2 = params.iterator( );
while ( i2.hasNext( ) )
{
IParameterDefnBase param = (IParameterDefnBase) i2.next( );
if ( param instanceof IParameterGroupDefn )
continue;
if ( param.getName( ).equals( name ) )
{
found = (IScalarParameterDefn) param;
break;
}
}
if ( found == null )
{
System.err.println( "Parameter " + name + " not found in the report." );
continue;
}
String value = (String) values.get( name );
// ReportParameterConverter cfgConverter = new ReportParameterConverter( "", Locale.getDefault( ) );
// Object obj = cfgConverter.parse( value, found.getDataType( ) );
// values.put( name, obj );
values.put( name, value );
}
}
}