/*! * 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-2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.platform.plugin; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.pentaho.platform.api.data.IDBDatasourceService; import org.pentaho.platform.api.engine.IApplicationContext; import org.pentaho.platform.api.engine.IPentahoDefinableObjectFactory; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.engine.IPluginProvider; import org.pentaho.platform.api.engine.IServiceManager; import org.pentaho.platform.api.engine.ISolutionEngine; import org.pentaho.platform.api.engine.IUserRoleListService; import org.pentaho.platform.api.repository2.unified.IUnifiedRepository; import org.pentaho.platform.engine.core.system.PentahoSessionHolder; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.core.system.StandaloneSession; import org.pentaho.platform.engine.security.userrole.ws.MockUserRoleListService; import org.pentaho.platform.engine.services.connection.datasource.dbcp.JndiDatasourceService; import org.pentaho.platform.engine.services.solution.SolutionEngine; import org.pentaho.platform.plugin.action.mondrian.catalog.IMondrianCatalogService; import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalogHelper; import org.pentaho.platform.plugin.services.connections.sql.SQLConnection; import org.pentaho.platform.plugin.services.pluginmgr.SystemPathXmlPluginProvider; import org.pentaho.platform.plugin.services.pluginmgr.servicemgr.DefaultServiceManager; import org.pentaho.platform.repository2.unified.RepositoryUtils; import org.pentaho.platform.repository2.unified.fs.FileSystemBackedUnifiedRepository; 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.StaticDataRow; import org.pentaho.reporting.engine.classic.core.designtime.datafactory.DesignTimeDataFactoryContext; import org.pentaho.reporting.libraries.base.util.DebugLog; import org.pentaho.reporting.libraries.base.util.NullOutputStream; import org.pentaho.reporting.libraries.resourceloader.ResourceManager; import org.pentaho.reporting.platform.plugin.async.ReportListenerThreadHolder; import org.pentaho.reporting.platform.plugin.repository.PentahoNameGenerator; import org.pentaho.reporting.platform.plugin.repository.TempDirectoryNameGenerator; import org.pentaho.test.platform.engine.core.MicroPlatform; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.swing.table.TableModel; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.StringWriter; import static org.junit.Assert.assertEquals; @Ignore public class ParameterIT { private static final String SOLUTION_PATH = "target/test/resource/solution"; private static MicroPlatform microPlatform; public ParameterIT() { } @BeforeClass public static void setUp() throws Exception { System .setProperty( "java.naming.factory.initial", "org.osjava.sj.SimpleContextFactory" ); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty( "org.osjava.sj.root", SOLUTION_PATH + "/system/simple-jndi" ); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty( "org.osjava.sj.delimiter", "/" ); //$NON-NLS-1$ //$NON-NLS-2$ // Microplatform does not invoke our startup listeners, so we have to ensure that the reporting engine is // booted correctly. ClassicEngineBoot.getInstance().start(); final File tmp = new File( "target/test/resource/solution/system/tmp" ); tmp.mkdirs(); microPlatform = new MicroPlatform( SOLUTION_PATH ); final IUnifiedRepository repository = new FileSystemBackedUnifiedRepository( SOLUTION_PATH ); microPlatform.defineInstance( IUnifiedRepository.class, repository ); Assert.assertNotNull( new RepositoryUtils( repository ).getFolder( "/etc/metadata", true, true, null ) ); Assert.assertNotNull( new RepositoryUtils( repository ).getFolder( "/etc/mondrian", true, true, null ) ); Assert.assertNotNull( new RepositoryUtils( repository ).getFolder( "/savetest", true, true, null ) ); microPlatform.define( ISolutionEngine.class, SolutionEngine.class ); microPlatform.define( PentahoNameGenerator.class, TempDirectoryNameGenerator.class ); microPlatform.define( IUserRoleListService.class, MockUserRoleListService.class ); microPlatform.defineInstance( "connection-SQL", new SQLConnection() ); microPlatform.defineInstance( IDBDatasourceService.class, new JndiDatasourceService() ); microPlatform.define( IMondrianCatalogService.class, MondrianCatalogHelper.class, IPentahoDefinableObjectFactory.Scope.GLOBAL ); microPlatform .define( IServiceManager.class, DefaultServiceManager.class, IPentahoDefinableObjectFactory.Scope.GLOBAL ); microPlatform.define( IPluginProvider.class, SystemPathXmlPluginProvider.class ); microPlatform.start(); IPentahoSession session = new StandaloneSession( "test user" ); PentahoSessionHolder.setSession( session ); } @AfterClass public static void tearDown() throws Exception { microPlatform.stop(); microPlatform = null; } @Test public void testParameterProcessing() throws Exception { final ParameterContentGenerator contentGenerator = new ParameterContentGenerator(); final ParameterXmlContentHandler handler = new ParameterXmlContentHandler( contentGenerator, false ); handler.createParameterContent( System.out, "target/test/solution/test/reporting/Product Sales.prpt", PentahoSystem.getApplicationContext().getSolutionPath( "target/test/solution/test/reporting/Product Sales.prpt" ), false, null ); } /** * verifies cases * <p> * http://jira.pentaho.com/browse/PRD-3882 values containing illegal control chars are base64 encoded, and that the * "encoded=true" attribute is set as expected. For example, <value encoded="true" label="Gg==" null="false" * selected="false" type="java.lang.String" value="Gg=="/> * <p> * http://jira.pentaho.com/browse/PPP-3343 that Japanese values are not encoded * <p> * http://jira.pentaho.com/browse/BISERVER-11918 that special characters are not encoded */ @Test public void testEncodedParameterValues() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ParameterContentGenerator contentGenerator = new ParameterContentGenerator(); final ParameterXmlContentHandler handler = new ParameterXmlContentHandler( contentGenerator, false ); handler.createParameterContent( baos, "/test/reporting/prd3882.prpt", "target/test/resource/solution/test/reporting/prd3882.prpt", false, null ); DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.parse( new ByteArrayInputStream( baos.toByteArray() ) ); String[] expectedVal = new String[] { "1qA", "+ / : ; = ? [ ] ^ \\", "果物" }; //this label is shown user! you should be able to read items! String[] expectedLab = new String[] { "1qA", "+ / : ; = ? [ ] ^ \\", "果物" }; String[] expectedEncoded = new String[] { null, null, null }; NodeList parameter = doc.getElementsByTagName( "parameter" ); for ( int n = 0; n < parameter.getLength(); n += 1 ) { Element param = (Element) parameter.item( n ); if ( "dropDown".equals( param.getAttribute( "name" ) ) || "singleSelection" .equals( param.getAttribute( "name" ) ) ) { DebugLog.log( debugXmlNodes( param ) ); // there are no values, as the query seems to return no data. However, it does not fail either .. /* NodeList valueElements = param.getElementsByTagName("value"); Assert.assertEquals(expectedVal.length, valueElements.getLength()); for ( int i = 0; i < expectedVal.length; i++ ) { Element valueElement = (Element) valueElements.item(i); String value = valueElement.getAttribute( "value" ); Node encoded = valueElement.getAttributeNode( "encoded" ); String label = valueElement.getAttribute("label"); assertEquals( expectedVal[i], value ); assertEquals( expectedLab[i], label ); assertEquals( expectedEncoded[i], encoded == null ? encoded : encoded.getTextContent() ); } */ } } } @Test public void testParameterQuery() throws Exception { ResourceManager mgr = new ResourceManager(); MasterReport report = (MasterReport) mgr .createDirectly( new File( "/test/reporting/prd3882.prpt" ), MasterReport.class ).getResource(); DataFactory dataFactory = report.getDataFactory(); try { dataFactory.initialize( new DesignTimeDataFactoryContext( report ) ); TableModel tableModel = dataFactory.queryData( "Query 1", new StaticDataRow() ); assertEquals( 2, tableModel.getColumnCount() ); assertEquals( 3, tableModel.getRowCount() ); } finally { dataFactory.close(); } } @Test public void testRequestIdIsSet() throws Exception { final ParameterContentGenerator parameterContentGenerator = new ParameterContentGenerator(); parameterContentGenerator.setInstanceId( "test" ); try { parameterContentGenerator.createContent( new NullOutputStream() ); } catch ( final Exception e ) { //ignore } finally { assertEquals( "test", ReportListenerThreadHolder.getRequestId() ); } } private String debugXmlNodes( Node node ) throws TransformerException { TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(); StringWriter buffer = new StringWriter(); transformer.setOutputProperty( OutputKeys.INDENT, "yes" ); transformer.transform( new DOMSource( node ), new StreamResult( buffer ) ); return buffer.toString(); } }