Package org.pentaho.reporting.engine.classic.core.testsupport

Source Code of org.pentaho.reporting.engine.classic.core.testsupport.DataSourceTestBase

/*
* 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) 2000 - 2013 Pentaho Corporation and Contributors...
* All rights reserved.
*/

package org.pentaho.reporting.engine.classic.core.testsupport;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import javax.naming.spi.NamingManager;
import javax.swing.table.TableModel;

import junit.framework.TestCase;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.DataFactory;
import org.pentaho.reporting.engine.classic.core.DataFactoryDesignTimeSupport;
import org.pentaho.reporting.engine.classic.core.DataRow;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ParameterDataRow;
import org.pentaho.reporting.engine.classic.core.ReportDataFactoryException;
import org.pentaho.reporting.engine.classic.core.SubReport;
import org.pentaho.reporting.engine.classic.core.designtime.datafactory.DesignTimeDataFactoryContext;
import org.pentaho.reporting.engine.classic.core.modules.misc.tablemodel.TableModelInfo;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.BundleWriter;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.BundleWriterException;
import org.pentaho.reporting.engine.classic.core.util.CloseableTableModel;
import org.pentaho.reporting.libraries.base.util.DebugLog;
import org.pentaho.reporting.libraries.base.util.MemoryByteArrayOutputStream;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.repository.ContentIOException;
import org.pentaho.reporting.libraries.resourceloader.Resource;
import org.pentaho.reporting.libraries.resourceloader.ResourceException;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;

public abstract class DataSourceTestBase extends TestCase
{
  public DataSourceTestBase()
  {
  }

  public DataSourceTestBase(final String name)
  {
    super(name);
  }

  public void setUp() throws Exception
  {
    ClassicEngineBoot.getInstance().start();
    if (NamingManager.hasInitialContextFactoryBuilder() == false)
    {
      NamingManager.setInitialContextFactoryBuilder(new DebugJndiContextFactoryBuilder());
    }
  }

  protected void runSerialize(final String[][] queriesAndResults) throws Exception
  {
    if (queriesAndResults.length == 0)
    {
      return;
    }

    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];

      DebugLog.log("Executing query " + query);

      final DataFactory dataFactory = createDataFactory(query);

      final ByteArrayOutputStream bo = new ByteArrayOutputStream();
      final ObjectOutputStream out = new ObjectOutputStream(bo);
      out.writeObject(dataFactory);

