blob: 520dfbe978d77c6befa247b5b8553ab69ba46ba0 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package integration.forms;
import com.sun.star.awt.XListBox;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XChild;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.form.ListSourceType;
import com.sun.star.form.runtime.FormFeature;
import com.sun.star.form.runtime.XFormController;
import com.sun.star.form.runtime.XFormOperations;
import com.sun.star.sdb.CommandType;
import com.sun.star.sdbc.SQLException;
import com.sun.star.sdbc.XParameters;
import com.sun.star.sdbc.XPreparedStatement;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import connectivity.tools.HsqlColumnDescriptor;
import connectivity.tools.HsqlDatabase;
import connectivity.tools.HsqlTableDescriptor;
import connectivity.tools.sdb.Connection;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
public class ListBox extends TestCase
{
HsqlDatabase m_database = null;
private final String m_foreignKeyTableName = "foreign_keys";
public ListBox()
{
super( DocumentType.WRITER );
}
/* ------------------------------------------------------------------ */
public String[] getTestMethodNames()
{
return new String[] {
"checkForeignKeys"
};
}
/* ------------------------------------------------------------------ */
public void checkForeignKeys() throws com.sun.star.uno.Exception, java.lang.Exception
{
try
{
// create the form document
prepareDocument();
final XIndexAccess formsCollection = UnoRuntime.queryInterface( XIndexAccess.class,
m_document.getFormComponentTreeRoot() );
final XNameAccess form = UnoRuntime.queryInterface( XNameAccess.class, formsCollection.getByIndex(0) );
final DocumentViewHelper view = m_document.getCurrentView();
final XFormController formController = view.getFormController( form );
final XFormOperations formOperations = formController.getFormOperations();
// move through all records, and check that the display values in the list boxes are as expected
final String[][] fieldTypesDefinitions = impl_getFieldTypeDefinitions();
final String[] fieldTypes = fieldTypesDefinitions[0];
final String[] displayValues = impl_getDisplayValues();
formOperations.execute( FormFeature.MoveToFirst );
for ( int row=0; row<2; ++row )
{
StringBuffer failedFieldTypes = new StringBuffer();
for ( int i=0; i<fieldTypes.length; ++i )
{
final String columnFKName = fieldTypes[i] + "_fk";
Object listBoxModel = form.getByName( columnFKName );
XListBox listBoxControl = UnoRuntime.queryInterface( XListBox.class,
view.getControl( listBoxModel ) );
if ( !listBoxControl.getSelectedItem().equals( displayValues[row] ) )
{
if ( failedFieldTypes.length() > 0 )
failedFieldTypes.append( ", " );
failedFieldTypes.append( fieldTypes[i] );
}
}
/*assure( "The following field types do not work when used as bound list box fields: " + failedFieldTypes.toString() +
" (row " + row + ")", failedFieldTypes.length() == 0 );*/
formOperations.execute( FormFeature.MoveToNext );
}
}
finally
{
closeDocument();
}
}
/* ------------------------------------------------------------------ */
public void before() throws Exception, java.lang.Exception
{
super.before();
impl_createDatabase();
}
/* ------------------------------------------------------------------ */
protected void prepareDocument() throws com.sun.star.uno.Exception, java.lang.Exception
{
super.prepareDocument();
impl_createForm();
}
/* ------------------------------------------------------------------ */
private String[][] impl_getFieldTypeDefinitions()
{
return new String[][] {
new String[] {
"bigint", "boolean", "date", "decimal", "double", "float", "numeric", "time", "timestamp", "tinyint", "varchar"
},
new String[] {
null, null, null, "(10,2)", null, null, "(10,2)", null, null, null, "(50)"
}
};
}
/* ------------------------------------------------------------------ */
private String[] impl_getTypedValue( final String _asType, final int _rowNum ) throws SQLException
{
Map< String, String[] > valueMap = new HashMap< String, String[] >();
valueMap.put( "bigint", new String[] { "1111111111", "222222222" } );
valueMap.put( "boolean", new String[] { "false", "true" } );
valueMap.put( "date", new String[] { "2001-01-01", "2002-02-02" } );
valueMap.put( "decimal", new String[] { "1.11", "2.22" } );
valueMap.put( "double", new String[] { "1.11", "2.22" } );
valueMap.put( "float", new String[] { "1.11", "2.22" } );
valueMap.put( "numeric", new String[] { "1.11", "2.22" } );
valueMap.put( "time", new String[] { "01:01:01", "02:02:02" } );
valueMap.put( "timestamp", new String[] { "2001-01-01 01:01:01", "2002-02-02 02:02:02" } );
valueMap.put( "tinyint", new String[] { "1", "2" } );
valueMap.put( "varchar", new String[] { "first", "second" } );
return valueMap.get( _asType );
}
/* ------------------------------------------------------------------ */
private String[] impl_getDisplayValues()
{
return new String[] { "one", "two" };
}
/* ------------------------------------------------------------------ */
private void impl_createDatabase() throws java.lang.Exception
{
try
{
m_database = new HsqlDatabase( m_orb );
Connection connection = m_database.defaultConnection();
System.out.println( m_database.getDocumentURL() );
final String[][] fieldDefinitions = impl_getFieldTypeDefinitions();
final String[] keyTypes = fieldDefinitions[0];
final String[] keyCreationArgs = fieldDefinitions[1];
Vector< HsqlColumnDescriptor > foreignKeyColumns = new Vector< HsqlColumnDescriptor >();
foreignKeyColumns.add( new HsqlColumnDescriptor( "ID", "integer", HsqlColumnDescriptor.PRIMARY ) );
Vector< String[] > foreignKeyValues = new Vector< String[] >();
StringBuffer foreignKeyInsertSQL = new StringBuffer();
foreignKeyInsertSQL.append( "INSERT INTO \"" + m_foreignKeyTableName + "\" VALUES (?" );
final String[] displayValues = impl_getDisplayValues();
for ( int i=0; i<keyTypes.length; ++i )
{
final String tableName = keyTypes[i] + "_pk";
final String columnPKName = keyTypes[i] + "_pk";
final String columnFKName = keyTypes[i] + "_fk";
final String columnType = keyTypes[i] + ( keyCreationArgs[i] != null ? keyCreationArgs[i] : "" );
m_database.createTable( new HsqlTableDescriptor( tableName,
new HsqlColumnDescriptor[] {
new HsqlColumnDescriptor( columnPKName, columnType, HsqlColumnDescriptor.PRIMARY ),
new HsqlColumnDescriptor( "content", "varchar(50)" )
}
) );
// insert a few rows
StringBuffer sql = new StringBuffer();
sql.append( "INSERT INTO \"" );
sql.append( tableName );
sql.append( "\" VALUES (?, ?)");
XPreparedStatement statement = connection.prepareStatement( sql.toString() );
XParameters statementParameters = UnoRuntime.queryInterface( XParameters.class, statement );
final String[] keyValues = impl_getTypedValue( keyTypes[i], 0 );
for ( int row=0; row<displayValues.length; ++row )
{
statementParameters.setString( 1, keyValues[row] );
statementParameters.setString( 2, displayValues[row] );
statement.execute();
}
// remember a column descriptor for later creation of the table with the foreign keys
foreignKeyColumns.add( new HsqlColumnDescriptor( columnFKName, columnType, HsqlColumnDescriptor.REQUIRED,
tableName, columnPKName ) );
// remember the data to fill into this table
foreignKeyValues.add( keyValues );
foreignKeyInsertSQL.append( ", ?" );
}
// create the table taking all those foreign keys
m_database.createTable( new HsqlTableDescriptor( m_foreignKeyTableName, foreignKeyColumns.toArray( new HsqlColumnDescriptor[0] ) ) );
// fill in some data
foreignKeyInsertSQL.append( ")" );
XPreparedStatement statement = connection.prepareStatement( foreignKeyInsertSQL.toString() );
XParameters statementParameters = UnoRuntime.queryInterface( XParameters.class, statement );
for ( int row=0; row<2; ++row )
{
statementParameters.setInt( 1, row );
for ( int i=0; i<keyTypes.length; ++i )
{
statementParameters.setString( i+2, foreignKeyValues.get(i)[row] );
}
statement.execute();
}
m_database.defaultConnection().refreshTables();
}
finally
{
if ( m_database != null )
m_database.store();
}
}
/* ------------------------------------------------------------------ */
private void impl_createForm() throws java.lang.Exception
{
// a single control for the ID field
XPropertySet controlModel = m_formLayer.insertControlLine( "DatabaseNumericField", "ID", null, 10, 10, 6 );
// bind the form to the foreign_keys table
XPropertySet form = dbfTools.queryPropertySet( dbfTools.getParent( controlModel, XChild.class ) );
form.setPropertyValue( "Command", m_foreignKeyTableName );
form.setPropertyValue( "CommandType", CommandType.TABLE );
form.setPropertyValue( "DataSourceName", m_database.getDocumentURL() );
// create list boxes for the different foreign keys
final String[][] fieldDefinitions = impl_getFieldTypeDefinitions();
final String[] fieldTypes = fieldDefinitions[0];
for ( int i=0; i<fieldTypes.length; ++i )
{
final String tableName = fieldTypes[i] + "_pk";
final String columnFKName = fieldTypes[i] + "_fk";
final String columnPKName = fieldTypes[i] + "_pk";
XPropertySet listBoxModel = m_formLayer.insertControlLine( "DatabaseListBox", columnFKName, null, 10, 20 + 10*i, 6 );
listBoxModel.setPropertyValue( "Dropdown", new Boolean( true ) );
listBoxModel.setPropertyValue( "ListSourceType", ListSourceType.SQL );
listBoxModel.setPropertyValue( "ListSource", new String[] { "SELECT \"content\", \"" + columnPKName +
"\" FROM \"" + tableName + "\"" } );
listBoxModel.setPropertyValue( "BoundColumn", new Short( (short)1 ) );
}
m_document.getCurrentView().toggleFormDesignMode();
}
}