/*! * 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.commons.connection.IPentahoConnection; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.jfreereport.castormodel.reportspec.ReportSpec; import org.pentaho.jfreereport.wizard.utility.CastorUtility; import org.pentaho.jfreereport.wizard.utility.report.ReportGenerationUtility; import org.pentaho.jfreereport.wizard.utility.report.ReportParameterUtility; import org.pentaho.platform.api.data.IDBDatasourceService; import org.pentaho.platform.api.engine.IActionParameter; import org.pentaho.platform.api.engine.IActionSequenceResource; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.connection.PentahoConnectionFactory; import org.pentaho.platform.plugin.action.jfreereport.AbstractJFreeReportComponent; import org.pentaho.platform.plugin.action.messages.Messages; import org.pentaho.util.messages.LocaleHelper; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.Properties; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * This component generates report definitions. It uses the report wizard for the magical generation task. * * @deprecated * @author Thomas Morgner */ @Deprecated public class JFreeReportGenerateDefinitionComponent extends AbstractJFreeReportComponent { private static final long serialVersionUID = -6364796568478754207L; public JFreeReportGenerateDefinitionComponent() { } @Override protected boolean validateAction() { if ( isDefinedResource( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTSPECINPUT ) == false ) { return false; } return true; } @Override protected boolean validateSystemSettings() { return true; } @Override public void done() { } /** * Look through the Zip stream and find an entry whose name is .xreportspec. If the entry is found, return it, * otherwise return null. * * @param zStrm * @return If the entry is found, return it, otherwise return null. * @throws IOException */ private ZipEntry findReportSpec( final ZipInputStream zStrm ) throws IOException { ZipEntry reportSpecEntry = null; // for loop has no body for ( reportSpecEntry = zStrm.getNextEntry(); ( null != reportSpecEntry ) && !reportSpecEntry.getName().endsWith( ".xreportspec" ); reportSpecEntry = zStrm //$NON-NLS-1$ .getNextEntry() ) { boolean ignore = true; } return reportSpecEntry; } private ReportSpec loadFromZip( final IActionSequenceResource resource ) { try { InputStream reportSpecInputStream = resource.getInputStream( RepositoryFilePermission.READ, LocaleHelper.getLocale() ); ZipInputStream zis = new ZipInputStream( reportSpecInputStream ); ZipEntry reportSpecEntry = findReportSpec( zis ); if ( reportSpecEntry == null ) { return null; } // is this really sane? Blindly using the first zip entry is ... argh! // maybe you should use GZipped streams instead... return (ReportSpec) CastorUtility.getInstance().readCastorObject( zis, ReportSpec.class ); } catch ( Exception e ) { return null; } } public ReportSpec getReportSpec() throws FileNotFoundException { ReportSpec reportSpec = null; if ( isDefinedResource( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTSPECINPUT ) ) { IActionSequenceResource resource = getResource( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTSPECINPUT ); reportSpec = loadFromZip( resource ); if ( reportSpec == null ) { InputStream reportSpecInputStream = resource.getInputStream( RepositoryFilePermission.READ, LocaleHelper.getLocale() ); reportSpec = (ReportSpec) CastorUtility.getInstance().readCastorObject( reportSpecInputStream, ReportSpec.class ); } } return reportSpec; } public IPentahoResultSet getResultSet( final ReportSpec reportSpec ) throws Exception { String jndiName = reportSpec.getReportSpecChoice().getJndiSource(); IPentahoConnection connection = null; if ( reportSpec.getIsMDX() ) { // did this ever work?? String connectStr = ""; //$NON-NLS-1$ IDBDatasourceService datasourceService = PentahoSystem.getObjectFactory().get( IDBDatasourceService.class, null ); String dsName = datasourceService.getDSBoundName( jndiName ); if ( dsName != null ) { connectStr = "dataSource=" + dsName + "; Catalog=mondrian"; //$NON-NLS-1$ //$NON-NLS-2$ } else { error( Messages.getInstance().getErrorString( "MDXBaseComponent.ERROR_0005_INVALID_CONNECTION" ) ); //$NON-NLS-1$ return null; } Properties props = new Properties(); props.setProperty( IPentahoConnection.CONNECTION, connectStr ); props.setProperty( IPentahoConnection.PROVIDER, reportSpec.getMondrianCubeDefinitionPath() ); connection = PentahoConnectionFactory.getConnection( IPentahoConnection.MDX_DATASOURCE, props, getSession(), this ); } else { connection = PentahoConnectionFactory.getConnection( IPentahoConnection.SQL_DATASOURCE, jndiName, getSession(), this ); } String query = ReportParameterUtility.setupParametersForActionSequence( reportSpec.getQuery() ); query = setupQueryParameters( query ); IPentahoResultSet res = connection.executeQuery( query ); return res; } @Override protected boolean executeAction() { boolean result = true; try { ReportSpec reportSpec = getReportSpec(); if ( reportSpec != null ) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ReportGenerationUtility.createJFreeReportXML( reportSpec, outputStream, 0, 0, false, "", 0, 0 ); //$NON-NLS-1$ String reportDefinition = new String( outputStream.toByteArray() ); addTempParameterObject( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTDEFN, reportDefinition ); // if that parameter is not defined, we do query for backward compatibility. if ( !isDefinedInput( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTTEMP_PERFQRY ) || "true".equals( getInputParameter( AbstractJFreeReportComponent.REPORTGENERATEDEFN_REPORTTEMP_PERFQRY ) ) ) { //$NON-NLS-1$ try { addTempParameterObject( AbstractJFreeReportComponent.DATACOMPONENT_DATAINPUT, getResultSet( reportSpec ) ); } catch ( Exception e ) { result = false; } } } } catch ( FileNotFoundException ex ) { error( ex.getLocalizedMessage() ); result = false; } return result; } @Override public boolean init() { return true; } @Override public Log getLogger() { return LogFactory.getLog( JFreeReportGenerateDefinitionComponent.class ); } public String setupQueryParameters( String query ) { Set inputNames = getInputNames(); Iterator iter = inputNames.iterator(); while ( iter.hasNext() ) { String inputName = (String) iter.next(); final IActionParameter inputParameter = getInputParameter( inputName ); final Object value = inputParameter.getValue(); if ( ( value instanceof String ) == false ) { continue; } String paramValue = (String) value; String param = "\\{" + inputName + "\\}"; //$NON-NLS-1$ //$NON-NLS-2$ query = query.replaceAll( param, paramValue ); } return query; } }