      final ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray()));
      final DataFactory e2 = (DataFactory) oin.readObject();
      assertNotNull(e2); // cannot assert equals, as this is not implemented ...
      initializeDataFactory(e2);
      final String queryResult = performQueryTest(e2);
      compareLineByLine(resultFile, queryResult);
    }
  }

  protected void runDerive(final String[][] queriesAndResults) throws Exception
  {
    if (queriesAndResults.length == 0)
    {
      return;
    }

    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];
      final DataFactory dataFactory = createDataFactory(query);

      final DataFactory e2 = dataFactory.derive();
      assertNotNull(e2); // cannot assert equals, as this is not implemented ...
      initializeDataFactory(e2);
      final String queryResult = performQueryTest(e2);
      compareLineByLine(resultFile, queryResult);
    }
  }

  protected void runSaveAndLoadForSubReports(final String[][] queriesAndResults) throws Exception
  {
    if (queriesAndResults.length == 0)
    {
      return;
    }

    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];
      final DataFactory dataFactory = createDataFactory(query);

      SubReport subReport = new SubReport();
      subReport.setDataFactory(dataFactory);

      final MasterReport report = new MasterReport();
      report.getReportHeader().addSubReport(subReport);

      final MemoryByteArrayOutputStream bout = new MemoryByteArrayOutputStream();
      BundleWriter.writeReportToZipStream(report, bout);
      final ResourceManager mgr = new ResourceManager();
      mgr.registerDefaults();

      final Resource resource = mgr.createDirectly(bout.toByteArray(), MasterReport.class);
      final MasterReport r2 = (MasterReport) resource.getResource();
      final SubReport sr2 = r2.getReportHeader().getSubReport(0);
      final DataFactory e2 = sr2.getDataFactory();
      assertNotNull(e2); // cannot assert equals, as this is not implemented ...
      initializeDataFactory(e2);
      final String queryResult = performQueryTest(e2);
      compareLineByLine(resultFile, queryResult);
    }
  }

  protected void runSaveAndLoad(final String[][] queriesAndResults) throws Exception
  {
    if (queriesAndResults.length == 0)
    {
      return;
    }

    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];
      final DataFactory dataFactory = createDataFactory(query);

      final DataFactory e2 = loadAndSaveOnReport(dataFactory);

      assertNotNull(e2); // cannot assert equals, as this is not implemented ...
      initializeDataFactory(e2);
      final String queryResult = performQueryTest(e2);
      compareLineByLine(resultFile, queryResult);
    }
  }

  public static DataFactory loadAndSaveOnReport(final DataFactory dataFactory) throws IOException, BundleWriterException, ContentIOException, ResourceException
  {
    final MasterReport report = new MasterReport();
    report.setDataFactory(dataFactory);

    final MemoryByteArrayOutputStream bout = new MemoryByteArrayOutputStream();
    BundleWriter.writeReportToZipStream(report, bout);
    final ResourceManager mgr = new ResourceManager();
    mgr.registerDefaults();

    final Resource resource = mgr.createDirectly(bout.toByteArray(), MasterReport.class);
    final MasterReport r2 = (MasterReport) resource.getResource();
    return r2.getDataFactory();
  }

  protected void runTest(final String[][] queriesAndResults) throws Exception
  {
    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];
      final DataFactory dataFactory = createDataFactory(query);
      initializeDataFactory(dataFactory);
      final String queryResult = performQueryTest(dataFactory);
      compareLineByLine(resultFile, queryResult);
    }
  }

  public void runGenerate(final String[][] queriesAndResults) throws Exception
  {
    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String query = queriesAndResults[i][0];
      final String resultFile = queriesAndResults[i][1];
      final DataFactory dataFactory = createDataFactory(query);
      initializeDataFactory(dataFactory);
      generate(dataFactory, resultFile);
    }
  }

  protected void runTestDesignTime(final String[][] queriesAndResults) throws Exception
  {
    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String[] queriesAndResult = queriesAndResults[i];
      final String query = queriesAndResult[0];
      final String resultFile = queriesAndResult[2];
      final DataFactoryDesignTimeSupport dataFactory = (DataFactoryDesignTimeSupport) createDataFactory(query);
      initializeDataFactory(dataFactory);
      final String queryResult = performDesignTimeTest(dataFactory);
      compareLineByLine(resultFile, queryResult);
    }
  }

  public void runGenerateDesignTime(final String[][] queriesAndResults) throws Exception
  {
    for (int i = 0; i < queriesAndResults.length; i++)
    {
      final String[] queriesAndResult = queriesAndResults[i];
      final String query = queriesAndResult[0];
      final String resultFile = queriesAndResult[2];
      final DataFactoryDesignTimeSupport dataFactory = (DataFactoryDesignTimeSupport) createDataFactory(query);
      initializeDataFactory(dataFactory);
      generateDesignTime(dataFactory, resultFile);
    }
  }

  protected void generate(final DataFactory dataFactory,
                          final String resultFile) throws ReportDataFactoryException, SQLException, IOException
  {
    final String queryResult = performQueryTest(dataFactory);

    final String packageName = getClass().getPackage().getName();
    final String pathName = packageName.replace(".", "/");
    final File file = new File(getTestDirectory() + "/" + pathName + "/" + resultFile);
    System.out.println("Generating test result: " + file.getAbsolutePath());
    final FileOutputStream fout = new FileOutputStream(file);
    try
    {
      fout.write(queryResult.getBytes("UTF-8"));
    }
    finally
    {
      fout.close();
    }
  }

  protected void generateDesignTime(final DataFactoryDesignTimeSupport dataFactory,
                                    final String resultFile) throws ReportDataFactoryException, SQLException, IOException
  {
    final String queryResult = performDesignTimeTest(dataFactory);

    final String packageName = getClass().getPackage().getName();
    final String pathName = packageName.replace(".", "/");
    final File file = new File(getTestDirectory() + "/" + pathName + "/" + resultFile);
    System.out.println("Generating test result: " + file.getAbsolutePath());
    final FileOutputStream fout = new FileOutputStream(file);
    try
    {
      fout.write(queryResult.getBytes("UTF-8"));
    }
    finally
    {
      fout.close();
    }
  }

  protected String getTestDirectory()
  {
    return "test";
  }

  protected void initializeDataFactory(final DataFactory dataFactory) throws ReportDataFactoryException
  {
    dataFactory.initialize(new DesignTimeDataFactoryContext());
  }

  protected abstract DataFactory createDataFactory(final String query) throws ReportDataFactoryException;

  protected void compareLineByLine(final String sourceFile, final String resultText) throws IOException
  {
    final BufferedReader resultReader = new BufferedReader(new StringReader(resultText));
    final InputStream stream = ObjectUtilities.getResourceRelativeAsStream(sourceFile, getClass());
    if (stream == null)
    {
      throw new NullPointerException("Cannot locate resource '" + sourceFile + "' with context " + getClass());
    }
    final BufferedReader compareReader = new BufferedReader(new InputStreamReader
        (stream, "UTF-8"));
    try
    {
      int line = 1;
      String lineResult = resultReader.readLine();
      String lineSource = compareReader.readLine();
      while (lineResult != null && lineSource != null)
      {
        assertEquals("Failure in line " + line + " (file: " + sourceFile + ")", lineSource, lineResult);
        line += 1;
        lineResult = resultReader.readLine();
        lineSource = compareReader.readLine();
      }

      assertNull("Extra lines encountered in live-result " + line + " (file: " + sourceFile + ")", lineResult);
      assertNull("Extra lines encountered in recorded result " + line + " (file: " + sourceFile + ")", lineSource);
    }
    finally
    {
      resultReader.close();
      compareReader.close();
    }
  }

  protected String getLogicalQueryForNextTest()
  {
    return "default";
  }

  protected String performQueryTest(final DataFactory dataFactory) throws SQLException, ReportDataFactoryException
  {
    final ByteArrayOutputStream sw = new ByteArrayOutputStream();
    try
    {
      final PrintStream ps = new PrintStream(sw, true, "UTF-8");
      final TableModel tableModel = dataFactory.queryData(getLogicalQueryForNextTest(), getParameterForNextTest());
      generateCompareText(ps, tableModel);
      if (tableModel instanceof CloseableTableModel)
      {
        final CloseableTableModel ctm = (CloseableTableModel) tableModel;
        ctm.close();
      }
      return sw.toString("UTF-8");
    }
    catch (UnsupportedEncodingException e)
    {
      throw new ReportDataFactoryException("If UTF-8 is not supported, we are in trouble.");
    }
    finally
    {
      dataFactory.close();
    }
  }

  protected String performDesignTimeTest(final DataFactoryDesignTimeSupport dataFactory) throws SQLException, ReportDataFactoryException
  {
    final ByteArrayOutputStream sw = new ByteArrayOutputStream();
    try
    {
      final PrintStream ps = new PrintStream(sw, true, "UTF-8");
      final TableModel tableModel = dataFactory.queryDesignTimeStructure(getLogicalQueryForNextTest(), getParameterForNextTest());
      generateCompareText(ps, tableModel);
      if (tableModel instanceof CloseableTableModel)
      {
        final CloseableTableModel ctm = (CloseableTableModel) tableModel;
        ctm.close();
      }
      return sw.toString("UTF-8");
    }
    catch (UnsupportedEncodingException e)
    {
      throw new ReportDataFactoryException("If UTF-8 is not supported, we are in trouble.");
    }
    finally
    {
      dataFactory.close();
    }
  }

  protected void generateCompareText(final PrintStream ps, final TableModel tableModel)
  {
    TableModelInfo.printTableModel(tableModel, ps);
    TableModelInfo.printTableMetaData(tableModel, ps);
    TableModelInfo.printTableCellAttributes(tableModel, ps);
    TableModelInfo.printTableModelContents(tableModel, ps);
  }

  protected DataRow getParameterForNextTest()
  {
    return new ParameterDataRow();
  }

  public static void assertNotEquals(final String message, final Object o1, final Object o2)
  {
    if (o1 == o2)
    {
      fail(message);
    }
    if (o1 != null && o2 == null)
    {
      return;
    }
    if (o1 == null)
    {
      return;
    }
    if (o1.equals(o2))
    {
      fail(message);
    }
  }

}
TOP

Related Classes of org.pentaho.reporting.engine.classic.core.testsupport.DataSourceTestBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.