/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
package mod._dbaccess;
import ifc.sdb._XCompletedExecution;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import lib.StatusException;
import lib.TestCase;
import lib.TestEnvironment;
import lib.TestParameters;
import util.DBTools;
import util.utils;
import util.db.DataSource;
import util.db.DataSourceDescriptor;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.sdb.CommandType;
import com.sun.star.sdb.ParametersRequest;
import com.sun.star.sdb.RowChangeEvent;
import com.sun.star.sdb.XInteractionSupplyParameters;
import com.sun.star.sdbc.SQLException;
import com.sun.star.sdbc.XConnection;
import com.sun.star.sdbc.XParameters;
import com.sun.star.sdbc.XResultSet;
import com.sun.star.sdbc.XResultSetUpdate;
import com.sun.star.sdbc.XRow;
import com.sun.star.sdbc.XRowSet;
import com.sun.star.sdbc.XRowUpdate;
import com.sun.star.task.XInteractionAbort;
import com.sun.star.task.XInteractionContinuation;
import com.sun.star.task.XInteractionRequest;
import com.sun.star.ucb.AuthenticationRequest;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.util.XCloseable;
/**
* Test for object which is represented by service
* com.sun.star.sdb.RowSet.
*
* The following files used by this test :
*
*
TestDB/TestDB.dbf : the database file with some
* predefined fields described in util.DBTools.
* The copy of this file is always made in temp directory for
* testing purposes.
*
* The following parameters in ini-file used by this test:
*
*
test.db.url - URL to MySQL database.
* For example: mysql://mercury:3306/api_current
*
test.db.user - user for MySQL database
*
test.db.password - password for MySQL database
*
*
* @see com.sun.star.sdbc.RowSet
* @see com.sun.star.sdbcx.XRowLocate
* @see com.sun.star.sdbc.XResultSetUpdate
* @see com.sun.star.util.XCancellable
* @see com.sun.star.sdbc.XParameters
* @see com.sun.star.sdbc.XResultSetMetaDataSupplier
* @see com.sun.star.sdbcx.XDeleteRows
* @see com.sun.star.sdbc.XCloseable
* @see com.sun.star.sdbcx.XColumnsSupplier
* @see com.sun.star.sdb.XResultSetAccess
* @see com.sun.star.sdbc.XResultSet
* @see com.sun.star.sdbc.XColumnLocate
* @see com.sun.star.sdbc.XRowSet
* @see com.sun.star.sdb.RowSet
* @see com.sun.star.sdbc.XRowUpdate
* @see com.sun.star.sdb.XRowSetApproveBroadcaster
* @see com.sun.star.beans.XPropertySet
* @see com.sun.star.sdbc.XRow
* @see com.sun.star.sdbc.XWarningsSupplier
* @see com.sun.star.lang.XComponent
* @see com.sun.star.sdbcx.ResultSet
* @see com.sun.star.sdbc.ResultSet
* @see ifc.sdbc._RowSet
* @see ifc.sdbcx._XRowLocate
* @see ifc.sdbc._XResultSetUpdate
* @see ifc.util._XCancellable
* @see ifc.sdbc._XParameters
* @see ifc.sdbc._XResultSetMetaDataSupplier
* @see ifc.sdbcx._XDeleteRows
* @see ifc.sdbc._XCloseable
* @see ifc.sdbcx._XColumnsSupplier
* @see ifc.sdb._XResultSetAccess
* @see ifc.sdbc._XResultSet
* @see ifc.sdbc._XColumnLocate
* @see ifc.sdbc._XRowSet
* @see ifc.sdb._RowSet
* @see ifc.sdbc._XRowUpdate
* @see ifc.sdb._XRowSetApproveBroadcaster
* @see ifc.beans._XPropertySet
* @see ifc.sdbc._XRow
* @see ifc.sdbc._XWarningsSupplier
* @see ifc.lang._XComponent
* @see ifc.sdbcx._ResultSet
* @see ifc.sdbc._ResultSet
*/
public class ORowSet extends TestCase {
private static int uniqueSuffix = 0 ;
private DBTools dbTools = null ;
private static String origDB = null ;
String tableName = null;
DataSourceDescriptor srcInf = null;
boolean isMySQLDB = false;
protected static final String dbSourceName = "ORowSetDataSource";
public XConnection m_connection = null;
private Object m_rowSet = null;
private DataSource m_dataSource;
private String m_tableFile;
/**
* Initializes some class fields. Then creates DataSource, which serves
* as a single source for all tables created in the test.
* This DataSource then registered in the global
* DatabaseContext service. This data source's URL
* points to SOffice temp directory where tables are copied from
* TestDocuments directory on every environment
* creation.
* To create DataSource for MySQL database next parameters required
* in ini-file:
*
*
test.db.url - URL to MySQL database.
* For example: mysql://mercury:3306/api_current
*
test.db.user - user for MySQL database
*
test.db.password - password for MySQL database
*
*
* @throws StatusException if DataSource can not be created or
* registered.
*/
@Override
protected void initialize ( TestParameters Param, PrintWriter _log)
throws StatusException
{
XMultiServiceFactory orb = Param.getMSF();
String tmpDir = utils.getOfficeTemp( orb );
origDB = util.utils.getFullTestDocName("TestDB/testDB.dbf");
dbTools = new DBTools( orb );
// creating DataSource and registering it in DatabaseContext
String dbURL = (String) Param.get("test.db.url");
String dbUser = (String) Param.get("test.db.user");
String dbPassword = (String) Param.get("test.db.password");
log.println("Creating and registering DataSource ...");
srcInf = new DataSourceDescriptor( orb );
if (dbURL != null && dbUser != null && dbPassword != null)
{
isMySQLDB = true;
log.println("dbURL = " + dbURL);
log.println("dbUSER = " + dbUser);
log.println("dbPASSWORD = " + dbPassword);
//DataSource for mysql db
tableName = "soffice_test_table";
srcInf.URL = "jdbc:" + dbURL;
srcInf.IsPasswordRequired = Boolean.TRUE;
srcInf.Password = dbPassword;
srcInf.User = dbUser;
PropertyValue[] propInfo = new PropertyValue[1];
propInfo[0] = new PropertyValue();
propInfo[0].Name = "JavaDriverClass";
propInfo[0].Value = "org.gjt.mm.mysql.Driver";
srcInf.Info = propInfo;
}
else
{
srcInf.URL = "sdbc:dbase:" + DBTools.dirToUrl(tmpDir);
}
m_dataSource = srcInf.createDataSource();
m_dataSource.registerAs( dbSourceName, true );
}
/**
* Creating a TestEnvironment for the interfaces to be tested.
* The database (DBF) file is copied from test document directory
* into SOffice temp dir with unique name for each environment
* creation. If the file can't be copied (is not released)
* then another unique name is used (file name suffix incremented
* by 1).
*
* com.sun.star.sdb.RowSet service created and its
* source is all rows from the current copy of the table. Then
* row set command ("select all rows from a table") is executed
* and cursor is positioned to the first row.
*
* Object relations created :
*
*
'ORowSet.Connection' for
* internal component test usage. Is used for
* closing connection when cleaning up environment.
*
'XRowSetApproveBroadcaster.ApproveChecker' for
* {@link ifc.sdb._XRowSetApproveBroadcaster} interface
* implementation which made actions required
*
'CurrentRowData' for
* {@link ifc.sdbc._XRow}, {@link ifc.sdbc._XRowUpdate} :
* exports types and values of the current row data.
*
'XColumnLocate.ColumnName' for
* {@link ifc.sdbc._XColumnLocate} :
* the name of the first column of the table.
*
'XParameters.ParamValues' for
* {@link ifc.sdbc._XParameters} :
* Collection of parameter types presented in the query.
*
'XRowUpdate.XRow' for
* {@link ifc.sdbc._XRowUpdate} :
* XRow interface of the current component.
*
'XResultSetUpdate.UpdateTester' for
* {@link ifc.sdbc._XResultSetUpdate}
*
*
* @see com.sun.star.sdb.DatabaseContext
* @see com.sun.star.sdb.DataSource
*/
@Override
protected TestEnvironment createTestEnvironment(TestParameters Param,
PrintWriter log) throws Exception
{
XMultiServiceFactory orb = Param.getMSF();
uniqueSuffix++;
boolean envCreatedOK = false ;
//initialize test table
if (isMySQLDB)
{
DBTools.DataSourceInfo legacyDescriptor = dbTools.newDataSourceInfo();
legacyDescriptor.Name = null;
legacyDescriptor.User = srcInf.User;
legacyDescriptor.Password = srcInf.Password;
legacyDescriptor.Info = srcInf.Info;
legacyDescriptor.URL = srcInf.URL;
legacyDescriptor.IsPasswordRequired = srcInf.IsPasswordRequired;
dbTools.initTestTableUsingJDBC(tableName, legacyDescriptor);
}
else
{
String oldF = null ;
String newF = null ;
String tempFolder = utils.getOfficeTemp( orb );
do
{
tableName = "ORowSet_tmp" + uniqueSuffix ;
oldF = utils.getFullURL(origDB);
newF = tempFolder + tableName + ".dbf";
}
while ( !utils.tryOverwriteFile( orb, oldF, newF ) );
m_tableFile = newF;
}
try
{
m_rowSet = orb.createInstance("com.sun.star.sdb.RowSet");
XPropertySet rowSetProps = UnoRuntime.queryInterface( XPropertySet.class, m_rowSet );
log.println("Trying to open: " + tableName);
rowSetProps.setPropertyValue("DataSourceName", dbSourceName);
rowSetProps.setPropertyValue("Command", tableName);
rowSetProps.setPropertyValue("CommandType",
Integer.valueOf(CommandType.TABLE));
final XRowSet rowSet = UnoRuntime.queryInterface( XRowSet.class, m_rowSet);
rowSet.execute();
m_connection = UnoRuntime.queryInterface( XConnection.class, rowSetProps.getPropertyValue("ActiveConnection") );
XResultSet xRes = UnoRuntime.queryInterface( XResultSet.class, m_rowSet );
xRes.first();
log.println( "creating a new environment for object" );
TestEnvironment tEnv = new TestEnvironment( (XInterface)m_rowSet );
// Adding obj relation for XRowSetApproveBroadcaster test
{
final XResultSet resultSet = UnoRuntime.queryInterface( XResultSet.class, m_rowSet );
final XResultSetUpdate resultSetUpdate = UnoRuntime.queryInterface( XResultSetUpdate.class, m_rowSet );
final XRowUpdate rowUpdate = UnoRuntime.queryInterface(XRowUpdate.class, m_rowSet );
final PrintWriter logF = log ;
tEnv.addObjRelation( "XRowSetApproveBroadcaster.ApproveChecker",
new ifc.sdb._XRowSetApproveBroadcaster.RowSetApproveChecker()
{
public void moveCursor()
{
try
{
resultSet.beforeFirst();
resultSet.afterLast();
resultSet.first();
}
catch (com.sun.star.sdbc.SQLException e)
{
logF.println("### _XRowSetApproveBroadcaster.RowSetApproveChecker.moveCursor() :");
e.printStackTrace(logF);
throw new StatusException( "RowSetApproveChecker.moveCursor failed", e );
}
}
public RowChangeEvent changeRow()
{
try
{
resultSet.first();
rowUpdate.updateString(1, "ORowSetTest2");
resultSetUpdate.updateRow();
}
catch (com.sun.star.sdbc.SQLException e)
{
logF.println("### _XRowSetApproveBroadcaster.RowSetApproveChecker.changeRow() :");
e.printStackTrace(logF);
throw new StatusException( "RowSetApproveChecker.changeRow failed", e );
}
RowChangeEvent ev = new RowChangeEvent();
ev.Action = com.sun.star.sdb.RowChangeAction.UPDATE ;
ev.Rows = 1 ;
return ev ;
}
public void changeRowSet()
{
try
{
// since we gave the row set a parametrized statement, we need to ensure the
// parameter is actually filled, otherwise we would get an empty result set,
// which would imply some further tests failing
XParameters rowSetParams = UnoRuntime.queryInterface( XParameters.class, resultSet );
rowSetParams.setString( 1, "String2" );
rowSet.execute();
resultSet.first();
}
catch (com.sun.star.sdbc.SQLException e)
{
logF.println("### _XRowSetApproveBroadcaster.RowSetApproveChecker.changeRowSet() :");
e.printStackTrace(logF);
throw new StatusException( "RowSetApproveChecker.changeRowSet failed", e );
}
}
}
);
}
// Adding relations for XRow as a Vector with all data
// of current row of RowSet.
ArrayList