/** executes the given statement on the given connection */ protected boolean implExecuteStatement(XConnection xConn, String sStatement) throws java.lang.Exception { try { XStatement xStatement = xConn.createStatement(); xStatement.execute(sStatement); } catch (com.sun.star.sdbc.SQLException e) { System.err.println(e); return false; } return true; }
/** Closes connection of <code>RowSet</code> instance created. */ protected void cleanup(TestParameters Param, PrintWriter log) { String doing = null; try { doing = "revoking data source registration"; log.println(doing); m_dataSource.revokeRegistration(); doing = "closing database document"; log.println(doing); XModel databaseDocModel = UnoRuntime.queryInterface( XModel.class, m_dataSource.getDatabaseDocument().getDatabaseDocument()); String documentFile = databaseDocModel.getURL(); XCloseable closeModel = UnoRuntime.queryInterface( XCloseable.class, m_dataSource.getDatabaseDocument().getDatabaseDocument()); closeModel.close(true); if (m_rowSet != null) { doing = "disposing row set"; log.println(doing); XComponent rowSetComponent = UnoRuntime.queryInterface(XComponent.class, m_rowSet); rowSetComponent.dispose(); } try { doing = "closing connection"; log.println(doing); m_connection.close(); } catch (com.sun.star.lang.DisposedException e) { log.println("already closed - okay."); } doing = "deleting database file (" + documentFile + ")"; log.println(doing); impl_deleteFile(documentFile); if (m_tableFile != null) { doing = "deleting dBase table file (" + m_tableFile + ")"; log.println(doing); impl_deleteFile(m_tableFile); } } catch (com.sun.star.uno.Exception e) { log.println("error: "); e.printStackTrace(log); } }
/** * checks if a given table exists. * * <p>The check is made using a SELECT statement, so even if the connection is a n SDB-level * connection, which may filter tables in its table supplier, the result may be reliable .... */ protected boolean existsInvisibleTable(XConnection xConn, String sTableName) throws java.lang.Exception { String sStatement = "SELECT * FROM "; sStatement += sTableName; sStatement += " WHERE 0=1"; boolean bSuccess = false; try { XStatement xStatement = xConn.createStatement(); xStatement.execute(sStatement); // if we reached this point, the table probably exists bSuccess = true; } catch (com.sun.star.sdbc.SQLException e) { } return bSuccess; }
/** Closes connection of <code>RowSet</code> instance created. */ protected void cleanup(TestParameters Param, PrintWriter log) { log.println("closing connection..."); try { conn.close(); } catch (com.sun.star.uno.Exception e) { log.println("Can't close the connection"); e.printStackTrace(log); } catch (com.sun.star.lang.DisposedException e) { log.println("Connection was already closed. It's OK."); } log.println("closing data source..."); try { XCloseable closer = UnoRuntime.queryInterface(XCloseable.class, dbSrc); closer.close(true); } catch (com.sun.star.util.CloseVetoException e) { log.println("couldn't close data source"); } catch (com.sun.star.lang.DisposedException e) { log.println("couldn't close data source"); } log.println("closing document..."); try { XCloseable closer = UnoRuntime.queryInterface(XCloseable.class, xTextDoc); closer.close(true); } catch (com.sun.star.util.CloseVetoException e) { log.println("couldn't close document"); } catch (com.sun.star.lang.DisposedException e) { log.println("couldn't close document"); } log.println("revoking data source..."); try { dbTools.revokeDB(dbSourceName); } catch (com.sun.star.container.NoSuchElementException e) { } catch (com.sun.star.uno.Exception e) { log.println("Error while object test cleaning up :"); e.printStackTrace(log); throw new StatusException("Error while object test cleaning up", e); } }
/** * 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 cann't be copied (is not released) then another unique name is used (file * name suffix incremented by 1). * * <p><code>com.sun.star.sdb.RowSet</code> 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. * * <p>Object relations created : * * <ul> * <li><code>'ORowSet.Connection'</code> for internal component test usage. Is used for closing * connection when cleaning up environment. * <li><code>'XRowSetApproveBroadcaster.ApproveChecker'</code> for {@link * ifc.sdb._XRowSetApproveBroadcaster} interface implementation which made actions required * <li><code>'CurrentRowData'</code> for {@link ifc.sdbc._XRow}, {@link ifc.sdbc._XRowUpdate} : * exports types and values of the current row data. * <li><code>'XColumnLocate.ColumnName'</code> for {@link ifc.sdbc._XColumnLocate} : the name of * the first column of the table. * <li><code>'XParameters.ParamValues'</code> for {@link ifc.sdbc._XParameters} : Collection of * parameter types presented in the query. * <li><code>'XRowUpdate.XRow'</code> for {@link ifc.sdbc._XRowUpdate} : <code>XRow</code> * interface of the current component. * <li><code>'XResultSetUpdate.UpdateTester'</code> for {@link ifc.sdbc._XResultSetUpdate} * </ul> * * @see com.sun.star.sdb.DatabaseContext * @see com.sun.star.sdb.DataSource */ protected TestEnvironment createTestEnvironment(TestParameters Param, PrintWriter log) { XMultiServiceFactory orb = (XMultiServiceFactory) Param.getMSF(); uniqueSuffix++; boolean envCreatedOK = false; // initialize test table if (isMySQLDB) { try { DBTools.DataSourceInfo legacyDescriptor = dbTools.newDataSourceInfo(); legacyDescriptor.Name = srcInf.Name; legacyDescriptor.User = srcInf.User; legacyDescriptor.Password = srcInf.Password; legacyDescriptor.Info = srcInf.Info; legacyDescriptor.URL = srcInf.URL; legacyDescriptor.IsPasswordRequired = srcInf.IsPasswordRequired; dbTools.initTestTableUsingJDBC(tableName, legacyDescriptor); } catch (java.sql.SQLException e) { e.printStackTrace(log); throw new StatusException(Status.failed("Couldn't " + " init test table. SQLException...")); } catch (java.lang.ClassNotFoundException e) { throw new StatusException(Status.failed("Couldn't " + "register mysql driver")); } } 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", new Integer(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<Object> rowData = new ArrayList<Object>(); for (int i = 0; i < DBTools.TST_TABLE_VALUES[0].length; i++) { rowData.add(DBTools.TST_TABLE_VALUES[0][i]); } // here XRef must be added // here XBlob must be added // here XClob must be added // here XArray must be added tEnv.addObjRelation("CurrentRowData", rowData); // Adding relation for XColumnLocate ifc test tEnv.addObjRelation("XColumnLocate.ColumnName", DBTools.TST_STRING_F); // Adding relation for XCompletedExecution tEnv.addObjRelation("InteractionHandlerChecker", new InteractionHandlerImpl()); try { String sqlCommand = isMySQLDB ? "SELECT Column0 FROM soffice_test_table WHERE ( ( Column0 = :param1 ) )" : "SELECT \"_TEXT\" FROM \"" + tableName + "\" WHERE ( ( \"_TEXT\" = :param1 ) )"; rowSetProps.setPropertyValue("DataSourceName", dbSourceName); rowSetProps.setPropertyValue("Command", sqlCommand); rowSetProps.setPropertyValue("CommandType", new Integer(CommandType.COMMAND)); } catch (Exception e) { throw new StatusException("setting up the RowSet with a parametrized command failed", e); } // Adding relation for XParameters ifc test tEnv.addObjRelation("XParameters.ParamValues", new ArrayList<String>()); // Adding relation for XRowUpdate final XRow row = UnoRuntime.queryInterface(XRow.class, m_rowSet); tEnv.addObjRelation("XRowUpdate.XRow", row); // Adding relation for XResultSetUpdate { final XResultSet resultSet = UnoRuntime.queryInterface(XResultSet.class, m_rowSet); final XRowUpdate rowUpdate = UnoRuntime.queryInterface(XRowUpdate.class, m_rowSet); tEnv.addObjRelation( "XResultSetUpdate.UpdateTester", new ifc.sdbc._XResultSetUpdate.UpdateTester() { String lastUpdate = null; public int rowCount() throws SQLException { int prevPos = resultSet.getRow(); resultSet.last(); int count = resultSet.getRow(); resultSet.absolute(prevPos); return count; } public void update() throws SQLException { lastUpdate = row.getString(1); lastUpdate += "_"; rowUpdate.updateString(1, lastUpdate); } public boolean wasUpdated() throws SQLException { String getStr = row.getString(1); return lastUpdate.equals(getStr); } public int currentRow() throws SQLException { return resultSet.getRow(); } }); } envCreatedOK = true; return tEnv; } catch (com.sun.star.uno.Exception e) { log.println("couldn't set up test environment:"); e.printStackTrace(log); try { if (m_connection != null) m_connection.close(); } catch (Exception ex) { } throw new StatusException("couldn't set up test environment", e); } finally { if (!envCreatedOK) { try { m_connection.close(); } catch (Exception ex) { } } } } // finish method getTestEnvironment