teiid SVN: r1614 - in branches/JCA/test-integration: db and 36 other directories.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2009-12-01 16:17:40 -0500 (Tue, 01 Dec 2009)
New Revision: 1614
Added:
branches/JCA/test-integration/db/
branches/JCA/test-integration/db/howto
branches/JCA/test-integration/db/lib/
branches/JCA/test-integration/db/lib/readme.txt
branches/JCA/test-integration/db/pom.xml
branches/JCA/test-integration/db/src/
branches/JCA/test-integration/db/src/main/
branches/JCA/test-integration/db/src/main/java/
branches/JCA/test-integration/db/src/main/java/org/
branches/JCA/test-integration/db/src/main/java/org/teiid/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyNames.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceMgr.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
branches/JCA/test-integration/db/src/main/resources/
branches/JCA/test-integration/db/src/main/resources/configuration.xml
branches/JCA/test-integration/db/src/main/resources/datasources/
branches/JCA/test-integration/db/src/main/resources/datasources/derby/
branches/JCA/test-integration/db/src/main/resources/datasources/derby/connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/derby/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/mysql/
branches/JCA/test-integration/db/src/main/resources/datasources/mysql/connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/mysql/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/oracle/
branches/JCA/test-integration/db/src/main/resources/datasources/oracle/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/postgres/
branches/JCA/test-integration/db/src/main/resources/datasources/postgres/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/readme.txt
branches/JCA/test-integration/db/src/main/resources/datasources/sqlserver/
branches/JCA/test-integration/db/src/main/resources/datasources/sqlserver/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/datasources/sybase/
branches/JCA/test-integration/db/src/main/resources/datasources/sybase/example_connection.properties
branches/JCA/test-integration/db/src/main/resources/ddl/
branches/JCA/test-integration/db/src/main/resources/ddl/db2/
branches/JCA/test-integration/db/src/main/resources/ddl/db2/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/db2/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/db2/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/ddl/derby/
branches/JCA/test-integration/db/src/main/resources/ddl/derby/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/derby/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/derby/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/ddl/exec_parms.properties_template
branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml
branches/JCA/test-integration/db/src/main/resources/ddl/mysql/
branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/mysql/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/mysql/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/ddl/oracle/
branches/JCA/test-integration/db/src/main/resources/ddl/oracle/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/oracle/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/oracle/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/ddl/postgres/
branches/JCA/test-integration/db/src/main/resources/ddl/postgres/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/postgres/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/postgres/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/ddl/run_ddl.xml
branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/
branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/drop_tables.sql
branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/exec_parms.properties
branches/JCA/test-integration/db/src/main/resources/default-config.properties
branches/JCA/test-integration/db/src/main/resources/transactions/
branches/JCA/test-integration/db/src/main/resources/transactions/Transaction.vdb
branches/JCA/test-integration/db/src/main/resources/transactions/transaction.properties
branches/JCA/test-integration/db/src/main/resources/xa-config.properties
branches/JCA/test-integration/db/src/test/
branches/JCA/test-integration/db/src/test/java/
branches/JCA/test-integration/db/src/test/java/org/
branches/JCA/test-integration/db/src/test/java/org/teiid/
branches/JCA/test-integration/db/src/test/java/org/teiid/test/
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverFalseOffTest.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverTrueOffTest.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/XATransactionDatasourceFalseOffTest.java
branches/JCA/test-integration/db/src/test/java/org/teiid/transaction/
Log:
adding the db project as it exists from trunk
Added: branches/JCA/test-integration/db/howto
===================================================================
--- branches/JCA/test-integration/db/howto (rev 0)
+++ branches/JCA/test-integration/db/howto 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,88 @@
+This is a howto of the following:
+
+1. Creating unit tests that use 1 or more datasources
+2. Setting up a datasource to be used during testing
+3. Executing the db integration tests
+
+
+==========================================
+Creating Unit Tests
+==========================================
+
+- Unit test should be created under db/src/test/java
+- See LocalTransactionDriverFalseOffTest.java as an example
+
+- Test should extend org.teiid.transaction.test.BaseAbstractTransactionTestCase
+
+
+- NOTE: the following is used in a post test phase of validating the data in the datasource
+- when calling: this.getSource("modelname") --- the "modelname" represents the model for which
+ you want the connection for
+
+
+ By default, the datasource assigned to a model will be (somewhat) random. There is not coding to
+ specifically control this assignment, as long as the -Dusedatasources option is not used.
+
+ If the -Dusedatasources option is used, then there is an implied model-to-datasource assignment.
+ To understand how this assignment will be made, find the config properties file being
+ loaded for this test (default is the default-config.properties) and look for
+ the model-to-order mapping(s)
+
+ The default Transaction.vdb has 2 models: pm1 and pm2
+
+ example: pm1:1
+ pm2:2
+
+ Therefore, the model-to-order mapping will map to the relative order specified in the usedatasources property.
+
+ example: -Dusedatasources=oracle,postgres
+
+ This will result in model pm1 --> oracle
+ pm2 --> postgres
+
+ To EXCLUDE a test from using a specific database type, call addProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP, "postgres");
+ during setup()
+
+ NOTE: The EXCLUDE option excludes based on db.type, where "usedatasources" specifies the actual datasource (not by type)
+
+
+==========================================
+Setting up a Datasource to be used during Testing
+==========================================
+
+1. DEFINE DATASOURCE:
+ To define a datasource, see the readme.txt in src/main/resources/datasources regarding defining a datasource
+
+2. CREATE TABLES
+ To create the tables on the defined datasource, run the maven profile to execute the process to create the required tables:
+ a. to setup all sources at one time, run:
+ mvn pre-integration-test -P setupdatasources -Dmaven.test.skip=true
+ b. to setup a specific source,
+ run: mvn pre-integration-test -Ddatasource=<datasourcedir> -Psingledatasource -Dmaven.test.skip=true
+ where <datasourcedir> is the name of the directory for the datasource
+
+
+ Example:
+
+ mvn pre-integration-test -Ddatasource=oracle -Psingledatasource -Dmaven.test.skip=true
+
+==========================================
+Executing the db integration tests
+==========================================
+
+The default profile in the pom.xml is set to compile and run the test. The following are options for running tests:
+
+ a. Run with no regard to which specific datasource to use (only those with connections.properties file are considered):
+ run: mvn install
+ b. To run the tests, but specify which datasource(s) to use:
+ run: mvn clean install -Dusedatasources=<comma seperated datasource names>
+ Example: mvn clean install -Dusedatasources=oracle,sqlserver
+
+
+ c. To run a single class of tests, run the "singleclass" profile
+ run: mvn clean install -Psingleclass -Dclassname=<classname> ====> don't add .java to classname
+
+
+
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/lib/readme.txt
===================================================================
--- branches/JCA/test-integration/db/lib/readme.txt (rev 0)
+++ branches/JCA/test-integration/db/lib/readme.txt 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1 @@
+# This directory is where 3rd party jdbc drivers should be placed.
\ No newline at end of file
Added: branches/JCA/test-integration/db/pom.xml
===================================================================
--- branches/JCA/test-integration/db/pom.xml (rev 0)
+++ branches/JCA/test-integration/db/pom.xml 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+<!--
+ The database dependent tests are meant to be run on their own, not as part of the continous or nightly
+ build for Teiid.
+-->
+
+
+<!--
+ <parent>
+ <artifactId>teiid-test-integration</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+
+ <packaging>pom</packaging>
+
+ -->
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>test-integration-db</artifactId>
+
+ <name>DB Dependent Integration Tests</name>
+ <groupId>org.jboss.teiid.teiid-test-integration</groupId>
+ <description>Integration tests that require external database dependencies </description>
+
+ <version>7.0.0-SNAPSHOT</version>
+ <properties>
+ <site.url>http://www.jboss.org/teiid</site.url>
+
+ <derby.version>10.2.1.6</derby.version>
+ <mysql.connector.version>5.1.5</mysql.connector.version>
+ <postgresql.version>8.3-603.jdbc3</postgresql.version>
+
+ <apache.ant.version>1.7.0</apache.ant.version>
+ </properties>
+ <scm>
+ <developerConnection>scm:svn:https://svn.jboss.org/repos/teiid/trunk</developerConnection>
+ </scm>
+ <licenses>
+ <license>
+ <name>GNU Lesser General Public License</name>
+ <url>http://www.gnu.org/licenses/lgpl.html</url>
+ <distribution>repo</distribution>
+ <comments>A business-friendly OSS license</comments>
+ </license>
+ </licenses>
+
+ <repositories>
+ <repository>
+ <id>jboss</id>
+ <url>http://repository.jboss.com/maven2/</url>
+ </repository>
+ <repository>
+ <id>jboss-snapshot</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ </repository>
+ </repositories>
+
+
+ <dependencies>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.4</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-metadata</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-client</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-txn-jbossts</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- internal dependencies that are only used by integration testing -->
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-runtime</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-runtime</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>connector-loopback</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>connector-text</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>connector-jdbc</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-engine</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.code.guice</groupId>
+ <artifactId>guice</artifactId>
+ <version>1.0</version>
+ </dependency>
+
+<!--
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-internal</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>connector-text</artifactId>
+ <type>test-jar</type>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>connector-jdbc</artifactId>
+ <type>test-jar</type>
+ <version>${project.version}</version>
+ </dependency>
+
+
+
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-sdk</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-metadata</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-sdk</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
+
+-->
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-client-jdbc</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-client</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+<!--
+ </dependencies>
+
+ <dependencies>
+-->
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>${apache.ant.version}</version>
+ </dependency>
+
+ <!-- external dependencies -->
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>${postgresql.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>${mysql.connector.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.derby</groupId>
+ <artifactId>derbyclient</artifactId>
+ <version>${derby.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.derby</groupId>
+ <artifactId>derby</artifactId>
+ <version>${derby.version}</version>
+
+ </dependency>
+
+ <!-- DBUnit dependencies -->
+
+ <dependency>
+ <groupId>org.dbunit</groupId>
+ <artifactId>dbunit</artifactId>
+ <version>2.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ <version>3.2.1</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.5.6</version>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi</artifactId>
+ <version>3.2-FINAL</version>
+ </dependency>
+
+ <dependency>
+ <groupId>jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>1.0</version>
+ </dependency>
+
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+
+ <build>
+ <plugins>
+ <!-- Specify the compiler options and settings -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <showDeprecation>false</showDeprecation>
+ <showWarnings>false</showWarnings>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <additionalClasspathElements>
+ <additionalClasspathElement>${basedir}/lib/classes12_g.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/sqljdbc4.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/db2jcc4.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/jbedsp-datadirect.jar</additionalClasspathElement>
+
+ </additionalClasspathElements>
+ <systemProperties>
+ <property>
+ <name>usedatasources</name>
+ <value>${usedatasources}</value>
+ <name>datasourceloc</name>
+ <value>${datasourceloc}</value>
+ </property>
+ </systemProperties>
+
+
+ <forkMode>always</forkMode>
+<!--
+ <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+ -->
+ <includes>
+ <!-- <include>**/*TestCase.java</include> -->
+ <include>**/*Test.java</include>
+ <include>**/*Tests.java</include>
+ <include>**/Test*.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/*Abstract*TestCase.java</exclude>
+ <exclude>**/*Abstract*Test.java</exclude>
+ <!-- hack to prevent anonymous inner classes in Tests from being run as tests -->
+ <exclude>**/Test*$*.java</exclude>
+ </excludes>
+
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ <profile>
+ <id>singleclass</id>
+ <activation>
+ <property>
+ <name>classname</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <!-- Specify the compiler options and settings -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <showDeprecation>false</showDeprecation>
+ <showWarnings>false</showWarnings>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <additionalClasspathElements>
+ <additionalClasspathElement>${basedir}/lib/classes12_g.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/sqljdbc4.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/db2jcc4.jar</additionalClasspathElement>
+ <additionalClasspathElement>${basedir}/lib/jbedsp-datadirect.jar</additionalClasspathElement>
+ </additionalClasspathElements>
+ <systemProperties>
+ <property>
+ <name>usedatasources</name>
+ <value>${usedatasources}</value>
+ <name>datasourceloc</name>
+ <value>${datasourceloc}</value>
+ </property>
+ </systemProperties>
+
+
+ <forkMode>always</forkMode>
+<!--
+ <forkedProcessTimeoutInSeconds>600</forkedProcessTimeoutInSeconds>
+ -->
+ <includes>
+ <include>**/${classname}.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/*Abstract*TestCase.java</exclude>
+ <exclude>**/*Abstract*Test.java</exclude>
+ <!-- hack to prevent anonymous inner classes in Tests from being run as tests -->
+ <exclude>**/Test*$*.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+
+ <profile>
+ <id>setupdatasources</id>
+ <build>
+ <plugins>
+
+ <!-- Specify the compiler options and settings -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <showDeprecation>false</showDeprecation>
+ <showWarnings>false</showWarnings>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>${apache.ant.version}</version>
+ </dependency>
+ </dependencies>
+ <configuration>
+ </configuration>
+ <executions>
+ <execution>
+ <id>setupalldatasources</id>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+ <property name="maven.runtime.classpath" refid="maven.runtime.classpath" />
+ <property name="relative.resources.dir" value="src/main/resources"></property>
+ <property name="datasourceloc" value="${datasourceloc}"></property>
+ <ant antfile="src/main/resources/ddl/manage_schemas.xml" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>singledatasource</id>
+ <activation>
+ <property>
+ <name>datasource</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <!-- Specify the compiler options and settings -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ <showDeprecation>false</showDeprecation>
+ <showWarnings>false</showWarnings>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>${apache.ant.version}</version>
+ </dependency>
+ </dependencies>
+ <configuration>
+
+ </configuration>
+ <executions>
+ <execution>
+ <id>setupsingledatasource</id>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+
+ <property name="single" value="${datasource}"></property>
+ <property name="maven.runtime.classpath" refid="maven.runtime.classpath" />
+ <property name="datasourceloc" value="${datasourceloc}"></property>
+
+ <property name="relative.resources.dir" value="src/main/resources"></property>
+ <ant antfile="src/main/resources/ddl/manage_schemas.xml" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+
+</project>
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,173 @@
+package org.teiid.test.framework;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.util.PropUtils;
+
+import com.metamatrix.common.util.PropertiesUtils;
+
+
+/**
+ * The ConfigProperteryLoader will load the configuration properties to be used by a test.
+ * These properties only live for the duration of one test.
+ *
+ * NOTE: System properties set by the VM will be considered long living. This is so the
+ * -Dusedatasources ( {@link ConfigPropertyNames#USE_DATASOURCES_PROP} ) option can be maintained for the duration of a set of tests.
+ *
+ *
+ * @author vanhalbert
+ *
+ */
+public class ConfigPropertyLoader {
+
+ /**
+ * The default config file to use when #CONFIG_FILE system property isn't
+ * set
+ */
+ public static final String DEFAULT_CONFIG_FILE_NAME = "default-config.properties";
+
+ private static ConfigPropertyLoader _instance = null;
+ private static String LAST_CONFIG_FILE = null;
+
+ /**
+ * Contains any overrides specified for the test
+ */
+ private Properties overrides = new Properties();
+
+ /**
+ * Contains the properties loaded from the config file
+ */
+ private Properties props = null;
+
+ private Map<String, String>modelAssignedDatabaseType = new HashMap<String, String>(5);
+
+ private DataSourceFactory dsfactory = null;
+
+ private ConfigPropertyLoader() {
+ }
+
+ public static synchronized ConfigPropertyLoader getInstance() {
+ boolean diff = differentConfigProp();
+
+
+ if (_instance != null && !diff) {
+ return _instance;
+ }
+
+ if (_instance != null) {
+ cleanup();
+ }
+
+ _instance = new ConfigPropertyLoader();
+ try {
+ _instance.initialize();
+ } catch (TransactionRuntimeException e) {
+ throw e;
+ }
+
+ return _instance;
+ }
+
+ /**
+ * because a config file could be different for the subsequent test, check
+ * to see if the file is different.
+ * @return
+ */
+ private static boolean differentConfigProp( ) {
+ String filename = System.getProperty(ConfigPropertyNames.CONFIG_FILE);
+ if (filename == null) {
+ filename = DEFAULT_CONFIG_FILE_NAME;
+ }
+
+ if (LAST_CONFIG_FILE == null || ! LAST_CONFIG_FILE.equalsIgnoreCase(filename)) {
+ LAST_CONFIG_FILE = filename;
+ return true;
+ }
+ return false;
+
+ }
+
+ public static synchronized void cleanup() {
+ _instance.overrides.clear();
+ _instance.modelAssignedDatabaseType.clear();
+ _instance.props.clear();
+ if (_instance.dsfactory != null) {
+ _instance.dsfactory.cleanup();
+ }
+ _instance = null;
+ LAST_CONFIG_FILE=null;
+ }
+
+
+ private void initialize() {
+ loadProperties(LAST_CONFIG_FILE);
+ dsfactory = new DataSourceFactory(this);
+ }
+
+ public DataSourceFactory getDataSourceFactory() {
+ return this.dsfactory;
+ }
+
+
+ public String getProperty(String key) {
+ String rtn = null;
+ rtn = overrides.getProperty(key);
+ if (rtn == null) {
+ rtn = props.getProperty(key);
+
+ if (rtn == null) {
+ rtn = System.getProperty(key);
+ }
+ }
+ return rtn;
+ }
+
+ public void setProperty(String key, String value) {
+ overrides.setProperty(key, value);
+ }
+
+ public Properties getProperties() {
+
+ Properties p = new Properties();
+ p.putAll(System.getProperties());
+ p.putAll(props);
+ p.putAll(overrides);
+
+ return p;
+ }
+
+ public Map<String, String> getModelAssignedDatabaseTypes() {
+ return this.modelAssignedDatabaseType;
+ }
+
+ public void setModelAssignedToDatabaseType(String modelname, String dbtype) {
+ this.modelAssignedDatabaseType.put(modelname, dbtype);
+ }
+
+ private void loadProperties(String filename) {
+
+ props = PropUtils.loadProperties("/" + filename, null);
+
+ }
+
+ public static void main(String[] args) {
+ System.setProperty("test", "value");
+
+ ConfigPropertyLoader _instance = ConfigPropertyLoader.getInstance();
+ Properties p = _instance.getProperties();
+ if (p == null || p.isEmpty()) {
+ throw new RuntimeException("Failed to load config properties file");
+
+ }
+ if (!p.getProperty("test").equalsIgnoreCase("value")) {
+ throw new RuntimeException("Failed to pickup system property");
+ }
+ System.out.println("Loaded Config Properties " + p.toString());
+
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyNames.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyNames.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyNames.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,117 @@
+package org.teiid.test.framework;
+
+import org.teiid.test.framework.datasource.DataSource;
+import org.teiid.test.framework.datasource.DataSourceMgr;
+
+import com.metamatrix.jdbc.api.ExecutionProperties;
+
+/**
+ * The following properties can be set in 2 ways:
+ * <li>set as a System property(..)</li>
+ * <li>specify it in the config properties file</li>
+ *
+ * @author vanhalbert
+ *
+ */
+public interface ConfigPropertyNames {
+
+ /**
+ * Specify this as a system property to set a specific configuration to use
+ * otherwise the {@link ConfigPropertyLoader#DEFAULT_CONFIG_FILE_NAME} will be loaded.
+ */
+ public static final String CONFIG_FILE="config";
+
+
+ /**
+ * For Driver/Datasource connection related properties, {@link ConnectionStrategy}.
+ */
+
+
+
+ /**
+ * The USE_DATASOURCES_PROP is a comma delimited property that can be used to limit the
+ * datasources that are in use for the tests. Use the directory name defined in the ddl directory.
+ * This enables a developers to test a certain datasource without having to remove
+ * connection.properties files.
+ */
+ public static final String USE_DATASOURCES_PROP = "usedatasources";
+
+
+ /**
+ * The USE_DATASOURCE_TYPES_PROP is a comma delimited property that can be used to limit the
+ * types of datasources to be used for the tests. The database type {@link DataSource#DB_TYPE} corresponds to the
+ * defined types in the resources/ddl directory. By specifying this property, the test will use on data sources
+ * of the specified types..
+ */
+ public static final String USE_DATASOURCE_TYPES_PROP = "usedatasourcetypes";
+
+
+
+ /**
+ * The EXCLUDE_DATASOURCES_PROP is a comma delimited property that can be used to exclude
+ * certain database types.
+ * This is done so that whole sets of tests can be excluded when a datasource has been defined
+ * for a specific database type.
+ */
+
+ public static final String EXCLUDE_DATASBASE_TYPES_PROP = "excludedatasourcetypes";
+
+ /**
+ * The {@link #OVERRIDE_DATASOURCES_LOC}, when specified, will override the default
+ * defined for {@link DataSourceMgr#DEFAULT_DATASOURCES_LOC};
+ *
+ */
+ public static final String OVERRIDE_DATASOURCES_LOC = "datasourceloc";
+
+ /**
+ * Connection Type indicates the type of connection (strategy) to use when
+ * connecting to Teiid.
+ * Options are {@link CONNECTION_TYPES}
+ */
+ public static final String CONNECTION_TYPE = "connection-type"; //$NON-NLS-1$
+
+
+ /**
+ * {@see #CONNECTION_TYPE} regarding setting the specific connection type to use
+ * when connecting to Teiid
+ * @author vanhalbert
+ *
+ */
+ public interface CONNECTION_TYPES {
+
+ // used to create the jdb driver
+ public static final String DRIVER_CONNECTION = "driver"; //$NON-NLS-1$
+ // used to create a datasource
+ public static final String DATASOURCE_CONNECTION = "datasource"; //$NON-NLS-1$
+ // used for when embedded is running in an appserver
+ public static final String JNDI_CONNECTION = "jndi"; //$NON-NLS-1$
+
+
+ }
+
+ /**
+ * Connection Props are the {@link CONNECTION_STRATEGY} execution options
+ * @author vanhalbert
+ *
+ */
+ public interface CONNECTION_STRATEGY_PROPS {
+
+ public static final String TXN_AUTO_WRAP = ExecutionProperties.PROP_TXN_AUTO_WRAP;
+ public static final String AUTOCOMMIT = "autocommit"; //$NON-NLS-1$
+ public static final String FETCH_SIZE = ExecutionProperties.PROP_FETCH_SIZE;
+ public static final String EXEC_IN_BATCH = "execute.in.batch"; //$NON-NLS-1$
+ public static final String CONNECTOR_BATCH = "connector-batch"; //$NON-NLS-1$
+ public static final String PROCESS_BATCH = "process-batch"; //$NON-NLS-1$
+ public static final String JNDINAME_USERTXN = "usertxn-jndiname"; //$NON-NLS-1$
+
+ }
+
+ public interface TXN_AUTO_WRAP_OPTIONS {
+ public static final String AUTO_WRAP_OFF = "OFF"; //$NON-NLS-1$
+ public static final String AUTO_WRAP_ON = "ON"; //$NON-NLS-1$
+ public static final String AUTO_WRAP_PESSIMISTIC = "PESSIMISTIC"; //$NON-NLS-1$
+ public static final String AUTO_WRAP_OPTIMISTIC = "OPTIMISTIC"; //$NON-NLS-1$
+
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework;
+
+import java.util.Properties;
+
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.core.util.StringUtil;
+
+public abstract class TransactionContainer {
+
+ private boolean debug = false;
+
+
+ private String testClassName = null;
+
+ protected ConnectionStrategy connStrategy;
+ protected Properties props;
+
+ protected TransactionContainer() {
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
+
+ try {
+ this.connStrategy = ConnectionStrategyFactory
+ .createConnectionStrategy(config);
+ } catch (QueryTestFailedException e) {
+ // TODO Auto-generated catch block
+ throw new TransactionRuntimeException(e);
+ }
+ this.props = new Properties();
+ this.props.putAll(this.connStrategy.getEnvironment());
+
+ }
+
+
+ public ConnectionStrategy getConnectionStrategy() {
+ return this.connStrategy;
+ }
+
+
+ public void setEnvironmentProperty(String key, String value) {
+ this.getConnectionStrategy().getEnvironment().setProperty(key, value);
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ }
+
+ public void runTransaction(TransactionQueryTestCase test) {
+
+ this.testClassName = StringUtil.getLastToken(test.getClass().getName(),
+ ".");
+
+ try {
+ detail("Start transaction test: " + test.getTestName());
+
+ try {
+ test.setConnectionStrategy(connStrategy);
+
+ test.setup();
+
+ } catch (Throwable e) {
+ if (!test.exceptionExpected()) {
+ e.printStackTrace();
+ }
+ throw new TransactionRuntimeException(e.getMessage());
+ }
+
+ runTest(test);
+
+ detail("Completed transaction test: " + test.getTestName());
+
+ } finally {
+ debug(" test.cleanup");
+
+ try {
+ test.cleanup();
+ } finally {
+
+ // cleanup all connections created for this test.
+ if (connStrategy != null) {
+ connStrategy.shutdown();
+ }
+ }
+ }
+
+ }
+
+ protected void runTest(TransactionQueryTestCase test) {
+ debug("Start runTest: " + test.getTestName());
+
+ try {
+
+ debug(" before(test)");
+
+ before(test);
+ debug(" test.before");
+
+ test.before();
+
+ debug(" test.testcase");
+
+ // run the test
+ test.testCase();
+
+ debug(" test.after");
+
+ test.after();
+ debug(" after(test)");
+
+ after(test);
+
+ debug("End runTest: " + test.getTestName());
+
+ } catch (Throwable e) {
+
+ if (!test.exceptionExpected()) {
+ e.printStackTrace();
+ debug("Error: " + e.getMessage());
+ throw new TransactionRuntimeException(e.getMessage());
+
+ }
+ }
+
+ if (test.exceptionExpected() && !test.exceptionOccurred()) {
+ throw new TransactionRuntimeException(
+ "Expected exception, but one did not occur for test: "
+ + this.getClass().getName() + "."
+ + test.getTestName());
+ }
+
+ }
+
+
+ protected void debug(String message) {
+ if (debug) {
+ System.out.println("[" + this.testClassName + "] " + message);
+ }
+
+ }
+
+ protected void detail(String message) {
+ System.out.println("[" + this.testClassName + "] " + message);
+ }
+
+ protected boolean done() {
+ return true;
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,207 @@
+package org.teiid.test.framework;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+/**
+ * The TransactionQueryTest interface represents the transaction test lifecycle of execution
+ * from which the @link TransactionContainer operates.
+ * <br><br>
+ * QueryTest lifecycle:</br>
+ *
+ * <br>
+ * There are 4 phases or groupings of methods:
+ * <li>Setup </li>
+ * <li>Test </li>
+ * <li>Validation</li>
+ * <li>Cleanup</li>
+ *
+ * <br>
+ * <p>
+ * <b>1. Setup phase is about setting the global environment for the testing</b>
+ * <br>
+ *
+ * <li>{@link #setConnectionStrategy(ConnectionStrategy)} - called first to provide
+ * the environment (i.e, type of connection, parameters, etc) that the test will
+ * be run under.
+ * <li>{@link #hasRequiredDataSources()} - called after the connection
+ * strategy is set so the determination can be made if this test has the
+ * required datasources defined and available in order to run the test. If not,
+ * then the test is bypassed.
+ * <li>{@link #setup()} - called to enable the test to
+ * perform any pretest (i.e., global) setup. Example would be data source setup.
+ * <li>{@link #setConnection(Connection)} - called to set the client driver (i.e.,
+ * Teiid) connection that will be used to execute queries against
+ * <li>{@link #setExecutionProperties(Properties)} - called at this time so that the
+ * overriding class can obtain / initialize settings that will be assigned when
+ * <li>{@link AbstractQueryTest#assignExecutionProperties(Statement)} is called
+ * prior to sql execution. (Example: set fetch size, batch time, or timeout)
+ * </li>
+ * <br>
+ * <p>
+ * <b>2. Test phase are the methods for executing a test, including any
+ * before/after test logic to support the test</b>
+ * <br><br>
+ *
+ * <li>{@link #before()} called before the execution of the test so that the
+ * transaction boundary can be set and any other pretest conditions
+ * <li>{@link #testCase()} called to execute the specific test
+ * <li>{@link #after()} called after the test is executed, which will commit/rollback the transaction
+ * and perform any other post conditions
+ * </li>
+ * <br>
+ * <p>
+ * <b>3. Validation phase is meant to enable data validation post transaction
+ * completion. This is especially helpful when performing XA transactions
+ * because the results are not completed and available until after the {@link #after()} step
+ * is performed.</b>
+ * <br><br>
+ *
+ * {@link #validateTestCase()}
+ *
+ * <p>
+ * <b>4. Cleanup</b>
+ * <br><br>
+ *
+ * {@link #cleanup()} Called to allow the testcase to perform any cleanup after execution.
+ *
+ * <br>
+ * ================
+ * <p>
+ * <b>Other Notes:</b>
+ * <br><br>
+ *
+ * The following methods were exposed from {@link AbstractQueryTest}:
+ *
+ * <li>{@link #exceptionExpected()} - when an exception is expected to occur, the
+ * underlying logic will treat the execution as if it succeeded. </li>
+ * <li>{@link #exceptionOccurred()} - this method indicates when an exception
+ * actually occurred outside of the normal expected results. </li>
+ * <li>{@link #getConnection()} and {@link #getXAConnection()} - these connection
+ * methods are exposed for {@link #before()} and {@link #after()} methods</li>
+ * <li>{@link #rollbackAllways()} - this is exposed for the {@link #after()} method
+ * as to what behavior is expected after the execution of the test</li>
+ *
+ *
+ * <br>
+ * @author vanhalbert
+ *
+ */
+
+public interface TransactionQueryTestCase {
+
+ /**
+ * Returns the name of the test so that better tracing of what tests are
+ * running/completing.
+ *
+ * @return String is test name
+ */
+ String getTestName();
+
+ /**
+ * Called to set the current connection strategy being used.
+ *
+ * @param connStrategy
+ *
+ * @since
+ */
+ void setConnectionStrategy(ConnectionStrategy connStrategy) throws QueryTestFailedException;
+
+ /**
+ * Called by the {@link TransactionContainer} prior to testcase processing
+ * so that the responsibility for performing an setup duties (ie..,
+ * datasource setup) can be done
+ *
+ *
+ * @since
+ */
+ void setup() throws QueryTestFailedException;
+
+ /**
+ * Called by the @link TransactionContainer to set the Teiid connection to
+ * be used in the test.
+ *
+ * @param conn
+ *
+ * @since
+ */
+ void setConnection(Connection conn);
+
+ /**
+ * Called to set the properties used to initialize prior to execution.
+ *
+ * @param props
+ *
+ * @since
+ */
+// void setExecutionProperties(Properties props);
+
+ /**
+ * Override <code>before</code> if there is behavior that needs to be
+ * performed prior to {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void before();
+
+ /**
+ * Implement testCase(), it is the entry point to the execution of the test.
+ *
+ * @throws Exception
+ *
+ * @since
+ */
+ void testCase() throws Exception;
+
+ /**
+ * Override <code>after</code> if there is behavior that needs to be
+ * performed after {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void after();
+
+ /**
+ * Indicates what should be done when a failure occurs in
+ * {@link #testCase()}
+ *
+ * @return
+ *
+ * @since
+ */
+ boolean rollbackAllways();
+
+ /**
+ * Called at the end of the test so that the testcase can clean itself up by
+ * releasing any resources, closing any open connections, etc.
+ *
+ *
+ * @since
+ */
+ void cleanup();
+
+ /**
+ * Returns the connection being used in the test.
+ *
+ * @return
+ *
+ * @since
+ */
+ Connection getConnection();
+
+ XAConnection getXAConnection();
+
+ boolean exceptionExpected();
+
+ boolean exceptionOccurred();
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.adminapi.Admin;
+import org.teiid.adminapi.AdminOptions;
+import org.teiid.adminapi.Model;
+import org.teiid.adminapi.VDB;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.datasource.DataSource;
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.datasource.DataSourceMgr;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.util.PropertiesUtils;
+import com.metamatrix.jdbc.util.MMJDBCURL;
+
+
+public abstract class ConnectionStrategy {
+
+
+ private Properties env = null;
+ private DataSourceFactory dsFactory;
+
+
+ public ConnectionStrategy(Properties props, DataSourceFactory dsf) {
+ this.env = PropertiesUtils.clone(props);
+
+ this.dsFactory = dsf;
+ }
+
+ /*
+ * Lifecycle methods for managing the connection
+ */
+
+ /**
+ * Returns a connection
+ * @return Connection
+ */
+ public abstract Connection getConnection() throws QueryTestFailedException;
+
+ /**
+ * @since
+ */
+ public void shutdown() {
+
+ }
+
+ public Connection getAdminConnection() throws QueryTestFailedException{
+ return null;
+ }
+
+ private boolean autoCommit;
+ public boolean getAutocommit() {
+ return autoCommit;
+ }
+
+
+ public XAConnection getXAConnection() throws QueryTestFailedException {
+ return null;
+ }
+
+
+
+
+ public Properties getEnvironment() {
+ return env;
+ }
+
+
+ class CloseInterceptor implements InvocationHandler {
+
+ Connection conn;
+
+ CloseInterceptor(Connection conn) {
+ this.conn = conn;
+ }
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if (method.getName().equals("close")) { //$NON-NLS-1$
+ return null;
+ }
+ try {
+ return method.invoke(this.conn, args);
+ } catch (InvocationTargetException e) {
+ throw e.getTargetException();
+ }
+ }
+ }
+
+
+ void configure() throws QueryTestFailedException {
+
+ String ac = this.env.getProperty(CONNECTION_STRATEGY_PROPS.AUTOCOMMIT, "true");
+ this.autoCommit = Boolean.getBoolean(ac);
+
+ com.metamatrix.jdbc.api.Connection c =null;
+ try {
+
+ // the the driver strategy is going to be used to connection directly to the connector binding
+ // source, then no administration can be done
+ java.sql.Connection conn = getConnection();
+ if ( conn instanceof com.metamatrix.jdbc.api.Connection) {
+ c = (com.metamatrix.jdbc.api.Connection) conn;
+ } else {
+ return;
+ }
+
+ Admin admin = (Admin)c.getAdminAPI();
+
+ setupVDBConnectorBindings(admin);
+
+
+ // admin.restart();
+
+ int sleep = 5;
+
+ System.out.println("Bouncing the system..(wait " + sleep + " seconds)"); //$NON-NLS-1$
+ Thread.sleep(1000*sleep);
+ System.out.println("done."); //$NON-NLS-1$
+
+ } catch (Throwable e) {
+ e.printStackTrace();
+
+ throw new TransactionRuntimeException(e.getMessage());
+ } finally {
+ // need to close and flush the connection after restarting
+ // this.shutdown();
+
+ }
+ }
+
+ protected void setupVDBConnectorBindings(Admin api) throws QueryTestFailedException {
+
+ try {
+
+ VDB vdb = null;
+ Collection<VDB> vdbs = api.getVDBs("*");
+ if (vdbs == null || vdbs.isEmpty()) {
+ throw new QueryTestFailedException(
+ "AdminApi.GetVDBS returned no vdbs available");
+ }
+
+ String urlString = this.env.getProperty(DriverConnection.DS_URL);
+ MMJDBCURL url = new MMJDBCURL(urlString);
+ System.out.println("Trying to match VDB : " + url.getVDBName());
+
+ for (Iterator iterator = vdbs.iterator(); iterator.hasNext();) {
+ VDB v = (VDB) iterator.next();
+ if (v.getName().equalsIgnoreCase(url.getVDBName())) {
+ vdb = v;
+ }
+
+ }
+ if (vdbs == null) {
+ throw new QueryTestFailedException(
+ "GetVDBS did not return a vdb that matched "
+ + url.getVDBName());
+ }
+
+ Iterator<Model> modelIt = vdb.getModels().iterator();
+ while (modelIt.hasNext()) {
+ Model m = modelIt.next();
+
+ if (!m.isPhysical())
+ continue;
+
+ // get the mapping, if defined
+ String mappedName = this.env.getProperty(m.getName());
+
+ String useName = m.getName();
+ if (mappedName != null) {
+ useName = mappedName;
+ }
+
+ org.teiid.test.framework.datasource.DataSource ds = this.dsFactory
+ .getDatasource(useName, m.getName());
+
+ if (ds != null) {
+
+ System.out
+ .println("Set up Connector Binding (model:mapping:type): " + m.getName() + ":" + useName + ":" + ds.getConnectorType()); //$NON-NLS-1$
+
+ AdminOptions ao = new AdminOptions(
+ AdminOptions.OnConflict.OVERWRITE);
+ ao.addOption(AdminOptions.BINDINGS_IGNORE_DECRYPT_ERROR);
+
+ api.addConnectorBinding(ds.getName(),
+ ds.getConnectorType(), ds.getProperties(), ao);
+
+ api.assignBindingToModel(ds.getName(), vdb.getName(), vdb
+ .getVDBVersion(), m.getName());
+
+ api.startConnectorBinding(ds.getName());
+ } else {
+ throw new QueryTestFailedException(
+ "Error: Unable to create binding to map to model : "
+ + m.getName() + ", the mapped name "
+ + useName
+ + " had no datasource properties defined");
+ }
+
+ }
+
+ } catch (QueryTestFailedException qt) {
+ throw qt;
+ } catch (Exception t) {
+ t.printStackTrace();
+ throw new QueryTestFailedException(t);
+ }
+
+
+ }
+
+ public synchronized Connection createDriverConnection(String identifier) throws QueryTestFailedException {
+
+ DataSource ds = null;
+ if (identifier != null) {
+ ds = DataSourceMgr.getInstance().getDataSource(identifier);
+ }
+ if (ds == null) {
+ throw new TransactionRuntimeException(
+ "Program Error: DataSource is not mapped to Identifier " + identifier);
+ }
+
+ Connection conn = ds.getConnection();
+
+ if (conn != null) return conn;
+
+ ConnectionStrategy cs = null;
+ if (identifier == null) {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+
+ } else {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ }
+
+ ds.setConnection(cs);
+
+ return ds.getConnection();
+
+
+ }
+
+
+ public synchronized XAConnection createDataSourceConnection(String identifier) throws QueryTestFailedException {
+
+ DataSource ds = null;
+ if (identifier != null) {
+ ds = DataSourceMgr.getInstance().getDataSource(identifier);
+ }
+ if (ds == null) {
+ throw new TransactionRuntimeException(
+ "Program Error: DataSource is not mapped to Identifier " + identifier);
+ }
+
+ XAConnection conn = ds.getXAConnection();
+
+ if (conn != null) return conn;
+
+ ConnectionStrategy cs = null;
+ if (identifier == null) {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ } else {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ }
+
+ ds.setXAConnection(cs);
+
+ return ds.getXAConnection();
+
+
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.util.Properties;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+/**
+ * The ConnectionStrategyFactory is responsible for creating a connection strategy that is to be used to provide the type of
+ * connection.
+ * @author vanhalbert
+ *
+ */
+public class ConnectionStrategyFactory {
+
+
+ public static ConnectionStrategy createConnectionStrategy(ConfigPropertyLoader configprops) throws QueryTestFailedException {
+ ConnectionStrategy strategy = null;
+ Properties props = configprops.getProperties();
+
+ String type = props.getProperty(ConfigPropertyNames.CONNECTION_TYPE, ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION);
+ if (type == null) {
+ throw new RuntimeException("Property " + ConfigPropertyNames.CONNECTION_TYPE + " was specified");
+ }
+
+ if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION)) {
+ // pass in null to create new strategy
+ strategy = new DriverConnection(props, configprops.getDataSourceFactory());
+ System.out.println("Created Driver Strategy");
+ }
+ else if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.DATASOURCE_CONNECTION)) {
+ strategy = new DataSourceConnection(props, configprops.getDataSourceFactory());
+ System.out.println("Created DataSource Strategy");
+ }
+ else if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.JNDI_CONNECTION)) {
+ strategy = new JEEConnection(props, configprops.getDataSourceFactory());
+ System.out.println("Created JEE Strategy");
+ }
+
+ if (strategy == null) {
+ new TransactionRuntimeException("Invalid property value for " + ConfigPropertyNames.CONNECTION_TYPE + " is " + type );
+ }
+ // call configure here because this is creating the connection to Teiid
+ // direct connections to the datasource use the static call directly to create strategy and don't need to configure
+ strategy.configure();
+ return strategy;
+
+ }
+
+ public static void main(String[] args) {
+ //NOTE: to run this test to validate the DataSourceMgr, do the following:
+ // --- need 3 datasources, Oracle, SqlServer and 1 other
+
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
+
+ new DataSourceFactory(config);
+
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+import javax.sql.XADataSource;
+
+import org.teiid.connector.jdbc.JDBCPropertyNames;
+import org.teiid.jdbc.TeiidDataSource;
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.jdbc.BaseDataSource;
+import com.metamatrix.jdbc.EmbeddedDataSource;
+
+public class DataSourceConnection extends ConnectionStrategy {
+
+ public static final String DS_USER = "user"; //$NON-NLS-1$
+
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+ public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
+ public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
+
+ // the driver is only used for making direct connections to the source, the
+ // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE
+ // driver class
+ public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
+
+ public static final String DS_SERVERNAME = "ServerName"; //$NON-NLS-1$
+ public static final String DS_SERVERPORT = "PortNumber"; //$NON-NLS-1$
+ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
+ public static final String DS_DATABASENAME = "DatabaseName"; //$NON-NLS-1$
+ public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
+
+ private String driver = null;
+ private String username = null;
+ private String pwd = null;
+ private String applName = null;
+ private String databaseName = null;
+ private String serverName = null;
+ private String portNumber = null;
+
+ private XAConnection xaConnection;
+
+ public DataSourceConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
+ }
+
+ public void validate() {
+ databaseName = this.getEnvironment().getProperty(DS_DATABASENAME);
+ if (databaseName == null || databaseName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DATABASENAME
+ + " was not specified");
+ }
+
+ serverName = this.getEnvironment().getProperty(DS_SERVERNAME);
+ if (serverName == null || serverName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_SERVERNAME
+ + " was not specified");
+ }
+
+ this.portNumber = this.getEnvironment().getProperty(DS_SERVERPORT);
+
+ this.applName = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
+
+ this.driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (this.driver == null || this.driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER
+ + " was not specified");
+ }
+
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ if (username == null) {
+ this.username = this.getEnvironment().getProperty(DS_USERNAME);
+ }
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+
+ }
+
+ public Connection getConnection() throws QueryTestFailedException {
+ try {
+ return getXAConnection().getConnection();
+ } catch (QueryTestFailedException qtf) {
+ throw qtf;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new QueryTestFailedException(e);
+ }
+ }
+
+ public synchronized XAConnection getXAConnection()
+ throws QueryTestFailedException {
+ if (xaConnection == null) {
+ validate();
+ try {
+ xaConnection = createConnection();
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+ return xaConnection;
+ }
+
+ private XAConnection createConnection() throws SQLException,
+ InstantiationException, IllegalAccessException,
+ ClassNotFoundException {
+ System.out
+ .println("Creating Datasource Connection: \"" + this.serverName + " - " + this.databaseName + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ BaseDataSource dataSource = (BaseDataSource) Class.forName(this.driver)
+ .newInstance();
+
+ dataSource.setDatabaseName(this.databaseName);
+ if (this.applName != null) {
+ dataSource.setApplicationName(this.applName);
+ }
+
+ if (dataSource instanceof EmbeddedDataSource) {
+ ((EmbeddedDataSource) dataSource).setBootstrapFile(this.serverName);
+ } else {
+ ((TeiidDataSource) dataSource).setServerName(this.serverName);
+ ((TeiidDataSource) dataSource).setPortNumber(Integer
+ .parseInt(this.portNumber));
+ }
+
+ if (this.username != null) {
+ dataSource.setUser(this.username);
+ dataSource.setPassword(this.pwd);
+ }
+
+ return ((XADataSource) dataSource).getXAConnection(this.username,
+ this.pwd);
+ }
+
+ public void shutdown() {
+ super.shutdown();
+ try {
+
+ if (this.xaConnection != null) {
+ this.xaConnection.close();
+ }
+ } catch (SQLException e) {
+ // ignore..
+ }
+
+ this.xaConnection = null;
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.teiid.connector.jdbc.JDBCPropertyNames;
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+/**
+ * The DriverConnection strategy that can get connections in standalone mode or
+ * embedded mode.
+ */
+public class DriverConnection extends ConnectionStrategy {
+
+ public static final String DS_USER = "user"; //$NON-NLS-1$
+
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+ public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
+ public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
+
+ // the driver is only used for making direct connections to the source, the
+ // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE
+ // driver class
+ public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
+
+ public static final String DS_URL = JDBCPropertyNames.URL; //$NON-NLS-1$
+ public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
+
+ private String url = null;
+ private String driver = null;
+ private String username = null;
+ private String pwd = null;
+
+ private Connection connection;
+
+
+ public DriverConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
+ validate();
+ }
+
+ public void validate() {
+
+ String urlProp = this.getEnvironment().getProperty(DS_URL);
+ if (urlProp == null || urlProp.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_URL
+ + " was not specified");
+ }
+ StringBuffer urlSB = new StringBuffer(urlProp);
+
+ String appl = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
+ if (appl != null) {
+ urlSB.append(";");
+ urlSB.append("ApplicationName").append("=").append(appl);
+ }
+
+ url = urlSB.toString();
+
+ driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (driver == null || driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER
+ + " was not specified");
+ }
+
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ if (username == null) {
+ this.username = this.getEnvironment().getProperty(DS_USERNAME);
+ }
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+
+ try {
+ // Load jdbc driver
+ Class.forName(driver);
+ } catch (ClassNotFoundException e) {
+ throw new TransactionRuntimeException(e);
+ }
+
+ }
+
+ public synchronized Connection getConnection()
+ throws QueryTestFailedException {
+ if (this.connection != null) {
+ try {
+ if (!this.connection.isClosed()) {
+ return this.connection;
+ }
+ } catch (SQLException e) {
+
+ }
+
+ }
+
+ this.connection = getJDBCConnection(this.driver, this.url,
+ this.username, this.pwd);
+ return this.connection;
+ }
+
+ private Connection getJDBCConnection(String driver, String url,
+ String user, String passwd) throws QueryTestFailedException {
+
+ System.out.println("Creating Driver Connection: \"" + url + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Connection conn;
+ try {
+ // Create a connection
+ if (user != null && user.length() > 0) {
+ conn = DriverManager.getConnection(url, user, passwd);
+ } else {
+ conn = DriverManager.getConnection(url);
+ }
+
+ } catch (SQLException e) {
+ throw new QueryTestFailedException(e);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ throw new QueryTestFailedException(t.getMessage());
+ }
+ return conn;
+
+ }
+
+ public void shutdown() {
+ super.shutdown();
+ if (this.connection != null) {
+ try {
+ this.connection.close();
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ this.connection = null;
+
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+/**
+ * JEE (JNDI) Connection Strategy, when the test is run inside an application
+ * server. Make sure all the jndi names are set correctly in the properties
+ * file.
+ */
+public class JEEConnection extends ConnectionStrategy {
+
+ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
+
+ private String jndi_name = null;
+
+
+ public JEEConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
+ }
+
+ public Connection getConnection() throws QueryTestFailedException {
+ validate();
+ try {
+ InitialContext ctx = new InitialContext();
+ DataSource source = (DataSource) ctx.lookup(jndi_name);
+
+ if (source == null) {
+ String msg = "Unable to find jndi source " + jndi_name;//$NON-NLS-1$
+
+ QueryTestFailedException mme = new QueryTestFailedException(msg);//$NON-NLS-1$
+ throw mme;
+ }
+ Connection conn = source.getConnection();
+ return conn;
+ } catch (QueryTestFailedException qtfe) {
+ throw qtfe;
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+
+ public void shutdown() {
+ super.shutdown();
+ // no connection management here; app server takes care of these..
+ }
+
+ public void validate() {
+ // TODO Auto-generated method stub
+
+ jndi_name = getEnvironment().getProperty(DS_JNDINAME);
+ if (jndi_name == null || jndi_name.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_JNDINAME
+ + " was not specified");
+ }
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,90 @@
+package org.teiid.test.framework.datasource;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+/**
+ * DataSource represents a single database that was configured by a connection.properties file.
+ * @author vanhalbert
+ *
+ */
+public class DataSource {
+ public static final String CONNECTOR_TYPE="db.connectortype";
+ public static final String DB_TYPE="db.type";
+
+ private Properties props;
+
+ private String name;
+ private String group;
+ private String dbtype;
+
+ // The connections are stored in the datasource and are reused
+ // for the duration of all tests so thats there's not
+ // disconnect/connect being performed over and over
+ private ConnectionStrategy conn;
+ private ConnectionStrategy xaconn;
+
+ public DataSource() {
+ this.name = "notassigned";
+ }
+ public DataSource(String name, String group, Properties properties) {
+ this.name = name;
+ this.group = group;
+ this.props = properties;
+ this.dbtype = this.props.getProperty(DB_TYPE);
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public String getGroup() {
+ return group;
+ }
+
+ public String getConnectorType() {
+ return props.getProperty(CONNECTOR_TYPE);
+ }
+
+ public String getProperty(String propName) {
+ return props.getProperty(propName);
+ }
+
+ public Properties getProperties() {
+ return this.props;
+ }
+
+ public String getDBType() {
+ return this.dbtype;
+ }
+
+
+ public Connection getConnection() throws QueryTestFailedException {
+ if (this.conn == null) return null;
+
+ return this.conn.getConnection();
+ }
+
+ public void setConnection(ConnectionStrategy c) {
+ this.conn = c;
+ }
+
+ public XAConnection getXAConnection() throws QueryTestFailedException {
+ if (this.xaconn == null) return null;
+
+ return this.xaconn.getXAConnection();
+ }
+
+ public void setXAConnection(ConnectionStrategy xaconn) {
+ this.xaconn = xaconn;
+ }
+
+
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,569 @@
+package org.teiid.test.framework.datasource;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+import com.metamatrix.common.util.PropertiesUtils;
+import com.metamatrix.core.util.StringUtil;
+
+
+/**
+ * The DataSourceFactory is responsible for managing the datasources used during a single test.
+ * It ensures the same data source is used in both the connector binding and during validation to ensure validation is performed
+ * against the same datasource the test was performed on.
+ *
+ * The following are the available options for controlling which datasources are used during a test:
+ * <li>Control which datasources are used and to which model they are assigned</li>
+ *
+ * <p>
+ * Use the {@link ConfigPropertyNames#USE_DATASOURCES_PROP} property to specify a comma delimited ordered list to control which data sources to use.
+ *
+ * <br><br>
+ * This will enable integration testing to be setup to use well known combinations, to ensure coverage and makes it easier to replicate issues.
+ *
+ * This indicates to use only the specified datasources for this test. This option can be used in test cases where only
+ * specific sources are to be used and tested against.
+ *
+ * This ordered list will map to the model:order mapping in the config.properties file.
+ * <br><br>
+ * Example: in the config.properties file, the models in the test and their order can be specified:
+ * <li> pm1=1 </li>
+ * <li> pm2=2 </li>
+ * <br>
+ *
+ * Then set property: ConfigPropertyNames.USE_DATASOURCES_PROP=oracle,sqlserver
+ *
+ * This will use oracle and sqlserver datasources in the test, and when a datasource is requested for model "pm1", the oracle datasource will be returned. And when a data source
+ * for "pm2" is requested, the data source mapped to 2nd ordered datasource of sqlserver will be returned.
+ *
+ * </p>
+ * <li>Control which datasources of a specific database type to exclude</li>
+ * <p>
+ *
+ * Use the {@link ConfigPropertyNames#EXCLUDE_DATASBASE_TYPES_PROP} property to specify a comma delimited list of {@link DataBaseTypes} to exclude.
+ * <br><br>
+ * This will remove all datasources of a specific database type from the list of available datasources. This option will be applied after
+ * {@link ConfigPropertyNames#USE_DATASOURCES_PROP} option. This is done because there are some test that will not work with certain database
+ * types, and therefore, if the required datasources are not met, the test will be bypassed for execution.
+ *</p>
+ * <li>Control for a specfic model, which database type of datasource to be assigned</li>
+ * <p>
+ * This option gives the developer even more fine grain control of how datasources are assigned. There are cases where a specific model must be assigned
+ * to a datasource of a specific database type.
+ *
+ * To use this option,
+ *
+ * </p>
+ * @author vanhalbert
+ *
+ */
+public class DataSourceFactory {
+
+ /**
+ * These types match the "ddl" directories for supported database types
+ * and it also found in the datasources connection.properties defined by the DB_TYPE property
+ * These are also the values used to specify the required database types.
+ *
+ */
+ public static interface DataBaseTypes{
+ public static String MYSQL = "mysql";
+ public static String ORACLE = "oracle";
+ public static String POSTRES = "postgres";
+ public static String SQLSERVER = "sqlserver";
+ public static String DB2 = "db2";
+ public static String SYBASE = "sybase";
+ public static String DERBY = "derby";
+ public static String ANY = "any";
+
+ }
+
+ // the DO_NO_USE_DEFAULT will be passed in when the test are run from maven and no property is passed in for UseDataSources
+ private static final String DO_NOT_USE_DEFAULT="${usedatasources}";
+
+ private DataSourceMgr dsmgr = DataSourceMgr.getInstance();
+
+// private ConfigPropertyLoader configprops;
+
+ private Properties configprops;
+
+ // contains the names of the datasources when the -Dusedatasources option is used
+ private Map<String, String> useDS = null;
+
+ // contains all the datasources available to be used
+ private Map<String, DataSource> availDS = null;
+
+
+ // contains any dbtype preconditions on a model, which requires a model to be assigned a certain database type
+ private Map<String, String> requiredDataBaseTypes = null; // key=modelname value=dbtype
+
+ // this set is use to track datasources that have already been assigned
+ private Set<String> assignedDataSources = new HashSet<String>();
+
+ private int lastassigned = 0;
+
+ // indicates if the datasource requirements have been, it will be false in the case
+ // a specific dbtype is required and that type was not one of the available types defined
+ private boolean metDBRequiredTypes = true;
+
+ // indicates that there are required dbtypes to consider
+ private boolean hasRequiredDBTypes = false;
+
+
+ public DataSourceFactory(ConfigPropertyLoader config) {
+ this.configprops = PropertiesUtils.clone(config.getProperties(), null, true);
+ this.requiredDataBaseTypes = config.getModelAssignedDatabaseTypes();
+ config();
+ }
+
+ public Properties getConfigProperties() {
+ return this.configprops;
+ }
+
+ /**
+ * config is called at the start / setup of the {@link
+ * TransactionContainer#} test. This is to ensure any exclusions /
+ * inclusions are considered for the next executed set of test.
+ *
+ *
+ * 1st, check for the usedatasource property, if exist, then only add those specific datasources
+ * to the useDataSources, otherwise add all available.
+ * 2nd, if the exclude option is used, then remove any excluded datasources from the useDataSources.
+ *
+ * @since
+ */
+ private void config() {
+ System.out.println("Configure Datasource Factory ");
+
+ Map<String, DataSource> availDatasources = dsmgr.getDataSources();
+
+ availDS = new HashMap<String, DataSource>(availDatasources.size());
+
+ String usedstypeprop = configprops
+ .getProperty(ConfigPropertyNames.USE_DATASOURCE_TYPES_PROP);
+
+ Set<String> useDBTypes = null;
+
+ if (usedstypeprop != null && usedstypeprop.length() > 0) {
+ List<String> eprops = StringUtil.split(usedstypeprop, ",");
+ useDBTypes = new HashSet<String>(eprops.size());
+ useDBTypes.addAll(eprops);
+ System.out.println("EXCLUDE datasources: " + usedstypeprop);
+ } else {
+ useDBTypes = Collections.EMPTY_SET;
+ }
+
+ String excludeprop = configprops
+ .getProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP);
+
+ Set<String> excludedDBTypes = null;
+
+ if (excludeprop != null && excludeprop.length() > 0) {
+ List<String> eprops = StringUtil.split(excludeprop, ",");
+ excludedDBTypes = new HashSet<String>(eprops.size());
+ excludedDBTypes.addAll(eprops);
+ System.out.println("EXCLUDE datasources: " + excludeprop);
+ } else {
+ excludedDBTypes = Collections.EMPTY_SET;
+ }
+
+
+ String limitdsprop = configprops
+ .getProperty(ConfigPropertyNames.USE_DATASOURCES_PROP);
+ if (limitdsprop != null && limitdsprop.length() > 0 && ! limitdsprop.equalsIgnoreCase(DO_NOT_USE_DEFAULT)) {
+ System.out.println("Use ONLY datasources: " + limitdsprop);
+
+ List<String> dss = StringUtil.split(limitdsprop, ",");
+
+ useDS = new HashMap<String, String>(dss.size());
+ DataSource ds = null;
+ int i = 1;
+ for (Iterator<String> it = dss.iterator(); it.hasNext(); i++) {
+ String dssName = it.next();
+ ds = availDatasources.get(dssName);
+
+ if (ds != null && !excludedDBTypes.contains(ds.getDBType())) {
+
+ useDS.put(String.valueOf(i), dssName);
+
+ availDS.put(dssName, ds);
+ System.out.println("Using ds: " + dssName);
+ }
+
+ }
+
+ } else {
+ for (Iterator<DataSource> it = availDatasources.values().iterator(); it.hasNext(); ) {
+ DataSource ds = it.next();
+ // if the datasource type is not excluded, then consider for usages
+ if (!excludedDBTypes.contains(ds.getDBType())) {
+
+ // if use a specific db type is specified, then it must match,
+ // otherwise add it to the available list
+ if (useDBTypes.size() > 0 && usedstypeprop.contains(ds.getDBType())) {
+ availDS.put(ds.getName(), ds);
+ } else {
+ availDS.put(ds.getName(), ds);
+ }
+
+ }
+ }
+
+
+ }
+
+
+
+ if (requiredDataBaseTypes != null && requiredDataBaseTypes.size() > 0) {
+ this.hasRequiredDBTypes = true;
+
+ Iterator<String> rit = this.requiredDataBaseTypes.keySet().iterator();
+
+ // go thru all the datasources and remove those that are excluded
+ while (rit.hasNext()) {
+ String modelName = rit.next();
+ String rdbtype = this.requiredDataBaseTypes.get(modelName);
+
+ Iterator<DataSource> ait = availDS.values().iterator();
+
+ metDBRequiredTypes = false;
+
+ // go thru all the datasources and find the matching datasource of the correct dbtype
+ while (ait.hasNext()) {
+ DataSource ds = ait.next();
+ if (ds.getDBType().equalsIgnoreCase(rdbtype)) {
+ assignedDataSources.add(ds.getName());
+
+ dsmgr.setDataSource(modelName, ds);
+ // modelToDatasourceMap.put(modelName, ds);
+ metDBRequiredTypes = true;
+
+ }
+
+ }
+
+ if (!metDBRequiredTypes) {
+ // did find a required dbtype, no need going any further
+ break;
+ }
+
+ }
+
+ }
+
+
+ }
+
+ public int getNumberAvailableDataSources() {
+ return (metDBRequiredTypes ? this.availDS.size() :0);
+ }
+
+ public synchronized DataSource getDatasource(String datasourceid,
+ String modelName) throws QueryTestFailedException {
+ DataSource ds = null;
+
+ // map the datasource to the model and datasourceid
+ // this is so the next time this combination is requested,
+ // the same datasource is returned to ensure when consecutive calls
+ // during the process
+ // corresponds to the same datasource
+ String key = null;
+
+ key = modelName;
+ //+ "_" + datasourceid;
+
+ // if the datasourceid represents a group name, then use the group name
+ // so that all future request using that group name for a specified
+ // model
+ // will use the same datasource
+
+ ds = dsmgr.getDataSource(key);
+ if (ds != null) {
+ return ds;
+ }
+
+ if (this.hasRequiredDBTypes) {
+ if (this.requiredDataBaseTypes.containsKey(modelName)) {
+ String dbtype = this.requiredDataBaseTypes.get(modelName);
+
+ Iterator<DataSource> it = availDS.values().iterator();
+
+ // need to go thru all the datasources to know if any has already been
+ // assigned
+ // because the datasourceid passed in was a group name
+ while (it.hasNext()) {
+ DataSource checkit = it.next();
+
+ if (dbtype.equalsIgnoreCase(checkit.getDBType())) {
+ ds = checkit;
+ break;
+ }
+
+ }
+
+
+ }
+
+ } else if (useDS != null) {
+ String dsname = useDS.get(datasourceid);
+ if (dsname != null) {
+ ds = availDS.get(dsname);
+ if (ds == null) {
+ throw new QueryTestFailedException("Datasource name "
+ + dsname
+ + " was not found in the allDatasources map");
+
+ }
+ }
+
+
+ } else {
+
+ Iterator<DataSource> it = availDS.values().iterator();
+
+ // need to go thru all the datasources to know if any has already been
+ // assigned
+ // because the datasourceid passed in was a group name
+ while (it.hasNext()) {
+ DataSource checkit = it.next();
+
+ if (!assignedDataSources.contains(checkit.getName())) {
+ ds = checkit;
+ break;
+ }
+
+ }
+ }
+
+ if (ds == null) {
+ int cnt = 0;
+ Iterator<String> itds = assignedDataSources.iterator();
+
+ // when all the datasources have been assigned, but a new model
+ // datasource id is
+ // passed in, need to reassign a previously assigned datasource
+ // This case will happen when more models are defined than there are
+ // defined datasources.
+ while (itds.hasNext()) {
+ String dsname = itds.next();
+
+ if (cnt == this.lastassigned) {
+
+ ds = availDS.get(dsname);
+
+ this.lastassigned++;
+ if (lastassigned >= assignedDataSources.size()) {
+ this.lastassigned = 0;
+ }
+
+ break;
+ }
+ }
+
+ }
+
+ if (ds == null) {
+ throw new QueryTestFailedException(
+ "Unable to assign a datasource for model:datasourceid "
+ + modelName + ":" + datasourceid);
+
+ }
+
+ assignedDataSources.add(ds.getName());
+
+ dsmgr.setDataSource(key, ds);
+ return ds;
+
+ }
+
+ public void cleanup() {
+
+ dsmgr.clear();
+ assignedDataSources.clear();
+ requiredDataBaseTypes.clear();
+
+ if (useDS != null) useDS.clear();
+ if (availDS != null) availDS.clear();
+
+ }
+
+ public static void main(String[] args) {
+ //NOTE: to run this test to validate the DataSourceMgr, do the following:
+ // --- need 3 datasources, Oracle, SqlServer and 1 other
+
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
+
+ DataSourceFactory factory = new DataSourceFactory(config);
+
+ try {
+ if (factory.getDatasource("1", "model1") == null) {
+ throw new RuntimeException("No datasource was not found");
+ }
+
+
+ } catch (QueryTestFailedException e) {
+ e.printStackTrace();
+ }
+
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ // the following verifies that order of "use" datasources is applied to request for datasources.
+ config = ConfigPropertyLoader.getInstance();
+
+ config.setProperty(ConfigPropertyNames.USE_DATASOURCES_PROP, "oracle,sqlserver");
+
+ factory = new DataSourceFactory(config);
+
+ try {
+
+ DataSource dsfind = factory.getDatasource("2", "model2");
+ if (dsfind == null) {
+ throw new RuntimeException("No datasource was not found as the 2nd datasource");
+
+ }
+
+ if (dsfind.getConnectorType() == null) {
+ throw new RuntimeException("Connector types was not defined");
+ }
+
+ if (!dsfind.getName().equalsIgnoreCase("sqlserver")) {
+ throw new RuntimeException("Sqlserver was not found as the 2nd datasource");
+
+ }
+
+ dsfind = factory.getDatasource("1", "model1");
+ if (dsfind == null) {
+ throw new RuntimeException("No datasource was not found as the 2nd datasource");
+
+ }
+ if (!dsfind.getName().equalsIgnoreCase("oracle")) {
+ throw new RuntimeException("Oracle was not found as the 2nd datasource");
+
+ }
+ System.out.println("Datasource :" + dsfind.getName() + " was found");
+
+
+ // the following test verifies that a sqlserver datasource is not
+ // returned (excluded)
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ config = ConfigPropertyLoader.getInstance();
+ config.setProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP, "sqlserver");
+
+
+ factory = new DataSourceFactory(config);
+
+ int n = factory.getNumberAvailableDataSources();
+ System.out.println("Num avail datasources: " + n);
+
+ for (int i=0; i<n; i++) {
+
+ String k = String.valueOf(i);
+ DataSource ds1 = factory.getDatasource(k, "model" + k);
+ if (ds1 == null) {
+ throw new RuntimeException("No datasource was found for: model:" + k);
+
+ } if (ds1.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("sqlserver dbtype should have been excluded");
+ }
+ }
+
+
+ DataSource reuse = factory.getDatasource(String.valueOf(n + 1), "model1");
+ if (reuse != null) {
+
+ } else {
+ throw new RuntimeException("The process was not able to reassign an already used datasource");
+
+ }
+
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ // test required database types
+ // test 1 source
+
+ config = ConfigPropertyLoader.getInstance();
+
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ORACLE);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds1 = factory.getDatasource("1","pm1");
+ if (!ds1.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.ORACLE)) {
+ throw new RuntimeException("Required DB Type of oracle for model pm1 is :" + ds1.getDBType());
+ }
+
+ System.out.println("Test1 Required DS1 " + ds1.getDBType());
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+ // test required database types
+ // test 2 sources, 1 required and other ANY
+ config = ConfigPropertyLoader.getInstance();
+
+
+ config.setModelAssignedToDatabaseType("pm2", DataSourceFactory.DataBaseTypes.SQLSERVER);
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ANY);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds2 = factory.getDatasource("2","pm2");
+ if (!ds2.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("Required DB Type of sqlserver for model pm2 is :" + ds2.getDBType());
+ }
+ System.out.println("Test2 Required DS2 " + ds2.getDBType());
+
+ factory.cleanup();
+ ConfigPropertyLoader.cleanup();
+
+
+ // test required database types
+ // test 2 sources, 2 required
+ config = ConfigPropertyLoader.getInstance();
+
+
+ config.setModelAssignedToDatabaseType("pm2", DataSourceFactory.DataBaseTypes.SQLSERVER);
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ORACLE);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds3a = factory.getDatasource("2","pm2");
+ if (!ds3a.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("Required DB Type of sqlserver for model pm12 is :" + ds3a.getDBType());
+ }
+
+ DataSource ds3b = factory.getDatasource("2","pm1");
+ if (!ds3b.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.ORACLE)) {
+ throw new RuntimeException("Required DB Type of oracle for model pm1 is :" + ds3b.getDBType());
+ }
+ System.out.println("Test3 Required DS3a " + ds3a.getDBType());
+ System.out.println("Test3 Required DS3b " + ds3b.getDBType());
+
+ factory.cleanup();
+
+
+ } catch (QueryTestFailedException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceMgr.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceMgr.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceMgr.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.datasource;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.util.PropertiesUtils;
+
+/**
+ * The DataSourceMgr is responsible for loading and managing the datasources
+ * defined by the datasource connection properties file. There's only a need to
+ * load the set of available datasources once for the duration of the entire
+ * test suite. And it will maintain one {@link DataSource} for each
+ * connection.properties file that it finds.
+ *
+ * @author vanhalbert
+ *
+ */
+public class DataSourceMgr {
+
+ private static DataSourceMgr _instance = null;
+
+ /**
+ * Defines the default location where the datasource files will be found.
+ * An override can be specified by setting the property {@link ConfigPropertyNames#OVERRIDE_DATASOURCES_LOC}.
+ */
+ public static final String DEFAULT_DATASOURCES_LOC="./target/classes/datasources/";
+
+ /**
+ * When run from maven, the {@link ConfigPropertyNames#OVERRIDE_DATASOURCES_LOC} will be assigned
+ * to this value because of its a place holder for when a user does set the vm argument.
+ */
+ private static final String UNASSIGNEDDSLOC="${";
+
+ private Map<String, DataSource> allDatasourcesMap = new HashMap<String, DataSource>(); // key
+ // =
+ // datasource
+ // name
+
+ // map of the datasources assigned to with model
+ // because only one VDB (Transactions) is used, then this mapping can live
+ // for the
+ // duration of all tests
+ private Map<String, DataSource> modelToDatasourceMap = new HashMap<String, DataSource>(); // key
+ // =
+ // modelname
+
+ private DataSourceMgr() {
+ }
+
+ public static synchronized DataSourceMgr getInstance() {
+ if (_instance == null) {
+ _instance = new DataSourceMgr();
+ try {
+ _instance.loadDataSourceMappings();
+ } catch (QueryTestFailedException e) {
+ throw new TransactionRuntimeException(e);
+ } catch (TransactionRuntimeException e) {
+ throw e;
+ }
+
+ }
+ return _instance;
+ }
+
+ public Map<String, DataSource> getDataSources() {
+ Map<String, DataSource> ds = new HashMap<String, DataSource>(
+ allDatasourcesMap.size());
+ ds.putAll(allDatasourcesMap);
+ return ds;
+ }
+
+ public int numberOfAvailDataSources() {
+ return allDatasourcesMap.size();
+ }
+
+ public DataSource getDataSource(String modelname) {
+ if (modelToDatasourceMap.containsKey(modelname)) {
+ return modelToDatasourceMap.get(modelname);
+ }
+ return null;
+ }
+
+ void clear() {
+ modelToDatasourceMap.clear();
+ }
+
+ public void setDataSource(String modelName, DataSource ds) {
+ modelToDatasourceMap.put(modelName, ds);
+ }
+
+ private void loadDataSourceMappings() throws QueryTestFailedException {
+
+ String dsloc = ConfigPropertyLoader.getInstance().getProperty(ConfigPropertyNames.OVERRIDE_DATASOURCES_LOC);
+
+ if (dsloc == null || dsloc.indexOf(UNASSIGNEDDSLOC) > -1) {
+ dsloc = DEFAULT_DATASOURCES_LOC;
+ System.out.println("Using default datasource loc: " +dsloc);
+ } else {
+ System.out.println("Using override for datasources loc: " + dsloc);
+ }
+
+ File[] dirs = findAllChildDirectories(dsloc);
+ if (dirs == null || dirs.length == 0) {
+ throw new TransactionRuntimeException(
+ "No datasource directories found at location "
+ + dsloc);
+ }
+ for (int i = 0; i < dirs.length; i++) {
+ File d = dirs[i];
+
+ addDataSource(d, allDatasourcesMap);
+
+ }
+
+ if (allDatasourcesMap == null || allDatasourcesMap.isEmpty()) {
+ throw new TransactionRuntimeException(
+ "Error: No Datasources were loaded.");
+ } else if (allDatasourcesMap.size() < 2) {
+ throw new TransactionRuntimeException(
+ "Error: Must load 2 Datasources, only 1 was found.");
+
+ }
+
+ System.out.println("Number of total datasource mappings loaded "
+ + allDatasourcesMap.size());
+
+ }
+
+ /**
+ * Returns a <code>File</code> array that will contain all the directories
+ * that exist in the directory
+ *
+ * @return File[] of directories in the directory
+ */
+ private static File[] findAllChildDirectories(String dir) {
+
+ // Find all files in the specified directory
+ File mfile = new File(dir);
+
+ File modelsDirFile = null;
+ try {
+ modelsDirFile = new File(mfile.getCanonicalPath());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ if (!modelsDirFile.exists()) {
+ return null;
+ }
+ FileFilter fileFilter = new FileFilter() {
+
+ public boolean accept(File file) {
+ if (file.isDirectory()) {
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+ File[] modelFiles = modelsDirFile.listFiles(fileFilter);
+
+ return modelFiles;
+
+ }
+
+ private void addDataSource(File datasourcedir, //String dirname, String dirloc,
+ Map<String, DataSource> datasources) {
+
+// String dirname = datasourcefile.getName();
+
+ File dsfile = new File(datasourcedir, "connection.properties");
+
+ if (!dsfile.exists()) {
+ return;
+ }
+
+// String dsfile = "/datasources/" + dirname + "/connection.properties";
+ Properties dsprops = loadProperties(dsfile);
+
+ if (dsprops != null) {
+
+ DataSource ds = new DataSource(datasourcedir.getName(), "dsgroup", dsprops);
+ datasources.put(ds.getName(), ds);
+ System.out.println("Loaded datasource " + ds.getName());
+
+ }
+
+ }
+
+ private static Properties loadProperties(File dsfile) {
+ Properties props = null;
+
+ try {
+
+ props = PropertiesUtils.load(dsfile.getAbsolutePath());
+ return props;
+
+// InputStream in = DataSourceMgr.class.getResourceAsStream(dsfile.getAbsolutePath());
+// if (in != null) {
+// props = new Properties();
+// props.load(in);
+// return props;
+// }
+// return null;
+ } catch (IOException e) {
+ throw new TransactionRuntimeException(
+ "Error loading properties from file '" + dsfile.getAbsolutePath() + "'"
+ + e.getMessage());
+ }
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.datasource;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+/**
+ * This class loads the data in the databases specified, to a known state
+ */
+public class DataStore {
+
+ /**
+ * Called at the start of all the tests to initialize the database to ensure
+ * it's in the proper state.
+ *
+ * @param connStrategy
+ */
+ public static void initialize(ConnectionStrategy connStrategy) {
+// ConfigPropertyLoader.cleanup();
+// ConfigPropertyLoader.getInstance();
+ try {
+ load(getConnection("pm1", connStrategy));
+
+ load(getConnection("pm2", connStrategy));
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static Connection getConnection(String identifier, ConnectionStrategy connStrategy) throws QueryTestFailedException {
+ Connection conn = connStrategy.createDriverConnection(identifier);
+ // force autocommit back to true, just in case the last user didnt
+ try {
+ conn.setAutoCommit(true);
+ } catch (Exception sqle) {
+ throw new QueryTestFailedException(sqle);
+ }
+
+ return conn;
+ }
+
+ private static void load(Connection c) throws Exception {
+ // DDL
+ // drop table g1;
+ // drop table g2;
+
+ // oracle
+ // create Table g1 (e1 number(5) PRIMARY KEY, e2 varchar2(50));
+ // create Table g2 (e1 number(5) REFERENCES g1, e2 varchar2(50));
+
+ // SQL Server
+ // create Table g1 (e1 int PRIMARY KEY, e2 varchar(50));
+ // create Table g2 (e1 int references g1, e2 varchar(50));
+
+
+ Statement stmt = c.createStatement();
+ stmt.addBatch("delete from g2");
+ stmt.addBatch("delete from g1");
+
+ for (int i = 0; i < 100; i++) {
+ stmt.addBatch("insert into g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+
+ for (int i = 0; i < 50; i++) {
+ stmt.addBatch("insert into g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ stmt.executeBatch();
+ stmt.close();
+
+ }
+
+ /**
+ * Called as part of the setup for each test.
+ * This will set the database state as if {@link #initialize(ConnectionStrategy)} was called.
+ * However, for performance reasons, the process goes about removing what's not needed instead of cleaning out everything
+ * and reinstalling.
+ * @param connStrategy
+ */
+ public static void setup(ConnectionStrategy connStrategy) {
+ try {
+ setUpTest(getConnection("pm1", connStrategy));
+
+ setUpTest(getConnection("pm2", connStrategy));
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+
+ }
+
+ private static void setUpTest(Connection c) throws Exception {
+
+ Statement stmt = c.createStatement();
+ stmt.addBatch("delete from g2 where e1 >= 50"); //$NON-NLS-1$
+ stmt.addBatch("delete from g1 where e1 >= 100");
+
+ stmt.executeBatch();
+ stmt.close();
+
+
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 2000-2005 MetaMatrix, Inc. All rights reserved.
+ */
+package org.teiid.test.framework.exception;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.metamatrix.core.MetaMatrixRuntimeException;
+import com.metamatrix.core.util.MetaMatrixExceptionUtil;
+
+/**
+ */
+
+ /**
+ * The QueryTestFailedException is thrown during a test.
+ *
+ * This exception which contains a reference to another exception. This
+ * class can be used to maintain a linked list of exceptions. <p>
+ *
+ * Subclasses of this exception typically only need to implement whatever
+ * constructors they need. <p>
+ */
+public class QueryTestFailedException extends Exception
+ implements Serializable{
+ //############################################################################################################################
+ //# Static Methods #
+ //############################################################################################################################
+
+ /**
+ * @since
+ */
+ private static final long serialVersionUID = -4824998416118801290L;
+
+ /**
+ * Utility method to get the name of a class, without package information.
+ *
+ * @param cls The class to get the name of
+ * @return The name of the class, without package info
+ */
+ public static String getClassShortName( Class<?> cls ) {
+ if ( cls == null ) return ""; //$NON-NLS-1$
+ String className = cls.getName();
+ return className.substring( className.lastIndexOf('.')+1 );
+ }
+
+ //############################################################################################################################
+ //# Variables #
+ //############################################################################################################################
+
+ /** An error code. */
+ private String code;
+
+ /** Exception chained to this one. */
+ private Throwable child;
+
+ private String msg;
+
+ //############################################################################################################################
+ //# Constructors #
+ //############################################################################################################################
+
+ /**
+ * Construct a default instance of this class.
+ */
+ public QueryTestFailedException() {
+ }
+
+ /**
+ * Construct an instance with the specified error message. If the message is actually a key, the actual message will be
+ * retrieved from a resource bundle using the key, the specified parameters will be substituted for placeholders within the
+ * message, and the code will be set to the key.
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final String message) {
+ setMessage(message, null);
+ }
+
+ /**
+ * Construct an instance with the specified error code and message. If the message is actually a key, the actual message will
+ * be retrieved from a resource bundle using the key, and the specified parameters will be substituted for placeholders within
+ * the message.
+ * @param code The error code
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final String code, final String message) {
+ setMessage(message, null);
+ // The following setCode call should be executed after setting the message
+ setCode(code);
+ }
+
+ /**
+ * Construct an instance with a linked exception specified. If the exception is a MetaMatrixException or a
+ * {@link MetaMatrixRuntimeException}, then the code will be set to the exception's code.
+ * @param e An exception to chain to this exception
+ */
+ public QueryTestFailedException(final Throwable e) {
+ // This is nasty, but there's no setMessage() routine!
+ this.msg = ( e instanceof java.lang.reflect.InvocationTargetException )
+ ? ((java.lang.reflect.InvocationTargetException)e).getTargetException().getMessage()
+ : (e == null ? null : e.getMessage());
+ setChild( e );
+
+ }
+
+ /**
+ * Construct an instance with the linked exception and error message specified. If the message is actually a key, the error
+ * message will be retrieved from a resource bundle the key, and code will be set to that key. Otherwise, if the specified
+ * exception is a MetaMatrixException or a {@link MetaMatrixRuntimeException}, the code will be set to the exception's code.
+ * @param e The exception to chain to this exception
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final Throwable e, final String message) {
+ setChild( e );
+ // The following setMessage call should be executed after attempting to set the code from the passed-in exception
+ setMessage(message, null);
+
+ }
+
+
+ /**
+ * Construct an instance with the linked exception, error code, and error message specified. If the message is actually a
+ * key, the error message will be retrieved from a resource bundle using the key.
+ * @param e The exception to chain to this exception
+ * @param code The error code
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final Throwable e, final String code, final String message) {
+ setChild(e);
+ setMessage(message, null);
+ // The following setCode call should be executed after setting the message
+ setCode(code);
+ }
+
+ //############################################################################################################################
+ //# Methods #
+ //############################################################################################################################
+
+ /**
+ * Get the exception which is linked to this exception.
+ *
+ * @return The linked exception
+ */
+ public Throwable getChild() {
+ return this.child;
+ }
+
+ /**
+ * Get the error code.
+ *
+ * @return The error code
+ */
+ public String getCode() {
+ return this.code;
+ }
+
+ /**
+ * Returns the error message, formatted for output. <P>
+ *
+ * The default formatting provided by this method is to prepend the
+ * error message with the level and the name of the class, and to
+ * append the error code on the end if a non-zero code is defined. <P>
+ *
+ * This method provides a hook for subclasses to override the default
+ * formatting of any one exception.
+ *
+ * @param except The exception to print
+ * @param level The depth of the exception in the chain of exceptions
+ * @return A formatted string for the exception
+ */
+ public String getFormattedMessage(final Throwable throwable, final int level) {
+
+ return ((level != 0) ? ("\n" + level + " ") : "" ) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ + "[" + getClassShortName(throwable.getClass()) + "]" //$NON-NLS-1$ //$NON-NLS-2$
+ + ((code != null) ? (' ' + code + ": ") : "") //$NON-NLS-1$//$NON-NLS-2$
+ + (throwable.getMessage() == null ? "" : throwable.getMessage()); //$NON-NLS-1$
+ }
+
+ /**
+ * Get the full error message, including any message(s) from child
+ * exceptions. Messages of any exceptions chained to this exception are
+ * prepended with their "level" in the chain.
+ *
+ * @return The full error message
+ *
+ * @see #getFormattedMessage
+ */
+ public String getFullMessage() {
+ return MetaMatrixExceptionUtil.getLinkedMessages(this, 0 );
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Throwable#getMessage()
+ */
+ public String getMessage() {
+ return this.msg;
+ }
+
+ /**
+ * Set the exception which is linked to this exception. <P>
+ *
+ * For the special case of an InvocationTargetException, which is
+ * a wrapped exception provided in the <CODE>java.lang.reflect</CODE>
+ * package, the child is set to the wrapped exception, and the message,
+ * if not yet defined, is set to the message of the wrapped exception.
+ *
+ * @param child The linked exception
+ */
+ public void setChild( Throwable child ) {
+ // Special processing in case this is already a wrapped exception
+ if ( child instanceof java.lang.reflect.InvocationTargetException ) {
+ this.child = ((java.lang.reflect.InvocationTargetException)child).getTargetException();
+ } else {
+ this.child = child;
+ }
+ }
+
+ /**
+ * Set the error code.
+ *
+ * @param code The error code
+ */
+ public void setCode( String code ) {
+ this.code = code;
+ }
+
+ /**
+ * Sets the exception message to the specified text. If the message is actually a resource bundle key, the actual message
+ * will be retrieved using that key, the specified parameters will be substituted for placeholders within the message, and the
+ * code will be set to the key.
+ * @param message The message text or a resource bundle message key.
+ * @param parameters The list of parameters to substitute for placeholders in the retrieved message.
+ * @since 3.1
+ */
+ private void setMessage(final String message, final List parameters) {
+ if (message == null) {
+ this.msg = message;
+ } else {
+ final String msg = message;
+// final String msg = TextManager.INSTANCE.getText(message, parameters);
+ final int len = msg.length();
+ if (msg.startsWith("<") && len >= 2) { //$NON-NLS-1$
+ this.msg = msg.substring(1, len - 1);
+ } else {
+ this.msg = msg;
+ setCode(message);
+ }
+ }
+ }
+
+ /**
+ * Returns a string representation of this class.
+ *
+ * @return String representation of instance
+ */
+ public String toString() {
+ return getFullMessage();
+ }
+
+ // =========================================================================
+ // T E S T M E T H O D S
+ // =========================================================================
+
+ /**
+ * Test program for this class.
+ *
+ * @args The command line arguments
+ */
+
+ /*
+ public static void main( String[] args ) {
+ class TestAppException extends MetaMatrixException {
+ public TestAppException( Throwable e ) {
+ super( e );
+ }
+ public TestAppException( Throwable e, String message ) {
+ super( e, message );
+ }
+ } // END INNER CLASS
+
+ System.out.println( "\n2 MetaMatrixExceptions and 1 Exception..." );
+ try {
+ throw new MetaMatrixException(
+ new MetaMatrixException(
+ new Exception( "Non-chained exception" ),
+ "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 MetaMatrixExceptions..." );
+ try {
+ throw new MetaMatrixException(
+ new MetaMatrixException( 1001, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 MetaMatrixExceptions (1 a subclass)..." );
+ try {
+ throw new TestAppException(
+ new MetaMatrixException( 1001, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 exceptions (1 MetaMatrixException, 1 null)..." );
+ try {
+ throw new TestAppException(
+ new MetaMatrixException( null, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n1 MetaMatrixException..." );
+ try {
+ throw new MetaMatrixException( 1002, "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n5 MetaMatrixExceptions..." );
+ try {
+ MetaMatrixException root = new MetaMatrixException( 50, "Root" );
+ MetaMatrixException cur = root;
+ MetaMatrixException next;
+ for ( int i = 1; i <= 5; i++ ) {
+ next = new MetaMatrixException( 50+i, "Nested exception " + i );
+ cur.setChild( next );
+ cur = next;
+ }
+ throw root;
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n1 MetaMatrixException (InvocationTargetException)..." );
+ try {
+ throw new TestAppException(
+ new java.lang.reflect.InvocationTargetException(
+ new java.lang.IllegalArgumentException( "You can't do that!" ) ) );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+ }
+ */
+ } // END CLASS
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,23 @@
+package org.teiid.test.framework.exception;
+
+/**
+ * The TransactionRuntimeException is thrown outside of running a test.
+ * When this is thrown, the testing process should stop.
+ *
+ *
+ * @author vanhalbert
+ *
+ */
+public class TransactionRuntimeException extends RuntimeException{
+ /**
+ * @since
+ */
+ private static final long serialVersionUID = 1L;
+
+ public TransactionRuntimeException(Exception e){
+ super(e);
+ }
+ public TransactionRuntimeException(String msg){
+ super(msg);
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.query;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.datasource.DataStore;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+
+
+/**
+ * The AbstractQueryTransactionTest is the base implementation for the
+ * {@link TransactionQueryTestCase}. This provides the default logic for perform a testcase.
+ * The only method to implement in order to perform a basic, single datasource, test
+ * is the {@link #testCase()} method.
+ *
+ * AbstractQueryTransactionTest is the class that should be extended when a
+ * testcase is being created to validate certain behavior
+ *
+ * <br>
+ * The following methods are useful when writing validation logic because they provide
+ * a direct connection to the datasource that was used by the VDB. This enables data
+ * validation of expected behavior of Teiid.
+ * <li>{@link #getSource(String)}. </li>
+ * <li>{@link #getXASource(String)} </li>
+ *
+ * <br>
+ *
+ * @see QueryExecution for use when direct queries to the source are used to
+ * validate the results of the testcase.
+ *
+ */
+public abstract class AbstractQueryTransactionTest extends com.metamatrix.jdbc.api.AbstractQueryTest
+ implements TransactionQueryTestCase {
+
+ private static String initialized = null;
+
+ protected String testname = "NA";
+ protected int fetchSize = -1;
+ protected int queryTimeout = -1;
+
+ protected ConnectionStrategy connStrategy;
+
+ public AbstractQueryTransactionTest() {
+ super();
+ }
+
+ public AbstractQueryTransactionTest(String testname) {
+ super();
+ this.testname = testname;
+ }
+
+ public String getTestName() {
+ return this.testname;
+
+ }
+
+
+ @Override
+ public void setConnectionStrategy(ConnectionStrategy connStrategy) throws QueryTestFailedException {
+ this.connStrategy = connStrategy;
+
+ this.setConnection(connStrategy.getConnection());
+
+ }
+
+// @Override
+// protected void compareResults(BufferedReader resultReader,
+// BufferedReader expectedReader) throws IOException {
+// assertEquals(read(expectedReader, compareResultsCaseSensitive()), read(
+// resultReader, compareResultsCaseSensitive()));
+// }
+
+ @Override
+ protected void assignExecutionProperties(Statement stmt) {
+ if (stmt instanceof com.metamatrix.jdbc.api.Statement) {
+ com.metamatrix.jdbc.api.Statement statement = (com.metamatrix.jdbc.api.Statement) stmt;
+
+ Properties executionProperties = this.connStrategy.getEnvironment();
+ if (executionProperties != null) {
+ String txnautowrap = executionProperties
+ .getProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP);
+ if (txnautowrap != null) {
+ statement.setExecutionProperty(
+ CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP,
+ txnautowrap);
+
+
+// this.print("TransactionAutoWrap = " + txnautowrap);
+ }
+
+ String fetchSizeStr = executionProperties
+ .getProperty(CONNECTION_STRATEGY_PROPS.FETCH_SIZE);
+ if (fetchSizeStr != null) {
+ try {
+ fetchSize = Integer.parseInt(fetchSizeStr);
+
+ this.print("FetchSize = " + fetchSize);
+ } catch (NumberFormatException e) {
+ fetchSize = -1;
+ // this.print("Invalid fetch size value: " + fetchSizeStr
+ // + ", ignoring");
+ }
+ }
+
+ }
+
+
+
+ if (this.fetchSize > 0) {
+ try {
+ statement.setFetchSize(this.fetchSize);
+ } catch (SQLException e) {
+// this.print(e);
+ }
+ }
+
+ if (this.queryTimeout > 0) {
+ try {
+ statement.setQueryTimeout(this.queryTimeout);
+ } catch (SQLException e) {
+// this.print(e);
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * Override <code>setupDataSource</code> if there is different mechanism for
+ * setting up the datasources for the testcase
+ *
+ * @throws QueryTestFailedException
+ * @throws QueryTestFailedException
+ *
+ * @since
+ */
+ @Override
+ public void setup() throws QueryTestFailedException {
+
+ if (initialized == null || !initialized.equalsIgnoreCase(this.getClass().getSimpleName()) ) {
+ initialized = this.getClass().getSimpleName();
+ DataStore.initialize(connStrategy);
+
+ }
+
+ DataStore.setup(connStrategy);
+
+ }
+
+ /**
+ * The source connection must be asked from the connection strategy because only here
+ * is it known which model was mapped to which datasource.
+ * This is because each test could potentially use an include/exclude datasource option
+ * that could change the mappings between tests.
+ * @param identifier
+ * @return
+ * @throws QueryTestFailedException
+ */
+ public Connection getSource(String identifier)
+ throws QueryTestFailedException {
+
+ Connection conn = this.connStrategy.createDriverConnection(identifier);
+ // force autocommit back to true, just in case the last user didnt
+ try {
+ conn.setAutoCommit(true);
+ } catch (Exception sqle) {
+ throw new QueryTestFailedException(sqle);
+ }
+
+ return conn;
+
+ }
+
+ public XAConnection getXASource(String identifier)
+ throws QueryTestFailedException {
+
+ return this.connStrategy.createDataSourceConnection(identifier);
+
+ }
+
+ /**
+ * Implement testCase(), it is the entry point to the execution of the test.
+ *
+ * @throws Exception
+ *
+ * @since
+ */
+ public abstract void testCase() throws Exception;
+
+ /**
+ * Indicates what should be done when a failure occurs in
+ * {@link #testCase()}
+ *
+ * @return
+ *
+ * @since
+ */
+ public boolean rollbackAllways() {
+ return false;
+ }
+
+ /**
+ * Override <code>before</code> if there is behavior that needs to be
+ * performed prior to {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ public void before() {
+ }
+
+ /**
+ * Override <code>after</code> if there is behavior that needs to be
+ * performed after {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ public void after() {
+ }
+
+ /**
+ * At end of each test, perform any cleanup that your test requires. Note:
+ * Do not cleanup any connections by calling {@link ConnectionStrategy#shutdown()}.
+ * That is performed by the
+ * {@link TransactionContainer#runTransaction(TransactionQueryTestCase)} at the
+ * end of the test.
+ */
+ public void cleanup() {
+
+ }
+
+ @Override
+ public XAConnection getXAConnection() {
+ return null;
+ }
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,22 @@
+package org.teiid.test.framework.query;
+
+import java.sql.Connection;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+/**
+ * The QueryExecution class can be used to query the source directly. The intended use
+ * of this class is for validating results after the execution of a test case.
+ *
+ * @see AbstractQueryTransactionTest regarding creating a testcase to validate behavior.
+ * @author vanhalbert
+ *
+ */
+public class QueryExecution extends AbstractQueryTest {
+
+ public QueryExecution(Connection conn) {
+ super(conn);
+ }
+
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import javax.naming.InitialContext;
+import javax.transaction.UserTransaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+
+
+
+public class JNDITransaction extends TransactionContainer {
+ UserTransaction userTxn = null;
+
+
+ public JNDITransaction() {
+ super();
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ if (this.props.getProperty(CONNECTION_STRATEGY_PROPS.JNDINAME_USERTXN) == null) {
+ throw new TransactionRuntimeException("No JNDI name found for the User Transaction to look up in application server");
+ }
+
+ try {
+
+ // begin the transaction
+ InitialContext ctx = new InitialContext();
+ this.userTxn = (UserTransaction)ctx.lookup(this.props.getProperty(CONNECTION_STRATEGY_PROPS.JNDINAME_USERTXN));
+ this.userTxn.begin();
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ try {
+ if (this.userTxn != null) {
+ if (test.rollbackAllways()|| test.exceptionOccurred()) {
+ this.userTxn.rollback();
+ }
+ else {
+ this.userTxn.commit();
+ }
+ this.userTxn = null;
+ }
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+
+import java.sql.SQLException;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+
+/**
+ * A transaction which is user controlled.
+ */
+public class LocalTransaction extends TransactionContainer {
+
+ public LocalTransaction() {
+ super();
+ }
+ protected void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OFF);
+
+ try {
+ debug("Autocommit: " + this.connStrategy.getAutocommit());
+ test.getConnection().setAutoCommit(this.connStrategy.getAutocommit());
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ boolean exception = false;
+ try {
+ if (test.rollbackAllways()|| test.exceptionOccurred()) {
+ test.getConnection().rollback();
+
+ }
+ else {
+ test.getConnection().commit();
+ }
+ } catch (SQLException se) {
+ exception = true;
+ // if exception, try to trigger the rollback
+ try {
+ test.getConnection().rollback();
+ } catch (Exception e) {
+ // do nothing
+ }
+ throw new TransactionRuntimeException(se);
+
+
+ } finally {
+ // if an exception occurs and the autocommit is set to true - while doing a transaction
+ // will generate a new exception overriding the first exception
+ if (!exception) {
+ try {
+ test.getConnection().setAutoCommit(true);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = OFF
+ */
+public class OffWrapTransaction extends TransactionContainer {
+
+ public OffWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OFF);
+
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = ON
+ */
+public class OnWrapTransaction extends TransactionContainer {
+ public OnWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_ON);
+
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = Optimistic.
+ */
+public class OptimisticWrapTransaction extends TransactionContainer {
+ public OptimisticWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OPTIMISTIC);
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transaction type only is valid when
+ * AutoCommit = ON
+ * txnAutoWrap = PESSIMISTIC
+ */
+public class PessimisticWrapTransaction extends TransactionContainer {
+ public PessimisticWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_PESSIMISTIC);
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+
+
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import java.util.Random;
+
+import javax.transaction.xa.XAResource;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.xa.MMXid;
+
+public class StandaloneGlobalTransaction extends TransactionContainer {
+ private static Random RANDOM = new Random();
+ private MMXid xid;
+
+ public StandaloneGlobalTransaction() {
+ super();
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ try {
+ xid = createXid();
+ XAResource xaResource = this.getConnectionStrategy().getXAConnection().getXAResource();
+ // getXAConnection().getXAResource();
+ xaResource.setTransactionTimeout(120);
+ xaResource.start(xid, XAResource.TMNOFLAGS);
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ public static MMXid createXid() {
+ byte[] gid = new byte[10];
+ byte[] bid = new byte[10];
+ RANDOM.nextBytes(gid);
+ RANDOM.nextBytes(bid);
+ return new MMXid(0, gid, bid);
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ boolean delistSuccessful = false;
+ boolean commit = false;
+ try {
+ XAResource xaResource = this.getConnectionStrategy().getXAConnection().getXAResource();
+
+ xaResource.end(xid, XAResource.TMSUCCESS);
+
+ if (!test.exceptionExpected() && xaResource.prepare(xid) == XAResource.XA_OK) {
+ commit = true;
+ }
+ delistSuccessful = true;
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ } finally {
+ try {
+ if (!delistSuccessful || test.rollbackAllways()|| test.exceptionOccurred()) {
+ this.getConnectionStrategy().getXAConnection().getXAResource().rollback(xid);
+ //getXAConnection().getXAResource().rollback(xid);
+ }
+ else if (commit) {
+ this.getConnectionStrategy().getXAConnection().getXAResource().commit(xid, true);
+ }
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import java.util.Random;
+
+import javax.sql.XAConnection;
+import javax.transaction.xa.XAResource;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.xa.MMXid;
+
+public class XATransaction extends TransactionContainer {
+ private static Random RANDOM = new Random();
+ private MMXid xid;
+
+ public XATransaction() {
+ super();
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ try {
+ xid = createXid();
+ XAResource xaResource = getXAConnection().getXAResource();
+ xaResource.setTransactionTimeout(120);
+ xaResource.start(xid, XAResource.TMNOFLAGS);
+ debug("Start transaction using XID: " + xid.toString());
+
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ public static MMXid createXid() {
+ byte[] gid = new byte[10];
+ byte[] bid = new byte[10];
+ RANDOM.nextBytes(gid);
+ RANDOM.nextBytes(bid);
+ return new MMXid(0, gid, bid);
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ boolean delistSuccessful = false;
+ boolean commit = false;
+
+ XAResource xaResource = null;
+ boolean exception = false;
+ try {
+ xaResource = getXAConnection().getXAResource();
+
+ xaResource.end(xid, XAResource.TMSUCCESS);
+
+ if (!test.exceptionExpected() && xaResource.prepare(xid) == XAResource.XA_OK) {
+ commit = true;
+ }
+ delistSuccessful = true;
+ } catch (Exception e) {
+ exception = true;
+ throw new TransactionRuntimeException(e);
+ } finally {
+ try {
+ if (!delistSuccessful || test.rollbackAllways()|| test.exceptionOccurred()) {
+ xaResource.rollback(xid);
+ }
+ else if (commit) {
+ xaResource.commit(xid, true);
+ }
+ } catch (Exception e) {
+ if (!exception) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+ }
+ }
+
+
+ protected XAConnection getXAConnection() throws QueryTestFailedException {
+ return this.connStrategy.getXAConnection();
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,42 @@
+package org.teiid.test.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+
+public class PropUtils {
+
+
+
+ public static Properties loadProperties(String filename, Properties defaults) {
+ InputStream in = null;
+ Properties props = new Properties();
+ if (defaults != null) {
+ props.putAll(defaults);
+ }
+ try {
+ in = ConfigPropertyLoader.class.getResourceAsStream(filename);
+ if (in != null) {
+ Properties lprops = new Properties();
+ lprops.load(in);
+ props.putAll(lprops);
+
+ }
+ else {
+ throw new RuntimeException("Failed to load properties from file '"+filename+ "' configuration file");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading properties from file '"+filename+ "'" + e.getMessage());
+ } finally {
+ try {
+ in.close();
+ } catch(Exception e){
+
+ }
+ }
+
+ return props;
+ }
+}
Added: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * All rights reserved.
+ * This code is made available under the terms of the Eclipse Public
+ * License, version 1.0.
+ */
+
+package org.teiid.test.util;
+
+
+/**
+ * This is a common place to put String utility methods.
+ */
+public final class StringUtil {
+
+
+
+ public static String removeChars(final String value, final char[] chars) {
+ final StringBuffer result = new StringBuffer();
+ if (value != null && chars != null && chars.length > 0) {
+ final String removeChars = String.valueOf(chars);
+ for (int i = 0; i < value.length(); i++) {
+ final String character = value.substring(i, i + 1);
+ if (removeChars.indexOf(character) == -1) {
+ result.append(character);
+ }
+ }
+ } else {
+ result.append(value);
+ }
+ return result.toString();
+ }
+
+
+}
Added: branches/JCA/test-integration/db/src/main/resources/configuration.xml
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/configuration.xml (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/configuration.xml 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,458 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ConfigurationDocument>
+ <Header>
+ <ApplicationCreatedBy>Teiid</ApplicationCreatedBy>
+ <ApplicationVersionCreatedBy>6.0</ApplicationVersionCreatedBy>
+ <UserCreatedBy>Configuration</UserCreatedBy>
+ <ConfigurationVersion>6.0</ConfigurationVersion>
+ <MetaMatrixSystemVersion>6.0</MetaMatrixSystemVersion>
+ <Time>2009-03-20T12:23:53.919-06:00</Time>
+ </Header>
+ <Configuration Name="Next Startup" ComponentType="Configuration" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <Properties />
+ </Configuration>
+ <Services>
+ <Service Name="QueryService" ComponentType="QueryService" QueuedService="false" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <Properties>
+ <Property Name="metamatrix.service.essentialservice">false</Property>
+ <Property Name="ProcessPoolMaxThreads">64</Property>
+ <Property Name="ProcessPoolThreadTTL">120000</Property>
+ <Property Name="ServiceClassName">com.metamatrix.server.query.service.QueryService</Property>
+ <Property Name="ProcessorTimeslice">2000</Property>
+ <Property Name="MaxCodeTables">50</Property>
+ <Property Name="MaxCodeTableRecords">10000</Property>
+ <Property Name="MinFetchSize">100</Property>
+ <Property Name="MaxFetchSize">20000</Property>
+ <Property Name="ResultSetCacheEnabled">0</Property>
+ <Property Name="ResultSetCacheMaxSize">0</Property>
+ <Property Name="ResultSetCacheMaxAge">0</Property>
+ <Property Name="ResultSetCacheScope">vdb</Property>
+ <Property Name="MaxPlanCacheSize">100</Property>
+ </Properties>
+ </Service>
+ </Services>
+ <ComponentTypes>
+ <ComponentType Name="Service" ComponentTypeCode="1" Deployable="false" Deprecated="false" Monitorable="false" ParentComponentType="VM" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ServiceClassName" DisplayName="Service Class Name" ShortDescription="" PropertyType="String" IsModifiable="false" IsMasked="false" />
+ <PropertyDefinition Name="metamatrix.service.essentialservice" DisplayName="Essential Service" ShortDescription="Indicates if the service is essential to operation of the Integration Server" DefaultValue="false" PropertyType="Boolean" IsModifable="false" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="QueryService" ComponentTypeCode="1" Deployable="true" Deprecated="false" Monitorable="true" SuperComponentType="Service" ParentComponentType="Integration Server" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ </ComponentType>
+ <ComponentType Name="Configuration" ComponentTypeCode="0" Deployable="true" Deprecated="false" Monitorable="false" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ </ComponentType>
+ <!--
+ *************************************************************************************
+ Connector Type (This section gets filled by build process at kit building time)
+ *************************************************************************************
+ -->
+ <ComponentType Name="Connector" ComponentTypeCode="2" Deployable="false" Deprecated="false" Monitorable="true" SuperComponentType="Service" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.916-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.916-06:00">
+ <PropertyDefinition Name="SourceConnectionTestInterval" DisplayName="Data Source Test Connect Interval (seconds)" ShortDescription="How often (in seconds) to create test connections to the underlying datasource to see if it is available." DefaultValue="600" IsRequired="true" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClassPath" DisplayName="Class Path" ShortDescription="" />
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system)" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="UsePostDelegation" DisplayName="Use Separate Classloader" ShortDescription="Set to true to indicate that the connector classpath and connector type classpath entries should be loaded by a connector specific post-delegation class loader." PropertyType="Boolean" IsRequired="true" IsExpert="true" DefaultValue="false"/>
+ <PropertyDefinition Name="ExceptionOnMaxRows" DisplayName="Exception on Exceeding Max Rows" ShortDescription="Indicates if an Exception should be thrown if the specified value for Maximum Result Rows is exceeded; else no exception and no more than the maximum will be returned" DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="metamatrix.service.essentialservice" DisplayName="Essential Service" ShortDescription="Indicates if the service is essential to operation of the Integration Server" DefaultValue="false" IsRequired="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="ServiceMonitoringEnabled" DisplayName="Data Source Monitoring Enabled" ShortDescription="Whether to monitor the underlying data source to see if it is available." DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="Immutable" DisplayName="Is Immutable" ShortDescription="True if the source never changes." DefaultValue="false" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorMaxConnections" DisplayName="Maximum Concurrent Connections" ShortDescription="" DefaultValue="20" IsRequired="true" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" IsRequired="true" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="ServiceClassName" DisplayName="Service Class Name" ShortDescription="" DefaultValue="com.metamatrix.server.connector.service.ConnectorService" IsRequired="true" IsModifiable="false" />
+ <PropertyDefinition Name="MaxResultRows" DisplayName="Maximum Result Rows" ShortDescription="" DefaultValue="10000" IsRequired="true" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="SynchWorkers" DisplayName="Synchronous Workers" ShortDescription="Whether worker threads will be bound to connections. Asynch connectors should set this value to false." DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="ResultSetCacheEnabled" DisplayName="ResultSet Cache Enabled" ShortDescription="" DefaultValue="false" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="ResultSetCacheMaxSize" DisplayName="ResultSet Cache Maximum Size (megabytes)" ShortDescription="" DefaultValue="20" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="ResultSetCacheMaxAge" DisplayName="ResultSet Cache Maximum Age (milliseconds)" ShortDescription="" DefaultValue="3600000" PropertyType="Long" IsExpert="true" />
+ <PropertyDefinition Name="ResultSetCacheScope" DisplayName="ResultSet Cache Scope" ShortDescription="" DefaultValue="vdb" IsExpert="true">
+ <AllowedValue>vdb</AllowedValue>
+ <AllowedValue>session</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Set to true if this is an XA Connector" DefaultValue="false" IsRequired="true" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="ConnectionPoolEnabled" DisplayName="Connection Pool Enabled" ShortDescription="Enable the use of connection pooling with this connector." DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="UseCredentialMap" DisplayName="Requires Credential Map" ShortDescription="Set to true if this connector requires credentials to be passed via a credential map." DefaultValue="false" IsRequired="true" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="AdminConnectionsAllowed" DisplayName="Admin Connections Allowed" ShortDescription="Whether admin connections without an execution context are allowed." DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="com.metamatrix.data.pool.max_connections_for_each_id" DisplayName="Pool Maximum Connections for Each ID" ShortDescription="Set the maximum number of connections for each connector ID for the connection pool" DefaultValue="20" IsRequired="true" PropertyType="Integer" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="com.metamatrix.data.pool.live_and_unused_time" DisplayName="Pool Connection Idle Time (seconds)" ShortDescription="Set the idle time of the connection before it should be closed if pool shrinking is enabled" DefaultValue="60" PropertyType="Integer" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="com.metamatrix.data.pool.wait_for_source_time" DisplayName="Pool Connection Waiting Time (milliseconds)" ShortDescription="Set the time to wait if the connection is not available" DefaultValue="120000" PropertyType="Integer" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="com.metamatrix.data.pool.cleaning_interval" DisplayName="Pool cleaning Interval (seconds)" ShortDescription="Set the interval to cleaning the pool" DefaultValue="60" PropertyType="Integer" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="com.metamatrix.data.pool.enable_shrinking" DisplayName="Enable Pool Shrinking" ShortDescription="Set whether to enable the pool shrinking" DefaultValue="false" PropertyType="Boolean" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="supportsCompareCriteriaEquals" DisplayName="supportsCompareCriteriaEquals" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsCompareCriteriaOrdered" DisplayName="supportsCompareCriteriaOrdered" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsInCriteria" DisplayName="supportsInCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="getMaxInCriteriaSize" DisplayName="getMaxInCriteriaSize" ShortDescription="" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="supportsIsNullCriteria" DisplayName="supportsIsNullCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsLikeCriteria" DisplayName="supportsLikeCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsLikeCriteriaEscapeCharacter" DisplayName="supportsLikeCriteriaEscapeCharacter" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsNotCriteria" DisplayName="supportsNotCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsOrCriteria" DisplayName="supportsOrCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsBetweenCriteria" DisplayName="supportsBetweenCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsSelectDistinct" DisplayName="supportsSelectDistinct" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsSelectExpression" DisplayName="supportsSelectExpression" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsInnerJoins" DisplayName="supportsInnerJoins" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAliasedGroup" DisplayName="supportsAliasedGroup" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsSelfJoins" DisplayName="supportsSelfJoins" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsOuterJoins" DisplayName="supportsOuterJoins" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsFullOuterJoins" DisplayName="supportsFullOuterJoins" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="getMaxFromGroups" DisplayName="getMaxFromGroups" ShortDescription="" PropertyType="Integer" IsExpert="true" />
+ <PropertyDefinition Name="getSupportedJoinCriteria" DisplayName="getSupportedJoinCriteria" ShortDescription="" PropertyType="String" IsExpert="true" >
+ <AllowedValue>ANY</AllowedValue>
+ <AllowedValue>THETA</AllowedValue>
+ <AllowedValue>EQUI</AllowedValue>
+ <AllowedValue>KEY</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="supportsOrderBy" DisplayName="supportsOrderBy" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsGroupBy" DisplayName="supportsGroupBy" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsFunctionsInGroupBy" DisplayName="supportsFunctionsInGroupBy" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsHaving" DisplayName="supportsHaving" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesSum" DisplayName="supportsAggregatesSum" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesAvg" DisplayName="supportsAggregatesAvg" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesMin" DisplayName="supportsAggregatesMin" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesMax" DisplayName="supportsAggregatesMax" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesCount" DisplayName="supportsAggregatesCount" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesCountStar" DisplayName="supportsAggregatesCountStar" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsAggregatesDistinct" DisplayName="supportsAggregatesDistinct" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsInCriteriaSubquery" DisplayName="supportsInCriteriaSubquery" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsExistsCriteria" DisplayName="supportsExistsCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsQuantifiedCompareCriteriaSome" DisplayName="supportsQuantifiedCompareCriteriaSome" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsQuantifiedCompareCriteriaAll" DisplayName="supportsQuantifiedCompareCriteriaAll" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsScalarSubqueries" DisplayName="supportsScalarSubqueries" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsCorrelatedSubqueries" DisplayName="supportsCorrelatedSubqueries" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsCaseExpressions" DisplayName="supportsCaseExpressions" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsSearchedCaseExpressions" DisplayName="supportsSearchedCaseExpressions" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="getSupportedFunctions" DisplayName="getSupportedFunctions" ShortDescription="" PropertyType="string" IsExpert="true" />
+ <PropertyDefinition Name="supportsInlineViews" DisplayName="supportsInlineViews" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsSetQueryOrderBy" DisplayName="supportsSetQueryOrderBy" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsUnions" DisplayName="supportsUnions" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsIntersect" DisplayName="supportsIntersect" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsExcept" DisplayName="supportsExcept" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="requiresCriteria" DisplayName="requiresCriteria" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="useAnsiJoin" DisplayName="useAnsiJoin" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsBatchedUpdates" DisplayName="supportsBatchedUpdates" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsBulkUpdate" DisplayName="supportsBulkUpdate" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsInsertWithQueryExpression" DisplayName="supportsInsertWithQueryExpression" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsRowLimit" DisplayName="supportsRowLimit" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="supportsRowOffset" DisplayName="supportsRowOffset" ShortDescription="" PropertyType="Boolean" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.952-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.952-06:00">
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:" IsRequired="true" PropertyType="String"/>
+ <PropertyDefinition Name="User" DisplayName="User Name" ShortDescription="" />
+ <PropertyDefinition Name="Password" DisplayName="Password" ShortDescription="" IsMasked="true" />
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-jdbc-6.2.0-SNAPSHOT.jar;" IsModifiable="false" />
+ <PropertyDefinition Name="UseBindVariables" DisplayName="Use prepared statements and bind variables" ShortDescription="" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="ExtensionCapabilityClass" DisplayName="Extension Capability Class" ShortDescription="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.JDBCConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="DatabaseTimeZone" DisplayName="Database time zone" ShortDescription="Time zone of the database, if different than Integration Server" IsExpert="true" />
+ <PropertyDefinition Name="TransactionIsolationLevel" DisplayName="Transaction Isolation Level" ShortDescription="Set the data source transaction isolation level" IsExpert="true" >
+ <AllowedValue>TRANSACTION_READ_UNCOMMITTED</AllowedValue>
+ <AllowedValue>TRANSACTION_READ_COMMITTED</AllowedValue>
+ <AllowedValue>TRANSACTION_SERIALIZABLE</AllowedValue>
+ <AllowedValue>TRANSACTION_NONE</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.translator.Translator" IsExpert="true" />
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" IsRequired="true" />
+ <PropertyDefinition Name="TrimStrings" DisplayName="Trim string flag" ShortDescription="Right Trim fixed character types returned as Strings" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="UseCommentsInSourceQuery" DisplayName="Use informational comments in Source Queries" ShortDescription="This will embed /*comment*/ style comment with session/request id in source SQL query for informational purposes" DefaultValue="false" PropertyType="Boolean" IsExpert="true"/>
+ </ComponentType>
+ <ComponentType Name="Oracle Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="oracle.jdbc.driver.OracleDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:oracle:thin:@<host>:1521:<sid>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.oracle.OracleSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="Oracle XA Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="oracle.jdbc.xa.client.OracleXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:oracle:thin:@<host>:1521:<sid>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.oracle.OracleSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="DB2 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.ibm.db2.jcc.DB2Driver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:db2://<server>:50000/<db-name>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.db2.DB2SQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="DB2 XA Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.ibm.db2.jcc.DB2XADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="50000" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DriverType" DisplayName="Driver Type" ShortDescription="" DefaultValue="4" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.db2.DB2SQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="SQL Server Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.microsoft.sqlserver.jdbc.SQLServerDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:sqlserver://<host>:1433;databaseName=<db-name>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.sqlserver.SqlServerSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="SQL Server XA Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="1433" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.sqlserver.SqlServerSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="MySQL JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.mysql.jdbc.Driver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mysql://<host>:3306/<databaseName>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.mysql.MySQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="MySQL 5 JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.mysql.jdbc.Driver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mysql://<host>:3306/<databaseName>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.mysql.MySQL5Translator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ </ComponentType>
+ <ComponentType Name="MySQL JDBC XA Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="3306" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.mysql.MySQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="MySQL 5 JDBC XA Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="3306" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.mysql.MySQL5Translator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="PostgreSQL JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="org.postgresql.Driver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:postgresql://<host>:5432/<databaseName>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.postgresql.PostgreSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseVersion" DisplayName="Database Version" ShortDescription="PostgreSQL Version i.e. 8.3" DefaultValue="8.0" PropertyType="String" />
+ </ComponentType>
+ <ComponentType Name="PostgreSQL XA JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="org.postgresql.xa.PGXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="5432" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.postgresql.PostgreSQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ <PropertyDefinition Name="DatabaseVersion" DisplayName="Database Version" ShortDescription="PostgreSQL Version i.e. 8.3" DefaultValue="8.0" PropertyType="String" />
+ </ComponentType>
+ <ComponentType Name="Apache Derby Embedded Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="org.apache.derby.jdbc.EmbeddedDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:derby:<databaseName>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.derby.DerbySQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseVersion" DisplayName="Database Version" ShortDescription="Derby Version i.e. 10.3" DefaultValue="10.1" PropertyType="String" />
+ </ComponentType>
+ <ComponentType Name="Apache Derby Network Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="org.apache.derby.jdbc.ClientDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:derby://localhost:1527/<path/to/db>" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.derby.DerbySQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseVersion" DisplayName="Database Version" ShortDescription="Derby Version i.e. 10.3" DefaultValue="10.1" PropertyType="String" />
+ </ComponentType>
+ <ComponentType Name="Apache Derby XA Network Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="org.apache.derby.jdbc.ClientXADataSource" IsRequired="true" />
+ <PropertyDefinition Name="PortNumber" DisplayName="Port Number" DefaultValue="1527" ShortDescription="" IsRequired="true" PropertyType="Integer" IsMasked="false" />
+ <PropertyDefinition Name="ServerName" DisplayName="Server Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="DatabaseName" DisplayName="Database Name" ShortDescription="" IsRequired="true" PropertyType="String" IsMasked="false" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.derby.DerbySQLTranslator" PropertyType="String" IsExpert="true" IsMasked="false" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="Teiid 6 JDBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbc.MMDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:metamatrix:<vdbName>@mm://<host>:<port>" IsRequired="true" />
+ </ComponentType>
+ <ComponentType Name="JDBC ODBC Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="sun.jdbc.odbc.JdbcOdbcDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:odbc:<data-source-name>[;UID=<xxx> ;PWD=<xxx>]" IsRequired="true" />
+ </ComponentType>
+ <ComponentType Name="MS Access Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" CreatedBy="ConfigurationStartup">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="sun.jdbc.odbc.JdbcOdbcDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=<data-source-name>" IsRequired="true" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.access.AccessSQLTranslator" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="MS Excel Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2006-02-08T11:02:36.029-06:00" CreatedBy="ConfigurationStartup" CreationDate="2006-02-08T11:02:36.029-06:00">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="sun.jdbc.odbc.JdbcOdbcDriver" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:odbc:Driver={MicroSoft Excel Driver (*.xls)};DBQ=<filePathToExcelFile>" IsRequired="true" />
+ </ComponentType>
+
+ <ComponentType Name="Datadirect DB2 8 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.928-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.928-06:00">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbcx.db2.DB2DataSource" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mmx:db2://<host>:50000;DatabaseName=<databasename>;CollectionID=<collectionid>;PackageName=<packagename>" IsRequired="true" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.db2.DB2SQLTranslator" IsExpert="true" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="Datadirect Oracle 9 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.923-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.923-06:00">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbcx.oracle.OracleDataSource" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mmx:oracle://<host>:1521;SID=<sid>" IsRequired="true" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.oracle.OracleSQLTranslator" IsExpert="true" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="Datadirect SQL Server 2003 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.935-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.935-06:00">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbcx.sqlserver.SQLServerDataSource" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mmx:sqlserver://<host>:1433;DatabaseName=<databasename>" IsRequired="true" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.sqlserver.SqlServerSQLTranslator" IsExpert="true" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ </ComponentType>
+ <ComponentType Name="Datadirect Sybase 12 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.930-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.930-06:00">
+ <PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbcx.sybase.SybaseDataSource" IsRequired="true" />
+ <PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mmx:sybase://<host>:5000;DatabaseName=<databasename>" IsRequired="true" />
+ <PropertyDefinition Name="ExtensionTranslationClass" DisplayName="Extension SQL Translation Class" ShortDescription="" DefaultValue="org.teiid.connector.jdbc.sybase.SybaseSQLTranslator" IsExpert="true" />
+ <PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
+ <PropertyDefinition Name="SetCriteriaBatchSize" DisplayName="Max Values in IN Predicate" ShortDescription="Max number of values in an IN Predicate. Must be >= 0." DefaultValue="250" PropertyType="Integer" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="LDAP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.946-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.946-06:00">
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-ldap-6.2.0-SNAPSHOT.jar;" IsModifiable="false" />
+ <PropertyDefinition Name="SearchDefaultBaseDN" DisplayName="Default Search Base DN" ShortDescription="Default Base DN for LDAP Searches" IsExpert="true" />
+ <PropertyDefinition Name="LdapAdminUserDN" DisplayName="Ldap Admin User DN" ShortDescription="User DN for the LDAP admin account." DefaultValue="cn=<>,ou=<>,dc=<>" IsRequired="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.ldap.LDAPConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="LdapAdminUserPassword" DisplayName="Ldap Admin Password" ShortDescription="Password of the LDAP admin user account." IsRequired="true" IsMasked="true" />
+ <PropertyDefinition Name="SearchDefaultScope" DisplayName="Default Search Scope" ShortDescription="Default Scope for LDAP Searches" DefaultValue="SUBTREE_SCOPE" IsRequired="true">
+ <AllowedValue>OBJECT_SCOPE</AllowedValue>
+ <AllowedValue>ONELEVEL_SCOPE</AllowedValue>
+ <AllowedValue>SUBTREE_SCOPE</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="RestrictToObjectClass" DisplayName="Restrict Searches To Named Object Class" ShortDescription="Restrict Searches to objectClass named in the Name field for a table" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="LdapTxnTimeoutInMillis" DisplayName="Ldap Transaction Timeout (ms)" ShortDescription="Timeout value for LDAP searches. Defaults to TCP timeout value." />
+ <PropertyDefinition Name="LdapUrl" DisplayName="Ldap URL" ShortDescription="Ldap URL of the server, including port number." DefaultValue="ldap://<ldapServer>:<389>" IsRequired="true" />
+ </ComponentType>
+ <ComponentType Name="Loopback Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.945-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.945-06:00">
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-loopback-6.2.0-SNAPSHOT.jar;" IsModifiable="false" />
+ <PropertyDefinition Name="CapabilitiesClass" DisplayName="Capabilities Class" ShortDescription="" DefaultValue="com.metamatrix.connector.loopback.LoopbackCapabilities" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="WaitTime" DisplayName="Max Random Wait Time" ShortDescription="" DefaultValue="0" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.loopback.LoopbackConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="RowCount" DisplayName="Rows Per Query" ShortDescription="" DefaultValue="1" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ </ComponentType>
+ <ComponentType Name="Salesforce Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.916-06:00" CreationDate="2008-10-31T10:26:19.916-06:00">
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-salesforce-6.2.0-SNAPSHOT.jar;extensionjar:commons-codec-1.2.jar;extensionjar:commons-discovery-0.2.jar;extensionjar:commons-httpclient-3.0.1.jar;extensionjar:xmlsec-1.3.0.jar;extensionjar:axis-1.3.jar;extensionjar:axis-jaxrpc-1.3.jar;extensionjar:axis-saaj-1.2.jar;extensionjar:axis-schema-1.3.jar;extensionjar:commons-discovery-0.2.jar;extensionjar:jms-1.1.jar;extensionjar:jaxen-1.1.1.jar;extensionjar:nux-1.6.jar;extensionjar:opensaml-1.1b.jar;extensionjar:salesforce-api-6.2.0-SNAPSHOT.jar;extensionjar:jetty-6.1.9.jar;extensionjar:jetty-util-6.1.9.jar;extensionjar:servlet-api-2.5-6.1.9.jar;extensionjar:wsdl4j-1.5.1.jar;extensionjar:wss4j-1.5.0.jar;extensionjar:xalan-2.7.0.jar;extensionjar:xom-1.2.jar" IsModifiable="false" />
+ <PropertyDefinition Name="UsePostDelegation" DisplayName="Use Separate Classloader" ShortDescription="Set to true to indicate that the connector classpath and connector type classpath entries should be loaded by a connector specific post-delegation class loader." PropertyType="Boolean" IsRequired="true" IsExpert="true" DefaultValue="true"/>
+ <PropertyDefinition Name="username" DisplayName="User Name" ShortDescription="Name value for Salesforce authentication" DefaultValue="" IsRequired="true" />
+ <PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.ConnectorState" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.Connector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="password" DisplayName="Password" ShortDescription="Password value for Salesforce authentication" DefaultValue="" IsRequired="true" IsMasked="true" />
+ <PropertyDefinition Name="URL" DisplayName="Salesforce URL" ShortDescription="URL for connecting to Salesforce" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.salesforce.SalesforceCapabilities" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="Text File Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.945-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.945-06:00">
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-text-6.2.0-SNAPSHOT.jar;" IsModifiable="false" />
+ <PropertyDefinition Name="PartialStartupAllowed" DisplayName="Partial Startup Allowed" ShortDescription="" DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="DescriptorFile" DisplayName="Text File Descriptor" ShortDescription="" IsRequired="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.text.TextConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="EnforceColumnCount" DisplayName="Enforce Column Count" ShortDescription="This forces the number of columns in text file to match what was modeled" DefaultValue="false" PropertyType="Boolean" />
+ <PropertyDefinition Name="DateResultFormatsDelimiter" DisplayName="Date Result Formats Delimiter" ShortDescription="" IsExpert="true" />
+ <PropertyDefinition Name="DateResultFormats" DisplayName="Date Result Formats" ShortDescription="" IsExpert="true" />
+ <PropertyDefinition Name="Immutable" DisplayName="Is Immutable" ShortDescription="True if the source never changes." DefaultValue="true" IsRequired="true" PropertyType="Boolean" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="XML Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.917-06:00" CreationDate="2008-10-31T10:26:19.917-06:00">
+ <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-xml-6.2.0-SNAPSHOT.jar;extensionjar:commons-codec-1.2.jar;extensionjar:commons-discovery-0.2.jar;extensionjar:commons-httpclient-3.0.1.jar;extensionjar:xmlsec-1.3.0.jar;extensionjar:axis-1.3.jar;extensionjar:axis-jaxrpc-1.3.jar;extensionjar:axis-saaj-1.2.jar;extensionjar:axis-schema-1.3.jar;extensionjar:commons-discovery-0.2.jar;extensionjar:jms-1.1.jar;extensionjar:jaxen-1.1.1.jar;extensionjar:nux-1.6.jar;extensionjar:opensaml-1.1b.jar;extensionjar:jetty-6.1.9.jar;extensionjar:jetty-util-6.1.9.jar;extensionjar:servlet-api-2.5-6.1.9.jar;extensionjar:wsdl4j-1.5.1.jar;extensionjar:wss4j-1.5.0.jar;extensionjar:xalan-2.7.0.jar;extensionjar:xom-1.2.jar" IsModifiable="false"/>
+ <PropertyDefinition Name="UsePostDelegation" DisplayName="Use Separate Classloader" ShortDescription="Set to true to indicate that the connector classpath and connector type classpath entries should be loaded by a connector specific post-delegation class loader." PropertyType="Boolean" IsRequired="true" IsExpert="true" DefaultValue="true"/>
+ </ComponentType>
+
+ <ComponentType Name="XML File Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="XML Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.917-06:00" CreationDate="2008-10-31T10:26:19.917-06:00">
+ <PropertyDefinition Name="CharacterEncodingScheme" DisplayName="File Encoding Used" ShortDescription="A character-encoding scheme is a mapping between a coded character set and a set of octet (eight-bit byte) sequences. Some samples are UTF-8,ISO-8859-1,UTF-16)" DefaultValue="ISO-8859-1" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xmlsource.XMLSourceConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="ConnectionType" DisplayName="Type Of XML Connection" ShortDescription="Connection type used to get the XML data" DefaultValue="com.metamatrix.connector.xmlsource.file.FileConnection" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="DirectoryLocation" DisplayName="XML File(s) Directory Location" ShortDescription="" DefaultValue="" IsRequired="true" />
+ </ComponentType>
+ <ComponentType Name="XML SOAP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="XML Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.917-06:00" CreationDate="2008-10-31T10:26:19.917-06:00">
+ <PropertyDefinition Name="AuthPassword" DisplayName="Authentication User Password" ShortDescription="Password value for authentication" DefaultValue="" IsExpert="true" IsMasked="true" />
+ <PropertyDefinition Name="SAMLPropertyFile" DisplayName="SAML Property File (only required when SAML profile used)" ShortDescription="SAML Security property file (saml.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="wsdl" DisplayName="WSDL File (URL)" ShortDescription="URL to Web Service Definition File" DefaultValue="" IsRequired="true" />
+ <PropertyDefinition Name="AuthUserName" DisplayName="Authentication User Name" ShortDescription="Name value for authentication" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="WSSecurityType" DisplayName="WS-Security Type(UsernameToken, SAML..)" ShortDescription="Type of WS-Security to be used; Combinations of multiple security types can be used with a space in-between. Allowed types are: (UsernameToken, UsernameToken-Digest, SAMLTokenUnsigned, SAMLTokenSigned, Signature, Timestamp, Encrypt)" DefaultValue="" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xmlsource.XMLSourceConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="EncryptUserName" DisplayName="Encrypt UserName (only if Encrypt profile used)" ShortDescription="The username to be used in the encryption; if blank uses auth username" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="EndPoint" DisplayName="Alternate End Point" ShortDescription="An alternate service endpoint other than one specified in WSDL, to execute the service" DefaultValue="" />
+ <PropertyDefinition Name="SecurityType" DisplayName="WebService Security Used(None, HTTPBasic, WS-Security)" ShortDescription="Type of Authentication to used with the web service; If WS-Secuirty is being used, then WS-Secuirty type must be defined" DefaultValue="None" IsRequired="true" />
+ <PropertyDefinition Name="CryptoPropertyFile" DisplayName="User Crypto Property File (If SAML or Signature profile used)" ShortDescription="The file defines properties of cryptography;defines the certificates;(crypto.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectionType" DisplayName="Type Of XML Connection" ShortDescription="Connection type used to get the XML data" DefaultValue="com.metamatrix.connector.xmlsource.soap.SoapConnection" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="EncryptPropertyFile" DisplayName="Encrypt crypto property file (only if Encrypt profile used)" ShortDescription="The file defines properties of cryptography for encryption of the message;(crypto.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="TrustType" DisplayName="Trust Type:(DirectReference or IssuerSerial)" ShortDescription="Only required for Signature and Signed SAML; The issuer-serial method presumes that all trusted users of the service are known to the service and have pre-registered their certificate chains before using the service. The direct-reference method presumes that the service operator trusts all users with certificates issued by a trusted CA." DefaultValue="DirectReference" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="XML-Relational File Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="XML Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.918-06:00" CreationDate="2008-10-31T10:26:19.918-06:00">
+ <PropertyDefinition Name="FilePath" DisplayName="File Path" ShortDescription="" IsRequired="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="CacheEnabled" DisplayName="Enable Document Caching" ShortDescription="" DefaultValue="false" IsRequired="true" PropertyType="Boolean" />
+ <PropertyDefinition Name="SaxFilterProviderClass" DisplayName="XML Filter Provider" ShortDescription="The class the provides extended XML Filters" DefaultValue="com.metamatrix.connector.xml.base.NoExtendedFilters" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.base.XMLConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.file.FileConnectorState" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="LogRequestResponseDocs" DisplayName="Log XML Request and Response Documents" ShortDescription="Write the request and response documents to the log at Info level" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="InputStreamFilterClass" DisplayName="Input Stream Filter Class" ShortDescription="The class to use to preprocess raw XML input stream" DefaultValue="com.metamatrix.connector.xml.base.PluggableInputStreamFilterImpl" IsExpert="true" />
+ <PropertyDefinition Name="FileName" DisplayName="File Name" ShortDescription="" DefaultValue="" />
+ <PropertyDefinition Name="QueryPreprocessorClass" DisplayName="Query Preprocessor Class" ShortDescription="The class to use to preprocess the IQuery" DefaultValue="com.metamatrix.connector.xml.base.NoQueryPreprocessing" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.xml.base.XMLCapabilities" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="XML-Relational HTTP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="XML Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.920-06:00" CreationDate="2008-10-31T10:26:19.921-06:00">
+ <PropertyDefinition Name="SaxFilterProviderClass" DisplayName="XML Filter Provider" ShortDescription="The class the provides extended XML Filters" DefaultValue="com.metamatrix.connector.xml.base.NoExtendedFilters" IsExpert="true" />
+ <PropertyDefinition Name="XMLParmName" DisplayName="XML Parameter Name" ShortDescription="" />
+ <PropertyDefinition Name="RequestTimeout" DisplayName="Request Timeout (in Milliseconds)" ShortDescription="" DefaultValue="10000" IsRequired="true" PropertyType="Integer" />
+ <PropertyDefinition Name="Authenticate" DisplayName="Authentication Required" ShortDescription="" DefaultValue="false" PropertyType="Boolean" IsModifiable="true" />
+ <PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.http.HTTPConnectorState" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="HttpBasicAuthPassword" DisplayName="HTTP Basic Authentication Password" ShortDescription="Password value for HTTP basic authentication" DefaultValue="" IsExpert="true" IsMasked="true" />
+ <PropertyDefinition Name="AccessMethod" DisplayName="Access Method" ShortDescription="" DefaultValue="get" IsRequired="true">
+ <AllowedValue>get</AllowedValue>
+ <AllowedValue>post</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="ProxyUri" DisplayName="Proxy Server URI" ShortDescription="The URI of the proxy server" DefaultValue="" />
+ <PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.xml.base.XMLCapabilities" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="HttpBasicAuthUserName" DisplayName="HTTP Basic Authentication Name" ShortDescription="Name value for HTTP basic authentication" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.base.XMLConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="Uri" DisplayName="Server URI" ShortDescription="The URI of the HTTP source" IsRequired="true" />
+ <PropertyDefinition Name="UseHttpBasic" DisplayName="Use HTTP Basic authentication" ShortDescription="Use basic HTTP Authentication" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="LogRequestResponseDocs" DisplayName="Log XML Request and Response Documents" ShortDescription="Write the request and response documents to the log at Info level" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="TrustDeserializerClass" DisplayName="Trust Deserializer Class" ShortDescription="The class to use to process trusted payloads and execution payloads" DefaultValue="com.metamatrix.connector.xml.http.DefaultTrustDeserializer" IsExpert="true" />
+ <PropertyDefinition Name="ParameterMethod" DisplayName="Parameter Method" ShortDescription="" DefaultValue="None" IsRequired="true">
+ <AllowedValue>None</AllowedValue>
+ <AllowedValue>Name/Value</AllowedValue>
+ <AllowedValue>XMLRequest</AllowedValue>
+ <AllowedValue>XMLInQueryString</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="InputStreamFilterClass" DisplayName="Input Stream Filter Class" ShortDescription="The class to use to preprocess raw XML input stream" DefaultValue="com.metamatrix.connector.xml.base.PluggableInputStreamFilterImpl" IsExpert="true" />
+ <PropertyDefinition Name="HostnameVerifier" DisplayName="Hostname Verifier" ShortDescription="Class implementing javax.net.ssl.HostnameVerifier. Used to implement a hostname mismatch workaround." IsExpert="true" />
+ <PropertyDefinition Name="QueryPreprocessorClass" DisplayName="Query Preprocessor Class" ShortDescription="The class to use to preprocess the IQuery" DefaultValue="com.metamatrix.connector.xml.base.NoQueryPreprocessing" IsExpert="true" />
+ </ComponentType>
+ <ComponentType Name="XML-Relational SOAP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="XML Connector" ParentComponentType="Connectors" LastChangedDate="2008-10-31T10:26:19.919-06:00" CreationDate="2008-10-31T10:26:19.919-06:00">
+ <PropertyDefinition Name="AuthPassword" DisplayName="Authentication User Password" ShortDescription="Password value for authentication" DefaultValue="" IsExpert="true" IsMasked="true" />
+ <PropertyDefinition Name="SaxFilterProviderClass" DisplayName="XML Filter Provider" ShortDescription="The class the provides extended XML Filters" DefaultValue="com.metamatrix.connector.xml.base.NoExtendedFilters" IsExpert="true" />
+ <PropertyDefinition Name="AuthUserName" DisplayName="Authentication User Name" ShortDescription="Name value for authentication" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="WSSecurityType" DisplayName="WS-Security Type(UsernameToken, SAML..)" ShortDescription="Type of WS-Security to be used; Combinations of multiple security types can be used with a space in-between. Allowed types are: (UsernameToken, UsernameToken-Digest, SAMLTokenUnsigned, SAMLTokenSigned, Signature, Timestamp, Encrypt)" DefaultValue="" />
+ <PropertyDefinition Name="XMLParmName" DisplayName="XML Parameter Name" ShortDescription="" DefaultValue="" IsModifiable="false" />
+ <PropertyDefinition Name="EncryptUserName" DisplayName="Encrypt UserName (only if Encrypt profile used)" ShortDescription="The username to be used in the encryption; if blank uses auth username" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ExceptionOnSOAPFault" DisplayName="Exception on SOAP Fault" ShortDescription="Throw connector exception when SOAP fault is returned from source." DefaultValue="true" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="RequestTimeout" DisplayName="Request Timeout (in Milliseconds)" ShortDescription="" DefaultValue="10000" IsRequired="true" PropertyType="Integer" />
+ <PropertyDefinition Name="CryptoPropertyFile" DisplayName="User Crypto Property File (If SAML or Signature profile used)" ShortDescription="The file defines properties of cryptography;defines the certificates;(crypto.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.soap.SOAPConnectorState" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="SOAPAction" DisplayName="SOAP-Action" ShortDescription="Value for SOAP-Action header" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="AccessMethod" DisplayName="Access Method (Get, Post)" ShortDescription="" DefaultValue="post" IsModifiable="false">
+ <AllowedValue>get</AllowedValue>
+ <AllowedValue>post</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="ProxyUri" DisplayName="Proxy Server URI" ShortDescription="The URI of the proxy server" DefaultValue="" />
+ <PropertyDefinition Name="EncryptPropertyFile" DisplayName="Encrypt crypto property file (only if Encrypt profile used)" ShortDescription="The file defines properties of cryptography for encryption of the message;(crypto.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.xml.base.XMLCapabilities" IsExpert="true" />
+ <PropertyDefinition Name="SAMLPropertyFile" DisplayName="SAML Property File (only required when SAML profile used)" ShortDescription="SAML Security property file (saml.properties)" DefaultValue="" IsExpert="true" />
+ <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
+ <PropertyDefinition Name="EncodingStyle" DisplayName="Encoding Style (RPC - Encoded, RPC - Literal, Document - Literal, Document - Encoded)" ShortDescription="Encoding Style" DefaultValue="Document - Literal" IsRequired="true">
+ <AllowedValue>RPC - Encoded</AllowedValue>
+ <AllowedValue>RPC - Literal</AllowedValue>
+ <AllowedValue>Document - Literal</AllowedValue>
+ <AllowedValue>Document - Encoded</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.xml.base.XMLConnector" IsRequired="true" IsExpert="true" />
+ <PropertyDefinition Name="Uri" DisplayName="Server URI" ShortDescription="The URI of the HTTP source" IsRequired="true" />
+ <PropertyDefinition Name="SecurityType" DisplayName="WebService Security Used(None, HTTPBasic, WS-Security)" ShortDescription="Type of Authentication to used with the web service; If WS-Secuirty is being used, then WS-Secuirty type must be defined" DefaultValue="None" IsRequired="true" />
+ <PropertyDefinition Name="LogRequestResponseDocs" DisplayName="Log XML Request and Response Documents" ShortDescription="Write the request and response documents to the log at Info level" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
+ <PropertyDefinition Name="TrustDeserializerClass" DisplayName="Trust Deserializer Class" ShortDescription="The class to use to process trusted payloads and execution payloads" DefaultValue="com.metamatrix.connector.xml.soap.DefaultSoapTrustDeserializer" IsExpert="true" />
+ <PropertyDefinition Name="ParameterMethod" DisplayName="Parameter Method (None, Name/Value, XMLRequest, XMLInQueryString)" ShortDescription="" DefaultValue="XMLRequest" IsModifiable="false">
+ <AllowedValue>None</AllowedValue>
+ <AllowedValue>Name/Value</AllowedValue>
+ <AllowedValue>XMLRequest</AllowedValue>
+ <AllowedValue>XMLInQueryString</AllowedValue>
+ </PropertyDefinition>
+ <PropertyDefinition Name="InputStreamFilterClass" DisplayName="Input Stream Filter Class" ShortDescription="The class to use to preprocess raw XML input stream" DefaultValue="com.metamatrix.connector.xml.base.PluggableInputStreamFilterImpl" IsExpert="true" />
+ <PropertyDefinition Name="HostnameVerifier" DisplayName="Hostname Verifier" ShortDescription="a class implmenting javax.net.ssl.HostnameVerifier. Used to implement a hostname mismatch workaround." IsExpert="true" />
+ <PropertyDefinition Name="TrustType" DisplayName="Trust Type:(DirectReference or IssuerSerial)" ShortDescription="Only required for Signature and Signed SAML; The issuer-serial method presumes that all trusted users of the service are known to the service and have pre-registered their certificate chains before using the service. The direct-reference method presumes that the service operator trusts all users with certificates issued by a trusted CA." DefaultValue="DirectReference" IsExpert="true" />
+ <PropertyDefinition Name="QueryPreprocessorClass" DisplayName="Query Preprocessor Class" ShortDescription="The class to use to preprocess the IQuery" DefaultValue="com.metamatrix.connector.xml.base.NoQueryPreprocessing" IsExpert="true" />
+ </ComponentType>
+
+ </ComponentTypes>
+</ConfigurationDocument>
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/datasources/derby/connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/derby/connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/derby/connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,18 @@
+# db.type must match a ddl folder
+db.type=derby
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=Apache Derby Network XA Connector
+
+
+driver=org.apache.derby.jdbc.ClientDriver
+URL=jdbc:derby://localhost:1527/txntest
+User=rareddy
+Password=mm
+
+ServerName=localhost
+DatabaseNMame=txntest
+PortNumber=1527
+ds-jndiname=localhost_1527
+
+Immutable=true
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/derby/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/derby/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/derby/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,18 @@
+# db.type must match a ddl folder
+db.type=derby
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=Apache Derby Network XA Connector
+
+
+driver=org.apache.derby.jdbc.ClientDriver
+URL=jdbc:derby://localhost:1527//(derbyinstallloc)
+User=
+Password=
+
+ServerName=localhost
+SatabaseNMame=(databasename)
+PortNumber=1527
+ds-jndiname=localhost_1527
+
+Immutable=true
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/mysql/connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/mysql/connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/mysql/connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,20 @@
+# db.type must match a ddl folder
+db.type=mysql
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=MySQL JDBC XA Connector
+
+
+driver=com.mysql.jdbc.Driver
+URL=jdbc:mysql://localhost:3306/txntest
+User=rareddy
+Password=mm
+
+ServerName=txntest
+DatabaseName=localhost
+PortNumber=3306
+ds-jndiname=mysql_3306
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/mysql/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/mysql/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/mysql/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,22 @@
+# db.type must match a ddl folder
+db.type=mysql
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=MySQL JDBC XA Connector
+
+
+driver=com.mysql.jdbc.Driver
+URL=jdbc:mysql://(servername):3306/(databasename)
+User=
+Password=
+
+ServerName=(servername)
+DatabaseName=(databasename)
+PortNumber=3306
+ds-jndiname=mysql_3306
+
+Immutable=true
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/oracle/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/oracle/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/oracle/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,22 @@
+# db.type must match a ddl folder
+db.type=oracle
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=Oracle XA Connector
+
+
+driver=oracle.jdbc.OracleDriver
+URL=jdbc:oracle:thin:@(servername):1521:(sid)
+User=
+Password=
+
+ServerName=(servername)
+DatabaseName=(databasename)
+PortNumber=1527
+ds-jndiname=(servername)_1527
+
+Immutable=true
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/postgres/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/postgres/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/postgres/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,20 @@
+# db.type must match a ddl folder
+db.type=postgres
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=PostgreSQL XA JDBC Connector
+
+
+driver=org.postgresql.Driver
+URL=jdbc:postgresql://(servername):5432/(databasename)
+User=
+Password=
+
+ServerName=(servername)
+DatabaseName=(databasename)
+PortNumber=5432
+ds-jndiname=(servername)_5432
+
+Immutable=true
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/readme.txt
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/readme.txt (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/readme.txt 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1 @@
+These datasources are used for product testing
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/datasources/sqlserver/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/sqlserver/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/sqlserver/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,22 @@
+# db.type must match a ddl folder
+db.type=sqlserver
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectortype=SQL Server XA Connector
+
+
+driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
+URL=jdbc:sqlserver://(servername):1433;databaseName=(databasename)
+User=
+Password=
+
+ServerName=(servername)
+DatabaseName=(databasename)
+PortNumber=1433
+ds-jndiname=microsoft_1433
+
+Immutable=true
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/datasources/sybase/example_connection.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/datasources/sybase/example_connection.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/datasources/sybase/example_connection.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,22 @@
+# db.type must match a ddl folder
+db.type=sybase
+# db.connectortype must match a connector type defined in the configuration.xml
+db.connectorytype=
+
+
+driver=com.mysql.jdbc.Driver
+URL=jdbc:mysql://(servername):3306/(databasename)
+User=
+Password=
+
+ServerName=(servername)
+DatabaseName=(databasename)
+PortNumber=3306
+ds-jndiname=microsoft_3306
+
+Immutable=true
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/ddl/db2/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/db2/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/db2/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,13 @@
+
+-- these tables are used by custom junit test for testing transactions
+
+create Table g1 (
+ e1 NUMERIC(5),
+ e2 varchar(50),
+ PRIMARY KEY (e1)
+);
+create Table g2 (
+ e1 NUMERIC(5) REFERENCES g1 (e1),
+ e2 varchar(50)
+);
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/db2/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/db2/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/db2/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,7 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/db2/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/db2/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/db2/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=%
+delimtype=normal
+rdbms.type=db2
Added: branches/JCA/test-integration/db/src/main/resources/ddl/derby/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/derby/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/derby/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,13 @@
+
+-- these tables are used by custom junit test for testing transactions
+
+create Table g1 (
+ e1 NUMERIC(5),
+ e2 varchar(50),
+ PRIMARY KEY (e1)
+);
+create Table g2 (
+ e1 NUMERIC(5) REFERENCES g1 (e1),
+ e2 varchar(50)
+);
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/derby/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/derby/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/derby/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,7 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/derby/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/derby/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/derby/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=;
+delimtype=normal
+rdbms.type=derby
Added: branches/JCA/test-integration/db/src/main/resources/ddl/exec_parms.properties_template
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/exec_parms.properties_template (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/exec_parms.properties_template 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,10 @@
+# These properties are used in the execution of the sql statements
+# using the SQL Ant tasks.
+
+# Each database type in the "ddl" directory must have an exec_parms.properties file.
+
+# For property setting options, see the SQL ant task page at @ http://ant.apache.org/manual/index.html
+
+delim=;
+delimtype=normal
+rdbms.type=oracle
Added: branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="create_schemas" default="manage.schemas" basedir="../../">
+ <property name="resources.dir" value="${basedir}/${relative.resources.dir}"></property>
+
+ <property name="target.dir" value="${basedir}/target"></property>
+
+ <!--
+ This script triggers the running of the process for creating schemas
+ -->
+
+
+ <target name="manage.schemas" depends="check, init, manage.all.schemas, manage.single.schemas">
+ <echo>Ran create schemas</echo>
+
+ </target>
+
+
+ <target name="check">
+
+ <echo>Perform check</echo>
+ <condition property="all">
+ <not>
+ <isset property="single"/>
+ </not>
+ </condition>
+
+ <available file="${datasourceloc}" property="external.datasource.dir"/>
+
+ </target>
+
+
+ <target name="init"
+ depends="check.external.ds.dir, set.local.ds.dir">
+
+ <mkdir dir="${target.dir}"/>
+
+ </target>
+
+
+ <target name="check.external.ds.dir"
+ if="external.datasource.dir">
+
+ <property name="ds.loc" value="${datasourceloc}"></property>
+
+ </target>
+
+ <target name="set.local.ds.dir"
+ unless="external.datasource.dir">
+
+ <property name="ds.loc" value="${resources.dir}/datasources/"></property>
+
+ </target>
+
+ <target name="manage.all.schemas" if="all">
+ <echo>Creating all schemas from datasource dir ${ds.loc}</echo>
+ <!--
+ This will process each directory located under the refid location.
+ Its expects the following:
+ - each directory represents one datasource.
+ - connection.properties file must exist in the directory to be used
+ -->
+ <subant genericantfile="${resources.dir}/ddl/run_ddl.xml" inheritall="true" >
+ <dirset dir="${ds.loc}" />
+ <property name="sql.ddl.dir" value="${resources.dir}/ddl"/>
+ <property name="lib.dir" value="${basedir}/lib"/>
+
+ </subant>
+
+ <echo>Completed creating all schemas</echo>
+ </target>
+
+
+ <target name="manage.single.schemas" if="single">
+ <echo>Creating single schema ${ds.loc}/${single}</echo>
+
+ <available file="${ds.loc}/${single}" property="dir.exist"/>
+ <fail unless="dir.exist" message="The datasource single was not found at ${ds.loc}/${single}" />
+
+
+ <ant inheritAll="true" antfile="${resources.dir}/ddl/run_ddl.xml">
+ <property name="basedir" value="${ds.loc}/${single}"/>
+ <property name="sql.ddl.dir" value="${resources.dir}/ddl"/>
+ <property name="lib.dir" value="${basedir}/lib"/>
+
+
+ </ant>
+
+ <echo>Completed creating single schema ${single}</echo>
+
+ </target>
+
+</project>
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,12 @@
+
+-- these tables are used by custom junit test for testing transactions
+create Table g1 (e1 NUMERIC(5) PRIMARY KEY, e2 varchar(50))ENGINE=INNODB;
+create Table g2 (e1 NUMERIC(5), e2 varchar(50), FOREIGN KEY (e1) REFERENCES g1(e1))ENGINE=INNODB;
+
+
+--create Table g1 (e1 NUMERIC(5) PRIMARY KEY, e2 varchar(50));
+--create Table g2 (e1 NUMERIC(5) REFERENCES g1 (e1), e2 varchar(50));
+
+
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/mysql/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/mysql/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/mysql/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,7 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/mysql/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/mysql/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/mysql/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=;
+delimtype=normal
+rdbms.type=mysql
Added: branches/JCA/test-integration/db/src/main/resources/ddl/oracle/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/oracle/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/oracle/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,6 @@
+
+-- these tables are used by custom junit test for testing transactions
+
+create Table g1 (e1 number(5) PRIMARY KEY, e2 varchar2(50));
+create Table g2 (e1 number(5) REFERENCES g1, e2 varchar2(50));
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/oracle/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/oracle/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/oracle/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,7 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/oracle/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/oracle/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/oracle/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=;
+delimtype=normal
+rdbms.type=oracle
Added: branches/JCA/test-integration/db/src/main/resources/ddl/postgres/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/postgres/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/postgres/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,13 @@
+
+-- these tables are used by custom junit test for testing transactions
+
+create Table g1 (
+ e1 NUMERIC(5),
+ e2 VARCHAR(50),
+ PRIMARY KEY (e1)
+);
+create Table g2 (
+ e1 NUMERIC(5) REFERENCES g1 (e1),
+ e2 VARCHAR(50)
+);
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/postgres/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/postgres/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/postgres/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,6 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/postgres/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/postgres/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/postgres/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=;
+delimtype=normal
+rdbms.type=postgres
Added: branches/JCA/test-integration/db/src/main/resources/ddl/run_ddl.xml
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/run_ddl.xml (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/run_ddl.xml 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="run_ddl" default="run.ddl" basedir=".">
+
+
+ <!--
+
+ NOTES:
+ 1. sql.scripts.dir variable must be set to the root directory where the sql script directories are found
+ 2. rdbms.type value must match the folder name (ddl script directory) for its repective scripts in the sql.ddl.dir
+
+ -->
+
+ <target name="run.ddl" if="conn.props.exist" depends="init" >
+ <echo>Loading connection properties ${basedir}/connection.properties</echo>
+ <!--
+ Load the datasource specific connection properties
+ -->
+ <loadproperties srcFile="${basedir}/connection.properties"/>
+
+ <!--
+ Load the ddl specific parms in order to execute the ddl appropriately against the database type
+ -->
+ <loadproperties srcFile="${sql.ddl.dir}/${db.type}/exec_parms.properties"/>
+
+ <antcall target="execute.create.schema" inheritall="true" />
+ <antcall target="execute.create.tables" inheritall="true" />
+
+
+ </target>
+
+ <target name="init">
+ <echo>Initializing at base dir ${basedir}</echo>
+
+ <available file="${sql.ddl.dir}" property="dir.exist"/>
+
+ <fail unless="dir.exist" message="${sql.ddl.dir} does not exist or was not set" />
+
+ <!--
+ ${basedir}/
+ -->
+ <available file="connection.properties" property="conn.props.exist"/>
+
+ <!--
+ due to the ddl supported syntax for certain databases ('if'), there is a need to
+ seperate the drop logic so that it can be executed with the option to not fail
+ if the user/schema doesn't exist. Because we want a failure to occur if the
+ schema cannot be create (don't care if an error occurs when it doesn't exist)
+ -->
+ <!--
+ <property name="drop.script" value="${sql.ddl.dir}/${db.type}/drop_schema.sql" />
+ <available file="${drop.script}" property="drop.exist"/>
+-->
+ <!--
+ <condition property="dont.create.schema">
+ <isfalse value="${create.schema}" />
+ </condition>
+ -->
+
+ <condition property="create.database">
+ <isset property="${adminuser}"/>
+ </condition>
+ <echo>Will only create/drop table be done ${create.database}</echo>
+
+ <!--
+ <condition property="dont.create.schema">
+ <and>
+ <isset property="${create.schema}"/>
+
+ <isfalse value="${create.schema}"/>
+
+ </and>
+ </condition>
+-->
+
+ </target>
+
+
+
+ <target name="execute.create.schema"
+ if="create.database">
+
+ <antcall target="execute.drop.schema" inheritall="true" />
+
+
+ <echo>Executing sql for rdbms ${db.type} using delim ${delim}</echo>
+ <echo>Connecting using url ${adminurl}</echo>
+ <echo>using admin account ${adminuser} and pwd ${adminpassword}</echo>
+
+ <property name="onerror" value="abort" />
+ <property name="autocommit" value="true" />
+
+ <property name="create.script" value="${sql.ddl.dir}/${db.type}/create_schema.sql" />
+
+ <property name="target.create.script" value="${target.dir}/${db.type}_create_schema.sql" />
+
+ <available file="${create.script}" property="create.schema.script.exist"/>
+
+ <fail unless="create.schema.script.exist" message="${create.script} does not exist" />
+
+
+ <antcall target="make.sql.file" inheritall="true" >
+ <param name="script.file" value="${create.script}"/>
+ <param name="target.script.file" value="${target.create.script}"/>
+ </antcall>
+
+ <antcall target="execute.schema.sql" inheritall="true" >
+ <param name="script.file" value="${target.create.script}"/>
+ </antcall>
+
+ </target>
+
+ <target name="execute.drop.schema" >
+
+ <echo>Executing drop sql for rdbms ${db.type} </echo>
+ <property name="onerror" value="continue" />
+ <property name="autocommit" value="true" />
+
+ <property name="drop.schema.script" value="${sql.ddl.dir}/${db.type}/drop_schema.sql" />
+ <available file="${drop.schema.script}" property="create.schema.script.exist"/>
+
+ <fail unless="create.schema.script.exist" message="${drop.schema.script} does not exist" />
+
+
+ <property name="target.drop.schema.script" value="${target.dir}/${db.type}_drop_schema.sql" />
+
+ <antcall target="make.sql.file" inheritall="true" >
+ <param name="script.file" value="${drop.schema.script}"/>
+ <param name="target.script.file" value="${target.drop.schema.script}"/>
+ </antcall>
+
+ <antcall target="execute.schema.sql" inheritall="true" >
+ <param name="script.file" value="${target.drop.schema.script}"/>
+ </antcall>
+
+ </target>
+
+ <target name="execute.create.tables" depends="execute.drop.tables" >
+
+ <echo>Executing sql to load tables for ${db.type} </echo>
+ <echo>Connecting using url ${URL}</echo>
+ <echo>using username ${User} and password ${Password}</echo>
+
+ <property name="create.table.script" value="${sql.ddl.dir}/${db.type}/create_tables.sql" />
+
+ <available file="${create.table.script}" property="create.table.script.exist"/>
+
+ <fail unless="create.table.script.exist" message="${create.table.script} does not exist" />
+
+
+ <property name="onerror" value="abort" />
+ <property name="autocommit" value="true" />
+
+ <antcall target="execute.tables.sql" inheritall="true" >
+ <param name="script.file" value="${create.table.script}"/>
+ </antcall>
+
+ </target>
+
+ <target name="execute.drop.tables" >
+
+ <echo>Executing sql to drop tables for ${db.type} </echo>
+ <echo>Connecting using url ${URL}</echo>
+ <echo>using username ${User} and password ${Password}</echo>
+
+ <property name="drop.table.script" value="${sql.ddl.dir}/${db.type}/drop_tables.sql" />
+
+ <available file="${drop.table.script}" property="drop.table.script.exist"/>
+
+ <fail unless="drop.table.script.exist" message="${drop.table.script} does not exist" />
+
+
+ <property name="onerror" value="continue" />
+ <property name="autocommit" value="true" />
+
+ <antcall target="execute.tables.sql" inheritall="true" >
+ <param name="script.file" value="${drop.table.script}"/>
+ </antcall>
+ </target>
+
+
+ <target name="make.sql.file" >
+
+ <available file="${script.file}" property="script.file.exist"/>
+
+ <fail unless="script.file.exist" message="${script.file} does not exist" />
+
+ <echo>Updating script file ${target.script.file}</echo>
+
+ <delete file="${target.script.file}"/>
+ <copy file="${script.file}" tofile="${target.script.file}"/>
+
+ <replace
+ file="${target.script.file}">
+ <replacefilter
+ token="(username)"
+ value="${username}"/>
+ <replacefilter
+ token="(password)"
+ value="${password}"/>
+ <replacefilter
+ token="(databasename)"
+ value="${databasename}"/>
+ </replace>
+ </target>
+
+ <!--
+ This executes using the admin username and password because
+ it requires specific rights to create schema
+ -->
+ <target name="execute.schema.sql" >
+ <echo>Executing schema script file ${script.file}</echo>
+ <echo>Admin account: ${adminuser} url: ${adminurl}</echo>
+
+ <available file="${script.file}" property="script.file.exist"/>
+
+ <fail unless="script.file.exist" message="${script.file} does not exist" />
+
+ <sql driver="${driver}"
+ url="${adminurl}"
+ userid="${adminuser}"
+ password="${adminpassword}"
+ src="${script.file}"
+ rdbms="${rdbms.type}"
+ delimiter="${delim}"
+ delimitertype="${delimtype}"
+ autocommit="${autocommit}"
+ onerror="${onerror}" >
+ <classpath>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ <pathelement path="${maven.runtime.classpath}"/>
+ </classpath>
+
+ </sql>
+ </target>
+
+ <!--
+ This executes using the username and password for the so that tables
+ are created under this user and not the admin
+ -->
+ <target name="execute.tables.sql" >
+ <echo>Executing table script file ${script.file}</echo>
+ <echo>User account: ${User} url: ${URL}</echo>
+
+ <available file="${script.file}" property="script.file.exist"/>
+
+ <fail unless="script.file.exist" message="DDL ${script.file} does not exist" />
+
+ <sql driver="${driver}"
+ url="${URL}"
+ userid="${User}"
+ password="${Password}"
+ src="${script.file}"
+ rdbms="${rdbms.type}"
+ delimiter="${delim}"
+ delimitertype="${delimtype}"
+ autocommit="${autocommit}"
+ onerror="${onerror}" >
+ <classpath>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ <pathelement path="${maven.runtime.classpath}"/>
+ </classpath>
+
+
+ </sql>
+
+ <echo>Executed sql for ${rdbms.type}</echo>
+
+
+ </target>
+
+ <target name="does.user.schema.exist" >
+ <echo>Executing table script file ${script.file}</echo>
+ <echo>User account: ${adminuser} url: ${url}</echo>
+
+ <available file="${script.file}" property="script.file.exist"/>
+
+ <fail unless="script.file.exist" message="DDL ${script.file} does not exist" />
+
+
+ <sql driver="${driver}"
+ url="${URL}"
+ userid="${adminuser}"
+ password="${adminpassword}"
+ src="${script.file}"
+ rdbms="${rdbms.type}"
+ delimiter="${delim}"
+ delimitertype="${delimtype}"
+ autocommit="${autocommit}"
+ onerror="${onerror}" >
+ <classpath>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ <pathelement path="${maven.runtime.classpath}"/>
+ </classpath>
+
+
+ </sql>
+
+
+ </target>
+
+</project>
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/create_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/create_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,13 @@
+
+-- these tables are used by custom junit test for testing transactions
+
+create Table g1 (
+ e1 NUMERIC(5),
+ e2 VARCHAR(50),
+ PRIMARY KEY (e1)
+);
+create Table g2 (
+ e1 NUMERIC(5) REFERENCES g1 (e1),
+ e2 VARCHAR(50)
+);
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/drop_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/drop_tables.sql (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/drop_tables.sql 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,6 @@
+
+-- drop the tables
+
+drop Table g2;
+drop Table g1;
+
\ No newline at end of file
Added: branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/exec_parms.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/exec_parms.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/sqlserver/exec_parms.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,3 @@
+delim=;
+delimtype=normal
+rdbms.type=microsoft
Added: branches/JCA/test-integration/db/src/main/resources/default-config.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/default-config.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/default-config.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,53 @@
+##########################################
+# Common Properties for everybody
+##########################################
+
+connection-type=datasource
+
+process-batch = 20
+connector-batch = 20
+
+# this is how to submit queries to Teiid
+# default is true
+execute.in.batch=false
+
+##########################################
+# properties for Teiid connection
+##########################################
+#driver=org.teiid.jdbc.TeiidDriver
+driver=com.metamatrix.jdbc.EmbeddedDataSource
+
+#URL=jdbc:teiid:Transaction@mm://localhost:31000
+URL=jdbc:metamatrix:Transaction@target/classes/transactions/transaction.properties;user=admin;password=teiid
+User=admin
+Password=teiid
+DatabaseName=Transaction
+#ServerName=localhost
+ServerName=target/classes/transactions/transaction.properties
+PortNumber=31000
+application-name=txn-test
+
+# jboss
+# mm.ds-jndiname=java:mmXA
+# usertxn-jndiname=UserTransaction
+
+# weblogic
+mm.ds-jndiname=mmXA
+usertxn-jndiname=java:comp/UserTransaction
+
+
+# These mappings control what datasource is mapped to which model when the -Dusedatasources=<comma seperated datasource names> option is used
+# or the system environment is set.
+#
+# By providing the numerical order, it indicates which datasource to assign based on the order in the usedatasources property.
+#
+# If -Dusedatasources is not set, then the datasource will be assigned randomly when obtaining a datasource.
+#
+#
+
+pm1=1
+pm2=2
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/transactions/Transaction.vdb
===================================================================
(Binary files differ)
Property changes on: branches/JCA/test-integration/db/src/main/resources/transactions/Transaction.vdb
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: branches/JCA/test-integration/db/src/main/resources/transactions/transaction.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/transactions/transaction.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/transactions/transaction.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,104 @@
+#
+# This is properties file used for bootstrap Teiid embedded for loading
+#
+#Path to the Teiid Configuration file
+dqp.configFile=../configuration.xml
+
+# Path to the directory where the VDBs are located, or list of VDBS separated by ";"
+vdb.definition=./Transaction.vdb
+dqp.buffer.usedisk=false
+dqp.buffer.processorBatchSize=5
+dqp.buffer.connectorBatchSize=5
+
+xa.enable_recovery=false
+
+teiid.home=target/scratch
+
+processName=integrationTest
+
+#xa.txnstore_dir=./txndir
+
+#dqp.workdir=./tmp/
+
+#only for testing, as this takes more time to start and shutdown
+#metamatrix.xatxnmgr.enable_recovery=false
+
+
+#Log file (optional) - will be modified to include the instance name, i.e. teiid_1.log
+dqp.logFile=./teiid.log
+
+#Logging level (CRITICAL=1,ERROR=2,WARNING=3,INFO=4,DETAIL=5) (optional: default 3)
+dqp.logLevel=3
+
+#Extensions directory - where the Connector Binding's classpath jar files are loaded.
+#Use of this property is an implicit declaration that each Connector Binding has its own Class Loader.
+#dqp.extensions=./extensions/
+
+#Path to instance specific temporary information for caching, buffering, and transactions
+dqp.workdir=./work
+
+#Jars to load, which will be available to all services: UDFs, command logging, etc.
+#dqp.extension.CommonClasspath=extensionjar:x.jar,extensionjar:y.jar
+
+#Location of the UDF model
+#dqp.userDefinedFunctionsFile=extensionjar:FunctionDefinition.xmi
+
+#
+# Processor settings
+#
+
+#Process pool maximum thread count. (default 64)
+#ProcessPoolMaxThreads=64
+
+#Query processor time slice, in milliseconds. (default 2000)
+#ProcessorTimeslice=2000
+
+#Maximum allowed fetch size, set via JDBC. User requested value ignored above this value. (default 20000)
+#MaxFetchSize=20000
+
+#The maximum number of query plans that are cached. Note: this is a memory based cache. (default 250)
+#MaxPlanCacheSize=250
+
+#
+# BufferManager Settings
+#
+
+#The max size of a batch sent between connector and query service. Should be even multiple of processorBatchSize. (default 2000)
+#dqp.buffer.connectorBatchSize=2000
+
+#The max size of a batch sent internally within the query processor. Should be <= the connectorBatchSize. (default 2000)
+#dqp.buffer.processorBatchSize=2000
+
+#Defines whether to use disk buffering or not. (default 64)
+#dqp.buffer.useDisk=true
+
+#The numeric memory size in MB, to be used before disk buffering kicks in (default 64)
+#dqp.buffer.memory=64
+
+#
+# Cache Settings
+#
+
+#Maximum number of cached lookup tables. Note: this is a memory based cache. (default 20)
+#MaxCodeTables=50
+
+#Maximum number of records in a single lookup table (default 10000)
+#MaxCodeTableRecords=10000
+
+#Denotes whether or not result set caching is enabled. (default false)
+#ResultSetCacheEnabled=false
+
+#The maximum size in MB the result set cache will be allowed to grow to before objects are removed. 0 indicates no limit. (default 50)
+#ResultSetCacheSize=50
+
+#The maximum time a result set will be kept in cache before being automatically cleared. 0 indicates no limit. (default 3600000)
+#ResultSetCacheMaxAge=3600000
+
+#Defines whether caching is restricted to a specific session ('session') or a specific VDB version ('vdb'). (default vdb)
+#ResultSetCacheScope=vdb
+
+
+
+
+
+
Added: branches/JCA/test-integration/db/src/main/resources/xa-config.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/xa-config.properties (rev 0)
+++ branches/JCA/test-integration/db/src/main/resources/xa-config.properties 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,71 @@
+##########################################
+# Common Properties for everybody
+##########################################
+
+process-batch = 20
+connector-batch = 20
+
+# this is how to submit queries to Teiid
+# default is true
+execute.in.batch=false
+
+##########################################
+# properties for Teiid connection
+##########################################
+driver=org.teiid.jdbc.TeiidDataSource
+URL=jdbc:metamatrix:Transaction@target/classes/transactions/transaction.properties;user=admin;password=teiid
+User=admin
+Password=teiid
+DatabaseName=Transaction
+ServerName=target/classes/transactions/transaction.properties
+PortNumber=0
+application-name=txn-test
+
+# jboss
+# mm.ds-jndiname=java:mmXA
+# usertxn-jndiname=UserTransaction
+
+# weblogic
+mm.ds-jndiname=mmXA
+usertxn-jndiname=java:comp/UserTransaction
+
+# These mappings control what datasource is mapped to which model when the -Dusedatasources=<comma seperated datasource names> option is used
+# or the system environment is set.
+#
+# By providing the numerical order, it indicates which datasource to assign based on the order in the usedatasources property.
+#
+# If -Dusedatasources is not set, then the datasource will be assigned in the order they are calling to obtain a datasource.
+#
+#
+
+pm1=1
+pm2=2
+
+
+##########################################
+# For default design of testcases, these properties are in the setup method of the testcase.
+# However, you can create your own version of the config properties file
+# and specify these properties in the config file
+# NOTE: will need to set the Sytem "config" property in order to override the default-config.properties file
+##########################################
+
+
+#available types (datasource, driver, jndi)
+#connection-type=datasource
+#connection-type=driver
+
+
+# autocommit applies to local transaction-type only
+# default is true
+#autocommit=false
+
+# AUTO_WRAP_OFF = "OFF"
+# AUTO_WRAP_ON = "ON"
+# AUTO_WRAP_PESSIMISTIC = "PESSIMISTIC"
+# AUTO_WRAP_OPTIMISTIC = "OPTIMISTIC"
+
+#txnAutoWrap=off
+
+#-----------------------------
+
+
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,44 @@
+package org.teiid.test.testcases;
+
+import junit.framework.TestCase;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.TransactionContainer;
+
+public abstract class BaseAbstractTransactionTestCase extends TestCase {
+
+ protected TransactionContainer container = null;
+
+ public BaseAbstractTransactionTestCase(String name) {
+ super(name);
+
+
+ }
+
+ protected abstract TransactionContainer getTransactionContainter();
+
+
+
+ @Override
+ protected void setUp() throws Exception {
+ // TODO Auto-generated method stub
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // TODO Auto-generated method stub
+ super.tearDown();
+
+ }
+
+
+ protected void addProperty(String key, String value) {
+
+ ConfigPropertyLoader.getInstance().setProperty(key, value);
+
+ }
+
+
+
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,604 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OnWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+/**
+ * A common test case among many different transaction stuff.
+ */
+public abstract class CommonTransactionTests extends BaseAbstractTransactionTestCase {
+
+ public CommonTransactionTests(String name) {
+ super(name);
+ }
+
+ protected abstract TransactionContainer getTransactionContainter();
+
+// void runConcurrentTestCases(int howMany, final String[] sqls) {
+//
+// SeparateClient[] clients = new SeparateClient[howMany];
+//
+// for(int i = 0; i < howMany; i++) {
+// AbstractQueryTransactionTest testCase = new AbstractQueryTransactionTest() {
+// public void testCase() throws Exception {
+// execute(sqls);
+// }
+// };
+// clients[i] = new SeparateClient(getTransactionContainter(), testCase);
+// }
+//
+// for(int i = 0; i < howMany; i++) {
+// clients[i].start();
+// }
+//
+// try {
+// for(int i = 0; i < howMany; i++) {
+// clients[i].join();
+// }
+// } catch (InterruptedException e) {
+// // boo
+// }
+// }
+
+// static class SeparateClient extends Thread{
+// TransactionContainer container = null;
+// AbstractTransactionTestCase testCase = null;
+//
+// public SeparateClient(TransactionContainer container, AbstractTransactionTestCase testCase) {
+// this.container = container;
+// this.testCase = testCase;
+// }
+//
+// public void run() {
+// this.container.runTransaction(this.testCase);
+// }
+// }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Single Source - Rows below 500 (for insert/update/delete)
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // there is nothing to verify here..
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(100, '100')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 100");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourcePreparedUpdate") {
+
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(?, ?)", new Object[] {new Integer(102), "102"});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 102");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 100; i < 110; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 100");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePartialProcessing() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourcePartialProcessing") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100 limit 10");
+ assertRowCount(10);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceVirtualSelect") {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1 where vm.g1.pm1e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(500, '500', 500, '500')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e2 = '500'");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e2 = '500'");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelectInto() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceSelectInto") {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(501, '501', 501, '501')");
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 = 501");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e2 = '501'");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e2 = '501'");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsert() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceBulkRowInsert") {
+ public void testCase() throws Exception {
+ for (int i = 100; i < 112; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePreparedUpdate") {
+ public void testCase() throws Exception {
+ Integer value = new Integer(500);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {value, value.toString(), value, value.toString()});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm2.g2 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm2.g1 where e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 100; i < 115; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ execute("update pm1.g1 set e2='blah' where e1 > 100");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1")) {
+ protected boolean compareCaseSensitive() {
+ return false;
+ }
+ };
+ test.execute("select * from g1 where e1 >= 100 and e1 < 115");
+ test.assertRowCount(15);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 115");
+ test.assertRowCount(15);
+ test.execute("select distinct e2 from g1 where e1 > 100");
+
+ // NOTE: if this is an oracle source, it failes because it return varchar2
+ if (userTxn.getSource("pm1").getMetaData().getDatabaseProductName().toLowerCase().indexOf("oracle") > -1) {
+ test.assertResultsSetEquals(new String[] {"e2[varchar2]", "blah"});
+ } else {
+ test.assertResultsSetEquals(new String[] {"e2[varchar]", "blah"});
+ }
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleVirtualCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleVirtualCommands") {
+ public void testCase() throws Exception {
+
+ for (int i = 200; i < 207; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ execute("insert into vm.g2 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+
+ execute("update vm.g1 set pm1e2='blah' where pm1e1 >= 200");
+
+ execute("delete from vm.g2 where vm.g2.pm1e1 >= 205");
+ execute("delete from vm.g1 where vm.g1.pm1e1 >= 205");
+
+ execute("select * from vm.g1 where pm1e1 >= 200 and pm1e1 < 207");
+ assertRowCount(5);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1")){
+ protected boolean compareCaseSensitive() {
+ return false;
+ }
+ };
+ test.execute("select * from g1 where e1 >= 200 and e1 < 207");
+ test.assertRowCount(5);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 207");
+ test.assertRowCount(5);
+ test.execute("select distinct e2 from g1 where e1 >= 200 and e1 < 207");
+ test.assertResultsSetEquals(new String[] {"e2[varchar2]", "blah"});
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsCancel() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsCancel") {
+
+ public void testCase() throws Exception {
+ Thread t = new Thread("Cancel Thread") {
+ public void run() {
+ try {
+ try {
+ Thread.sleep(500);
+ cancelQuery();
+ } catch (SQLException e) {
+ // debug(e.getMessage());
+ }
+ } catch (InterruptedException e) {}
+ }
+ };
+ t.start();
+ executeBatch(getMultipleSourceBatch());
+ }
+
+ /**
+ * @see com.metamatrix.transaction.test.framework.AbstractQueryTest#exceptionExpected()
+ */
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (this may finish under one second, then this test is not valid)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceTimeout() throws Exception{
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceTimeout") {
+ public void testCase() throws Exception {
+ executeBatch(getMultipleSourceBatch(), 1); // time out after 1 sec
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed with time out exception");
+ }
+ else {
+ assertTrue(getLastException().getMessage().indexOf("Operation timed out before completion") != -1);
+ }
+ }
+ };
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (this may finish under one second, then this test is not valid)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ static String[] getMultipleSourceBatch() {
+ ArrayList list = new ArrayList();
+
+ for (int i = 600; i < 750; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values ("+i+",'"+i+"')");
+ list.add("insert into pm2.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm2.g2 (e1, e2) values ("+i+",'"+i+"')");
+ }
+
+ list.add("update pm1.g1 set e2='blah' where pm1.g1.e1 >= 600");
+ list.add("update pm2.g1 set e2='blah' where pm2.g1.e1 >= 600");
+
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 610");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 610");
+ list.add("delete from pm2.g2 where pm2.g2.e1 >= 610");
+ list.add("delete from pm2.g1 where pm2.g1.e1 >= 610");
+
+ return(String[])list.toArray(new String[list.size()]);
+ }
+
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ * Note: This is producing the below error some times; however this is SQL Server issue.
+ * http://support.microsoft.com/?kbid=834849
+ */
+ public void xtestMultipleSourcePartialProcessingUsingLimit() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePartialProcessingUsingLimit") {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1 where pm1e1 < 100 limit 10");
+ assertRowCount(10);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ * Note: This is producing the below error some times; however this is SQL Server issue.
+ * http://support.microsoft.com/?kbid=834849
+ */
+ public void xtestMultipleSourcePartialProcessingUsingMakedep() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePartialProcessingUsingMakedep") {
+ public void testCase() throws Exception {
+ execute("select pm1.g1.e1, pm1.g1.e2 from pm1.g1 LEFT OUTER JOIN pm2.g1 MAKENOTDEP ON pm1.g1.e2 = pm2.g1.e2 where pm2.g1.e1 >= 50 and pm2.g1.e1 < 100");
+ assertRowCount(50);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+
+
+
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverFalseOffTest.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverFalseOffTest.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverFalseOffTest.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+
+
+/**
+ * Local Transaction Test
+ *
+ * Settings:
+ *
+ * - Using Driver
+ * - Autocommit = False
+ * - TxnAutoWrap = Off
+ */
+public class LocalTransactionDriverFalseOffTest extends TwoSourceTransactionScenarios {
+
+ public LocalTransactionDriverFalseOffTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ this.addProperty(ConfigPropertyNames.CONNECTION_TYPE, ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION);
+
+ this.addProperty(CONNECTION_STRATEGY_PROPS.AUTOCOMMIT, "false");
+ this.addProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, "off");
+ this.addProperty(ConfigPropertyNames.CONFIG_FILE, ConfigPropertyLoader.DEFAULT_CONFIG_FILE_NAME);
+ this.addProperty(ConfigPropertyNames.USE_DATASOURCES_PROP, "derby,mysql");
+
+
+ }
+
+
+
+
+
+
+
+
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverTrueOffTest.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverTrueOffTest.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionDriverTrueOffTest.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+
+
+/**
+ * Local Transaction Test
+ *
+ * Settings:
+ *
+ * - Using Driver
+ * - Autocommit = True
+ * - TxnAutoWrap = Off
+ */
+public class LocalTransactionDriverTrueOffTest extends TwoSourceTransactionScenarios {
+
+ public LocalTransactionDriverTrueOffTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ this.addProperty(ConfigPropertyNames.CONNECTION_TYPE, ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION);
+ this.addProperty(CONNECTION_STRATEGY_PROPS.AUTOCOMMIT, "true");
+ this.addProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, "off");
+ this.addProperty(ConfigPropertyNames.CONFIG_FILE, ConfigPropertyLoader.DEFAULT_CONFIG_FILE_NAME);
+ this.addProperty(ConfigPropertyNames.USE_DATASOURCES_PROP, "derby,mysql");
+
+
+ }
+
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.LocalTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+
+/**
+ * User Transaction Test is where user handles all the transaction boundaries
+ * so, autocmmit = OFF, and No transaction auto wrapping.
+ */
+public class LocalTransactionTests extends CommonTransactionTests {
+
+
+ public LocalTransactionTests(String testName) {
+ super(testName);
+ }
+
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new LocalTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsExplicitRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommandsExplicitRollback") {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 220; i++) {
+ execute("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ execute("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ }
+
+ public boolean rollbackAllways() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommandsReferentialIntegrityRollback") {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 220; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsExplicitRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsExplicitRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 720; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+
+ // force the rollback
+ public boolean rollbackAllways() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsReferentialIntegrityRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 720; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceBulkRowInsertRollback") {
+ public void testCase() throws Exception {
+ for (int i = 100; i < 120; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleVirtualCommandsRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleVirtualCommandsRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 600; i < 615; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ execute("insert into vm.g2 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+
+ execute("update vm.g1 set pm1e2='blah' where pm1e1 >= 605");
+
+ execute("delete from vm.g2 where vm.g2.pm1e1 >= 610");
+ execute("delete from vm.g1 where vm.g1.pm1e1 >= 610");
+
+ execute("select * from vm.g1 where pm1e1 >= 600 and pm1e1 < 615");
+ assertRowCount(10);
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OffWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+public class OffWrapTransactionTests extends BaseAbstractTransactionTestCase {
+
+
+
+ public OffWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new OffWrapTransaction();
+ }
+
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(100, '100')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 100");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+ for (int i = 100; i < 110; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 100");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(500, '500', 500, '500')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 710; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 710");
+ test.assertRowCount(10);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 710");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsert() throws Exception {
+
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 800; i < 807; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm2.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 800");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ // execute((String[])list.toArray(new String[list.size()]));
+ executeBatch((String[])list.toArray(new String[list.size()]), -1);
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.execute("select * from g2 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.closeConnection();
+ }
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OnWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+
+public class OnWrapTransactionTests extends CommonTransactionTests {
+
+ public OnWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new OnWrapTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // try to rollback, however since this autocommit=on above two are already commited
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceBatchCommandReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // try to rollback, since we are in single batch it must rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 100; i < 110; i++) {
+ list.add("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values("+i+",'"+i+"',"+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,491 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OptimisticWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+/**
+ * The main thing to test in this is, when the single source should is involved it should work
+ * fine, when multiple sources involved it should fail.
+ */
+public class OptimisticWrapTransactionTests extends BaseAbstractTransactionTestCase {
+
+ public OptimisticWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ protected TransactionContainer getTransactionContainter() {
+ return new OptimisticWrapTransaction();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Single Source - Rows below 500 (for insert/update/delete)
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(?, ?)", new Object[] {new Integer(102), "102"});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 102");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where pm1.g2.e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+ for (int i = 100; i < 120; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(20);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(20);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceBatchCommand() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ for (int i = 200; i < 205; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 205");
+ test.assertRowCount(5);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 205");
+ test.assertRowCount(5);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdateRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g2 (e1, e2) values(?, ?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommandsRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where pm1.g2.e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 300; i < 310; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // this will make it rollback
+ execute("insert into pm1.g2 (e1, e2) values(?, ?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (since they are not bundled in single command they should be treated individually)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 300 and e1 < 310");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 300 and e1 < 310");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceBatchCommandRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ for (int i = 400; i < 410; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // this will make it rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999, '9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (all commands will trated as single under single transaction)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 400 and e1 < 410");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 400 and e1 < 410");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+
+ public void after() {
+ // selects are special case as they will not fail to use multiple sources. The transaction
+ // source count only starts when there are updates to db, so this is OK
+ if (exceptionOccurred()) {
+ fail("should not have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ Integer value = new Integer(500);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {value, value.toString(), value, value.toString()});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourcesBatchCommand() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ list.add("delete from pm2.g2 where pm2.g2.e1 >= 100");
+ list.add("delete from pm2.g1 where pm2.g1.e1 >= 100");
+
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1");
+ }
+
+ public void after() {
+ if (exceptionOccurred()) {
+ fail("should not have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualProceduralSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.p1");
+ }
+
+ public void after() {
+ if (exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualProcedure() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.p2 where vm.p2.e1 = ? and vm.p2.e2 = ?", new Object[] {new Integer(200), "200"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ public void testMultipleSourceVirtualProceduralSelectWithUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("exec vm.p2(?, ?)", new Object[] {new Integer(200), "200"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from vm.g1 where vm.g1.pm1e1 > 100");
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.PessimisticWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+public class PessimisticWrapTransactionTests extends CommonTransactionTests {
+
+ public PessimisticWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ protected TransactionContainer getTransactionContainter() {
+ return new PessimisticWrapTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // try to rollback, however since this pessimistic above two are already commited
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceBatchCommandReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // try to rollback, since we are in single batch it must rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 100; i < 120; i++) {
+ list.add("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values("+i+",'"+i+"',"+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.transaction.StandaloneGlobalTransaction;
+
+
+/**
+ * This is global transaction test to be used when transaction is external
+ * in places like inside app server
+ */
+public class StandaloneGlobalTransactionTests extends LocalTransactionTests {
+
+ public StandaloneGlobalTransactionTests(String testName) {
+ super(testName);
+ }
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+
+ return new StandaloneGlobalTransaction();
+ }
+
+
+}
Added: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/XATransactionDatasourceFalseOffTest.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/XATransactionDatasourceFalseOffTest.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/XATransactionDatasourceFalseOffTest.java 2009-12-01 21:17:40 UTC (rev 1614)
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+
+
+/**
+ * Local Transaction Test
+ *
+ * Settings:
+ *
+ * - Transaction Type = local
+ * - Using Driver
+ * - Autocommit = True
+ * - TxnAutoWrap = Off
+ */
+//public class XATransactionDatasourceFalseOffTest extends SingleSourceTransactionScenarios {
+
+ public class XATransactionDatasourceFalseOffTest extends TwoSourceTransactionScenarios {
+
+
+
+ public XATransactionDatasourceFalseOffTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ //XATransactions currently doesn't support using sqlserver
+ //{@see TEIID-559}
+ this.addProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP, "sqlserver");
+
+ this.addProperty(ConfigPropertyNames.CONFIG_FILE, "xa-config.properties");
+
+ this.addProperty(ConfigPropertyNames.CONNECTION_TYPE, ConfigPropertyNames.CONNECTION_TYPES.DATASOURCE_CONNECTION);
+ this.addProperty(CONNECTION_STRATEGY_PROPS.AUTOCOMMIT, "false");
+ this.addProperty(ConfigPropertyNames.USE_DATASOURCES_PROP, "derby,mysql");
+
+
+ }
+
+
+
+}
15 years, 1 month
teiid SVN: r1613 - branches/JCA/test-integration.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2009-12-01 16:13:14 -0500 (Tue, 01 Dec 2009)
New Revision: 1613
Removed:
branches/JCA/test-integration/db/
Log:
deleting db project from JCA branch as issues with merge; JCA branch does not have any contributions that needs to kept
15 years, 1 month
teiid SVN: r1612 - in branches/JCA/test-integration/db: src/main/java/org/teiid/test/framework and 10 other directories.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2009-12-01 14:45:17 -0500 (Tue, 01 Dec 2009)
New Revision: 1612
Added:
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java
Removed:
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
branches/JCA/test-integration/db/src/test/java/org/teiid/test/framework/
Modified:
branches/JCA/test-integration/db/howto
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
branches/JCA/test-integration/db/src/main/resources/configuration.xml
branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml
branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql
branches/JCA/test-integration/db/src/main/resources/default-config.properties
branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java
Log:
partial merge of HEAD for test-integration due to merge issues
Modified: branches/JCA/test-integration/db/howto
===================================================================
--- branches/JCA/test-integration/db/howto 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/howto 2009-12-01 19:45:17 UTC (rev 1612)
@@ -10,10 +10,7 @@
==========================================
- Unit test should be created under db/src/test/java
-- See SingleSourceTransactionTest.java as an example
-
- NOTE: the current tests are currently organized by the number of datasources they require in order
- to give some organization to the test for tracking purposes.
+- See LocalTransactionDriverFalseOffTest.java as an example
- Test should extend org.teiid.transaction.test.BaseAbstractTransactionTestCase
@@ -22,12 +19,32 @@
- when calling: this.getSource("modelname") --- the "modelname" represents the model for which
you want the connection for
- INFO: to know which source this model is mapped to, find the config properties file being
- loaded for this test (default is the default-config.properties) and look for
- the model-to-datasource mapping(s)
-
- The default Transaction.vdb has 2 models: pm1 and pm2
+
+ By default, the datasource assigned to a model will be (somewhat) random. There is not coding to
+ specifically control this assignment, as long as the -Dusedatasources option is not used.
+
+ If the -Dusedatasources option is used, then there is an implied model-to-datasource assignment.
+ To understand how this assignment will be made, find the config properties file being
+ loaded for this test (default is the default-config.properties) and look for
+ the model-to-order mapping(s)
+
+ The default Transaction.vdb has 2 models: pm1 and pm2
+
+ example: pm1:1
+ pm2:2
+
+ Therefore, the model-to-order mapping will map to the relative order specified in the usedatasources property.
+
+ example: -Dusedatasources=oracle,postgres
+
+ This will result in model pm1 --> oracle
+ pm2 --> postgres
+ To EXCLUDE a test from using a specific database type, call addProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP, "postgres");
+ during setup()
+
+ NOTE: The EXCLUDE option excludes based on db.type, where "usedatasources" specifies the actual datasource (not by type)
+
==========================================
Setting up a Datasource to be used during Testing
@@ -61,6 +78,10 @@
run: mvn clean install -Dusedatasources=<comma seperated datasource names>
Example: mvn clean install -Dusedatasources=oracle,sqlserver
+
+ c. To run a single class of tests, run the "singleclass" profile
+ run: mvn clean install -Psingleclass -Dclassname=<classname> ====> don't add .java to classname
+
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,75 +1,173 @@
package org.teiid.test.framework;
-import java.io.IOException;
-import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
-import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+import org.teiid.test.framework.datasource.DataSourceFactory;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.util.PropUtils;
+import com.metamatrix.common.util.PropertiesUtils;
+
+
+/**
+ * The ConfigProperteryLoader will load the configuration properties to be used by a test.
+ * These properties only live for the duration of one test.
+ *
+ * NOTE: System properties set by the VM will be considered long living. This is so the
+ * -Dusedatasources ( {@link ConfigPropertyNames#USE_DATASOURCES_PROP} ) option can be maintained for the duration of a set of tests.
+ *
+ *
+ * @author vanhalbert
+ *
+ */
public class ConfigPropertyLoader {
-
- /**
- * The default config file to use when #CONFIG_FILE system property isn't set
- */
- protected static final String DEFAULT_CONFIG_FILE_NAME="default-config.properties";
-
- private static Properties props = null;
- public synchronized static void loadConfigurationProperties() {
- String filename = System.getProperty(ConfigPropertyNames.CONFIG_FILE);
- if (filename == null) {
- filename = DEFAULT_CONFIG_FILE_NAME;
- }
-
- loadProperties(filename); }
+ /**
+ * The default config file to use when #CONFIG_FILE system property isn't
+ * set
+ */
+ public static final String DEFAULT_CONFIG_FILE_NAME = "default-config.properties";
+
+ private static ConfigPropertyLoader _instance = null;
+ private static String LAST_CONFIG_FILE = null;
+
+ /**
+ * Contains any overrides specified for the test
+ */
+ private Properties overrides = new Properties();
+
+ /**
+ * Contains the properties loaded from the config file
+ */
+ private Properties props = null;
+
+ private Map<String, String>modelAssignedDatabaseType = new HashMap<String, String>(5);
+
+ private DataSourceFactory dsfactory = null;
+
+ private ConfigPropertyLoader() {
+ }
+
+ public static synchronized ConfigPropertyLoader getInstance() {
+ boolean diff = differentConfigProp();
+
+
+ if (_instance != null && !diff) {
+ return _instance;
+ }
+
+ if (_instance != null) {
+ cleanup();
+ }
+
+ _instance = new ConfigPropertyLoader();
+ try {
+ _instance.initialize();
+ } catch (TransactionRuntimeException e) {
+ throw e;
+ }
+
+ return _instance;
+ }
+
+ /**
+ * because a config file could be different for the subsequent test, check
+ * to see if the file is different.
+ * @return
+ */
+ private static boolean differentConfigProp( ) {
+ String filename = System.getProperty(ConfigPropertyNames.CONFIG_FILE);
+ if (filename == null) {
+ filename = DEFAULT_CONFIG_FILE_NAME;
+ }
- public static String getProperty(String key) {
- return getProperties().getProperty(key);
+ if (LAST_CONFIG_FILE == null || ! LAST_CONFIG_FILE.equalsIgnoreCase(filename)) {
+ LAST_CONFIG_FILE = filename;
+ return true;
}
+ return false;
+
+ }
+
+ public static synchronized void cleanup() {
+ _instance.overrides.clear();
+ _instance.modelAssignedDatabaseType.clear();
+ _instance.props.clear();
+ if (_instance.dsfactory != null) {
+ _instance.dsfactory.cleanup();
+ }
+ _instance = null;
+ LAST_CONFIG_FILE=null;
+ }
+
+
+ private void initialize() {
+ loadProperties(LAST_CONFIG_FILE);
+ dsfactory = new DataSourceFactory(this);
+ }
+
+ public DataSourceFactory getDataSourceFactory() {
+ return this.dsfactory;
+ }
+
+
+ public String getProperty(String key) {
+ String rtn = null;
+ rtn = overrides.getProperty(key);
+ if (rtn == null) {
+ rtn = props.getProperty(key);
- public synchronized static Properties getProperties() {
- return props;
+ if (rtn == null) {
+ rtn = System.getProperty(key);
}
+ }
+ return rtn;
+ }
+
+ public void setProperty(String key, String value) {
+ overrides.setProperty(key, value);
+ }
+
+ public Properties getProperties() {
- private static void loadProperties(String filename) {
- props = System.getProperties();
- try {
- InputStream in = ConfigPropertyLoader.class.getResourceAsStream("/"+ filename);
- if (in != null) {
- Properties lprops = new Properties();
- lprops.load(in);
- props.putAll(lprops);
-
- }
- else {
- throw new RuntimeException("Failed to load properties from file '"+filename+ "' configuration file");
- }
- } catch (IOException e) {
- throw new RuntimeException("Error loading properties from file '"+filename+ "'" + e.getMessage());
- }
- }
+ Properties p = new Properties();
+ p.putAll(System.getProperties());
+ p.putAll(props);
+ p.putAll(overrides);
+
+ return p;
+ }
+
+ public Map<String, String> getModelAssignedDatabaseTypes() {
+ return this.modelAssignedDatabaseType;
+ }
+
+ public void setModelAssignedToDatabaseType(String modelname, String dbtype) {
+ this.modelAssignedDatabaseType.put(modelname, dbtype);
+ }
+
+ private void loadProperties(String filename) {
- public static void cleanup() {
- Properties p = System.getProperties();
- p.remove(ConfigPropertyNames.CONFIG_FILE);
- p.remove(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP);
-
+ props = PropUtils.loadProperties("/" + filename, null);
+
+ }
+
+ public static void main(String[] args) {
+ System.setProperty("test", "value");
+
+ ConfigPropertyLoader _instance = ConfigPropertyLoader.getInstance();
+ Properties p = _instance.getProperties();
+ if (p == null || p.isEmpty()) {
+ throw new RuntimeException("Failed to load config properties file");
+
}
-
- public static void main(String[] args) {
- System.setProperty("test", "value");
-
- ConfigPropertyLoader.loadConfigurationProperties();
- Properties p = ConfigPropertyLoader.getProperties();
- if (p == null || p.isEmpty()) {
- throw new RuntimeException("Failed to load config properties file");
-
- }
- if (p.getProperty("test") == null) {
- throw new RuntimeException("Failed to pickup system property");
- }
- System.out.println("Loaded Config Properties " + p.toString());
+ if (!p.getProperty("test").equalsIgnoreCase("value")) {
+ throw new RuntimeException("Failed to pickup system property");
+ }
+ System.out.println("Loaded Config Properties " + p.toString());
- }
-
+ }
+
}
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,11 +0,0 @@
-package org.teiid.test.framework;
-
-public interface DataSourceSetup {
-
-
- void setup() throws Exception;
-
-
- int getDataSourceCnt();
-
-}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -4,131 +4,155 @@
*/
package org.teiid.test.framework;
-import java.sql.Connection;
import java.util.Properties;
-import java.util.Set;
import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
+import com.metamatrix.core.util.StringUtil;
+public abstract class TransactionContainer {
+ private boolean debug = false;
+
+
+ private String testClassName = null;
-public abstract class TransactionContainer {
+ protected ConnectionStrategy connStrategy;
+ protected Properties props;
+
+ protected TransactionContainer() {
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
- private boolean debug = false;
-
- protected Properties props;
- protected ConnectionStrategy connStrategy;
-
- protected TransactionContainer(ConnectionStrategy strategy){
- this.connStrategy = strategy;
- this.props = new Properties();
- this.props.putAll(this.connStrategy.getEnvironment());
-
+ try {
+ this.connStrategy = ConnectionStrategyFactory
+ .createConnectionStrategy(config);
+ } catch (QueryTestFailedException e) {
+ // TODO Auto-generated catch block
+ throw new TransactionRuntimeException(e);
+ }
+ this.props = new Properties();
+ this.props.putAll(this.connStrategy.getEnvironment());
+ }
+
+
+ public ConnectionStrategy getConnectionStrategy() {
+ return this.connStrategy;
+ }
+
+
+ public void setEnvironmentProperty(String key, String value) {
+ this.getConnectionStrategy().getEnvironment().setProperty(key, value);
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ }
+
+ public void runTransaction(TransactionQueryTestCase test) {
+
+ this.testClassName = StringUtil.getLastToken(test.getClass().getName(),
+ ".");
+
+ try {
+ detail("Start transaction test: " + test.getTestName());
+
+ try {
+ test.setConnectionStrategy(connStrategy);
+
+ test.setup();
+
+ } catch (Throwable e) {
+ if (!test.exceptionExpected()) {
+ e.printStackTrace();
+ }
+ throw new TransactionRuntimeException(e.getMessage());
}
-
-
- protected Set getDataSources() {
- Set dss = null;
-
-
- return dss;
+
+ runTest(test);
+
+ detail("Completed transaction test: " + test.getTestName());
+
+ } finally {
+ debug(" test.cleanup");
+
+ try {
+ test.cleanup();
+ } finally {
+
+ // cleanup all connections created for this test.
+ if (connStrategy != null) {
+ connStrategy.shutdown();
+ }
}
-
-
- protected void before(TransactionQueryTest test){}
-
- protected void after(TransactionQueryTest test) {}
-
- public void runTransaction(TransactionQueryTest test) {
-
- detail("Start transaction test: " + test.getTestName());
+ }
- try {
- test.setDataSources(connStrategy.getDataSources());
- test.setupDataSources();
-
- debug(" setConnection");
- test.setConnection(getConnection());
- test.setExecutionProperties(this.props);
- debug(" before(test)");
-
- before(test);
- debug(" test.before");
+ }
- test.before();
-
- debug(" test.testcase");
+ protected void runTest(TransactionQueryTestCase test) {
+ debug("Start runTest: " + test.getTestName());
- // run the test
- test.testCase();
-
- debug(" test.after");
+ try {
- test.after();
- debug(" after(test)");
+ debug(" before(test)");
- after(test);
-
- detail("End transaction test: " + test.getTestName());
+ before(test);
+ debug(" test.before");
-
- }catch(Throwable e) {
- if (!test.exceptionExpected()) {
- e.printStackTrace();
- }
- throw new TransactionRuntimeException(e.getMessage());
- }finally {
+ test.before();
- }
-
- if (test.exceptionExpected() && !test.exceptionOccurred()) {
- throw new TransactionRuntimeException("Expected exception, but one did not occur");
- }
-
- try {
- detail("Start validation: " + test.getTestName());
+ debug(" test.testcase");
- test.validateTestCase();
-
- detail("End validation: " + test.getTestName());
+ // run the test
+ test.testCase();
- }catch(Exception e) {
- throw new TransactionRuntimeException(e);
- }
-
- debug(" test.cleanup");
+ debug(" test.after");
- test.cleanup();
-
- detail("Completed transaction test: " + test.getTestName());
+ test.after();
+ debug(" after(test)");
+ after(test);
+ debug("End runTest: " + test.getTestName());
+
+ } catch (Throwable e) {
+
+ if (!test.exceptionExpected()) {
+ e.printStackTrace();
+ debug("Error: " + e.getMessage());
+ throw new TransactionRuntimeException(e.getMessage());
+
}
-
- protected Connection getConnection() throws QueryTestFailedException {
- return this.connStrategy.getConnection();
- }
-
- public Properties getEnvironmentProperties() {
- return props;
- }
-
- protected void debug(String message) {
- if (debug) {
- System.out.println(message);
- }
-
- }
-
- protected void detail(String message) {
- System.out.println(message);
- }
-
+ }
-
+ if (test.exceptionExpected() && !test.exceptionOccurred()) {
+ throw new TransactionRuntimeException(
+ "Expected exception, but one did not occur for test: "
+ + this.getClass().getName() + "."
+ + test.getTestName());
+ }
+ }
+
+
+ protected void debug(String message) {
+ if (debug) {
+ System.out.println("[" + this.testClassName + "] " + message);
+ }
+
+ }
+
+ protected void detail(String message) {
+ System.out.println("[" + this.testClassName + "] " + message);
+ }
+
+ protected boolean done() {
+ return true;
+ }
+
}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTestCase.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,207 @@
+package org.teiid.test.framework;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+/**
+ * The TransactionQueryTest interface represents the transaction test lifecycle of execution
+ * from which the @link TransactionContainer operates.
+ * <br><br>
+ * QueryTest lifecycle:</br>
+ *
+ * <br>
+ * There are 4 phases or groupings of methods:
+ * <li>Setup </li>
+ * <li>Test </li>
+ * <li>Validation</li>
+ * <li>Cleanup</li>
+ *
+ * <br>
+ * <p>
+ * <b>1. Setup phase is about setting the global environment for the testing</b>
+ * <br>
+ *
+ * <li>{@link #setConnectionStrategy(ConnectionStrategy)} - called first to provide
+ * the environment (i.e, type of connection, parameters, etc) that the test will
+ * be run under.
+ * <li>{@link #hasRequiredDataSources()} - called after the connection
+ * strategy is set so the determination can be made if this test has the
+ * required datasources defined and available in order to run the test. If not,
+ * then the test is bypassed.
+ * <li>{@link #setup()} - called to enable the test to
+ * perform any pretest (i.e., global) setup. Example would be data source setup.
+ * <li>{@link #setConnection(Connection)} - called to set the client driver (i.e.,
+ * Teiid) connection that will be used to execute queries against
+ * <li>{@link #setExecutionProperties(Properties)} - called at this time so that the
+ * overriding class can obtain / initialize settings that will be assigned when
+ * <li>{@link AbstractQueryTest#assignExecutionProperties(Statement)} is called
+ * prior to sql execution. (Example: set fetch size, batch time, or timeout)
+ * </li>
+ * <br>
+ * <p>
+ * <b>2. Test phase are the methods for executing a test, including any
+ * before/after test logic to support the test</b>
+ * <br><br>
+ *
+ * <li>{@link #before()} called before the execution of the test so that the
+ * transaction boundary can be set and any other pretest conditions
+ * <li>{@link #testCase()} called to execute the specific test
+ * <li>{@link #after()} called after the test is executed, which will commit/rollback the transaction
+ * and perform any other post conditions
+ * </li>
+ * <br>
+ * <p>
+ * <b>3. Validation phase is meant to enable data validation post transaction
+ * completion. This is especially helpful when performing XA transactions
+ * because the results are not completed and available until after the {@link #after()} step
+ * is performed.</b>
+ * <br><br>
+ *
+ * {@link #validateTestCase()}
+ *
+ * <p>
+ * <b>4. Cleanup</b>
+ * <br><br>
+ *
+ * {@link #cleanup()} Called to allow the testcase to perform any cleanup after execution.
+ *
+ * <br>
+ * ================
+ * <p>
+ * <b>Other Notes:</b>
+ * <br><br>
+ *
+ * The following methods were exposed from {@link AbstractQueryTest}:
+ *
+ * <li>{@link #exceptionExpected()} - when an exception is expected to occur, the
+ * underlying logic will treat the execution as if it succeeded. </li>
+ * <li>{@link #exceptionOccurred()} - this method indicates when an exception
+ * actually occurred outside of the normal expected results. </li>
+ * <li>{@link #getConnection()} and {@link #getXAConnection()} - these connection
+ * methods are exposed for {@link #before()} and {@link #after()} methods</li>
+ * <li>{@link #rollbackAllways()} - this is exposed for the {@link #after()} method
+ * as to what behavior is expected after the execution of the test</li>
+ *
+ *
+ * <br>
+ * @author vanhalbert
+ *
+ */
+
+public interface TransactionQueryTestCase {
+
+ /**
+ * Returns the name of the test so that better tracing of what tests are
+ * running/completing.
+ *
+ * @return String is test name
+ */
+ String getTestName();
+
+ /**
+ * Called to set the current connection strategy being used.
+ *
+ * @param connStrategy
+ *
+ * @since
+ */
+ void setConnectionStrategy(ConnectionStrategy connStrategy) throws QueryTestFailedException;
+
+ /**
+ * Called by the {@link TransactionContainer} prior to testcase processing
+ * so that the responsibility for performing an setup duties (ie..,
+ * datasource setup) can be done
+ *
+ *
+ * @since
+ */
+ void setup() throws QueryTestFailedException;
+
+ /**
+ * Called by the @link TransactionContainer to set the Teiid connection to
+ * be used in the test.
+ *
+ * @param conn
+ *
+ * @since
+ */
+ void setConnection(Connection conn);
+
+ /**
+ * Called to set the properties used to initialize prior to execution.
+ *
+ * @param props
+ *
+ * @since
+ */
+// void setExecutionProperties(Properties props);
+
+ /**
+ * Override <code>before</code> if there is behavior that needs to be
+ * performed prior to {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void before();
+
+ /**
+ * Implement testCase(), it is the entry point to the execution of the test.
+ *
+ * @throws Exception
+ *
+ * @since
+ */
+ void testCase() throws Exception;
+
+ /**
+ * Override <code>after</code> if there is behavior that needs to be
+ * performed after {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void after();
+
+ /**
+ * Indicates what should be done when a failure occurs in
+ * {@link #testCase()}
+ *
+ * @return
+ *
+ * @since
+ */
+ boolean rollbackAllways();
+
+ /**
+ * Called at the end of the test so that the testcase can clean itself up by
+ * releasing any resources, closing any open connections, etc.
+ *
+ *
+ * @since
+ */
+ void cleanup();
+
+ /**
+ * Returns the connection being used in the test.
+ *
+ * @return
+ *
+ * @since
+ */
+ Connection getConnection();
+
+ XAConnection getXAConnection();
+
+ boolean exceptionExpected();
+
+ boolean exceptionOccurred();
+
+}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -9,9 +9,7 @@
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
-import java.util.Map;
import java.util.Properties;
import javax.sql.XAConnection;
@@ -20,37 +18,28 @@
import org.teiid.adminapi.AdminOptions;
import org.teiid.adminapi.Model;
import org.teiid.adminapi.VDB;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
import org.teiid.test.framework.datasource.DataSource;
+import org.teiid.test.framework.datasource.DataSourceFactory;
import org.teiid.test.framework.datasource.DataSourceMgr;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
-import com.metamatrix.jdbc.api.ExecutionProperties;
+import com.metamatrix.common.util.PropertiesUtils;
+import com.metamatrix.jdbc.util.MMJDBCURL;
-
public abstract class ConnectionStrategy {
+
- public static final String JNDINAME_USERTXN = "usertxn-jndiname"; //$NON-NLS-1$
-
- public static final String PROCESS_BATCH = "process-batch"; //$NON-NLS-1$
- public static final String CONNECTOR_BATCH = "connector-batch"; //$NON-NLS-1$
-
- public static final String AUTOCOMMIT = "autocommit"; //$NON-NLS-1$
+ private Properties env = null;
+ private DataSourceFactory dsFactory;
- public static final String TXN_AUTO_WRAP = ExecutionProperties.PROP_TXN_AUTO_WRAP;
-
- public static final String FETCH_SIZE = ExecutionProperties.PROP_FETCH_SIZE;
-
- public static final String EXEC_IN_BATCH = "execute.in.batch"; //$NON-NLS-1$
-
-
- private Map<String, DataSource> datasources = null;
-
- public ConnectionStrategy(Properties props) throws QueryTestFailedException {
- this.env = props;
-
+ public ConnectionStrategy(Properties props, DataSourceFactory dsf) {
+ this.env = PropertiesUtils.clone(props);
+
+ this.dsFactory = dsf;
}
/*
@@ -63,6 +52,13 @@
*/
public abstract Connection getConnection() throws QueryTestFailedException;
+ /**
+ * @since
+ */
+ public void shutdown() {
+
+ }
+
public Connection getAdminConnection() throws QueryTestFailedException{
return null;
}
@@ -72,24 +68,19 @@
return autoCommit;
}
- public abstract void shutdown();
public XAConnection getXAConnection() throws QueryTestFailedException {
return null;
}
+
- private Properties env = null;
-
public Properties getEnvironment() {
return env;
}
- public Map<String, DataSource> getDataSources() {
- return this.datasources;
- }
-
+
class CloseInterceptor implements InvocationHandler {
Connection conn;
@@ -112,9 +103,7 @@
void configure() throws QueryTestFailedException {
- datasources = new HashMap<String, DataSource>(3);
-
- String ac = this.env.getProperty(AUTOCOMMIT, "true");
+ String ac = this.env.getProperty(CONNECTION_STRATEGY_PROPS.AUTOCOMMIT, "true");
this.autoCommit = Boolean.getBoolean(ac);
com.metamatrix.jdbc.api.Connection c =null;
@@ -130,32 +119,25 @@
}
Admin admin = (Admin)c.getAdminAPI();
-
-// Properties p = new Properties();
-// if (this.env.getProperty(PROCESS_BATCH) != null) {
-// p.setProperty("metamatrix.buffer.processorBatchSize", this.env.getProperty(PROCESS_BATCH)); //$NON-NLS-1$
-// }
-//
-// if (this.env.getProperty(CONNECTOR_BATCH) != null) {
-// p.setProperty("metamatrix.buffer.connectorBatchSize", this.env.getProperty(CONNECTOR_BATCH)); //$NON-NLS-1$
-// }
setupVDBConnectorBindings(admin);
- admin.restart();
+
+ // admin.restart();
+
+ int sleep = 5;
- System.out.println("Bouncing the system..(wait 15 seconds)"); //$NON-NLS-1$
- Thread.sleep(1000*15);
- // Thread.sleep(1000*60);
+ System.out.println("Bouncing the system..(wait " + sleep + " seconds)"); //$NON-NLS-1$
+ Thread.sleep(1000*sleep);
System.out.println("done."); //$NON-NLS-1$
- } catch (Exception e) {
+ } catch (Throwable e) {
e.printStackTrace();
- throw new TransactionRuntimeException(e);
+ throw new TransactionRuntimeException(e.getMessage());
} finally {
// need to close and flush the connection after restarting
- this.shutdown();
+ // this.shutdown();
}
}
@@ -163,48 +145,74 @@
protected void setupVDBConnectorBindings(Admin api) throws QueryTestFailedException {
try {
+
+ VDB vdb = null;
+ Collection<VDB> vdbs = api.getVDBs("*");
+ if (vdbs == null || vdbs.isEmpty()) {
+ throw new QueryTestFailedException(
+ "AdminApi.GetVDBS returned no vdbs available");
+ }
- Collection<VDB> vdbs = api.getVDBs("*");
- if (vdbs == null) {
- throw new QueryTestFailedException("GetVDBS returned no vdbs available");
-
- } else if (vdbs.size() != 1) {
- throw new QueryTestFailedException("GetVDBS returned more than 1 vdb available");
- }
- VDB vdb = (VDB) vdbs.iterator().next();
- Iterator<Model> modelIt = vdb.getModels().iterator();
- while (modelIt.hasNext() ) {
- Model m = modelIt.next();
-
- if (!m.isPhysical()) continue;
-
- // get the mapping, if defined
- String mappedName = this.env.getProperty(m.getName());
-
- String useName = m.getName();
- if(mappedName != null) {
- useName = mappedName;
- }
+ String urlString = this.env.getProperty(DriverConnection.DS_URL);
+ MMJDBCURL url = new MMJDBCURL(urlString);
+ System.out.println("Trying to match VDB : " + url.getVDBName());
- org.teiid.test.framework.datasource.DataSource ds = DataSourceMgr.getInstance().getDatasource(useName, m.getName());
-
- if (ds != null) {
- datasources.put(m.getName(), ds);
+ for (Iterator iterator = vdbs.iterator(); iterator.hasNext();) {
+ VDB v = (VDB) iterator.next();
+ if (v.getName().equalsIgnoreCase(url.getVDBName())) {
+ vdb = v;
+ }
- System.out.println("Set up Connector Binding (model:mapping:type): " + m.getName() + ":" + useName + ":" + ds.getConnectorType()); //$NON-NLS-1$
+ }
+ if (vdbs == null) {
+ throw new QueryTestFailedException(
+ "GetVDBS did not return a vdb that matched "
+ + url.getVDBName());
+ }
+
+ Iterator<Model> modelIt = vdb.getModels().iterator();
+ while (modelIt.hasNext()) {
+ Model m = modelIt.next();
- AdminOptions ao = new AdminOptions(AdminOptions.OnConflict.OVERWRITE);
- ao.addOption(AdminOptions.BINDINGS_IGNORE_DECRYPT_ERROR);
-
- api.addConnectorBinding(ds.getName(), ds.getConnectorType(), ds.getProperties(), ao);
-
- api.assignBindingToModel(ds.getName(), vdb.getName(), vdb.getVDBVersion(), m.getName());
-
- } else {
- throw new QueryTestFailedException("Error: Unable to create binding to map to model : " + m.getName() + ", the mapped name " + useName + " had no datasource properties defined");
- }
+ if (!m.isPhysical())
+ continue;
- }
+ // get the mapping, if defined
+ String mappedName = this.env.getProperty(m.getName());
+
+ String useName = m.getName();
+ if (mappedName != null) {
+ useName = mappedName;
+ }
+
+ org.teiid.test.framework.datasource.DataSource ds = this.dsFactory
+ .getDatasource(useName, m.getName());
+
+ if (ds != null) {
+
+ System.out
+ .println("Set up Connector Binding (model:mapping:type): " + m.getName() + ":" + useName + ":" + ds.getConnectorType()); //$NON-NLS-1$
+
+ AdminOptions ao = new AdminOptions(
+ AdminOptions.OnConflict.OVERWRITE);
+ ao.addOption(AdminOptions.BINDINGS_IGNORE_DECRYPT_ERROR);
+
+ api.addConnectorBinding(ds.getName(),
+ ds.getConnectorType(), ds.getProperties(), ao);
+
+ api.assignBindingToModel(ds.getName(), vdb.getName(), vdb
+ .getVDBVersion(), m.getName());
+
+ api.startConnectorBinding(ds.getName());
+ } else {
+ throw new QueryTestFailedException(
+ "Error: Unable to create binding to map to model : "
+ + m.getName() + ", the mapped name "
+ + useName
+ + " had no datasource properties defined");
+ }
+
+ }
} catch (QueryTestFailedException qt) {
throw qt;
@@ -215,7 +223,65 @@
}
-
+
+ public synchronized Connection createDriverConnection(String identifier) throws QueryTestFailedException {
+
+ DataSource ds = null;
+ if (identifier != null) {
+ ds = DataSourceMgr.getInstance().getDataSource(identifier);
+ }
+ if (ds == null) {
+ throw new TransactionRuntimeException(
+ "Program Error: DataSource is not mapped to Identifier " + identifier);
+ }
+
+ Connection conn = ds.getConnection();
+
+ if (conn != null) return conn;
+
+ ConnectionStrategy cs = null;
+ if (identifier == null) {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+
+ } else {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ }
+
+ ds.setConnection(cs);
+
+ return ds.getConnection();
-
+
+ }
+
+
+ public synchronized XAConnection createDataSourceConnection(String identifier) throws QueryTestFailedException {
+
+ DataSource ds = null;
+ if (identifier != null) {
+ ds = DataSourceMgr.getInstance().getDataSource(identifier);
+ }
+ if (ds == null) {
+ throw new TransactionRuntimeException(
+ "Program Error: DataSource is not mapped to Identifier " + identifier);
+ }
+
+ XAConnection conn = ds.getXAConnection();
+
+ if (conn != null) return conn;
+
+ ConnectionStrategy cs = null;
+ if (identifier == null) {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ } else {
+ cs = new DriverConnection(ds.getProperties(), this.dsFactory);
+ }
+
+ ds.setXAConnection(cs);
+
+ return ds.getXAConnection();
+
+
+ }
+
}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -4,102 +4,27 @@
*/
package org.teiid.test.framework.connection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
import java.util.Properties;
import org.teiid.test.framework.ConfigPropertyLoader;
import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.datasource.DataSourceFactory;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
+/**
+ * The ConnectionStrategyFactory is responsible for creating a connection strategy that is to be used to provide the type of
+ * connection.
+ * @author vanhalbert
+ *
+ */
public class ConnectionStrategyFactory {
- private static ConnectionStrategyFactory _instance = null;
- /**
- * this strategy represents the connection strategy used to connect to Teiid
- * and is based on the properties loaded by the {@link ConfigPropertyLoader}
- */
- private ConnectionStrategy strategy = null;
- private Map<String, ConnectionStrategy> driversources = null;
- private Map<String, ConnectionStrategy> datasourcesources = null;
- private Map<String, ConnectionStrategy> jeesources = null;
-
-
- private ConnectionStrategyFactory(){
- }
-
- public static synchronized ConnectionStrategyFactory getInstance() {
- if (_instance == null) {
- _instance = new ConnectionStrategyFactory();
- }
- return _instance;
- }
-
- public static synchronized void destroyInstance() {
- if (_instance != null) {
- _instance.shutdown();
-
- _instance = null;
- }
- }
-
- private void shutdown() {
- ConfigPropertyLoader.cleanup();
-
- if (driversources != null) {
- shutDownSources(driversources);
- driversources = null;
- }
-
- if (datasourcesources != null) {
- shutDownSources(datasourcesources);
- datasourcesources = null;
- }
-
- if (jeesources != null) {
- shutDownSources(jeesources);
- jeesources = null;
- }
-
- try {
- strategy.shutdown();
- } catch (Exception e) {
-
- } finally {
- strategy = null;
- }
-
- }
-
- private void shutDownSources(Map<String, ConnectionStrategy> sources) {
- for (Iterator it=sources.keySet().iterator(); it.hasNext(); ){
- ConnectionStrategy cs = sources.get(it.next());
- try {
- cs.shutdown();
- } catch (Exception e) {
-
- }
-
- }
- sources.clear();
-
- }
-
- public synchronized ConnectionStrategy getConnectionStrategy() throws QueryTestFailedException {
- if (strategy == null) {
- this.strategy = create(ConfigPropertyLoader.getProperties());
- }
- return this.strategy;
- }
-
-
- private ConnectionStrategy create(Properties props) throws QueryTestFailedException {
-
+ public static ConnectionStrategy createConnectionStrategy(ConfigPropertyLoader configprops) throws QueryTestFailedException {
ConnectionStrategy strategy = null;
-
+ Properties props = configprops.getProperties();
+
String type = props.getProperty(ConfigPropertyNames.CONNECTION_TYPE, ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION);
if (type == null) {
throw new RuntimeException("Property " + ConfigPropertyNames.CONNECTION_TYPE + " was specified");
@@ -107,15 +32,15 @@
if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.DRIVER_CONNECTION)) {
// pass in null to create new strategy
- strategy = createDriverStrategy(null, props);
+ strategy = new DriverConnection(props, configprops.getDataSourceFactory());
System.out.println("Created Driver Strategy");
}
else if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.DATASOURCE_CONNECTION)) {
- strategy = createDataSourceStrategy(null, props);
+ strategy = new DataSourceConnection(props, configprops.getDataSourceFactory());
System.out.println("Created DataSource Strategy");
}
else if (type.equalsIgnoreCase(ConfigPropertyNames.CONNECTION_TYPES.JNDI_CONNECTION)) {
- strategy = createJEEStrategy(null, props);
+ strategy = new JEEConnection(props, configprops.getDataSourceFactory());
System.out.println("Created JEE Strategy");
}
@@ -126,75 +51,16 @@
// direct connections to the datasource use the static call directly to create strategy and don't need to configure
strategy.configure();
return strategy;
- }
+
+ }
- public synchronized ConnectionStrategy createDriverStrategy(String identifier, Properties props) throws QueryTestFailedException {
- if (driversources == null) {
- driversources = new HashMap<String, ConnectionStrategy>();
- }
-
- if (identifier == null) {
- return new DriverConnection(props);
- }
-
- ConnectionStrategy strategy = null;
- if (driversources.containsKey(identifier)) {
- strategy = driversources.get(identifier);
- } else {
- strategy = new DriverConnection(props);
- driversources.put(identifier, strategy);
- }
-
- return strategy;
-
- }
-
- public synchronized ConnectionStrategy createDataSourceStrategy(String identifier, Properties props) throws QueryTestFailedException {
- if (datasourcesources == null) {
- datasourcesources = new HashMap<String, ConnectionStrategy>();
- }
-
- if (identifier == null) {
- return new DataSourceConnection(props);
- }
-
- ConnectionStrategy strategy = null;
- if (datasourcesources.containsKey(identifier)) {
- strategy = datasourcesources.get(identifier);
- } else {
- strategy = new DataSourceConnection(props);
- datasourcesources.put(identifier, strategy);
- }
-
- return strategy;
-
- }
-
- public synchronized ConnectionStrategy createJEEStrategy(String identifier, Properties props) throws QueryTestFailedException {
- if (jeesources == null) {
- jeesources = new HashMap<String, ConnectionStrategy>();
- }
-
- if (identifier == null) {
- return new JEEConnection(props);
- }
-
- ConnectionStrategy strategy = null;
- if (jeesources.containsKey(identifier)) {
- strategy = jeesources.get(identifier);
- } else {
- strategy = new JEEConnection(props);
- jeesources.put(identifier, strategy);
- }
-
- return strategy;
-
- }
-
-
public static void main(String[] args) {
- ConnectionStrategyFactory cf = ConnectionStrategyFactory.getInstance();
+ //NOTE: to run this test to validate the DataSourceMgr, do the following:
+ // --- need 3 datasources, Oracle, SqlServer and 1 other
+
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
+
+ new DataSourceFactory(config);
}
-
}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -13,6 +13,7 @@
import org.teiid.connector.jdbc.JDBCPropertyNames;
import org.teiid.jdbc.TeiidDataSource;
+import org.teiid.test.framework.datasource.DataSourceFactory;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
@@ -20,134 +21,137 @@
import com.metamatrix.jdbc.EmbeddedDataSource;
public class DataSourceConnection extends ConnectionStrategy {
-
- public static final String DS_USER = "user"; //$NON-NLS-1$
-
- // need both user variables because Teiid uses 'user' and connectors use 'username'
- public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
- public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
-
- // the driver is only used for making direct connections to the source, the
- // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE driver class
- public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
-
- public static final String DS_SERVERNAME = "servername"; //$NON-NLS-1$
- public static final String DS_SERVERPORT = "portnumber"; //$NON-NLS-1$
- public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
- public static final String DS_DATABASENAME = "databasename"; //$NON-NLS-1$
- public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
-
-// public static final String JNDINAME_USERTXN = "usertxn-jndiname"; //$NON-NLS-1$
-
+ public static final String DS_USER = "user"; //$NON-NLS-1$
- private String driver = null;
- private String username = null;
- private String pwd = null;
- private String applName = null;
- private String databaseName = null;
- private String serverName = null;
- private String portNumber = null;
-
-
- private XAConnection xaConnection;
-
- public DataSourceConnection(Properties props) throws QueryTestFailedException {
- super(props);
- }
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+ public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
+ public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
-
+ // the driver is only used for making direct connections to the source, the
+ // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE
+ // driver class
+ public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
- public void validate() {
- databaseName = this.getEnvironment().getProperty(DS_DATABASENAME);
- if (databaseName == null || databaseName.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_DATABASENAME + " was not specified");
- }
-
- serverName = this.getEnvironment().getProperty(DS_SERVERNAME);
- if (serverName == null || serverName.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_SERVERNAME + " was not specified");
- }
+ public static final String DS_SERVERNAME = "ServerName"; //$NON-NLS-1$
+ public static final String DS_SERVERPORT = "PortNumber"; //$NON-NLS-1$
+ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
+ public static final String DS_DATABASENAME = "DatabaseName"; //$NON-NLS-1$
+ public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
-
- this.portNumber = this.getEnvironment().getProperty(DS_SERVERPORT);
-
- this.applName = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
-
- driver = this.getEnvironment().getProperty(DS_DRIVER);
- if (driver == null || driver.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_DRIVER + " was not specified");
- }
-
- this.username = this.getEnvironment().getProperty(DS_USER);
- this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
-
+ private String driver = null;
+ private String username = null;
+ private String pwd = null;
+ private String applName = null;
+ private String databaseName = null;
+ private String serverName = null;
+ private String portNumber = null;
+
+ private XAConnection xaConnection;
+
+ public DataSourceConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
+ }
+
+ public void validate() {
+ databaseName = this.getEnvironment().getProperty(DS_DATABASENAME);
+ if (databaseName == null || databaseName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DATABASENAME
+ + " was not specified");
}
- public Connection getConnection() throws QueryTestFailedException {
- try {
- return getXAConnection().getConnection();
- } catch (QueryTestFailedException qtf) {
- throw qtf;
- } catch (Exception e) {
- e.printStackTrace();
- throw new QueryTestFailedException(e);
- }
- }
-
- public synchronized XAConnection getXAConnection() throws QueryTestFailedException {
- if (xaConnection == null) {
- validate();
- try {
- xaConnection = createConnection();
- } catch (Exception e) {
- throw new QueryTestFailedException(e);
- }
- }
- return xaConnection;
- }
+ serverName = this.getEnvironment().getProperty(DS_SERVERNAME);
+ if (serverName == null || serverName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_SERVERNAME
+ + " was not specified");
+ }
- private XAConnection createConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
- System.out.println("Creating Datasource Connection: \"" + this.serverName + " - " + this.databaseName + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ this.portNumber = this.getEnvironment().getProperty(DS_SERVERPORT);
-
- BaseDataSource dataSource = (BaseDataSource)Class.forName(this.driver).newInstance();
+ this.applName = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
- dataSource.setDatabaseName(this.databaseName);
- if (this.applName != null) {
- dataSource.setApplicationName(this.applName);
- }
-
- if (dataSource instanceof EmbeddedDataSource) {
- ((EmbeddedDataSource)dataSource).setBootstrapFile(this.serverName);
- } else {
- ((TeiidDataSource)dataSource).setServerName(this.serverName);
- ((TeiidDataSource)dataSource).setPortNumber(Integer.parseInt(this.portNumber));
- }
-
- dataSource.setUser("admin");
- dataSource.setPassword("teiid");
-
-// if (this.username != null) {
-// dataSource.setUser(this.username);
-// dataSource.setPassword(this.pwd);
-// }
-
-
- return ((XADataSource)dataSource).getXAConnection();
- }
+ this.driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (this.driver == null || this.driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER
+ + " was not specified");
+ }
- public void shutdown() {
- try {
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ if (username == null) {
+ this.username = this.getEnvironment().getProperty(DS_USERNAME);
+ }
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+ }
- if (this.xaConnection != null) {
- this.xaConnection.close();
- }
- } catch (SQLException e) {
- // ignore..
- }
-
- this.xaConnection = null;
- }
+ public Connection getConnection() throws QueryTestFailedException {
+ try {
+ return getXAConnection().getConnection();
+ } catch (QueryTestFailedException qtf) {
+ throw qtf;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new QueryTestFailedException(e);
+ }
+ }
+
+ public synchronized XAConnection getXAConnection()
+ throws QueryTestFailedException {
+ if (xaConnection == null) {
+ validate();
+ try {
+ xaConnection = createConnection();
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+ return xaConnection;
+ }
+
+ private XAConnection createConnection() throws SQLException,
+ InstantiationException, IllegalAccessException,
+ ClassNotFoundException {
+ System.out
+ .println("Creating Datasource Connection: \"" + this.serverName + " - " + this.databaseName + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ BaseDataSource dataSource = (BaseDataSource) Class.forName(this.driver)
+ .newInstance();
+
+ dataSource.setDatabaseName(this.databaseName);
+ if (this.applName != null) {
+ dataSource.setApplicationName(this.applName);
+ }
+
+ if (dataSource instanceof EmbeddedDataSource) {
+ ((EmbeddedDataSource) dataSource).setBootstrapFile(this.serverName);
+ } else {
+ ((TeiidDataSource) dataSource).setServerName(this.serverName);
+ ((TeiidDataSource) dataSource).setPortNumber(Integer
+ .parseInt(this.portNumber));
+ }
+
+ if (this.username != null) {
+ dataSource.setUser(this.username);
+ dataSource.setPassword(this.pwd);
+ }
+
+ return ((XADataSource) dataSource).getXAConnection(this.username,
+ this.pwd);
+ }
+
+ public void shutdown() {
+ super.shutdown();
+ try {
+
+ if (this.xaConnection != null) {
+ this.xaConnection.close();
+ }
+ } catch (SQLException e) {
+ // ignore..
+ }
+
+ this.xaConnection = null;
+ }
}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -10,135 +10,139 @@
import java.util.Properties;
import org.teiid.connector.jdbc.JDBCPropertyNames;
+import org.teiid.test.framework.datasource.DataSourceFactory;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
-import com.metamatrix.jdbc.api.ExecutionProperties;
+/**
+ * The DriverConnection strategy that can get connections in standalone mode or
+ * embedded mode.
+ */
+public class DriverConnection extends ConnectionStrategy {
+ public static final String DS_USER = "user"; //$NON-NLS-1$
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+ public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
+ public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
-/**
- * The DriverConnection strategy that can get connections in standalone mode
- * or embedded mode.
- */
-public class DriverConnection extends ConnectionStrategy{
-
- public static final String DS_USER = "user"; //$NON-NLS-1$
-
- // need both user variables because Teiid uses 'user' and connectors use 'username'
- public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
- public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD; //$NON-NLS-1$
-
- // the driver is only used for making direct connections to the source, the
- // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE driver class
- public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
-
- public static final String DS_URL = JDBCPropertyNames.URL; //$NON-NLS-1$
- public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
-
-
+ // the driver is only used for making direct connections to the source, the
+ // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE
+ // driver class
+ public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
+
+ public static final String DS_URL = JDBCPropertyNames.URL; //$NON-NLS-1$
+ public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
+
private String url = null;
private String driver = null;
private String username = null;
private String pwd = null;
-
+
private Connection connection;
-
- public DriverConnection(Properties props) throws QueryTestFailedException {
- super(props);
- validate();
+
+ public DriverConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
+ validate();
}
-
- public void validate() {
- String urlProp = this.getEnvironment().getProperty(DS_URL);
- if (urlProp == null || urlProp.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_URL + " was not specified");
- }
- StringBuffer urlSB = new StringBuffer(urlProp);
-
- String appl = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
- if (appl != null) {
- urlSB.append(";");
- urlSB.append("ApplicationName").append("=").append(appl);
- }
-
- url = urlSB.toString();
-
- driver = this.getEnvironment().getProperty(DS_DRIVER);
- if (driver == null || driver.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_DRIVER + " was not specified");
- }
-
- // need both user variables because Teiid uses 'user' and connectors use 'username'
+ public void validate() {
- this.username = this.getEnvironment().getProperty(DS_USER);
- if (username == null) {
- this.username = this.getEnvironment().getProperty(DS_USERNAME);
- }
- this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
-
- try {
- // Load jdbc driver
- Class.forName(driver);
- } catch (ClassNotFoundException e) {
- throw new TransactionRuntimeException(e);
- }
-
+ String urlProp = this.getEnvironment().getProperty(DS_URL);
+ if (urlProp == null || urlProp.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_URL
+ + " was not specified");
}
+ StringBuffer urlSB = new StringBuffer(urlProp);
- public synchronized Connection getConnection() throws QueryTestFailedException {
- if (this.connection != null) {
- try {
- if (!this.connection.isClosed()) {
- return this.connection;
- }
- } catch (SQLException e) {
+ String appl = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
+ if (appl != null) {
+ urlSB.append(";");
+ urlSB.append("ApplicationName").append("=").append(appl);
+ }
- }
-
- }
-
- this.connection = getJDBCConnection(this.driver, this.url, this.username, this.pwd);
- return this.connection;
- }
-
-
- private Connection getJDBCConnection(String driver, String url, String user, String passwd) throws QueryTestFailedException {
+ url = urlSB.toString();
- System.out.println("Creating Driver Connection: \"" + url + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (driver == null || driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER
+ + " was not specified");
+ }
- Connection conn;
- try {
- // Create a connection
- if (user != null && user.length() > 0) {
- conn = DriverManager.getConnection(url, user, passwd);
- } else {
- conn = DriverManager.getConnection(url);
- }
-
-
- } catch (SQLException e) {
- throw new QueryTestFailedException(e);
- } catch (Throwable t) {
- t.printStackTrace();
- throw new QueryTestFailedException(t.getMessage());
- }
- return conn;
-
+ // need both user variables because Teiid uses 'user' and connectors use
+ // 'username'
+
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ if (username == null) {
+ this.username = this.getEnvironment().getProperty(DS_USERNAME);
+ }
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+
+ try {
+ // Load jdbc driver
+ Class.forName(driver);
+ } catch (ClassNotFoundException e) {
+ throw new TransactionRuntimeException(e);
+ }
+
}
-
+
+ public synchronized Connection getConnection()
+ throws QueryTestFailedException {
+ if (this.connection != null) {
+ try {
+ if (!this.connection.isClosed()) {
+ return this.connection;
+ }
+ } catch (SQLException e) {
+
+ }
+
+ }
+
+ this.connection = getJDBCConnection(this.driver, this.url,
+ this.username, this.pwd);
+ return this.connection;
+ }
+
+ private Connection getJDBCConnection(String driver, String url,
+ String user, String passwd) throws QueryTestFailedException {
+
+ System.out.println("Creating Driver Connection: \"" + url + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Connection conn;
+ try {
+ // Create a connection
+ if (user != null && user.length() > 0) {
+ conn = DriverManager.getConnection(url, user, passwd);
+ } else {
+ conn = DriverManager.getConnection(url);
+ }
+
+ } catch (SQLException e) {
+ throw new QueryTestFailedException(e);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ throw new QueryTestFailedException(t.getMessage());
+ }
+ return conn;
+
+ }
+
public void shutdown() {
- if (this.connection != null) {
- try {
- this.connection.close();
- } catch (Exception e) {
- //ignore
- }
- }
-
- this.connection = null;
-
+ super.shutdown();
+ if (this.connection != null) {
+ try {
+ this.connection.close();
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ this.connection = null;
+
}
}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -10,58 +10,60 @@
import javax.naming.InitialContext;
import javax.sql.DataSource;
+import org.teiid.test.framework.datasource.DataSourceFactory;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
+/**
+ * JEE (JNDI) Connection Strategy, when the test is run inside an application
+ * server. Make sure all the jndi names are set correctly in the properties
+ * file.
+ */
+public class JEEConnection extends ConnectionStrategy {
+ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
-/**
- * JEE (JNDI) Connection Strategy, when the test is run inside an application server. Make
- * sure all the jndi names are set correctly in the properties file.
- */
-public class JEEConnection extends ConnectionStrategy{
-
- public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
-
- private String jndi_name = null;
-
-
- public JEEConnection(Properties props) throws QueryTestFailedException {
- super(props);
+ private String jndi_name = null;
+
+
+ public JEEConnection(Properties props,
+ DataSourceFactory dsf) throws QueryTestFailedException {
+ super(props, dsf);
}
public Connection getConnection() throws QueryTestFailedException {
- validate();
- try {
- InitialContext ctx = new InitialContext();
- DataSource source = (DataSource)ctx.lookup(jndi_name);
-
+ validate();
+ try {
+ InitialContext ctx = new InitialContext();
+ DataSource source = (DataSource) ctx.lookup(jndi_name);
- if (source == null) {
- String msg = "Unable to find jndi source " + jndi_name;//$NON-NLS-1$
+ if (source == null) {
+ String msg = "Unable to find jndi source " + jndi_name;//$NON-NLS-1$
- QueryTestFailedException mme = new QueryTestFailedException(msg);//$NON-NLS-1$
- throw mme;
- }
- Connection conn = source.getConnection();
- return conn;
- } catch (QueryTestFailedException qtfe) {
- throw qtfe;
- } catch (Exception e) {
- throw new QueryTestFailedException(e);
- }
- }
-
+ QueryTestFailedException mme = new QueryTestFailedException(msg);//$NON-NLS-1$
+ throw mme;
+ }
+ Connection conn = source.getConnection();
+ return conn;
+ } catch (QueryTestFailedException qtfe) {
+ throw qtfe;
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+
public void shutdown() {
- // no connection management here; app server takes care of these..
+ super.shutdown();
+ // no connection management here; app server takes care of these..
}
- public void validate() {
- // TODO Auto-generated method stub
-
- jndi_name = getEnvironment().getProperty(DS_JNDINAME);
- if (jndi_name == null || jndi_name.length() == 0) {
- throw new TransactionRuntimeException("Property " + DS_JNDINAME + " was not specified");
- }
- }
+ public void validate() {
+ // TODO Auto-generated method stub
+
+ jndi_name = getEnvironment().getProperty(DS_JNDINAME);
+ if (jndi_name == null || jndi_name.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_JNDINAME
+ + " was not specified");
+ }
+ }
}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,30 +1,42 @@
package org.teiid.test.framework.datasource;
-import java.util.HashMap;
-import java.util.Map;
+import java.sql.Connection;
import java.util.Properties;
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+/**
+ * DataSource represents a single database that was configured by a connection.properties file.
+ * @author vanhalbert
+ *
+ */
public class DataSource {
- public static final String CONNECTOR_TYPE="connectortype";
- public static final String DIRECTORY="dir";
+ public static final String CONNECTOR_TYPE="db.connectortype";
public static final String DB_TYPE="db.type";
- static Map<String, String> dbtypeBitMaskMap = null;
-
-
private Properties props;
private String name;
private String group;
private String dbtype;
- private int bitMask;
+ // The connections are stored in the datasource and are reused
+ // for the duration of all tests so thats there's not
+ // disconnect/connect being performed over and over
+ private ConnectionStrategy conn;
+ private ConnectionStrategy xaconn;
+
+ public DataSource() {
+ this.name = "notassigned";
+ }
public DataSource(String name, String group, Properties properties) {
this.name = name;
this.group = group;
this.props = properties;
this.dbtype = this.props.getProperty(DB_TYPE);
- this.setBitMask();
}
@@ -51,88 +63,28 @@
public String getDBType() {
return this.dbtype;
}
-
- public int getBitMask() {
- return this.bitMask;
- }
- /**
- * These types match the "ddl" directories for supported database types
- * and it also found in the datasources connection.properties defined by the DB_TYPE property
- * @author vanhalbert
- *
- */
- public static interface DataSourcTypes{
- public static String MYSQL = "mysql";
- public static String ORACLE = "oracle";
- public static String POSTRES = "postgres";
- public static String SQLSERVER = "sqlserver";
- public static String DB2 = "db2";
- public static String SYBASE = "sybase";
- public static String DERBY = "derby";
-
+ public Connection getConnection() throws QueryTestFailedException {
+ if (this.conn == null) return null;
+
+ return this.conn.getConnection();
}
-
- /**
- * These bitmask are used by the test to indicate which database type(s) a specific
- * test is not supported to run against.
- *
- * The exclusion postion was taken because the goal is that all test should be able to
- * run against all sources. However, there are cases where specific database type
- * test are needed.
- *
- *
- * @author vanhalbert
- *
- */
- public static interface ExclusionTypeBitMask{
-
- // Constants to hold bit masks for desired flags
- static final int NONE_EXCLUDED = 0; // 000...00000000 (empty mask)
- static final int MYSQL = 1; // 2^^0 000...00000001
- static final int ORACLE = 2; // 2^^1 000...00000010
- static final int POSTGRES = 4; // 2^^2 000...00000100
- static final int SQLSERVER = 8; // 2^^3 000...00001000
- static final int DB2 = 16; // 2^^4 000...00010000
- static final int SYBASE = 32; // 2^^5 000...00100000
- static final int DERBY = 64; // 2^^6 000...01000000
-
+ public void setConnection(ConnectionStrategy c) {
+ this.conn = c;
}
- // don't include excluded
- public static int NumBitMasks = 7;
-//
-// static int ALLOWABLE_DATA_TYPES = ExclusionTypeBitMask.MYSQL |
-// ExclusionTypeBitMask.ORACLE |
-// ExclusionTypeBitMask.POSTGRES |
-// ExclusionTypeBitMask.SQLSERVER |
-// ExclusionTypeBitMask.DB2 |
-// ExclusionTypeBitMask.SYBASE |
-// ExclusionTypeBitMask.DERBY;
- static {
- dbtypeBitMaskMap = new HashMap<String, String>(NumBitMasks );
- dbtypeBitMaskMap.put(DataSourcTypes.MYSQL, String.valueOf(ExclusionTypeBitMask.MYSQL));
- dbtypeBitMaskMap.put(DataSourcTypes.ORACLE, String.valueOf(ExclusionTypeBitMask.ORACLE));
- dbtypeBitMaskMap.put(DataSourcTypes.POSTRES, String.valueOf(ExclusionTypeBitMask.POSTGRES));
- dbtypeBitMaskMap.put(DataSourcTypes.DB2, String.valueOf(ExclusionTypeBitMask.DB2));
- dbtypeBitMaskMap.put(DataSourcTypes.SQLSERVER, String.valueOf(ExclusionTypeBitMask.SQLSERVER));
- dbtypeBitMaskMap.put(DataSourcTypes.SYBASE, String.valueOf(ExclusionTypeBitMask.SYBASE));
- dbtypeBitMaskMap.put(DataSourcTypes.DERBY, String.valueOf(ExclusionTypeBitMask.DERBY));
-
+ public XAConnection getXAConnection() throws QueryTestFailedException {
+ if (this.xaconn == null) return null;
+
+ return this.xaconn.getXAConnection();
}
- public void setBitMask() {
- int rtn = ExclusionTypeBitMask.NONE_EXCLUDED;
-
- String bitmask = dbtypeBitMaskMap.get(dbtype);
- if (bitmask == null) {
- bitMask = rtn;
- } else {
- bitMask = new Integer(bitmask).intValue();
- }
+ public void setXAConnection(ConnectionStrategy xaconn) {
+ this.xaconn = xaconn;
}
-
+
+
}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSourceFactory.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,569 @@
+package org.teiid.test.framework.datasource;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.ConfigPropertyNames;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+import com.metamatrix.common.util.PropertiesUtils;
+import com.metamatrix.core.util.StringUtil;
+
+
+/**
+ * The DataSourceFactory is responsible for managing the datasources used during a single test.
+ * It ensures the same data source is used in both the connector binding and during validation to ensure validation is performed
+ * against the same datasource the test was performed on.
+ *
+ * The following are the available options for controlling which datasources are used during a test:
+ * <li>Control which datasources are used and to which model they are assigned</li>
+ *
+ * <p>
+ * Use the {@link ConfigPropertyNames#USE_DATASOURCES_PROP} property to specify a comma delimited ordered list to control which data sources to use.
+ *
+ * <br><br>
+ * This will enable integration testing to be setup to use well known combinations, to ensure coverage and makes it easier to replicate issues.
+ *
+ * This indicates to use only the specified datasources for this test. This option can be used in test cases where only
+ * specific sources are to be used and tested against.
+ *
+ * This ordered list will map to the model:order mapping in the config.properties file.
+ * <br><br>
+ * Example: in the config.properties file, the models in the test and their order can be specified:
+ * <li> pm1=1 </li>
+ * <li> pm2=2 </li>
+ * <br>
+ *
+ * Then set property: ConfigPropertyNames.USE_DATASOURCES_PROP=oracle,sqlserver
+ *
+ * This will use oracle and sqlserver datasources in the test, and when a datasource is requested for model "pm1", the oracle datasource will be returned. And when a data source
+ * for "pm2" is requested, the data source mapped to 2nd ordered datasource of sqlserver will be returned.
+ *
+ * </p>
+ * <li>Control which datasources of a specific database type to exclude</li>
+ * <p>
+ *
+ * Use the {@link ConfigPropertyNames#EXCLUDE_DATASBASE_TYPES_PROP} property to specify a comma delimited list of {@link DataBaseTypes} to exclude.
+ * <br><br>
+ * This will remove all datasources of a specific database type from the list of available datasources. This option will be applied after
+ * {@link ConfigPropertyNames#USE_DATASOURCES_PROP} option. This is done because there are some test that will not work with certain database
+ * types, and therefore, if the required datasources are not met, the test will be bypassed for execution.
+ *</p>
+ * <li>Control for a specfic model, which database type of datasource to be assigned</li>
+ * <p>
+ * This option gives the developer even more fine grain control of how datasources are assigned. There are cases where a specific model must be assigned
+ * to a datasource of a specific database type.
+ *
+ * To use this option,
+ *
+ * </p>
+ * @author vanhalbert
+ *
+ */
+public class DataSourceFactory {
+
+ /**
+ * These types match the "ddl" directories for supported database types
+ * and it also found in the datasources connection.properties defined by the DB_TYPE property
+ * These are also the values used to specify the required database types.
+ *
+ */
+ public static interface DataBaseTypes{
+ public static String MYSQL = "mysql";
+ public static String ORACLE = "oracle";
+ public static String POSTRES = "postgres";
+ public static String SQLSERVER = "sqlserver";
+ public static String DB2 = "db2";
+ public static String SYBASE = "sybase";
+ public static String DERBY = "derby";
+ public static String ANY = "any";
+
+ }
+
+ // the DO_NO_USE_DEFAULT will be passed in when the test are run from maven and no property is passed in for UseDataSources
+ private static final String DO_NOT_USE_DEFAULT="${usedatasources}";
+
+ private DataSourceMgr dsmgr = DataSourceMgr.getInstance();
+
+// private ConfigPropertyLoader configprops;
+
+ private Properties configprops;
+
+ // contains the names of the datasources when the -Dusedatasources option is used
+ private Map<String, String> useDS = null;
+
+ // contains all the datasources available to be used
+ private Map<String, DataSource> availDS = null;
+
+
+ // contains any dbtype preconditions on a model, which requires a model to be assigned a certain database type
+ private Map<String, String> requiredDataBaseTypes = null; // key=modelname value=dbtype
+
+ // this set is use to track datasources that have already been assigned
+ private Set<String> assignedDataSources = new HashSet<String>();
+
+ private int lastassigned = 0;
+
+ // indicates if the datasource requirements have been, it will be false in the case
+ // a specific dbtype is required and that type was not one of the available types defined
+ private boolean metDBRequiredTypes = true;
+
+ // indicates that there are required dbtypes to consider
+ private boolean hasRequiredDBTypes = false;
+
+
+ public DataSourceFactory(ConfigPropertyLoader config) {
+ this.configprops = PropertiesUtils.clone(config.getProperties(), null, true);
+ this.requiredDataBaseTypes = config.getModelAssignedDatabaseTypes();
+ config();
+ }
+
+ public Properties getConfigProperties() {
+ return this.configprops;
+ }
+
+ /**
+ * config is called at the start / setup of the {@link
+ * TransactionContainer#} test. This is to ensure any exclusions /
+ * inclusions are considered for the next executed set of test.
+ *
+ *
+ * 1st, check for the usedatasource property, if exist, then only add those specific datasources
+ * to the useDataSources, otherwise add all available.
+ * 2nd, if the exclude option is used, then remove any excluded datasources from the useDataSources.
+ *
+ * @since
+ */
+ private void config() {
+ System.out.println("Configure Datasource Factory ");
+
+ Map<String, DataSource> availDatasources = dsmgr.getDataSources();
+
+ availDS = new HashMap<String, DataSource>(availDatasources.size());
+
+ String usedstypeprop = configprops
+ .getProperty(ConfigPropertyNames.USE_DATASOURCE_TYPES_PROP);
+
+ Set<String> useDBTypes = null;
+
+ if (usedstypeprop != null && usedstypeprop.length() > 0) {
+ List<String> eprops = StringUtil.split(usedstypeprop, ",");
+ useDBTypes = new HashSet<String>(eprops.size());
+ useDBTypes.addAll(eprops);
+ System.out.println("EXCLUDE datasources: " + usedstypeprop);
+ } else {
+ useDBTypes = Collections.EMPTY_SET;
+ }
+
+ String excludeprop = configprops
+ .getProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP);
+
+ Set<String> excludedDBTypes = null;
+
+ if (excludeprop != null && excludeprop.length() > 0) {
+ List<String> eprops = StringUtil.split(excludeprop, ",");
+ excludedDBTypes = new HashSet<String>(eprops.size());
+ excludedDBTypes.addAll(eprops);
+ System.out.println("EXCLUDE datasources: " + excludeprop);
+ } else {
+ excludedDBTypes = Collections.EMPTY_SET;
+ }
+
+
+ String limitdsprop = configprops
+ .getProperty(ConfigPropertyNames.USE_DATASOURCES_PROP);
+ if (limitdsprop != null && limitdsprop.length() > 0 && ! limitdsprop.equalsIgnoreCase(DO_NOT_USE_DEFAULT)) {
+ System.out.println("Use ONLY datasources: " + limitdsprop);
+
+ List<String> dss = StringUtil.split(limitdsprop, ",");
+
+ useDS = new HashMap<String, String>(dss.size());
+ DataSource ds = null;
+ int i = 1;
+ for (Iterator<String> it = dss.iterator(); it.hasNext(); i++) {
+ String dssName = it.next();
+ ds = availDatasources.get(dssName);
+
+ if (ds != null && !excludedDBTypes.contains(ds.getDBType())) {
+
+ useDS.put(String.valueOf(i), dssName);
+
+ availDS.put(dssName, ds);
+ System.out.println("Using ds: " + dssName);
+ }
+
+ }
+
+ } else {
+ for (Iterator<DataSource> it = availDatasources.values().iterator(); it.hasNext(); ) {
+ DataSource ds = it.next();
+ // if the datasource type is not excluded, then consider for usages
+ if (!excludedDBTypes.contains(ds.getDBType())) {
+
+ // if use a specific db type is specified, then it must match,
+ // otherwise add it to the available list
+ if (useDBTypes.size() > 0 && usedstypeprop.contains(ds.getDBType())) {
+ availDS.put(ds.getName(), ds);
+ } else {
+ availDS.put(ds.getName(), ds);
+ }
+
+ }
+ }
+
+
+ }
+
+
+
+ if (requiredDataBaseTypes != null && requiredDataBaseTypes.size() > 0) {
+ this.hasRequiredDBTypes = true;
+
+ Iterator<String> rit = this.requiredDataBaseTypes.keySet().iterator();
+
+ // go thru all the datasources and remove those that are excluded
+ while (rit.hasNext()) {
+ String modelName = rit.next();
+ String rdbtype = this.requiredDataBaseTypes.get(modelName);
+
+ Iterator<DataSource> ait = availDS.values().iterator();
+
+ metDBRequiredTypes = false;
+
+ // go thru all the datasources and find the matching datasource of the correct dbtype
+ while (ait.hasNext()) {
+ DataSource ds = ait.next();
+ if (ds.getDBType().equalsIgnoreCase(rdbtype)) {
+ assignedDataSources.add(ds.getName());
+
+ dsmgr.setDataSource(modelName, ds);
+ // modelToDatasourceMap.put(modelName, ds);
+ metDBRequiredTypes = true;
+
+ }
+
+ }
+
+ if (!metDBRequiredTypes) {
+ // did find a required dbtype, no need going any further
+ break;
+ }
+
+ }
+
+ }
+
+
+ }
+
+ public int getNumberAvailableDataSources() {
+ return (metDBRequiredTypes ? this.availDS.size() :0);
+ }
+
+ public synchronized DataSource getDatasource(String datasourceid,
+ String modelName) throws QueryTestFailedException {
+ DataSource ds = null;
+
+ // map the datasource to the model and datasourceid
+ // this is so the next time this combination is requested,
+ // the same datasource is returned to ensure when consecutive calls
+ // during the process
+ // corresponds to the same datasource
+ String key = null;
+
+ key = modelName;
+ //+ "_" + datasourceid;
+
+ // if the datasourceid represents a group name, then use the group name
+ // so that all future request using that group name for a specified
+ // model
+ // will use the same datasource
+
+ ds = dsmgr.getDataSource(key);
+ if (ds != null) {
+ return ds;
+ }
+
+ if (this.hasRequiredDBTypes) {
+ if (this.requiredDataBaseTypes.containsKey(modelName)) {
+ String dbtype = this.requiredDataBaseTypes.get(modelName);
+
+ Iterator<DataSource> it = availDS.values().iterator();
+
+ // need to go thru all the datasources to know if any has already been
+ // assigned
+ // because the datasourceid passed in was a group name
+ while (it.hasNext()) {
+ DataSource checkit = it.next();
+
+ if (dbtype.equalsIgnoreCase(checkit.getDBType())) {
+ ds = checkit;
+ break;
+ }
+
+ }
+
+
+ }
+
+ } else if (useDS != null) {
+ String dsname = useDS.get(datasourceid);
+ if (dsname != null) {
+ ds = availDS.get(dsname);
+ if (ds == null) {
+ throw new QueryTestFailedException("Datasource name "
+ + dsname
+ + " was not found in the allDatasources map");
+
+ }
+ }
+
+
+ } else {
+
+ Iterator<DataSource> it = availDS.values().iterator();
+
+ // need to go thru all the datasources to know if any has already been
+ // assigned
+ // because the datasourceid passed in was a group name
+ while (it.hasNext()) {
+ DataSource checkit = it.next();
+
+ if (!assignedDataSources.contains(checkit.getName())) {
+ ds = checkit;
+ break;
+ }
+
+ }
+ }
+
+ if (ds == null) {
+ int cnt = 0;
+ Iterator<String> itds = assignedDataSources.iterator();
+
+ // when all the datasources have been assigned, but a new model
+ // datasource id is
+ // passed in, need to reassign a previously assigned datasource
+ // This case will happen when more models are defined than there are
+ // defined datasources.
+ while (itds.hasNext()) {
+ String dsname = itds.next();
+
+ if (cnt == this.lastassigned) {
+
+ ds = availDS.get(dsname);
+
+ this.lastassigned++;
+ if (lastassigned >= assignedDataSources.size()) {
+ this.lastassigned = 0;
+ }
+
+ break;
+ }
+ }
+
+ }
+
+ if (ds == null) {
+ throw new QueryTestFailedException(
+ "Unable to assign a datasource for model:datasourceid "
+ + modelName + ":" + datasourceid);
+
+ }
+
+ assignedDataSources.add(ds.getName());
+
+ dsmgr.setDataSource(key, ds);
+ return ds;
+
+ }
+
+ public void cleanup() {
+
+ dsmgr.clear();
+ assignedDataSources.clear();
+ requiredDataBaseTypes.clear();
+
+ if (useDS != null) useDS.clear();
+ if (availDS != null) availDS.clear();
+
+ }
+
+ public static void main(String[] args) {
+ //NOTE: to run this test to validate the DataSourceMgr, do the following:
+ // --- need 3 datasources, Oracle, SqlServer and 1 other
+
+ ConfigPropertyLoader config = ConfigPropertyLoader.getInstance();
+
+ DataSourceFactory factory = new DataSourceFactory(config);
+
+ try {
+ if (factory.getDatasource("1", "model1") == null) {
+ throw new RuntimeException("No datasource was not found");
+ }
+
+
+ } catch (QueryTestFailedException e) {
+ e.printStackTrace();
+ }
+
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ // the following verifies that order of "use" datasources is applied to request for datasources.
+ config = ConfigPropertyLoader.getInstance();
+
+ config.setProperty(ConfigPropertyNames.USE_DATASOURCES_PROP, "oracle,sqlserver");
+
+ factory = new DataSourceFactory(config);
+
+ try {
+
+ DataSource dsfind = factory.getDatasource("2", "model2");
+ if (dsfind == null) {
+ throw new RuntimeException("No datasource was not found as the 2nd datasource");
+
+ }
+
+ if (dsfind.getConnectorType() == null) {
+ throw new RuntimeException("Connector types was not defined");
+ }
+
+ if (!dsfind.getName().equalsIgnoreCase("sqlserver")) {
+ throw new RuntimeException("Sqlserver was not found as the 2nd datasource");
+
+ }
+
+ dsfind = factory.getDatasource("1", "model1");
+ if (dsfind == null) {
+ throw new RuntimeException("No datasource was not found as the 2nd datasource");
+
+ }
+ if (!dsfind.getName().equalsIgnoreCase("oracle")) {
+ throw new RuntimeException("Oracle was not found as the 2nd datasource");
+
+ }
+ System.out.println("Datasource :" + dsfind.getName() + " was found");
+
+
+ // the following test verifies that a sqlserver datasource is not
+ // returned (excluded)
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ config = ConfigPropertyLoader.getInstance();
+ config.setProperty(ConfigPropertyNames.EXCLUDE_DATASBASE_TYPES_PROP, "sqlserver");
+
+
+ factory = new DataSourceFactory(config);
+
+ int n = factory.getNumberAvailableDataSources();
+ System.out.println("Num avail datasources: " + n);
+
+ for (int i=0; i<n; i++) {
+
+ String k = String.valueOf(i);
+ DataSource ds1 = factory.getDatasource(k, "model" + k);
+ if (ds1 == null) {
+ throw new RuntimeException("No datasource was found for: model:" + k);
+
+ } if (ds1.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("sqlserver dbtype should have been excluded");
+ }
+ }
+
+
+ DataSource reuse = factory.getDatasource(String.valueOf(n + 1), "model1");
+ if (reuse != null) {
+
+ } else {
+ throw new RuntimeException("The process was not able to reassign an already used datasource");
+
+ }
+
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+
+ // test required database types
+ // test 1 source
+
+ config = ConfigPropertyLoader.getInstance();
+
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ORACLE);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds1 = factory.getDatasource("1","pm1");
+ if (!ds1.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.ORACLE)) {
+ throw new RuntimeException("Required DB Type of oracle for model pm1 is :" + ds1.getDBType());
+ }
+
+ System.out.println("Test1 Required DS1 " + ds1.getDBType());
+ factory.cleanup();
+
+ ConfigPropertyLoader.cleanup();
+
+ // test required database types
+ // test 2 sources, 1 required and other ANY
+ config = ConfigPropertyLoader.getInstance();
+
+
+ config.setModelAssignedToDatabaseType("pm2", DataSourceFactory.DataBaseTypes.SQLSERVER);
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ANY);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds2 = factory.getDatasource("2","pm2");
+ if (!ds2.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("Required DB Type of sqlserver for model pm2 is :" + ds2.getDBType());
+ }
+ System.out.println("Test2 Required DS2 " + ds2.getDBType());
+
+ factory.cleanup();
+ ConfigPropertyLoader.cleanup();
+
+
+ // test required database types
+ // test 2 sources, 2 required
+ config = ConfigPropertyLoader.getInstance();
+
+
+ config.setModelAssignedToDatabaseType("pm2", DataSourceFactory.DataBaseTypes.SQLSERVER);
+ config.setModelAssignedToDatabaseType("pm1", DataSourceFactory.DataBaseTypes.ORACLE);
+
+ factory = new DataSourceFactory(config);
+
+ DataSource ds3a = factory.getDatasource("2","pm2");
+ if (!ds3a.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.SQLSERVER)) {
+ throw new RuntimeException("Required DB Type of sqlserver for model pm12 is :" + ds3a.getDBType());
+ }
+
+ DataSource ds3b = factory.getDatasource("2","pm1");
+ if (!ds3b.getDBType().equalsIgnoreCase(DataSourceFactory.DataBaseTypes.ORACLE)) {
+ throw new RuntimeException("Required DB Type of oracle for model pm1 is :" + ds3b.getDBType());
+ }
+ System.out.println("Test3 Required DS3a " + ds3a.getDBType());
+ System.out.println("Test3 Required DS3b " + ds3b.getDBType());
+
+ factory.cleanup();
+
+
+ } catch (QueryTestFailedException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataStore.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.datasource;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+/**
+ * This class loads the data in the databases specified, to a known state
+ */
+public class DataStore {
+
+ /**
+ * Called at the start of all the tests to initialize the database to ensure
+ * it's in the proper state.
+ *
+ * @param connStrategy
+ */
+ public static void initialize(ConnectionStrategy connStrategy) {
+// ConfigPropertyLoader.cleanup();
+// ConfigPropertyLoader.getInstance();
+ try {
+ load(getConnection("pm1", connStrategy));
+
+ load(getConnection("pm2", connStrategy));
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static Connection getConnection(String identifier, ConnectionStrategy connStrategy) throws QueryTestFailedException {
+ Connection conn = connStrategy.createDriverConnection(identifier);
+ // force autocommit back to true, just in case the last user didnt
+ try {
+ conn.setAutoCommit(true);
+ } catch (Exception sqle) {
+ throw new QueryTestFailedException(sqle);
+ }
+
+ return conn;
+ }
+
+ private static void load(Connection c) throws Exception {
+ // DDL
+ // drop table g1;
+ // drop table g2;
+
+ // oracle
+ // create Table g1 (e1 number(5) PRIMARY KEY, e2 varchar2(50));
+ // create Table g2 (e1 number(5) REFERENCES g1, e2 varchar2(50));
+
+ // SQL Server
+ // create Table g1 (e1 int PRIMARY KEY, e2 varchar(50));
+ // create Table g2 (e1 int references g1, e2 varchar(50));
+
+
+ Statement stmt = c.createStatement();
+ stmt.addBatch("delete from g2");
+ stmt.addBatch("delete from g1");
+
+ for (int i = 0; i < 100; i++) {
+ stmt.addBatch("insert into g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+
+ for (int i = 0; i < 50; i++) {
+ stmt.addBatch("insert into g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ stmt.executeBatch();
+ stmt.close();
+
+ }
+
+ /**
+ * Called as part of the setup for each test.
+ * This will set the database state as if {@link #initialize(ConnectionStrategy)} was called.
+ * However, for performance reasons, the process goes about removing what's not needed instead of cleaning out everything
+ * and reinstalling.
+ * @param connStrategy
+ */
+ public static void setup(ConnectionStrategy connStrategy) {
+ try {
+ setUpTest(getConnection("pm1", connStrategy));
+
+ setUpTest(getConnection("pm2", connStrategy));
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+
+ }
+
+ private static void setUpTest(Connection c) throws Exception {
+
+ Statement stmt = c.createStatement();
+ stmt.addBatch("delete from g2 where e1 >= 50"); //$NON-NLS-1$
+ stmt.addBatch("delete from g1 where e1 >= 100");
+
+ stmt.executeBatch();
+ stmt.close();
+
+
+ }
+
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/query)
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2000-2007 MetaMatrix, Inc.
- * All rights reserved.
- */
-package org.teiid.test.framework.query;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Properties;
-
-import javax.sql.XAConnection;
-
-import org.teiid.test.framework.TransactionContainer;
-import org.teiid.test.framework.TransactionQueryTestCase;
-import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
-import org.teiid.test.framework.connection.ConnectionStrategy;
-import org.teiid.test.framework.datasource.DataStore;
-import org.teiid.test.framework.exception.QueryTestFailedException;
-
-
-
-/**
- * The AbstractQueryTransactionTest is the base implementation for the
- * {@link TransactionQueryTestCase}. This provides the default logic for perform a testcase.
- * The only method to implement in order to perform a basic, single datasource, test
- * is the {@link #testCase()} method.
- *
- * AbstractQueryTransactionTest is the class that should be extended when a
- * testcase is being created to validate certain behavior
- *
- * <br>
- * The following methods are useful when writing validation logic because they provide
- * a direct connection to the datasource that was used by the VDB. This enables data
- * validation of expected behavior of Teiid.
- * <li>{@link #getSource(String)}. </li>
- * <li>{@link #getXASource(String)} </li>
- *
- * <br>
- *
- * @see QueryExecution for use when direct queries to the source are used to
- * validate the results of the testcase.
- *
- */
-public abstract class AbstractQueryTransactionTest extends com.metamatrix.jdbc.api.AbstractQueryTest
- implements TransactionQueryTestCase {
-
- private static String initialized = null;
-
- protected String testname = "NA";
- protected int fetchSize = -1;
- protected int queryTimeout = -1;
-
- protected ConnectionStrategy connStrategy;
-
- public AbstractQueryTransactionTest() {
- super();
- }
-
- public AbstractQueryTransactionTest(String testname) {
- super();
- this.testname = testname;
- }
-
- public String getTestName() {
- return this.testname;
-
- }
-
-
- @Override
- public void setConnectionStrategy(ConnectionStrategy connStrategy) throws QueryTestFailedException {
- this.connStrategy = connStrategy;
-
- this.setConnection(connStrategy.getConnection());
-
- }
-
-// @Override
-// protected void compareResults(BufferedReader resultReader,
-// BufferedReader expectedReader) throws IOException {
-// assertEquals(read(expectedReader, compareResultsCaseSensitive()), read(
-// resultReader, compareResultsCaseSensitive()));
-// }
-
- @Override
- protected void assignExecutionProperties(Statement stmt) {
- if (stmt instanceof com.metamatrix.jdbc.api.Statement) {
- com.metamatrix.jdbc.api.Statement statement = (com.metamatrix.jdbc.api.Statement) stmt;
-
- Properties executionProperties = this.connStrategy.getEnvironment();
- if (executionProperties != null) {
- String txnautowrap = executionProperties
- .getProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP);
- if (txnautowrap != null) {
- statement.setExecutionProperty(
- CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP,
- txnautowrap);
-
-
-// this.print("TransactionAutoWrap = " + txnautowrap);
- }
-
- String fetchSizeStr = executionProperties
- .getProperty(CONNECTION_STRATEGY_PROPS.FETCH_SIZE);
- if (fetchSizeStr != null) {
- try {
- fetchSize = Integer.parseInt(fetchSizeStr);
-
- this.print("FetchSize = " + fetchSize);
- } catch (NumberFormatException e) {
- fetchSize = -1;
- // this.print("Invalid fetch size value: " + fetchSizeStr
- // + ", ignoring");
- }
- }
-
- }
-
-
-
- if (this.fetchSize > 0) {
- try {
- statement.setFetchSize(this.fetchSize);
- } catch (SQLException e) {
-// this.print(e);
- }
- }
-
- if (this.queryTimeout > 0) {
- try {
- statement.setQueryTimeout(this.queryTimeout);
- } catch (SQLException e) {
-// this.print(e);
- }
- }
- }
-
- }
-
-
-
- /**
- * Override <code>setupDataSource</code> if there is different mechanism for
- * setting up the datasources for the testcase
- *
- * @throws QueryTestFailedException
- * @throws QueryTestFailedException
- *
- * @since
- */
- @Override
- public void setup() throws QueryTestFailedException {
-
- if (initialized == null || !initialized.equalsIgnoreCase(this.getClass().getSimpleName()) ) {
- initialized = this.getClass().getSimpleName();
- DataStore.initialize(connStrategy);
-
- }
-
- DataStore.setup(connStrategy);
-
- }
-
- /**
- * The source connection must be asked from the connection strategy because only here
- * is it known which model was mapped to which datasource.
- * This is because each test could potentially use an include/exclude datasource option
- * that could change the mappings between tests.
- * @param identifier
- * @return
- * @throws QueryTestFailedException
- */
- public Connection getSource(String identifier)
- throws QueryTestFailedException {
-
- Connection conn = this.connStrategy.createDriverConnection(identifier);
- // force autocommit back to true, just in case the last user didnt
- try {
- conn.setAutoCommit(true);
- } catch (Exception sqle) {
- throw new QueryTestFailedException(sqle);
- }
-
- return conn;
-
- }
-
- public XAConnection getXASource(String identifier)
- throws QueryTestFailedException {
-
- return this.connStrategy.createDataSourceConnection(identifier);
-
- }
-
- /**
- * Implement testCase(), it is the entry point to the execution of the test.
- *
- * @throws Exception
- *
- * @since
- */
- public abstract void testCase() throws Exception;
-
- /**
- * Indicates what should be done when a failure occurs in
- * {@link #testCase()}
- *
- * @return
- *
- * @since
- */
- public boolean rollbackAllways() {
- return false;
- }
-
- /**
- * Override <code>before</code> if there is behavior that needs to be
- * performed prior to {@link #testCase()} being called.
- *
- *
- * @since
- */
- public void before() {
- }
-
- /**
- * Override <code>after</code> if there is behavior that needs to be
- * performed after {@link #testCase()} being called.
- *
- *
- * @since
- */
- public void after() {
- }
-
- /**
- * At end of each test, perform any cleanup that your test requires. Note:
- * Do not cleanup any connections by calling {@link ConnectionStrategy#shutdown()}.
- * That is performed by the
- * {@link TransactionContainer#runTransaction(TransactionQueryTestCase)} at the
- * end of the test.
- */
- public void cleanup() {
-
- }
-
- @Override
- public XAConnection getXAConnection() {
- return null;
- }
-
-}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/AbstractQueryTransactionTest.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.query;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.datasource.DataStore;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+
+
+
+/**
+ * The AbstractQueryTransactionTest is the base implementation for the
+ * {@link TransactionQueryTestCase}. This provides the default logic for perform a testcase.
+ * The only method to implement in order to perform a basic, single datasource, test
+ * is the {@link #testCase()} method.
+ *
+ * AbstractQueryTransactionTest is the class that should be extended when a
+ * testcase is being created to validate certain behavior
+ *
+ * <br>
+ * The following methods are useful when writing validation logic because they provide
+ * a direct connection to the datasource that was used by the VDB. This enables data
+ * validation of expected behavior of Teiid.
+ * <li>{@link #getSource(String)}. </li>
+ * <li>{@link #getXASource(String)} </li>
+ *
+ * <br>
+ *
+ * @see QueryExecution for use when direct queries to the source are used to
+ * validate the results of the testcase.
+ *
+ */
+public abstract class AbstractQueryTransactionTest extends com.metamatrix.jdbc.api.AbstractQueryTest
+ implements TransactionQueryTestCase {
+
+ private static String initialized = null;
+
+ protected String testname = "NA";
+ protected int fetchSize = -1;
+ protected int queryTimeout = -1;
+
+ protected ConnectionStrategy connStrategy;
+
+ public AbstractQueryTransactionTest() {
+ super();
+ }
+
+ public AbstractQueryTransactionTest(String testname) {
+ super();
+ this.testname = testname;
+ }
+
+ public String getTestName() {
+ return this.testname;
+
+ }
+
+
+ @Override
+ public void setConnectionStrategy(ConnectionStrategy connStrategy) throws QueryTestFailedException {
+ this.connStrategy = connStrategy;
+
+ this.setConnection(connStrategy.getConnection());
+
+ }
+
+// @Override
+// protected void compareResults(BufferedReader resultReader,
+// BufferedReader expectedReader) throws IOException {
+// assertEquals(read(expectedReader, compareResultsCaseSensitive()), read(
+// resultReader, compareResultsCaseSensitive()));
+// }
+
+ @Override
+ protected void assignExecutionProperties(Statement stmt) {
+ if (stmt instanceof com.metamatrix.jdbc.api.Statement) {
+ com.metamatrix.jdbc.api.Statement statement = (com.metamatrix.jdbc.api.Statement) stmt;
+
+ Properties executionProperties = this.connStrategy.getEnvironment();
+ if (executionProperties != null) {
+ String txnautowrap = executionProperties
+ .getProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP);
+ if (txnautowrap != null) {
+ statement.setExecutionProperty(
+ CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP,
+ txnautowrap);
+
+
+// this.print("TransactionAutoWrap = " + txnautowrap);
+ }
+
+ String fetchSizeStr = executionProperties
+ .getProperty(CONNECTION_STRATEGY_PROPS.FETCH_SIZE);
+ if (fetchSizeStr != null) {
+ try {
+ fetchSize = Integer.parseInt(fetchSizeStr);
+
+ this.print("FetchSize = " + fetchSize);
+ } catch (NumberFormatException e) {
+ fetchSize = -1;
+ // this.print("Invalid fetch size value: " + fetchSizeStr
+ // + ", ignoring");
+ }
+ }
+
+ }
+
+
+
+ if (this.fetchSize > 0) {
+ try {
+ statement.setFetchSize(this.fetchSize);
+ } catch (SQLException e) {
+// this.print(e);
+ }
+ }
+
+ if (this.queryTimeout > 0) {
+ try {
+ statement.setQueryTimeout(this.queryTimeout);
+ } catch (SQLException e) {
+// this.print(e);
+ }
+ }
+ }
+
+ }
+
+
+
+ /**
+ * Override <code>setupDataSource</code> if there is different mechanism for
+ * setting up the datasources for the testcase
+ *
+ * @throws QueryTestFailedException
+ * @throws QueryTestFailedException
+ *
+ * @since
+ */
+ @Override
+ public void setup() throws QueryTestFailedException {
+
+ if (initialized == null || !initialized.equalsIgnoreCase(this.getClass().getSimpleName()) ) {
+ initialized = this.getClass().getSimpleName();
+ DataStore.initialize(connStrategy);
+
+ }
+
+ DataStore.setup(connStrategy);
+
+ }
+
+ /**
+ * The source connection must be asked from the connection strategy because only here
+ * is it known which model was mapped to which datasource.
+ * This is because each test could potentially use an include/exclude datasource option
+ * that could change the mappings between tests.
+ * @param identifier
+ * @return
+ * @throws QueryTestFailedException
+ */
+ public Connection getSource(String identifier)
+ throws QueryTestFailedException {
+
+ Connection conn = this.connStrategy.createDriverConnection(identifier);
+ // force autocommit back to true, just in case the last user didnt
+ try {
+ conn.setAutoCommit(true);
+ } catch (Exception sqle) {
+ throw new QueryTestFailedException(sqle);
+ }
+
+ return conn;
+
+ }
+
+ public XAConnection getXASource(String identifier)
+ throws QueryTestFailedException {
+
+ return this.connStrategy.createDataSourceConnection(identifier);
+
+ }
+
+ /**
+ * Implement testCase(), it is the entry point to the execution of the test.
+ *
+ * @throws Exception
+ *
+ * @since
+ */
+ public abstract void testCase() throws Exception;
+
+ /**
+ * Indicates what should be done when a failure occurs in
+ * {@link #testCase()}
+ *
+ * @return
+ *
+ * @since
+ */
+ public boolean rollbackAllways() {
+ return false;
+ }
+
+ /**
+ * Override <code>before</code> if there is behavior that needs to be
+ * performed prior to {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ public void before() {
+ }
+
+ /**
+ * Override <code>after</code> if there is behavior that needs to be
+ * performed after {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ public void after() {
+ }
+
+ /**
+ * At end of each test, perform any cleanup that your test requires. Note:
+ * Do not cleanup any connections by calling {@link ConnectionStrategy#shutdown()}.
+ * That is performed by the
+ * {@link TransactionContainer#runTransaction(TransactionQueryTestCase)} at the
+ * end of the test.
+ */
+ public void cleanup() {
+
+ }
+
+ @Override
+ public XAConnection getXAConnection() {
+ return null;
+ }
+
+}
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,22 +0,0 @@
-package org.teiid.test.framework.query;
-
-import java.sql.Connection;
-
-import com.metamatrix.jdbc.api.AbstractQueryTest;
-
-/**
- * The QueryExecution class can be used to query the source directly. The intended use
- * of this class is for validating results after the execution of a test case.
- *
- * @see AbstractQueryTransactionTest regarding creating a testcase to validate behavior.
- * @author vanhalbert
- *
- */
-public class QueryExecution extends AbstractQueryTest {
-
- public QueryExecution(Connection conn) {
- super(conn);
- }
-
-
-}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/query/QueryExecution.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,22 @@
+package org.teiid.test.framework.query;
+
+import java.sql.Connection;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+/**
+ * The QueryExecution class can be used to query the source directly. The intended use
+ * of this class is for validating results after the execution of a test case.
+ *
+ * @see AbstractQueryTransactionTest regarding creating a testcase to validate behavior.
+ * @author vanhalbert
+ *
+ */
+public class QueryExecution extends AbstractQueryTest {
+
+ public QueryExecution(Connection conn) {
+ super(conn);
+ }
+
+
+}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -8,9 +8,9 @@
import javax.transaction.UserTransaction;
import org.teiid.test.framework.TransactionContainer;
-import org.teiid.test.framework.TransactionQueryTest;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
import org.teiid.test.framework.exception.TransactionRuntimeException;
-import org.teiid.test.framework.connection.ConnectionStrategy;
@@ -18,12 +18,13 @@
public class JNDITransaction extends TransactionContainer {
UserTransaction userTxn = null;
- public JNDITransaction(ConnectionStrategy strategy) {
- super(strategy);
+
+ public JNDITransaction() {
+ super();
}
- protected void before(TransactionQueryTest test) {
- if (this.props.getProperty(ConnectionStrategy.JNDINAME_USERTXN) == null) {
+ protected void before(TransactionQueryTestCase test) {
+ if (this.props.getProperty(CONNECTION_STRATEGY_PROPS.JNDINAME_USERTXN) == null) {
throw new TransactionRuntimeException("No JNDI name found for the User Transaction to look up in application server");
}
@@ -31,14 +32,14 @@
// begin the transaction
InitialContext ctx = new InitialContext();
- this.userTxn = (UserTransaction)ctx.lookup(this.props.getProperty(ConnectionStrategy.JNDINAME_USERTXN));
+ this.userTxn = (UserTransaction)ctx.lookup(this.props.getProperty(CONNECTION_STRATEGY_PROPS.JNDINAME_USERTXN));
this.userTxn.begin();
} catch (Exception e) {
throw new TransactionRuntimeException(e);
}
}
- protected void after(TransactionQueryTest test) {
+ protected void after(TransactionQueryTestCase test) {
try {
if (this.userTxn != null) {
if (test.rollbackAllways()|| test.exceptionOccurred()) {
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -4,28 +4,28 @@
*/
package org.teiid.test.framework.transaction;
-import java.sql.Connection;
+
import java.sql.SQLException;
+import org.teiid.test.framework.ConfigPropertyLoader;
import org.teiid.test.framework.TransactionContainer;
-import org.teiid.test.framework.TransactionQueryTest;
-import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
import org.teiid.test.framework.exception.TransactionRuntimeException;
-import org.teiid.test.framework.connection.ConnectionStrategy;
-
/**
* A transaction which is user controlled.
*/
public class LocalTransaction extends TransactionContainer {
- public LocalTransaction(ConnectionStrategy strategy) {
- super(strategy);
-
+ public LocalTransaction() {
+ super();
}
-
- protected void before(TransactionQueryTest test) {
+ protected void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OFF);
+
try {
debug("Autocommit: " + this.connStrategy.getAutocommit());
test.getConnection().setAutoCommit(this.connStrategy.getAutocommit());
@@ -34,8 +34,8 @@
}
}
- protected void after(TransactionQueryTest test) {
- // boolean exception = false;
+ protected void after(TransactionQueryTestCase test) {
+ boolean exception = false;
try {
if (test.rollbackAllways()|| test.exceptionOccurred()) {
test.getConnection().rollback();
@@ -45,7 +45,7 @@
test.getConnection().commit();
}
} catch (SQLException se) {
-// exception = true;
+ exception = true;
// if exception, try to trigger the rollback
try {
test.getConnection().rollback();
@@ -58,13 +58,13 @@
} finally {
// if an exception occurs and the autocommit is set to true - while doing a transaction
// will generate a new exception overriding the first exception
-// if (!exception) {
-// try {
-// test.getConnection().setAutoCommit(true);
-// } catch (SQLException e) {
-// throw new RuntimeException(e);
-// }
-// }
+ if (!exception) {
+ try {
+ test.getConnection().setAutoCommit(true);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OffWrapTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = OFF
+ */
+public class OffWrapTransaction extends TransactionContainer {
+
+ public OffWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OFF);
+
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OnWrapTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = ON
+ */
+public class OnWrapTransaction extends TransactionContainer {
+ public OnWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_ON);
+
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/OptimisticWrapTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transction is only valid when
+ * AutoCommit = ON
+ * txnAutoWrap = Optimistic.
+ */
+public class OptimisticWrapTransaction extends TransactionContainer {
+ public OptimisticWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_OPTIMISTIC);
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/PessimisticWrapTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.ConfigPropertyNames.CONNECTION_STRATEGY_PROPS;
+import org.teiid.test.framework.ConfigPropertyNames.TXN_AUTO_WRAP_OPTIONS;
+
+
+/**
+ * This transaction type only is valid when
+ * AutoCommit = ON
+ * txnAutoWrap = PESSIMISTIC
+ */
+public class PessimisticWrapTransaction extends TransactionContainer {
+ public PessimisticWrapTransaction() {
+ super();
+ }
+
+ public void before(TransactionQueryTestCase test) {
+ this.setEnvironmentProperty(CONNECTION_STRATEGY_PROPS.TXN_AUTO_WRAP, TXN_AUTO_WRAP_OPTIONS.AUTO_WRAP_PESSIMISTIC);
+
+ }
+
+ public void after(TransactionQueryTestCase test) {
+
+ }
+
+
+}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/StandaloneGlobalTransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import java.util.Random;
+
+import javax.transaction.xa.XAResource;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.xa.MMXid;
+
+public class StandaloneGlobalTransaction extends TransactionContainer {
+ private static Random RANDOM = new Random();
+ private MMXid xid;
+
+ public StandaloneGlobalTransaction() {
+ super();
+ }
+
+ protected void before(TransactionQueryTestCase test) {
+ try {
+ xid = createXid();
+ XAResource xaResource = this.getConnectionStrategy().getXAConnection().getXAResource();
+ // getXAConnection().getXAResource();
+ xaResource.setTransactionTimeout(120);
+ xaResource.start(xid, XAResource.TMNOFLAGS);
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ public static MMXid createXid() {
+ byte[] gid = new byte[10];
+ byte[] bid = new byte[10];
+ RANDOM.nextBytes(gid);
+ RANDOM.nextBytes(bid);
+ return new MMXid(0, gid, bid);
+ }
+
+ protected void after(TransactionQueryTestCase test) {
+ boolean delistSuccessful = false;
+ boolean commit = false;
+ try {
+ XAResource xaResource = this.getConnectionStrategy().getXAConnection().getXAResource();
+
+ xaResource.end(xid, XAResource.TMSUCCESS);
+
+ if (!test.exceptionExpected() && xaResource.prepare(xid) == XAResource.XA_OK) {
+ commit = true;
+ }
+ delistSuccessful = true;
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ } finally {
+ try {
+ if (!delistSuccessful || test.rollbackAllways()|| test.exceptionOccurred()) {
+ this.getConnectionStrategy().getXAConnection().getXAResource().rollback(xid);
+ //getXAConnection().getXAResource().rollback(xid);
+ }
+ else if (commit) {
+ this.getConnectionStrategy().getXAConnection().getXAResource().commit(xid, true);
+ }
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+ }
+}
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -9,8 +9,10 @@
import javax.sql.XAConnection;
import javax.transaction.xa.XAResource;
+import org.teiid.test.framework.ConfigPropertyLoader;
import org.teiid.test.framework.TransactionContainer;
-import org.teiid.test.framework.TransactionQueryTest;
+import org.teiid.test.framework.TransactionQueryTestCase;
+import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.connection.ConnectionStrategy;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
@@ -21,11 +23,11 @@
private static Random RANDOM = new Random();
private MMXid xid;
- public XATransaction(ConnectionStrategy strategy) {
- super(strategy);
- }
+ public XATransaction() {
+ super();
+ }
- protected void before(TransactionQueryTest test) {
+ protected void before(TransactionQueryTestCase test) {
try {
xid = createXid();
XAResource xaResource = getXAConnection().getXAResource();
@@ -46,7 +48,7 @@
return new MMXid(0, gid, bid);
}
- protected void after(TransactionQueryTest test) {
+ protected void after(TransactionQueryTestCase test) {
boolean delistSuccessful = false;
boolean commit = false;
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,534 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.test.util;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * This class contains a set of static utility methods for checking method arguments.
- * It contains many of the common checks that are done, such as checking that an
- * Object is non-null, checking the range of a value, etc. All of these methods
- * throw {@link #java.lang.IllegalArgumentException}.
- */
-public class ArgCheck {
-
- /**
- * Can't construct - utility class
- */
- private ArgCheck() {
- }
-
- /**
- * Check that the boolean condition is true; throw an
- * IllegalArgumentException if not.
- * @param condition The boolean condition to check
- * @param message Exception message if check fails
- * @throws IllegalArgumentException if condition is false
- */
- public static final void isTrue(boolean condition, String message){
- if(!condition) {
- throw new IllegalArgumentException(message);
- }
- }
-
- // ########################## int METHODS ###################################
-
- /**
- * Check that the value is non-negative (>=0).
- * @param value Value
- * @throws IllegalArgumentException If value is negative (<0)
- */
- public static final void isNonNegative(int value) {
- isNonNegative(value,null);
- }
-
- /**
- * Check that the value is non-negative (>=0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is negative (<0)
- */
- public static final void isNonNegative(int value, String message) {
- if(value < 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNonNegativeInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is non-positive (<=0).
- * @param value Value
- * @throws IllegalArgumentException If value is positive (>0)
- */
- public static final void isNonPositive(int value) {
- isNonPositive(value,null);
- }
-
- /**
- * Check that the value is non-positive (<=0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is positive (>0)
- */
- public static final void isNonPositive(int value, String message) {
- if(value > 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNonPositiveInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is negative (<0).
- * @param value Value
- * @throws IllegalArgumentException If value is non-negative (>=0)
- */
- public static final void isNegative(int value) {
- isNegative(value,null);
- }
-
- /**
- * Check that the value is negative (<0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is non-negative (>=0)
- */
- public static final void isNegative(int value, String message) {
- if(value >= 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNegativeInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is positive (>0).
- * @param value Value
- * @throws IllegalArgumentException If value is non-positive (<=0)
- */
- public static final void isPositive(int value) {
- isPositive(value,null);
- }
-
- /**
- * Check that the value is positive (>0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is non-positive (<=0)
- */
- public static final void isPositive(int value, String message) {
- if(value <= 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isPositiveInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- // ########################## long METHODS ###################################
-
- /**
- * Check that the value is non-negative (>=0).
- * @param value Value
- * @throws IllegalArgumentException If value is negative (<0)
- */
- public static final void isNonNegative(long value) {
- isNonNegative(value,null);
- }
-
- /**
- * Check that the value is non-negative (>=0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is negative (<0)
- */
- public static final void isNonNegative(long value, String message) {
- if(value < 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNonNegativeInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is non-positive (<=0).
- * @param value Value
- * @throws IllegalArgumentException If value is positive (>0)
- */
- public static final void isNonPositive(long value) {
- isNonPositive(value,null);
- }
-
- /**
- * Check that the value is non-positive (<=0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is positive (>0)
- */
- public static final void isNonPositive(long value, String message) {
- if(value > 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNonPositiveInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is negative (<0).
- * @param value Value
- * @throws IllegalArgumentException If value is non-negative (>=0)
- */
- public static final void isNegative(long value) {
- isNegative(value,null);
- }
-
- /**
- * Check that the value is negative (<0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is non-negative (>=0)
- */
- public static final void isNegative(long value, String message) {
- if(value >= 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNegativeInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the value is positive (>0).
- * @param value Value
- * @throws IllegalArgumentException If value is non-positive (<=0)
- */
- public static final void isPositive(long value) {
- isPositive(value,null);
- }
-
- /**
- * Check that the value is positive (>0).
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is non-positive (<=0)
- */
- public static final void isPositive(long value, String message) {
- if(value <= 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isPositiveInt"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- // ########################## String METHODS ###################################
-
- /**
- * Check that the string is non-null and has length > 0
- * @param value Value
- * @throws IllegalArgumentException If value is null or length == 0
- */
- public static final void isNotZeroLength(String value) {
- isNotZeroLength(value,null);
- }
-
- /**
- * Check that the string is non-null and has length > 0
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is null or length == 0
- */
- public static final void isNotZeroLength(String value, String message) {
- isNotNull(value);
- if(value.length() <= 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isStringNonZeroLength"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- // ########################## Object METHODS ###################################
-
- /**
- * Check that the object is non-null
- * @param value Value
- * @throws IllegalArgumentException If value is null
- */
- public static final void isNotNull(Object value) {
- isNotNull(value,null);
- }
-
- /**
- * Check that the object is non-null
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is null
- */
- public static final void isNotNull(Object value, String message) {
- if(value == null) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNonNull"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the object is null
- * @param value Value
- * @throws IllegalArgumentException If value is non-null
- */
- public static final void isNull(Object value) {
- isNull(value,null);
- }
-
- /**
- * Check that the object is null
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is non-null
- */
- public static final void isNull(Object value, String message) {
- if(value != null) {
- final String msg = message != null ?
- message :
- "ArgCheck.isNull"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the object is an instance of the specified Class
- * @param theClass Class
- * @param value Value
- * @throws IllegalArgumentException If value is null
- */
- public static final void isInstanceOf(Class theClass, Object value) {
- isInstanceOf(theClass,value,null);
- }
-
- /**
- * Check that the object is an instance of the specified Class
- * @param theClass Class
- * @param value Value
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If value is null
- */
- public static final void isInstanceOf(Class theClass, Object value, String message) {
- isNotNull(value);
- if( ! theClass.isInstance(value) ) {
- final String msg = message != null ?
- message :
- "ArgCheck.isInstanceOf "; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- // ########################## COLLECTION METHODS ###################################
-
- /**
- * Check that the collection is not empty
- * @param collection Collection
- * @throws IllegalArgumentException If collection is null or empty
- */
- public static final void isNotEmpty(Collection collection) {
- isNotEmpty(collection,null);
- }
-
- /**
- * Check that the collection is not empty
- * @param collection Collection
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If collection is null or empty
- */
- public static final void isNotEmpty(Collection collection, String message) {
- isNotNull(collection);
- if(collection.isEmpty()) {
- final String msg = message != null ?
- message :
- "ArgCheck.isCollectionNotEmpty"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the map is not empty
- * @param map Map
- * @throws IllegalArgumentException If map is null or empty
- */
- public static final void isNotEmpty(Map map) {
- isNotEmpty(map,null);
- }
-
- /**
- * Check that the map is not empty
- * @param map Map
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If map is null or empty
- */
- public static final void isNotEmpty(Map map, String message) {
- isNotNull(map);
- if(map.isEmpty()) {
- final String msg = message != null ?
- message :
- "ArgCheck.isMapNotEmpty"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the array is not empty
- * @param array Array
- * @throws IllegalArgumentException If array is null or empty
- * @since 3.1
- */
- public static final void isNotEmpty(Object[] array) {
- isNotEmpty(array,null);
- }
-
- /**
- * Check that the array is not empty
- * @param array Array
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If array is null or empty
- * @since 3.1
- */
- public static final void isNotEmpty(Object[] array, String message) {
- isNotNull(array);
- if(array.length == 0) {
- final String msg = message != null ?
- message :
- "ArgCheck.isArrayNotEmpty"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the string is not empty
- * @param string String
- * @throws IllegalArgumentException If string is null or empty
- * @since 3.1
- */
- public static final void isNotEmpty(String string) {
- isNotZeroLength(string,null);
- }
-
- /**
- * Check that the string is not empty
- * @param string String
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If string is null or empty
- * @since 3.1
- */
- public static final void isNotEmpty(String string, String message) {
- isNotZeroLength(string,message);
- }
-
- /**
- * Asserts that the specified first object is not the same as (==) the specified second object.
- * @param firstObject The first object to assert as not the same as the second object.
- * @param firstName The name that will be used within the exception message for the first object, should an exception be
- * thrown; if null and <code>firstObject</code> is not null, <code>firstObject.toString()</code> will be
- * used.
- * @param secondObject The second object to assert as not the same as the first object.
- * @param secondName The name that will be used within the exception message for the second object, should an exception be
- * thrown; if null and <code>secondObject</code> is not null, <code>secondObject.toString()</code> will
- * be used.
- * @throws IllegalArgumentException If the specified objects are the same.
- * @since 3.1
- */
- public static void isNotSame(final Object firstObject, String firstName, final Object secondObject, String secondName) {
- if (firstObject == secondObject) {
- if (firstName == null && firstObject != null) {
- firstName = firstObject.toString();
- }
- if (secondName == null && secondObject != null) {
- secondName = secondObject.toString();
- }
- throw new IllegalArgumentException("ArgCheck.isNotSame"); //$NON-NLS-1$
- }
- }
-
- /**
- * Check that the collection contains the value
- * @param collection Collection to check
- * @param value Value to check for, may be null
- * @throws IllegalArgumentException If collection is null or doesn't contain value
- */
- public static final void contains(Collection collection, Object value) {
- contains(collection, value, null);
- }
-
- /**
- * Check that the collection contains the value
- * @param collection Collection to check
- * @param value Value to check for, may be null
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If collection is null or doesn't contain value
- */
- public static final void contains(Collection collection, Object value, String message) {
- isNotNull(collection);
- if(! collection.contains(value)) {
- final String msg = message != null ?
- message :
- "ArgCheck.contains"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
- /**
- * Check that the map contains the key
- * @param map Map to check
- * @param key Key to check for, may be null
- * @throws IllegalArgumentException If map is null or doesn't contain key
- */
- public static final void containsKey(Map map, Object key) {
- containsKey(map, key, null);
- }
-
- /**
- * Check that the map contains the key
- * @param map Map to check
- * @param key Key to check for, may be null
- * @param message Exception message if check fails
- * @throws IllegalArgumentException If map is null or doesn't contain key
- */
- public static final void containsKey(Map map, Object key, String message) {
- isNotNull(map);
- if(! map.containsKey(key)) {
- final String msg = message != null ?
- message :
- "ArgCheck.containsKey"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- }
-
-}
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,97 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.test.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.CRC32;
-import java.util.zip.Checksum;
-
-/**
- * This utility class provides mechanisms for computing the checksum.
- */
-public class ChecksumUtil {
-
- protected static final int BUFFER_SIZE = 1024;
-
- /**
- * Compute and return the checksum (using the default CRC-32 algorithm)
- * of the contents on the specified stream.
- * This method closes the stream upon completion.
- * @param stream the stream containing the contents for which
- * the checksum is to be computed; may not be null
- * @return the Checksum for the contents
- * @throws AssertionError if <code>stream</code> is null
- * @throws IOException if there is an error reading the stream
- */
- public static Checksum computeChecksum( InputStream stream ) throws IOException {
- Checksum checksum = new CRC32();
- computeChecksum(stream,checksum);
- return checksum;
- }
-
- /**
- * Compute the checksum of the contents on the specified stream
- * using the supplied Checksum algorithm, and modify that
- * Checksum instance with the checksum value.
- * This method closes the stream upon completion.
- * @param stream the stream containing the contents for which
- * the checksum is to be computed; may not be null
- * @param algorithm the checksum algorithm to be used.
- * @return the number of bytes from <code>stream</code>
- * that were processed
- * @throws AssertionError if <code>stream</code> or
- * <code>algorithm</code> is null
- * @throws IOException if there is an error reading the stream
- */
- public static long computeChecksum( InputStream stream, Checksum algorithm ) throws IOException {
- byte[] buffer = new byte[BUFFER_SIZE];
- int n = 0;
- long sizeInBytes = 0;
-
- // Compute the checksum ...
- IOException ioe = null;
- try {
- while ((n = stream.read(buffer)) > -1){
- algorithm.update(buffer, 0, n);
- sizeInBytes += n;
- }
- } catch ( IOException e ) {
- ioe = e;
- } finally {
- try {
- stream.close();
- } catch ( IOException e ) {
- //Throw this only if there was no IOException from processing above
- if ( ioe == null ) {
- ioe = e;
- }
- }
- }
- if ( ioe != null ) {
- throw ioe;
- }
- return sizeInBytes;
- }
-
-}
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,871 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.test.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public final class FileUtils {
-
- public interface Constants {
- char CURRENT_FOLDER_SYMBOL_CHAR = '.';
- char DRIVE_SEPARATOR_CHAR = ':';
- char FILE_EXTENSION_SEPARATOR_CHAR = '.';
- char FILE_NAME_WILDCARD_CHAR = '*';
-
- String CURRENT_FOLDER_SYMBOL = String.valueOf(CURRENT_FOLDER_SYMBOL_CHAR);
- String DRIVE_SEPARATOR = String.valueOf(DRIVE_SEPARATOR_CHAR);
- String FILE_EXTENSION_SEPARATOR = String.valueOf(FILE_EXTENSION_SEPARATOR_CHAR);
- String FILE_NAME_WILDCARD = String.valueOf(FILE_NAME_WILDCARD_CHAR);
- String PARENT_FOLDER_SYMBOL = ".."; //$NON-NLS-1$
- }
-
- public static final char SEPARATOR = '/';
-
- public static int DEFAULT_BUFFER_SIZE = 2048;
- public static String TEMP_DIRECTORY;
- public static String LINE_SEPARATOR = System.getProperty("line.separator"); //$NON-NLS-1$
- public static char[] LINE_SEPARATOR_CHARS = LINE_SEPARATOR.toCharArray();
-
- public final static String JAVA_IO_TEMP_DIR="java.io.tmpdir";//$NON-NLS-1$
- public final static char[] SUFFIX_class = ".class".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_CLASS = ".CLASS".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_java = ".java".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_JAVA = ".JAVA".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_jar = ".jar".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_JAR = ".JAR".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_zip = ".zip".toCharArray(); //$NON-NLS-1$
- public final static char[] SUFFIX_ZIP = ".ZIP".toCharArray(); //$NON-NLS-1$
-
-
- private static final String TEMP_FILE = "delete.me"; //$NON-NLS-1$
- private static final String TEMP_FILE_RENAMED = "delete.me.old"; //$NON-NLS-1$
-
-
-
- static {
- String tempDirPath = System.getProperty(JAVA_IO_TEMP_DIR);
- TEMP_DIRECTORY = (tempDirPath.endsWith(File.separator) ? tempDirPath : tempDirPath + File.separator);
- }
-
- private FileUtils() {}
-
- /**<p>
- * Convert the specified file name to end with the specified extension if it doesn't already end with an extension.
- * </p>
- * @param name
- * The file name.
- * @param extension
- * The extension to append to the file name.
- * @return The file name with an extension.
- * @since 4.0
- */
- public static String toFileNameWithExtension(final String name,
- final String extension) {
- return toFileNameWithExtension(name, extension, false);
- }
-
- /**<p>
- * Convert the specified file name to end with the specified extension if it doesn't already end with an extension. If force
- * is true, the specified extension will be appended to the name if the name doesn't end with that particular extension.
- * </p>
- * @param name
- * The file name.
- * @param extension
- * The extension to append to the file name.
- * @param force
- * Indicates whether to force the specified extension as the extension of the file name.
- * @return The file name with an extension.
- * @since 4.0
- */
- public static String toFileNameWithExtension(final String name,
- final String extension,
- final boolean force) {
- if (name == null) {
- final String msg = "FileUtils.The_name_of_the_file_may_not_be_null"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- if (extension == null) {
- final String msg = "FileUtils.The_file_extension_may_not_be_null"; //$NON-NLS-1$
- throw new IllegalArgumentException(msg);
- }
- if (name.endsWith(extension)) {
- return name;
- }
- if (!force && name.indexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR) >= 0) {
- return name;
- }
- final int nameLen = name.length() - 1;
- final int extLen = extension.length();
- final boolean nameEndsWithExtChr = (nameLen >= 0 && name.charAt(nameLen) == Constants.FILE_EXTENSION_SEPARATOR_CHAR);
- final boolean extBeginsWithExtChr = (extLen > 0 && extension.charAt(0) == Constants.FILE_EXTENSION_SEPARATOR_CHAR);
- if (nameEndsWithExtChr && extBeginsWithExtChr) {
- return name.substring(0, nameLen) + extension;
- }
- if (!nameEndsWithExtChr && !extBeginsWithExtChr) {
- return name + Constants.FILE_EXTENSION_SEPARATOR + extension;
- }
- return name + extension;
- }
-
- /**
- * Determine whether the specified name is valid for a file or folder on the current file system.
- * @param newName the new name to be checked
- * @return true if the name is null or contains no invalid characters for a folder or file, or false otherwise
- */
- public static boolean isFilenameValid( String newName ) {
- return true; //TODO: just catch an exception when the file is accessed or created
- }
-
- /**
- * Copy a file. Overwrites the destination file if it exists.
- * @param fromFileName
- * @param toFileName
- * @throws Exception
- * @since 4.3
- */
- public static void copy(String fromFileName, String toFileName) throws IOException {
- copy(fromFileName, toFileName, true);
- }
-
- /**
- * Copy a file
- * @param fromFileName
- * @param toFileName
- * @param overwrite whether to overwrite the destination file if it exists.
- * @throws MetaMatrixCoreException
- * @since 4.3
- */
- public static void copy(String fromFileName, String toFileName, boolean overwrite) throws IOException {
- File toFile = new File(toFileName);
-
- if (toFile.exists()) {
- if (overwrite) {
- toFile.delete();
- } else {
- final String msg = "FileUtils.File_already_exists " + toFileName; //$NON-NLS-1$
- throw new IOException(msg);
- }
- }
-
- File fromFile = new File(fromFileName);
- if (!fromFile.exists()) {
- throw new FileNotFoundException("FileUtils.File_does_not_exist " + fromFileName); //$NON-NLS-1$
- }
-
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(fromFile);
- write(fis, toFileName);
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
- }
-
- /**
- * Copy recursively the contents of <code>sourceDirectory</code> to
- * the <code>targetDirectory</code>. Note that <code>sourceDirectory</code>
- * will <b>NOT</b> be copied. If <code>targetDirectory</code> does not exist, it will be created.
- * @param sourceDirectory The source directory to copy
- * @param targetDirectory The target directory to copy to
- * @throws Exception If the source directory does not exist.
- * @since 4.3
- */
- public static void copyDirectoryContentsRecursively(File sourceDirectory, File targetDirectory) throws Exception {
- copyRecursively(sourceDirectory, targetDirectory, false);
- }
-
- /**
- * Copy file from orginating directory to the destination directory.
- *
- * @param orginDirectory
- * @param destDirectory
- * @param fileName
- * @throws Exception
- * @since 4.4
- */
- public static void copyFile(String orginDirectory,
- String destDirectory,
- String fileName) throws Exception {
-
- copyFile(orginDirectory, fileName, destDirectory, fileName);
- }
-
- /**
- * Copy file from orginating directory to the destination directory.
- *
- * @param orginDirectory
- * @param orginFileName
- * @param destDirectory
- * @param destFileName
- * @throws Exception
- * @since 4.4
- */
- public static void copyFile(String orginDirectory,
- String orginFileName,
- String destDirectory,
- String destFileName) throws Exception {
-
- FileUtils.copy(orginDirectory + File.separator + orginFileName, destDirectory + File.separator + destFileName);
- }
-
- /**
- * Copy recursively the <code>sourceDirectory</code> and all its contents
- * to the <code>targetDirectory</code>. If <code>targetDirectory</code>
- * does not exist, it will be created.
- * @param sourceDirectory The source directory to copy
- * @param targetDirectory The target directory to copy to
- * @throws Exception If the source directory does not exist.
- * @since 4.3
- */
- public static void copyDirectoriesRecursively(File sourceDirectory, File targetDirectory) throws Exception {
- copyRecursively(sourceDirectory, targetDirectory, true);
- }
-
- /**
- * Copy recursively from the <code>sourceDirectory</code> all its contents
- * to the <code>targetDirectory</code>. if
- * <code>includeSourceRoot<code> == <code>true</code>, copy <code>sourceDirectory</code>
- * itself, else only copy <code>sourceDirectory</code>'s contents.
- * If <code>targetDirectory</code> does not exist, it will be created.
- * @param sourceDirectory
- * @param targetDirectory
- * @throws FileNotFoundException
- * @throws Exception
- * @since 4.3
- */
- private static void copyRecursively(File sourceDirectory,
- File targetDirectory,
- boolean includeSourceRoot) throws FileNotFoundException,
- Exception {
- if (!sourceDirectory.exists()) {
- throw new FileNotFoundException("FileUtils.File_does_not_exist " + sourceDirectory); //$NON-NLS-1$
- }
-
- if (!sourceDirectory.isDirectory()) {
- throw new FileNotFoundException("FileUtils.Not_a_directory " + sourceDirectory); //$NON-NLS-1$
- }
-
- File targetDir = new File(targetDirectory.getAbsolutePath() + File.separatorChar + sourceDirectory.getName());
- if (includeSourceRoot) {
- // copy source directory
- targetDir.mkdir();
- } else {
- // copy only source directory contents
- targetDir = new File(targetDirectory.getAbsolutePath() + File.separatorChar);
- }
- File[] sourceFiles = sourceDirectory.listFiles();
- for (int i = 0; i < sourceFiles.length; i++) {
- File srcFile = sourceFiles[i];
- if (srcFile.isDirectory()) {
- File childTargetDir = new File(targetDir.getAbsolutePath());
- copyRecursively(srcFile, childTargetDir, true);
- } else {
- copy(srcFile.getAbsolutePath(), targetDir.getAbsolutePath() + File.separatorChar + srcFile.getName());
- }
- }
- }
-
- /**
- * Write an InputStream to a file.
- */
- public static void write(InputStream is, String fileName) throws IOException {
- File f = new File(fileName);
- write(is,f);
- }
-
- /**
- * Write an InputStream to a file.
- */
- public static void write(InputStream is, File f) throws IOException {
- write(is, f, DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Write an InputStream to a file.
- */
- public static void write(InputStream is, File f, int bufferSize) throws IOException {
- f.delete();
- final File parentDir = f.getParentFile();
- if (parentDir !=null) {
- parentDir.mkdirs();
- }
-
- FileOutputStream fio = null;
- BufferedOutputStream bos = null;
- try {
- fio = new FileOutputStream(f);
- bos = new BufferedOutputStream(fio);
- if (bufferSize > 0) {
- byte[] buff = new byte[bufferSize];
- int bytesRead;
-
- // Simple read/write loop.
- while(-1 != (bytesRead = is.read(buff, 0, buff.length))) {
- bos.write(buff, 0, bytesRead);
- }
- }
- bos.flush();
- } finally {
- if (bos != null) {
- bos.close();
- }
- if (fio != null) {
- fio.close();
- }
- }
- }
-
-
- /**
- * Write an File to an OutputStream
- * Note: this will not close the outputStream;
- */
- public static void write(File f, OutputStream outputStream) throws IOException {
- write(f, outputStream, DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Write an File to an OutputStream
- * Note: this will not close the outputStream;
- */
- public static void write(File f, OutputStream outputStream, int bufferSize) throws IOException {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(f);
- write(fis, outputStream, bufferSize);
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
- }
-
- /**
- * Write the given input stream to outputstream
- * Note: this will not close in/out streams
- */
- public static void write(InputStream fis, OutputStream outputStream, int bufferSize) throws IOException {
- byte[] buff = new byte[bufferSize];
- int bytesRead;
-
- // Simple read/write loop.
- while(-1 != (bytesRead = fis.read(buff, 0, buff.length))) {
- outputStream.write(buff, 0, bytesRead);
- }
- outputStream.flush();
- }
-
- /**
- * Write a byte array to a file.
- */
- public static void write(byte[] data, String fileName) throws IOException {
- ByteArrayInputStream bais = null;
- InputStream is = null;
- try {
- bais = new ByteArrayInputStream(data);
- is = new BufferedInputStream(bais);
-
- write(is, fileName);
- } finally {
- if (is != null) {
- is.close();
- }
- if (bais != null) {
- bais.close();
- }
- }
- }
-
- /**
- * Write a byte array to a file.
- */
- public static void write(byte[] data, File file) throws IOException {
- ByteArrayInputStream bais = null;
- InputStream is = null;
- try {
- bais = new ByteArrayInputStream(data);
- is = new BufferedInputStream(bais);
-
- write(is, file);
- } finally {
- if (is != null) {
- is.close();
- }
- if (bais != null) {
- bais.close();
- }
- }
- }
-
- /**
- * Returns a <code>File</code> array that will contain all the files that
- * exist in the specified directory or any nested directories
- * @return File[] of files in the directory
- */
- public static File[] findAllFilesInDirectoryRecursively(final String dir) {
-
- // Recursively navigate through the contents of this directory
- // gathering up all the files
- List allFiles = new ArrayList();
- File directory = new File(dir);
- addFilesInDirectoryRecursively(directory, allFiles);
-
- return (File[])allFiles.toArray(new File[allFiles.size()]);
-
- }
-
- private static void addFilesInDirectoryRecursively(final File directory, final List allFiles) {
- File[] files = directory.listFiles();
- if (files != null) {
- for (int i=0; i < files.length; i++) {
- File file = files[i];
- if (file.isDirectory()) {
- addFilesInDirectoryRecursively(file, allFiles);
- } else {
- allFiles.add(file);
- }
- }
- }
- }
-
- /**
- * Returns a <code>File</code> array that will contain all the files that exist in the directory
- *
- * @return File[] of files in the directory
- */
- public static File[] findAllFilesInDirectory(String dir) {
-
- // Find all files in the specified directory
- File modelsDirFile = new File(dir);
- FileFilter fileFilter = new FileFilter() {
-
- public boolean accept(File file) {
- if (file.isDirectory()) {
- return false;
- }
-
- String fileName = file.getName();
-
- if (fileName == null || fileName.length() == 0) {
- return false;
- }
-
- return true;
-
- }
- };
-
- File[] modelFiles = modelsDirFile.listFiles(fileFilter);
-
- return modelFiles;
-
- }
-
- /**
- * Returns a <code>File</code> array that will contain all the files that
- * exist in the directory that have the specified extension.
- * @return File[] of files having a certain extension
- */
- public static File[] findAllFilesInDirectoryHavingExtension(String dir, final String extension) {
-
- // Find all files in that directory that end in XML and attempt to
- // load them into the runtime metadata database.
- File modelsDirFile = new File(dir);
- FileFilter fileFilter = new FileFilter() {
- public boolean accept(File file) {
- if(file.isDirectory()) {
- return false;
- }
-
-
- String fileName = file.getName();
-
- if (fileName==null || fileName.length()==0) {
- return false;
- }
-
- return (fileName.endsWith(extension));
- // here we check to see if the file is an .xml file...
-// int index = fileName.lastIndexOf("."); //$NON-NLS-1$
-//
-// if (index<0 || index==fileName.length()) {
-// return false;
-// }
-//
-// if (fileName.substring(index, fileName.length()).equalsIgnoreCase(extension)) {
-// return true;
-// }
-// return false;
- }
- };
-
- File[] modelFiles = modelsDirFile.listFiles(fileFilter);
-
- return modelFiles;
-
- }
-
- /**
- * @param string
- * @return
- */
- public static String getFilenameWithoutExtension( final String filename ) {
- if ( filename == null || filename.length() == 0 ) {
- return filename;
- }
- final int extensionIndex = filename.lastIndexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR);
- if ( extensionIndex == -1 ) {
- return filename; // not found
- }
- if ( extensionIndex == 0 ) {
- return ""; //$NON-NLS-1$
- }
- return filename.substring(0,extensionIndex);
- }
-
- public static String getBaseFileNameWithoutExtension(String path) {
- return StringUtil.getFirstToken(StringUtil.getLastToken(path, "/"), "."); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- /**
- * Obtains the file extension of the specified <code>File</code>. The extension is considered to be all the
- * characters after the last occurrence of {@link Constants#FILE_EXTENSION_SEPARATOR_CHAR} in the pathname
- * of the input.
- * @param theFile the file whose extension is being requested
- * @return the extension or <code>null</code> if not found
- * @since 4.2
- */
- public static String getExtension(File theFile) {
- return getExtension(theFile.getPath());
- }
-
- /**
- * Obtains the file extension of the specified file name. The extension is considered to be all the
- * characters after the last occurrence of {@link Constants#FILE_EXTENSION_SEPARATOR_CHAR}.
- * @param theFileName the file whose extension is being requested
- * @return the extension or <code>null</code> if not found
- * @since 4.2
- */
- public static String getExtension(String theFileName) {
- String result = null;
- final int index = theFileName.lastIndexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR);
-
- // make sure extension char is found and is not the last char in the path
- if ((index != -1) && ((index + 1) != theFileName.length())) {
- result = theFileName.substring(index + 1);
- }
-
- return result;
- }
-
- /**
- * Returns true iff str.toLowerCase().endsWith(".jar") || str.toLowerCase().endsWith(".zip")
- * implementation is not creating extra strings.
- */
- public final static boolean isArchiveFileName(String name) {
- int nameLength = name == null ? 0 : name.length();
- int suffixLength = SUFFIX_JAR.length;
- if (nameLength < suffixLength) return false;
-
- // try to match as JAR file
- for (int i = 0; i < suffixLength; i++) {
- char c = name.charAt(nameLength - i - 1);
- int suffixIndex = suffixLength - i - 1;
- if (c != SUFFIX_jar[suffixIndex] && c != SUFFIX_JAR[suffixIndex]) {
-
- // try to match as ZIP file
- suffixLength = SUFFIX_ZIP.length;
- if (nameLength < suffixLength) return false;
- for (int j = 0; j < suffixLength; j++) {
- c = name.charAt(nameLength - j - 1);
- suffixIndex = suffixLength - j - 1;
- if (c != SUFFIX_zip[suffixIndex] && c != SUFFIX_ZIP[suffixIndex]) return false;
- }
- return true;
- }
- }
- return true;
- }
-
- /**
- * Returns true iff str.toLowerCase().endsWith(".class")
- * implementation is not creating extra strings.
- */
- public final static boolean isClassFileName(String name) {
- int nameLength = name == null ? 0 : name.length();
- int suffixLength = SUFFIX_CLASS.length;
- if (nameLength < suffixLength) return false;
-
- for (int i = 0; i < suffixLength; i++) {
- char c = name.charAt(nameLength - i - 1);
- int suffixIndex = suffixLength - i - 1;
- if (c != SUFFIX_class[suffixIndex] && c != SUFFIX_CLASS[suffixIndex]) return false;
- }
- return true;
- }
-
- /**
- * Returns true iff str.toLowerCase().endsWith(".java")
- * implementation is not creating extra strings.
- */
- public final static boolean isJavaFileName(String name) {
- int nameLength = name == null ? 0 : name.length();
- int suffixLength = SUFFIX_JAVA.length;
- if (nameLength < suffixLength) return false;
-
- for (int i = 0; i < suffixLength; i++) {
- char c = name.charAt(nameLength - i - 1);
- int suffixIndex = suffixLength - i - 1;
- if (c != SUFFIX_java[suffixIndex] && c != SUFFIX_JAVA[suffixIndex]) return false;
- }
- return true;
- }
-
-
- public static File convertByteArrayToFile(final byte[] contents, final String parentDirectoryPath, final String fileName) {
- if (contents != null) {
- FileOutputStream os = null;
- try {
- final File temp = new File(parentDirectoryPath,fileName);
- os = new FileOutputStream(temp);
- os.write(contents);
- return temp;
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (os != null) {
- try {
- os.close();
- } catch (IOException e1) {
- // do nothing
- }
- }
- }
- }
- return null;
- }
-
- public static void removeDirectoryAndChildren(File directory) {
- removeChildrenRecursively(directory);
- if(!directory.delete()) {
- directory.deleteOnExit();
- }
- }
-
- public static void removeChildrenRecursively(File directory) {
- File[] files = directory.listFiles();
- if(files != null) {
- for(int i=0; i < files.length; i++) {
- File file = files[i];
- if (file.isDirectory()) {
- removeDirectoryAndChildren(file);
- } else {
- if(!file.delete()) {
- file.deleteOnExit();
- }
- }
- }
- }
- }
-
- /**
- * Builds a file directory path from a physical location and a location that needs
- * to be appended to the physical. This is used so that the correct File.separator
- * is used and that no additional separator is added when not needed.
- * @param physicalDirectory
- * @param appendLocation
- * @return
- * @since 4.3
- */
- public static String buildDirectoryPath(String[] paths) {
-// String physicalDirectory, String appendLocation) {
-
- if (paths == null || paths.length == 0) {
- return ""; //$NON-NLS-1$
- }
- if (paths.length == 1) {
- return (paths[0]!=null?paths[0]:"");//$NON-NLS-1$
- }
- int l = paths.length;
- StringBuffer sb = new StringBuffer();
- for (int cur=0;cur<l; cur++) {
- int next = cur+1;
-
- String value = paths[cur]!=null?paths[cur]:"";//$NON-NLS-1$
- if (value.equals("")) {//$NON-NLS-1$
- continue;
- }
- sb.append(value);
-
- if (next < l) {
- String nextValue = paths[next]!=null?paths[next]:"";//$NON-NLS-1$
- if (value.endsWith(File.separator)) {
-
- } else if (!nextValue.startsWith(File.separator)) {
- sb.append(File.separator);
- }
-
- }
- }
-
- return sb.toString();
- }
-
- /**
- * Compute checksum for the given file.
- * @param f The file for which checksum needs to be computed
- * @return The checksum
- * @since 4.3
- */
- public static long getCheckSum(final File f) throws Exception {
- ArgCheck.isNotNull(f);
- FileInputStream is = null;
- try {
- is = new FileInputStream(f);
- return ChecksumUtil.computeChecksum(is).getValue();
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException err1) {
- }
- }
- }
- }
-
-
- /**
- * Test whether it's possible to read and write files in the specified directory.
- * @param dirPath Name of the directory to test
- * @throws MetaMatrixException
- * @since 4.3
- */
- public static void testDirectoryPermissions(String dirPath) throws Exception {
-
- //try to create a file
- File tmpFile = new File(dirPath + File.separatorChar + TEMP_FILE);
- boolean success = false;
- try {
- success = tmpFile.createNewFile();
- } catch (IOException e) {
- }
- if (!success) {
- final String msg = "FileUtils.Unable_to_create_file_in " + dirPath; //$NON-NLS-1$
- throw new Exception(msg);
- }
-
-
- //test if file can be written to
- if (!tmpFile.canWrite()) {
- final String msg = "FileUtils.Unable_to_write_file_in " + dirPath; //$NON-NLS-1$
- throw new Exception(msg);
- }
-
- //test if file can be read
- if (!tmpFile.canRead()) {
- final String msg = "FileUtils.Unable_to_read_file_in " + dirPath; //$NON-NLS-1$
- throw new Exception(msg);
- }
-
- //test if file can be renamed
- File newFile = new File(dirPath + File.separatorChar + TEMP_FILE_RENAMED);
- success = false;
- try {
- success = tmpFile.renameTo(newFile);
- } catch (Exception e) {
- }
- if (!success) {
- final String msg = "FileUtils.Unable_to_rename_file_in " + dirPath; //$NON-NLS-1$
- throw new Exception(msg);
- }
-
- //test if file can be deleted
- success = false;
- try {
- success = newFile.delete();
- } catch (Exception e) {
- }
- if (!success) {
- final String msg = "FileUtils.Unable_to_delete_file_in " + dirPath; //$NON-NLS-1$
- throw new Exception(msg);
- }
- }
-
- /**
- * Rename a file.
- * @param oldFilePath
- * @param newFilePath
- * @param overwrite If true, overwrite the old file if it exists. If false, throw an exception if the old file exists.
- * @throws MetaMatrixCoreException
- * @since 4.3
- */
- public static void rename(String oldFilePath, String newFilePath, boolean overwrite) throws IOException {
- File oldFile = new File(oldFilePath);
- File newFile = new File(newFilePath);
-
- if (newFile.exists()) {
- if (overwrite) {
- newFile.delete();
- } else {
- final String msg = "FileUtils.File_already_exists " + newFilePath; //$NON-NLS-1$
- throw new IOException(msg);
- }
- }
-
- boolean renamed = oldFile.renameTo(newFile);
-
- //Sometimes file.renameTo will silently fail, for example attempting to rename from different UNIX partitions.
- //Try to copy instead.
- if (!renamed) {
- copy(oldFilePath, newFilePath);
- oldFile.delete();
- }
- }
-
-
-
-
-
- public static void remove(String filePath) throws IOException {
- File file = new File(filePath);
- if (file.exists()) {
- file.delete();
- }
- }
-
-}
\ No newline at end of file
Modified: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -4,11 +4,39 @@
import java.io.InputStream;
import java.util.Properties;
-import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+import org.teiid.test.framework.ConfigPropertyLoader;
public class PropUtils {
-
+ public static Properties loadProperties(String filename, Properties defaults) {
+ InputStream in = null;
+ Properties props = new Properties();
+ if (defaults != null) {
+ props.putAll(defaults);
+ }
+ try {
+ in = ConfigPropertyLoader.class.getResourceAsStream(filename);
+ if (in != null) {
+ Properties lprops = new Properties();
+ lprops.load(in);
+ props.putAll(lprops);
+
+ }
+ else {
+ throw new RuntimeException("Failed to load properties from file '"+filename+ "' configuration file");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading properties from file '"+filename+ "'" + e.getMessage());
+ } finally {
+ try {
+ in.close();
+ } catch(Exception e){
+
+ }
+ }
+
+ return props;
+ }
}
Deleted: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,906 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved.
- * This code is made available under the terms of the Eclipse Public
- * License, version 1.0.
- */
-
-package org.teiid.test.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.regex.Pattern;
-
-/**
- * This is a common place to put String utility methods.
- */
-public final class StringUtil {
-
- public interface Constants {
- char CARRIAGE_RETURN_CHAR = '\r';
- char LINE_FEED_CHAR = '\n';
- char NEW_LINE_CHAR = LINE_FEED_CHAR;
- char SPACE_CHAR = ' ';
- char DOT_CHAR = '.';
- char TAB_CHAR = '\t';
-
- String CARRIAGE_RETURN = String.valueOf(CARRIAGE_RETURN_CHAR);
- String EMPTY_STRING = ""; //$NON-NLS-1$
- String DBL_SPACE = " "; //$NON-NLS-1$
- String LINE_FEED = String.valueOf(LINE_FEED_CHAR);
- String NEW_LINE = String.valueOf(NEW_LINE_CHAR);
- String SPACE = String.valueOf(SPACE_CHAR);
- String DOT = String.valueOf(DOT_CHAR);
- String TAB = String.valueOf(TAB_CHAR);
-
- String[] EMPTY_STRING_ARRAY = new String[0];
-
- // all patterns below copied from Eclipse's PatternConstructor class.
- final Pattern PATTERN_BACK_SLASH = Pattern.compile("\\\\"); //$NON-NLS-1$
- final Pattern PATTERN_QUESTION = Pattern.compile("\\?"); //$NON-NLS-1$
- final Pattern PATTERN_STAR = Pattern.compile("\\*"); //$NON-NLS-1$
- }
-
- /**
- * The String "'"
- */
- public static final String SINGLE_QUOTE = "'"; //$NON-NLS-1$
-
- /**
- * The name of the System property that specifies the string that should be used to separate
- * lines. This property is a standard environment property that is usually set automatically.
- */
- public static final String LINE_SEPARATOR_PROPERTY_NAME = "line.separator"; //$NON-NLS-1$
-
- /**
- * The String that should be used to separate lines; defaults to
- * {@link #NEW_LINE}
- */
- public static final String LINE_SEPARATOR = System.getProperty(LINE_SEPARATOR_PROPERTY_NAME, Constants.NEW_LINE);
-
- public static final Comparator CASE_INSENSITIVE_ORDER = String.CASE_INSENSITIVE_ORDER;
-
- public static final Comparator CASE_SENSITIVE_ORDER = new Comparator() {
- /**
- * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
- * @since 4.2
- */
- public int compare(Object o1, Object o2) {
- if ( o1 == o2 ) {
- return 0;
- }
- return ((String)o1).compareTo((String)o2);
- }
- };
-
- public static String getLineSeparator() {
- return LINE_SEPARATOR;
- }
-
- /**
- * Utility to return a string enclosed in ''.
- * Creation date: (12/2/99 12:05:10 PM)
- */
- public static String enclosedInSingleQuotes(String aString) {
- StringBuffer sb = new StringBuffer();
- sb.append(SINGLE_QUOTE);
- sb.append(aString);
- sb.append(SINGLE_QUOTE);
- return sb.toString();
- }
-
- public static String removeChars(final String value, final char[] chars) {
- final StringBuffer result = new StringBuffer();
- if (value != null && chars != null && chars.length > 0) {
- final String removeChars = String.valueOf(chars);
- for (int i = 0; i < value.length(); i++) {
- final String character = value.substring(i, i + 1);
- if (removeChars.indexOf(character) == -1) {
- result.append(character);
- }
- }
- } else {
- result.append(value);
- }
- return result.toString();
- }
-
- /**
- * Join string pieces and separate with a delimiter. Similar to the perl function of
- * the same name. If strings or delimiter are null, null is returned. Otherwise, at
- * least an empty string will be returned.
- * @see #split
- *
- * @param strings String pieces to join
- * @param delimiter Delimiter to put between string pieces
- * @return One merged string
- */
- public static String join(List strings, String delimiter) {
- if(strings == null || delimiter == null) {
- return null;
- }
-
- StringBuffer str = new StringBuffer();
-
- // This is the standard problem of not putting a delimiter after the last
- // string piece but still handling the special cases. A typical way is to check every
- // iteration if it is the last one and skip the delimiter - this is avoided by
- // looping up to the last one, then appending just the last one.
-
- // First we loop through all but the last one (if there are at least 2) and
- // put the piece and a delimiter after it. An iterator is used to walk the list.
- int most = strings.size()-1;
- if(strings.size() > 1) {
- Iterator iter = strings.iterator();
- for(int i=0; i<most; i++) {
- str.append(iter.next());
- str.append(delimiter);
- }
- }
-
- // If there is at least one element, put the last one on with no delimiter after.
- if(strings.size() > 0) {
- str.append(strings.get(most));
- }
-
- return str.toString();
- }
-
- /**
- * Return a stringified version of the array.
- * @param array the array
- * @param delim the delimiter to use between array components
- * @return the string form of the array
- */
- public static String toString( final Object[] array, final String delim ) {
- if ( array == null ) {
- return ""; //$NON-NLS-1$
- }
- if ( array.length == 0 ) {
- return "[]"; //$NON-NLS-1$
- }
- final StringBuffer sb = new StringBuffer();
- sb.append('[');
- for (int i = 0; i < array.length; ++i) {
- if ( i != 0 ) {
- sb.append(delim);
- }
- sb.append(array[i]);
- }
- sb.append(']');
- return sb.toString();
- }
-
- /**
- * Return a stringified version of the array, using a ',' as a delimiter
- * @param array the array
- * @return the string form of the array
- * @see #toString(Object[], String)
- */
- public static String toString( final Object[] array ) {
- return toString(array,","); //$NON-NLS-1$
- }
-
- /**
- * Split a string into pieces based on delimiters. Similar to the perl function of
- * the same name. The delimiters are not included in the returned strings.
- * @see #join
- *
- * @param str Full string
- * @param splitter Characters to split on
- * @return List of String pieces from full string
- */
- public static List split(String str, String splitter) {
- StringTokenizer tokens = new StringTokenizer(str, splitter);
- ArrayList l = new ArrayList(tokens.countTokens());
- while(tokens.hasMoreTokens()) {
- l.add(tokens.nextToken());
- }
- return l;
- }
-
- /**
- * Break a string into pieces based on matching the full delimiter string in the text.
- * The delimiter is not included in the returned strings.
- * @param target The text to break up.
- * @param delimiter The sub-string which is used to break the target.
- * @return List of String from the target.
- */
- public static List splitOnEntireString(String target, String delimiter) {
- ArrayList result = new ArrayList();
- if (delimiter.length() > 0) {
- int index = 0;
- int indexOfNextMatch = target.indexOf(delimiter);
- while (indexOfNextMatch > -1) {
- result.add(target.substring(index, indexOfNextMatch));
- index = indexOfNextMatch + delimiter.length();
- indexOfNextMatch = target.indexOf(delimiter, index);
- }
- if (index <= target.length()) {
- result.add(target.substring(index));
- }
- } else {
- result.add(target);
- }
- return result;
- }
-
- /**
- * Split a string into pieces based on delimiters preserving spaces in
- * quoted substring as on element in the returned list. The delimiters are
- * not included in the returned strings.
- * @see #join
- *
- * @param str Full string
- * @param splitter Characters to split on
- * @return List of String pieces from full string
- */
- public static List splitPreservingQuotedSubstring(String str, String splitter) {
- ArrayList l = new ArrayList();
- StringTokenizer tokens = new StringTokenizer(str, splitter);
- StringBuffer token = new StringBuffer();
- while(tokens.hasMoreTokens()) {
- token.setLength(0);
- token.append(tokens.nextToken());
- if ( token.charAt(0) == '"' ) {
- token.deleteCharAt(0);
- while ( tokens.hasMoreTokens() ) {
- token.append(Constants.SPACE + tokens.nextToken());
- if ( token.charAt(token.length() -1) == '"' ) {
- token.deleteCharAt(token.length() - 1);
- break;
- }
- }
- }
- l.add(token.toString().trim());
- }
- return l;
- }
-
- /*
- * Replace a single occurrence of the search string with the replace string
- * in the source string. If any of the strings is null or the search string
- * is zero length, the source string is returned.
- * @param source the source string whose contents will be altered
- * @param search the string to search for in source
- * @param replace the string to substitute for search if present
- * @return source string with the *first* occurrence of the search string
- * replaced with the replace string
- */
- public static String replace(String source, String search, String replace) {
- if (source != null && search != null && search.length() > 0 && replace != null) {
- int start = source.indexOf(search);
- if (start > -1) {
- return new StringBuffer(source).replace(start, start + search.length(), replace).toString();
- }
- }
- return source;
- }
-
- /*
- * Replace all occurrences of the search string with the replace string
- * in the source string. If any of the strings is null or the search string
- * is zero length, the source string is returned.
- * @param source the source string whose contents will be altered
- * @param search the string to search for in source
- * @param replace the string to substitute for search if present
- * @return source string with *all* occurrences of the search string
- * replaced with the replace string
- */
- public static String replaceAll(String source, String search, String replace) {
- if (source != null && search != null && search.length() > 0 && replace != null) {
- int start = source.indexOf(search);
- if (start > -1) {
- StringBuffer newString = new StringBuffer(source);
- replaceAll(newString, search, replace);
- return newString.toString();
- }
- }
- return source;
- }
-
- public static void replaceAll(StringBuffer source, String search, String replace) {
- if (source != null && search != null && search.length() > 0 && replace != null) {
- int start = source.toString().indexOf(search);
- while (start > -1) {
- int end = start + search.length();
- source.replace(start, end, replace);
- start = source.toString().indexOf(search, start + replace.length());
- }
- }
- }
-
- /**
- * Simple static method to tuncate Strings to given length.
- * @param in the string that may need tuncating.
- * @param len the lenght that the string should be truncated to.
- * @return a new String containing chars with length <= len or <code>null</code>
- * if input String is <code>null</code>.
- */
- public static String truncString(String in, int len) {
- String out = in;
- if ( in != null && len > 0 && in.length() > len ) {
- out = in.substring(0, len);
- }
- return out;
- }
-
- /**
- * Simple utility method to wrap a string by inserting line separators creating
- * multiple lines each with length no greater than the user specified maximum.
- * The method parses the given string into tokens using a space delimiter then
- * reassembling the tokens into the resulting string while inserting separators
- * when required. If the number of characters in a single token is greater
- * than the specified maximum, the token will not be split but instead the
- * maximum will be exceeded.
- * @param str the string that may need tuncating.
- * @param maxCharPerLine the max number of characters per line
- * @return a new String containing line separators or the original string
- * if its length was less than the maximum.
- */
- public static String wrap(String str, int maxCharPerLine) {
- int strLength = str.length();
- if (strLength > maxCharPerLine) {
- StringBuffer sb = new StringBuffer(str.length()+(strLength/maxCharPerLine)+1);
- strLength = 0;
- List tokens = StringUtil.split(str,Constants.SPACE);
- Iterator itr = tokens.iterator();
- while (itr.hasNext()) {
- String token = (String) itr.next();
- if ( strLength+token.length() > maxCharPerLine ) {
-// sb.append(getLineSeparator());
- sb.append(Constants.NEW_LINE);
- strLength = 0;
- }
- sb.append(token);
- sb.append(Constants.SPACE);
- strLength += token.length()+1;
- }
- return sb.toString();
- }
- return str;
- }
-
- /**
- * Return the tokens in a string in a list. This is particularly
- * helpful if the tokens need to be processed in reverse order. In that case,
- * a list iterator can be acquired from the list for reverse order traversal.
- *
- * @param str String to be tokenized
- * @param delimiter Characters which are delimit tokens
- * @return List of string tokens contained in the tokenized string
- */
- public static List getTokens(String str, String delimiter) {
- ArrayList l = new ArrayList();
- StringTokenizer tokens = new StringTokenizer(str, delimiter);
- while(tokens.hasMoreTokens()) {
- l.add(tokens.nextToken());
- }
- return l;
- }
-
- /**
- * Return the number of tokens in a string that are seperated by the delimiter.
- *
- * @param str String to be tokenized
- * @param delimiter Characters which are delimit tokens
- * @return Number of tokens seperated by the delimiter
- */
- public static int getTokenCount(String str, String delimiter) {
- StringTokenizer tokens = new StringTokenizer(str, delimiter);
- return tokens.countTokens();
- }
-
- /**
- * Return the number of occurrences of token string that occurs in input string.
- * Note: token is case sensitive.
- *
- * @param input
- * @param token
- * @return int
- */
- public static int occurrences(String input, String token) {
- int num = 0;
- int index = input.indexOf(token);
- while (index >= 0) {
- num++;
- index = input.indexOf(token, index+1);
- }
- return num;
- }
-
- /**
- * Return the last token in the string.
- *
- * @param str String to be tokenized
- * @param delimiter Characters which are delimit tokens
- * @return the last token contained in the tokenized string
- */
- public static String getLastToken(String str, String delimiter) {
- if (str == null) {
- return Constants.EMPTY_STRING;
- }
- int beginIndex = 0;
- if (str.lastIndexOf(delimiter) > 0) {
- beginIndex = str.lastIndexOf(delimiter)+1;
- }
- return str.substring(beginIndex,str.length());
- }
-
-
- /**
- * Return the first token in the string.
- *
- * @param str String to be tokenized
- * @param delimiter Characters which are delimit tokens
- * @return the first token contained in the tokenized string
- */
- public static String getFirstToken(String str, String delimiter) {
- if (str == null) {
- return Constants.EMPTY_STRING;
- }
- int endIndex = str.indexOf(delimiter);
- if (endIndex < 0) {
- endIndex = str.length();
- }
- return str.substring(0,endIndex);
- }
-
-
- public static String computePluralForm(String str) {
- return computePluralForm(str, Constants.EMPTY_STRING);
- }
-
- public static String computePluralForm(String str, String defaultValue ) {
- if ( str == null || str.length() == 0 ) {
- return defaultValue;
- }
- String result = str;
- if ( result.endsWith("es") ) { //$NON-NLS-1$
- // do nothing
- } else if ( result.endsWith("ss") || //$NON-NLS-1$
- result.endsWith("x") || //$NON-NLS-1$
- result.endsWith("ch") || //$NON-NLS-1$
- result.endsWith("sh") ) { //$NON-NLS-1$
- result = result + "es"; //$NON-NLS-1$
- } else if ( result.endsWith("y") && ! ( //$NON-NLS-1$
- result.endsWith("ay") || //$NON-NLS-1$
- result.endsWith("ey") || //$NON-NLS-1$
- result.endsWith("iy") || //$NON-NLS-1$
- result.endsWith("oy") || //$NON-NLS-1$
- result.endsWith("uy") || //$NON-NLS-1$
- result.equalsIgnoreCase("any") ) ) { //$NON-NLS-1$
- result = result.substring(0, result.length()-1) + "ies"; //$NON-NLS-1$
- } else {
- result += "s"; //$NON-NLS-1$
- }
- return result;
- }
-
- public static String getStackTrace( final Throwable t ) {
- final ByteArrayOutputStream bas = new ByteArrayOutputStream();
- final PrintWriter pw = new PrintWriter(bas);
- t.printStackTrace(pw);
- pw.close();
- return bas.toString();
- }
-
- /**
- * Returns whether the specified text represents a boolean value, i.e., whether it equals "true" or "false"
- * (case-insensitive).
- * @since 4.0
- */
- public static boolean isBoolean(final String text) {
- return (Boolean.TRUE.toString().equalsIgnoreCase(text) || Boolean.FALSE.toString().equalsIgnoreCase(text));
- }
-
- /**<p>
- * Returns whether the specified text is either empty or null.
- * </p>
- * @param text The text to check; may be null;
- * @return True if the specified text is either empty or null.
- * @since 4.0
- */
- public static boolean isEmpty(final String text) {
- return (text == null || text.length() == 0);
- }
-
- /**
- * Returns the index within this string of the first occurrence of the
- * specified substring. The integer returned is the smallest value
- * <i>k</i> such that:
- * <blockquote><pre>
- * this.startsWith(str, <i>k</i>)
- * </pre></blockquote>
- * is <code>true</code>.
- *
- * @param text any string.
- * @param str any string.
- * @return if the str argument occurs as a substring within text,
- * then the index of the first character of the first
- * such substring is returned; if it does not occur as a
- * substring, <code>-1</code> is returned. If the text or
- * str argument is null or empty then <code>-1</code> is returned.
- */
- public static int indexOfIgnoreCase(final String text, final String str) {
- if (isEmpty(text)) {
- return -1;
- }
- if (isEmpty(str)) {
- return -1;
- }
- final String lowerText = text.toLowerCase();
- final String lowerStr = str.toLowerCase();
- return lowerText.indexOf(lowerStr);
- }
-
- /**
- * Tests if the string starts with the specified prefix.
- *
- * @param text the string to test.
- * @param prefix the prefix.
- * @return <code>true</code> if the character sequence represented by the
- * argument is a prefix of the character sequence represented by
- * this string; <code>false</code> otherwise.
- * Note also that <code>true</code> will be returned if the
- * prefix is an empty string or is equal to the text
- * <code>String</code> object as determined by the
- * {@link #equals(Object)} method. If the text or
- * prefix argument is null <code>false</code> is returned.
- * @since JDK1. 0
- */
- public static boolean startsWithIgnoreCase(final String text, final String prefix) {
- if (isEmpty(text)) {
- return false;
- }
- if (prefix == null) {
- return false;
- }
- int textLength = text.length();
- int prefixLength = prefix.length();
- if (prefixLength == 0) {
- return true;
- }
- if (prefixLength > textLength) {
- return false;
- }
- char[] chArray = prefix.toCharArray();
- for (int i = 0; i != chArray.length; ++i) {
- char ch1 = chArray[i];
- char ch2 = text.charAt(i);
- if (ch1 == ch2 || Character.toLowerCase(ch1) == Character.toLowerCase(ch2)) {
- // continue
- } else {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Tests if the string ends with the specified suffix.
- *
- * @param text the string to test.
- * @param suffix the suffix.
- * @return <code>true</code> if the character sequence represented by the
- * argument is a suffix of the character sequence represented by
- * this object; <code>false</code> otherwise. Note that the
- * result will be <code>true</code> if the suffix is the
- * empty string or is equal to this <code>String</code> object
- * as determined by the {@link #equals(Object)} method. If the text or
- * suffix argument is null <code>false</code> is returned.
- */
- public static boolean endsWithIgnoreCase(final String text, final String suffix) {
- if (isEmpty(text)) {
- return false;
- }
- if (suffix == null) {
- return false;
- }
- int textLength = text.length();
- int suffixLength = suffix.length();
- if (suffixLength == 0) {
- return true;
- }
- if (suffixLength > textLength) {
- return false;
- }
- int offset = textLength - suffixLength;
- char[] chArray = suffix.toCharArray();
- for (int i = 0; i != chArray.length; ++i) {
- char ch1 = chArray[i];
- char ch2 = text.charAt(offset + i);
- if (ch1 == ch2 || Character.toLowerCase(ch1) == Character.toLowerCase(ch2)) {
- // continue
- } else {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Determine if the string passed in has all digits as its contents
- * @param str
- * @return true if digits; false otherwise
- */
- public static boolean isDigits(String str) {
- for(int i=0; i<str.length(); i++) {
- if(!StringUtil.isDigit(str.charAt(i))) {
- return false;
- }
- }
- return true;
- }
- //============================================================================================================================
- // Constructors
-
- /**<p>
- * Prevents instantiation.
- * </p>
- * @since 4.0
- */
- private StringUtil() {
- }
-
- /*
- * Converts user string to regular expres '*' and '?' to regEx variables.
- * copied from eclipse's PatternConstructor
- */
- static String asRegEx(String pattern) {
- // Replace \ with \\, * with .* and ? with .
- // Quote remaining characters
- String result1 = Constants.PATTERN_BACK_SLASH.matcher(pattern).replaceAll(
- "\\\\E\\\\\\\\\\\\Q"); //$NON-NLS-1$
- String result2 = Constants.PATTERN_STAR.matcher(result1).replaceAll(
- "\\\\E.*\\\\Q"); //$NON-NLS-1$
- String result3 = Constants.PATTERN_QUESTION.matcher(result2).replaceAll(
- "\\\\E.\\\\Q"); //$NON-NLS-1$
- return "\\Q" + result3 + "\\E"; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- /**
- * Creates a regular expression pattern from the pattern string (which is
- * our old 'StringMatcher' format). Copied from Eclipse's PatternConstructor class.
- *
- * @param pattern
- * The search pattern
- * @param isCaseSensitive
- * Set to <code>true</code> to create a case insensitve pattern
- * @return The created pattern
- */
- public static Pattern createPattern(String pattern, boolean isCaseSensitive) {
- if (isCaseSensitive)
- return Pattern.compile(asRegEx(pattern));
- return Pattern.compile(asRegEx(pattern), Pattern.CASE_INSENSITIVE
- | Pattern.UNICODE_CASE);
- }
-
- /**
- * Removes extraneous whitespace from a string. By it's nature, it will be trimmed also.
- * @param raw
- * @return
- * @since 5.0
- */
- public static String collapseWhitespace(String raw) {
- StringBuffer rv = new StringBuffer(raw.length());
-
- StringTokenizer izer = new StringTokenizer(raw, " "); //$NON-NLS-1$
- while (izer.hasMoreTokens()) {
- String tok = izer.nextToken();
- // Added one last check here so we don't append a "space" on the end of the string
- rv.append(tok);
- if( izer.hasMoreTokens() ) {
- rv.append(' ');
- }
- } // endwhile
-
- return rv.toString();
- }
-
- /**
- * If input == null OR input.length() < desiredLength, pad to desiredLength with spaces.
- * If input.length() > desiredLength, chop at desiredLength.
- * @param input Input text
- * @param desiredLength Desired length
- * @return
- * @since 5.0
- */
- public static String toFixedLength(String input, int desiredLength) {
- if(input == null) {
- input = ""; //$NON-NLS-1$
- }
-
- if(input.length() == desiredLength) {
- return input;
- }
-
- if(input.length() < desiredLength) {
- StringBuffer str = new StringBuffer(input);
- int needSpaces = desiredLength - input.length();
- for(int i=0; i<needSpaces; i++) {
- str.append(' ');
- }
- return str.toString();
- }
-
- // Else too long - chop
- return input.substring(0, desiredLength);
- }
-
-
- public static boolean isLetter(char c) {
- return isBasicLatinLetter(c) || Character.isLetter(c);
- }
- public static boolean isDigit(char c) {
- return isBasicLatinDigit(c) || Character.isDigit(c);
- }
- public static boolean isLetterOrDigit(char c) {
- return isBasicLatinLetter(c) || isBasicLatinDigit(c) || Character.isLetterOrDigit(c);
- }
-
- public static String toUpperCase(String str) {
- String newStr = convertBasicLatinToUpper(str);
- if (newStr == null) {
- return str.toUpperCase();
- }
- return newStr;
- }
-
- public static String toLowerCase(String str) {
- String newStr = convertBasicLatinToLower(str);
- if (newStr == null) {
- return str.toLowerCase();
- }
- return newStr;
- }
-
- /**
- * Create a valid filename from the given String.
- *
- * @param str The String to convert to a valid filename.
- * @param defaultName The default name to use if only special characters exist.
- * @return String A valid filename.
- */
- public static String createFileName(String str) {
-
- /** Replace some special chars */
- str = str.replaceAll(" \\| ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- str = str.replaceAll(">", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- str = str.replaceAll(": ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- str = str.replaceAll(" ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- str = str.replaceAll("\\?", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- str = str.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$
-
- /** If filename only contains of special chars */
- if (str.matches("[_]+")) //$NON-NLS-1$
- str = "file"; //$NON-NLS-1$
-
- return str;
- }
-
-
- /**
- * Make the first letter uppercase
- * @param str
- * @return The string with the first letter being changed to uppercase
- * @since 5.5
- */
- public static String firstLetterUppercase(String str) {
- if(str == null || str.length() == 0) {
- return null;
- }
- if(str.length() == 1) {
- return str.toUpperCase();
- }
- return str.substring(0, 1).toUpperCase() + str.substring(1);
- }
-
- private static String convertBasicLatinToUpper(String str) {
- char[] chars = str.toCharArray();
- for (int i = 0; i < chars.length; i++) {
- if (isBasicLatinLowerCase(chars[i])) {
- chars[i] = (char)('A' + (chars[i] - 'a'));
- } else if (!isBasicLatinChar(chars[i])) {
- return null;
- }
- }
- return new String(chars);
- }
-
- private static String convertBasicLatinToLower(String str) {
- char[] chars = str.toCharArray();
- for (int i = 0; i < chars.length; i++) {
- if (isBasicLatinUpperCase(chars[i])) {
- chars[i] = (char)('a' + (chars[i] - 'A'));
- } else if (!isBasicLatinChar(chars[i])) {
- return null;
- }
- }
- return new String(chars);
- }
-
- private static boolean isBasicLatinUpperCase(char c) {
- return c >= 'A' && c <= 'Z';
- }
- private static boolean isBasicLatinLowerCase(char c) {
- return c >= 'a' && c <= 'z';
- }
- private static boolean isBasicLatinLetter(char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
- }
- private static boolean isBasicLatinDigit(char c) {
- return c >= '0' && c <= '9';
- }
- private static boolean isBasicLatinChar(char c) {
- return c <= '\u007F';
- }
-
- /**
- * Convert the given value to specified type.
- * @param value
- * @param type
- * @return
- */
- @SuppressWarnings("unchecked")
- public static <T> T valueOf(String value, Class type){
-
- if(type == String.class) {
- return (T) value;
- }
- else if(type == Boolean.class || type == Boolean.TYPE) {
- return (T) Boolean.valueOf(value);
- }
- else if (type == Integer.class || type == Integer.TYPE) {
- return (T) Integer.decode(value);
- }
- else if (type == Float.class || type == Float.TYPE) {
- return (T) Float.valueOf(value);
- }
- else if (type == Double.class || type == Double.TYPE) {
- return (T) Double.valueOf(value);
- }
- else if (type == Long.class || type == Long.TYPE) {
- return (T) Long.decode(value);
- }
- else if (type == Short.class || type == Short.TYPE) {
- return (T) Short.decode(value);
- }
- else if (type.isAssignableFrom(List.class)) {
- return (T)new ArrayList<String>(Arrays.asList(value.split(","))); //$NON-NLS-1$
- }
- else if (type == Void.class) {
- return null;
- }
- else if (type.isEnum()) {
- return (T)Enum.valueOf(type, value);
- }
-
- else if (type.isAssignableFrom(Map.class)) {
- List<String> l = Arrays.asList(value.split(",")); //$NON-NLS-1$
- Map m = new HashMap<String, String>();
- for(String key: l) {
- int index = key.indexOf('=');
- if (index != -1) {
- m.put(key.substring(0, index), key.substring(index+1));
- }
- }
- return (T)m;
- }
-
- throw new IllegalArgumentException("Conversion from String to "+ type.getName() + " is not supported"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-}
Copied: branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java (from rev 1610, trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java)
===================================================================
--- branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java (rev 0)
+++ branches/JCA/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * All rights reserved.
+ * This code is made available under the terms of the Eclipse Public
+ * License, version 1.0.
+ */
+
+package org.teiid.test.util;
+
+
+/**
+ * This is a common place to put String utility methods.
+ */
+public final class StringUtil {
+
+
+
+ public static String removeChars(final String value, final char[] chars) {
+ final StringBuffer result = new StringBuffer();
+ if (value != null && chars != null && chars.length > 0) {
+ final String removeChars = String.valueOf(chars);
+ for (int i = 0; i < value.length(); i++) {
+ final String character = value.substring(i, i + 1);
+ if (removeChars.indexOf(character) == -1) {
+ result.append(character);
+ }
+ }
+ } else {
+ result.append(value);
+ }
+ return result.toString();
+ }
+
+
+}
Modified: branches/JCA/test-integration/db/src/main/resources/configuration.xml
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/configuration.xml 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/resources/configuration.xml 2009-12-01 19:45:17 UTC (rev 1612)
@@ -268,7 +268,7 @@
<PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="sun.jdbc.odbc.JdbcOdbcDriver" IsRequired="true" />
<PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:odbc:Driver={MicroSoft Excel Driver (*.xls)};DBQ=<filePathToExcelFile>" IsRequired="true" />
</ComponentType>
- <!--
+
<ComponentType Name="Datadirect DB2 8 Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="JDBC Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.928-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.928-06:00">
<PropertyDefinition Name="ConnectionSource" DisplayName="Connection Source Class" ShortDescription="Driver, DataSource, or XADataSource class name" DefaultValue="com.metamatrix.jdbcx.db2.DB2DataSource" IsRequired="true" />
<PropertyDefinition Name="URL" DisplayName="JDBC URL" ShortDescription="" DefaultValue="jdbc:mmx:db2://<host>:50000;DatabaseName=<databasename>;CollectionID=<collectionid>;PackageName=<packagename>" IsRequired="true" />
@@ -294,7 +294,7 @@
<PropertyDefinition Name="IsXA" DisplayName="Is XA" ShortDescription="Is XA" DefaultValue="true" IsRequired="true" PropertyType="Boolean" />
<PropertyDefinition Name="SetCriteriaBatchSize" DisplayName="Max Values in IN Predicate" ShortDescription="Max number of values in an IN Predicate. Must be >= 0." DefaultValue="250" PropertyType="Integer" IsExpert="true" />
</ComponentType>
- --> <ComponentType Name="LDAP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.946-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.946-06:00">
+ <ComponentType Name="LDAP Connector" ComponentTypeCode="2" Deployable="true" Deprecated="false" Monitorable="false" SuperComponentType="Connector" ParentComponentType="Connectors" LastChangedBy="ConfigurationStartup" LastChangedDate="2008-10-31T10:26:19.946-06:00" CreatedBy="ConfigurationStartup" CreationDate="2008-10-31T10:26:19.946-06:00">
<PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:connector-ldap-6.2.0-SNAPSHOT.jar;" IsModifiable="false" />
<PropertyDefinition Name="SearchDefaultBaseDN" DisplayName="Default Search Base DN" ShortDescription="Default Base DN for LDAP Searches" IsExpert="true" />
<PropertyDefinition Name="LdapAdminUserDN" DisplayName="Ldap Admin User DN" ShortDescription="User DN for the LDAP admin account." DefaultValue="cn=<>,ou=<>,dc=<>" IsRequired="true" />
Modified: branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/manage_schemas.xml 2009-12-01 19:45:17 UTC (rev 1612)
@@ -23,15 +23,36 @@
<isset property="single"/>
</not>
</condition>
+
+ <available file="${datasourceloc}" property="external.datasource.dir"/>
</target>
+
- <target name="init">
+ <target name="init"
+ depends="check.external.ds.dir, set.local.ds.dir">
+
<mkdir dir="${target.dir}"/>
+
</target>
+
+
+ <target name="check.external.ds.dir"
+ if="external.datasource.dir">
+ <property name="ds.loc" value="${datasourceloc}"></property>
+
+ </target>
+
+ <target name="set.local.ds.dir"
+ unless="external.datasource.dir">
+
+ <property name="ds.loc" value="${resources.dir}/datasources/"></property>
+
+ </target>
+
<target name="manage.all.schemas" if="all">
- <echo>Creating all schemas from datasource dir ${resources.dir}</echo>
+ <echo>Creating all schemas from datasource dir ${ds.loc}</echo>
<!--
This will process each directory located under the refid location.
Its expects the following:
@@ -39,7 +60,7 @@
- connection.properties file must exist in the directory to be used
-->
<subant genericantfile="${resources.dir}/ddl/run_ddl.xml" inheritall="true" >
- <dirset dir="${resources.dir}/datasources/" />
+ <dirset dir="${ds.loc}" />
<property name="sql.ddl.dir" value="${resources.dir}/ddl"/>
<property name="lib.dir" value="${basedir}/lib"/>
@@ -50,14 +71,14 @@
<target name="manage.single.schemas" if="single">
- <echo>Creating single schema ${single}</echo>
+ <echo>Creating single schema ${ds.loc}/${single}</echo>
- <available file="${resources.dir}/datasources/${single}" property="dir.exist"/>
- <fail unless="dir.exist" message="The datasource single was not found at ${resources.dir}/datasources/${single}" />
+ <available file="${ds.loc}/${single}" property="dir.exist"/>
+ <fail unless="dir.exist" message="The datasource single was not found at ${ds.loc}/${single}" />
<ant inheritAll="true" antfile="${resources.dir}/ddl/run_ddl.xml">
- <property name="basedir" value="${resources.dir}/datasources/${single}"/>
+ <property name="basedir" value="${ds.loc}/${single}"/>
<property name="sql.ddl.dir" value="${resources.dir}/ddl"/>
<property name="lib.dir" value="${basedir}/lib"/>
Modified: branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/resources/ddl/mysql/create_tables.sql 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,6 +1,12 @@
-- these tables are used by custom junit test for testing transactions
+create Table g1 (e1 NUMERIC(5) PRIMARY KEY, e2 varchar(50))ENGINE=INNODB;
+create Table g2 (e1 NUMERIC(5), e2 varchar(50), FOREIGN KEY (e1) REFERENCES g1(e1))ENGINE=INNODB;
-create Table g1 (e1 INT PRIMARY KEY, e2 varchar(50))ENGINE=InnoDB;
-create Table g2 (e1 INT, e2 varchar(50), FOREIGN KEY (e1) REFERENCES g1(e1))ENGINE=InnoDB;
-
+
+--create Table g1 (e1 NUMERIC(5) PRIMARY KEY, e2 varchar(50));
+--create Table g2 (e1 NUMERIC(5) REFERENCES g1 (e1), e2 varchar(50));
+
+
+
+
\ No newline at end of file
Modified: branches/JCA/test-integration/db/src/main/resources/default-config.properties
===================================================================
--- branches/JCA/test-integration/db/src/main/resources/default-config.properties 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/main/resources/default-config.properties 2009-12-01 19:45:17 UTC (rev 1612)
@@ -2,10 +2,8 @@
# Common Properties for everybody
##########################################
+connection-type=datasource
-# local, xa, jndi
-#transaction-type=local
-
process-batch = 20
connector-batch = 20
@@ -17,13 +15,15 @@
# properties for Teiid connection
##########################################
#driver=org.teiid.jdbc.TeiidDriver
-driver=org.teiid.jdbc.TeiidDataSource
+driver=com.metamatrix.jdbc.EmbeddedDataSource
-URL=jdbc:teiid:Transaction@mm://localhost:31000;user=admin;password=teiid
+#URL=jdbc:teiid:Transaction@mm://localhost:31000
+URL=jdbc:metamatrix:Transaction@target/classes/transactions/transaction.properties;user=admin;password=teiid
User=admin
Password=teiid
DatabaseName=Transaction
-ServerName=localhost
+#ServerName=localhost
+ServerName=target/classes/transactions/transaction.properties
PortNumber=31000
application-name=txn-test
@@ -41,7 +41,7 @@
#
# By providing the numerical order, it indicates which datasource to assign based on the order in the usedatasources property.
#
-# If -Dusedatasources is not set, then the datasource will be assigned in the order they are calling to obtain a datasource.
+# If -Dusedatasources is not set, then the datasource will be assigned randomly when obtaining a datasource.
#
#
@@ -49,29 +49,5 @@
pm2=2
-##########################################
-# For default design of testcases, these properties are in the setup method of the testcase.
-# However, you can create your own version of the config properties file
-# and specify these properties in the config file
-# NOTE: will need to set the Sytem "config" property in order to override the default-config.properties file
-##########################################
-#available types (datasource, driver, jndi)
-#connection-type=datasource
-#connection-type=driver
-
-# autocommit applies to local transaction-type only
-# default is true
-#autocommit=false
-
-# AUTO_WRAP_OFF = "OFF"
-# AUTO_WRAP_ON = "ON"
-# AUTO_WRAP_PESSIMISTIC = "PESSIMISTIC"
-# AUTO_WRAP_OPTIMISTIC = "OPTIMISTIC"
-
-#txnAutoWrap=off
-
-#-----------------------------
-
-
Modified: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java 2009-12-01 18:51:26 UTC (rev 1611)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/BaseAbstractTransactionTestCase.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -1,46 +1,44 @@
-/*
- * Copyright (c) 2000-2007 MetaMatrix, Inc.
- * All rights reserved.
- */
package org.teiid.test.testcases;
-
-
-import java.sql.Connection;
-
-import javax.sql.XAConnection;
-
import junit.framework.TestCase;
+import org.teiid.test.framework.ConfigPropertyLoader;
import org.teiid.test.framework.TransactionContainer;
-import org.teiid.test.framework.connection.ConnectionUtil;
-import org.teiid.test.framework.datasource.DataSourceMgr;
-import org.teiid.test.framework.exception.QueryTestFailedException;
-import org.teiid.test.framework.transaction.TransactionFactory;
-public class BaseAbstractTransactionTestCase extends TestCase {
+public abstract class BaseAbstractTransactionTestCase extends TestCase {
+
+ protected TransactionContainer container = null;
-
public BaseAbstractTransactionTestCase(String name) {
- super(name);
+ super(name);
+
+
}
+
+ protected abstract TransactionContainer getTransactionContainter();
- @Override
- protected void setUp() throws Exception {
- DataSourceMgr.reset();
- }
- protected TransactionContainer getTransactionContainter() throws QueryTestFailedException {
- return TransactionFactory.create();
+
+ @Override
+ protected void setUp() throws Exception {
+ // TODO Auto-generated method stub
+ super.setUp();
}
+ @Override
+ protected void tearDown() throws Exception {
+ // TODO Auto-generated method stub
+ super.tearDown();
-// public Connection getSource(String identifier) throws QueryTestFailedException {
-// return ConnectionUtil.getSource(identifier);
-// }
-//
-// public XAConnection getXASource(String identifier) throws QueryTestFailedException {
-// return ConnectionUtil.getXASource(identifier);
-// }
+ }
+
+ protected void addProperty(String key, String value) {
+
+ ConfigPropertyLoader.getInstance().setProperty(key, value);
+
+ }
+
+
+
}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/CommonTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,604 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OnWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+/**
+ * A common test case among many different transaction stuff.
+ */
+public abstract class CommonTransactionTests extends BaseAbstractTransactionTestCase {
+
+ public CommonTransactionTests(String name) {
+ super(name);
+ }
+
+ protected abstract TransactionContainer getTransactionContainter();
+
+// void runConcurrentTestCases(int howMany, final String[] sqls) {
+//
+// SeparateClient[] clients = new SeparateClient[howMany];
+//
+// for(int i = 0; i < howMany; i++) {
+// AbstractQueryTransactionTest testCase = new AbstractQueryTransactionTest() {
+// public void testCase() throws Exception {
+// execute(sqls);
+// }
+// };
+// clients[i] = new SeparateClient(getTransactionContainter(), testCase);
+// }
+//
+// for(int i = 0; i < howMany; i++) {
+// clients[i].start();
+// }
+//
+// try {
+// for(int i = 0; i < howMany; i++) {
+// clients[i].join();
+// }
+// } catch (InterruptedException e) {
+// // boo
+// }
+// }
+
+// static class SeparateClient extends Thread{
+// TransactionContainer container = null;
+// AbstractTransactionTestCase testCase = null;
+//
+// public SeparateClient(TransactionContainer container, AbstractTransactionTestCase testCase) {
+// this.container = container;
+// this.testCase = testCase;
+// }
+//
+// public void run() {
+// this.container.runTransaction(this.testCase);
+// }
+// }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Single Source - Rows below 500 (for insert/update/delete)
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // there is nothing to verify here..
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(100, '100')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 100");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourcePreparedUpdate") {
+
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(?, ?)", new Object[] {new Integer(102), "102"});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 102");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 100; i < 110; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 100");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePartialProcessing() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourcePartialProcessing") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100 limit 10");
+ assertRowCount(10);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceVirtualSelect") {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1 where vm.g1.pm1e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(500, '500', 500, '500')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e2 = '500'");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e2 = '500'");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelectInto() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceSelectInto") {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(501, '501', 501, '501')");
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 = 501");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e2 = '501'");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e2 = '501'");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsert() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceBulkRowInsert") {
+ public void testCase() throws Exception {
+ for (int i = 100; i < 112; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 112");
+ test.assertRowCount(12);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePreparedUpdate") {
+ public void testCase() throws Exception {
+ Integer value = new Integer(500);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {value, value.toString(), value, value.toString()});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm2.g2 where e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm2.g1 where e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 100; i < 115; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ execute("update pm1.g1 set e2='blah' where e1 > 100");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1")) {
+ protected boolean compareCaseSensitive() {
+ return false;
+ }
+ };
+ test.execute("select * from g1 where e1 >= 100 and e1 < 115");
+ test.assertRowCount(15);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 115");
+ test.assertRowCount(15);
+ test.execute("select distinct e2 from g1 where e1 > 100");
+
+ // NOTE: if this is an oracle source, it failes because it return varchar2
+ if (userTxn.getSource("pm1").getMetaData().getDatabaseProductName().toLowerCase().indexOf("oracle") > -1) {
+ test.assertResultsSetEquals(new String[] {"e2[varchar2]", "blah"});
+ } else {
+ test.assertResultsSetEquals(new String[] {"e2[varchar]", "blah"});
+ }
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleVirtualCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleVirtualCommands") {
+ public void testCase() throws Exception {
+
+ for (int i = 200; i < 207; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ execute("insert into vm.g2 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+
+ execute("update vm.g1 set pm1e2='blah' where pm1e1 >= 200");
+
+ execute("delete from vm.g2 where vm.g2.pm1e1 >= 205");
+ execute("delete from vm.g1 where vm.g1.pm1e1 >= 205");
+
+ execute("select * from vm.g1 where pm1e1 >= 200 and pm1e1 < 207");
+ assertRowCount(5);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1")){
+ protected boolean compareCaseSensitive() {
+ return false;
+ }
+ };
+ test.execute("select * from g1 where e1 >= 200 and e1 < 207");
+ test.assertRowCount(5);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 207");
+ test.assertRowCount(5);
+ test.execute("select distinct e2 from g1 where e1 >= 200 and e1 < 207");
+ test.assertResultsSetEquals(new String[] {"e2[varchar2]", "blah"});
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsCancel() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsCancel") {
+
+ public void testCase() throws Exception {
+ Thread t = new Thread("Cancel Thread") {
+ public void run() {
+ try {
+ try {
+ Thread.sleep(500);
+ cancelQuery();
+ } catch (SQLException e) {
+ // debug(e.getMessage());
+ }
+ } catch (InterruptedException e) {}
+ }
+ };
+ t.start();
+ executeBatch(getMultipleSourceBatch());
+ }
+
+ /**
+ * @see com.metamatrix.transaction.test.framework.AbstractQueryTest#exceptionExpected()
+ */
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (this may finish under one second, then this test is not valid)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 650");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceTimeout() throws Exception{
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceTimeout") {
+ public void testCase() throws Exception {
+ executeBatch(getMultipleSourceBatch(), 1); // time out after 1 sec
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed with time out exception");
+ }
+ else {
+ assertTrue(getLastException().getMessage().indexOf("Operation timed out before completion") != -1);
+ }
+ }
+ };
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (this may finish under one second, then this test is not valid)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 750");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ static String[] getMultipleSourceBatch() {
+ ArrayList list = new ArrayList();
+
+ for (int i = 600; i < 750; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values ("+i+",'"+i+"')");
+ list.add("insert into pm2.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm2.g2 (e1, e2) values ("+i+",'"+i+"')");
+ }
+
+ list.add("update pm1.g1 set e2='blah' where pm1.g1.e1 >= 600");
+ list.add("update pm2.g1 set e2='blah' where pm2.g1.e1 >= 600");
+
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 610");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 610");
+ list.add("delete from pm2.g2 where pm2.g2.e1 >= 610");
+ list.add("delete from pm2.g1 where pm2.g1.e1 >= 610");
+
+ return(String[])list.toArray(new String[list.size()]);
+ }
+
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ * Note: This is producing the below error some times; however this is SQL Server issue.
+ * http://support.microsoft.com/?kbid=834849
+ */
+ public void xtestMultipleSourcePartialProcessingUsingLimit() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePartialProcessingUsingLimit") {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1 where pm1e1 < 100 limit 10");
+ assertRowCount(10);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Partial Processing, Single Connector Batch
+ * result = commit
+ * Note: This is producing the below error some times; however this is SQL Server issue.
+ * http://support.microsoft.com/?kbid=834849
+ */
+ public void xtestMultipleSourcePartialProcessingUsingMakedep() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourcePartialProcessingUsingMakedep") {
+ public void testCase() throws Exception {
+ execute("select pm1.g1.e1, pm1.g1.e2 from pm1.g1 LEFT OUTER JOIN pm2.g1 MAKENOTDEP ON pm1.g1.e2 = pm2.g1.e2 where pm2.g1.e1 >= 50 and pm2.g1.e1 < 100");
+ assertRowCount(50);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+
+
+
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/LocalTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.LocalTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+
+/**
+ * User Transaction Test is where user handles all the transaction boundaries
+ * so, autocmmit = OFF, and No transaction auto wrapping.
+ */
+public class LocalTransactionTests extends CommonTransactionTests {
+
+
+ public LocalTransactionTests(String testName) {
+ super(testName);
+ }
+
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new LocalTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsExplicitRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommandsExplicitRollback") {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 220; i++) {
+ execute("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ execute("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ }
+
+ public boolean rollbackAllways() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommandsReferentialIntegrityRollback") {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 220; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 220");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsExplicitRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsExplicitRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 720; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+
+ // force the rollback
+ public boolean rollbackAllways() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleCommandsReferentialIntegrityRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 720; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 720");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceBulkRowInsertRollback") {
+ public void testCase() throws Exception {
+ for (int i = 100; i < 120; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+ execute("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceMultipleVirtualCommandsRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testMultipleSourceMultipleVirtualCommandsRollback") {
+ public void testCase() throws Exception {
+
+ for (int i = 600; i < 615; i++) {
+ Integer val = new Integer(i);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ execute("insert into vm.g2 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {val, val.toString(), val, val.toString()});
+ }
+
+ execute("update vm.g1 set pm1e2='blah' where pm1e1 >= 605");
+
+ execute("delete from vm.g2 where vm.g2.pm1e1 >= 610");
+ execute("delete from vm.g1 where vm.g1.pm1e1 >= 610");
+
+ execute("select * from vm.g1 where pm1e1 >= 600 and pm1e1 < 615");
+ assertRowCount(10);
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.execute("select distinct e2 from g1 where e1 >= 600 and e1 < 615");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OffWrapTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OffWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+public class OffWrapTransactionTests extends BaseAbstractTransactionTestCase {
+
+
+
+ public OffWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new OffWrapTransaction();
+ }
+
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceSelect") {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceUpdate") {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(100, '100')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 100");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest("testSingleSourceMultipleCommands") {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+ for (int i = 100; i < 110; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 100");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(500, '500', 500, '500')");
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 = 500");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testMultipleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+
+ for (int i = 700; i < 710; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+
+ execute("insert into pm2.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm2.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // force the rollback by trying to insert an invalid row.
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 710");
+ test.assertRowCount(10);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 700 and e1 < 710");
+ test.assertRowCount(10);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsert() throws Exception {
+
+
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 800; i < 807; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm2.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 800");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ // execute((String[])list.toArray(new String[list.size()]));
+ executeBatch((String[])list.toArray(new String[list.size()]), -1);
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.execute("select * from g2 where e1 >= 800 and e1 < 807");
+ test.assertRowCount(7);
+ test.closeConnection();
+ }
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OnWrapTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OnWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+
+public class OnWrapTransactionTests extends CommonTransactionTests {
+
+ public OnWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+ // TODO Auto-generated method stub
+ return new OnWrapTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // try to rollback, however since this autocommit=on above two are already commited
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceBatchCommandReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // try to rollback, since we are in single batch it must rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 100; i < 110; i++) {
+ list.add("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values("+i+",'"+i+"',"+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 110");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/OptimisticWrapTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,491 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.OptimisticWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+
+/**
+ * The main thing to test in this is, when the single source should is involved it should work
+ * fine, when multiple sources involved it should fail.
+ */
+public class OptimisticWrapTransactionTests extends BaseAbstractTransactionTestCase {
+
+ public OptimisticWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ protected TransactionContainer getTransactionContainter() {
+ return new OptimisticWrapTransaction();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Single Source - Rows below 500 (for insert/update/delete)
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 1
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g1 (e1, e2) values(?, ?)", new Object[] {new Integer(102), "102"});
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 = 102");
+ test.assertRowCount(1);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommands() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where pm1.g2.e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+ for (int i = 100; i < 120; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(20);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(20);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceBatchCommand() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ for (int i = 200; i < 205; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 205");
+ test.assertRowCount(5);
+ test.execute("select * from g2 where e1 >= 200 and e1 < 205");
+ test.assertRowCount(5);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = 1, Update(prepared statement)
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourcePreparedUpdateRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("insert into pm1.g2 (e1, e2) values(?, ?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceMultipleCommandsRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from pm1.g2 where pm1.g2.e1 >= ?", new Object[] {new Integer(100)});
+ execute("delete from pm1.g1 where pm1.g1.e1 >= ?", new Object[] {new Integer(100)});
+
+ execute("select * from pm1.g1");
+ assertRowCount(100);
+
+ for (int i = 300; i < 310; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // this will make it rollback
+ execute("insert into pm1.g2 (e1, e2) values(?, ?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (since they are not bundled in single command they should be treated individually)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 300 and e1 < 310");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 >= 300 and e1 < 310");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testSingleSourceBatchCommandRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ for (int i = 400; i < 410; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // this will make it rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999, '9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results (all commands will trated as single under single transaction)
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 400 and e1 < 410");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 400 and e1 < 410");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Multiple Sources - Rows from 500
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from pm1.g1 join pm2.g1 on pm1.g1.e1 = pm2.g1.e1 where pm1.g1.e1 < 100");
+ assertRowCount(100);
+ }
+
+ public void after() {
+ // selects are special case as they will not fail to use multiple sources. The transaction
+ // source count only starts when there are updates to db, so this is OK
+ if (exceptionOccurred()) {
+ fail("should not have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ Integer value = new Integer(500);
+ execute("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values(?,?,?,?)", new Object[] {value, value.toString(), value, value.toString()});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourcesBatchCommand() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ list.add("delete from pm1.g2 where pm1.g2.e1 >= 100");
+ list.add("delete from pm1.g1 where pm1.g1.e1 >= 100");
+
+ list.add("delete from pm2.g2 where pm2.g2.e1 >= 100");
+ list.add("delete from pm2.g1 where pm2.g1.e1 >= 100");
+
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ list.add("insert into pm1.g2 (e1, e2) values("+i+",'"+i+"')");
+ }
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.g1");
+ }
+
+ public void after() {
+ if (exceptionOccurred()) {
+ fail("should not have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualProceduralSelect() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.p1");
+ }
+
+ public void after() {
+ if (exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualProcedure() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("select * from vm.p2 where vm.p2.e1 = ? and vm.p2.e2 = ?", new Object[] {new Integer(200), "200"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ public void testMultipleSourceVirtualProceduralSelectWithUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("exec vm.p2(?, ?)", new Object[] {new Integer(200), "200"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Select
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceVirtualUpdate() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ execute("delete from vm.g1 where vm.g1.pm1e1 > 100");
+ }
+
+ public void after() {
+ if (!exceptionOccurred()) {
+ fail("should have failed to involve multiple sources under optimistic txn");
+ }
+ else {
+ assertTrue(getLastException().getMessage(), getLastException().getMessage().indexOf("txnAutoWrap=OPTIMISTIC") != -1);
+ }
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+
+ };
+
+ getTransactionContainter().runTransaction(userTxn);
+ }
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/PessimisticWrapTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import java.util.ArrayList;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.query.AbstractQueryTransactionTest;
+import org.teiid.test.framework.query.QueryExecution;
+import org.teiid.test.framework.transaction.PessimisticWrapTransaction;
+
+import com.metamatrix.jdbc.api.AbstractQueryTest;
+
+
+public class PessimisticWrapTransactionTests extends CommonTransactionTests {
+
+ public PessimisticWrapTransactionTests(String testName) {
+ super(testName);
+ }
+
+ protected TransactionContainer getTransactionContainter() {
+ return new PessimisticWrapTransaction();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceMultipleCommandsReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ for (int i = 200; i < 210; i++) {
+ Integer val = new Integer(i);
+ execute("insert into pm1.g1 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {val, val.toString()});
+ }
+
+ // try to rollback, however since this pessimistic above two are already commited
+ execute("insert into pm1.g2 (e1, e2) values(?,?)", new Object[] {new Integer(9999), "9999"});
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(10);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 1
+ * Commands = multiple - Success
+ * Batching = Full Processing, Single Connector Batch
+ * result = rollback
+ */
+ public void testSingleSourceBatchCommandReferentialIntegrityRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ public void testCase() throws Exception {
+ ArrayList list = new ArrayList();
+ for (int i = 200; i < 210; i++) {
+ list.add("insert into pm1.g1 (e1, e2) values("+i+",'"+i+"')");
+ }
+
+ // try to rollback, since we are in single batch it must rollback
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 200 and e1 < 210");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 = 9999");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+
+ /**
+ * Sources = 2
+ * Commands = 1, Update
+ * Batching = Full Processing, Single Connector Batch
+ * result = commit
+ */
+ public void testMultipleSourceBulkRowInsertRollback() throws Exception {
+ AbstractQueryTransactionTest userTxn = new AbstractQueryTransactionTest() {
+ ArrayList list = new ArrayList();
+ public void testCase() throws Exception {
+ for (int i = 100; i < 120; i++) {
+ list.add("insert into vm.g1 (pm1e1, pm1e2, pm2e1, pm2e2) values("+i+",'"+i+"',"+i+",'"+i+"')");
+ }
+ list.add("select pm1.g1.e1, pm1.g1.e2 into pm2.g2 from pm1.g1 where pm1.g1.e1 >= 100");
+
+ // force the rollback by trying to insert an invalid row.
+ list.add("insert into pm1.g2 (e1, e2) values(9999,'9999')");
+
+ executeBatch((String[])list.toArray(new String[list.size()]));
+ }
+
+ public boolean exceptionExpected() {
+ return true;
+ }
+ };
+
+ // run test
+ getTransactionContainter().runTransaction(userTxn);
+
+ // now verify the results
+ AbstractQueryTest test = new QueryExecution(userTxn.getSource("pm1"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+
+ test = new QueryExecution(userTxn.getSource("pm2"));
+ test.execute("select * from g1 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.execute("select * from g2 where e1 >= 100 and e1 < 120");
+ test.assertRowCount(0);
+ test.closeConnection();
+ }
+}
Copied: branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java (from rev 1610, trunk/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java)
===================================================================
--- branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java (rev 0)
+++ branches/JCA/test-integration/db/src/test/java/org/teiid/test/testcases/StandaloneGlobalTransactionTests.java 2009-12-01 19:45:17 UTC (rev 1612)
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.testcases;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.transaction.StandaloneGlobalTransaction;
+
+
+/**
+ * This is global transaction test to be used when transaction is external
+ * in places like inside app server
+ */
+public class StandaloneGlobalTransactionTests extends LocalTransactionTests {
+
+ public StandaloneGlobalTransactionTests(String testName) {
+ super(testName);
+ }
+
+ @Override
+ protected TransactionContainer getTransactionContainter() {
+
+ return new StandaloneGlobalTransaction();
+ }
+
+
+}
15 years, 1 month
teiid SVN: r1611 - in trunk: client/src/main/java/com/metamatrix/common/comm/platform/socket/client and 3 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2009-12-01 13:51:26 -0500 (Tue, 01 Dec 2009)
New Revision: 1611
Modified:
trunk/client/src/main/java/com/metamatrix/client/ExceptionUtil.java
trunk/client/src/main/java/com/metamatrix/common/comm/platform/socket/client/SocketServerConnection.java
trunk/client/src/main/java/com/metamatrix/platform/security/api/ILogon.java
trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties
trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
Log:
TEIID-876 initial fix for error seen from a socket client
Modified: trunk/client/src/main/java/com/metamatrix/client/ExceptionUtil.java
===================================================================
--- trunk/client/src/main/java/com/metamatrix/client/ExceptionUtil.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ trunk/client/src/main/java/com/metamatrix/client/ExceptionUtil.java 2009-12-01 18:51:26 UTC (rev 1611)
@@ -35,7 +35,8 @@
public class ExceptionUtil {
- public static <T extends Throwable> T getExceptionOfType(Throwable ex, Class<T> cls) {
+ @SuppressWarnings("unchecked")
+ public static <T extends Throwable> T getExceptionOfType(Throwable ex, Class<T> cls) {
while (ex != null) {
if (cls.isAssignableFrom(ex.getClass())) {
return (T)ex;
@@ -50,21 +51,25 @@
public static Throwable convertException(Method method, Throwable exception) {
boolean canThrowXATransactionException = false;
+ boolean canThrowComponentException = false;
+ boolean canThrowAdminException = false;
Class<?>[] exceptionClasses = method.getExceptionTypes();
for (int i = 0; i < exceptionClasses.length; i++) {
if (exception.getClass().isAssignableFrom(exceptionClasses[i])) {
return exception;
}
- if (MetaMatrixComponentException.class.isAssignableFrom(exceptionClasses[i])) {
- return new MetaMatrixComponentException(exception);
+ canThrowComponentException |= MetaMatrixComponentException.class.isAssignableFrom(exceptionClasses[i]);
+ canThrowAdminException |= AdminException.class.isAssignableFrom(exceptionClasses[i]);
+ canThrowXATransactionException |= XATransactionException.class.isAssignableFrom(exceptionClasses[i]);
+ }
+ if (canThrowComponentException) {
+ return new MetaMatrixComponentException(exception);
+ }
+ if (canThrowAdminException) {
+ if (exception instanceof MetaMatrixProcessingException) {
+ return new AdminProcessingException(exception);
}
- if (AdminException.class.isAssignableFrom(exceptionClasses[i])) {
- if (exception instanceof MetaMatrixProcessingException) {
- return new AdminProcessingException(exception);
- }
- return new AdminComponentException(exception);
- }
- canThrowXATransactionException |= XATransactionException.class.isAssignableFrom(exceptionClasses[i]);
+ return new AdminComponentException(exception);
}
if (canThrowXATransactionException) {
return new XATransactionException(exception);
Modified: trunk/client/src/main/java/com/metamatrix/common/comm/platform/socket/client/SocketServerConnection.java
===================================================================
--- trunk/client/src/main/java/com/metamatrix/common/comm/platform/socket/client/SocketServerConnection.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ trunk/client/src/main/java/com/metamatrix/common/comm/platform/socket/client/SocketServerConnection.java 2009-12-01 18:51:26 UTC (rev 1611)
@@ -265,6 +265,8 @@
//ignore
} catch (TimeoutException e) {
//ignore
+ } catch (MetaMatrixComponentException e) {
+ //ignore
}
}
Modified: trunk/client/src/main/java/com/metamatrix/platform/security/api/ILogon.java
===================================================================
--- trunk/client/src/main/java/com/metamatrix/platform/security/api/ILogon.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ trunk/client/src/main/java/com/metamatrix/platform/security/api/ILogon.java 2009-12-01 18:51:26 UTC (rev 1611)
@@ -50,7 +50,7 @@
* @throws InvalidSessionException If session has expired or doesn't exist
* @throws ComponentNotFoundException If couldn't find needed service component
*/
- ResultsFuture<?> logoff() throws InvalidSessionException;
+ ResultsFuture<?> logoff() throws InvalidSessionException, MetaMatrixComponentException;
void assertIdentity(SessionToken sessionId) throws InvalidSessionException, MetaMatrixComponentException;
Modified: trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties 2009-12-01 17:58:08 UTC (rev 1610)
+++ trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties 2009-12-01 18:51:26 UTC (rev 1611)
@@ -74,8 +74,8 @@
ConnectorWorker.MaxResultRowsExceed=The number of result rows has exceeded the maximum result rows "{0}"
ConnectorWorker.invalidAtomicType=Invalid atomic request message type: {0}.
ConnectorWorker.zero_size_non_last_batch=Connector returned a 0 row non-last batch: {0}.
-ConnectorWorker.requestID_does_not_exist=RequestID {0} does not exist or has been cancelled. The request will not be processed.
-ConnectorWorker.could_not_retrieve_execution=Could not retrieve the execution for atomic requestID {0}. The request may have been cancelled.
+ConnectorWorker.requestID_does_not_exist=RequestID {0} does not exist or has been canceled. The request will not be processed.
+ConnectorWorker.could_not_retrieve_execution=Could not retrieve the execution for atomic requestID {0}. The request may have been canceled.
ConnectorWorker.process_failed=Connector worker process failed for atomic-request={0}
ConnectorWorker.ConnectorWorker_result_set_unexpected_columns=Could not process stored procedure results for {0}. Expected {1} result set columns, but was {2}. Please update your models to allow for stored procedure results batching.
ConnectorWorker.error_occurred=Error occurred on connector {0} - {1}
@@ -298,8 +298,8 @@
ERR.018.005.0037 = The type of the value does not match that of parameter {0}
ERR.018.005.0038 = Error executing conversion function to convert value.
ERR.018.005.0039 = Problem getting cursor batch for {0}
-ERR.018.005.0040 = The request {0} has been cancelled by the administrator.
-ERR.018.005.0041 = The request {0} has been cancelled.
+ERR.018.005.0040 = The request {0} has been canceled by the administrator.
+ERR.018.005.0041 = The request {0} has been canceled.
ERR.018.005.0042 = Failed to deliver cancellation error response for {0} as it does not have a response receiver.
ERR.018.005.0043 = Error loading configuration while trying to load metadata for system queries.
ERR.018.005.0044 = Error trying to access metadata for loading metadata for elements/keys of the group :{0}
Modified: trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-12-01 17:58:08 UTC (rev 1610)
+++ trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-12-01 18:51:26 UTC (rev 1611)
@@ -146,6 +146,8 @@
//ignore
} catch (TimeoutException e) {
//ignore
+ } catch (MetaMatrixComponentException e) {
+ //ignore
}
}
this.shutdown = true;
15 years, 1 month
teiid SVN: r1610 - trunk/client-jdbc/src/main/java/com/metamatrix/jdbc.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2009-12-01 12:58:08 -0500 (Tue, 01 Dec 2009)
New Revision: 1610
Modified:
trunk/client-jdbc/src/main/java/com/metamatrix/jdbc/BaseDataSource.java
Log:
TEIID-145 adding ansi quoting property to the datasource, also adding a common property name txnAutoWrap
Modified: trunk/client-jdbc/src/main/java/com/metamatrix/jdbc/BaseDataSource.java
===================================================================
--- trunk/client-jdbc/src/main/java/com/metamatrix/jdbc/BaseDataSource.java 2009-12-01 17:48:54 UTC (rev 1609)
+++ trunk/client-jdbc/src/main/java/com/metamatrix/jdbc/BaseDataSource.java 2009-12-01 17:58:08 UTC (rev 1610)
@@ -41,7 +41,7 @@
import com.metamatrix.jdbc.util.MMJDBCURL;
/**
- * The MetaMatrix JDBC DataSource implementation class of {@link javax.sql.DataSource} and
+ * The Teiid JDBC DataSource implementation class of {@link javax.sql.DataSource} and
* {@link javax.sql.XADataSource}.
* <p>
* The {@link javax.sql.DataSource} interface follows the JavaBean design pattern,
@@ -63,14 +63,14 @@
* down to their underlying data source.
* <p>
* The form and type of the client token is up to the client but it <i>must</i> implement the
- * <code>Serializable</code> interface. MetaMatrix does nothing with this token except to make it
+ * <code>Serializable</code> interface. Teiid does nothing with this token except to make it
* available for authentication/augmentation/replacement upon authentication to the system and to
* connectors that may require it at the data source level.
* </p></td></tr>
* <tr><td>databaseName </td><td><code>String</code></td><td>The name of a particular virtual database on a
- * MetaMatrix Server.</td></tr>
+ * Teiid Server.</td></tr>
* <tr><td>databaseVersion </td><td><code>String</code></td><td>The <i>optional</i> version of a particular
- * virtual database on a MetaMatrix Server;
+ * virtual database on a Teiid Server;
* if not supplied, then the latest version is assumed.</td></tr>
* <tr><td>dataSourceName </td><td><code>String</code></td><td>The <i>optional</i> logical name for the underlying
* <code>XADataSource</code> or <code>ConnectionPoolDataSource</code>;
@@ -119,7 +119,7 @@
protected static final int DEFAULT_LOG_LEVEL = 0;
/**
- * The name of the virtual database on a particular MetaMatrix Server.
+ * The name of the virtual database on a particular Teiid Server.
* This property name is one of the standard property names defined by the JDBC 2.0 specification,
* and is <i>required</i>.
*/
@@ -147,7 +147,7 @@
* This property is <i>optional</i>.
* <p>
* The form and type of the client token is up to the client but it <i>must</i> implement the
- * <code>Serializabe</code> interface. MetaMatrix does nothing with this token except to make it
+ * <code>Serializabe</code> interface. Teiid does nothing with this token except to make it
* available for authentication/augmentation/replacement upon authentication to the system and to
* connectors that may require it at the data source level.
* </p>
@@ -171,13 +171,13 @@
/**
* The version number of the virtual database to which a connection is to be established.
* This property is <i>optional</i>; if not specified, the assumption is that the latest version
- * on the MetaMatrix Server is to be used.
+ * on the Teiid Server is to be used.
*/
private String databaseVersion;
/**
* The name of the application. Supplying this property may allow an administrator of a
- * MetaMatrix Server to better identify individual connections and usage patterns.
+ * Teiid Server to better identify individual connections and usage patterns.
* This property is <i>optional</i>.
*/
private String applicationName;
@@ -203,8 +203,8 @@
/**
* A setting that controls how connections created by this DataSource manage transactions for client
- * requests when client applications do not use transactions. Because a MetaMatrix virtual database
- * will likely deal with multiple underlying information sources, the MetaMatrix XA Server will execute
+ * requests when client applications do not use transactions. Because a Teiid virtual database
+ * will likely deal with multiple underlying information sources, Teiid will execute
* all client requests within the contexts of transactions. This method determines the semantics
* of creating such transactions when the client does not explicitly do so.
* <p>
@@ -232,12 +232,11 @@
* The {@link #TXN_AUTO_WRAP_OPTIMISTIC} constant value is provided for convenience.</li>
* </ul>
* </p>
- * <p>
- * This property is important only if connecting to a MetaMatrix XA Server.
- * </p>
*/
private String transactionAutoWrap;
+ private boolean ansiQuotedIdentifiers = true;
+
/**
* Reference to the logWriter, which is transient and is therefore not serialized with the DataSource.
*/
@@ -541,7 +540,7 @@
/**
* Returns the name of the application. Supplying this property may allow an administrator of a
- * MetaMatrix Server to better identify individual connections and usage patterns.
+ * Teiid Server to better identify individual connections and usage patterns.
* This property is <i>optional</i>.
* @return String the application name; may be null or zero-length
*/
@@ -550,7 +549,7 @@
}
/**
- * Returns the name of the virtual database on a particular MetaMatrix Server.
+ * Returns the name of the virtual database on a particular Teiid Server.
* @return String
*/
public String getDatabaseName() {
@@ -605,7 +604,7 @@
* This property is <i>optional</i>.
* <p>
* The form and type of the client token is up to the client but it <i>must</i> implement the
- * <code>Serializabe</code> interface. MetaMatrix does nothing with this token except to make it
+ * <code>Serializabe</code> interface. Teiid does nothing with this token except to make it
* available for authentication/augmentation/replacement upon authentication to the system and to
* connectors that may require it at the data source level.
* </p>
@@ -617,7 +616,7 @@
/**
* Sets the name of the application. Supplying this property may allow an administrator of a
- * MetaMatrix Server to better identify individual connections and usage patterns.
+ * Teiid Server to better identify individual connections and usage patterns.
* This property is <i>optional</i>.
* @param applicationName The applicationName to set
*/
@@ -626,7 +625,7 @@
}
/**
- * Sets the name of the virtual database on a particular MetaMatrix Server.
+ * Sets the name of the virtual database on a particular Teiid Server.
* @param databaseName The name of the virtual database
*/
public void setDatabaseName(final String databaseName) {
@@ -673,7 +672,7 @@
* This property is <i>optional</i>.
* <p>
* The form and type of the client token is up to the client but it <i>must</i> implement the
- * <code>Serializabe</code> interface. MetaMatrix does nothing with this token except to make it
+ * <code>Serializabe</code> interface. Teiid does nothing with this token except to make it
* available for authentication/augmentation/replacement upon authentication to the system and to
* connectors that may require it at the data source level.
* </p>
@@ -734,24 +733,40 @@
}
/**
+ * @see #getTxnAutoWrap()
+ * @return
+ */
+ public String getTransactionAutoWrap() {
+ return transactionAutoWrap;
+ }
+
+ /**
+ * @see #setTxnAutoWrap(String)
+ * @param transactionAutoWrap
+ */
+ public void setTransactionAutoWrap(String transactionAutoWrap) {
+ this.transactionAutoWrap = transactionAutoWrap;
+ }
+
+ /**
* Returns the current setting for how connections are created by this DataSource manage transactions
* for client requests when client applications do not use transactions.
- * Because a MetaMatrix virtual database will likely deal with multiple underlying information sources,
- * the MetaMatrix XA Server will execute all client requests within the contexts of transactions.
+ * Because a virtual database will likely deal with multiple underlying information sources,
+ * Teiid will execute all client requests within the contexts of transactions.
* This method determines the semantics of creating such transactions when the client does not
* explicitly do so.
* @return the current setting, or null if the property has not been set and the default mode will
* be used.
*/
- public String getTransactionAutoWrap() {
- return transactionAutoWrap;
- }
-
+ public String getTxnAutoWrap() {
+ return this.transactionAutoWrap;
+ }
+
/**
* Sets the setting for how connections are created by this DataSource manage transactions
* for client requests when client applications do not use transactions.
- * Because a MetaMatrix virtual database will likely deal with multiple underlying information sources,
- * the MetaMatrix XA Server will execute all client requests within the contexts of transactions.
+ * Because a virtual database will likely deal with multiple underlying information sources,
+ * Teiid will execute all client requests within the contexts of transactions.
* This method determines the semantics of creating such transactions when the client does not
* explicitly do so.
* <p>
@@ -778,13 +793,10 @@
* The {@link #TXN_AUTO_WRAP_OPTIMISTIC} constant value is provided for convenience.</li>
* </ul>
* </p>
- * <p>
- * This property is important only if connecting to a MetaMatrix XA Server.
- * </p>
* @param transactionAutoWrap The transactionAutoWrap to set
*/
- public void setTransactionAutoWrap(String transactionAutoWrap) {
- this.transactionAutoWrap = transactionAutoWrap;
+ public void setTxnAutoWrap(String transactionAutoWrap) {
+ this.transactionAutoWrap = transactionAutoWrap;
}
// --------------------------------------------------------------------------------------------
@@ -968,5 +980,13 @@
return additionalProperties;
}
+ public void setAnsiQuotedIdentifiers(boolean ansiQuotedIdentifiers) {
+ this.ansiQuotedIdentifiers = ansiQuotedIdentifiers;
+ }
+
+ public boolean isAnsiQuotedIdentifiers() {
+ return ansiQuotedIdentifiers;
+ }
+
}
15 years, 1 month
teiid SVN: r1609 - in trunk: common-internal/src/main/java/com/metamatrix/common and 8 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2009-12-01 12:48:54 -0500 (Tue, 01 Dec 2009)
New Revision: 1609
Removed:
trunk/common-internal/src/main/java/com/metamatrix/api/core/message/
trunk/common-internal/src/main/java/com/metamatrix/api/core/xmi/
trunk/common-internal/src/main/java/com/metamatrix/common/tree/
trunk/common-internal/src/test/java/com/metamatrix/common/tree/
Modified:
trunk/common-internal/src/main/java/com/metamatrix/common/config/util/ConfigObjectsNotResolvableException.java
trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
trunk/connector-api/src/main/resources/org/teiid/connector/i18n.properties
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
trunk/engine/src/main/java/org/teiid/metadata/CompositeMetadataStore.java
trunk/engine/src/main/java/org/teiid/metadata/TransformationMetadata.java
Log:
TEIID-891 adding correction for unsigned types
Modified: trunk/common-internal/src/main/java/com/metamatrix/common/config/util/ConfigObjectsNotResolvableException.java
===================================================================
--- trunk/common-internal/src/main/java/com/metamatrix/common/config/util/ConfigObjectsNotResolvableException.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/common-internal/src/main/java/com/metamatrix/common/config/util/ConfigObjectsNotResolvableException.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -22,10 +22,6 @@
package com.metamatrix.common.config.util;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-
import com.metamatrix.api.exception.MetaMatrixException;
public class ConfigObjectsNotResolvableException extends MetaMatrixException{
Modified: trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -97,7 +97,10 @@
* @return
* @throws ConnectorException
*/
- public Column addColumn(String name, String type, ColumnSet table) throws ConnectorException {
+ public Column addColumn(String name, String type, ColumnSet<?> table) throws ConnectorException {
+ if (name.indexOf(AbstractMetadataRecord.NAME_DELIM_CHAR) != -1) {
+ throw new ConnectorException(DataPlugin.Util.getString("MetadataFactory.invalid_name", name)); //$NON-NLS-1$
+ }
Column column = new Column();
column.setName(name);
table.getColumns().add(column);
@@ -134,7 +137,7 @@
* @return
* @throws ConnectorException
*/
- public ColumnSet addPrimaryKey(String name, List<String> columnNames, Table table) throws ConnectorException {
+ public KeyRecord addPrimaryKey(String name, List<String> columnNames, Table table) throws ConnectorException {
KeyRecord primaryKey = new KeyRecord(KeyRecord.Type.Primary);
primaryKey.setParent(table);
primaryKey.setColumns(new ArrayList<Column>(columnNames.size()));
@@ -265,7 +268,7 @@
}
private void assignColumns(List<String> columnNames, Table table,
- ColumnSet columns) throws ConnectorException {
+ ColumnSet<?> columns) throws ConnectorException {
for (String columnName : columnNames) {
boolean match = false;
for (Column column : table.getColumns()) {
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -87,8 +87,6 @@
private Set<String> infixFunctions = new HashSet<String>(Arrays.asList("%", "+", "-", "*", "+", "/", "||", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
"&", "|", "^", "#")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- private static final String ESCAPED_QUOTE = "''"; //$NON-NLS-1$
-
protected static final String UNDEFINED = "<undefined>"; //$NON-NLS-1$
protected static final String UNDEFINED_PARAM = "?"; //$NON-NLS-1$
@@ -160,8 +158,8 @@
* @param str the input string
* @return a SQL-safe string
*/
- protected String escapeString(String str) {
- return StringUtil.replaceAll(str, QUOTE, ESCAPED_QUOTE);
+ protected String escapeString(String str, String quote) {
+ return StringUtil.replaceAll(str, quote, quote + quote);
}
public String toString() {
@@ -735,7 +733,7 @@
.append("'}"); //$NON-NLS-1$
} else {
buffer.append(QUOTE)
- .append(escapeString(val))
+ .append(escapeString(val, QUOTE))
.append(QUOTE);
}
}
Modified: trunk/connector-api/src/main/resources/org/teiid/connector/i18n.properties
===================================================================
--- trunk/connector-api/src/main/resources/org/teiid/connector/i18n.properties 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/connector-api/src/main/resources/org/teiid/connector/i18n.properties 2009-12-01 17:48:54 UTC (rev 1609)
@@ -65,4 +65,5 @@
MetadataFactory.unknown_datatype=Unknown datatype {0}
MetadataFactory.no_column_found=No column found with name {0}
-MetadataFactory.duplicate_name="Non-uniquely named record detected ''{0}''
\ No newline at end of file
+MetadataFactory.duplicate_name="Non-uniquely named record detected ''{0}''
+MetadataFactory.invalid_name=Invalid column name ''{0}'', cannot contain the . character.
\ No newline at end of file
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -26,9 +26,12 @@
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import java.util.TreeMap;
import org.teiid.connector.api.ConnectorException;
@@ -76,8 +79,11 @@
private boolean importIndexes = true;
private boolean importApproximateIndexes = true;
private boolean importProcedures = true;
+ private boolean widenUnsingedTypes;
+ //TODO add an option to not fully qualify name in source
private ConnectorLogger logger;
+ private Set<String> unsignedTypes = new HashSet<String>();
public JDBCMetdataProcessor(ConnectorLogger logger) {
this.logger = logger;
@@ -87,6 +93,17 @@
throws SQLException, ConnectorException {
DatabaseMetaData metadata = conn.getMetaData();
+ if (widenUnsingedTypes) {
+ ResultSet rs = metadata.getTableTypes();
+ while (rs.next()) {
+ String name = rs.getString(1);
+ boolean unsigned = rs.getBoolean(10);
+ if (unsigned) {
+ unsignedTypes.add(name);
+ }
+ }
+ }
+
Map<String, TableInfo> tableMap = getTables(metadataFactory, metadata);
if (importKeys) {
@@ -121,6 +138,8 @@
String columnName = columns.getString(4);
short columnType = columns.getShort(5);
int sqlType = columns.getInt(6);
+ String typeName = columns.getString(7);
+ sqlType = checkForUnsigned(sqlType, typeName);
if (columnType == DatabaseMetaData.procedureColumnUnknown) {
continue; //there's a good chance this won't work
}
@@ -128,7 +147,7 @@
if (columnType == DatabaseMetaData.procedureColumnResult) {
Column column = metadataFactory.addProcedureResultSetColumn(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), procedure);
record = column;
- column.setNativeType(columns.getString(7));
+ column.setNativeType(typeName);
} else {
record = metadataFactory.addProcedureParameter(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), Type.values()[columnType], procedure);
}
@@ -142,6 +161,23 @@
}
procedures.close();
}
+
+ private int checkForUnsigned(int sqlType, String typeName) {
+ if (widenUnsingedTypes && unsignedTypes.contains(typeName)) {
+ switch (sqlType) {
+ case Types.TINYINT:
+ sqlType = Types.SMALLINT;
+ break;
+ case Types.SMALLINT:
+ sqlType = Types.INTEGER;
+ break;
+ case Types.INTEGER:
+ sqlType = Types.BIGINT;
+ break;
+ }
+ }
+ return sqlType;
+ }
private Map<String, TableInfo> getTables(MetadataFactory metadataFactory,
DatabaseMetaData metadata) throws SQLException, ConnectorException {
@@ -183,6 +219,8 @@
}
String columnName = columns.getString(4);
int type = columns.getInt(5);
+ String typeName = columns.getString(6);
+ type = checkForUnsigned(type, typeName);
//note that the resultset is already ordered by position, so we can rely on just adding columns in order
Column column = metadataFactory.addColumn(columnName, TypeFacility.getDataTypeNameFromSQLType(type), tableInfo.table);
column.setNativeType(columns.getString(6));
@@ -363,5 +401,9 @@
public void setImportApproximateIndexes(boolean importApproximateIndexes) {
this.importApproximateIndexes = importApproximateIndexes;
}
-
+
+ public void setWidenUnsingedTypes(boolean widenUnsingedTypes) {
+ this.widenUnsingedTypes = widenUnsingedTypes;
+ }
+
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -173,9 +173,9 @@
} else {
// If obj is string, toSting() will not create a new String
// object, it returns it self, so new object creation.
- valuesbuffer.append("'") //$NON-NLS-1$
- .append(escapeString(obj.toString()))
- .append("'"); //$NON-NLS-1$
+ valuesbuffer.append(QUOTE)
+ .append(escapeString(obj.toString(), QUOTE))
+ .append(QUOTE);
}
}
}
Modified: trunk/engine/src/main/java/org/teiid/metadata/CompositeMetadataStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/metadata/CompositeMetadataStore.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/engine/src/main/java/org/teiid/metadata/CompositeMetadataStore.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -27,7 +27,6 @@
import java.util.LinkedList;
import java.util.List;
-import org.teiid.connector.metadata.runtime.Column;
import org.teiid.connector.metadata.runtime.MetadataStore;
import org.teiid.connector.metadata.runtime.ProcedureRecordImpl;
import org.teiid.connector.metadata.runtime.Schema;
@@ -128,23 +127,8 @@
}
/*
- * The next methods are hold overs from XML/UUID resolving and will perform poorly
+ * The next method is a hold over from XML/UUID resolving and will perform poorly
*/
-
- public Column findElement(String fullName) throws QueryMetadataException {
- int columnIndex = fullName.lastIndexOf(TransformationMetadata.DELIMITER_STRING);
- if (columnIndex == -1) {
- throw new QueryMetadataException(fullName+TransformationMetadata.NOT_EXISTS_MESSAGE);
- }
- Table table = findGroup(fullName.substring(0, columnIndex));
- String shortElementName = fullName.substring(columnIndex + 1);
- for (Column column : table.getColumns()) {
- if (column.getName().equalsIgnoreCase(shortElementName)) {
- return column;
- }
- }
- throw new QueryMetadataException(fullName+TransformationMetadata.NOT_EXISTS_MESSAGE);
- }
public Collection<Table> getXMLTempGroups(Table tableRecord) {
ArrayList<Table> results = new ArrayList<Table>();
Modified: trunk/engine/src/main/java/org/teiid/metadata/TransformationMetadata.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/metadata/TransformationMetadata.java 2009-11-30 20:16:38 UTC (rev 1608)
+++ trunk/engine/src/main/java/org/teiid/metadata/TransformationMetadata.java 2009-12-01 17:48:54 UTC (rev 1609)
@@ -117,7 +117,18 @@
* @see com.metamatrix.query.metadata.QueryMetadataInterface#getElementID(java.lang.String)
*/
public Object getElementID(final String elementName) throws MetaMatrixComponentException, QueryMetadataException {
- return getMetadataStore().findElement(elementName.toLowerCase());
+ int columnIndex = elementName.lastIndexOf(TransformationMetadata.DELIMITER_STRING);
+ if (columnIndex == -1) {
+ throw new QueryMetadataException(elementName+TransformationMetadata.NOT_EXISTS_MESSAGE);
+ }
+ Table table = this.store.findGroup(elementName.substring(0, columnIndex));
+ String shortElementName = elementName.substring(columnIndex + 1);
+ for (Column column : (List<Column>)getElementIDsInGroupID(table)) {
+ if (column.getName().equalsIgnoreCase(shortElementName)) {
+ return column;
+ }
+ }
+ throw new QueryMetadataException(elementName+TransformationMetadata.NOT_EXISTS_MESSAGE);
}
/* (non-Javadoc)
15 years, 1 month