[teiid-commits] teiid SVN: r2103 - in trunk: build/assembly/jboss-container and 280 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Fri May 7 12:25:32 EDT 2010
Author: rareddy
Date: 2010-05-07 12:24:50 -0400 (Fri, 07 May 2010)
New Revision: 2103
Added:
trunk/build/kits/jboss-container/deploy/teiid/connectors/
trunk/build/kits/jboss-container/deploy/teiid/connectors/access-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/db2-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/derby-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/h2-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/hsql-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/ldap-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/loopback-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/mysql-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/oracle-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/postgresql-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/salesforce-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/sqlserver-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/sybase-translator.xml
trunk/build/kits/jboss-container/deploy/teiid/connectors/text-translator.xml
trunk/client/src/main/java/org/teiid/adminapi/Translator.java
trunk/client/src/main/java/org/teiid/adminapi/impl/TranslatorMetaData.java
trunk/client/src/test/java/org/teiid/adminapi/impl/TestTranslatorMetadata.java
trunk/connector-api/src/main/java/org/teiid/logging/AuditMessage.java
trunk/connector-api/src/main/java/org/teiid/logging/CommandLogMessage.java
trunk/connector-api/src/main/java/org/teiid/logging/JavaLogWriter.java
trunk/connector-api/src/main/java/org/teiid/logging/LogConstants.java
trunk/connector-api/src/main/java/org/teiid/logging/LogListener.java
trunk/connector-api/src/main/java/org/teiid/logging/LogManager.java
trunk/connector-api/src/main/java/org/teiid/logging/LogMessage.java
trunk/connector-api/src/main/java/org/teiid/logging/MessageLevel.java
trunk/connector-api/src/main/java/org/teiid/resource/
trunk/connector-api/src/main/java/org/teiid/resource/ConnectorException.java
trunk/connector-api/src/main/java/org/teiid/resource/adapter/
trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecution.java
trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecutionFactory.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/
trunk/connector-api/src/main/java/org/teiid/resource/cci/CacheScope.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/ConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/DataNotAvailableException.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/Execution.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionContext.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionFactory.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/MetadataProvider.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/ProcedureExecution.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/ResultSetExecution.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/SourceSystemFunctions.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/TranslatorProperty.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacility.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacilityImpl.java
trunk/connector-api/src/main/java/org/teiid/resource/cci/UpdateExecution.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/
trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnection.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnectionFactory.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnection.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnectionFactory.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicResourceAdapter.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionContext.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionRequestInfoWrapper.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnection.java
trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnectionFactory.java
trunk/connector-api/src/test/java/org/teiid/connector/TestBasicExecutionFactory.java
trunk/connector-api/src/test/java/org/teiid/logging/
trunk/connector-api/src/test/java/org/teiid/logging/TestLogManager.java
trunk/connectors/connector-ldap/src/main/java/org/
trunk/connectors/connector-ldap/src/main/java/org/teiid/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectionImpl.java
trunk/connectors/connector-ldap/src/main/resources/org/
trunk/connectors/connector-ldap/src/main/resources/org/teiid/
trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/
trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/
trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/
trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/i18n.properties
trunk/connectors/connector-ldap/src/test/java/org/
trunk/connectors/connector-ldap/src/test/java/org/teiid/
trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/
trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/
trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/
trunk/connectors/connector-salesforce/src/main/java/org/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesForceManagedConnectionFactory.java
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesforceConnectionImpl.java
trunk/connectors/connector-text/src/main/java/org/
trunk/connectors/connector-text/src/main/java/org/teiid/
trunk/connectors/connector-text/src/main/java/org/teiid/resource/
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionFactory.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionImpl.java
trunk/connectors/connector-text/src/main/resources/org/
trunk/connectors/connector-text/src/main/resources/org/teiid/
trunk/connectors/connector-text/src/main/resources/org/teiid/resource/
trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/
trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/text/
trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/text/i18n.properties
trunk/connectors/sandbox/translator-yahoo/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/TickerCollectorVisitor.java
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooCapabilities.java
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecution.java
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecutionFactory.java
trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooPlugin.java
trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/yahoo/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/yahoo/i18n.properties
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/yahoo/
trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/yahoo/TestYahooTranslation.java
trunk/connectors/translator-jdbc/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCBaseExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionException.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCMetdataProcessor.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCProcedureExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCQueryExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCUpdateExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/SimpleCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ConvertModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ExtractFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/LocateFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/Translator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2Capabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2SQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbyCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbySQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Capabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Translator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mm/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mm/MMCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/BitFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Capabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Translator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/ConcatFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/DayWeekQuarterFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/LeftOrRightFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/Log10FunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/MonthOrDayNameFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSpatialFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/SequeLinkOracleCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/LocateFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SubstringFunctionModifier.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseSQLTranslator.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teiid/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teiid/TeiidCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataCapabilities.java
trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml
trunk/connectors/translator-jdbc/src/main/resources/META-INF/
trunk/connectors/translator-jdbc/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/
trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/jdbc/
trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/jdbc/i18n.properties
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCExecutionFactory.java
trunk/connectors/translator-ldap/
trunk/connectors/translator-ldap/pom.xml
trunk/connectors/translator-ldap/src/
trunk/connectors/translator-ldap/src/main/
trunk/connectors/translator-ldap/src/main/java/
trunk/connectors/translator-ldap/src/main/java/org/
trunk/connectors/translator-ldap/src/main/java/org/teiid/
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/IQueryToLdapSearchParser.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnection.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorCapabilities.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorConstants.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPExecutionFactory.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPPlugin.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSearchDetails.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSyncQueryExecution.java
trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPUpdateExecution.java
trunk/connectors/translator-ldap/src/main/resources/
trunk/connectors/translator-ldap/src/main/resources/META-INF/
trunk/connectors/translator-ldap/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/translator-ldap/src/main/resources/org/
trunk/connectors/translator-ldap/src/main/resources/org/teiid/
trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/
trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/ldap/
trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/ldap/i18n.properties
trunk/connectors/translator-ldap/src/test/
trunk/connectors/translator-ldap/src/test/java/
trunk/connectors/translator-ldap/src/test/java/org/
trunk/connectors/translator-ldap/src/test/java/org/teiid/
trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/
trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/
trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/ldap/
trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/ldap/TestIQueryToLdapSearchParser.java
trunk/connectors/translator-ldap/src/test/resources/
trunk/connectors/translator-loopback/
trunk/connectors/translator-loopback/src/main/java/org/
trunk/connectors/translator-loopback/src/main/java/org/teiid/
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackCapabilities.java
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecution.java
trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecutionFactory.java
trunk/connectors/translator-loopback/src/main/resources/META-INF/
trunk/connectors/translator-loopback/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/translator-loopback/src/test/java/org/
trunk/connectors/translator-loopback/src/test/java/org/teiid/
trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/
trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/
trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/
trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoobackAsynch.java
trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoopbackExecution.java
trunk/connectors/translator-salesforce/
trunk/connectors/translator-salesforce/pom.xml
trunk/connectors/translator-salesforce/src/
trunk/connectors/translator-salesforce/src/main/
trunk/connectors/translator-salesforce/src/main/java/
trunk/connectors/translator-salesforce/src/main/java/org/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Constants.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Messages.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/MetadataProcessor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/NameUtil.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Relationship.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/RelationshipImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForceExecutionFactory.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForcePlugin.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceCapabilities.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnection.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Util.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/AbstractUpdateExecution.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DataPayload.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeleteExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedObject.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedResult.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetDeletedExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetUpdatedExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/InsertExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParent.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParentImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/QueryExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/SalesforceProcedureExecution.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdateExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdatedResult.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/CriteriaVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/DeleteVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/ICriteriaVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/IQueryProvidingVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/InsertVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/JoinQueryVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/SelectVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/UpdateVisitor.java
trunk/connectors/translator-salesforce/src/main/resources/
trunk/connectors/translator-salesforce/src/main/resources/META-INF/
trunk/connectors/translator-salesforce/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/translator-salesforce/src/main/resources/org/
trunk/connectors/translator-salesforce/src/main/resources/org/teiid/
trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/
trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/salesforce/
trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/salesforce/i18n.properties
trunk/connectors/translator-salesforce/src/test/
trunk/connectors/translator-salesforce/src/test/java/
trunk/connectors/translator-salesforce/src/test/java/org/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/visitors/
trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/visitors/TestVisitors.java
trunk/connectors/translator-salesforce/src/test/resources/
trunk/connectors/translator-salesforce/src/test/resources/documents/
trunk/connectors/translator-text/
trunk/connectors/translator-text/pom.xml
trunk/connectors/translator-text/src/
trunk/connectors/translator-text/src/main/
trunk/connectors/translator-text/src/main/java/
trunk/connectors/translator-text/src/main/java/org/
trunk/connectors/translator-text/src/main/java/org/teiid/
trunk/connectors/translator-text/src/main/java/org/teiid/resource/
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/StringToDateTranslator.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextCapabilities.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextConnection.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextDescriptorPropertyNames.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextExecutionFactory.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextPlugin.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextSynchExecution.java
trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextUtil.java
trunk/connectors/translator-text/src/main/resources/
trunk/connectors/translator-text/src/main/resources/META-INF/
trunk/connectors/translator-text/src/main/resources/META-INF/jboss-beans.xml
trunk/connectors/translator-text/src/main/resources/org/
trunk/connectors/translator-text/src/main/resources/org/teiid/
trunk/connectors/translator-text/src/main/resources/org/teiid/resource/
trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/
trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/text/
trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/text/i18n.properties
trunk/connectors/translator-text/src/test/
trunk/connectors/translator-text/src/test/java/
trunk/connectors/translator-text/src/test/java/org/
trunk/connectors/translator-text/src/test/java/org/teiid/
trunk/connectors/translator-text/src/test/java/org/teiid/resource/
trunk/connectors/translator-text/src/test/java/org/teiid/resource/adapter/
trunk/connectors/translator-text/src/test/java/org/teiid/resource/adapter/text/
trunk/connectors/translator-text/src/test/resources/
trunk/connectors/translator-text/src/test/resources/EmpData.txt
trunk/connectors/translator-text/src/test/resources/EmployeeTestDataSalary.txt
trunk/connectors/translator-text/src/test/resources/libraryDelimited.txt
trunk/connectors/translator-text/src/test/resources/testDescriptorDelimited.txt
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/TranslatorRepository.java
trunk/runtime/src/main/java/org/teiid/deployers/ExtendedPropertyMetadata.java
trunk/runtime/src/main/java/org/teiid/deployers/ManagedPropertyUtil.java
trunk/runtime/src/main/java/org/teiid/deployers/TranslatorDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/TranslatorParserDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/TranslatorPropertyUtil.java
trunk/runtime/src/main/java/org/teiid/templates/
trunk/runtime/src/main/java/org/teiid/templates/TranslatorDeploymentTemplate.java
trunk/runtime/src/main/java/org/teiid/templates/TranslatorMetadataICF.java
trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfo.java
trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfoFactory.java
trunk/runtime/src/test/java/org/teiid/deployers/TestExtendedPropertyMetadata.java
trunk/runtime/src/test/java/org/teiid/deployers/TestTranslatorDeployer.java
Removed:
trunk/client/src/main/java/org/teiid/adminapi/ConnectionFactory.java
trunk/client/src/main/java/org/teiid/adminapi/ConnectionPoolStatistics.java
trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionFactoryMetaData.java
trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionPoolStatisticsMetadata.java
trunk/connector-api/src/main/java/org/teiid/connector/api/CacheScope.java
trunk/connector-api/src/main/java/org/teiid/connector/api/Connection.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectionContext.java
trunk/connector-api/src/main/java/org/teiid/connector/api/Connector.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorEnvironment.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorException.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorLogger.java
trunk/connector-api/src/main/java/org/teiid/connector/api/DataNotAvailableException.java
trunk/connector-api/src/main/java/org/teiid/connector/api/Execution.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ExecutionContext.java
trunk/connector-api/src/main/java/org/teiid/connector/api/MetadataProvider.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ProcedureExecution.java
trunk/connector-api/src/main/java/org/teiid/connector/api/ResultSetExecution.java
trunk/connector-api/src/main/java/org/teiid/connector/api/TypeFacility.java
trunk/connector-api/src/main/java/org/teiid/connector/api/UpdateExecution.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnection.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnector.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicExecution.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnection.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnectionFactory.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicResourceAdapter.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/ConnectionRequestInfoWrapper.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/DefaultConnectorLogger.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/TypeFacilityImpl.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnection.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnector.java
trunk/connector-api/src/main/java/org/teiid/logging/api/
trunk/connector-api/src/test/java/org/teiid/connector/TestWrappedConnector.java
trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/IQueryToLdapSearchParser.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnection.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnector.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorCapabilities.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorConstants.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSearchDetails.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSyncQueryExecution.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPUpdateExecution.java
trunk/connectors/connector-ldap/src/main/resources/com/
trunk/connectors/connector-ldap/src/test/java/com/metamatrix/connector/ldap/
trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestIQueryToLdapSearchParser.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Constants.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Messages.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForceManagedConnectionFactory.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForcePlugin.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Util.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/AbstractUpdateExecution.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DataPayload.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeleteExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedObject.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedResult.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetDeletedExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetUpdatedExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/InsertExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParent.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParentImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/QueryExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/SalesforceProcedureExecution.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdateExecutionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdatedResult.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/
trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/ConnectionImpl.java
trunk/connectors/connector-salesforce/src/main/resources/com/
trunk/connectors/connector-salesforce/src/test/java/com/metamatrix/connector/salesforce/execution/visitors/TestVisitors.java
trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/StringToDateTranslator.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextCapabilities.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnection.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnector.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPropertyNames.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextSynchExecution.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextUtil.java
trunk/connectors/connector-text/src/main/resources/com/
trunk/connectors/sandbox/translator-yahoo/src/main/java/com/metamatrix/connector/yahoo/
trunk/connectors/sandbox/translator-yahoo/src/main/rar/
trunk/connectors/sandbox/translator-yahoo/src/main/resources/com/
trunk/connectors/sandbox/translator-yahoo/src/test/java/com/metamatrix/connector/yahoo/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCConnector.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCExecutionException.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCManagedConnectionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPlugin.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCProcedureExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCSourceConnection.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/access/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/db2/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/derby/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/h2/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/hsql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/informix/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/mm/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/mysql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/postgresql/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/teiid/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/
trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/translator/
trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml
trunk/connectors/translator-jdbc/src/main/resources/org/teiid/connector/
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCManagedConnectionFactory.java
trunk/connectors/translator-loopback/src/main/java/com/metamatrix/connector/loopback/
trunk/connectors/translator-loopback/src/main/rar/
trunk/connectors/translator-loopback/src/test/java/com/metamatrix/connector/loopback/
trunk/engine/src/main/java/com/metamatrix/common/log/JavaLogWriter.java
trunk/engine/src/main/java/com/metamatrix/common/log/LogConstants.java
trunk/engine/src/main/java/com/metamatrix/common/log/LogListener.java
trunk/engine/src/main/java/com/metamatrix/common/log/LogManager.java
trunk/engine/src/main/java/com/metamatrix/common/log/LogMessage.java
trunk/engine/src/main/java/com/metamatrix/common/log/MessageLevel.java
trunk/engine/src/test/java/com/metamatrix/common/log/TestLogManager.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeploymentGroup.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryParserDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryMetadataGroup.java
trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ExtendedPropertyMetadata.java
trunk/jboss-integration/src/test/java/org/teiid/templates/connector/TestExtendedPropertyMetadata.java
trunk/metadata/src/test/java/com/metamatrix/cdk/api/SysLogger.java
Modified:
trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
trunk/build/assembly/jboss-container/dist.xml
trunk/build/kits/jboss-container/deploy/teiid/teiid-connector-templates-jboss-beans.xml
trunk/build/kits/jboss-container/deployers/teiid.deployer/teiid-deployer-jboss-beans.xml
trunk/client/src/main/java/org/teiid/adminapi/Admin.java
trunk/client/src/main/java/org/teiid/adminapi/Model.java
trunk/client/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
trunk/client/src/main/java/org/teiid/adminapi/impl/SourceMappingMetadata.java
trunk/client/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java
trunk/client/src/main/resources/vdb-deployer.xsd
trunk/client/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java
trunk/connector-api/src/main/java/org/teiid/connector/language/Condition.java
trunk/connector-api/src/main/java/org/teiid/connector/language/LanguageFactory.java
trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/BaseColumn.java
trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java
trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/RuntimeMetadata.java
trunk/connectors/connector-ldap/pom.xml
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPManagedConnectionFactory.java
trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPPlugin.java
trunk/connectors/connector-ldap/src/main/rar/META-INF/ra.xml
trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestLDAPConnection.java
trunk/connectors/connector-salesforce/pom.xml
trunk/connectors/connector-salesforce/src/main/rar/META-INF/ra.xml
trunk/connectors/connector-text/pom.xml
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextManagedConnectionFactory.java
trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPlugin.java
trunk/connectors/connector-text/src/main/rar/META-INF/ra.xml
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestMultiFileTextSynchExecution.java
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestRowHeaderTextSynchExecution.java
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnection.java
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnector.java
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextSynchExecution.java
trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/Util.java
trunk/connectors/sandbox/translator-yahoo/pom.xml
trunk/connectors/translator-jdbc/pom.xml
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/FakeMetadataFactory.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCProcedureExecution.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCUpdateExecution.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TranslationHelper.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/access/TestAccessSQLTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2ConvertModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbyCapabilities.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbySQLTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/extension/TestSQLConversionVisitor.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/h2/TestH2Translator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQL5Translator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQLTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestDayWeekQuarterFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLeftOrRightFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLog10FunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestMonthOrDayNameFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleConvertModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestSubstringFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/postgresql/TestPostgreSQLTranslator.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sqlserver/TestSqlServerConversionVisitor.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseConvertModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseSQLConversionVisitor.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestEscapeSyntaxModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestExtractFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestLocateFunctionModifier.java
trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestModFunctionModifier.java
trunk/connectors/translator-loopback/pom.xml
trunk/engine/src/main/java/com/metamatrix/common/buffer/TupleBuffer.java
trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/FileStorageManager.java
trunk/engine/src/main/java/com/metamatrix/query/analysis/AnalysisRecord.java
trunk/engine/src/main/java/com/metamatrix/query/function/FunctionTree.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/BasicSourceCapabilities.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/CapabilitiesUtil.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/NewCalculateCostUtil.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCopyCriteria.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePlanJoins.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/xml/XMLPlanner.java
trunk/engine/src/main/java/com/metamatrix/query/processor/QueryProcessor.java
trunk/engine/src/main/java/com/metamatrix/query/processor/proc/AssignmentInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ErrorInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ExecDynamicSqlInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/proc/IfInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ProcedurePlan.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/SortUtility.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AbortProcessingInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddCommentInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddNodeInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndBlockInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndDocumentInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecSqlInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecStagingTableInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/IfInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/InitializeDocumentInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveCursorInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveDocInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/RelationalPlanExecutor.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/SAXDocumentInProgress.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/WhileInstruction.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLPlan.java
trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLProcessorEnvironment.java
trunk/engine/src/main/java/com/metamatrix/query/resolver/QueryResolver.java
trunk/engine/src/main/java/com/metamatrix/query/resolver/command/UpdateProcedureResolver.java
trunk/engine/src/main/java/org/teiid/dqp/internal/cache/DQPContextCache.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/CapabilitiesConverter.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorManager.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWork.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ExecutionContextImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ProcedureBatchHandler.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/metadata/RuntimeMetadataImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AbstractWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedFinder.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CodeTableCache.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/StatsCapturingWorkManager.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/validator/AuthorizationValidationVisitor.java
trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties
trunk/engine/src/test/java/com/metamatrix/dqp/service/AutoGenDataService.java
trunk/engine/src/test/java/com/metamatrix/query/function/TestFunctionTree.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinOptimization.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinPushdownRestrictions.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java
trunk/engine/src/test/java/com/metamatrix/query/sql/visitor/TestExpressionMappingVisitor.java
trunk/engine/src/test/java/com/metamatrix/query/unittest/FakeMetadataFactory.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeConnector.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeExecutionContextImpl.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeProcedureExecution.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorManager.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorWorkItem.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestTypeFacilityImpl.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
trunk/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/VDBMetaDataInstanceClassFactory.java
trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorDeploymentTemplate.java
trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorTemplateInfo.java
trunk/jboss-integration/src/main/java/org/teiid/templates/connector/RaXmlPropertyConverter.java
trunk/jboss-integration/src/main/java/org/teiid/templates/connector/XaJdbcConnectorTemplateInfo.java
trunk/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
trunk/metadata/src/test/java/com/metamatrix/cdk/api/ConnectorHost.java
trunk/runtime/pom.xml
trunk/runtime/src/main/java/org/teiid/deployers/DynamicVDBDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
trunk/runtime/src/main/java/org/teiid/logging/CommonsLogManagerAdapter.java
trunk/runtime/src/main/java/org/teiid/logging/Log4jListener.java
trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
trunk/runtime/src/main/java/org/teiid/services/TeiidLoginContext.java
trunk/runtime/src/main/java/org/teiid/transport/LogonImpl.java
trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java
trunk/runtime/src/main/java/org/teiid/transport/ServerWorkItem.java
trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
trunk/runtime/src/main/java/org/teiid/transport/SocketListener.java
trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties
trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/MockConnector.java
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java
trunk/test-integration/db/src/test/java/org/teiid/adminapi/jboss/TestConnectorBindings.java
trunk/test-integration/pom.xml
Log:
TEIID-1075, TEIID-1077, TEIID-1078, TEIID-1079, TEIID-1080, TEIID-1081: Translation layer changes.
Modified: trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
===================================================================
--- trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -40,12 +40,12 @@
import org.teiid.adminapi.AdminException;
import org.teiid.adminapi.AdminFactory;
import org.teiid.adminapi.AdminProcessingException;
-import org.teiid.adminapi.ConnectionFactory;
import org.teiid.adminapi.ProcessObject;
import org.teiid.adminapi.PropertyDefinition;
import org.teiid.adminapi.Request;
import org.teiid.adminapi.Session;
import org.teiid.adminapi.Transaction;
+import org.teiid.adminapi.Translator;
import org.teiid.adminapi.VDB;
import org.teiid.adminapi.WorkerPoolStatistics;
import org.teiid.adminshell.Help.Doc;
@@ -112,13 +112,12 @@
p = props;
}
- @Doc(text = "Add a ConnectionFactory")
- public static ConnectionFactory addConnectionFactory(
+ @Doc(text = "Add a Translator")
+ public static Translator addTranslator(
@Doc(text = "deployed name") String deployedName,
@Doc(text = "type name") String typeName,
Properties properties) throws AdminException {
- return getAdmin()
- .addConnectionFactory(deployedName, typeName, properties);
+ return getAdmin().addTranslator(deployedName, typeName, properties);
}
@Doc(text = "Adds a role to the specified policy")
@@ -130,16 +129,16 @@
getAdmin().addRoleToDataPolicy(vdbName, vdbVersion, policyName, role);
}
- @Doc(text = "Assign a ConnectionFactory to a source Model")
- public static void assignConnectionFactoryToModel(
+ @Doc(text = "Assign a translator and data source to a source Model")
+ public static void assignToModel(
@Doc(text = "vdb name") String vdbName,
@Doc(text = "vdb version") int vdbVersion,
@Doc(text = "model name") String modelName,
- @Doc(text = "source name") String sourceName,
+ @Doc(text = "source name") String sourceName,
+ @Doc(text = "translator name") String translatorName,
@Doc(text = "jndi name") String jndiName)
throws AdminException {
- getAdmin().assignConnectionFactoryToModel(vdbName, vdbVersion, modelName,
- sourceName, jndiName);
+ getAdmin().assignToModel(vdbName, vdbVersion, modelName, sourceName, translatorName, jndiName);
}
@Doc(text = "Cancel a request")
@@ -156,19 +155,13 @@
getAdmin().clearCache(cacheType);
}
- @Doc(text = "Delete a ConnectionFactory")
- public static void deleteConnectionFactory(
+ @Doc(text = "Delete a Translator")
+ public static void deleteTranslator(
@Doc(text = "deployed name") String deployedName)
throws AdminException {
- getAdmin().deleteConnectionFactory(deployedName);
+ getAdmin().deleteTranslator(deployedName);
}
- @Doc(text = "Delete a Connector")
- public static void deleteConnector(
- @Doc(text = "name") String name) throws AdminException {
- getAdmin().deleteConnector(name);
- }
-
@Doc(text = "Delete a VDB")
public static void deleteVDB(
@Doc(text = "vdb name") String vdbName,
@@ -181,35 +174,28 @@
return getAdmin().getCacheTypes();
}
- @Doc(text = "Get all ConnectionFactory instances")
- public static Collection<ConnectionFactory> getConnectionFactories()
+ @Doc(text = "Get all translator instances")
+ public static Collection<Translator> getTranslators()
throws AdminException {
- return getAdmin().getConnectionFactories();
+ return getAdmin().getTranslators();
}
- @Doc(text = "Get all ConnectionFactory instances in the VDB")
- public static Collection<ConnectionFactory> getConnectionFactoriesInVDB(
- @Doc(text = "vdb name") String vdbName,
- @Doc(text = "vdb version") int vdbVersion) throws AdminException {
- return getAdmin().getConnectionFactoriesInVDB(vdbName, vdbVersion);
- }
-
@Doc(text = "Get the specified ConnectionFactory")
- public static ConnectionFactory getConnectionFactory(
+ public static Translator getTranslator(
@Doc(text = "deployed name") String deployedName)
throws AdminException {
- return getAdmin().getConnectionFactory(deployedName);
+ return getAdmin().getTranslator(deployedName);
}
- @Doc(text = "Get all connector name Strings")
- public static Set<String> getConnectorNames() throws AdminException {
- return getAdmin().getConnectorTemplateNames();
+ @Doc(text = "Get all translator name Strings")
+ public static Set<String> getTranslatorTemplateNames() throws AdminException {
+ return getAdmin().getTranslatorTemplateNames();
}
- @Doc(text = "Get all PropertyDefinition instances for the given connector")
- public static Collection<PropertyDefinition> getConnectorPropertyDefinitions(
- @Doc(text = "connector name") String connectorName) throws AdminException {
- return getAdmin().getConnectorTemplatePropertyDefinitions(connectorName);
+ @Doc(text = "Get all PropertyDefinitions for the given translator template")
+ public static Collection<PropertyDefinition> getTranslatorTemplatePropertyDefinitions(
+ @Doc(text = "template name") String templateName) throws AdminException {
+ return getAdmin().getTranslatorTemplatePropertyDefinitions(templateName);
}
@Doc(text = "Get the ProcessObject instances for the given identifier")
@@ -270,13 +256,12 @@
.removeRoleFromDataPolicy(vdbName, vdbVersion, policyName, role);
}
- @Doc(text = "Set a ConnectionFactory property")
- public static void setConnectionFactoryProperty(
+ @Doc(text = "Set a Translator property")
+ public static void setTranslatorProperty(
@Doc(text = "deployed name") String deployedName,
@Doc(text = "propery name") String propertyName,
@Doc(text = "value") String propertyValue) throws AdminException {
- getAdmin().setConnectionFactoryProperty(deployedName, propertyName,
- propertyValue);
+ getAdmin().setTranslatorProperty(deployedName, propertyName,propertyValue);
}
@Doc(text = "Set a runtime property")
@@ -287,20 +272,6 @@
getAdmin().setRuntimeProperty(propertyName, propertyValue);
}
- @Doc(text = "Start a ConnectionFactory")
- public static void startConnectionFactory(
- @Doc(text = "deployed name") String deployedName)
- throws AdminException {
- getAdmin().startConnectionFactory(deployedName);
- }
-
- @Doc(text = "Stop a ConnectionFactory")
- public static void stopConnectionFactory(
- @Doc(text = "deployed name") String deployedName)
- throws AdminException {
- getAdmin().stopConnectionFactory(deployedName);
- }
-
@Doc(text = "Terminate a session and associated requests")
public static void terminateSession(
@Doc(text = "session id") String sessionId) throws AdminException {
@@ -323,12 +294,11 @@
getAdmin().mergeVDBs(sourceVDBName, sourceVDBVersion, targetVDBName, targetVDBVersion);
}
- @Doc(text = "Checks if a ConnectionFactory exists")
- public static boolean hasConnectionFactory(
- @Doc(text = "deployed name") String factoryName) throws AdminException {
- Collection<ConnectionFactory> bindings = getAdmin().getConnectionFactories();
+ @Doc(text = "Checks if a translator exists")
+ public static boolean hasTranslator(@Doc(text = "deployed name") String factoryName) throws AdminException {
+ Collection<Translator> bindings = getAdmin().getTranslators();
- for (ConnectionFactory binding:bindings) {
+ for (Translator binding:bindings) {
if (binding.getName().equals(factoryName)) {
return true;
}
@@ -336,19 +306,6 @@
return false;
}
- @Doc(text = "Checks if a Connector exists")
- public static boolean hasConnector(
- @Doc(text = "type name") String typeName) throws AdminException {
- Collection<String> types = getAdmin().getConnectorTemplateNames();
-
- for (String type:types) {
- if (type.equals(typeName)) {
- return true;
- }
- }
- return false;
- }
-
@Doc(text = "Checks if a VDB exists")
public static boolean hasVDB(
@Doc(text = "vdb name") String vdbName) throws AdminException {
@@ -390,21 +347,6 @@
ObjectConverterUtil.write(contents, fileName);
}
- @Doc(text = "Add a connector from a RAR file")
- public static void addConnector(
- @Doc(text = "name of the Connector") String name,
- @Doc(text = "RAR file name") String rarFile) throws FileNotFoundException, AdminException {
- FileInputStream fis = new FileInputStream(new File(rarFile));
- try {
- getAdmin().addConnector(name, fis);
- } finally {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
-
@Doc(text = "Export a VDB to file")
public static void exportVDB(
@Doc(text = "vdb name") String vdbName,
Modified: trunk/build/assembly/jboss-container/dist.xml
===================================================================
--- trunk/build/assembly/jboss-container/dist.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/build/assembly/jboss-container/dist.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -70,14 +70,19 @@
<includeSubModules>true</includeSubModules>
<includes>
- <include>org.jboss.teiid.connectors:connector-jdbc:rar</include>
- <include>org.jboss.teiid.connectors:connector-loopback:rar</include>
+ <include>org.jboss.teiid.connectors:translator-jdbc</include>
+ <include>org.jboss.teiid.connectors:translator-loopback</include>
+ <include>org.jboss.teiid.connectors:translator-text</include>
<include>org.jboss.teiid.connectors:connector-text:rar</include>
+ <include>org.jboss.teiid.connectors:translator-ldap</include>
<include>org.jboss.teiid.connectors:connector-ldap:rar</include>
+ <include>org.jboss.teiid.connectors:translator-salesforce</include>
<include>org.jboss.teiid.connectors:connector-salesforce:rar</include>
+ <!--
<include>org.jboss.teiid.connectors:connector-xml-http:rar</include>
<include>org.jboss.teiid.connectors:connector-xml-file:rar</include>
<include>org.jboss.teiid.connectors:connector-xml-soap:rar</include>
+ -->
</includes>
<binaries>
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/access-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/access-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/access-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.access.AccessSQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/access-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/db2-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/db2-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/db2-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.db2.DB2SQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/db2-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/derby-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/derby-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/derby-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.derby.DerbySQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/derby-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/h2-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/h2-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/h2-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.h2.H2Translator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/h2-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/hsql-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/hsql-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/hsql-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.hsql.HsqlTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/hsql-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/ldap-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/ldap-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/ldap-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.ldap.LDAPExecutionFactory</execution-factory-class>
+ <translator-property name="SearchDefaultBaseDN" value="" />
+ <translator-property name="SearchDefaultScope" value="SUBTREE_SCOPE"/>
+ <translator-property name="RestrictToObjectClass" value="false"/>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/ldap-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/loopback-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/loopback-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/loopback-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.loopback.LoopbackExecutionFactory</execution-factory-class>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/loopback-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/mysql-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/mysql-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/mysql-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.mysql.MySQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/mysql-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/oracle-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/oracle-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/oracle-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.oracle.OracleSQLTranslator"/>
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/oracle-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/postgresql-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/postgresql-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/postgresql-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.postgresql.PostgreSQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/postgresql-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/salesforce-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/salesforce-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/salesforce-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.salesforce.SalesForceExecutionFactory</execution-factory-class>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/salesforce-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/sqlserver-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/sqlserver-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/sqlserver-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.sqlserver.SQLServerSQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/sqlserver-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/sybase-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/sybase-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/sybase-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</execution-factory-class>
+ <translator-property name="ExtensionTranslationClassName" value="org.teiid.translator.jdbc.sybase.SybaseSQLTranslator" />
+ <xa-capable>true</xa-capable>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/sybase-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/build/kits/jboss-container/deploy/teiid/connectors/text-translator.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/connectors/text-translator.xml (rev 0)
+++ trunk/build/kits/jboss-container/deploy/teiid/connectors/text-translator.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<translator>
+ <execution-factory-class>org.teiid.resource.adapter.text.TextExecutionFactory</execution-factory-class>
+</translator>
Property changes on: trunk/build/kits/jboss-container/deploy/teiid/connectors/text-translator.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/build/kits/jboss-container/deploy/teiid/teiid-connector-templates-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/teiid-connector-templates-jboss-beans.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/build/kits/jboss-container/deploy/teiid/teiid-connector-templates-jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="urn:jboss:bean-deployer:2.0">
-
+ <!--
<bean name="connector-jdbc-xa-${project.version}" class="org.teiid.templates.connector.XaJdbcConnectorTemplate">
<property name="info"><inject bean="connector-jdbc-xa-templateinfo"/></property>
</bean>
@@ -15,7 +15,8 @@
</constructor>
<property name="rarName">connector-jdbc-${project.version}.rar</property>
</bean>
-
+ -->
+
<bean name="connector-ldap-${project.version}" class="org.teiid.templates.connector.ConnectorDeploymentTemplate">
<property name="info"><inject bean="connector-ldap-templateinfo"/></property>
<property name="targetTemplate"><inject bean="NoTxConnectionFactoryTemplate"/></property>
@@ -31,21 +32,6 @@
<property name="rarName">connector-ldap-${project.version}.rar</property>
</bean>
- <bean name="connector-loopback-${project.version}" class="org.teiid.templates.connector.ConnectorDeploymentTemplate">
- <property name="info"><inject bean="connector-loopback-templateinfo"/></property>
- <property name="targetTemplate"><inject bean="NoTxConnectionFactoryTemplate"/></property>
- </bean>
- <bean name="connector-loopback-templateinfo" class="org.teiid.templates.connector.ConnectorTemplateInfo">
- <constructor factoryMethod="createTemplateInfo">
- <factory bean="DSDeploymentTemplateInfoFactory"/>
- <parameter class="java.lang.Class">org.teiid.templates.connector.ConnectorTemplateInfo</parameter>
- <parameter class="java.lang.Class">org.jboss.resource.metadata.mcf.NoTxConnectionFactoryDeploymentMetaData</parameter>
- <parameter class="java.lang.String">connector-loopback-${project.version}</parameter>
- <parameter class="java.lang.String">Teiid Loopback Connector</parameter>
- </constructor>
- <property name="rarName">connector-loopback-${project.version}.rar</property>
- </bean>
-
<bean name="connector-salesforce-${project.version}" class="org.teiid.templates.connector.ConnectorDeploymentTemplate">
<property name="info"><inject bean="connector-salesforce-templateinfo"/></property>
<property name="targetTemplate"><inject bean="NoTxConnectionFactoryTemplate"/></property>
@@ -76,6 +62,7 @@
<property name="rarName">connector-text-${project.version}.rar</property>
</bean>
+ <!--
<bean name="connector-xmlsource-file-${project.version}" class="org.teiid.templates.connector.ConnectorDeploymentTemplate">
<property name="info"><inject bean="connector-xmlsource-file-templateinfo"/></property>
<property name="targetTemplate"><inject bean="NoTxConnectionFactoryTemplate"/></property>
@@ -120,5 +107,6 @@
</constructor>
<property name="rarName">connector-xml-http-${project.version}.rar</property>
</bean>
+ -->
</deployment>
Modified: trunk/build/kits/jboss-container/deployers/teiid.deployer/teiid-deployer-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deployers/teiid.deployer/teiid-deployer-jboss-beans.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/build/kits/jboss-container/deployers/teiid.deployer/teiid-deployer-jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -44,12 +44,11 @@
<property name="VDBRepository"><inject bean="VDBRepository"/></property>
<property name="contextCache"><inject bean="ContextCache"/></property>
<property name="objectSerializer"><inject bean="ObjectSerializer"/></property>
- <property name="connectorManagerRepository"><inject bean="ConnectorManagerRepository"/></property>
+ <property name="connectorManagerRepository"><inject bean="ConnectorManagerRepository"/></property>
+ <property name="translatorRepository"><inject bean="translatorRepository"/></property>
<depends>SystemVDBDeployer</depends>
</bean>
-
-
<bean name="SystemVDBDeployer" class="org.teiid.deployers.SystemVDBDeployer">
<property name="VDBRepository"><inject bean="VDBRepository"/></property>
</bean>
@@ -57,27 +56,29 @@
<bean name="ConnectionFactoryDeployer" class="org.teiid.jboss.deployers.ConnectionFactoryDeployer">
<property name="connectorManagerRepository"><inject bean="ConnectorManagerRepository"/></property>
<property name="VDBStatusChecker"><inject bean="VDBStatusChecker"/></property>
- <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
</bean>
- <bean name="AutoConnectionFactoryDeployer" class="org.teiid.jboss.deployers.AutoConnectionFactoryDeployer">
- <property name="connectorManagerRepository"><inject bean="ConnectorManagerRepository"/></property>
+ <bean name="translatorRepository" class="org.teiid.dqp.internal.datamgr.impl.TranslatorRepository"/>
+
+ <bean name="TranslatorParserDeployer" class="org.teiid.deployers.TranslatorParserDeployer"/>
+ <bean name="TranslatorDeployer" class="org.teiid.deployers.TranslatorDeployer">
+ <property name="translatorRepository"><inject bean="translatorRepository"/></property>
<property name="VDBStatusChecker"><inject bean="VDBStatusChecker"/></property>
- <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
</bean>
-
+
<bean name="VDBStatusChecker" class="org.teiid.deployers.VDBStatusChecker">
<property name="VDBRepository"><inject bean="VDBRepository"/></property>
+ <property name="connectorManagerRepository"><inject bean="ConnectorManagerRepository"/></property>
</bean>
- <bean name="AutoConnectionFactoryParserDeployer" class="org.teiid.jboss.deployers.AutoConnectionFactoryParserDeployer">
- </bean>
-
<!-- Persistence class for the VDB deployment file -->
<bean name="VDBMetadataComponentMapper" class="org.teiid.jboss.deployers.VDBMetadataComponentMapper">
<constructor><parameter><inject bean="PersistenceFactory" /></parameter></constructor>
</bean>
+ <!-- used for the translators -->
+ <bean name="TranslatorDeploymentTemplateInfoFactory" class="org.teiid.templates.TranslatorTemplateInfoFactory"/>
+
<!-- JBOSS Cache -->
<!-- Uncomment for JBoss Cache -->
<!--
Modified: trunk/client/src/main/java/org/teiid/adminapi/Admin.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/Admin.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/Admin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -32,16 +32,17 @@
public enum Cache {CODE_TABLE_CACHE,PREPARED_PLAN_CACHE, QUERY_SERVICE_RESULT_SET_CACHE};
/**
- * Assign a {@link ConnectionFactory} to a {@link VDB}'s Model
+ * Assign a {@link Translator} and Data source to a {@link VDB}'s Model
*
* @param vdbName Name of the VDB
* @param vdbVersion Version of the VDB
* @param modelName Name of the Model to map Connection Factory
* @param sourceName sourceName for the model
- * @param jndiName JNDI names to which the source name needs to map to
+ * @param translatorName
+ * @param dsName data source name that can found in the JNDI map.
* @throws AdminException
*/
- void assignConnectionFactoryToModel(String vdbName, int vdbVersion, String modelName, String sourceName, String jndiName) throws AdminException;
+ void assignToModel(String vdbName, int vdbVersion, String modelName, String sourceName, String translatorName, String dsName) throws AdminException;
/**
* Set/update the property for the Connection Factory identified by the given deployed name.
@@ -50,43 +51,26 @@
* @param propertyValue
* @throws AdminException
*/
- void setConnectionFactoryProperty(String deployedName, String propertyName, String propertyValue) throws AdminException;
+ void setTranslatorProperty(String deployedName, String propertyName, String propertyValue) throws AdminException;
/**
- * Add Connector, will import RAR from a file
+ * Deploy a {@link Translator} to Configuration
*
- * @param name of the Connector to add
- * @param rar RAR file
- * @throws AdminException
- */
- void addConnector(String name, InputStream rar) throws AdminException;
-
- /**
- * Delete Connector
- *
- * @param name String name of the Connector to delete
- * @throws AdminException
- */
- void deleteConnector(String name) throws AdminException;
-
- /**
- * Deploy a {@link ConnectionFactory} to Configuration
- *
- * @param deployedName Connection Factory name that will be added to Configuration
- * @param typeName Connector type name.
+ * @param deployedName Translator name that will be added to Configuration
+ * @param templateName template name
* @param properties Name & Value pair need to deploy the Connection Factory
* @throws AdminException
*/
- ConnectionFactory addConnectionFactory(String deployedName, String typeName, Properties properties) throws AdminException;
+ Translator addTranslator(String deployedName, String templateName, Properties properties) throws AdminException;
/**
- * Delete the {@link ConnectionFactory} from the Configuration
+ * Delete the {@link Translator} from the Configuration
*
* @param deployedName - deployed name of the connection factory
* @throws AdminException
*/
- void deleteConnectionFactory(String deployedName) throws AdminException;
+ void deleteTranslator(String deployedName) throws AdminException;
/**
* Deploy a {@link VDB} file.
@@ -125,12 +109,12 @@
void setRuntimeProperty(String propertyName, String propertyValue) throws AdminException;
/**
- * Get the Connector Template available in the configuration.
+ * Get the translator templates available in the configuration.
*
* @return Set of connector template names.
* @throws AdminException
*/
- Set<String> getConnectorTemplateNames() throws AdminException;
+ Set<String> getTranslatorTemplateNames() throws AdminException;
/**
* Get the VDBs that currently deployed in the system
@@ -151,31 +135,22 @@
VDB getVDB(String vdbName, int vbdVersion) throws AdminException;
/**
- * Get the Connection Factories that are available in the configuration
+ * Get the translators that are available in the configuration
*
- * @return Collection of {@link ConnectionFactory}
+ * @return Collection of {@link Translator}
* @throws AdminException
*/
- Collection<ConnectionFactory> getConnectionFactories() throws AdminException;
+ Collection<Translator> getTranslators() throws AdminException;
/**
- * Get the Connection Factory by the given the deployed name.
- * @param deployedName - name of the deployed Connection Factory
- * @return null if not found a Connection Factory by the given name
+ * Get the translator by the given the deployed name.
+ * @param deployedName - name of the deployed translator
+ * @return null if not found
* @throws AdminException
*/
- ConnectionFactory getConnectionFactory(String deployedName) throws AdminException;
+ Translator getTranslator(String deployedName) throws AdminException;
/**
- * Get all the Connection Factories for the given VDB identifier pattern
- * @param vdbName - Name of the VDB
- * @param vdbVersion - version of the VDB
- * @return Collection of {@link ConnectionFactory}
- * @throws AdminException
- */
- Collection<ConnectionFactory> getConnectionFactoriesInVDB(String vdbName, int vdbVersion) throws AdminException;
-
- /**
* Get the Work Manager stats that correspond to the specified identifier pattern.
*
* @param identifier - an identifier for the queues {@link QueueWorkerPool}.
@@ -184,9 +159,6 @@
*/
WorkerPoolStatistics getWorkManagerStats(String identifier) throws AdminException;
-
-
-
/**
* Get the Caches that correspond to the specified identifier pattern
* @return Collection of {@link String}
@@ -222,7 +194,7 @@
* @return
* @throws AdminException
*/
- Collection<PropertyDefinition> getConnectorTemplatePropertyDefinitions(String templateName) throws AdminException;
+ Collection<PropertyDefinition> getTranslatorTemplatePropertyDefinitions(String templateName) throws AdminException;
/**
@@ -244,24 +216,7 @@
*/
Collection<ProcessObject> getProcesses(String processIdentifier) throws AdminException;
-
/**
- * Start Connection Factory
- *
- @param deployedName - name of the deployed Connection Factory
- * @throws AdminException
- */
- void startConnectionFactory(String deployedName) throws AdminException;
-
- /**
- * Stop Connection Factory
- *
- * @param deployedName - name of the deployed Connection Factory
- * @throws AdminException
- */
- void stopConnectionFactory(String deployedName) throws AdminException;
-
- /**
* Clear the cache or caches specified by the cacheIdentifier.
* @param cacheType Cache Type
* No wild cards currently supported, must be explicit
Deleted: trunk/client/src/main/java/org/teiid/adminapi/ConnectionFactory.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/ConnectionFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/ConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,48 +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.adminapi;
-
-
-/**
- * Represents a connector binding (the instance of a connector type) in the Teiid system.
- */
-public interface ConnectionFactory extends AdminObject {
-
- /**
- * Get the identifier for this connector binding's RAR file name
- * @return Name of the RAR file used to create this binding
- */
- String getRARFileName();
-
- /**
- * Get the JNDI Name of this connector
- * @return
- */
- String getJNDIName();
-
- /**
- * Get the template name for the Connection Factory
- * @return
- */
- String getTemplateName();
-}
Deleted: trunk/client/src/main/java/org/teiid/adminapi/ConnectionPoolStatistics.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/ConnectionPoolStatistics.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/ConnectionPoolStatistics.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,83 +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.adminapi;
-
-import java.io.Serializable;
-
-
-/**
- * This object holds the statistics for a ConnectionPool that is being utilized by a Connector.
- * As per how many available connections
- * processed etc.
- */
-public interface ConnectionPoolStatistics extends AdminObject, Serializable {
-
- /**
- * The maximum number of connections that are available
- * @return
- */
- long getAvailableConnectionCount();
-
- /**
- * The number of connections that are currently in the pool
- * @return
- */
- int getConnectionCount();
-
- /**
- * The number of connections that have been created since the connector was last started
- * @return
- */
- int getConnectionCreatedCount();
-
- /**
- * The number of connections that have been destroyed since the connector was last started
- * @return
- */
- int getConnectionDestroyedCount();
-
-
- /**
- * The number of connections that are currently in use
- * @return
- */
- long getInUseConnectionCount();
-
- /**
- * The most connections that have been simultaneously in use since this connector was started
- * @return
- */
- long getMaxConnectionsInUseCount();
-
- /**
- * Max size
- * @return
- */
- int getMaxSize();
-
- /**
- * Min Size
- * @return
- */
- int getMinSize();
-}
Modified: trunk/client/src/main/java/org/teiid/adminapi/Model.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/Model.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/Model.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -79,5 +79,13 @@
* @param sourceName - name of the source
* @return null if none configured.
*/
- String getSourceJndiName(String sourceName);
+ String getSourceConnectionJndiName(String sourceName);
+
+
+ /**
+ * Get the configured translator name for the given source
+ * @param sourceName
+ * @return
+ */
+ String getSourceTranslatorName(String sourceName);
}
\ No newline at end of file
Added: trunk/client/src/main/java/org/teiid/adminapi/Translator.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/Translator.java (rev 0)
+++ trunk/client/src/main/java/org/teiid/adminapi/Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,42 @@
+/*
+ * 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.adminapi;
+
+
+public interface Translator extends AdminObject{
+
+ public String getExecutionFactoryClass();
+
+ public String getCapabilitiesClass();
+
+ public boolean isImmutable();
+
+ public boolean isExceptionOnMaxRows();
+
+ public int getMaxResultRows();
+
+ public boolean isXaCapable();
+
+ public String getOverrideCapabilitiesFile();
+
+ public void setOverrideCapabilitiesFile(String propsFile);
+}
Property changes on: trunk/client/src/main/java/org/teiid/adminapi/Translator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionFactoryMetaData.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionFactoryMetaData.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionFactoryMetaData.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,94 +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.adminapi.impl;
-
-import java.util.List;
-
-import org.jboss.managed.api.annotation.ManagementComponent;
-import org.jboss.managed.api.annotation.ManagementObject;
-import org.jboss.managed.api.annotation.ManagementObjectID;
-import org.jboss.managed.api.annotation.ManagementProperty;
-import org.teiid.adminapi.ConnectionFactory;
-
- at ManagementObject(componentType=@ManagementComponent(type="teiid",subtype="connection-factory"))
-public class ConnectionFactoryMetaData extends AdminObjectImpl implements ConnectionFactory {
-
- private static final String TEMPLATE_NAME = "template-name"; //$NON-NLS-1$
- private static final long serialVersionUID = -4865836616882247016L;
- private transient Object type;
- private String rarFileName;
- private String jndiName;
-
- @ManagementProperty(description="Connector Binding Name")
- @ManagementObjectID(type="cf-name")
- public String getName() {
- return super.getName();
- }
-
- @Override
- @ManagementProperty(description="RAR file name")
- public String getRARFileName() {
- return this.rarFileName;
- }
-
- public void setRARFileName(String name) {
- this.rarFileName = name;
- }
-
- @Override
- @ManagementProperty(description="JNDI name")
- public String getJNDIName() {
- return this.jndiName;
- }
-
- public void setJNDIName(String name) {
- this.jndiName = name;
- }
-
- public void setComponentType(Object type) {
- this.type = type;
- }
-
- public Object getComponentType() {
- return this.type;
- }
-
- @Override
- @ManagementProperty(description="Template name for this connector")
- public String getTemplateName() {
- return getPropertyValue(TEMPLATE_NAME);
- }
-
- public void setTemplateName(String templateName) {
- addProperty(TEMPLATE_NAME, templateName);
- }
-
- @Override
- @ManagementProperty(description = "Connection Factory Properties", managed=true)
- public List<PropertyMetadata> getJAXBProperties(){
- return super.getJAXBProperties();
- }
-
- public String toString() {
- return getName();
- }
-}
Deleted: trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionPoolStatisticsMetadata.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionPoolStatisticsMetadata.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/ConnectionPoolStatisticsMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,133 +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.adminapi.impl;
-
-import org.jboss.managed.api.annotation.ManagementProperty;
-import org.teiid.adminapi.ConnectionPoolStatistics;
-
-public class ConnectionPoolStatisticsMetadata extends AdminObjectImpl implements ConnectionPoolStatistics {
-
- private static final long serialVersionUID = 4420845831075045579L;
- private long availableConnectionCount;
- private int connectionCount;
- private int connectionCreatedCount;
- private int connectionDestroyedCount;
- private long inUseConnectionCount;
- private long maxConnectionsInUseCount;
- private int maxSize;
- private int minSize;
-
-
- @Override
- @ManagementProperty(description="The maximum number of connections that are available", readOnly=true)
- public long getAvailableConnectionCount() {
- return availableConnectionCount;
- }
-
- @Override
- @ManagementProperty(description="The number of connections that are currently in the pool", readOnly=true)
- public int getConnectionCount() {
- return connectionCount;
- }
-
- @Override
- @ManagementProperty(description="The number of connections that have been created since the connector was last started", readOnly=true)
- public int getConnectionCreatedCount() {
- return connectionCreatedCount;
- }
-
- @Override
- @ManagementProperty(description="The number of connections that have been destroyed since the connector was last started", readOnly=true)
- public int getConnectionDestroyedCount() {
- return connectionDestroyedCount;
- }
-
- @Override
- @ManagementProperty(description="The number of connections that are currently in use", readOnly=true)
- public long getInUseConnectionCount() {
- return inUseConnectionCount;
- }
-
- @Override
- @ManagementProperty(description="The most connections that have been simultaneously in use since this connector was started", readOnly=true)
- public long getMaxConnectionsInUseCount() {
- return maxConnectionsInUseCount;
- }
-
- @Override
- @ManagementProperty(description="Max configured size", readOnly=true)
- public int getMaxSize() {
- return maxSize;
- }
-
- @Override
- @ManagementProperty(description="Min Configured Size", readOnly=true)
- public int getMinSize() {
- return minSize;
- }
-
- public void setMaxSize(int maxSize) {
- this.maxSize = maxSize;
- }
-
- public void setAvailableConnectionCount(long availableConnectionCount) {
- this.availableConnectionCount = availableConnectionCount;
- }
-
- public void setConnectionCount(int connectionCount) {
- this.connectionCount = connectionCount;
- }
-
- public void setConnectionCreatedCount(int connectionCreatedCount) {
- this.connectionCreatedCount = connectionCreatedCount;
- }
-
- public void setConnectionDestroyedCount(int connectionDestroyedCount) {
- this.connectionDestroyedCount = connectionDestroyedCount;
- }
-
- public void setInUseConnectionCount(long inUseConnectionCount) {
- this.inUseConnectionCount = inUseConnectionCount;
- }
-
- public void setMaxConnectionsInUseCount(long maxConnectionsInUseCount) {
- this.maxConnectionsInUseCount = maxConnectionsInUseCount;
- }
-
- public void setMinSize(int minSize) {
- this.minSize = minSize;
- }
-
- public String toString() {
- StringBuilder str = new StringBuilder();
- str.append("ConnectionPoolStatisticsMetadata:"); //$NON-NLS-1$
- str.append(" availableConnectionCount = " + availableConnectionCount); //$NON-NLS-1$
- str.append("; connectionCount = " + connectionCount); //$NON-NLS-1$
- str.append("; connectionCreatedCount = " + connectionCreatedCount); //$NON-NLS-1$
- str.append("; connectionDestroyedCount = " + connectionDestroyedCount); //$NON-NLS-1$
- str.append("; inUseConnectionCount = " + inUseConnectionCount); //$NON-NLS-1$
- str.append("; maxConnectionsInUseCount = " + maxConnectionsInUseCount); //$NON-NLS-1$
- str.append("; maxSize = " + maxSize); //$NON-NLS-1$
- str.append("; minSize = " + minSize); //$NON-NLS-1$
- return str.toString();
- }
-}
Modified: trunk/client/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -173,7 +173,7 @@
public void setSourceMappings(List<SourceMappingMetadata> sources){
for (SourceMappingMetadata source: sources) {
- addSourceMapping(source.getName(), source.getJndiName());
+ addSourceMapping(source.getName(), source.getTranslatorName(), source.getConnectionJndiName());
}
}
@@ -183,17 +183,26 @@
}
@Override
- public String getSourceJndiName(String sourceName) {
+ public String getSourceConnectionJndiName(String sourceName) {
SourceMappingMetadata s = this.sources.getMap().get(sourceName);
if (s == null) {
return null;
}
- return s.getJndiName();
+ return s.getConnectionJndiName();
}
- public void addSourceMapping(String name, String jndiName) {
- this.sources.getMap().put(name, new SourceMappingMetadata(name, jndiName));
+ @Override
+ public String getSourceTranslatorName(String sourceName) {
+ SourceMappingMetadata s = this.sources.getMap().get(sourceName);
+ if (s == null) {
+ return null;
+ }
+ return s.getTranslatorName();
}
+
+ public void addSourceMapping(String name, String translatorName, String connJndiName) {
+ this.sources.getMap().put(name, new SourceMappingMetadata(name, translatorName, connJndiName));
+ }
@ManagementProperty(description = "Model Validity Errors", readOnly=true, managed=true)
public List<ValidationError> getErrors(){
@@ -229,9 +238,12 @@
@XmlAttribute(name = "severity", required = true)
protected String severity;
-
- public ValidationError() {};
+ @XmlAttribute(name = "path")
+ protected String path;
+
+ public ValidationError() {};
+
public ValidationError(String severity, String msg) {
this.severity = severity;
this.value = msg;
@@ -253,6 +265,15 @@
public void setSeverity(String severity) {
this.severity = severity;
- }
+ }
+
+ @ManagementProperty (description="Path")
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
}
}
Modified: trunk/client/src/main/java/org/teiid/adminapi/impl/SourceMappingMetadata.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/SourceMappingMetadata.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/SourceMappingMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -44,15 +44,18 @@
@XmlAttribute(name = "name", required = true)
private String name;
- @XmlAttribute(name = "jndi-name")
+ @XmlAttribute(name = "connection-jndi-name")
private String jndiName;
+ @XmlAttribute(name = "translator-name",required = true)
+ private String translatorName;
- public SourceMappingMetadata() {}
+ public SourceMappingMetadata() {}
- public SourceMappingMetadata(String name, String jndiName) {
+ public SourceMappingMetadata(String name, String translatorName, String connJndiName) {
this.name = name;
- this.jndiName = jndiName;
+ this.translatorName = translatorName;
+ this.jndiName = connJndiName;
}
@ManagementProperty (description="Source Name")
@@ -66,7 +69,7 @@
}
@ManagementProperty (description="JNDI Name of the resource to assosiate with Source name")
- public String getJndiName() {
+ public String getConnectionJndiName() {
// this default could be controlled if needed.
if (this.jndiName == null) {
return "java:"+name; //$NON-NLS-1$
@@ -74,11 +77,20 @@
return jndiName;
}
- public void setJndiName(String jndiName) {
+ public void setConnectionJndiName(String jndiName) {
this.jndiName = jndiName;
}
+ @ManagementProperty (description="Translator Name")
+ public String getTranslatorName() {
+ return translatorName;
+ }
+
+ public void setTranslatorName(String translatorName) {
+ this.translatorName = translatorName;
+ }
+
public String toString() {
- return getName()+":"+getJndiName(); //$NON-NLS-1$
+ return getName()+"/"+getTranslatorName()+"/"+getConnectionJndiName(); //$NON-NLS-1$ //$NON-NLS-2$
}
}
\ No newline at end of file
Added: trunk/client/src/main/java/org/teiid/adminapi/impl/TranslatorMetaData.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/TranslatorMetaData.java (rev 0)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/TranslatorMetaData.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,156 @@
+/*
+ * 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.adminapi.impl;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.jboss.managed.api.annotation.ManagementComponent;
+import org.jboss.managed.api.annotation.ManagementObject;
+import org.jboss.managed.api.annotation.ManagementObjectID;
+import org.jboss.managed.api.annotation.ManagementProperties;
+import org.jboss.managed.api.annotation.ManagementProperty;
+import org.teiid.adminapi.Translator;
+
+ at ManagementObject(componentType=@ManagementComponent(type="teiid",subtype="translator"), properties=ManagementProperties.EXPLICIT)
+ at XmlAccessorType(XmlAccessType.NONE)
+ at XmlRootElement(name = "translator")
+public class TranslatorMetaData extends AdminObjectImpl implements Translator, Serializable {
+
+ private static final long serialVersionUID = 1680003620274793056L;
+ public static final String EXECUTION_FACTORY_CLASS = "execution-factory-class"; //$NON-NLS-1$
+ public static final String CAPBILITIES_CLASS = "capabilities-class"; //$NON-NLS-1$
+ public static final String IMMUTABLE = "immutable"; //$NON-NLS-1$
+ public static final String EXCEPTION_ON_MAX_ROWS = "exception-on-max-rows"; //$NON-NLS-1$
+ public static final String MAX_RESULT_ROWS = "max-result-rows"; //$NON-NLS-1$
+ public static final String XA_CAPABLE = "xa-capable"; //$NON-NLS-1$
+ public static final String OVERRIDE_CAPABILITIES_FILE = "override-capabilities-file"; //$NON-NLS-1$
+
+ // objects are used to keep the jaxb putting verbose xml elements when they are not defined.
+ private String executionFactoryClass;
+ private String capabilitiesClass;
+ private boolean immutable = false;
+ private boolean exceptionOnMaxRows = false;
+ private int maxResultRows = -1;
+ private boolean xaCapable = false;
+ private String overrideCapabilitiesFile;
+
+ @Override
+ @ManagementProperty(name="name", description="Name of the Translator", mandatory = true)
+ @ManagementObjectID(type="translator")
+ public String getName() {
+ return super.getName();
+ }
+
+ @Override
+ @ManagementProperty(name=EXECUTION_FACTORY_CLASS, description="Connector Class", mandatory = true)
+ public String getExecutionFactoryClass() {
+ return executionFactoryClass;
+ }
+
+ @XmlElement(name = EXECUTION_FACTORY_CLASS)
+ public void setExecutionFactoryClass(String arg0) {
+ this.executionFactoryClass = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=CAPBILITIES_CLASS, description="The class to use to provide the Connector Capabilities")
+ public String getCapabilitiesClass() {
+ return capabilitiesClass;
+ }
+
+ @XmlElement(name = CAPBILITIES_CLASS)
+ public void setCapabilitiesClass(String arg0) {
+ this.capabilitiesClass = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=IMMUTABLE, description="Is Immutable, True if the source never changes.",mandatory=true, defaultValue="false")
+ public boolean isImmutable() {
+ return immutable;
+ }
+
+ @XmlElement(name = IMMUTABLE)
+ public void setImmutable(boolean arg0) {
+ this.immutable = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=EXCEPTION_ON_MAX_ROWS, description="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",mandatory=true)
+ public boolean isExceptionOnMaxRows() {
+ return exceptionOnMaxRows;
+ }
+
+ @XmlElement(name = EXCEPTION_ON_MAX_ROWS)
+ public void setExceptionOnMaxRows(boolean arg0) {
+ this.exceptionOnMaxRows = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=MAX_RESULT_ROWS, description="Maximum Result Rows allowed", mandatory=true)
+ public int getMaxResultRows() {
+ return maxResultRows;
+ }
+
+ @XmlElement(name = MAX_RESULT_ROWS)
+ public void setMaxResultRows(int arg0) {
+ this.maxResultRows = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=XA_CAPABLE, description="True, if this connector supports XA Transactions")
+ public boolean isXaCapable() {
+ return xaCapable;
+ }
+
+ @XmlElement(name=XA_CAPABLE)
+ public void setXaCapable(boolean arg0) {
+ this.xaCapable = arg0;
+ }
+
+ @Override
+ @ManagementProperty(name=OVERRIDE_CAPABILITIES_FILE, description="Property file that defines the override capability properties")
+ public String getOverrideCapabilitiesFile() {
+ return this.overrideCapabilitiesFile;
+ }
+
+ @XmlElement(name = OVERRIDE_CAPABILITIES_FILE)
+ public void setOverrideCapabilitiesFile(String propsFile) {
+ this.overrideCapabilitiesFile = propsFile;
+ }
+
+ @Override
+ @XmlElement(name = "translator-property", type = PropertyMetadata.class)
+ @ManagementProperty(description = "Translator Properties", managed=true)
+ public List<PropertyMetadata> getJAXBProperties(){
+ return super.getJAXBProperties();
+ }
+
+ public String toString() {
+ return getName();
+ }
+}
Property changes on: trunk/client/src/main/java/org/teiid/adminapi/impl/TranslatorMetaData.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/client/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -198,7 +198,7 @@
return false;
}
for (String sourceName:resourceNames) {
- if (m.getSourceJndiName(sourceName) == null) {
+ if (m.getSourceConnectionJndiName(sourceName) == null) {
return false;
}
}
Modified: trunk/client/src/main/resources/vdb-deployer.xsd
===================================================================
--- trunk/client/src/main/resources/vdb-deployer.xsd 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/main/resources/vdb-deployer.xsd 2010-05-07 16:24:50 UTC (rev 2103)
@@ -16,7 +16,8 @@
<xs:element name="source" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
- <xs:attribute name="jndi-name" type="xs:string"/>
+ <xs:attribute name="translator-name" type="xs:string" use="required"/>
+ <xs:attribute name="connection-jndi-name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="validation-error" minOccurs="0" maxOccurs="unbounded">
Added: trunk/client/src/test/java/org/teiid/adminapi/impl/TestTranslatorMetadata.java
===================================================================
--- trunk/client/src/test/java/org/teiid/adminapi/impl/TestTranslatorMetadata.java (rev 0)
+++ trunk/client/src/test/java/org/teiid/adminapi/impl/TestTranslatorMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,52 @@
+/*
+ * 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.adminapi.impl;
+
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+
+import org.junit.Test;
+
+ at SuppressWarnings("nls")
+public class TestTranslatorMetadata {
+
+ @Test
+ public void testFormat() throws Exception {
+ TranslatorMetaData tm = new TranslatorMetaData();
+
+ tm.setExecutionFactoryClass("org.teiid.resource.adapter.jdbc.JDBCExecutionFactory");
+ tm.setXaCapable(true);
+ tm.setName("Oracle");
+ tm.addProperty("ExtensionTranslationClassName", "org.teiid.translator.jdbc.oracle.OracleSQLTranslator");
+
+ JAXBContext jc = JAXBContext.newInstance(new Class<?>[] {TranslatorMetaData.class});
+ Marshaller marshell = jc.createMarshaller();
+ marshell.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,new Boolean(true));
+
+ StringWriter sw = new StringWriter();
+ marshell.marshal(tm, sw);
+
+ System.out.println(sw.toString());
+ }
+}
Property changes on: trunk/client/src/test/java/org/teiid/adminapi/impl/TestTranslatorMetadata.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/client/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java
===================================================================
--- trunk/client/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/client/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -54,7 +54,7 @@
ModelMetaData modelOne = new ModelMetaData();
modelOne.setName("model-one"); //$NON-NLS-1$
- modelOne.addSourceMapping("s1", "java:mybinding"); //$NON-NLS-1$ //$NON-NLS-2$
+ modelOne.addSourceMapping("s1", "translator", "java:mybinding"); //$NON-NLS-1$ //$NON-NLS-2$
modelOne.setModelType(Model.Type.PHYSICAL); //$NON-NLS-1$
modelOne.addProperty("model-prop", "model-value"); //$NON-NLS-1$ //$NON-NLS-2$
modelOne.addProperty("model-prop", "model-value-override"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -66,8 +66,8 @@
ModelMetaData modelTwo = new ModelMetaData();
modelTwo.setName("model-two"); //$NON-NLS-1$
- modelTwo.addSourceMapping("s1", "java:binding-one"); //$NON-NLS-1$ //$NON-NLS-2$
- modelTwo.addSourceMapping("s2", "java:binding-two"); //$NON-NLS-1$ //$NON-NLS-2$
+ modelTwo.addSourceMapping("s1", "translator", "java:binding-one"); //$NON-NLS-1$ //$NON-NLS-2$
+ modelTwo.addSourceMapping("s2", "translator", "java:binding-two"); //$NON-NLS-1$ //$NON-NLS-2$
modelTwo.setModelType(Model.Type.VIRTUAL); //$NON-NLS-1$
modelTwo.addProperty("model-prop", "model-value"); //$NON-NLS-1$ //$NON-NLS-2$
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/CacheScope.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/CacheScope.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/CacheScope.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,46 +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.connector.api;
-
-import java.io.Serializable;
-
-/**
- * Cache Scope
- *
- * REQUEST - Items placed in this scope are retained until the end of the top level request. The items to be placed
- * does not need to implement {@link Serializable}, however recommended. These items are not replicated across the cluster.
- * SERVICE - Items from this scope are available to the identified connector
- *
- * All the items placed in the below scopes must be {@link Serializable}, as they are replicated across cluster.
- *
- * SESSION - Items placed in the scope retained until the particular User's session of top level request is alive.
- * VDB - Items placed with this scope retained until the life of the VDB;
- *
- * GLOBAL - Items placed in this will available to all until the Query Service is recycled.
- */
-public enum CacheScope {
- REQUEST,
- SERVICE,
- SESSION,
- VDB,
- GLOBAL;
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/Connection.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/Connection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/Connection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,79 +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.connector.api;
-
-import javax.resource.spi.LocalTransaction;
-import javax.transaction.xa.XAResource;
-
-import org.teiid.connector.language.Command;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-/**
- * <p>Represents a connection to this connector. A connection will be obtained
- * from the connector for every query that is executed, then closed after the query has completed.
- * </p>
- */
-public interface Connection {
-
- /**
- * Get the capabilities of this connector. The capabilities affect what kinds of
- * queries (and other commands) will be sent to the connector.
- * @return Connector capabilities, may return null if the Connector returns globally scoped capabilities {@link Connector#getCapabilities()}
- */
- ConnectorCapabilities getCapabilities() throws ConnectorException;
-
- /**
- * Create an execution object for the specified command
- * @param command the command
- * @param executionContext Provides information about the context that this command is
- * executing within, such as the identifiers for the command being executed
- * @param metadata Access to runtime metadata if needed to translate the command
- * @return An execution object that can use to execute the command
- */
- Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata ) throws ConnectorException;
-
- /**
- * Release the connection. This will be called when system has completed
- * using the connection for an execution.
- */
- void close() throws ConnectorException;
-
- /**
- * Called to determine whether the connection is open
- * @return true if open, false if there is a source error.
- */
- boolean isAlive() throws ConnectorException;
-
- /**
- * Get the local transaction for the connector.
- * @return null if local transactions are not supported
- */
- LocalTransaction getLocalTransaction() throws ConnectorException;
-
- /**
- * If Connector supports participating in XA Connections, return the XAResurce associated with this connection.
- * @return null if not supported
- */
- XAResource getXAResource() throws ConnectorException;
-}
-
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectionContext.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectionContext.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectionContext.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,44 +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.connector.api;
-
-import javax.security.auth.Subject;
-
-/**
- * Thread local class to access the Subject in the Connector code. This is set just before the
- * connector connection is created.
- */
-public class ConnectionContext {
- private static ThreadLocal<Subject> SUBJECT = new ThreadLocal<Subject>() {
- protected Subject initialValue() {
- return null;
- }
- };
-
- public static Subject getSubject() {
- return SUBJECT.get();
- }
-
- public static void setSubject(Subject subject) {
- SUBJECT.set(subject);
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/Connector.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/Connector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/Connector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,70 +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.connector.api;
-
-import javax.security.auth.Subject;
-
-
-/**
- * <p>The primary entry point for a Connector. This interface should be implemented
- * by the connector writer.</p>
- *
- * <p>The JCA Container will instantiate the implementation of this class. Once the class has been
- * instantiated, the {@link #initialize(ConnectorEnvironment)} method will be called
- * with all necessary connector properties. </p>
- */
-public interface Connector {
-
- /**
- * Initialize the connector with supplied configuration
- * @param config
- */
- void initialize(ConnectorEnvironment config) throws ConnectorException;
-
- /**
- * Obtain a connection with the connector. The connection typically is associated
- * with a particular security context. The connection is assumed to be pooled by container
- * if pooling is necessary - the connection will be closed when execution has completed against it.
- *
- * If you need to authenticate/authorize and need to get access to {{@link Subject}, then use
- * {@link ConnectionContext}
- *
- * @return A Connection, created by the Connector
- * @throws ConnectorException If an error occurred obtaining a connection
- */
- Connection getConnection() throws ConnectorException;
-
- /**
- * Get the capabilities of this connector. The capabilities affect what kinds of
- * queries (and other commands) will be sent to the connector.
- * @return ConnectorCapabilities, may return null if the Connector provides User scoped capabilities {@link Connection#getCapabilities()}
- */
- ConnectorCapabilities getCapabilities() throws ConnectorException;
-
- /**
- * Get the ConnectorEnvironment that this connector is initialized with.
- * @return
- * @throws ConnectorException
- */
- ConnectorEnvironment getConnectorEnvironment();
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,394 +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.connector.api;
-
-import java.util.List;
-
-import org.teiid.connector.language.BatchedUpdates;
-import org.teiid.connector.language.SetQuery;
-
-
-/**
- * Allows a connector to specify the capabilities that a connector
- * supports.
- */
-public interface ConnectorCapabilities {
-
- public enum SupportedJoinCriteria {
- /**
- * Indicates that any supported criteria is allowed.
- */
- ANY,
- /**
- * Indicates that any simple comparison of elements is allowed.
- */
- THETA,
- /**
- * Indicates that only equality predicates of elements are allowed.
- */
- EQUI,
- /**
- * Indicates that only equality predicates between
- * exactly one primary and foreign key is allowed per join.
- */
- KEY
- }
-
- /**
- * Support indicates connector can accept queries with SELECT DISTINCT
- * @since 3.1 SP2
- */
- boolean supportsSelectDistinct();
-
- /**
- * Support indicates connector can accept expressions other than element
- * symbols in the SELECT clause. Specific supports for the expression
- * type are still checked.
- * @since 6.1.0
- */
- boolean supportsSelectExpression();
-
- /**
- * Support indicates connector can accept groups with aliases
- * @since 3.1 SP2
- */
- boolean supportsAliasedGroup();
-
- /**
- * Get the supported join criteria. A null return value will be treated
- * as {@link SupportedJoinCriteria#ANY}
- * @since 6.1.0
- */
- SupportedJoinCriteria getSupportedJoinCriteria();
-
- /**
- * Support indicates connector can accept inner or cross joins
- * @since 6.1.0
- */
- boolean supportsInnerJoins();
-
- /**
- * Support indicates connector can accept self-joins where a
- * group is joined to itself with aliases. Connector must also support
- * {@link #supportsAliasedGroup()}.
- * @since 3.1 SP2
- */
- boolean supportsSelfJoins();
-
- /**
- * Support indicates connector can accept left outer joins
- * @since 3.1 SP2
- */
- boolean supportsOuterJoins();
-
- /**
- * Support indicates connector can accept full outer joins
- * @since 3.1 SP2
- */
- boolean supportsFullOuterJoins();
-
- /**
- * Support indicates connector can accept inline views (subqueries
- * in the FROM clause).
- * @since 4.1
- */
- boolean supportsInlineViews();
-
- /**
- * Support indicates connector accepts criteria of form (element BETWEEN constant AND constant)
- * <br>NOT CURRENTLY USED - between is rewritten as compound compare criteria
- * @since 4.0
- */
- boolean supportsBetweenCriteria();
-
- /**
- * Support indicates connector accepts criteria of form (element = constant)
- * @since 3.1 SP2
- */
- boolean supportsCompareCriteriaEquals();
-
- /**
- * Support indicates connector accepts criteria of form (element <=|>= constant)
- * <br>The query engine will may pushdown queries containing < or > if NOT is also
- * supported.
- * @since 3.1 SP2
- */
- boolean supportsCompareCriteriaOrdered();
-
- /**
- * Support indicates connector accepts criteria of form (element LIKE constant)
- * @since 3.1 SP2
- */
- boolean supportsLikeCriteria();
-
- /**
- * Support indicates connector accepts criteria of form (element LIKE constant ESCAPE char)
- * @since 3.1 SP2
- */
- boolean supportsLikeCriteriaEscapeCharacter();
-
- /**
- * Support indicates connector accepts criteria of form (element IN set)
- * @since 3.1 SP2
- */
- boolean supportsInCriteria();
-
- /**
- * Support indicates connector accepts IN criteria with a subquery on the right side
- * @since 4.0
- */
- boolean supportsInCriteriaSubquery();
-
- /**
- * Support indicates connector accepts criteria of form (element IS NULL)
- * @since 3.1 SP2
- */
- boolean supportsIsNullCriteria();
-
- /**
- * Support indicates connector accepts logical criteria connected by OR
- * @since 3.1 SP2
- */
- boolean supportsOrCriteria();
-
- /**
- * Support indicates connector accepts logical criteria NOT
- * @since 3.1 SP2
- */
- boolean supportsNotCriteria();
-
- /**
- * Support indicates connector accepts the EXISTS criteria
- * @since 4.0
- */
- boolean supportsExistsCriteria();
-
- /**
- * Support indicates connector accepts the quantified comparison criteria that
- * use SOME
- * @since 4.0
- */
- boolean supportsQuantifiedCompareCriteriaSome();
-
- /**
- * Support indicates connector accepts the quantified comparison criteria that
- * use ALL
- * @since 4.0
- */
- boolean supportsQuantifiedCompareCriteriaAll();
-
- /**
- * Support indicates connector accepts ORDER BY clause, including multiple elements
- * and ascending and descending sorts.
- * @since 3.1 SP2
- */
- boolean supportsOrderBy();
-
- /**
- * Support indicates connector accepts ORDER BY clause with columns not from the select
- * @since 6.2
- * @return
- */
- boolean supportsOrderByUnrelated();
-
- /**
- * Whether the source supports an explicit GROUP BY clause
- * @since 6.1
- */
- boolean supportsGroupBy();
-
- /**
- * Whether the source supports the HAVING clause
- * @since 6.1
- */
- boolean supportsHaving();
-
- /**
- * Support indicates connector can accept the SUM aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesSum();
-
- /**
- * Support indicates connector can accept the AVG aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesAvg();
-
- /**
- * Support indicates connector can accept the MIN aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesMin();
-
- /**
- * Support indicates connector can accept the MAX aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesMax();
-
- /**
- * Support indicates connector can accept the COUNT aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesCount();
-
- /**
- * Support indicates connector can accept the COUNT(*) aggregate function
- * @since 3.1 SP2
- */
- boolean supportsAggregatesCountStar();
-
- /**
- * Support indicates connector can accept DISTINCT within aggregate functions
- * @since 3.1 SP2
- */
- boolean supportsAggregatesDistinct();
-
- /**
- * Support indicates connector can accept scalar subqueries in the SELECT, WHERE, and
- * HAVING clauses
- * @since 4.0
- */
- boolean supportsScalarSubqueries();
-
- /**
- * Support indicates connector can accept correlated subqueries wherever subqueries
- * are accepted
- * @since 4.0
- */
- boolean supportsCorrelatedSubqueries();
-
- /**
- * Support indicates connector can accept queries with non-searched
- * CASE <expression> WHEN <expression> ... END
- * <br>NOT CURRENTLY USED - case is pushed down as searched case
- * @since 4.0
- */
- boolean supportsCaseExpressions();
-
- /**
- * Support indicates connector can accept queries with searched CASE WHEN <criteria> ... END
- * @since 4.0
- */
- boolean supportsSearchedCaseExpressions();
-
- /**
- * Support indicates that the connector supports the UNION of two queries.
- * @since 4.2
- */
- boolean supportsUnions();
-
- /**
- * Support indicates that the connector supports an ORDER BY on a SetQuery.
- * @since 5.6
- */
- boolean supportsSetQueryOrderBy();
-
- /**
- * Support indicates that the connector supports the INTERSECT of two queries.
- * @since 5.6
- */
- boolean supportsIntersect();
-
- /**
- * Support indicates that the connector supports the EXCEPT of two queries.
- * @since 5.6
- */
- boolean supportsExcept();
-
- /**
- * Get list of all supported function names. Arithmetic functions have names like
- * "+".
- * @since 3.1 SP3
- */
- List<String> getSupportedFunctions();
-
- /**
- * Get the integer value representing the number of values allowed in an IN criteria
- * in the WHERE clause of a query
- * @since 5.0
- */
- int getMaxInCriteriaSize();
-
- /**
- * <p>Support indicates that the connector supports functions in GROUP BY, such as:
- * <code>SELECT dayofmonth(theDate), COUNT(*) FROM table GROUP BY dayofmonth(theDate)</code></p>
- *
- * <br>NOT CURRENTLY USED - group by expressions create an inline view for pushdown
- * @since 5.0
- */
- boolean supportsFunctionsInGroupBy();
-
- /**
- * Gets whether the connector can limit the number of rows returned by a query.
- * @since 5.0 SP1
- */
- boolean supportsRowLimit();
-
- /**
- * Gets whether the connector supports a SQL clause (similar to the LIMIT with an offset) that can return
- * result sets that start in the middle of the resulting rows returned by a query
- * @since 5.0 SP1
- */
- boolean supportsRowOffset();
-
- /**
- * The number of groups supported in the from clause. Added for a Sybase limitation.
- * @since 5.6
- * @return the number of groups supported in the from clause, or -1 if there is no limit
- */
- int getMaxFromGroups();
-
- /**
- * Whether the source prefers to use ANSI style joins.
- * @since 6.0
- */
- boolean useAnsiJoin();
-
- /**
- * Whether the source supports queries without criteria.
- * @since 6.0
- */
- boolean requiresCriteria();
-
- /**
- * Whether the source supports {@link BatchedUpdates}
- * @since 6.0
- */
- boolean supportsBatchedUpdates();
-
- /**
- * Whether the source supports updates with multiple value sets
- * @since 6.0
- */
- boolean supportsBulkUpdate();
-
- /**
- * Support indicates that the connector can accept INSERTs with
- * values specified by an {@link SetQuery}.
- * @since 6.1
- */
- boolean supportsInsertWithQueryExpression();
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorEnvironment.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorEnvironment.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorEnvironment.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,92 +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.connector.api;
-
-import java.util.Properties;
-
-import org.teiid.connector.language.LanguageFactory;
-
-
-/**
- * The environment provided to a connector by the Connector Manager. The
- * environment provides access to external resources the Connector writer may
- * need.
- */
-public interface ConnectorEnvironment {
-
- /**
- * Capabilities Class Name
- * @return
- */
- public String getCapabilitiesClass();
-
- /**
- * Defines if the Connector is read-only connector
- * @return
- */
- public boolean isImmutable();
-
- /**
- * Throw exception if there are more rows in the result set than specified in the MaxResultRows setting.
- * @return
- */
- public boolean isExceptionOnMaxRows();
-
- /**
- * Maximum result set rows to fetch
- * @return
- */
- public int getMaxResultRows();
-
- /**
- * Shows the XA transaction capability of the Connector.
- * @return
- */
- public boolean isXaCapable();
-
- /**
- * Obtain a reference to the logger that can be used to add messages to the
- * log files for debugging and error recovery.
- * @return The {@link ConnectorLogger}
- */
- ConnectorLogger getLogger();
-
- /**
- * Obtain a reference to the default LanguageFactory that can be used to construct
- * new language interface objects. This is typically needed when modifying the language
- * objects passed to the connector or for testing when objects need to be created.
- */
- LanguageFactory getLanguageFactory();
-
- /**
- * Obtain a reference to the type facility, which can be used to perform many type
- * conversions supplied by the Connector API.
- */
- TypeFacility getTypeFacility();
-
- /**
- * Get the Override capabilities for the connector
- * @return
- */
- Properties getOverrideCapabilities() throws ConnectorException;
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorException.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorException.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,79 +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.connector.api;
-
-import javax.resource.ResourceException;
-
-/**
- * An exception the connector writer can return in case of an
- * error while using the connector.
- */
-public class ConnectorException extends ResourceException{
-
- private static final long serialVersionUID = -5980862789340592219L;
-
- /**
- * No-arg constructor required by Externalizable semantics.
- */
- public ConnectorException() {
- super();
- }
-
- /**
- * Construct an instance with the message specified.
- *
- * @param message A message describing the exception
- */
- public ConnectorException( String message ) {
- super( message );
- }
-
- public ConnectorException( String errorCode, String message ) {
- super( message, errorCode);
- }
-
- public ConnectorException( int errorCode, String message ) {
- super(message, Integer.toString(errorCode));
- }
-
-
- /**
- * Construct an instance from a message and an exception to chain to this one.
- *
- * @param code A code denoting the exception
- * @param e An exception to nest within this one
- */
- public ConnectorException( Throwable e, String message ) {
- super(message,e);
- }
-
- /**
- * Construct an instance with a linked exception specified.
- *
- * @param e An exception to chain to this exception
- */
- public ConnectorException( Throwable e ) {
- super( e );
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorLogger.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorLogger.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorLogger.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,117 +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.connector.api;
-
-/**
- * Provide access to write messages to the logs.
- */
-public interface ConnectorLogger {
-
- /**
- * Log an error message.
- * @param message The message
- */
- void logError( String message );
-
- /**
- * Log an error message with an error, which may allow the stack
- * trace for the error to be logged, depending on the log configuration.
- * @param message The message
- * @param error The error
- */
- void logError( String message, Throwable error );
-
- /**
- * Log a warning message.
- * @param message The message
- */
- void logWarning( String message );
-
- /**
- * Log a warning message.
- * @param message The message
- */
- void logWarning( String message, Throwable error );
-
- /**
- * Log an informational message.
- * @param message The message
- */
- void logInfo( String message );
-
- /**
- * Log an informational message.
- * @param message The message
- */
- void logInfo( String message, Throwable error);
-
- /**
- * Log a detail debugging message.
- * @param message The message
- */
- void logDetail( String message );
-
- /**
- * Log a detail debugging message.
- * @param message The message
- */
- void logDetail( String message, Throwable error );
-
- /**
- * Log a trace debugging message.
- * @param message The message
- */
- void logTrace( String message );
-
- /**
- * Log a trace debugging message.
- * @param message The message
- */
- void logTrace( String message, Throwable error );
-
- /**
- * @return true if error logging is enabled
- */
- boolean isErrorEnabled();
-
- /**
- * @return true if warning logging is enabled
- */
- boolean isWarningEnabled();
-
- /**
- * @return true if info logging is enabled
- */
- boolean isInfoEnabled();
-
- /**
- * @return true if detail logging is enabled
- */
- boolean isDetailEnabled();
-
- /**
- * @return true if trace logging is enabled
- */
- boolean isTraceEnabled();
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/DataNotAvailableException.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/DataNotAvailableException.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/DataNotAvailableException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,47 +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.connector.api;
-
-import com.metamatrix.core.MetaMatrixRuntimeException;
-
-/**
- * Used by asynch connectors to indicate data is not available
- * and results should be polled for after the given delay.
- */
-public class DataNotAvailableException extends MetaMatrixRuntimeException {
-
- private static final long serialVersionUID = 5569111182915674334L;
-
- private long retryDelay = 0;
-
- public DataNotAvailableException() {
- }
-
- public DataNotAvailableException(long retryDelay) {
- this.retryDelay = retryDelay;
- }
-
- public long getRetryDelay() {
- return retryDelay;
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/Execution.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/Execution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/Execution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,53 +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.connector.api;
-
-/**
- * An execution represents the state and lifecycle for a particular
- * command execution. The methods provided on this interface define
- * standard lifecycle methods.
- * When execution completes, the {@link #close()} will be called. If
- * execution must be aborted, due to user or administrator action, the
- * {@link #cancel()} will be called.
- */
-public interface Execution {
-
- /**
- * Terminates the execution normally.
- */
- void close() throws ConnectorException;
-
- /**
- * Cancels the execution abnormally. This will happen via
- * a different thread from the one performing the execution, so
- * should be expected to happen in a multi-threaded scenario.
- */
- void cancel() throws ConnectorException;
-
- /**
- * Execute the associated command. Results will be retrieved through a specific sub-interface call.
- * @throws ConnectorException
- */
- void execute() throws ConnectorException;
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ExecutionContext.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ExecutionContext.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ExecutionContext.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,166 +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.connector.api;
-
-import java.io.Serializable;
-
-import javax.security.auth.Subject;
-
-
-/**
- * The security context provides information about the user context in which
- * this query is being run.
- *
- * As of 4.2, the SecurityContext is a sub-interface of ExecutionContext such
- * that both interfaces contain all of the methods from the prior independent
- * interfaces. Thus, these interfaces can now be used interchangeably.
- *
- */
-public interface ExecutionContext {
-
- /**
- * Get the identifier for the current connector running the command
- * @return Connector identifier; never null
- */
- String getConnectorIdentifier();
-
- /**
- * Get the identifier for the command being executed. This can be
- * correlated back to identifiers exposed in other parts of the system.
- * @return command identifier
- */
- String getRequestIdentifier();
-
- /**
- * This specifies the node id for the atomic request in the relational plan of query.
- * when combined with the request identifier, uniquely identifies a command sent to a connector.
- */
- String getPartIdentifier();
-
- /**
- * Execution count defines an id; where every access to the connector from
- * the server in a given command execution boundary is uniquely defined;
- * Like for example in the case of "batched execution" of commands, each execution of
- * command gets new identifier.
- */
- String getExecutionCountIdentifier();
-
- /**
- * Get the name of the VDB this query is being run against.
- * @return VDB name, never null
- */
- String getVirtualDatabaseName();
-
- /**
- * Get the version of the VDB this query is being run against.
- * @return VDB version, never null
- */
- int getVirtualDatabaseVersion();
-
- /**
- * Get the user for the user running this query.
- * @return User, never null
- */
- Subject getSubject();
-
- /**
- * Get the trusted payload passed when the user statement was executed.
- * Teiid has no knowledge about what the payload contains - it is merely
- * passed through the system. It is most often used to pass security
- * information such as credentials.
- *
- * <p>Given that the Execution Payload is not authenticated by the Teiid
- * system, connector writers are responsible for ensuring its validity. </p>
- *
- * @return Trusted execution payload if one exists, otherwise null
- * @since 4.2
- */
- Serializable getExecutionPayload();
-
- /**
- * Get the identifier for the connection through which
- * the command is being executed. This represents the original JDBC user
- * connection to the Teiid system
- * @return Connection identifier
- */
- String getConnectionIdentifier();
-
- /**
- * When the execution is turned on with "alive=true", the execution object will not
- * be implicitly closed at the end of the last batch. It will only be closed at end
- * of the user query. This is useful in keeping the connection open for
- * LOB (clob/blob/xml) streaming.
- * @param alive
- */
- void keepExecutionAlive(boolean alive);
-
- /**
- * Return the current connector batch size. This may be used as a hint to the underlying source query.
- * @return the Connector batch size.
- */
- int getBatchSize();
-
- /**
- * Add an exception as a warning to this Execution.
- * @param ex
- */
- void addWarning(Exception ex);
-
- /**
- * Flag indicates that the operation needs to be executed in a XA transaction.
- * @return
- */
- boolean isTransactional();
-
- /**
- * Get a item that has been placed previously from cache. If no such object then a null will be returned.
- * The item is placed in {@link CacheScope.REQUEST} scope.
- * @param key
- * @return
- */
- Object get(Object key);
-
- /**
- * Place a item in the Cache in {@link CacheScope.REQUEST} scope.
- * @param key
- * @param value
- */
- void put(Object key, Object value);
-
- /**
- * Get a item that has been placed previously from cache. If no such object then a null will be returned. The item looked
- * up in the specified scope.
- * @param scope
- * @param key
- * @return
- */
- Object getFromCache(CacheScope scope, Object key);
-
- /**
- * Place a item in the Cache in the given scope.
- * @param scope
- * @param key
- * @param value
- */
- void storeInCache(CacheScope scope, Object key, Object value);
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/MetadataProvider.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/MetadataProvider.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/MetadataProvider.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,31 +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.connector.api;
-
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-
-public interface MetadataProvider {
-
- void getConnectorMetadata(MetadataFactory metadataFactory) throws ConnectorException;
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ProcedureExecution.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ProcedureExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,44 +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.connector.api;
-
-import java.util.List;
-
-import org.teiid.connector.language.Call;
-
-/**
- * The procedure execution represents the case where a connector can execute a
- * {@link Call}. The output may include 0 or more output parameters and
- * optionally a result set.
- */
-public interface ProcedureExecution extends ResultSetExecution {
-
- /**
- * Get the output parameter values. Results should place the return parameter
- * first if it is present, then the IN/OUT and OUT parameters should follow in
- * the order they appeared in the command.
- * @throws ConnectorException If an error occurs while retrieving the output value
- */
- List<?> getOutputParameterValues() throws ConnectorException;
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/ResultSetExecution.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ResultSetExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ResultSetExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,45 +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.connector.api;
-
-import java.util.List;
-
-import org.teiid.connector.language.Call;
-import org.teiid.connector.language.QueryExpression;
-
-/**
- * Defines an execution for {@link QueryExpression}s and {@link Call}s that
- * returns a resultset, which is represented through the iterator method
- * {@link #next()}.
- */
-public interface ResultSetExecution extends Execution {
-
- /**
- * Retrieves the next row of the resultset.
- * @return the next row or null indicating that there are no more results
- * @throws ConnectorException
- * @throws DataNotAvailableException
- */
- List<?> next() throws ConnectorException, DataNotAvailableException;
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/TypeFacility.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/TypeFacility.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/TypeFacility.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,123 +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.connector.api;
-
-import java.util.Calendar;
-import java.util.TimeZone;
-
-import com.metamatrix.common.types.DataTypeManager;
-import com.metamatrix.common.types.JDBCSQLTypeInfo;
-
-/**
- */
-public abstract class TypeFacility {
-
- public interface RUNTIME_TYPES {
- public static final Class STRING = DataTypeManager.DefaultDataClasses.STRING;
- public static final Class BOOLEAN = DataTypeManager.DefaultDataClasses.BOOLEAN;
- public static final Class BYTE = DataTypeManager.DefaultDataClasses.BYTE;
- public static final Class SHORT = DataTypeManager.DefaultDataClasses.SHORT;
- public static final Class CHAR = DataTypeManager.DefaultDataClasses.CHAR;
- public static final Class INTEGER = DataTypeManager.DefaultDataClasses.INTEGER;
- public static final Class LONG = DataTypeManager.DefaultDataClasses.LONG;
- public static final Class BIG_INTEGER = DataTypeManager.DefaultDataClasses.BIG_INTEGER;
- public static final Class FLOAT = DataTypeManager.DefaultDataClasses.FLOAT;
- public static final Class DOUBLE = DataTypeManager.DefaultDataClasses.DOUBLE;
- public static final Class BIG_DECIMAL = DataTypeManager.DefaultDataClasses.BIG_DECIMAL;
- public static final Class DATE = DataTypeManager.DefaultDataClasses.DATE;
- public static final Class TIME = DataTypeManager.DefaultDataClasses.TIME;
- public static final Class TIMESTAMP = DataTypeManager.DefaultDataClasses.TIMESTAMP;
- public static final Class OBJECT = DataTypeManager.DefaultDataClasses.OBJECT;
- public static final Class BLOB = DataTypeManager.DefaultDataClasses.BLOB;
- public static final Class CLOB = DataTypeManager.DefaultDataClasses.CLOB;
- public static final Class XML = DataTypeManager.DefaultDataClasses.XML;
- }
-
- public static final class RUNTIME_NAMES {
- public static final String STRING = DataTypeManager.DefaultDataTypes.STRING;
- public static final String BOOLEAN = DataTypeManager.DefaultDataTypes.BOOLEAN;
- public static final String BYTE = DataTypeManager.DefaultDataTypes.BYTE;
- public static final String SHORT = DataTypeManager.DefaultDataTypes.SHORT;
- public static final String CHAR = DataTypeManager.DefaultDataTypes.CHAR;
- public static final String INTEGER = DataTypeManager.DefaultDataTypes.INTEGER;
- public static final String LONG = DataTypeManager.DefaultDataTypes.LONG;
- public static final String BIG_INTEGER = DataTypeManager.DefaultDataTypes.BIG_INTEGER;
- public static final String FLOAT = DataTypeManager.DefaultDataTypes.FLOAT;
- public static final String DOUBLE = DataTypeManager.DefaultDataTypes.DOUBLE;
- public static final String BIG_DECIMAL = DataTypeManager.DefaultDataTypes.BIG_DECIMAL;
- public static final String DATE = DataTypeManager.DefaultDataTypes.DATE;
- public static final String TIME = DataTypeManager.DefaultDataTypes.TIME;
- public static final String TIMESTAMP = DataTypeManager.DefaultDataTypes.TIMESTAMP;
- public static final String OBJECT = DataTypeManager.DefaultDataTypes.OBJECT;
- public static final String NULL = DataTypeManager.DefaultDataTypes.NULL;
- public static final String BLOB = DataTypeManager.DefaultDataTypes.BLOB;
- public static final String CLOB = DataTypeManager.DefaultDataTypes.CLOB;
- public static final String XML = DataTypeManager.DefaultDataTypes.XML;
- }
-
- /**
- * Get the Class constant for the given String type name
- */
- public static Class<?> getDataTypeClass(String type) {
- return DataTypeManager.getDataTypeClass(type);
- }
-
- /**
- * Get the String constant for the given type class
- */
- public static String getDataTypeName(Class<?> type) {
- return DataTypeManager.getDataTypeName(type);
- }
-
- /**
- * Get the SQL type for the given runtime type Class constant
- * @param type
- * @return
- */
- public static final int getSQLTypeFromRuntimeType(Class<?> type) {
- return JDBCSQLTypeInfo.getSQLTypeFromRuntimeType(type);
- }
-
- public static final String getDataTypeNameFromSQLType(int sqlType) {
- return JDBCSQLTypeInfo.getTypeName(sqlType);
- }
-
- /**
- * Convert the given value to the closest runtime type see {@link RUNTIME_TYPES}
- * @param value
- * @return
- */
- public abstract Object convertToRuntimeType(Object value);
-
- /**
- * Convert the given date to a target type, optionally adjusting its display
- * for a given target Calendar.
- * @param date
- * @param initial
- * @param target
- * @param targetType
- * @return
- */
- public abstract Object convertDate(java.util.Date date, TimeZone initial, Calendar target, Class targetType);
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/api/UpdateExecution.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/UpdateExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/UpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,45 +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.connector.api;
-
-import org.teiid.connector.language.BatchedUpdates;
-import org.teiid.connector.language.Delete;
-import org.teiid.connector.language.Insert;
-import org.teiid.connector.language.Update;
-
-
-/**
- * The update execution represents the case where a connector can
- * execute an {@link Insert}, {@link Update}, {@link Delete}, or {@link BatchedUpdates} command.
- */
-public interface UpdateExecution extends Execution {
-
- /**
- * Returns the update counts for the execution.
- * @return the update counts corresponding to the command executed
- * @throws DataNotAvailableException
- * @throws ConnectorException
- */
- int[] getUpdateCounts() throws DataNotAvailableException, ConnectorException;
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnection.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,96 +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.connector.basic;
-
-import javax.resource.spi.LocalTransaction;
-import javax.transaction.xa.XAResource;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.Execution;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-/**
- * Provides a default implementation of a {@link PoolAwareConnection} for a Connector
- * that supports global capabilities. Extensions of this class should implement
- * {@link #createProcedureExecution(Call, ExecutionContext, RuntimeMetadata)}
- * {@link #createResultSetExecution(Call, ExecutionContext, RuntimeMetadata)}
- * {@link #createUpdateExecution(Call, ExecutionContext, RuntimeMetadata)}
- * as necessary.
- */
-public abstract class BasicConnection implements Connection {
-
-
- @Override
- public Execution createExecution(Command command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- if (command instanceof QueryExpression) {
- return createResultSetExecution((QueryExpression)command, executionContext, metadata);
- }
- if (command instanceof Call) {
- return createProcedureExecution((Call)command, executionContext, metadata);
- }
- return createUpdateExecution(command, executionContext, metadata);
- }
-
- public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata) throws ConnectorException {
- throw new ConnectorException("Unsupported Execution");
- }
-
- public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata) throws ConnectorException {
- throw new ConnectorException("Unsupported Execution");
- }
-
- public UpdateExecution createUpdateExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata) throws ConnectorException {
- throw new ConnectorException("Unsupported Execution");
- }
-
- @Override
- public boolean isAlive() {
- return true;
- }
-
- @Override
- public ConnectorCapabilities getCapabilities() {
- return null;
- }
-
- @Override
- public LocalTransaction getLocalTransaction() {
- return null;
- }
-
- @Override
- public XAResource getXAResource() throws ConnectorException {
- return null;
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnector.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,36 +0,0 @@
-package org.teiid.connector.basic;
-
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-
-public abstract class BasicConnector implements Connector {
-
- protected ConnectorEnvironment config;
- protected ConnectorCapabilities capabilities;
-
- @Override
- public void initialize(ConnectorEnvironment config) throws ConnectorException {
- this.config = config;
- }
-
- @Override
- public ConnectorEnvironment getConnectorEnvironment(){
- return this.config;
- }
-
- public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
- return BasicConnectorCapabilities.class;
- }
-
- @Override
- public ConnectorCapabilities getCapabilities() throws ConnectorException {
- if (capabilities == null) {
- // create Capabilities
- capabilities = BasicManagedConnectionFactory.getInstance(ConnectorCapabilities.class, this.config.getCapabilitiesClass(), null, getDefaultCapabilities());
- }
- return capabilities;
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,380 +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.connector.basic;
-
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorCapabilities;
-
-
-/**
- * This class is a base implementation of the ConnectorCapabilities interface.
- * It is implemented to return false for all capabilities. Subclass this base
- * class and override any methods necessary to specify capabilities the
- * connector actually supports.
- */
-public class BasicConnectorCapabilities implements ConnectorCapabilities {
-
- /**
- * Construct the basic capabilities class.
- */
- public BasicConnectorCapabilities() {
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelectDistinct()
- */
- public boolean supportsSelectDistinct() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAliasedGroup()
- */
- public boolean supportsAliasedGroup() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelfJoins()
- */
- public boolean supportsSelfJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOuterJoins()
- */
- public boolean supportsOuterJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsFullOuterJoins()
- */
- public boolean supportsFullOuterJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsBetweenCriteria()
- */
- public boolean supportsBetweenCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
- */
- public boolean supportsCompareCriteriaEquals() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteria()
- */
- public boolean supportsLikeCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
- */
- public boolean supportsLikeCriteriaEscapeCharacter() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteria()
- */
- public boolean supportsInCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteriaSubquery()
- */
- public boolean supportsInCriteriaSubquery() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsIsNullCriteria()
- */
- public boolean supportsIsNullCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrCriteria()
- */
- public boolean supportsOrCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsNotCriteria()
- */
- public boolean supportsNotCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsExistsCriteria()
- */
- public boolean supportsExistsCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
- */
- public boolean supportsQuantifiedCompareCriteriaSome() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
- */
- public boolean supportsQuantifiedCompareCriteriaAll() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrderBy()
- */
- public boolean supportsOrderBy() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesSum()
- */
- public boolean supportsAggregatesSum() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesAvg()
- */
- public boolean supportsAggregatesAvg() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMin()
- */
- public boolean supportsAggregatesMin() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMax()
- */
- public boolean supportsAggregatesMax() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCount()
- */
- public boolean supportsAggregatesCount() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCountStar()
- */
- public boolean supportsAggregatesCountStar() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesDistinct()
- */
- public boolean supportsAggregatesDistinct() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsScalarSubqueries()
- */
- public boolean supportsScalarSubqueries() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCorrelatedSubqueries()
- */
- public boolean supportsCorrelatedSubqueries() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCaseExpressions()
- */
- public boolean supportsCaseExpressions() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSearchedCaseExpressions()
- */
- public boolean supportsSearchedCaseExpressions() {
- return false;
- }
-
- /**
- * Return null to indicate no functions are supported.
- * @return null
- * @see org.teiid.connector.api.ConnectorCapabilities#getSupportedFunctions()
- */
- public List<String> getSupportedFunctions() {
- return null;
- }
-
- public boolean supportsInlineViews() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsUnions()
- * @since 4.2
- */
- public boolean supportsUnions() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#getMaxInCriteriaSize()
- * @since 4.2
- */
- public int getMaxInCriteriaSize() {
- return -1;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsFunctionsInGroupBy()
- * @since 5.0
- */
- public boolean supportsFunctionsInGroupBy() {
- return false;
- }
-
- public boolean supportsRowLimit() {
- return false;
- }
-
- public boolean supportsRowOffset() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#getMaxFromGroups()
- */
- public int getMaxFromGroups() {
- return -1; //-1 indicates no max
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsExcept()
- */
- public boolean supportsExcept() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsIntersect()
- */
- public boolean supportsIntersect() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsSetQueryOrderBy()
- */
- public boolean supportsSetQueryOrderBy() {
- return false;
- }
-
- @Override
- public boolean useAnsiJoin() {
- return false;
- }
-
- @Override
- public boolean requiresCriteria() {
- return false;
- }
-
- @Override
- public boolean supportsBatchedUpdates() {
- return false;
- }
-
- @Override
- public boolean supportsGroupBy() {
- return false;
- }
-
- @Override
- public boolean supportsHaving() {
- return false;
- }
-
- @Override
- public boolean supportsInnerJoins() {
- return false;
- }
-
- @Override
- public boolean supportsSelectExpression() {
- return false;
- }
-
- @Override
- public SupportedJoinCriteria getSupportedJoinCriteria() {
- return SupportedJoinCriteria.ANY;
- }
-
- @Override
- public boolean supportsCompareCriteriaOrdered() {
- return false;
- }
-
- @Override
- public boolean supportsInsertWithQueryExpression() {
- return false;
- }
-
- @Override
- public boolean supportsBulkUpdate() {
- return false;
- }
-
- @Override
- public boolean supportsOrderByUnrelated() {
- return false;
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicExecution.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,29 +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.connector.basic;
-
-import org.teiid.connector.api.Execution;
-
-public abstract class BasicExecution implements Execution {
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnection.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,182 +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.connector.basic;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.resource.ResourceException;
-import javax.resource.spi.ConnectionEvent;
-import javax.resource.spi.ConnectionEventListener;
-import javax.resource.spi.ConnectionRequestInfo;
-import javax.resource.spi.LocalTransaction;
-import javax.resource.spi.ManagedConnection;
-import javax.resource.spi.ManagedConnectionMetaData;
-import javax.security.auth.Subject;
-import javax.transaction.xa.XAResource;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectionContext;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorException;
-
-public class BasicManagedConnection implements ManagedConnection {
- protected PrintWriter log;
- protected final Collection<ConnectionEventListener> listeners = new ArrayList<ConnectionEventListener>();
- private BasicManagedConnectionFactory mcf;
- private Connection physicalConnection;
- private final Set<WrappedConnection> handles = new HashSet<WrappedConnection>();
- private Connector cf;
-
- public BasicManagedConnection(Connector connectionFactory, BasicManagedConnectionFactory mcf) throws ResourceException {
- this.cf = connectionFactory;
- this.physicalConnection = this.cf.getConnection();
- this.mcf = mcf;
- }
-
- @Override
- public void associateConnection(Object handle) throws ResourceException {
- if (!(handle instanceof WrappedConnection)) {
- throw new ConnectorException("Wrong connection supplied to assosiate");
- }
- ((WrappedConnection)handle).setManagedConnection(this);
- synchronized (this.handles) {
- this.handles.add((WrappedConnection)handle);
- }
- }
-
- @Override
- public void cleanup() throws ResourceException {
- synchronized (this.handles) {
- for (WrappedConnection wc:this.handles) {
- wc.setManagedConnection(null);
- }
- handles.clear();
- }
- ConnectionContext.setSubject(null);
- }
-
- @Override
- public void destroy() throws ResourceException {
- cleanup();
-
- this.physicalConnection.close();
- this.physicalConnection = null;
- }
-
- @Override
- public ManagedConnectionMetaData getMetaData() throws ResourceException {
- return null;
- }
-
- @Override
- public Object getConnection(Subject arg0, ConnectionRequestInfo arg1) throws ResourceException {
- if(!(arg1 instanceof ConnectionRequestInfoWrapper)) {
- throw new ConnectorException("Un recognized Connection Request Info object received");
- }
- ConnectionContext.setSubject(arg0);
- if (this.physicalConnection == null) {
- this.physicalConnection = this.cf.getConnection();
- }
-
- WrappedConnection wc = new WrappedConnection(this, mcf);
- synchronized(this.handles) {
- this.handles.add(wc);
- }
- return wc;
- }
-
- @Override
- public LocalTransaction getLocalTransaction() throws ResourceException {
- return this.physicalConnection.getLocalTransaction();
- }
-
- @Override
- public XAResource getXAResource() throws ResourceException {
- return this.physicalConnection.getXAResource();
- }
-
- @Override
- public void addConnectionEventListener(ConnectionEventListener arg0) {
- synchronized (this.listeners) {
- this.listeners.add(arg0);
- }
- }
-
- @Override
- public void removeConnectionEventListener(ConnectionEventListener arg0) {
- synchronized (this.listeners) {
- this.listeners.remove(arg0);
- }
- }
-
- @Override
- public void setLogWriter(PrintWriter arg0) throws ResourceException {
- this.log = arg0;
- }
-
- @Override
- public PrintWriter getLogWriter() throws ResourceException {
- return this.log;
- }
-
- // called by the wrapped connection to notify the close of the connection.
- void connectionClosed(WrappedConnection wc) throws ConnectorException {
-
- synchronized (this.handles) {
- handles.remove(wc);
- }
-
- ConnectionEvent ce = new ConnectionEvent(this, ConnectionEvent.CONNECTION_CLOSED);
- ce.setConnectionHandle(wc);
-
- ArrayList<ConnectionEventListener> copy = null;
- synchronized (this.listeners) {
- copy = new ArrayList<ConnectionEventListener>(this.listeners);
- }
-
- for(ConnectionEventListener l: copy) {
- l.connectionClosed(ce);
- }
-
- // check if connector is a facade for another; in which case release it to the pool
- if (this.mcf.getSourceJNDIName() != null) {
- synchronized(this.physicalConnection) {
- this.physicalConnection.close();
- this.physicalConnection = null;
- }
- }
- }
-
- public boolean isValid() throws ConnectorException {
- return this.physicalConnection.isAlive();
- }
-
- Connection getConnection() throws ConnectorException {
- if (this.physicalConnection == null)
- throw new ConnectorException("Connection has been destroyed!!!");
- return this.physicalConnection;
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnectionFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnectionFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,240 +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.connector.basic;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.resource.ResourceException;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ConnectionRequestInfo;
-import javax.resource.spi.ManagedConnection;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterAssociation;
-import javax.resource.spi.ValidatingManagedConnectionFactory;
-import javax.security.auth.Subject;
-
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.language.LanguageFactory;
-
-import com.metamatrix.core.MetaMatrixCoreException;
-import com.metamatrix.core.util.ReflectionHelper;
-
-public class BasicManagedConnectionFactory implements ManagedConnectionFactory, ResourceAdapterAssociation, ConnectorEnvironment, ValidatingManagedConnectionFactory {
-
- private static final long serialVersionUID = -7302713800883776790L;
- private static final TypeFacility TYPE_FACILITY = new TypeFacilityImpl();
- private ConnectorLogger logger = new DefaultConnectorLogger();
- private PrintWriter log;
- private BasicResourceAdapter ra;
-
- // Properties set by ra.xml
- private String connectorClass;
- private String capabilitiesClass;
- private boolean immutable = false;
- private boolean exceptionOnMaxRows = false;
- private int maxResultRows = -1;
- private boolean xaCapable;
- private String sourceJNDIName;
-
- private String overrideCapabilitiesFile;
-
- // derived
- private Properties overrideCapabilities;
-
- @Override
- public Object createConnectionFactory() throws ResourceException {
- try {
- Object o = ReflectionHelper.create(this.connectorClass, null, Thread.currentThread().getContextClassLoader());
- if(!(o instanceof Connector)) {
- throw new ConnectorException("Invalid Connector class specified="+this.connectorClass);
- }
- Connector connector = (Connector)o;
- connector.initialize(this);
- return connector;
- } catch (MetaMatrixCoreException e) {
- throw new ResourceException(e);
- }
- }
-
- @Override
- public Object createConnectionFactory(ConnectionManager arg0) throws ResourceException {
- return new WrappedConnector((Connector)createConnectionFactory(), arg0, this);
- }
-
- @Override
- public ManagedConnection createManagedConnection(Subject arg0, ConnectionRequestInfo arg1) throws ResourceException {
- ConnectionRequestInfoWrapper criw = (ConnectionRequestInfoWrapper)arg1;
- return new BasicManagedConnection(criw.actualConnector, this);
- }
-
- @Override
- public PrintWriter getLogWriter() throws ResourceException {
- return this.log;
- }
-
- @Override
- public ManagedConnection matchManagedConnections(Set arg0, Subject arg1, ConnectionRequestInfo arg2) throws ResourceException {
- // rameshTODO: to manage per-user based pools the information in the request info needs to be used to filter.
- return (ManagedConnection)arg0.iterator().next();
- }
-
- @Override
- public void setLogWriter(PrintWriter arg0) throws ResourceException {
- this.log = arg0;
- }
-
- @Override
- public ResourceAdapter getResourceAdapter() {
- return this.ra;
- }
-
- @Override
- public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException {
- this.ra = (BasicResourceAdapter)arg0;
- }
-
- public void setConnectorClass(String arg0) {
- this.connectorClass = arg0;
- }
-
- public void setCapabilitiesClass(String arg0) {
- this.capabilitiesClass = arg0;
- }
-
- public void setImmutable(Boolean arg0) {
- this.immutable = arg0.booleanValue();
- }
-
- public void setExceptionOnMaxRows(Boolean arg0) {
- this.exceptionOnMaxRows = arg0.booleanValue();
- }
-
- public void setMaxResultRows(Integer arg0) {
- this.maxResultRows = arg0.intValue();
- }
-
- public String getCapabilitiesClass() {
- return capabilitiesClass;
- }
-
- public boolean isImmutable() {
- return immutable;
- }
-
- public boolean isExceptionOnMaxRows() {
- return exceptionOnMaxRows;
- }
-
- public int getMaxResultRows() {
- return maxResultRows;
- }
-
- public boolean isXaCapable() {
- return xaCapable;
- }
-
- public void setXaCapable(Boolean arg0) {
- this.xaCapable = arg0.booleanValue();
- }
-
- @Override
- public LanguageFactory getLanguageFactory() {
- return LanguageFactory.INSTANCE;
- }
-
- @Override
- public ConnectorLogger getLogger() {
- return logger;
- }
-
- @Override
- public TypeFacility getTypeFacility() {
- return TYPE_FACILITY;
- }
-
- public void setSourceJNDIName(String arg0) {
- this.sourceJNDIName = arg0;
- }
-
- public String getSourceJNDIName() {
- return sourceJNDIName;
- }
-
- @Override
- public Properties getOverrideCapabilities() throws ConnectorException {
- if (this.overrideCapabilities == null && this.overrideCapabilitiesFile != null) {
- try {
- this.overrideCapabilities = new Properties();
- this.overrideCapabilities.loadFromXML(this.getClass().getResourceAsStream(this.overrideCapabilitiesFile));
- } catch (IOException e) {
- throw new ConnectorException(e);
- }
- }
- return this.overrideCapabilities;
- }
-
- public void setOverrideCapabilitiesFile(String propsFile) {
- this.overrideCapabilitiesFile = propsFile;
- }
-
- public static <T> T getInstance(Class<T> expectedType, String className, Collection ctorObjs, Class defaultClass) throws ConnectorException {
- try {
- if (className == null) {
- if (defaultClass == null) {
- throw new ConnectorException("Neither class name or default class specified to create an instance");
- }
- return expectedType.cast(defaultClass.newInstance());
- }
- return expectedType.cast(ReflectionHelper.create(className, ctorObjs, Thread.currentThread().getContextClassLoader()));
- } catch (MetaMatrixCoreException e) {
- throw new ConnectorException(e);
- } catch (IllegalAccessException e) {
- throw new ConnectorException(e);
- } catch(InstantiationException e) {
- throw new ConnectorException(e);
- }
- }
-
- @Override
- public Set<BasicManagedConnection> getInvalidConnections(Set arg0) throws ResourceException {
- HashSet<BasicManagedConnection> result = new HashSet<BasicManagedConnection>();
- for (Object object : arg0) {
- if (object instanceof BasicManagedConnection) {
- BasicManagedConnection bmc = (BasicManagedConnection)object;
- if (!bmc.isValid()) {
- result.add(bmc);
- }
- }
- }
- return result;
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicResourceAdapter.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicResourceAdapter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicResourceAdapter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,68 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This 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 software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.teiid.connector.basic;
-
-import javax.resource.ResourceException;
-import javax.resource.spi.ActivationSpec;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.endpoint.MessageEndpointFactory;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.xa.XAResource;
-
-public class BasicResourceAdapter implements ResourceAdapter {
- BootstrapContext ctx;
-
- @Override
- public void endpointActivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) throws ResourceException {
- throw new UnsupportedOperationException("not supported");
- }
-
- @Override
- public void endpointDeactivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) {
- throw new UnsupportedOperationException("not supported");
- }
-
- @Override
- public XAResource[] getXAResources(ActivationSpec[] specs) throws ResourceException {
- return new XAResource[0];
- }
-
- @Override
- public void start(BootstrapContext ctx) throws ResourceAdapterInternalException {
- this.ctx = ctx;
- }
-
- @Override
- public void stop() {
- }
-
- public WorkManager getWorkManager() {
- return ctx.getWorkManager();
- }
-
- public XATerminator getXATerminator() {
- return ctx.getXATerminator();
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/ConnectionRequestInfoWrapper.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/ConnectionRequestInfoWrapper.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/ConnectionRequestInfoWrapper.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,34 +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.connector.basic;
-
-import javax.resource.spi.ConnectionRequestInfo;
-
-import org.teiid.connector.api.Connector;
-
-class ConnectionRequestInfoWrapper implements ConnectionRequestInfo {
- Connector actualConnector;
-
- public ConnectionRequestInfoWrapper(Connector connector) {
- this.actualConnector = connector;
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/DefaultConnectorLogger.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/DefaultConnectorLogger.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/DefaultConnectorLogger.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,110 +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.
- */
-
-/*
- * Date: Sep 16, 2003
- * Time: 11:23:00 AM
- */
-package org.teiid.connector.basic;
-
-import org.teiid.connector.api.ConnectorLogger;
-
-/**
- * DefaultConnectorLogger.
- */
-public class DefaultConnectorLogger implements ConnectorLogger {
- @Override
- public void logError(String message) {
- //LogManager.logError(CTX_CONNECTOR, message);
- }
- @Override
- public void logError(String message, Throwable error) {
- // LogManager.logError(CTX_CONNECTOR, error, message);
- }
- @Override
- public void logWarning(String message) {
- // LogManager.logWarning(CTX_CONNECTOR, message);
- }
- @Override
- public void logInfo(String message) {
- //LogManager.logInfo(CTX_CONNECTOR, message);
- }
- @Override
- public void logDetail(String message) {
- //LogManager.logDetail(CTX_CONNECTOR, message);
- }
-
- @Override
- public void logTrace(String message) {
- // LogManager.logTrace(CTX_CONNECTOR, message);
- }
-
- @Override
- public boolean isDetailEnabled() {
- //return LogManager.isMessageToBeRecorded(CTX_CONNECTOR, MessageLevel.DETAIL);
- return true;
- }
-
- @Override
- public boolean isErrorEnabled() {
- //return LogManager.isMessageToBeRecorded(CTX_CONNECTOR, MessageLevel.ERROR);
- return true;
- }
-
- @Override
- public boolean isInfoEnabled() {
- //return LogManager.isMessageToBeRecorded(CTX_CONNECTOR, MessageLevel.INFO);
- return true;
- }
-
- @Override
- public boolean isTraceEnabled() {
- //return LogManager.isMessageToBeRecorded(CTX_CONNECTOR, MessageLevel.TRACE);
- return true;
- }
-
- @Override
- public boolean isWarningEnabled() {
- //return LogManager.isMessageToBeRecorded(CTX_CONNECTOR, MessageLevel.WARNING);
- return true;
- }
-
- @Override
- public void logDetail(String message, Throwable error) {
- //LogManager.log(MessageLevel.DETAIL, CTX_CONNECTOR, error, message);
- }
-
- @Override
- public void logInfo(String message, Throwable error) {
- //LogManager.log(MessageLevel.INFO, CTX_CONNECTOR, error, message);
- }
-
- @Override
- public void logTrace(String message, Throwable error) {
- //LogManager.log(MessageLevel.TRACE, CTX_CONNECTOR, error, message);
- }
-
- @Override
- public void logWarning(String message, Throwable error) {
- //LogManager.log(MessageLevel.WARNING, CTX_CONNECTOR, error, message);
- }
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/TypeFacilityImpl.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/TypeFacilityImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/TypeFacilityImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,52 +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.connector.basic;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-import org.teiid.connector.api.TypeFacility;
-
-import com.metamatrix.common.types.DataTypeManager;
-import com.metamatrix.common.util.TimestampWithTimezone;
-
-/**
- */
-public class TypeFacilityImpl extends TypeFacility {
-
- public TypeFacilityImpl() {
- }
-
- @Override
- public Object convertToRuntimeType(Object value) {
- return DataTypeManager.convertToRuntimeType(value);
- }
-
- @Override
- public Object convertDate(Date date, TimeZone initial, Calendar target,
- Class targetType) {
- return TimestampWithTimezone.create(date, initial, target, targetType);
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnection.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,109 +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.connector.basic;
-
-import java.lang.reflect.Proxy;
-
-import javax.resource.spi.LocalTransaction;
-import javax.transaction.xa.XAResource;
-
-import org.teiid.connector.DataPlugin;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.Execution;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.MetadataProvider;
-import org.teiid.connector.basic.WrappedConnector.CapabilitesOverloader;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-public class WrappedConnection implements Connection, MetadataProvider {
-
- private ConnectorEnvironment env;
- private ConnectorCapabilities caps;
- private BasicManagedConnection mc;
- boolean closed = false;
-
- public WrappedConnection(BasicManagedConnection mc, ConnectorEnvironment env) {
- this.mc = mc;
- this.env = env;
- }
-
- @Override
- public void close() throws ConnectorException {
- if (!this.closed && this.mc != null) {
- this.closed = true;
- this.mc.connectionClosed(this);
- this.mc = null;
- }
- }
-
- @Override
- public Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return this.mc.getConnection().createExecution(command, executionContext, metadata);
- }
-
- @Override
- public ConnectorCapabilities getCapabilities() throws ConnectorException {
- if (this.caps == null) {
- this.caps = this.mc.getConnection().getCapabilities();
- if (caps != null && this.env.getOverrideCapabilities() != null) {
- caps = (ConnectorCapabilities) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {ConnectorCapabilities.class}, new CapabilitesOverloader(caps, this.env.getOverrideCapabilities()));
- }
- }
- return this.caps;
- }
-
- @Override
- public LocalTransaction getLocalTransaction() throws ConnectorException {
- return this.mc.getConnection().getLocalTransaction();
- }
-
- @Override
- public boolean isAlive() throws ConnectorException {
- return this.mc.getConnection().isAlive();
- }
-
- @Override
- public XAResource getXAResource() throws ConnectorException {
- return this.mc.getConnection().getXAResource();
- }
-
- @Override
- public void getConnectorMetadata(MetadataFactory metadataFactory) throws ConnectorException {
- if (this.mc.getConnection() instanceof MetadataProvider) {
- ((MetadataProvider) this.mc.getConnection()).getConnectorMetadata(metadataFactory);
- } else {
- throw new ConnectorException(DataPlugin.Util.getString("WrappedConnection.no_metadata")); //$NON-NLS-1$
- }
- }
-
- // Called by managed connection for the connection management
- void setManagedConnection(BasicManagedConnection mc) {
- this.mc = mc;
- }
-
-}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnector.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,138 +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.connector.basic;
-
-import java.io.Serializable;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Properties;
-
-import javax.naming.NamingException;
-import javax.naming.Reference;
-import javax.resource.Referenceable;
-import javax.resource.ResourceException;
-import javax.resource.spi.ConnectionManager;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-
-import com.metamatrix.core.MetaMatrixCoreException;
-import com.metamatrix.core.util.ReflectionHelper;
-import com.metamatrix.core.util.StringUtil;
-
-public class WrappedConnector implements Connector, Referenceable, Serializable {
-
- private static final long serialVersionUID = 5499157394014613035L;
- private Connector delegate;
- private ConnectionManager cm;
- private BasicManagedConnectionFactory mcf;
- private Reference reference;
- ConnectorCapabilities caps;
-
- public WrappedConnector(Connector delegate, ConnectionManager cm, BasicManagedConnectionFactory mcf) {
- this.delegate = delegate;
- this.cm = cm;
- this.mcf = mcf;
- }
-
- @Override
- public void initialize(ConnectorEnvironment config) throws ConnectorException {
- this.delegate.initialize(config);
- }
-
- @Override
- public ConnectorCapabilities getCapabilities() throws ConnectorException {
- if (this.caps != null) {
- return this.caps;
- }
-
- // see if enhanced capabilities are available from the connector.
- this.caps = delegate.getCapabilities();
-
- // if not use the default capabilities specified in the configuration.
- if (this.caps == null) {
- try {
- Object o = ReflectionHelper.create(this.mcf.getCapabilitiesClass(), null, Thread.currentThread().getContextClassLoader());
- this.caps = (ConnectorCapabilities)o;
- } catch (MetaMatrixCoreException e) {
- throw new ConnectorException(e);
- }
- }
- // capabilities overload
- ConnectorEnvironment env = getConnectorEnvironment();
- if (this.caps != null && env.getOverrideCapabilities() != null) {
- this.caps = (ConnectorCapabilities) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {ConnectorCapabilities.class}, new CapabilitesOverloader(this.caps, env.getOverrideCapabilities()));
- }
- return caps;
- }
-
- @Override
- public Connection getConnection() throws ConnectorException {
- try {
- return (Connection)cm.allocateConnection(mcf, new ConnectionRequestInfoWrapper(this.delegate));
- } catch (ResourceException e) {
- throw new ConnectorException(e);
- }
- }
-
- @Override
- public ConnectorEnvironment getConnectorEnvironment() {
- return this.delegate.getConnectorEnvironment();
- }
-
- @Override
- public void setReference(Reference arg0) {
- this.reference = arg0;
- }
-
- @Override
- public Reference getReference() throws NamingException {
- return this.reference;
- }
-
-
- /**
- * Overloads the connector capabilities with one defined in the connector binding properties
- */
- static final class CapabilitesOverloader implements InvocationHandler {
- ConnectorCapabilities caps;
- Properties properties;
-
- CapabilitesOverloader(ConnectorCapabilities caps, Properties properties){
- this.caps = caps;
- this.properties = properties;
- }
-
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String value = this.properties.getProperty(method.getName());
- if (value == null || value.trim().length() == 0 || (args != null && args.length != 0)) {
- return method.invoke(this.caps, args);
- }
- return StringUtil.valueOf(value, method.getReturnType());
- }
- }
-}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/Condition.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/Condition.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/Condition.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.connector.language;
-import org.teiid.connector.api.TypeFacility;
+import org.teiid.resource.cci.TypeFacility;
/**
* Represents criteria, which is also a boolean expression
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/LanguageFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/LanguageFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/LanguageFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,6 @@
package org.teiid.connector.language;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Modified: trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/BaseColumn.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/BaseColumn.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/BaseColumn.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.connector.metadata.runtime;
-import org.teiid.connector.api.TypeFacility;
+import org.teiid.resource.cci.TypeFacility;
public abstract class BaseColumn extends AbstractMetadataRecord {
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 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/MetadataFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,8 +29,8 @@
import java.util.Properties;
import org.teiid.connector.DataPlugin;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.TypeFacility;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.TypeFacility;
import com.metamatrix.core.id.UUIDFactory;
Modified: trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/RuntimeMetadata.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/RuntimeMetadata.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/main/java/org/teiid/connector/metadata/runtime/RuntimeMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.connector.metadata.runtime;
-import org.teiid.connector.api.ConnectorException;
+import org.teiid.resource.ConnectorException;
/**
* Helper methods that can be used to access runtime metadata.
Copied: trunk/connector-api/src/main/java/org/teiid/logging/AuditMessage.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/logging/api/AuditMessage.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/AuditMessage.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/AuditMessage.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,72 @@
+/*
+ * 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.logging;
+
+import java.util.Arrays;
+
+/**
+ * Log format for auditing.
+ */
+public class AuditMessage {
+ private String context;
+ private String activity;
+ private String principal;
+ private Object[] resources;
+
+ public AuditMessage(String context, String activity, String principal, String[] resources ) {
+ this.context = context;
+ this.activity = activity;
+ this.principal = principal;
+ this.resources = resources;
+ }
+
+ public String getContext() {
+ return this.context;
+ }
+
+ public String getActivity() {
+ return this.activity;
+ }
+
+ public String getPrincipal() {
+ return this.principal;
+ }
+
+ public Object[] getResources() {
+ return this.resources;
+ }
+
+ public String toString() {
+ StringBuffer msg = new StringBuffer();
+ msg.append(" ["); //$NON-NLS-1$
+ msg.append( getPrincipal() );
+ msg.append("] <"); //$NON-NLS-1$
+ msg.append( getContext() );
+ msg.append('.');
+ msg.append( getActivity() );
+ msg.append("> "); //$NON-NLS-1$
+ msg.append( Arrays.toString(resources) );
+ return msg.toString();
+ }
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/logging/CommandLogMessage.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/logging/api/CommandLogMessage.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/CommandLogMessage.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/CommandLogMessage.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,215 @@
+/*
+ * 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.logging;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+import org.teiid.resource.cci.ExecutionContext;
+
+/**
+ * Log Message for source and user command events.
+ */
+public class CommandLogMessage {
+
+ public enum Event {
+ NEW,
+ END,
+ CANCEL,
+ ERROR
+ }
+
+ private boolean source;
+ private Event event;
+ private long timestamp;
+
+ // Transaction info
+ private String transactionID;
+
+ // Session info
+ private String sessionID;
+ private String applicationName;
+ private String principal;
+ private String vdbName;
+ private int vdbVersion;
+
+ // RequestInfo
+ private String requestID;
+ private Long sourceCommandID;
+ private String sql;
+ private Integer rowCount;
+ private String modelName;
+ private String connectorBindingName;
+ private ExecutionContext executionContext;
+
+ public CommandLogMessage(long timestamp,
+ String requestID,
+ String transactionID,
+ String sessionID,
+ String applicationName,
+ String principal,
+ String vdbName,
+ int vdbVersion,
+ String sql) {
+ // userCommandStart
+ this(timestamp, requestID, transactionID, sessionID, principal, vdbName, vdbVersion, null, Event.NEW);
+ this.applicationName = applicationName;
+ this.sql = sql;
+ }
+ public CommandLogMessage(long timestamp,
+ String requestID,
+ String transactionID,
+ String sessionID,
+ String principal,
+ String vdbName,
+ int vdbVersion,
+ Integer finalRowCount,
+ Event event) {
+ // userCommandEnd
+ this.event = event;
+ this.timestamp = timestamp;
+ this.requestID = requestID;
+ this.transactionID = transactionID;
+ this.sessionID = sessionID;
+ this.principal = principal;
+ this.vdbName = vdbName;
+ this.vdbVersion = vdbVersion;
+ this.rowCount = finalRowCount;
+ }
+ public CommandLogMessage(long timestamp,
+ String requestID,
+ long sourceCommandID,
+ String transactionID,
+ String modelName,
+ String connectorBindingName,
+ String sessionID,
+ String principal,
+ String sql,
+ ExecutionContext context) {
+ // dataSourceCommandStart
+ this(timestamp, requestID, sourceCommandID, transactionID, modelName, connectorBindingName, sessionID, principal, null, Event.NEW, context);
+ this.sql = sql;
+ }
+ public CommandLogMessage(long timestamp,
+ String requestID,
+ long sourceCommandID,
+ String transactionID,
+ String modelName,
+ String connectorBindingName,
+ String sessionID,
+ String principal,
+ Integer finalRowCount,
+ Event event,
+ ExecutionContext context) {
+ // dataSourceCommandEnd
+ this.source = true;
+ this.event = event;
+ this.timestamp = timestamp;
+ this.requestID = requestID;
+ this.sourceCommandID = sourceCommandID;
+ this.transactionID = transactionID;
+ this.modelName = modelName;
+ this.connectorBindingName = connectorBindingName;
+ this.sessionID = sessionID;
+ this.principal = principal;
+ this.rowCount = finalRowCount;
+ this.executionContext = context;
+ }
+
+ public String toString() {
+ if (!source && event == Event.NEW) {
+ return "\tSTART USER COMMAND:\tstartTime=" + getTimestampString(new Date(timestamp)) + "\trequestID=" + requestID + "\ttxID=" + transactionID + "\tsessionID=" + sessionID + "\tapplicationName=" + applicationName + "\tprincipal=" + principal + "\tvdbName=" + vdbName + "\tvdbVersion=" + vdbVersion + "\tsql=" + sql; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ }
+ if (!source) {
+ return "\t"+ event +" USER COMMAND:\tendTime=" + getTimestampString(new Date(timestamp)) + "\trequestID=" + requestID + "\ttxID=" + transactionID + "\tsessionID=" + sessionID + "\tprincipal=" + principal + "\tvdbName=" + vdbName + "\tvdbVersion=" + vdbVersion + "\tfinalRowCount=" + rowCount; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ }
+ if (event == Event.NEW) {
+ return "\tSTART DATA SRC COMMAND:\tstartTime=" + getTimestampString(new Date(timestamp)) + "\trequestID=" + requestID + "\tsourceCommandID="+ sourceCommandID + "\ttxID=" + transactionID + "\tmodelName="+ modelName + "\tconnectorBindingName=" + connectorBindingName + "\tsessionID=" + sessionID + "\tprincipal=" + principal + "\tsql=" + sql; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ }
+ return "\t"+ event +" SRC COMMAND:\tendTime=" + getTimestampString(new Date(timestamp)) + "\trequestID=" + requestID + "\tsourceCommandID="+ sourceCommandID + "\ttxID=" + transactionID + "\tmodelName="+ modelName + "\tconnectorBindingName=" + connectorBindingName + "\tsessionID=" + sessionID + "\tprincipal=" + principal + "\tfinalRowCount=" + rowCount; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ }
+
+ private String getTimestampString(Date date) {
+ return DateFormat.getDateInstance().format(date);
+ }
+ public long getTimestamp() {
+ return timestamp;
+ }
+ public String getTransactionID() {
+ return transactionID;
+ }
+ public String getSessionID() {
+ return sessionID;
+ }
+ public String getApplicationName() {
+ return applicationName;
+ }
+ public String getPrincipal() {
+ return principal;
+ }
+ public String getVdbName() {
+ return vdbName;
+ }
+ public int getVdbVersion() {
+ return vdbVersion;
+ }
+ public String getRequestID() {
+ return requestID;
+ }
+ public Long getSourceCommandID() {
+ return sourceCommandID;
+ }
+ /**
+ * Returns the command. Only valid for {@link Event#NEW}
+ * @return
+ */
+ public String getSql() {
+ return sql;
+ }
+ /**
+ * Returns the command. Only valid for {@link Event#END}
+ * @return
+ */
+ public Integer getRowCount() {
+ return rowCount;
+ }
+ public String getModelName() {
+ return modelName;
+ }
+ public String getConnectorBindingName() {
+ return connectorBindingName;
+ }
+ public Event getStatus() {
+ return event;
+ }
+ public boolean isSource() {
+ return source;
+ }
+ /**
+ * Only available for source commands
+ * @return
+ */
+ public ExecutionContext getExecutionContext() {
+ return executionContext;
+ }
+}
Copied: trunk/connector-api/src/main/java/org/teiid/logging/JavaLogWriter.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/JavaLogWriter.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/JavaLogWriter.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/JavaLogWriter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,75 @@
+/*
+ * 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.logging;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Write to Java logging
+ */
+public class JavaLogWriter implements LogListener {
+
+ @Override
+ public boolean isEnabled(String context, int msgLevel) {
+ Logger logger = Logger.getLogger(context);
+
+ Level javaLevel = convertLevel(msgLevel);
+ return logger.isLoggable(javaLevel);
+ }
+
+ public void log(int level, String context, Object msg) {
+ Logger logger = Logger.getLogger(context);
+
+ Level javaLevel = convertLevel(level);
+ logger.log(javaLevel, msg.toString());
+ }
+
+ public void log(int level, String context, Throwable t, Object msg) {
+ Logger logger = Logger.getLogger(context);
+
+ Level javaLevel = convertLevel(level);
+ logger.log(javaLevel, msg.toString(), t);
+ }
+
+ public Level convertLevel(int level) {
+ switch (level) {
+ case MessageLevel.CRITICAL:
+ case MessageLevel.ERROR:
+ return Level.SEVERE;
+ case MessageLevel.WARNING:
+ return Level.WARNING;
+ case MessageLevel.INFO:
+ return Level.FINE;
+ case MessageLevel.DETAIL:
+ return Level.FINER;
+ case MessageLevel.TRACE:
+ return Level.FINEST;
+ }
+ return Level.ALL;
+ }
+
+ public void shutdown() {
+ }
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/logging/JavaLogWriter.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: trunk/connector-api/src/main/java/org/teiid/logging/LogConstants.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/LogConstants.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/LogConstants.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/LogConstants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,44 @@
+/*
+ * 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.logging;
+
+
+public interface LogConstants {
+ // add the new contexts to the Log4JUtil.java class, for configuration purpose
+ public static final String CTX_SECURITY = "org.teiid.SECURITY"; //$NON-NLS-1$
+ public static final String CTX_TRANSPORT = "org.teiid.TRANSPORT"; //$NON-NLS-1$
+ public static final String CTX_QUERY_PLANNER = "org.teiid.PLANNER"; //$NON-NLS-1$
+ public static final String CTX_DQP = "org.teiid.PROCESSOR"; //$NON-NLS-1$
+ public static final String CTX_CONNECTOR = "org.teiid.CONNECTOR"; //$NON-NLS-1$
+ public static final String CTX_BUFFER_MGR = "org.teiid.BUFFER_MGR"; //$NON-NLS-1$
+ public static final String CTX_TXN_LOG = "org.teiid.TXN_LOG"; //$NON-NLS-1$
+ public static final String CTX_COMMANDLOGGING = "org.teiid.COMMAND_LOG"; //$NON-NLS-1$
+ public static final String CTX_AUDITLOGGING = "org.teiid.AUDIT_LOG"; //$NON-NLS-1$
+ public static final String CTX_ADMIN_API = "org.teiid.ADMIN_API"; //$NON-NLS-1$
+ public static final String CTX_RUNTIME = "org.teiid.RUNTIME"; //$NON-NLS-1$
+ // Query contexts
+ public static final String CTX_FUNCTION_TREE = CTX_QUERY_PLANNER + ".FUNCTION_TREE"; //$NON-NLS-1$
+ public static final String CTX_QUERY_RESOLVER = CTX_QUERY_PLANNER + ".RESOLVER"; //$NON-NLS-1$
+ public static final String CTX_XML_PLANNER = CTX_QUERY_PLANNER + ".XML_PLANNER"; //$NON-NLS-1$
+ public static final String CTX_XML_PLAN = CTX_DQP + ".XML_PLAN"; //$NON-NLS-1$
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/logging/LogConstants.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/logging/LogListener.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/LogListener.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/LogListener.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/LogListener.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.logging;
+
+
+/**
+ * LogListener
+ */
+public interface LogListener {
+
+ /**
+ * Is the logging for the given context at the specified message level enabled.
+ * @param context
+ * @param msgLevel
+ * @return
+ */
+ boolean isEnabled(String context, int msgLevel);
+
+ void log(int level, String context, Object msg);
+
+ void log(int level, String context, Throwable t, Object msg);
+
+ /**
+ * Shut down this listener, requesting it clean up and release any resources it
+ * may have acquired during its use. The listener is free to ignore this
+ * request if it is not responsible for managing the resources it uses or if
+ * there are no resources.
+ */
+ void shutdown();
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/logging/LogManager.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/LogManager.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/LogManager.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/LogManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,399 @@
+/*
+ * 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.logging;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+
+
+/**
+ * This class represents the interface to a single logging framework
+ * that is easily accessible by any component. Using the LogManager, a component
+ * can quickly submit a log message, and can rely upon the LogManager to determine
+ * (a) whether that message is to be recorded or discarded; and (b) where
+ * to send any recorded messages. Thus, the component's code that submits
+ * messages does not have to be modified to alter the logging behavior of the
+ * application.
+ * <p>
+ * By default, all context(s) are logged by the LogManager. The messages that
+ * the LogManager actually records and sends to the destinations
+ * can be controlled using two different and orthogonal parameters.
+ * The first is a message <i>level</i> that filters messages based upon detail,
+ * and the second is a message <i>context</i> that filters messages based upon
+ * origin. The LogManager tracks only those context(s) that should NOT be
+ * logged. Only if a message (which also is defined with these two parameters)
+ * passes both filters will it be sent to the destinations.
+ * <p>
+ * Each message is submitted with one of the following levels (determined
+ * by the particular method used to submit the message), sorted from the
+ * least detailed to the greatest:
+ * <li><b>Critical</b>: This level of message is generally
+ * used to record an event or error that must be recorded (if any logging
+ * is used). If it is used to record an error, it generally means that the
+ * system encountered a critical error which affects the integrity, accuracy,
+ * reliability and/or capability of the system.</li>
+ * <li><b>Error</b>: Error messages are generally used
+ * to record unexpected problems, or errors that are not critical in nature
+ * and from which the system can automatically recover.</li>
+ * <li><b>Warning</b>: Warning messages generally described
+ * expected errors from which the system should recover. However, this level
+ * is used to record the fact that such an error or event did occur.</li>
+ * <li><b>Information</b>: This level of logging is the usually
+ * the normal level. All interesting periodic events should be logged at this
+ * level so someone looking through the log can see the amount and kind of
+ * processing happening in the system.</li>
+ * <li><b>Detail</b>: Such messages are moderately detailed,
+ * and help to debug typical problems in the system. Generally, these
+ * messages are not so detailed that the big picture gets lost.</li>
+ * <li><b>Trace</b>: A trace message is the most detailed
+ * logging level, used to trace system execution for really nasty problems.
+ * At this level, logging will be so verbose that the system performance
+ * may be affected.</li>
+ * <p>
+ * The context for a message is any application-specified String. Again, only
+ * those message contexts that match those in the LogManager's configuration will
+ * be sent to the destinations.
+ *
+ */
+public final class LogManager {
+
+ public static class LoggingProxy implements InvocationHandler {
+ private final Object instance;
+ private final String loggingContext;
+ private final int level;
+
+ public LoggingProxy(Object instance, String loggingContext, int level) {
+ this.instance = instance;
+ this.loggingContext = loggingContext;
+ this.level = level;
+ }
+
+ public Object invoke(Object proxy,
+ Method method,
+ Object[] args) throws Throwable {
+ boolean log = LogManager.isMessageToBeRecorded(loggingContext, level);
+ if (log) {
+ StringBuffer message = new StringBuffer();
+ message.append("before "); //$NON-NLS-1$
+ message.append(method.getName());
+ message.append(":"); //$NON-NLS-1$
+ message.append(instance);
+ message.append("("); //$NON-NLS-1$
+ if (args != null) {
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] != null) {
+ message.append(args[i]);
+ } else {
+ message.append("null"); //$NON-NLS-1$
+ }
+ if (i != args.length - 1) {
+ message.append(","); //$NON-NLS-1$
+ }
+ }
+ }
+ message.append(")"); //$NON-NLS-1$
+ LogManager.log(level, loggingContext, message.toString());
+ }
+ try {
+ Object result = method.invoke(instance, args);
+ if (log) {
+ LogManager.log(level, loggingContext,
+ "after " + method.getName()+ " : "+result); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return result;
+ } catch (InvocationTargetException e) {
+ throw e.getTargetException();
+ }
+ }
+ }
+
+ static LogListener logListener = new JavaLogWriter(); // either injected or manually set using the set methods
+
+ /**
+ * Send a critical message to the log. This level of message is generally
+ * used to record an event or error that must be recorded (if any logging
+ * is used). If it is used to record an error, it generally means that the
+ * system encountered a critical error which affects the integrity, accuracy,
+ * reliability and/or capability of the system.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param message the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logCritical(String context, String message) {
+ logMessage(MessageLevel.CRITICAL, context, message);
+ }
+
+ /**
+ * Send a critical message to the log. This level of message is generally
+ * used to record an event or error that must be recorded (if any logging
+ * is used). If it is used to record an error, it generally means that the
+ * system encountered a critical error which affects the integrity, accuracy,
+ * reliability and/or capability of the system.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param message the log message (may be null)
+ */
+ public static void logCritical(String context, Throwable e, String message) {
+ log(MessageLevel.CRITICAL,context,e,message);
+ }
+
+ /**
+ * Send an error message to the log. Error messages are generally used
+ * to record unexpected problems, or errors that are not critical in nature
+ * and from which the system can automatically recover.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param message the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logError(String context, String message) {
+ logMessage(MessageLevel.ERROR, context,message);
+ }
+
+ /**
+ * Send an error message to the log. Error messages are generally used
+ * to record unexpected problems, or errors that are not critical in nature
+ * and from which the system can automatically recover.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param message the log message (may be null)
+ */
+ public static void logError(String context, Throwable e, String message) {
+ log(MessageLevel.ERROR,context,e,message);
+ }
+
+ /**
+ * Send a warning message to the log. Warning messages generally described
+ * expected errors from which the system should recover. However, this level
+ * is used to record the fact that such an error or event did occur.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param message the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logWarning(String context, String message) {
+ logMessage(MessageLevel.WARNING, context,message);
+ }
+
+ /**
+ * Send a warning message to the log. Warning messages generally described
+ * expected errors from which the system should recover. However, this level
+ * is used to record the fact that such an error or event did occur.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param message the log message (may be null)
+ */
+ public static void logWarning(String context, Throwable e, String message) {
+ log(MessageLevel.WARNING,context,e,message);
+ }
+
+ /**
+ * Send a information message to the log. This level of logging is the usually
+ * the normal level. All interesting periodic events should be logged at this
+ * level so someone looking through the log can see the amount and kind of
+ * processing happening in the system.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param message the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logInfo(String context, String message) {
+ logMessage(MessageLevel.INFO, context,message);
+ }
+
+ /**
+ * Send a detail message to the log. Such messages are moderately detailed,
+ * and help to debug typical problems in the system. Generally, these
+ * messages are not so detailed that the big picture gets lost.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param msgParts the individual parts of the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logDetail(String context, Object ... msgParts) {
+ logMessage(MessageLevel.DETAIL, context, msgParts);
+ }
+
+ /**
+ * Send a detail message to the log. Such messages are moderately detailed,
+ * and help to debug typical problems in the system. Generally, these
+ * messages are not so detailed that the big picture gets lost.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param message the log message (may be null)
+ */
+ public static void logDetail(String context, Throwable e, Object ... message) {
+ log(MessageLevel.DETAIL,context,e,message);
+ }
+
+ /**
+ * Send a trace message to the log. A trace message is the most detailed
+ * logging level, used to trace system execution for really nasty problems.
+ * At this level, logging will be so verbose that the system performance
+ * may be affected.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param msgParts the individual parts of the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void logTrace(String context, Object ... msgParts) {
+ logMessage(MessageLevel.TRACE, context, msgParts);
+ }
+
+ /**
+ * Send a trace message to the log. A trace message is the most detailed
+ * logging level, used to trace system execution for really nasty problems.
+ * At this level, logging will be so verbose that the system performance
+ * may be affected.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param msgParts the individual parts of the log message (may be null)
+ */
+ public static void logTrace(String context, Throwable e, Object ... msgParts) {
+ logMessage(MessageLevel.TRACE,context,e,msgParts);
+ }
+
+ /**
+ * Send a message of the specified level to the log.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param msgLevel
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param message the individual parts of the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void log(int msgLevel, String context, Object message) {
+ logMessage(msgLevel, context, message);
+ }
+
+ /**
+ * Send a message of the specified level to the log.
+ * <p>
+ * Only if the log manager is configured to send such messages to the
+ * destination will the message be recorded.
+ * @param context the context for this log message (for example, the component
+ * that is generating this message).
+ * @param e the exception that is to be logged; the message is
+ * not logged if this parameter is null
+ * @param message the individual parts of the log message; the message is
+ * not logged if this parameter is null
+ */
+ public static void log(int msgLevel, String context, Throwable e, Object message) {
+ if (!isMessageToBeRecorded(context, msgLevel)) {
+ return;
+ }
+ logListener.log(msgLevel, context, e, message);
+ }
+
+ public static void setLogListener(LogListener listener) {
+ logListener.shutdown();
+ if (listener != null) {
+ logListener = listener;
+ }
+ else {
+ logListener = new JavaLogWriter();
+ }
+ }
+
+ /**
+ * Utility method to identify whether a log message with the specified
+ * context and level will be recorded in the LogManager's destinations.
+ * @param context
+ * @param msgLevel
+ * @return true if the message would be recorded if sent to the LogManager,
+ * or false if it would be discarded by the LogManager.
+ */
+ public static boolean isMessageToBeRecorded(String context, int msgLevel) {
+ if (logListener != null) {
+ return logListener.isEnabled(context, msgLevel);
+ }
+ return true;
+ }
+
+ private static void logMessage(int level, String context, Object ... msgParts) {
+ if (msgParts == null || msgParts.length == 0 || !isMessageToBeRecorded(context, level)) {
+ return;
+ }
+ logListener.log(level, context, new LogMessage(msgParts));
+ }
+
+
+ /**
+ * Create a logging proxy, that logs at entry and exit points of the method calls on the provided interfaces.
+ */
+ public static Object createLoggingProxy(final String loggingContext,
+ final Object instance,
+ final Class<?>[] interfaces,
+ final int level) {
+ return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), interfaces, new LoggingProxy(instance, loggingContext, level));
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/logging/LogManager.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: trunk/connector-api/src/main/java/org/teiid/logging/LogMessage.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/LogMessage.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/LogMessage.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/LogMessage.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,62 @@
+/*
+ * 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.logging;
+
+import java.io.Serializable;
+
+
+public class LogMessage implements Serializable{
+
+ private Object[] msgParts;
+
+ public LogMessage(Object[] msgParts) {
+ this.msgParts = msgParts;
+ }
+
+ public Object[] getMessageParts() {
+ return this.msgParts;
+ }
+
+ public String getText() {
+ StringBuffer text = null;
+ if(msgParts != null) {
+ text = new StringBuffer();
+ for(int i=0; i<msgParts.length; i++) {
+ if (i>0) text.append(" "); //$NON-NLS-1$
+ Object omsg = msgParts[i];
+ if ( omsg != null ) {
+ text.append(omsg.toString());
+ }
+ }
+ }
+
+ if (text == null) {
+ return "NULL"; //$NON-NLS-1$
+ }
+ return text.toString();
+ }
+
+ public String toString() {
+ return getText();
+ }
+}
Copied: trunk/connector-api/src/main/java/org/teiid/logging/MessageLevel.java (from rev 2083, trunk/engine/src/main/java/com/metamatrix/common/log/MessageLevel.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/logging/MessageLevel.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/logging/MessageLevel.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,230 @@
+/*
+ * 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.logging;
+
+import java.util.*;
+
+/**
+ * Constants that define the level of the messages that are to be recorded
+ * by the LogManager.
+ */
+public final class MessageLevel {
+
+ /**
+ * Message level value that specifies that no messages are to be recorded.
+ */
+ public static final int NONE = 0;
+
+ /**
+ * Message level value that specifies that critical messages are to be recorded.
+ */
+ public static final int CRITICAL = 1;
+
+ /**
+ * Message level value that specifies that error messages and critical
+ * messages are to be recorded.
+ */
+ public static final int ERROR = 2;
+
+ /**
+ * Message level value that specifies that warning, error and critical
+ * messages are to be recorded.
+ */
+ public static final int WARNING = 3;
+
+ /**
+ * Message level value that specifies that information, warning, error and critical
+ * messages are to be recorded.
+ */
+ public static final int INFO = 4;
+
+ /**
+ * Message level value that specifies that detailed, information, warning, error and critical
+ * messages are to be recorded.
+ */
+ public static final int DETAIL = 5;
+
+ /**
+ * Message level value that specifies that all messages are to be recorded.
+ */
+ public static final int TRACE = 6;
+
+
+ /**
+ * The default message level is WARNING.
+ */
+ public static final int DEFAULT_MESSAGE_LEVEL = WARNING;
+
+ private static final int MINIMUM = NONE;
+ private static final int MAXIMUM = TRACE;
+
+ /**
+ * Constants that define the types of the messages that are to be recorded
+ * by the LogManager.
+ */
+ public static class Labels {
+ public static final String CRITICAL = "CRITICAL"; //$NON-NLS-1$
+ public static final String ERROR = "ERROR"; //$NON-NLS-1$
+ public static final String WARNING = "WARNING"; //$NON-NLS-1$
+ public static final String INFO = "INFO"; //$NON-NLS-1$
+ public static final String DETAIL = "DETAIL"; //$NON-NLS-1$
+ public static final String TRACE = "TRACE"; //$NON-NLS-1$
+ public static final String NONE = "NONE"; //$NON-NLS-1$
+ static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$
+ }
+
+ /**
+ * Constants that define the types of the messages that are to be recorded
+ * by the LogManager.
+ */
+ public static class DisplayNames {
+ public static final String CRITICAL = "Critical"; //$NON-NLS-1$
+ public static final String ERROR = "Error"; //$NON-NLS-1$
+ public static final String WARNING = "Warning"; //$NON-NLS-1$
+ public static final String INFO = "Information"; //$NON-NLS-1$
+ public static final String DETAIL = "Detail"; //$NON-NLS-1$
+ public static final String TRACE = "Trace"; //$NON-NLS-1$
+ public static final String NONE = "None"; //$NON-NLS-1$
+ }
+
+ private static Map LABEL_TO_LEVEL_MAP = new HashMap();
+ private static Map DISPLAY_TO_LEVEL_MAP = new HashMap();
+ private static List LABELS = new ArrayList(MAXIMUM - MINIMUM + 1);
+ private static List DISPLAYS = new ArrayList(MAXIMUM - MINIMUM + 1);
+
+ static {
+ LABEL_TO_LEVEL_MAP.put(Labels.CRITICAL, new Integer(CRITICAL) );
+ LABEL_TO_LEVEL_MAP.put(Labels.ERROR, new Integer(ERROR) );
+ LABEL_TO_LEVEL_MAP.put(Labels.WARNING, new Integer(WARNING) );
+ LABEL_TO_LEVEL_MAP.put(Labels.INFO, new Integer(INFO) );
+ LABEL_TO_LEVEL_MAP.put(Labels.DETAIL, new Integer(DETAIL) );
+ LABEL_TO_LEVEL_MAP.put(Labels.TRACE, new Integer(TRACE) );
+ LABEL_TO_LEVEL_MAP.put(Labels.NONE, new Integer(NONE) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.CRITICAL, new Integer(CRITICAL) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.ERROR, new Integer(ERROR) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.WARNING, new Integer(WARNING) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.INFO, new Integer(INFO) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.DETAIL, new Integer(DETAIL) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.TRACE, new Integer(TRACE) );
+ DISPLAY_TO_LEVEL_MAP.put(DisplayNames.NONE, new Integer(NONE) );
+
+ // Do in the correct order so that the indexes match the levels
+ LABELS.add(Labels.NONE);
+ LABELS.add(Labels.CRITICAL);
+ LABELS.add(Labels.ERROR);
+ LABELS.add(Labels.WARNING);
+ LABELS.add(Labels.INFO);
+ LABELS.add(Labels.DETAIL);
+ LABELS.add(Labels.TRACE);
+ DISPLAYS.add(DisplayNames.NONE);
+ DISPLAYS.add(DisplayNames.CRITICAL);
+ DISPLAYS.add(DisplayNames.ERROR);
+ DISPLAYS.add(DisplayNames.WARNING);
+ DISPLAYS.add(DisplayNames.INFO);
+ DISPLAYS.add(DisplayNames.DETAIL);
+ DISPLAYS.add(DisplayNames.TRACE);
+ }
+
+ /**
+ * Utility method to set the level of messages that are recorded for this VM.
+ * @param newMessageLevel the new level; must be either
+ * <code>MessageLevel.NONE</code>,
+ * <code>MessageLevel.CRITICAL</code>,
+ * <code>MessageLevel.ERROR</code>,
+ * <code>MessageLevel.WARNING</code>,
+ * <code>MessageLevel.INFO</code>,
+ * <code>MessageLevel.DETAIL</code>, or
+ * <code>MessageLevel.TRACE.
+ * @throws IllegalArgumentException if the level is out of range.
+ */
+ public static boolean isMessageLevelValid( int newMessageLevel ) {
+ return !( newMessageLevel < MessageLevel.NONE || newMessageLevel > MessageLevel.TRACE );
+ }
+
+ /**
+ * Utility method for knowing what is the lower boundary for
+ * a valid message level.
+ * @return int message level
+ * @see #validUpperMessageLevel
+ */
+ public static int getValidLowerMessageLevel() {
+ return MessageLevel.NONE;
+ }
+
+ /**
+ * Utility method for knowing what is the upper boundary for
+ * a valid message level.
+ * @return int message level
+ * @see #validLowerMessageLevel
+ */
+ public static int getValidUpperMessageLevel() {
+ return MessageLevel.TRACE;
+ }
+
+ public static String getLabelForLevel( int level ) {
+ switch ( level ) {
+ case MessageLevel.NONE:
+ return Labels.NONE;
+ case MessageLevel.CRITICAL:
+ return Labels.CRITICAL;
+ case MessageLevel.ERROR:
+ return Labels.ERROR;
+ case MessageLevel.WARNING:
+ return Labels.WARNING;
+ case MessageLevel.INFO:
+ return Labels.INFO;
+ case MessageLevel.DETAIL:
+ return Labels.DETAIL;
+ case MessageLevel.TRACE:
+ return Labels.TRACE;
+ }
+ return Labels.UNKNOWN;
+ //throw new IllegalArgumentException("The specified message level \"" + level + "\" is invalid");
+ }
+
+ public static int getMinimumLevel() {
+ return MINIMUM;
+ }
+
+ public static int getMaximumLevel() {
+ return MAXIMUM;
+ }
+
+ public static Collection getDisplayNames() {
+ return DISPLAYS;
+ }
+
+
+ /**
+ * Utility method to get the labels for the levels, starting with the lowest
+ * level and ending with the highest level.
+ * @return an ordered list of String labels
+ */
+ public static List getLabels() {
+ return LABELS;
+ }
+
+
+
+}
+
Copied: trunk/connector-api/src/main/java/org/teiid/resource/ConnectorException.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorException.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/ConnectorException.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/ConnectorException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,79 @@
+/*
+ * 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.resource;
+
+import javax.resource.ResourceException;
+
+/**
+ * An exception the connector writer can return in case of an
+ * error while using the connector.
+ */
+public class ConnectorException extends ResourceException{
+
+ private static final long serialVersionUID = -5980862789340592219L;
+
+ /**
+ * No-arg constructor required by Externalizable semantics.
+ */
+ public ConnectorException() {
+ super();
+ }
+
+ /**
+ * Construct an instance with the message specified.
+ *
+ * @param message A message describing the exception
+ */
+ public ConnectorException( String message ) {
+ super( message );
+ }
+
+ public ConnectorException( String errorCode, String message ) {
+ super( message, errorCode);
+ }
+
+ public ConnectorException( int errorCode, String message ) {
+ super(message, Integer.toString(errorCode));
+ }
+
+
+ /**
+ * Construct an instance from a message and an exception to chain to this one.
+ *
+ * @param code A code denoting the exception
+ * @param e An exception to nest within this one
+ */
+ public ConnectorException( Throwable e, String message ) {
+ super(message,e);
+ }
+
+ /**
+ * Construct an instance with a linked exception specified.
+ *
+ * @param e An exception to chain to this exception
+ */
+ public ConnectorException( Throwable e ) {
+ super( e );
+ }
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/ConnectorException.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicConnectorCapabilities.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicConnectorCapabilities.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,380 @@
+/*
+ * 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.resource.adapter;
+
+import java.util.List;
+
+import org.teiid.resource.cci.ConnectorCapabilities;
+
+
+/**
+ * This class is a base implementation of the ConnectorCapabilities interface.
+ * It is implemented to return false for all capabilities. Subclass this base
+ * class and override any methods necessary to specify capabilities the
+ * connector actually supports.
+ */
+public class BasicConnectorCapabilities implements ConnectorCapabilities {
+
+ /**
+ * Construct the basic capabilities class.
+ */
+ public BasicConnectorCapabilities() {
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelectDistinct()
+ */
+ public boolean supportsSelectDistinct() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAliasedGroup()
+ */
+ public boolean supportsAliasedGroup() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelfJoins()
+ */
+ public boolean supportsSelfJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOuterJoins()
+ */
+ public boolean supportsOuterJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsFullOuterJoins()
+ */
+ public boolean supportsFullOuterJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsBetweenCriteria()
+ */
+ public boolean supportsBetweenCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
+ */
+ public boolean supportsCompareCriteriaEquals() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteria()
+ */
+ public boolean supportsLikeCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
+ */
+ public boolean supportsLikeCriteriaEscapeCharacter() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteria()
+ */
+ public boolean supportsInCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteriaSubquery()
+ */
+ public boolean supportsInCriteriaSubquery() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsIsNullCriteria()
+ */
+ public boolean supportsIsNullCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrCriteria()
+ */
+ public boolean supportsOrCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsNotCriteria()
+ */
+ public boolean supportsNotCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsExistsCriteria()
+ */
+ public boolean supportsExistsCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
+ */
+ public boolean supportsQuantifiedCompareCriteriaSome() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
+ */
+ public boolean supportsQuantifiedCompareCriteriaAll() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrderBy()
+ */
+ public boolean supportsOrderBy() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesSum()
+ */
+ public boolean supportsAggregatesSum() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesAvg()
+ */
+ public boolean supportsAggregatesAvg() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMin()
+ */
+ public boolean supportsAggregatesMin() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMax()
+ */
+ public boolean supportsAggregatesMax() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCount()
+ */
+ public boolean supportsAggregatesCount() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCountStar()
+ */
+ public boolean supportsAggregatesCountStar() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesDistinct()
+ */
+ public boolean supportsAggregatesDistinct() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsScalarSubqueries()
+ */
+ public boolean supportsScalarSubqueries() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCorrelatedSubqueries()
+ */
+ public boolean supportsCorrelatedSubqueries() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCaseExpressions()
+ */
+ public boolean supportsCaseExpressions() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSearchedCaseExpressions()
+ */
+ public boolean supportsSearchedCaseExpressions() {
+ return false;
+ }
+
+ /**
+ * Return null to indicate no functions are supported.
+ * @return null
+ * @see org.teiid.resource.cci.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ return null;
+ }
+
+ public boolean supportsInlineViews() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsUnions()
+ * @since 4.2
+ */
+ public boolean supportsUnions() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#getMaxInCriteriaSize()
+ * @since 4.2
+ */
+ public int getMaxInCriteriaSize() {
+ return -1;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return false;
+ }
+
+ public boolean supportsRowLimit() {
+ return false;
+ }
+
+ public boolean supportsRowOffset() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#getMaxFromGroups()
+ */
+ public int getMaxFromGroups() {
+ return -1; //-1 indicates no max
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsExcept()
+ */
+ public boolean supportsExcept() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsIntersect()
+ */
+ public boolean supportsIntersect() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsSetQueryOrderBy()
+ */
+ public boolean supportsSetQueryOrderBy() {
+ return false;
+ }
+
+ @Override
+ public boolean useAnsiJoin() {
+ return false;
+ }
+
+ @Override
+ public boolean requiresCriteria() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsBatchedUpdates() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsGroupBy() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsHaving() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInnerJoins() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsSelectExpression() {
+ return false;
+ }
+
+ @Override
+ public SupportedJoinCriteria getSupportedJoinCriteria() {
+ return SupportedJoinCriteria.ANY;
+ }
+
+ @Override
+ public boolean supportsCompareCriteriaOrdered() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsBulkUpdate() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsOrderByUnrelated() {
+ return false;
+ }
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecution.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicExecution.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecution.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,29 @@
+/*
+ * 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.resource.adapter;
+
+import org.teiid.resource.cci.Execution;
+
+public abstract class BasicExecution implements Execution {
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecution.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecutionFactory.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnector.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecutionFactory.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/adapter/BasicExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,219 @@
+package org.teiid.resource.adapter;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collection;
+import java.util.Properties;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.Execution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ExecutionFactory;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.resource.cci.TypeFacilityImpl;
+import org.teiid.resource.cci.UpdateExecution;
+import org.teiid.resource.spi.BasicManagedConnectionFactory;
+
+import com.metamatrix.core.MetaMatrixCoreException;
+import com.metamatrix.core.util.ReflectionHelper;
+import com.metamatrix.core.util.StringUtil;
+
+public class BasicExecutionFactory implements ExecutionFactory {
+
+ protected ConnectorCapabilities capabilities;
+ private static final TypeFacility TYPE_FACILITY = new TypeFacilityImpl();
+
+ private String capabilitiesClass;
+ private boolean immutable = false;
+ private boolean exceptionOnMaxRows = false;
+ private int maxResultRows = -1;
+ private boolean xaCapable;
+ private String overrideCapabilitiesFile;
+ private boolean sourceRequired = true;
+
+ @Override
+ public void start() throws ConnectorException {
+ }
+
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return BasicConnectorCapabilities.class;
+ }
+
+ @Override
+ public ConnectorCapabilities getCapabilities() throws ConnectorException {
+ if (capabilities == null) {
+ // create Capabilities
+ capabilities = BasicManagedConnectionFactory.getInstance(ConnectorCapabilities.class, getCapabilitiesClass(), null, getDefaultCapabilities());
+ }
+
+ // capabilities overload
+ Properties props = getOverrideCapabilities();
+ if (this.capabilities != null && props != null) {
+ this.capabilities = (ConnectorCapabilities) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {ConnectorCapabilities.class}, new CapabilitesOverloader(this.capabilities, props));
+ }
+ return capabilities;
+ }
+
+ @Override
+ public Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory) throws ConnectorException {
+ if (command instanceof QueryExpression) {
+ return createResultSetExecution((QueryExpression)command, executionContext, metadata, connectionFactory);
+ }
+ if (command instanceof Call) {
+ return createProcedureExecution((Call)command, executionContext, metadata, connectionFactory);
+ }
+ return createUpdateExecution(command, executionContext, metadata, connectionFactory);
+ }
+
+ public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ throw new ConnectorException("Unsupported Execution"); //$NON-NLS-1$
+ }
+
+ public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ throw new ConnectorException("Unsupported Execution");//$NON-NLS-1$
+ }
+
+ public UpdateExecution createUpdateExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ throw new ConnectorException("Unsupported Execution");//$NON-NLS-1$
+ }
+
+ // derived
+ private Properties overrideCapabilities;
+
+
+ @Override
+ public LanguageFactory getLanguageFactory() {
+ return LanguageFactory.INSTANCE;
+ }
+
+ @Override
+ public TypeFacility getTypeFacility() {
+ return TYPE_FACILITY;
+ }
+
+ @Override
+ public Properties getOverrideCapabilities() throws ConnectorException {
+ if (this.overrideCapabilities == null && getOverrideCapabilitiesFile() != null) {
+ try {
+ this.overrideCapabilities = new Properties();
+ this.overrideCapabilities.loadFromXML(this.getClass().getResourceAsStream(getOverrideCapabilitiesFile()));
+ } catch (IOException e) {
+ throw new ConnectorException(e);
+ }
+ }
+ return this.overrideCapabilities;
+ }
+
+ public static <T> T getInstance(Class<T> expectedType, String className, Collection ctorObjs, Class defaultClass) throws ConnectorException {
+ try {
+ if (className == null) {
+ if (defaultClass == null) {
+ throw new ConnectorException("Neither class name or default class specified to create an instance"); //$NON-NLS-1$
+ }
+ return expectedType.cast(defaultClass.newInstance());
+ }
+ return expectedType.cast(ReflectionHelper.create(className, ctorObjs, Thread.currentThread().getContextClassLoader()));
+ } catch (MetaMatrixCoreException e) {
+ throw new ConnectorException(e);
+ } catch (IllegalAccessException e) {
+ throw new ConnectorException(e);
+ } catch(InstantiationException e) {
+ throw new ConnectorException(e);
+ }
+ }
+ /**
+ * Overloads the connector capabilities with one defined in the connector binding properties
+ */
+ static final class CapabilitesOverloader implements InvocationHandler {
+ ConnectorCapabilities caps;
+ Properties properties;
+
+ CapabilitesOverloader(ConnectorCapabilities caps, Properties properties){
+ this.caps = caps;
+ this.properties = properties;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ String value = this.properties.getProperty(method.getName());
+ if (value == null || value.trim().length() == 0 || (args != null && args.length != 0)) {
+ return method.invoke(this.caps, args);
+ }
+ return StringUtil.valueOf(value, method.getReturnType());
+ }
+ }
+
+ @Override
+ public String getCapabilitiesClass() {
+ return capabilitiesClass;
+ }
+
+ public void setCapabilitiesClass(String arg0) {
+ this.capabilitiesClass = arg0;
+ }
+
+ @Override
+ public boolean isImmutable() {
+ return immutable;
+ }
+
+ public void setImmutable(boolean arg0) {
+ this.immutable = arg0;
+ }
+
+ @Override
+ public boolean isExceptionOnMaxRows() {
+ return exceptionOnMaxRows;
+ }
+
+ public void setExceptionOnMaxRows(boolean arg0) {
+ this.exceptionOnMaxRows = arg0;
+ }
+
+ @Override
+ public int getMaxResultRows() {
+ return maxResultRows;
+ }
+
+ public void setMaxResultRows(int arg0) {
+ this.maxResultRows = arg0;
+ }
+
+ @Override
+ public boolean isXaCapable() {
+ return xaCapable;
+ }
+
+ public void setXaCapable(boolean arg0) {
+ this.xaCapable = arg0;
+ }
+
+ @Override
+ public String getOverrideCapabilitiesFile() throws ConnectorException {
+ return this.overrideCapabilitiesFile;
+ }
+
+
+ public void setOverrideCapabilitiesFile(String overrideCapabilitiesFile) {
+ this.overrideCapabilitiesFile = overrideCapabilitiesFile;
+ }
+
+ @Override
+ public boolean isSourceRequired() {
+ return sourceRequired;
+ }
+
+ public void setSourceRequired(boolean value) {
+ this.sourceRequired = value;
+ }
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/CacheScope.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/CacheScope.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/CacheScope.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/CacheScope.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,46 @@
+/*
+ * 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.resource.cci;
+
+import java.io.Serializable;
+
+/**
+ * Cache Scope
+ *
+ * REQUEST - Items placed in this scope are retained until the end of the top level request. The items to be placed
+ * does not need to implement {@link Serializable}, however recommended. These items are not replicated across the cluster.
+ * SERVICE - Items from this scope are available to the identified connector
+ *
+ * All the items placed in the below scopes must be {@link Serializable}, as they are replicated across cluster.
+ *
+ * SESSION - Items placed in the scope retained until the particular User's session of top level request is alive.
+ * VDB - Items placed with this scope retained until the life of the VDB;
+ *
+ * GLOBAL - Items placed in this will available to all until the Query Service is recycled.
+ */
+public enum CacheScope {
+ REQUEST,
+ SERVICE,
+ SESSION,
+ VDB,
+ GLOBAL;
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/CacheScope.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/ConnectorCapabilities.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/ConnectorCapabilities.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/ConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,394 @@
+/*
+ * 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.resource.cci;
+
+import java.util.List;
+
+import org.teiid.connector.language.BatchedUpdates;
+import org.teiid.connector.language.SetQuery;
+
+
+/**
+ * Allows a connector to specify the capabilities that a connector
+ * supports.
+ */
+public interface ConnectorCapabilities {
+
+ public enum SupportedJoinCriteria {
+ /**
+ * Indicates that any supported criteria is allowed.
+ */
+ ANY,
+ /**
+ * Indicates that any simple comparison of elements is allowed.
+ */
+ THETA,
+ /**
+ * Indicates that only equality predicates of elements are allowed.
+ */
+ EQUI,
+ /**
+ * Indicates that only equality predicates between
+ * exactly one primary and foreign key is allowed per join.
+ */
+ KEY
+ }
+
+ /**
+ * Support indicates connector can accept queries with SELECT DISTINCT
+ * @since 3.1 SP2
+ */
+ boolean supportsSelectDistinct();
+
+ /**
+ * Support indicates connector can accept expressions other than element
+ * symbols in the SELECT clause. Specific supports for the expression
+ * type are still checked.
+ * @since 6.1.0
+ */
+ boolean supportsSelectExpression();
+
+ /**
+ * Support indicates connector can accept groups with aliases
+ * @since 3.1 SP2
+ */
+ boolean supportsAliasedGroup();
+
+ /**
+ * Get the supported join criteria. A null return value will be treated
+ * as {@link SupportedJoinCriteria#ANY}
+ * @since 6.1.0
+ */
+ SupportedJoinCriteria getSupportedJoinCriteria();
+
+ /**
+ * Support indicates connector can accept inner or cross joins
+ * @since 6.1.0
+ */
+ boolean supportsInnerJoins();
+
+ /**
+ * Support indicates connector can accept self-joins where a
+ * group is joined to itself with aliases. Connector must also support
+ * {@link #supportsAliasedGroup()}.
+ * @since 3.1 SP2
+ */
+ boolean supportsSelfJoins();
+
+ /**
+ * Support indicates connector can accept left outer joins
+ * @since 3.1 SP2
+ */
+ boolean supportsOuterJoins();
+
+ /**
+ * Support indicates connector can accept full outer joins
+ * @since 3.1 SP2
+ */
+ boolean supportsFullOuterJoins();
+
+ /**
+ * Support indicates connector can accept inline views (subqueries
+ * in the FROM clause).
+ * @since 4.1
+ */
+ boolean supportsInlineViews();
+
+ /**
+ * Support indicates connector accepts criteria of form (element BETWEEN constant AND constant)
+ * <br>NOT CURRENTLY USED - between is rewritten as compound compare criteria
+ * @since 4.0
+ */
+ boolean supportsBetweenCriteria();
+
+ /**
+ * Support indicates connector accepts criteria of form (element = constant)
+ * @since 3.1 SP2
+ */
+ boolean supportsCompareCriteriaEquals();
+
+ /**
+ * Support indicates connector accepts criteria of form (element <=|>= constant)
+ * <br>The query engine will may pushdown queries containing < or > if NOT is also
+ * supported.
+ * @since 3.1 SP2
+ */
+ boolean supportsCompareCriteriaOrdered();
+
+ /**
+ * Support indicates connector accepts criteria of form (element LIKE constant)
+ * @since 3.1 SP2
+ */
+ boolean supportsLikeCriteria();
+
+ /**
+ * Support indicates connector accepts criteria of form (element LIKE constant ESCAPE char)
+ * @since 3.1 SP2
+ */
+ boolean supportsLikeCriteriaEscapeCharacter();
+
+ /**
+ * Support indicates connector accepts criteria of form (element IN set)
+ * @since 3.1 SP2
+ */
+ boolean supportsInCriteria();
+
+ /**
+ * Support indicates connector accepts IN criteria with a subquery on the right side
+ * @since 4.0
+ */
+ boolean supportsInCriteriaSubquery();
+
+ /**
+ * Support indicates connector accepts criteria of form (element IS NULL)
+ * @since 3.1 SP2
+ */
+ boolean supportsIsNullCriteria();
+
+ /**
+ * Support indicates connector accepts logical criteria connected by OR
+ * @since 3.1 SP2
+ */
+ boolean supportsOrCriteria();
+
+ /**
+ * Support indicates connector accepts logical criteria NOT
+ * @since 3.1 SP2
+ */
+ boolean supportsNotCriteria();
+
+ /**
+ * Support indicates connector accepts the EXISTS criteria
+ * @since 4.0
+ */
+ boolean supportsExistsCriteria();
+
+ /**
+ * Support indicates connector accepts the quantified comparison criteria that
+ * use SOME
+ * @since 4.0
+ */
+ boolean supportsQuantifiedCompareCriteriaSome();
+
+ /**
+ * Support indicates connector accepts the quantified comparison criteria that
+ * use ALL
+ * @since 4.0
+ */
+ boolean supportsQuantifiedCompareCriteriaAll();
+
+ /**
+ * Support indicates connector accepts ORDER BY clause, including multiple elements
+ * and ascending and descending sorts.
+ * @since 3.1 SP2
+ */
+ boolean supportsOrderBy();
+
+ /**
+ * Support indicates connector accepts ORDER BY clause with columns not from the select
+ * @since 6.2
+ * @return
+ */
+ boolean supportsOrderByUnrelated();
+
+ /**
+ * Whether the source supports an explicit GROUP BY clause
+ * @since 6.1
+ */
+ boolean supportsGroupBy();
+
+ /**
+ * Whether the source supports the HAVING clause
+ * @since 6.1
+ */
+ boolean supportsHaving();
+
+ /**
+ * Support indicates connector can accept the SUM aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesSum();
+
+ /**
+ * Support indicates connector can accept the AVG aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesAvg();
+
+ /**
+ * Support indicates connector can accept the MIN aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesMin();
+
+ /**
+ * Support indicates connector can accept the MAX aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesMax();
+
+ /**
+ * Support indicates connector can accept the COUNT aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesCount();
+
+ /**
+ * Support indicates connector can accept the COUNT(*) aggregate function
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesCountStar();
+
+ /**
+ * Support indicates connector can accept DISTINCT within aggregate functions
+ * @since 3.1 SP2
+ */
+ boolean supportsAggregatesDistinct();
+
+ /**
+ * Support indicates connector can accept scalar subqueries in the SELECT, WHERE, and
+ * HAVING clauses
+ * @since 4.0
+ */
+ boolean supportsScalarSubqueries();
+
+ /**
+ * Support indicates connector can accept correlated subqueries wherever subqueries
+ * are accepted
+ * @since 4.0
+ */
+ boolean supportsCorrelatedSubqueries();
+
+ /**
+ * Support indicates connector can accept queries with non-searched
+ * CASE <expression> WHEN <expression> ... END
+ * <br>NOT CURRENTLY USED - case is pushed down as searched case
+ * @since 4.0
+ */
+ boolean supportsCaseExpressions();
+
+ /**
+ * Support indicates connector can accept queries with searched CASE WHEN <criteria> ... END
+ * @since 4.0
+ */
+ boolean supportsSearchedCaseExpressions();
+
+ /**
+ * Support indicates that the connector supports the UNION of two queries.
+ * @since 4.2
+ */
+ boolean supportsUnions();
+
+ /**
+ * Support indicates that the connector supports an ORDER BY on a SetQuery.
+ * @since 5.6
+ */
+ boolean supportsSetQueryOrderBy();
+
+ /**
+ * Support indicates that the connector supports the INTERSECT of two queries.
+ * @since 5.6
+ */
+ boolean supportsIntersect();
+
+ /**
+ * Support indicates that the connector supports the EXCEPT of two queries.
+ * @since 5.6
+ */
+ boolean supportsExcept();
+
+ /**
+ * Get list of all supported function names. Arithmetic functions have names like
+ * "+".
+ * @since 3.1 SP3
+ */
+ List<String> getSupportedFunctions();
+
+ /**
+ * Get the integer value representing the number of values allowed in an IN criteria
+ * in the WHERE clause of a query
+ * @since 5.0
+ */
+ int getMaxInCriteriaSize();
+
+ /**
+ * <p>Support indicates that the connector supports functions in GROUP BY, such as:
+ * <code>SELECT dayofmonth(theDate), COUNT(*) FROM table GROUP BY dayofmonth(theDate)</code></p>
+ *
+ * <br>NOT CURRENTLY USED - group by expressions create an inline view for pushdown
+ * @since 5.0
+ */
+ boolean supportsFunctionsInGroupBy();
+
+ /**
+ * Gets whether the connector can limit the number of rows returned by a query.
+ * @since 5.0 SP1
+ */
+ boolean supportsRowLimit();
+
+ /**
+ * Gets whether the connector supports a SQL clause (similar to the LIMIT with an offset) that can return
+ * result sets that start in the middle of the resulting rows returned by a query
+ * @since 5.0 SP1
+ */
+ boolean supportsRowOffset();
+
+ /**
+ * The number of groups supported in the from clause. Added for a Sybase limitation.
+ * @since 5.6
+ * @return the number of groups supported in the from clause, or -1 if there is no limit
+ */
+ int getMaxFromGroups();
+
+ /**
+ * Whether the source prefers to use ANSI style joins.
+ * @since 6.0
+ */
+ boolean useAnsiJoin();
+
+ /**
+ * Whether the source supports queries without criteria.
+ * @since 6.0
+ */
+ boolean requiresCriteria();
+
+ /**
+ * Whether the source supports {@link BatchedUpdates}
+ * @since 6.0
+ */
+ boolean supportsBatchedUpdates();
+
+ /**
+ * Whether the source supports updates with multiple value sets
+ * @since 6.0
+ */
+ boolean supportsBulkUpdate();
+
+ /**
+ * Support indicates that the connector can accept INSERTs with
+ * values specified by an {@link SetQuery}.
+ * @since 6.1
+ */
+ boolean supportsInsertWithQueryExpression();
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/DataNotAvailableException.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/DataNotAvailableException.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/DataNotAvailableException.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/DataNotAvailableException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,47 @@
+/*
+ * 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.resource.cci;
+
+import com.metamatrix.core.MetaMatrixRuntimeException;
+
+/**
+ * Used by asynch connectors to indicate data is not available
+ * and results should be polled for after the given delay.
+ */
+public class DataNotAvailableException extends MetaMatrixRuntimeException {
+
+ private static final long serialVersionUID = 5569111182915674334L;
+
+ private long retryDelay = 0;
+
+ public DataNotAvailableException() {
+ }
+
+ public DataNotAvailableException(long retryDelay) {
+ this.retryDelay = retryDelay;
+ }
+
+ public long getRetryDelay() {
+ return retryDelay;
+ }
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/DataNotAvailableException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/Execution.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/Execution.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/Execution.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/Execution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,55 @@
+/*
+ * 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.resource.cci;
+
+import org.teiid.resource.ConnectorException;
+
+/**
+ * An execution represents the state and lifecycle for a particular
+ * command execution. The methods provided on this interface define
+ * standard lifecycle methods.
+ * When execution completes, the {@link #close()} will be called. If
+ * execution must be aborted, due to user or administrator action, the
+ * {@link #cancel()} will be called.
+ */
+public interface Execution {
+
+ /**
+ * Terminates the execution normally.
+ */
+ void close() throws ConnectorException;
+
+ /**
+ * Cancels the execution abnormally. This will happen via
+ * a different thread from the one performing the execution, so
+ * should be expected to happen in a multi-threaded scenario.
+ */
+ void cancel() throws ConnectorException;
+
+ /**
+ * Execute the associated command. Results will be retrieved through a specific sub-interface call.
+ * @throws ConnectorException
+ */
+ void execute() throws ConnectorException;
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionContext.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ExecutionContext.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionContext.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionContext.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,167 @@
+/*
+ * 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.resource.cci;
+
+import java.io.Serializable;
+
+import javax.security.auth.Subject;
+
+
+
+/**
+ * The security context provides information about the user context in which
+ * this query is being run.
+ *
+ * As of 4.2, the SecurityContext is a sub-interface of ExecutionContext such
+ * that both interfaces contain all of the methods from the prior independent
+ * interfaces. Thus, these interfaces can now be used interchangeably.
+ *
+ */
+public interface ExecutionContext {
+
+ /**
+ * Get the identifier for the current connector running the command
+ * @return Connector identifier; never null
+ */
+ String getConnectorIdentifier();
+
+ /**
+ * Get the identifier for the command being executed. This can be
+ * correlated back to identifiers exposed in other parts of the system.
+ * @return command identifier
+ */
+ String getRequestIdentifier();
+
+ /**
+ * This specifies the node id for the atomic request in the relational plan of query.
+ * when combined with the request identifier, uniquely identifies a command sent to a connector.
+ */
+ String getPartIdentifier();
+
+ /**
+ * Execution count defines an id; where every access to the connector from
+ * the server in a given command execution boundary is uniquely defined;
+ * Like for example in the case of "batched execution" of commands, each execution of
+ * command gets new identifier.
+ */
+ String getExecutionCountIdentifier();
+
+ /**
+ * Get the name of the VDB this query is being run against.
+ * @return VDB name, never null
+ */
+ String getVirtualDatabaseName();
+
+ /**
+ * Get the version of the VDB this query is being run against.
+ * @return VDB version, never null
+ */
+ int getVirtualDatabaseVersion();
+
+ /**
+ * Get the user for the user running this query.
+ * @return User, never null
+ */
+ Subject getSubject();
+
+ /**
+ * Get the trusted payload passed when the user statement was executed.
+ * Teiid has no knowledge about what the payload contains - it is merely
+ * passed through the system. It is most often used to pass security
+ * information such as credentials.
+ *
+ * <p>Given that the Execution Payload is not authenticated by the Teiid
+ * system, connector writers are responsible for ensuring its validity. </p>
+ *
+ * @return Trusted execution payload if one exists, otherwise null
+ * @since 4.2
+ */
+ Serializable getExecutionPayload();
+
+ /**
+ * Get the identifier for the connection through which
+ * the command is being executed. This represents the original JDBC user
+ * connection to the Teiid system
+ * @return Connection identifier
+ */
+ String getConnectionIdentifier();
+
+ /**
+ * When the execution is turned on with "alive=true", the execution object will not
+ * be implicitly closed at the end of the last batch. It will only be closed at end
+ * of the user query. This is useful in keeping the connection open for
+ * LOB (clob/blob/xml) streaming.
+ * @param alive
+ */
+ void keepExecutionAlive(boolean alive);
+
+ /**
+ * Return the current connector batch size. This may be used as a hint to the underlying source query.
+ * @return the Connector batch size.
+ */
+ int getBatchSize();
+
+ /**
+ * Add an exception as a warning to this Execution.
+ * @param ex
+ */
+ void addWarning(Exception ex);
+
+ /**
+ * Flag indicates that the operation needs to be executed in a XA transaction.
+ * @return
+ */
+ boolean isTransactional();
+
+ /**
+ * Get a item that has been placed previously from cache. If no such object then a null will be returned.
+ * The item is placed in {@link CacheScope.REQUEST} scope.
+ * @param key
+ * @return
+ */
+ Object get(Object key);
+
+ /**
+ * Place a item in the Cache in {@link CacheScope.REQUEST} scope.
+ * @param key
+ * @param value
+ */
+ void put(Object key, Object value);
+
+ /**
+ * Get a item that has been placed previously from cache. If no such object then a null will be returned. The item looked
+ * up in the specified scope.
+ * @param scope
+ * @param key
+ * @return
+ */
+ Object getFromCache(CacheScope scope, Object key);
+
+ /**
+ * Place a item in the Cache in the given scope.
+ * @param scope
+ * @param key
+ * @param value
+ */
+ void storeInCache(CacheScope scope, Object key, Object value);
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionContext.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionFactory.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/Connector.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionFactory.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/ExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,134 @@
+/*
+ * 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.resource.cci;
+
+import java.util.Properties;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+
+
+
+/**
+ * <p>The primary entry point for a Connector. This interface should be implemented
+ * by the connector writer.</p>
+ *
+ * <p>The JCA Container will instantiate the implementation of this class. Once the class has been
+ * instantiated, the {@link #start()} method will be called
+ * with all necessary connector properties. </p>
+ */
+public interface ExecutionFactory {
+
+ /**
+ * Initialize the connector with supplied configuration
+ */
+ void start() throws ConnectorException;
+
+ /**
+ * Capabilities Class Name
+ * @return
+ */
+ @TranslatorProperty(name="capabilities-class", display="Connector Capabilities",description="The class to use to provide the Connector Capabilities")
+ public String getCapabilitiesClass();
+
+ /**
+ * Defines if the Connector is read-only connector
+ * @return
+ */
+ @TranslatorProperty(name="immutable", display="Is Immutable",description="Is Immutable, True if the source never changes.",advanced=true, defaultValue="false")
+ public boolean isImmutable();
+
+ /**
+ * Throw exception if there are more rows in the result set than specified in the MaxResultRows setting.
+ * @return
+ */
+ @TranslatorProperty(name="exception-on-max-rows", display="Exception on Exceeding Max Rows",description="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",advanced=true, defaultValue="true")
+ public boolean isExceptionOnMaxRows();
+
+ /**
+ * Maximum result set rows to fetch
+ * @return
+ */
+ @TranslatorProperty(name="max-result-rows", display="Maximum Result Rows", description="Maximum Result Rows allowed", advanced=true, defaultValue="-1")
+ public int getMaxResultRows();
+
+ /**
+ * Shows the XA transaction capability of the Connector.
+ * @return
+ */
+ @TranslatorProperty(name="xa-capable", display="Is XA Capable", description="True, if this connector supports XA Transactions", defaultValue="false")
+ public boolean isXaCapable();
+
+ /**
+ * Get the Override capabilities for the connector
+ * @return
+ */
+ @TranslatorProperty(name="override-capabilities-file", display="Override capabilities file", description="Property file that defines the override capability properties")
+ String getOverrideCapabilitiesFile() throws ConnectorException;
+
+ /**
+ * Flag that indicates if a underlying source connection required for this execution factory to work
+ * @return
+ */
+ @TranslatorProperty(name="source-required", display="Source Connection Required", description="Flag that indicates, a source required for the translator to work", readOnly= true)
+ boolean isSourceRequired();
+
+ /**
+ * Obtain a reference to the default LanguageFactory that can be used to construct
+ * new language interface objects. This is typically needed when modifying the language
+ * objects passed to the connector or for testing when objects need to be created.
+ */
+ LanguageFactory getLanguageFactory();
+
+ /**
+ * Obtain a reference to the type facility, which can be used to perform many type
+ * conversions supplied by the Connector API.
+ */
+ TypeFacility getTypeFacility();
+
+ /**
+ * Get the Override capabilities for the connector
+ * @return
+ */
+ Properties getOverrideCapabilities() throws ConnectorException;
+
+ /**
+ * Get the capabilities of this connector. The capabilities affect what kinds of
+ * queries (and other commands) will be sent to the connector.
+ * @return ConnectorCapabilities
+ */
+ ConnectorCapabilities getCapabilities() throws ConnectorException;
+
+ /**
+ * Create an execution object for the specified command
+ * @param command the command
+ * @param executionContext Provides information about the context that this command is
+ * executing within, such as the identifiers for the command being executed
+ * @param metadata Access to runtime metadata if needed to translate the command
+ * @param connection connection factory object to the data source
+ * @return An execution object that can use to execute the command
+ */
+ Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory) throws ConnectorException;
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/MetadataProvider.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/MetadataProvider.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/MetadataProvider.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/MetadataProvider.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,32 @@
+/*
+ * 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.resource.cci;
+
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.resource.ConnectorException;
+
+public interface MetadataProvider {
+
+ void getConnectorMetadata(MetadataFactory metadataFactory, Object connectionFactory) throws ConnectorException;
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/MetadataProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/ProcedureExecution.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ProcedureExecution.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/ProcedureExecution.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/ProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,45 @@
+/*
+ * 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.resource.cci;
+
+import java.util.List;
+
+import org.teiid.connector.language.Call;
+import org.teiid.resource.ConnectorException;
+
+/**
+ * The procedure execution represents the case where a connector can execute a
+ * {@link Call}. The output may include 0 or more output parameters and
+ * optionally a result set.
+ */
+public interface ProcedureExecution extends ResultSetExecution {
+
+ /**
+ * Get the output parameter values. Results should place the return parameter
+ * first if it is present, then the IN/OUT and OUT parameters should follow in
+ * the order they appeared in the command.
+ * @throws ConnectorException If an error occurs while retrieving the output value
+ */
+ List<?> getOutputParameterValues() throws ConnectorException;
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/ResultSetExecution.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ResultSetExecution.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/ResultSetExecution.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/ResultSetExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,46 @@
+/*
+ * 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.resource.cci;
+
+import java.util.List;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.resource.ConnectorException;
+
+/**
+ * Defines an execution for {@link QueryExpression}s and {@link Call}s that
+ * returns a resultset, which is represented through the iterator method
+ * {@link #next()}.
+ */
+public interface ResultSetExecution extends Execution {
+
+ /**
+ * Retrieves the next row of the resultset.
+ * @return the next row or null indicating that there are no more results
+ * @throws ConnectorException
+ * @throws DataNotAvailableException
+ */
+ List<?> next() throws ConnectorException, DataNotAvailableException;
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/ResultSetExecution.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/SourceSystemFunctions.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/SourceSystemFunctions.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/SourceSystemFunctions.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/SourceSystemFunctions.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,144 @@
+/*
+ * 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.resource.cci;
+
+/**
+ * Constants for all the possible standard system push down functions.
+ * The names and function forms follow the Open Group CLI functions, with a few exceptions
+ * (such as lpad, rpad, bitand, bitor, etc. which are most notably supported by Oracle).
+ *
+ */
+public class SourceSystemFunctions {
+
+ //arithmetic
+ public static final String MULTIPLY_OP = "*"; //$NON-NLS-1$
+ public static final String ADD_OP = "+"; //$NON-NLS-1$
+ public static final String SUBTRACT_OP = "-"; //$NON-NLS-1$
+ public static final String DIVIDE_OP = "/"; //$NON-NLS-1$
+
+ //String
+ public static final String ASCII = "ascii"; //$NON-NLS-1$
+ public static final String CHAR = "char"; //$NON-NLS-1$
+ public static final String CONCAT = "concat"; //$NON-NLS-1$
+ //public static final String DIFFERENCE = "difference";
+ public static final String INITCAP = "initcap"; //$NON-NLS-1$
+ public static final String INSERT = "insert"; //$NON-NLS-1$
+ public static final String LCASE = "lcase"; //$NON-NLS-1$
+ public static final String LPAD = "lpad"; //$NON-NLS-1$
+ public static final String LEFT = "left"; //$NON-NLS-1$
+ public static final String LENGTH = "length"; //$NON-NLS-1$
+ public static final String LOCATE = "locate"; //$NON-NLS-1$
+ public static final String LTRIM = "ltrim"; //$NON-NLS-1$
+ public static final String REPEAT = "repeat"; //$NON-NLS-1$
+ public static final String REPLACE = "replace"; //$NON-NLS-1$
+ public static final String RIGHT = "right"; //$NON-NLS-1$
+ public static final String RPAD = "rpad"; //$NON-NLS-1$
+ public static final String RTRIM = "rtrim"; //$NON-NLS-1$
+ //public static final String SOUNDEX = "soundex";
+ public static final String SUBSTRING = "substring"; //$NON-NLS-1$
+ public static final String UCASE = "ucase"; //$NON-NLS-1$
+
+ //numeric
+ public static final String ABS = "abs"; //$NON-NLS-1$
+ public static final String ACOS = "acos"; //$NON-NLS-1$
+ public static final String ASIN = "asin"; //$NON-NLS-1$
+ public static final String ATAN = "atan"; //$NON-NLS-1$
+ public static final String ATAN2 = "atan2"; //$NON-NLS-1$
+ public static final String CEILING = "ceiling"; //$NON-NLS-1$
+ public static final String COS = "cos"; //$NON-NLS-1$
+ public static final String COT = "cot"; //$NON-NLS-1$
+ public static final String DEGREES = "degrees"; //$NON-NLS-1$
+ public static final String EXP = "exp"; //$NON-NLS-1$
+ public static final String FLOOR = "floor"; //$NON-NLS-1$
+ public static final String FORMATINTEGER = "formatinteger"; //$NON-NLS-1$
+ public static final String FORMATLONG = "formatlong"; //$NON-NLS-1$
+ public static final String FORMATDOUBLE = "formatdouble"; //$NON-NLS-1$
+ public static final String FORMATFLOAT = "formatfloat"; //$NON-NLS-1$
+ public static final String FORMATBIGINTEGER = "formatbiginteger"; //$NON-NLS-1$
+ public static final String FORMATBIGDECIMAL = "formatbigdecimal"; //$NON-NLS-1$
+ public static final String LOG = "log"; //$NON-NLS-1$
+ public static final String LOG10 = "log10"; //$NON-NLS-1$
+ public static final String MOD = "mod"; //$NON-NLS-1$
+ public static final String PARSEINTEGER = "parseinteger"; //$NON-NLS-1$
+ public static final String PARSELONG = "parselong"; //$NON-NLS-1$
+ public static final String PARSEDOUBLE = "parsedouble"; //$NON-NLS-1$
+ public static final String PARSEFLOAT = "parsefloat"; //$NON-NLS-1$
+ public static final String PARSEBIGINTEGER = "parsebiginteger"; //$NON-NLS-1$
+ public static final String PARSEBIGDECIMAL = "parsebigdecimal"; //$NON-NLS-1$
+ public static final String PI = "pi"; //$NON-NLS-1$
+ public static final String POWER = "power"; //$NON-NLS-1$
+ public static final String RADIANS = "radians"; //$NON-NLS-1$
+ public static final String RAND = "rand"; //$NON-NLS-1$
+ public static final String ROUND = "round"; //$NON-NLS-1$
+ public static final String SIGN = "sign"; //$NON-NLS-1$
+ public static final String SIN = "sin"; //$NON-NLS-1$
+ public static final String SQRT = "sqrt"; //$NON-NLS-1$
+ public static final String TAN = "tan"; //$NON-NLS-1$
+ public static final String TRANSLATE = "translate"; //$NON-NLS-1$
+ public static final String TRUNCATE = "truncate"; //$NON-NLS-1$
+
+ //bit
+ public static final String BITAND = "bitand"; //$NON-NLS-1$
+ public static final String BITOR = "bitor"; //$NON-NLS-1$
+ public static final String BITNOT = "bitnot"; //$NON-NLS-1$
+ public static final String BITXOR = "bitxor"; //$NON-NLS-1$
+
+ //date functions
+ public static final String CURDATE = "curdate"; //$NON-NLS-1$
+ public static final String CURTIME = "curtime"; //$NON-NLS-1$
+ public static final String DAYNAME = "dayname"; //$NON-NLS-1$
+ public static final String DAYOFMONTH = "dayofmonth"; //$NON-NLS-1$
+ public static final String DAYOFWEEK = "dayofweek"; //$NON-NLS-1$
+ public static final String DAYOFYEAR = "dayofyear"; //$NON-NLS-1$
+ public static final String FORMATTIMESTAMP = "formattimestamp"; //$NON-NLS-1$
+ public static final String HOUR = "hour"; //$NON-NLS-1$
+ public static final String MINUTE = "minute"; //$NON-NLS-1$
+ public static final String MODIFYTIMEZONE = "modifytimezone"; //$NON-NLS-1$
+ public static final String MONTH = "month"; //$NON-NLS-1$
+ public static final String MONTHNAME = "monthname"; //$NON-NLS-1$
+ public static final String NOW = "now"; //$NON-NLS-1$
+ public static final String PARSETIMESTAMP = "parsetimestamp"; //$NON-NLS-1$
+ public static final String QUARTER = "quarter"; //$NON-NLS-1$
+ public static final String SECOND = "second"; //$NON-NLS-1$
+ public static final String TIMESTAMPADD = "timestampadd"; //$NON-NLS-1$
+ public static final String TIMESTAMPCREATE = "timestampcreate"; //$NON-NLS-1$
+ public static final String TIMESTAMPDIFF = "timestampdiff"; //$NON-NLS-1$
+ public static final String WEEK = "week"; //$NON-NLS-1$
+ public static final String YEAR = "year"; //$NON-NLS-1$
+
+ //system functions
+ public static final String IFNULL = "ifnull"; //$NON-NLS-1$
+ public static final String COALESCE = "coalesce"; //$NON-NLS-1$
+ public static final String NULLIF = "nullif"; //$NON-NLS-1$
+
+ //conversion functions
+ public static final String CONVERT = "convert"; //$NON-NLS-1$
+
+ //xml
+ public static final String XPATHVALUE = "xpathvalue"; //$NON-NLS-1$
+ public static final String XSLTRANSFORM = "xsltransform"; //$NON-NLS-1$
+ public static final String XMLELEMENT = "xmlelement"; //$NON-NLS-1$
+ public static final String XMLCONCAT = "xmlconcat"; //$NON-NLS-1$
+ public static final String XMLCOMMENT = "xmlcomment"; //$NON-NLS-1$
+ public static final String XMLPI = "xmlpi"; //$NON-NLS-1$
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/SourceSystemFunctions.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connector-api/src/main/java/org/teiid/resource/cci/TranslatorProperty.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/TranslatorProperty.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/TranslatorProperty.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,68 @@
+/*
+ * 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.resource.cci;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+ at Inherited
+public @interface TranslatorProperty {
+
+ public static final String EMPTY_STRING = ""; //$NON-NLS-1$
+ public static final String GENERATED = "%GENERATED%"; //$NON-NLS-1$
+
+ // name of the property
+ String name() default GENERATED;
+
+ // type of the property
+ Class type() default java.lang.String.class;
+
+ // description
+ String description() default GENERATED;
+
+ // display name to be used in tools
+ String display() default GENERATED;
+
+ // is this mandatory property
+ boolean required() default false;
+
+ // is it modifiable
+ boolean readOnly() default false;
+
+ // is advanced?
+ boolean advanced() default false;
+
+ // should mask the values of this property in the tools
+ boolean masked() default false;
+
+ // if this represents a enum what are the legal values?
+ String[] allowed() default {};
+
+ // what is the default in the string form
+ String defaultValue() default EMPTY_STRING;
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/cci/TranslatorProperty.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacility.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/TypeFacility.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacility.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacility.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,123 @@
+/*
+ * 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.resource.cci;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.common.types.JDBCSQLTypeInfo;
+
+/**
+ */
+public abstract class TypeFacility {
+
+ public interface RUNTIME_TYPES {
+ public static final Class STRING = DataTypeManager.DefaultDataClasses.STRING;
+ public static final Class BOOLEAN = DataTypeManager.DefaultDataClasses.BOOLEAN;
+ public static final Class BYTE = DataTypeManager.DefaultDataClasses.BYTE;
+ public static final Class SHORT = DataTypeManager.DefaultDataClasses.SHORT;
+ public static final Class CHAR = DataTypeManager.DefaultDataClasses.CHAR;
+ public static final Class INTEGER = DataTypeManager.DefaultDataClasses.INTEGER;
+ public static final Class LONG = DataTypeManager.DefaultDataClasses.LONG;
+ public static final Class BIG_INTEGER = DataTypeManager.DefaultDataClasses.BIG_INTEGER;
+ public static final Class FLOAT = DataTypeManager.DefaultDataClasses.FLOAT;
+ public static final Class DOUBLE = DataTypeManager.DefaultDataClasses.DOUBLE;
+ public static final Class BIG_DECIMAL = DataTypeManager.DefaultDataClasses.BIG_DECIMAL;
+ public static final Class DATE = DataTypeManager.DefaultDataClasses.DATE;
+ public static final Class TIME = DataTypeManager.DefaultDataClasses.TIME;
+ public static final Class TIMESTAMP = DataTypeManager.DefaultDataClasses.TIMESTAMP;
+ public static final Class OBJECT = DataTypeManager.DefaultDataClasses.OBJECT;
+ public static final Class BLOB = DataTypeManager.DefaultDataClasses.BLOB;
+ public static final Class CLOB = DataTypeManager.DefaultDataClasses.CLOB;
+ public static final Class XML = DataTypeManager.DefaultDataClasses.XML;
+ }
+
+ public static final class RUNTIME_NAMES {
+ public static final String STRING = DataTypeManager.DefaultDataTypes.STRING;
+ public static final String BOOLEAN = DataTypeManager.DefaultDataTypes.BOOLEAN;
+ public static final String BYTE = DataTypeManager.DefaultDataTypes.BYTE;
+ public static final String SHORT = DataTypeManager.DefaultDataTypes.SHORT;
+ public static final String CHAR = DataTypeManager.DefaultDataTypes.CHAR;
+ public static final String INTEGER = DataTypeManager.DefaultDataTypes.INTEGER;
+ public static final String LONG = DataTypeManager.DefaultDataTypes.LONG;
+ public static final String BIG_INTEGER = DataTypeManager.DefaultDataTypes.BIG_INTEGER;
+ public static final String FLOAT = DataTypeManager.DefaultDataTypes.FLOAT;
+ public static final String DOUBLE = DataTypeManager.DefaultDataTypes.DOUBLE;
+ public static final String BIG_DECIMAL = DataTypeManager.DefaultDataTypes.BIG_DECIMAL;
+ public static final String DATE = DataTypeManager.DefaultDataTypes.DATE;
+ public static final String TIME = DataTypeManager.DefaultDataTypes.TIME;
+ public static final String TIMESTAMP = DataTypeManager.DefaultDataTypes.TIMESTAMP;
+ public static final String OBJECT = DataTypeManager.DefaultDataTypes.OBJECT;
+ public static final String NULL = DataTypeManager.DefaultDataTypes.NULL;
+ public static final String BLOB = DataTypeManager.DefaultDataTypes.BLOB;
+ public static final String CLOB = DataTypeManager.DefaultDataTypes.CLOB;
+ public static final String XML = DataTypeManager.DefaultDataTypes.XML;
+ }
+
+ /**
+ * Get the Class constant for the given String type name
+ */
+ public static Class<?> getDataTypeClass(String type) {
+ return DataTypeManager.getDataTypeClass(type);
+ }
+
+ /**
+ * Get the String constant for the given type class
+ */
+ public static String getDataTypeName(Class<?> type) {
+ return DataTypeManager.getDataTypeName(type);
+ }
+
+ /**
+ * Get the SQL type for the given runtime type Class constant
+ * @param type
+ * @return
+ */
+ public static final int getSQLTypeFromRuntimeType(Class<?> type) {
+ return JDBCSQLTypeInfo.getSQLTypeFromRuntimeType(type);
+ }
+
+ public static final String getDataTypeNameFromSQLType(int sqlType) {
+ return JDBCSQLTypeInfo.getTypeName(sqlType);
+ }
+
+ /**
+ * Convert the given value to the closest runtime type see {@link RUNTIME_TYPES}
+ * @param value
+ * @return
+ */
+ public abstract Object convertToRuntimeType(Object value);
+
+ /**
+ * Convert the given date to a target type, optionally adjusting its display
+ * for a given target Calendar.
+ * @param date
+ * @param initial
+ * @param target
+ * @param targetType
+ * @return
+ */
+ public abstract Object convertDate(java.util.Date date, TimeZone initial, Calendar target, Class targetType);
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacilityImpl.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/TypeFacilityImpl.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacilityImpl.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/TypeFacilityImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.resource.cci;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.common.util.TimestampWithTimezone;
+
+/**
+ */
+public class TypeFacilityImpl extends TypeFacility {
+
+ public TypeFacilityImpl() {
+ }
+
+ @Override
+ public Object convertToRuntimeType(Object value) {
+ return DataTypeManager.convertToRuntimeType(value);
+ }
+
+ @Override
+ public Object convertDate(Date date, TimeZone initial, Calendar target,
+ Class targetType) {
+ return TimestampWithTimezone.create(date, initial, target, targetType);
+ }
+
+}
Copied: trunk/connector-api/src/main/java/org/teiid/resource/cci/UpdateExecution.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/UpdateExecution.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/cci/UpdateExecution.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/cci/UpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,46 @@
+/*
+ * 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.resource.cci;
+
+import org.teiid.connector.language.BatchedUpdates;
+import org.teiid.connector.language.Delete;
+import org.teiid.connector.language.Insert;
+import org.teiid.connector.language.Update;
+import org.teiid.resource.ConnectorException;
+
+
+/**
+ * The update execution represents the case where a connector can
+ * execute an {@link Insert}, {@link Update}, {@link Delete}, or {@link BatchedUpdates} command.
+ */
+public interface UpdateExecution extends Execution {
+
+ /**
+ * Returns the update counts for the execution.
+ * @return the update counts corresponding to the command executed
+ * @throws DataNotAvailableException
+ * @throws ConnectorException
+ */
+ int[] getUpdateCounts() throws DataNotAvailableException, ConnectorException;
+
+}
Added: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnection.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnection.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,53 @@
+/*
+ * 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.resource.spi;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionMetaData;
+import javax.resource.cci.Interaction;
+import javax.resource.cci.LocalTransaction;
+import javax.resource.cci.ResultSetInfo;
+
+public abstract class BasicConnection implements Connection {
+
+ @Override
+ public Interaction createInteraction() throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$
+ }
+
+ @Override
+ public LocalTransaction getLocalTransaction() throws ResourceException {
+ return null;
+ }
+
+ @Override
+ public ConnectionMetaData getMetaData() throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$
+ }
+
+ @Override
+ public ResultSetInfo getResultSetInfo() throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$
+ }
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnectionFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnectionFactory.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,40 @@
+package org.teiid.resource.spi;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionFactory;
+import javax.resource.cci.ConnectionSpec;
+import javax.resource.cci.RecordFactory;
+import javax.resource.cci.ResourceAdapterMetaData;
+
+public abstract class BasicConnectionFactory implements ConnectionFactory {
+ private static final long serialVersionUID = 2900581028589520388L;
+ private Reference reference;
+
+ @Override
+ public Connection getConnection(ConnectionSpec arg0) throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$;
+ }
+
+ @Override
+ public ResourceAdapterMetaData getMetaData() throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$;
+ }
+
+ @Override
+ public RecordFactory getRecordFactory() throws ResourceException {
+ throw new ResourceException("This operation not supported"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void setReference(Reference arg0) {
+ this.reference = arg0;
+ }
+
+ @Override
+ public Reference getReference() throws NamingException {
+ return this.reference;
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicConnectionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnection.java (from rev 2084, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnection.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnection.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,165 @@
+/*
+ * 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.resource.spi;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import javax.resource.spi.ConnectionEvent;
+import javax.resource.spi.ConnectionEventListener;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.LocalTransaction;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionMetaData;
+import javax.security.auth.Subject;
+import javax.transaction.xa.XAResource;
+
+import org.teiid.resource.ConnectorException;
+
+public class BasicManagedConnection implements ManagedConnection {
+ protected PrintWriter log;
+ protected final Collection<ConnectionEventListener> listeners = new ArrayList<ConnectionEventListener>();
+ private Connection physicalConnection;
+ private final Set<WrappedConnection> handles = new HashSet<WrappedConnection>();
+
+ public BasicManagedConnection(Connection connection) {
+ this.physicalConnection = connection;
+ }
+
+ @Override
+ public void associateConnection(Object handle) throws ResourceException {
+ if (!(handle instanceof WrappedConnection)) {
+ throw new ResourceException("Wrong connection supplied to assosiate"); //$NON-NLS-1$
+ }
+ ((WrappedConnection)handle).setManagedConnection(this);
+ synchronized (this.handles) {
+ this.handles.add((WrappedConnection)handle);
+ }
+ }
+
+ @Override
+ public void cleanup() throws ResourceException {
+ synchronized (this.handles) {
+ for (WrappedConnection wc:this.handles) {
+ wc.setManagedConnection(null);
+ }
+ handles.clear();
+ }
+ ConnectionContext.setSubject(null);
+ }
+
+ @Override
+ public void destroy() throws ResourceException {
+ cleanup();
+
+ this.physicalConnection.close();
+ this.physicalConnection = null;
+ }
+
+ @Override
+ public ManagedConnectionMetaData getMetaData() throws ResourceException {
+ return null;
+ }
+
+ @Override
+ public Object getConnection(Subject arg0, ConnectionRequestInfo arg1) throws ResourceException {
+ if(!(arg1 instanceof ConnectionRequestInfoWrapper)) {
+ throw new ConnectorException("Un-recognized Connection Request Info object received"); //$NON-NLS-1$
+ }
+ ConnectionContext.setSubject(arg0);
+
+ WrappedConnection wc = new WrappedConnection(this);
+ synchronized(this.handles) {
+ this.handles.add(wc);
+ }
+ return wc;
+ }
+
+ @Override
+ public LocalTransaction getLocalTransaction() throws ResourceException {
+ return null;
+ }
+
+ @Override
+ public XAResource getXAResource() throws ResourceException {
+ return null;
+ }
+
+ @Override
+ public void addConnectionEventListener(ConnectionEventListener arg0) {
+ synchronized (this.listeners) {
+ this.listeners.add(arg0);
+ }
+ }
+
+ @Override
+ public void removeConnectionEventListener(ConnectionEventListener arg0) {
+ synchronized (this.listeners) {
+ this.listeners.remove(arg0);
+ }
+ }
+
+ @Override
+ public void setLogWriter(PrintWriter arg0) throws ResourceException {
+ this.log = arg0;
+ }
+
+ @Override
+ public PrintWriter getLogWriter() throws ResourceException {
+ return this.log;
+ }
+
+ // called by the wrapped connection to notify the close of the connection.
+ void connectionClosed(WrappedConnection wc) {
+
+ synchronized (this.handles) {
+ handles.remove(wc);
+ }
+
+ ConnectionEvent ce = new ConnectionEvent(this, ConnectionEvent.CONNECTION_CLOSED);
+ ce.setConnectionHandle(wc);
+
+ ArrayList<ConnectionEventListener> copy = null;
+ synchronized (this.listeners) {
+ copy = new ArrayList<ConnectionEventListener>(this.listeners);
+ }
+
+ for(ConnectionEventListener l: copy) {
+ l.connectionClosed(ce);
+ }
+ }
+
+ Connection getConnection() throws ConnectorException {
+ if (this.physicalConnection == null)
+ throw new ConnectorException("Connection has been destroyed!!!"); //$NON-NLS-1$
+ return this.physicalConnection;
+ }
+
+ public boolean isValid() {
+ return true;
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnectionFactory.java (from rev 2084, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicManagedConnectionFactory.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnectionFactory.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,120 @@
+/*
+ * 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.resource.spi;
+
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterAssociation;
+import javax.resource.spi.ValidatingManagedConnectionFactory;
+import javax.security.auth.Subject;
+
+import org.teiid.resource.ConnectorException;
+
+import com.metamatrix.core.MetaMatrixCoreException;
+import com.metamatrix.core.util.ReflectionHelper;
+
+public abstract class BasicManagedConnectionFactory implements ManagedConnectionFactory, ResourceAdapterAssociation, ValidatingManagedConnectionFactory {
+
+ private static final long serialVersionUID = -7302713800883776790L;
+ private PrintWriter log;
+ private BasicResourceAdapter ra;
+
+ @Override
+ public abstract Object createConnectionFactory() throws ResourceException;
+
+ @Override
+ public Object createConnectionFactory(ConnectionManager arg0) throws ResourceException {
+ return createConnectionFactory();
+ }
+
+ @Override
+ public ManagedConnection createManagedConnection(Subject arg0, ConnectionRequestInfo arg1) throws ResourceException {
+ ConnectionRequestInfoWrapper criw = (ConnectionRequestInfoWrapper)arg1;
+ return new BasicManagedConnection(criw.cf.getConnection());
+ }
+
+ @Override
+ public PrintWriter getLogWriter() throws ResourceException {
+ return this.log;
+ }
+
+ @Override
+ public ManagedConnection matchManagedConnections(Set arg0, Subject arg1, ConnectionRequestInfo arg2) throws ResourceException {
+ return (ManagedConnection)arg0.iterator().next();
+ }
+
+ @Override
+ public void setLogWriter(PrintWriter arg0) throws ResourceException {
+ this.log = arg0;
+ }
+
+ @Override
+ public ResourceAdapter getResourceAdapter() {
+ return this.ra;
+ }
+
+ @Override
+ public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException {
+ this.ra = (BasicResourceAdapter)arg0;
+ }
+
+ public static <T> T getInstance(Class<T> expectedType, String className, Collection ctorObjs, Class defaultClass) throws ConnectorException {
+ try {
+ if (className == null) {
+ if (defaultClass == null) {
+ throw new ConnectorException("Neither class name or default class specified to create an instance"); //$NON-NLS-1$
+ }
+ return expectedType.cast(defaultClass.newInstance());
+ }
+ return expectedType.cast(ReflectionHelper.create(className, ctorObjs, Thread.currentThread().getContextClassLoader()));
+ } catch (MetaMatrixCoreException e) {
+ throw new ConnectorException(e);
+ } catch (IllegalAccessException e) {
+ throw new ConnectorException(e);
+ } catch(InstantiationException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public Set<BasicManagedConnection> getInvalidConnections(Set arg0) throws ResourceException {
+ HashSet<BasicManagedConnection> result = new HashSet<BasicManagedConnection>();
+ for (Object object : arg0) {
+ if (object instanceof BasicManagedConnection) {
+ BasicManagedConnection bmc = (BasicManagedConnection)object;
+ if (!bmc.isValid()) {
+ result.add(bmc);
+ }
+ }
+ }
+ return result;
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicManagedConnectionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicResourceAdapter.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicResourceAdapter.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicResourceAdapter.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicResourceAdapter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This 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 software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.teiid.resource.spi;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ActivationSpec;
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.endpoint.MessageEndpointFactory;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.xa.XAResource;
+
+public class BasicResourceAdapter implements ResourceAdapter {
+ BootstrapContext ctx;
+
+ @Override
+ public void endpointActivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) throws ResourceException {
+ throw new UnsupportedOperationException("not supported"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void endpointDeactivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) {
+ throw new UnsupportedOperationException("not supported"); //$NON-NLS-1$
+ }
+
+ @Override
+ public XAResource[] getXAResources(ActivationSpec[] specs) throws ResourceException {
+ return new XAResource[0];
+ }
+
+ @Override
+ public void start(BootstrapContext ctx) throws ResourceAdapterInternalException {
+ this.ctx = ctx;
+ }
+
+ @Override
+ public void stop() {
+ }
+
+ public WorkManager getWorkManager() {
+ return ctx.getWorkManager();
+ }
+
+ public XATerminator getXATerminator() {
+ return ctx.getXATerminator();
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/BasicResourceAdapter.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionContext.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectionContext.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionContext.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionContext.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,44 @@
+/*
+ * 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.resource.spi;
+
+import javax.security.auth.Subject;
+
+/**
+ * Thread local class to access the Subject in the Connector code. This is set just before the
+ * connector connection is created.
+ */
+public class ConnectionContext {
+ private static ThreadLocal<Subject> SUBJECT = new ThreadLocal<Subject>() {
+ protected Subject initialValue() {
+ return null;
+ }
+ };
+
+ public static Subject getSubject() {
+ return SUBJECT.get();
+ }
+
+ public static void setSubject(Subject subject) {
+ SUBJECT.set(subject);
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionContext.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionRequestInfoWrapper.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/ConnectionRequestInfoWrapper.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionRequestInfoWrapper.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionRequestInfoWrapper.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,33 @@
+/*
+ * 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.resource.spi;
+
+import javax.resource.cci.ConnectionFactory;
+import javax.resource.spi.ConnectionRequestInfo;
+
+class ConnectionRequestInfoWrapper implements ConnectionRequestInfo {
+ ConnectionFactory cf;
+
+ public ConnectionRequestInfoWrapper(ConnectionFactory cf) {
+ this.cf = cf;
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/ConnectionRequestInfoWrapper.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnection.java (from rev 2084, trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnection.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnection.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,73 @@
+/*
+ * 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.resource.spi;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionMetaData;
+import javax.resource.cci.Interaction;
+import javax.resource.cci.ResultSetInfo;
+
+public class WrappedConnection implements Connection {
+
+ private BasicManagedConnection mc;
+ boolean closed = false;
+
+ public WrappedConnection(BasicManagedConnection mc) {
+ this.mc = mc;
+ }
+
+ @Override
+ public void close() throws ResourceException {
+ if (!this.closed && this.mc != null) {
+ this.closed = true;
+ this.mc.connectionClosed(this);
+ this.mc = null;
+ }
+ }
+
+ // Called by managed connection for the connection management
+ void setManagedConnection(BasicManagedConnection mc) {
+ this.mc = mc;
+ }
+
+ @Override
+ public Interaction createInteraction() throws ResourceException {
+ return this.mc.getConnection().createInteraction();
+ }
+
+ @Override
+ public javax.resource.cci.LocalTransaction getLocalTransaction() throws ResourceException {
+ return this.mc.getConnection().getLocalTransaction();
+ }
+
+ @Override
+ public ConnectionMetaData getMetaData() throws ResourceException {
+ return this.mc.getConnection().getMetaData();
+ }
+
+ @Override
+ public ResultSetInfo getResultSetInfo() throws ResourceException {
+ return this.mc.getConnection().getResultSetInfo();
+ }
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnectionFactory.java (from rev 2071, trunk/connector-api/src/main/java/org/teiid/connector/basic/WrappedConnector.java)
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnectionFactory.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,81 @@
+/*
+ * 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.resource.spi;
+
+import java.io.Serializable;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.resource.Referenceable;
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionFactory;
+import javax.resource.cci.ConnectionSpec;
+import javax.resource.cci.RecordFactory;
+import javax.resource.cci.ResourceAdapterMetaData;
+import javax.resource.spi.ConnectionManager;
+
+public class WrappedConnectionFactory implements ConnectionFactory, Referenceable, Serializable {
+
+ private static final long serialVersionUID = 5499157394014613035L;
+ private ConnectionFactory delegate;
+ private ConnectionManager cm;
+ private BasicManagedConnectionFactory mcf;
+ private Reference reference;
+
+ public WrappedConnectionFactory(ConnectionFactory delegate, ConnectionManager cm, BasicManagedConnectionFactory mcf) {
+ this.delegate = delegate;
+ this.cm = cm;
+ this.mcf = mcf;
+ }
+
+ @Override
+ public Connection getConnection() throws ResourceException {
+ return (Connection)cm.allocateConnection(mcf, new ConnectionRequestInfoWrapper(this.delegate));
+ }
+
+
+ @Override
+ public void setReference(Reference arg0) {
+ this.reference = arg0;
+ }
+
+ @Override
+ public Reference getReference() throws NamingException {
+ return this.reference;
+ }
+
+ @Override
+ public Connection getConnection(ConnectionSpec arg0) throws ResourceException {
+ return getConnection();
+ }
+
+ @Override
+ public ResourceAdapterMetaData getMetaData() throws ResourceException {
+ return this.delegate.getMetaData();
+ }
+
+ @Override
+ public RecordFactory getRecordFactory() throws ResourceException {
+ return this.delegate.getRecordFactory();
+ }
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/resource/spi/WrappedConnectionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connector-api/src/test/java/org/teiid/connector/TestBasicExecutionFactory.java (from rev 2071, trunk/connector-api/src/test/java/org/teiid/connector/TestWrappedConnector.java)
===================================================================
--- trunk/connector-api/src/test/java/org/teiid/connector/TestBasicExecutionFactory.java (rev 0)
+++ trunk/connector-api/src/test/java/org/teiid/connector/TestBasicExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,61 @@
+/*
+ * 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.connector;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Properties;
+
+import org.junit.Test;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionFactory;
+
+
+public class TestBasicExecutionFactory {
+
+ @Test public void testConnectorCapabilitiesOverride() throws Exception {
+
+ ExecutionFactory c = new BasicExecutionFactory();
+ //Mockito.stub(c.getCapabilities()).toReturn(new BasicConnectorCapabilities());
+
+ ConnectorCapabilities caps = c.getCapabilities();
+ assertFalse(caps.supportsExistsCriteria());
+ assertFalse(caps.supportsExcept());
+
+
+ c = new BasicExecutionFactory() {
+ @Override
+ public Properties getOverrideCapabilities() {
+ Properties props = new Properties();
+ props.setProperty("supportsExistsCriteria", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+ props.setProperty("supportsExcept", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+ return props;
+ }
+ };
+
+ caps = c.getCapabilities();
+ assertTrue(caps.supportsExistsCriteria());
+ assertTrue(caps.supportsExcept());
+ }
+}
Property changes on: trunk/connector-api/src/test/java/org/teiid/connector/TestBasicExecutionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: trunk/connector-api/src/test/java/org/teiid/connector/TestWrappedConnector.java
===================================================================
--- trunk/connector-api/src/test/java/org/teiid/connector/TestWrappedConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connector-api/src/test/java/org/teiid/connector/TestWrappedConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,71 +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.connector;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Properties;
-
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-import org.teiid.connector.basic.WrappedConnector;
-
-
-public class TestWrappedConnector {
-
- @Test public void testConnectorCapabilitiesOverride() throws Exception {
-
- Connector c = Mockito.mock(Connector.class);
- Mockito.stub(c.getCapabilities()).toReturn(new BasicConnectorCapabilities());
- ConnectorEnvironment env = Mockito.mock(ConnectorEnvironment.class);
- Mockito.stub(c.getConnectorEnvironment()).toReturn(env);
-
- WrappedConnector connector = new WrappedConnector(c, null, null);
-
- ConnectorCapabilities caps = connector.getCapabilities();
- assertFalse(caps.supportsExistsCriteria());
- assertFalse(caps.supportsExcept());
-
-
- c = Mockito.mock(Connector.class);
- Mockito.stub(c.getCapabilities()).toReturn(new BasicConnectorCapabilities());
-
- connector = new WrappedConnector(c, null, null);
-
- Properties props = new Properties();
- props.setProperty("supportsExistsCriteria", "true"); //$NON-NLS-1$ //$NON-NLS-2$
- props.setProperty("supportsExcept", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-
- env = Mockito.mock(ConnectorEnvironment.class);
- Mockito.stub(env.getOverrideCapabilities()).toReturn(props);
- Mockito.stub(c.getConnectorEnvironment()).toReturn(env);
-
- caps = connector.getCapabilities();
- assertTrue(caps.supportsExistsCriteria());
- assertTrue(caps.supportsExcept());
- }
-}
Copied: trunk/connector-api/src/test/java/org/teiid/logging/TestLogManager.java (from rev 2083, trunk/engine/src/test/java/com/metamatrix/common/log/TestLogManager.java)
===================================================================
--- trunk/connector-api/src/test/java/org/teiid/logging/TestLogManager.java (rev 0)
+++ trunk/connector-api/src/test/java/org/teiid/logging/TestLogManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,165 @@
+/*
+ * 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.logging;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.teiid.logging.LogListener;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+
+import junit.framework.TestCase;
+
+
+/**
+ * This test case tests the LogManager.
+ */
+public class TestLogManager extends TestCase {
+
+ String context = "SomeContext"; //$NON-NLS-1$
+
+ /**
+ * Constructor for TestLogManager.
+ * @param name
+ */
+ public TestLogManager(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ ListLogger logger = new ListLogger();
+ logger.setLogLevel(context, MessageLevel.DETAIL);
+ LogManager.logListener = logger;
+ }
+
+ // =========================================================================
+ // T E S T C A S E S
+ // =========================================================================
+
+ /*
+ * Test for boolean isMessageToBeRecorded(String, int)
+ */
+ public void testIsMessageToBeRecordedString() {
+ assertTrue(LogManager.isMessageToBeRecorded(context, MessageLevel.CRITICAL) );
+
+ ListLogger cfg = (ListLogger)LogManager.logListener;
+ cfg.setLogLevel(context, MessageLevel.NONE);
+ assertFalse(LogManager.isMessageToBeRecorded(context, MessageLevel.CRITICAL) );
+ }
+
+ /**
+ * Test that all msgs logged are equal and output in same order.
+ */
+ public void testLogMessage() throws Exception {
+ ListLogger cfg = (ListLogger)LogManager.logListener;
+ cfg.setLogLevel(context, MessageLevel.INFO );
+
+ List<String> sentMsgList = new ArrayList<String>();
+ sentMsgList.add("A message 1"); //$NON-NLS-1$
+ sentMsgList.add("A message 2"); //$NON-NLS-1$
+ sentMsgList.add("A message 3"); //$NON-NLS-1$
+ sentMsgList.add("A message 4"); //$NON-NLS-1$
+ sentMsgList.add("A message 5"); //$NON-NLS-1$
+ sentMsgList.add("A message 6"); //$NON-NLS-1$
+
+ for (Iterator iter = sentMsgList.iterator(); iter.hasNext();) {
+ String msg = (String) iter.next();
+ LogManager.logInfo(context, msg);
+ }
+
+ List recevedMsgList = cfg.getLoggedMessages();
+ assertEquals(sentMsgList.size(), recevedMsgList.size());
+ assertEquals(sentMsgList, recevedMsgList);
+ }
+
+ /**
+ *
+ * A log listener that saves messages (IStatus)s in a
+ * List for later comparison.
+ */
+ class ListLogger implements LogListener {
+ private List<String> messages = new ArrayList<String>();
+ private Map<String, Integer> contextMap = new HashMap<String, Integer>();
+ private int defaultLevel;
+
+ public ListLogger() {
+ }
+
+ /* (non-Javadoc)
+ * @see com.metamatrix.core.log.LogListener#logMessage(org.eclipse.core.runtime.IStatus, long, java.lang.String, java.lang.String)
+ */
+ public void log(int level, String context, Object msg){
+ this.messages.add(msg.toString());
+ }
+
+ public void log(int level, String context, Throwable t, Object msg) {
+ this.messages.add(msg.toString());
+ }
+
+ /* (non-Javadoc)
+ * @see com.metamatrix.core.log.LogListener#shutdown()
+ */
+ public void shutdown() {
+ messages.clear();
+ messages = null;
+
+ }
+
+ public int size() {
+ return this.messages.size();
+ }
+
+ public List getLoggedMessages() {
+ return this.messages;
+ }
+
+ public Set<String> getContexts() {
+ return this.contextMap.keySet();
+ }
+
+ public int getLogLevel(String context) {
+ Integer level = this.contextMap.get(context);
+ if (level != null) {
+ return level;
+ }
+ return defaultLevel;
+ }
+
+ public void setLogLevel(String context, int logLevel) {
+ this.contextMap.put(context, logLevel);
+ }
+
+ @Override
+ public boolean isEnabled(String context, int msgLevel) {
+ int level = getLogLevel(context);
+ return level >= msgLevel;
+ }
+ }
+
+}
Modified: trunk/connectors/connector-ldap/pom.xml
===================================================================
--- trunk/connectors/connector-ldap/pom.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-ldap/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,15 +1,15 @@
<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">
- <parent>
- <artifactId>connectors</artifactId>
- <groupId>org.jboss.teiid</groupId>
- <version>7.0.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>connector-ldap</artifactId>
- <groupId>org.jboss.teiid.connectors</groupId>
- <name>LDAP Connector</name>
- <description>LDAP Connector</description>
- <packaging>rar</packaging>
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>connector-ldap</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>LDAP Connector</name>
+ <description>LDAP Connector</description>
+ <packaging>rar</packaging>
<dependencies>
<dependency>
@@ -23,12 +23,17 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>translator-ldap</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>javax.resource</groupId>
<artifactId>connector-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
-
<build>
<plugins>
<plugin>
@@ -51,7 +56,6 @@
<classifier>lib</classifier>
</configuration>
</execution>
-
</executions>
</plugin>
</plugins>
Copied: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap (from rev 2083, trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap)
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/IQueryToLdapSearchParser.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/IQueryToLdapSearchParser.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/IQueryToLdapSearchParser.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,656 +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.
- */
-
-/**
- * Utility class to handle the parsing of an IQuery object into all the relevant LDAP search
- * information. Uses LdapSearchDetails class to store this information and return the search details.
- * This class was intended for use by the execution classes that need to translate SQL. As new capabilities
- * are implemented, this class will be expanded to accommodate the appropriate SQL.
- *
- * This class should remove all the MMX-specific stuff, and turn it into something any
- * LDAP implementation can understand.
- *
- */
-
-package com.metamatrix.connector.ldap;
-
-import java.sql.Timestamp;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import javax.naming.NamingException;
-import javax.naming.directory.BasicAttribute;
-import javax.naming.directory.SearchControls;
-import javax.naming.ldap.SortKey;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.language.AggregateFunction;
-import org.teiid.connector.language.AndOr;
-import org.teiid.connector.language.ColumnReference;
-import org.teiid.connector.language.Comparison;
-import org.teiid.connector.language.Condition;
-import org.teiid.connector.language.DerivedColumn;
-import org.teiid.connector.language.Exists;
-import org.teiid.connector.language.Expression;
-import org.teiid.connector.language.Function;
-import org.teiid.connector.language.In;
-import org.teiid.connector.language.Like;
-import org.teiid.connector.language.Limit;
-import org.teiid.connector.language.Literal;
-import org.teiid.connector.language.NamedTable;
-import org.teiid.connector.language.Not;
-import org.teiid.connector.language.OrderBy;
-import org.teiid.connector.language.ScalarSubquery;
-import org.teiid.connector.language.SearchedCase;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.language.SortSpecification;
-import org.teiid.connector.language.TableReference;
-import org.teiid.connector.language.Comparison.Operator;
-import org.teiid.connector.language.SortSpecification.Ordering;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-import org.teiid.connector.metadata.runtime.Table;
-
-
-/**
- * Utility class which translates a SQL query into an LDAP search.
- */
-public class IQueryToLdapSearchParser {
- private RuntimeMetadata rm;
- private LDAPManagedConnectionFactory config;
-
- /**
- * Constructor.
- * @param logger the connector logger
- * @param rm the RuntimeMetadata
- */
- public IQueryToLdapSearchParser(RuntimeMetadata rm, LDAPManagedConnectionFactory config) {
- this.rm = rm;
- this.config = config;
- }
-
- /**
- * Public entry point to the parser.
- * Parses the IQuery object, and constructs an equivalent LDAP search filter,
- * keeping track of the attributes of interest.
- * Here are some example SQL queries, and the equivalent LDAP search info:
- * SQL: select cn, managerName from people_table where managerName LIKE "John%" and cn!="Mar()"
- * Context name: [people_table's NameInSource, e.g. (ou=people,dc=company,dc=com)]
- * LDAP attributes: (cn, String), (managerName, String)
- * LDAP search filter: (&(managerName="John*")(!(cn="Mar\(\)")))
- *
- * @param query the query
- * @return the LDAPSearchDetails object
- */
- // GHH 20080326 - added ability to restrict queries to only values where
- // objectClass = table name. This is done by adding a third parameter,
- // RESTRICT, to the NameInSource property in the model:
- // ou=people,dc=company,dc=com?SUBTREE_SCOPE?RESTRICT
- // TODO - change method for calling RESTRICT to also specify
- // object class name (RESTRICT=inetOrgPerson)
- public LDAPSearchDetails translateSQLQueryToLDAPSearch(Select query) throws ConnectorException {
- // Parse SELECT symbols.
- // The columns will be translated into LDAP attributes of interest.
- ArrayList attributeList = getAttributesFromSelectSymbols(query);
- ArrayList elementList = getElementsFromSelectSymbols(query);
-
- // Parse FROM table.
- // Only one table is expected here.
- List fromList = query.getFrom();
- Iterator itr = fromList.listIterator();
- if(!itr.hasNext()) {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.noTablesInFromError"); //$NON-NLS-1$
- this.config.getLogger().logError(msg);
- throw new ConnectorException(msg);
- }
- TableReference fItm = (TableReference)itr.next();
- if(itr.hasNext()) {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.multiItemsInFromError"); //$NON-NLS-1$
- this.config.getLogger().logError(msg);
- throw new ConnectorException(msg);
- }
- String contextName = getContextNameFromFromItem(fItm);
- int searchScope = getSearchScopeFromFromItem(fItm);
- // GHH 20080326 - added check for RESTRICT parameter in
- // NameInSource of from item
- String classRestriction = getRestrictToNamedClass(fItm);
-
- // Parse the WHERE clause.
- // Create an equivalent LDAP search filter.
- List searchStringList = new LinkedList();
- searchStringList = getSearchFilterFromWhereClause(query.getWhere(), searchStringList);
- String filter = new String();
- ListIterator filterItr = searchStringList.listIterator();
- while(filterItr.hasNext()) {
- filter += filterItr.next();
- }
- // GHH 20080326 - if there is a class restriction,
- // add it to the search filter
- if (classRestriction != null && classRestriction.trim().length()>0) {
- filter = "(&"+filter+"(objectClass="+classRestriction+"))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- }
-
- // Parse the ORDER BY clause.
- // Create an ordered sort list.
- OrderBy orderBy = (OrderBy)query.getOrderBy();
- // Referenced the JNDI standard...arguably, this should not be done inside this
- // class, and we should make our own key class. In practice, this makes things simpler.
- SortKey[] sortKeys = getSortKeysFromOrderByClause(orderBy);
-
- // Parse LIMIT clause.
- // Note that offsets are not supported.
- Limit limit = (Limit)query.getLimit();
- long countLimit = -1;
- if(limit != null) {
- countLimit = limit.getRowLimit();
- }
-
- // Create Search Details
- LDAPSearchDetails sd = new LDAPSearchDetails(contextName, searchScope, filter, attributeList, sortKeys, countLimit, elementList);
- // Search Details logging
- try {
- sd.printDetailsToLog(this.config.getLogger());
- } catch (NamingException nme) {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.searchDetailsLoggingError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
-
- return sd;
-
- }
-
- /**
- * get SortKeys from the supplied ORDERBY clause.
- * @param orderBy the OrderBy clause
- * @param the array of SortKeys
- */
- private SortKey[] getSortKeysFromOrderByClause(OrderBy orderBy) throws ConnectorException {
- SortKey[] sortKeys = null;
- if(orderBy != null) {
- List orderItems = orderBy.getSortSpecifications();
- if(orderItems == null) {
- return null;
- }
- SortKey sortKey = null;
- sortKeys = new SortKey[orderItems.size()];
- Iterator orderItr = orderItems.iterator();
- int i = 0;
- while(orderItr.hasNext()) {
- SortSpecification item = (SortSpecification)orderItr.next();
- if(item != null) {
- String itemName = getExpressionString((Expression)item.getExpression());
- this.config.getLogger().logTrace("Adding sort key for item: " + itemName); //$NON-NLS-1$
- if(item.getOrdering() == Ordering.ASC) {
- this.config.getLogger().logTrace("with ASC ordering."); //$NON-NLS-1$
- sortKey = new SortKey(itemName, true, null);
- } else if(item.getOrdering() == Ordering.DESC){
- this.config.getLogger().logTrace("with DESC ordering."); //$NON-NLS-1$
- sortKey = new SortKey(itemName, false, null);
- }
- }
- sortKeys[i] = sortKey;
- i++;
- }
-
- } else {
- // Insert a default? No, allow the Execution to do this. Just return a null list.
- }
- return sortKeys;
- }
-
- /**
- * Utility method to pull the name in source (or, base DN/context name) from the table.
- * @param fromItem
- * @return name in source
- */
- // GHH 20080409 - changed to fall back on new connector property
- // for default base DN if available
- private String getContextNameFromFromItem(TableReference fromItem) throws ConnectorException {
- String nameInSource;
- String contextName;
-
- // TODO: Re-use the getExpressionString method if possible, rather than
- // rewriting the same code twice.
- if(fromItem instanceof NamedTable) {
- Table group = ((NamedTable)fromItem).getMetadataObject();
- nameInSource = group.getNameInSource();
- // if NameInSource is null set it to an empty
- // string instead so we can safely call split on it
- if(nameInSource == null) {
- nameInSource = ""; //$NON-NLS-1$
- }
- // now split it on ? to find the part of it that specifies context name
- String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
- contextName = nameInSourceArray[0];
- // if there is no context name specified
- // try the default in the connector properties
- if(contextName.equals("")) { //$NON-NLS-1$
- contextName = this.config.getSearchDefaultBaseDN();
- }
- } else {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- // if the context name is not specified either in Name in Source
- // or in the default connector properties it'll be either
- // null or an empty string
- if(contextName == null || contextName.equals("")) { //$NON-NLS-1$
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.baseContextNameError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- return contextName;
-
- }
-
- // GHH 20080326 - added below method to check for RESTRICT parameter in
- // from item's NameInSource, and if true return name (not NameInSource)
- // of from item as the objectClass name on to which the query should
- // be restricted
- private String getRestrictToNamedClass(TableReference fromItem) throws ConnectorException {
- String nameInSource;
- String namedClass = null;
- if(fromItem instanceof NamedTable) {
- // Here we use slightly different logic than in
- // getContextNameFromFromItem so it is easier to get
- // the group name later if needed
- Table mdIDGroup = ((NamedTable)fromItem).getMetadataObject();
- nameInSource = mdIDGroup.getNameInSource();
- // groupName = mdIDGroup.getName();
- // if NameInSource is null set it to an empty
- // string instead so we can safely call split on it
- if(nameInSource == null) {
- nameInSource = ""; //$NON-NLS-1$
- }
- // now split it on ? to find the part of it that specifies the objectClass we should restrict on
- String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
- if(nameInSourceArray.length >= 3) {
- namedClass = nameInSourceArray[2];
- }
- // if there is no specification in the Name In Source,
- // see if the connector property is set to true. If
- // it is, use the Name of the class for the restriction.
- if(namedClass == null || namedClass.equals("")) { //$NON-NLS-1$
- if (!this.config.isRestrictToObjectClass()) { //$NON-NLS-1$
- namedClass = ""; //$NON-NLS-1$
- } else {
- namedClass = mdIDGroup.getName();
- }
- }
- } else {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- return namedClass;
- }
-
- private int getSearchScopeFromFromItem(TableReference fromItem) throws ConnectorException {
- String searchScopeString = ""; //$NON-NLS-1$
- int searchScope = LDAPConnectorConstants.ldapDefaultSearchScope;
- // TODO: Re-use the getExpressionString method if possible, rather than
- // rewriting the same code twice.
- if(fromItem instanceof NamedTable) {
- Table group = ((NamedTable)fromItem).getMetadataObject();
- String nameInSource = group.getNameInSource();
- // if NameInSource is null set it to an empty
- // string instead so we can safely call split on it
- if(nameInSource == null) {
- nameInSource = ""; //$NON-NLS-1$
- }
- // now split it on ? to find the part of it that specifies search scope
- String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
- if(nameInSourceArray.length >= 2) {
- searchScopeString = nameInSourceArray[1];
- }
- // if there is no search scope specified
- // try the default in the connector properties
- if(searchScopeString.equals("")) { //$NON-NLS-1$
- searchScopeString = this.config.getSearchDefaultScope();
- // protect against getting null back from the property
- if(searchScopeString == null) {
- searchScopeString = ""; //$NON-NLS-1$
- }
- }
- if(searchScopeString.equals("SUBTREE_SCOPE")) { //$NON-NLS-1$
- searchScope = SearchControls.SUBTREE_SCOPE;
- } else if(searchScopeString.equals("ONELEVEL_SCOPE")) { //$NON-NLS-1$
- searchScope = SearchControls.ONELEVEL_SCOPE;
- } else if(searchScopeString.equals("OBJECT_SCOPE")) { //$NON-NLS-1$
- searchScope = SearchControls.OBJECT_SCOPE;
- }
- } else {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- return searchScope;
- }
-
- /**
- * Utility method to convert operator to the appropriate string value for LDAP.
- * @param op operator to evaluate
- * @return LDAP-specific string equivalent of the operator
- */
- private String parseCompoundCriteriaOp(AndOr.Operator op) throws ConnectorException {
- switch(op) {
- case AND:
- return "&"; //$NON-NLS-1$
- case OR:
- return "|"; //$NON-NLS-1$
- default:
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.criteriaNotParsableError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- }
-
- /**
- * Utility method to convert expression to the appropriate string value for LDAP.
- * @param e expression to evaluate
- * @return LDAP-specific string equivalent of the expression
- */
- // GHH 20080326 - found that code to fall back on Name if NameInSource
- // was null wasn't working properly, so replaced with tried and true
- // code from another custom connector.
- private String getExpressionString(Expression e) throws ConnectorException {
- String expressionName = null;
- // GHH 20080326 - changed around the IElement handling here
- // - the rest of this method is unchanged
- if(e instanceof ColumnReference) {
- Column mdIDElement = ((ColumnReference)e).getMetadataObject();
- expressionName = mdIDElement.getNameInSource();
- if(expressionName == null || expressionName.equals("")) { //$NON-NLS-1$
- expressionName = mdIDElement.getName();
- }
- } else if(e instanceof Literal) {
- try {
- if(((Literal)e).getType().equals(Class.forName(Timestamp.class.getName()))) {
- this.config.getLogger().logTrace("Found an expression that uses timestamp; converting to LDAP string format."); //$NON-NLS-1$
- Timestamp ts = (Timestamp)((Literal)e).getValue();
- Date dt = new Date(ts.getTime());
- //TODO: Fetch format if provided.
- SimpleDateFormat sdf = new SimpleDateFormat(LDAPConnectorConstants.ldapTimestampFormat);
- expressionName = sdf.format(dt);
- this.config.getLogger().logTrace("Timestamp to stsring is: " + expressionName); //$NON-NLS-1$
- }
- else {
- expressionName = ((Literal)e).getValue().toString();
- }
- } catch (ClassNotFoundException cce) {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.timestampClassNotFoundError"); //$NON-NLS-1$
- throw new ConnectorException(cce, msg);
- }
-
- } else {
- if(e instanceof AggregateFunction) {
- this.config.getLogger().logError("Received IAggregate, but it is not supported. Check capabilities."); //$NON-NLS-1$
- } else if(e instanceof Function) {
- this.config.getLogger().logError("Received IFunction, but it is not supported. Check capabilties."); //$NON-NLS-1$
- } else if(e instanceof ScalarSubquery) {
- this.config.getLogger().logError("Received IScalarSubquery, but it is not supported. Check capabilties."); //$NON-NLS-1$
- } else if (e instanceof SearchedCase) {
- this.config.getLogger().logError("Received ISearchedCaseExpression, but it is not supported. Check capabilties."); //$NON-NLS-1$
- }
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.unsupportedElementError"); //$NON-NLS-1$
- throw new ConnectorException(msg + e.toString());
- }
- expressionName = escapeReservedChars(expressionName);
- return expressionName;
- }
-
- private String escapeReservedChars(String expr) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < expr.length(); i++) {
- char curChar = expr.charAt(i);
- switch (curChar) {
- case '\\':
- sb.append("\\5c"); //$NON-NLS-1$
- break;
- case '*':
- sb.append("\\2a"); //$NON-NLS-1$
- break;
- case '(':
- sb.append("\\28"); //$NON-NLS-1$
- break;
- case ')':
- sb.append("\\29"); //$NON-NLS-1$
- break;
- case '\u0000':
- sb.append("\\00"); //$NON-NLS-1$
- break;
- default:
- sb.append(curChar);
- }
- }
- return sb.toString();
- }
-
- /**
- * Recursive method to translate the where clause into an LDAP search filter.
- * The goal is to convert infix notation to prefix (Polish) notation.
- * TODO: There's probably a clever way to do this with a Visitor.
- * @param criteria Criteria to evaluate.
- * @param List list to hold each pre-fix character of the search filter.
- * @return list list that can be traversed in order to construct the search filter.
- */
- private List<String> getSearchFilterFromWhereClause(Condition criteria, List<String> filterList) throws ConnectorException {
- if(criteria == null) {
- filterList.add("(objectClass=*)"); //$NON-NLS-1$
- }
- boolean isNegated = false;
- // Recursive case: compound criteria
- if(criteria instanceof AndOr) {
- AndOr crit = (AndOr)criteria;
- AndOr.Operator op = crit.getOperator();
- this.config.getLogger().logTrace("Parsing compound criteria."); //$NON-NLS-1$
- String stringOp = parseCompoundCriteriaOp(op);
-
- filterList.add("("); //$NON-NLS-1$
- filterList.add(stringOp);
- filterList.addAll(getSearchFilterFromWhereClause(crit.getLeftCondition(), new LinkedList<String>()));
- filterList.addAll(getSearchFilterFromWhereClause(crit.getRightCondition(), new LinkedList<String>()));
- filterList.add(")"); //$NON-NLS-1$
- // Base case
- } else if(criteria instanceof Comparison) {
- this.config.getLogger().logTrace("Parsing compare criteria."); //$NON-NLS-1$
- Comparison.Operator op = ((Comparison) criteria).getOperator();
-
- isNegated = op == Operator.NE || op == Operator.GT || op == Operator.LT;
-
- Expression lhs = ((Comparison) criteria).getLeftExpression();
- Expression rhs = ((Comparison) criteria).getRightExpression();
-
- String lhsString = getExpressionString(lhs);
- String rhsString = getExpressionString(rhs);
- if(lhsString == null || rhsString == null) {
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.missingNISError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
-
- addCompareCriteriaToList(filterList, op, lhsString, rhsString);
- // Base case
- } else if(criteria instanceof Exists) {
- this.config.getLogger().logTrace("Parsing EXISTS criteria: NOT IMPLEMENTED YET"); //$NON-NLS-1$
- // TODO Exists should be supported in a future release.
- // Base case
- } else if(criteria instanceof Like) {
- this.config.getLogger().logTrace("Parsing LIKE criteria."); //$NON-NLS-1$
- isNegated = ((Like) criteria).isNegated();
- // Convert LIKE to Equals, where any "%" symbol is replaced with "*".
- Comparison.Operator op = Operator.EQ;
- Expression lhs = ((Like) criteria).getLeftExpression();
- Expression rhs = ((Like) criteria).getRightExpression();
-
- String lhsString = getExpressionString(lhs);
- String rhsString = getExpressionString(rhs);
- rhsString = rhsString.replace("%", "*"); //$NON-NLS-1$ //$NON-NLS-2$
- addCompareCriteriaToList(filterList, op, lhsString, rhsString);
-
- // Base case
- } else if(criteria instanceof In) {
- this.config.getLogger().logTrace("Parsing IN criteria."); //$NON-NLS-1$
- isNegated = ((In) criteria).isNegated();
- Expression lhs = ((In)criteria).getLeftExpression();
- List rhsList = ((In)criteria).getRightExpressions();
- // Recursively add each IN expression to the filter list.
- processInCriteriaList(filterList, rhsList, lhs);
- } else if (criteria instanceof Not) {
- this.config.getLogger().logTrace("Parsing NOT criteria."); //$NON-NLS-1$
- isNegated = true;
- filterList.addAll(getSearchFilterFromWhereClause(((Not)criteria).getCriteria(), new LinkedList()));
- }
-
- if (isNegated) {
- filterList.add(0, "("); //$NON-NLS-1$
- filterList.add(1, "!"); //$NON-NLS-1$
- filterList.add(")"); //$NON-NLS-1$
- }
-
- return filterList;
- }
-
- /**
- * Process a list of right-hand side IN expresssions and add the corresponding LDAP filter
- * clause string to the given filterList.
- */
- private void processInCriteriaList(List filterList, List rhsList, Expression lhs) throws ConnectorException {
- if(rhsList.size() == 0) {
- return;
- }
- filterList.add("("); //$NON-NLS-1$
- filterList.add(parseCompoundCriteriaOp(org.teiid.connector.language.AndOr.Operator.OR));
- Iterator rhsItr = rhsList.iterator();
- while(rhsItr.hasNext()) {
- addCompareCriteriaToList(filterList, Operator.EQ, getExpressionString(lhs),
- getExpressionString((Expression)rhsItr.next()));
- }
- filterList.add(")"); //$NON-NLS-1$
- }
-
- /**
- * Add Compare Criteria to List
- * @param filterList the filter list
- * @param op
- * @param lhs left hand side expression
- * @param rhs right hand side expression
- */
- private void addCompareCriteriaToList(List filterList, Comparison.Operator op, String lhs, String rhs) throws ConnectorException {
- // Push the comparison statement into the list, e.g.:
- // (sn=Mike)
- // !(empNum>=100)
- filterList.add("("); //$NON-NLS-1$
- filterList.add(lhs);
-
- switch(op) {
- case NE:
- case EQ:
- filterList.add("="); //$NON-NLS-1$
- break;
- case LT:
- case GE:
- filterList.add(">="); //$NON-NLS-1$
- break;
- case GT:
- case LE:
- filterList.add("<="); //$NON-NLS-1$
- break;
- default:
- final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.criteriaNotSupportedError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
-
- }
- filterList.add(rhs);
- filterList.add(")"); //$NON-NLS-1$
- }
-
- /**
- * Method to get name from the supplied Element
- * @param e the supplied Element
- * @return the name
- */
- // GHH 20080326 - found that code to fall back on Name if NameInSource
- // was null wasn't working properly, so replaced with tried and true
- // code from another custom connector.
- public String getNameFromElement(Column e) throws ConnectorException {
- String ldapAttributeName = null;
- ldapAttributeName = e.getNameInSource();
- if (ldapAttributeName == null || ldapAttributeName.equals("")) { //$NON-NLS-1$
- ldapAttributeName = e.getName();
- // If name in source is not set, then fall back to the column name.
- }
- return ldapAttributeName;
- }
-
- /**
- * Method to get SELECT Element list from the supplied query
- * @param query the supplied Query
- * @return the list of SELECT elements
- */
- private ArrayList getElementsFromSelectSymbols(Select query) throws ConnectorException {
- ArrayList selectElementList = new ArrayList();
- Iterator selectSymbolItr = query.getDerivedColumns().iterator();
-
- while(selectSymbolItr.hasNext()) {
- Column e = getElementFromSymbol((DerivedColumn)selectSymbolItr.next());
- selectElementList.add(e);
- }
- return selectElementList;
- }
-
- /**
- * Method to get attribute list from the supplied query
- * @param query the supplied Query
- * @return the list of attributes
- */
- private ArrayList getAttributesFromSelectSymbols(Select query) throws ConnectorException {
- ArrayList ldapAttributeList = new ArrayList();
-
- Iterator selectSymbolItr = query.getDerivedColumns().iterator();
- int i=0;
- while(selectSymbolItr.hasNext()) {
- Column e = getElementFromSymbol((DerivedColumn)selectSymbolItr.next());
- String ldapAttributeName = this.getNameFromElement(e);
- Object ldapAttributeClass = e.getJavaType();
-
- // Store the element's name and class type, so that we know what to look for in the search results.
- BasicAttribute newAttr = new BasicAttribute(ldapAttributeName, ldapAttributeClass);
- ldapAttributeList.add(newAttr);
- i++;
- }
- return ldapAttributeList;
- }
-
- /**
- * Helper method for getting runtime {@link org.teiid.connector.metadata.runtime.Element} from a
- * {@link org.teiid.connector.language.DerivedColumn}.
- * @param symbol Input ISelectSymbol
- * @return Element returned metadata runtime Element
- */
- private Column getElementFromSymbol(DerivedColumn symbol) throws ConnectorException {
- ColumnReference expr = (ColumnReference) symbol.getExpression();
- return expr.getMetadataObject();
- }
-
-
-}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnection.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnection.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,206 +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 com.metamatrix.connector.ldap;
-
-import java.util.Hashtable;
-import java.util.Properties;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.ldap.InitialLdapContext;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-
-/**
- * Represents a connection to an LDAP data source.
- */
-public class LDAPConnection extends BasicConnection {
-
- private LDAPManagedConnectionFactory config;
-
- // Standard Connection data members
- private InitialLdapContext initCtx;
-
- // LDAP-specific properties
- public static final String LDAP_AUTH_TYPE = "simple"; //$NON-NLS-1$
- public static final String LDAP_USER_OBJECT_TYPE = "person"; //$NON-NLS-1$
- public static final String LDAP_REFERRAL_MODE = "follow"; //$NON-NLS-1$
-
- private String jndiLdapCtxFactory;
-
- public LDAPConnection(LDAPManagedConnectionFactory config) throws ConnectorException {
- this(config, LDAPConnectorConstants.JNDI_LDAP_CTX_FACTORY);
- }
-
- public LDAPConnection(LDAPManagedConnectionFactory config, String jndiLdapCtxFactory) throws ConnectorException {
- this.config = config;
- this.jndiLdapCtxFactory = jndiLdapCtxFactory;
-
- checkProperties();
-
- // Create initial LDAP connection.
- try {
- this.initCtx = initializeLDAPContext();
- } catch(ConnectorException ce) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.contextInitFailed"); //$NON-NLS-1$
- throw new ConnectorException(ce, msg);
- }
-
- this.config.getLogger().logDetail("LDAP Connection has been newly created."); //$NON-NLS-1$
- }
-
- public void setJndiLdapCtxFactory(String jndiLdapCtxFactory) {
- this.jndiLdapCtxFactory = jndiLdapCtxFactory;
- }
-
- /**
- * Helper method to retrieve the LDAP Connector properties. If any properties are in error,
- * a ConnectorException is thrown.
- * @param props
- */
- private void checkProperties() throws ConnectorException {
- // LDAP URL
- if(this.config.getLdapUrl() == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.urlPropNotFound"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- // LDAP Admin User DN
- if(this.config.getLdapAdminUserDN() == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.adminUserDNPropNotFound"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- // LDAP Admin User Password
- if(this.config.getLdapAdminUserPassword() == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.adminUserPassPropNotFound"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- }
-
- /**
- * Setup a standard initial LDAP context using JNDI's context factory.
- * This method may be extended to support Sun-specific and AD-specific
- * contexts, in order to support the different paging implementations they provide.
- * @return the initial LDAP Context
- */
- private InitialLdapContext initializeLDAPContext() throws ConnectorException {
- // Create the root context.
- InitialLdapContext initContext;
-
- Hashtable connenv = new Hashtable();
- connenv.put(Context.INITIAL_CONTEXT_FACTORY, jndiLdapCtxFactory);
- connenv.put(Context.PROVIDER_URL, this.config.getLdapUrl());
- connenv.put(Context.REFERRAL, LDAP_REFERRAL_MODE);
- // If username is blank, we will perform an anonymous bind.
- // Note: This is not supported when using Sun's VLVs, so remove this if VLVs are used.
- if(!this.config.getLdapAdminUserDN().equals("")) { //$NON-NLS-1$
-
- connenv.put(Context.SECURITY_AUTHENTICATION, LDAP_AUTH_TYPE);
- connenv.put(Context.SECURITY_PRINCIPAL, this.config.getLdapAdminUserDN());
- connenv.put(Context.SECURITY_CREDENTIALS, this.config.getLdapAdminUserPassword());
- } else {
- this.config.getLogger().logWarning("LDAP Username DN was blank; performing anonymous bind."); //$NON-NLS-1$
- connenv.put(Context.SECURITY_AUTHENTICATION, "none"); //$NON-NLS-1$
- }
-
- if(this.config.getLdapTxnTimeoutInMillis() != -1) { //$NON-NLS-1$
- connenv.put("com.sun.jndi.ldap.connect.timeout", this.config.getLdapTxnTimeoutInMillis()); //$NON-NLS-1$
- }
-
- // Enable connection pooling for the Initial context.
- connenv.put("com.sun.jndi.ldap.connect.pool", "true"); //$NON-NLS-1$ //$NON-NLS-2$
- connenv.put("com.sun.jndi.ldap.connect.pool.debug", "fine"); //$NON-NLS-1$ //$NON-NLS-2$
-
- try {
- initContext = new InitialLdapContext(connenv, null);
- } catch(NamingException ne){
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.directoryNamingError",ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg);
- } catch(Exception e) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.directoryInitError"); //$NON-NLS-1$
- throw new ConnectorException(e, msg);
- }
- this.config.getLogger().logDetail("Successfully obtained initial LDAP context."); //$NON-NLS-1$
- return initContext;
- }
-
- @Override
- public ResultSetExecution createResultSetExecution(QueryExpression command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new LDAPSyncQueryExecution((Select)command, executionContext, metadata, this.initCtx, this.config);
- }
-
- @Override
- public UpdateExecution createUpdateExecution(Command command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new LDAPUpdateExecution(command, executionContext, metadata, this.initCtx, this.config);
- }
-
- /**
- * Closes LDAP context, effectively closing the connection to LDAP.
- * (non-Javadoc)
- * @see com.metamatrix.connector.pool.PoolAwareConnection#closeSource()
- */
- @Override
- public void close() {
- if(initCtx != null) {
- try {
- initCtx.close();
- } catch(NamingException e) {
- this.config.getLogger().logDetail(LDAPPlugin.Util.getString("LDAPConnection.contextCloseError",e.getExplanation())); //$NON-NLS-1$
- }
- }
- this.config.getLogger().logDetail("LDAP context has been closed."); //$NON-NLS-1$
- }
-
- /**
- * Currently, this method always returns alive. We assume the connection is alive,
- * and rely on proper timeout values to automatically clean up connections before
- * any server-side timeout occurs. Rather than incur overhead by rebinding,
- * we'll assume the connection is always alive, and throw an error when it is actually used,
- * if the connection fails. This may be a more efficient way of handling failed connections,
- * with the one tradeoff that stale connections will not be detected until execution time. In
- * practice, there is no benefit to detecting stale connections before execution time.
- *
- * One possible extension is to implement a UnsolicitedNotificationListener.
- * (non-Javadoc)
- * @see com.metamatrix.connector.pool.PoolAwareConnection#isAlive()
- */
- @Override
- public boolean isAlive() {
- this.config.getLogger().logTrace("LDAP Connection is alive."); //$NON-NLS-1$
- return true;
- }
-
-}
Added: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectionImpl.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectionImpl.java (rev 0)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,181 @@
+/*
+ * 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.resource.cci.ldap;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.ldap.InitialLdapContext;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.ldap.LDAPConnection;
+import org.teiid.resource.spi.BasicConnection;
+
+
+
+/**
+ * Represents a connection to an LDAP data source.
+ */
+public class LDAPConnectionImpl extends BasicConnection implements LDAPConnection {
+
+ private LDAPManagedConnectionFactory config;
+
+ // Standard Connection data members
+ private InitialLdapContext initCtx;
+
+ // LDAP-specific properties
+ public static final String LDAP_AUTH_TYPE = "simple"; //$NON-NLS-1$
+ public static final String LDAP_USER_OBJECT_TYPE = "person"; //$NON-NLS-1$
+ public static final String LDAP_REFERRAL_MODE = "follow"; //$NON-NLS-1$
+
+ public LDAPConnectionImpl(LDAPManagedConnectionFactory config) throws ConnectorException {
+ this.config = config;
+
+ checkProperties();
+
+ // Create initial LDAP connection.
+ try {
+ this.initCtx = initializeLDAPContext();
+ } catch(ConnectorException ce) {
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.contextInitFailed"); //$NON-NLS-1$
+ throw new ConnectorException(ce, msg);
+ }
+
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "LDAP Connection has been newly created."); //$NON-NLS-1$
+ }
+
+ /**
+ * Helper method to retrieve the LDAP Connector properties. If any properties are in error,
+ * a ConnectorException is thrown.
+ * @param props
+ */
+ private void checkProperties() throws ConnectorException {
+ // LDAP URL
+ if(this.config.getLdapUrl() == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.urlPropNotFound"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ // LDAP Admin User DN
+ if(this.config.getLdapAdminUserDN() == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.adminUserDNPropNotFound"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ // LDAP Admin User Password
+ if(this.config.getLdapAdminUserPassword() == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.adminUserPassPropNotFound"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ }
+
+ /**
+ * Setup a standard initial LDAP context using JNDI's context factory.
+ * This method may be extended to support Sun-specific and AD-specific
+ * contexts, in order to support the different paging implementations they provide.
+ * @return the initial LDAP Context
+ */
+ private InitialLdapContext initializeLDAPContext() throws ConnectorException {
+ // Create the root context.
+ InitialLdapContext initContext;
+
+ Hashtable connenv = new Hashtable();
+ connenv.put(Context.INITIAL_CONTEXT_FACTORY, this.config.getLdapContextFactory());
+ connenv.put(Context.PROVIDER_URL, this.config.getLdapUrl());
+ connenv.put(Context.REFERRAL, LDAP_REFERRAL_MODE);
+ // If username is blank, we will perform an anonymous bind.
+ // Note: This is not supported when using Sun's VLVs, so remove this if VLVs are used.
+ if(!this.config.getLdapAdminUserDN().equals("")) { //$NON-NLS-1$
+
+ connenv.put(Context.SECURITY_AUTHENTICATION, LDAP_AUTH_TYPE);
+ connenv.put(Context.SECURITY_PRINCIPAL, this.config.getLdapAdminUserDN());
+ connenv.put(Context.SECURITY_CREDENTIALS, this.config.getLdapAdminUserPassword());
+ } else {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "LDAP Username DN was blank; performing anonymous bind."); //$NON-NLS-1$
+ connenv.put(Context.SECURITY_AUTHENTICATION, "none"); //$NON-NLS-1$
+ }
+
+ if(this.config.getLdapTxnTimeoutInMillis() != -1) {
+ connenv.put("com.sun.jndi.ldap.connect.timeout", this.config.getLdapTxnTimeoutInMillis()); //$NON-NLS-1$
+ }
+
+ // Enable connection pooling for the Initial context.
+ connenv.put("com.sun.jndi.ldap.connect.pool", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+ connenv.put("com.sun.jndi.ldap.connect.pool.debug", "fine"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ try {
+ initContext = new InitialLdapContext(connenv, null);
+ } catch(NamingException ne){
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.directoryNamingError",ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ } catch(Exception e) {
+ final String msg = LDAPPlugin.Util.getString("LDAPConnection.directoryInitError"); //$NON-NLS-1$
+ throw new ConnectorException(e, msg);
+ }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Successfully obtained initial LDAP context."); //$NON-NLS-1$
+ return initContext;
+ }
+
+
+
+ /**
+ * Closes LDAP context, effectively closing the connection to LDAP.
+ * (non-Javadoc)
+ * @see com.metamatrix.connector.pool.PoolAwareConnection#closeSource()
+ */
+ @Override
+ public void close() {
+ if(initCtx != null) {
+ try {
+ initCtx.close();
+ } catch(NamingException e) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, LDAPPlugin.Util.getString("LDAPConnection.contextCloseError",e.getExplanation())); //$NON-NLS-1$
+ }
+ }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"LDAP context has been closed."); //$NON-NLS-1$
+ }
+
+ /**
+ * Currently, this method always returns alive. We assume the connection is alive,
+ * and rely on proper timeout values to automatically clean up connections before
+ * any server-side timeout occurs. Rather than incur overhead by rebinding,
+ * we'll assume the connection is always alive, and throw an error when it is actually used,
+ * if the connection fails. This may be a more efficient way of handling failed connections,
+ * with the one tradeoff that stale connections will not be detected until execution time. In
+ * practice, there is no benefit to detecting stale connections before execution time.
+ *
+ * One possible extension is to implement a UnsolicitedNotificationListener.
+ * (non-Javadoc)
+ * @see com.metamatrix.connector.pool.PoolAwareConnection#isAlive()
+ */
+ public boolean isAlive() {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "LDAP Connection is alive."); //$NON-NLS-1$
+ return true;
+ }
+
+ @Override
+ public Object lookup(String context) throws NamingException {
+ return this.initCtx.lookup(context);
+ }
+}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnector.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,52 +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 com.metamatrix.connector.ldap;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.basic.BasicConnector;
-
-
-/**
- * LDAPConnector. This is responsible for initializing
- * a connection factory, and obtaining connections to LDAP.
- */
-public class LDAPConnector extends BasicConnector {
- private LDAPManagedConnectionFactory config;
-
- public Connection getConnection() throws ConnectorException {
- config.getLogger().logDetail(LDAPPlugin.Util.getString("LDAPSourceConnectionFactory.creatingConnection"));
- return new LDAPConnection(this.config);
- }
-
- @Override
- public void initialize(ConnectorEnvironment env) throws ConnectorException {
- super.initialize(env);
- this.config = (LDAPManagedConnectionFactory)env;
- }
-
- public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
- return LDAPConnectorCapabilities.class;
- }
-}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorCapabilities.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,82 +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 com.metamatrix.connector.ldap;
-
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-
-/**
- * This class extends the BasicConnectorCapabilities class, and establishes
- * the capabilities that are supported by the LDAPConnector.
- */
-public class LDAPConnectorCapabilities extends BasicConnectorCapabilities {
-
- @Override
- public int getMaxInCriteriaSize() {
- return 1000;
- }
-
- public boolean supportsCompareCriteriaEquals() {
- return true;
- }
-
- public boolean supportsInCriteria() {
- return true;
- }
-
- public boolean supportsLikeCriteria() {
- return true;
- }
-
- public boolean supportsOrCriteria() {
- return true;
- }
-
- public boolean supportsOrderBy() {
- // Removed this support -- see LDAPSyncQueryExecution comments for details.
- return false;
- }
-
- public boolean supportsRowLimit() {
- // GHH 20080408 - turned this on, because I fixed issue
- // in nextBatch that was causing this to fail
- return true;
- }
-
- public boolean supportsRowOffset() {
- // TODO This might actually be possible in future releases,
- // when using virtual list views/Sun. note that this requires the ability
- // to set the count limit, as well as an offset, so setCountLimit::searchControls
- // won't do it alone.
- return false;
- }
-
- @Override
- public boolean supportsCompareCriteriaOrdered() {
- return true;
- }
-
- @Override
- public boolean supportsNotCriteria() {
- return true;
- }
-
-}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorConstants.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorConstants.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPConnectorConstants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,41 +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 com.metamatrix.connector.ldap;
-
-import javax.naming.directory.*;
-
-/**
- * Utility class to maintain list of constants for the LDAPConnector.
- * Please modify constants here; changes should be reflected throughout
- * the connector code.
- */
-public class LDAPConnectorConstants {
-
- public static final String ldapDefaultSortName = "guid"; //$NON-NLS-1$
- public static final int ldapDefaultSearchScope = SearchControls.ONELEVEL_SCOPE;
- public static final boolean ldapDefaultIsAscending = true;
-
- public static final String JNDI_LDAP_CTX_FACTORY =
- "com.sun.jndi.ldap.LdapCtxFactory"; //$NON-NLS-1$
-
- public static final String ldapTimestampFormat = "yyyyMMddhhmmss\'Z\'"; //$NON-NLS-1$
-}
Modified: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPManagedConnectionFactory.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -19,29 +19,34 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
-package com.metamatrix.connector.ldap;
+package org.teiid.resource.cci.ldap;
-import org.teiid.connector.basic.BasicManagedConnectionFactory;
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+import org.teiid.resource.spi.BasicConnectionFactory;
+import org.teiid.resource.spi.BasicManagedConnectionFactory;
+
public class LDAPManagedConnectionFactory extends BasicManagedConnectionFactory {
private static final long serialVersionUID = -1832915223199053471L;
- private String searchDefaultBaseDN;
private String ldapAdminUserDN;
private String ldapAdminUserPassword;
- private boolean restrictToObjectClass = false;
- private long ldapTxnTimeoutInMillis;
private String ldapUrl;
- private String searchDefaultScope = "SUBTREE_SCOPE";
+ private long ldapTxnTimeoutInMillis;
+ private String ldapContextFactory;
- public String getSearchDefaultBaseDN() {
- return searchDefaultBaseDN;
- }
- public void setSearchDefaultBaseDN(String searchDefaultBaseDN) {
- this.searchDefaultBaseDN = searchDefaultBaseDN;
- }
+ @Override
+ public Object createConnectionFactory() throws ResourceException {
+ return new BasicConnectionFactory() {
+ @Override
+ public Connection getConnection() throws ResourceException {
+ return new LDAPConnectionImpl(LDAPManagedConnectionFactory.this);
+ }
+ };
+ }
public String getLdapAdminUserDN() {
return ldapAdminUserDN;
@@ -59,14 +64,6 @@
this.ldapAdminUserPassword = ldapAdminUserPassword;
}
- public boolean isRestrictToObjectClass() {
- return restrictToObjectClass;
- }
-
- public void setRestrictToObjectClass(Boolean restrictToObjectClass) {
- this.restrictToObjectClass = restrictToObjectClass.booleanValue();
- }
-
public long getLdapTxnTimeoutInMillis() {
return ldapTxnTimeoutInMillis;
}
@@ -83,11 +80,11 @@
this.ldapUrl = ldapUrl;
}
- public String getSearchDefaultScope() {
- return searchDefaultScope;
+ public String getLdapContextFactory() {
+ return ldapContextFactory;
}
-
- public void setSearchDefaultScope(String searchDefaultScope) {
- this.searchDefaultScope = searchDefaultScope;
- }
+
+ public void setLdapContextFactory(String ldapContextFactory) {
+ this.ldapContextFactory = ldapContextFactory;
+ }
}
Modified: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPPlugin.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPPlugin.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -19,7 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
-package com.metamatrix.connector.ldap;
+package org.teiid.resource.cci.ldap;
import java.util.ResourceBundle;
@@ -30,11 +30,7 @@
*/
public class LDAPPlugin {
- /**
- * The plug-in identifier of this plugin
- * (value <code>"com.metamatrix.connector.ldap"</code>).
- */
- public static final String PLUGIN_ID = "com.metamatrix.connector.ldap" ; //$NON-NLS-1$
+ public static final String PLUGIN_ID = "org.teiid.resource.cci.ldap" ; //$NON-NLS-1$
/**
* Provides access to the plugin's log and to it's resources.
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSearchDetails.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPSearchDetails.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSearchDetails.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,191 +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 com.metamatrix.connector.ldap;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.SearchControls;
-import javax.naming.ldap.SortKey;
-
-import org.teiid.connector.api.ConnectorLogger;
-
-
-/**
- * Utility class used to maintain the details of a particular LDAP search,
- * such as the context, the attributes of interest, the filter, and the
- * search scope.
- */
-public class LDAPSearchDetails {
- private String contextName;
- private int searchScope;
- private String contextFilter;
- private ArrayList attributeList;
- private SortKey[] keys;
-// private LdapSortKey[] netscapeKeys;
- // If limit is set to -1, this means no limit (return all rows)
- private long limit;
- private ArrayList elementList;
-
- /**
- * Constructor
- * @param name the context name
- * @param searchScope the search scope
- * @param filter the context filter
- * @param attributeList the list of attributes
- * @param keys
- * @param limit
- * @param elementList
- */
- public LDAPSearchDetails(String name, int searchScope, String filter, ArrayList attributeList, SortKey[] keys, long limit, ArrayList elementList) {
-
- this.contextName = name;
- this.searchScope = searchScope;
- this.contextFilter = filter;
- this.attributeList = attributeList;
- this.keys = keys;
- this.limit = limit;
- this.elementList = elementList;
- }
-
- /**
- * get the context name
- * @return the context name
- */
- public String getContextName() {
- return contextName;
- }
-
- /**
- * get the context name
- * @return the context name
- */
- public int getSearchScope() {
- return searchScope;
- }
-
- /**
- * get the context filter
- * @return the context filter
- */
- public String getContextFilter() {
- return contextFilter;
- }
-
- /**
- * get the attribute list
- * @return the attribute list
- */
- public ArrayList getAttributeList() {
- return attributeList;
- }
-
- /**
- * get the element list
- * @return the element list
- */
- public ArrayList getElementList() {
- return elementList;
- }
-
- /**
- * get the sort keys
- * @return the sort keys
- */
- public SortKey[] getSortKeys() {
- return keys;
- }
-
- /**
- * get the count limit
- * @return the count limit
- */
- public long getCountLimit() {
- return limit;
- }
- /*
- public LdapSortKey[] getNetscapeSortKeys() {
- return netscapeKeys;
- }
- private void createNetscapeKeys() {
- if(keys != null) {
- netscapeKeys = new LdapSortKey[keys.length];
- for(int i=0; i<keys.length; i++) {
- LdapSortKey nKey = new LdapSortKey(keys[i].getAttributeID(),
- keys[i].isAscending());
- netscapeKeys[i] = nKey;
- }
- } else {
- // set it null
- netscapeKeys = null;
- }
- }
- */
-
- /**
- * Print Method for Logging - (Detail level logging)
- * @param logger the connector logger.
- */
- public void printDetailsToLog(ConnectorLogger logger) throws NamingException {
- // Log Search Scope
- logger.logDetail("Search context: " + contextName); //$NON-NLS-1$
- if(searchScope == SearchControls.SUBTREE_SCOPE) {
- logger.logDetail("Search scope = SUBTREE_SCOPE"); //$NON-NLS-1$
- } else if(searchScope == SearchControls.OBJECT_SCOPE) {
- logger.logDetail("Search scope = OBJECT_SCOPE"); //$NON-NLS-1$
- } else if(searchScope == SearchControls.ONELEVEL_SCOPE) {
- logger.logDetail("Search scope = ONELEVEL_SCOPE"); //$NON-NLS-1$
- }
-
- // Log Search Attributes
- logger.logDetail("Search attributes: "); //$NON-NLS-1$
- Iterator itr = this.attributeList.iterator();
- int i = 0;
- while(itr.hasNext()) {
- Attribute attr = (Attribute)itr.next();
- logger.logDetail("Attribute [" + i + "]: " + attr.getID() + " (" +attr.get().toString() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- i++;
- }
-
- // Log Context Filter
- if(contextFilter != null && (!contextFilter.equals(""))) { //$NON-NLS-1$
- logger.logDetail("Where clause was translated into Ldap search filter: " + contextFilter); //$NON-NLS-1$
- }
-
- // Log Sort Keys
- if(keys != null) {
- logger.logDetail("Sort keys: "); //$NON-NLS-1$
- for(int j=0; j<keys.length; j++) {
- logger.logDetail("\tName: " + keys[j].getAttributeID()); //$NON-NLS-1$
- logger.logDetail("\tOrder: "); //$NON-NLS-1$
- if(keys[j].isAscending()) {
- logger.logDetail("ASC"); //$NON-NLS-1$
- } else {
- logger.logDetail("DESC"); //$NON-NLS-1$
- }
- }
- }
- }
-}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSyncQueryExecution.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPSyncQueryExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPSyncQueryExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,489 +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.
- */
-
-/**
- *
- * Please see the user's guide for a full description of capabilties, etc.
- *
- * Description/Assumptions:
- * 1. Table's name in source defines the base DN (or context) for the search.
- * Example: Table.NameInSource=ou=people,dc=gene,dc=com
- * [Optional] The table's name in source can also define a search scope. Append
- * a "?" character as a delimiter to the base DN, and add the search scope string.
- * The following scopes are available:
- * SUBTREE_SCOPE
- * ONELEVEL_SCOPE
- * OBJECT_SCOPE
- * [Default] LDAPConnectorConstants.ldapDefaultSearchScope
- * is the default scope used, if no scope is defined (currently, ONELEVEL_SCOPE).
- *
- * 2. Column's name in source defines the LDAP attribute name.
- * [Default] If no name in source is defined, then we attempt to use the column name
- * as the LDAP attribute name.
- *
- *
- * TODO: Implement paged searches -- the LDAP server must support VirtualListViews.
- * TODO: Implement cancel.
- * TODO: Add Sun/Netscape implementation, AD/OpenLDAP implementation.
- *
- *
- * Note:
- * Greater than is treated as >=
- * Less-than is treater as <=
- * If an LDAP entry has more than one entry for an attribute of interest (e.g. a select item), we only return the
- * first occurrance. The first occurance is not predictably the same each time, either, according to the LDAP spec.
- * If an attribute is not present, we return the empty string. Arguably, we could throw an exception.
- *
- * Sun LDAP won't support Sort Orders for very large datasets. So, we've set the sorting to NONCRITICAL, which
- * allows Sun to ignore the sort order. This will result in the results to come back as unsorted, without any error.
- *
- * Removed support for ORDER BY for two reasons:
- * 1: LDAP appears to have a limit to the number of records that
- * can be server-side sorted. When the limit is reached, two things can happen:
- * a. If sortControl is set to CRITICAL, then the search fails.
- * b. If sortControl is NONCRITICAL, then the search returns, unsorted.
- * We'd like to support ORDER BY, no matter how large the size, so we turn it off,
- * and allow MetaMatrix to do it for us.
- * 2: Supporting ORDER BY appears to negatively effect the query plan
- * when cost analysis is used. We stop using dependent queries, and start
- * using inner joins.
- *
- */
-
-package com.metamatrix.connector.ldap;
-
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.SizeLimitExceededException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
-import javax.naming.ldap.Control;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
-import javax.naming.ldap.SortControl;
-import javax.naming.ldap.SortKey;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-
-/**
- * LDAPSyncQueryExecution is responsible for executing an LDAP search
- * corresponding to a read-only "select" query from MetaMatrix.
- */
-public class LDAPSyncQueryExecution extends BasicExecution implements ResultSetExecution {
-
- private LDAPSearchDetails searchDetails;
- private RuntimeMetadata rm;
- private InitialLdapContext initialLdapContext;
- private LdapContext ldapCtx;
- private NamingEnumeration searchEnumeration;
- private IQueryToLdapSearchParser parser;
- private Select query;
- private LDAPManagedConnectionFactory config;
-
- /**
- * Constructor
- * @param executionMode the execution mode.
- * @param ctx the execution context.
- * @param rm the runtimeMetadata
- * @param logger the ConnectorLogger
- * @param ldapCtx the LDAP Context
- */
- public LDAPSyncQueryExecution(Select query, ExecutionContext ctx, RuntimeMetadata rm, InitialLdapContext ldapCtx, LDAPManagedConnectionFactory config) throws ConnectorException {
- this.rm = rm;
- this.initialLdapContext = ldapCtx;
- this.query = query;
- this.config = config;
- }
-
- /**
- * method to execute the supplied query
- * @param query the query object.
- * @param maxBatchSize the max batch size.
- */
- @Override
- public void execute() throws ConnectorException {
- // Parse the IQuery, and translate it into an appropriate LDAP search.
- this.parser = new IQueryToLdapSearchParser(this.rm, this.config);
- searchDetails = parser.translateSQLQueryToLDAPSearch(query);
-
- // Create and configure the new search context.
- createSearchContext();
- SearchControls ctrls = setSearchControls();
- setStandardRequestControls();
- // Execute the search.
- executeSearch(ctrls);
- }
-
- /**
- * Set the standard request controls
- */
- private void setStandardRequestControls() throws ConnectorException {
- Control[] sortCtrl = new Control[1];
- SortKey[] keys = searchDetails.getSortKeys();
- if (keys != null) {
- try {
- sortCtrl[0] = new SortControl(keys, Control.NONCRITICAL);
- this.ldapCtx.setRequestControls(sortCtrl);
- this.config.getLogger().logTrace("Sort ordering was requested, and sort control was created successfully."); //$NON-NLS-1$
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.setControlsError") + //$NON-NLS-1$
- " : "+ne.getExplanation(); //$NON-NLS-1$
- throw new ConnectorException(msg);
- } catch(IOException e) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.setControlsError"); //$NON-NLS-1$
- throw new ConnectorException(e,msg);
- }
- }
- }
-
- /**
- * Perform a lookup against the initial LDAP context, which
- * sets the context to something appropriate for the search that is about to occur.
- *
- */
- private void createSearchContext() throws ConnectorException {
- try {
- ldapCtx = (LdapContext) this.initialLdapContext.lookup(searchDetails.getContextName());
- } catch (NamingException ne) {
- if (searchDetails.getContextName() != null) {
- this.config.getLogger().logError("Attempted to search context: " //$NON-NLS-1$
- + searchDetails.getContextName());
- }
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.createContextError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- }
-
-
- /**
- * Set the search controls
- */
- private SearchControls setSearchControls() throws ConnectorException {
- SearchControls ctrls = new SearchControls();
- //ArrayList modelAttrList = searchDetails.getAttributeList();
- ArrayList modelAttrList = searchDetails.getElementList();
- String[] attrs = new String[modelAttrList.size()];
- Iterator itr = modelAttrList.iterator();
- int i = 0;
- while(itr.hasNext()) {
- attrs[i] = (parser.getNameFromElement((Column)itr.next()));
- //attrs[i] = (((Attribute)itr.next()).getID();
- //logger.logTrace("Adding attribute named " + attrs[i] + " to the search list.");
- i++;
- }
-
- ctrls.setSearchScope(searchDetails.getSearchScope());
- ctrls.setReturningAttributes(attrs);
-
- long limit = searchDetails.getCountLimit();
- if(limit != -1) {
- ctrls.setCountLimit(limit);
- }
- return ctrls;
- }
-
- /**
- * Perform the LDAP search against the subcontext, using the filter and
- * search controls appropriate to the query and model metadata.
- */
- private void executeSearch(SearchControls ctrls) throws ConnectorException {
- String ctxName = searchDetails.getContextName();
- String filter = searchDetails.getContextFilter();
- if (ctxName == null || filter == null || ctrls == null) {
- this.config.getLogger().logError("Search context, filter, or controls were null. Cannot execute search."); //$NON-NLS-1$
- }
- try {
- searchEnumeration = this.ldapCtx.search("", filter, ctrls); //$NON-NLS-1$
- } catch (NamingException ne) {
- this.config.getLogger().logError("LDAP search failed. Attempted to search context " //$NON-NLS-1$
- + ctxName + " using filter " + filter); //$NON-NLS-1$
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.execSearchError"); //$NON-NLS-1$
- throw new ConnectorException(msg + " : " + ne.getExplanation()); //$NON-NLS-1$
- } catch(Exception e) {
- this.config.getLogger().logError("LDAP search failed. Attempted to search context " //$NON-NLS-1$
- + ctxName + " using filter " + filter); //$NON-NLS-1$
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.execSearchError"); //$NON-NLS-1$
- throw new ConnectorException(e, msg);
- }
- }
-
- // GHH 20080326 - attempt to implement cancel here. First try to
- // close the searchEnumeration, then the search context.
- // We are very conservative when closing the enumeration
- // but less so when closing context, since it is safe to call close
- // on contexts multiple times
- @Override
- public void cancel() throws ConnectorException {
- close();
- }
-
- // GHH 20080326 - replaced existing implementation with the same
- // code as used by cancel method. First try to
- // close the searchEnumeration, then the search context
- // We are very conservative when closing the enumeration
- // but less so when closing context, since it is safe to call close
- // on contexts multiple times
- @Override
- public void close() throws ConnectorException {
- if (searchEnumeration != null) {
- try {
- searchEnumeration.close();
- } catch (Exception e) { } // catch everything, because NamingEnumeration has undefined behavior if it previously hit an exception
- }
- if (ldapCtx != null) {
- try {
- ldapCtx.close();
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.closeContextError",ne.getExplanation()); //$NON-NLS-1$
- this.config.getLogger().logError(msg);
- }
- }
- }
-
- /**
- * Fetch the next batch of data from the LDAP searchEnumerationr result.
- * @return the next Batch of results.
- */
- // GHH 20080326 - set all batches as last batch after an exception
- // is thrown calling a method on the enumeration. Per Javadoc for
- // javax.naming.NamingEnumeration, enumeration is invalid after an
- // exception is thrown - by setting last batch indicator we prevent
- // it from being used again.
- // GHH 20080326 - also added return of explanation for generic
- // NamingException
- public List next() throws ConnectorException {
- try {
- // The search has been executed, so process up to one batch of
- // results.
- List result = null;
- while (result == null && searchEnumeration != null && searchEnumeration.hasMore())
- {
- SearchResult searchResult = (SearchResult) searchEnumeration.next();
- result = getRow(searchResult);
- }
-
- return result;
- } catch (SizeLimitExceededException e) {
- this.config.getLogger().logWarning("Search results exceeded size limit. Results may be incomplete."); //$NON-NLS-1$
- searchEnumeration = null; // GHH 20080326 - NamingEnumartion's are no longer good after an exception so toss it
- return null; // GHH 20080326 - if size limit exceeded don't try to read more results
- } catch (NamingException ne) {
- final String msg = "Ldap error while processing next batch of results: " + ne.getExplanation(); //$NON-NLS-1$
- this.config.getLogger().logError(msg); // GHH 20080326 - changed to output explanation from LDAP server
- searchEnumeration = null; // GHH 20080326 - NamingEnumertion's are no longer good after an exception so toss it
- throw new ConnectorException(msg);
- }
- }
-
- /**
- * Create a row using the searchResult and add it to the supplied batch.
- * @param batch the supplied batch
- * @param result the search result
- */
- // GHH 20080326 - added fetching of DN of result, for directories that
- // do not include it as an attribute
- private List getRow(SearchResult result) throws ConnectorException {
- Attributes attrs = result.getAttributes();
- String resultDN = result.getNameInNamespace(); // added GHH 20080326
- ArrayList attributeList = searchDetails.getElementList();
- List row = new ArrayList();
-
- if (attrs != null && attrs.size()>0) {
- Iterator itr = attributeList.iterator();
- while(itr.hasNext()) {
- addResultToRow((Column)itr.next(), resultDN, attrs, row); // GHH 20080326 - added resultDN parameter to call
- }
- return row;
- }
- return null;
- }
-
- /**
- * Add Result to Row
- * @param modelElement the model element
- * @param attrs the attributes
- * @param row the row
- */
- // GHH 20080326 - added resultDistinguishedName to method signature. If
- // there is an element in the model named "DN" and there is no attribute
- // with this name in the search result, we return this new parameter
- // value for that column in the result
- // GHH 20080326 - added handling of ClassCastException when non-string
- // attribute is returned
- private void addResultToRow(Column modelElement, String resultDistinguishedName, Attributes attrs, List row) throws ConnectorException {
-
- String strResult;
- String modelAttrName = parser.getNameFromElement(modelElement);
- Class modelAttrClass = modelElement.getJavaType();
- if(modelAttrName == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.nullAttrError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
-
- Attribute resultAttr = attrs.get(modelAttrName);
-
- // If the attribute is not present, we return NULL.
- if(resultAttr == null) {
- // MPW - 2-20-07 - Changed from returning empty string to returning null.
- //row.add("");
- //logger.logTrace("Did not find a match for attribute named: " + modelAttrName);
- // GHH 20080326 - return DN from input parameter
- // if DN attribute is not present in search result
- if (modelAttrName.toUpperCase().equals("DN")) { //$NON-NLS-1$
- row.add(resultDistinguishedName);
- }
- else {
- row.add(null);
- }
- return;
- }
- // TODO: Currently, if an LDAP entry contains more than one matching
- // attribute, we only return the first.
- // Since attribute order is not guaranteed, this means that we may not
- // always return the exact same information.
- // Putting multi-valued attributes into a single row (or multiple rows) requires
- // some design decisions.
- // GHH 20080326 - first get attribute as generic object
- // so we can check to make sure it is a string separately - previously it was just put straight into a string.
- Object objResult = null;
- try {
- objResult = resultAttr.get();
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.attrValueFetchError",modelAttrName); //$NON-NLS-1$
- this.config.getLogger().logWarning(msg+" : "+ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg+" : "+ne.getExplanation()); //$NON-NLS-1$
- }
-
- // GHH 20080326 - if attribute is not a string, just
- // return an empty string.
- // TODO - allow return of non-strings (always byte[]) as
- // MM object. Perhaps also add directory-specific logic
- // to deserialize byte[] attributes into Java objects
- // when appropriate
- try {
- strResult = (String)objResult;
- } catch (ClassCastException cce) {
- strResult = ""; //$NON-NLS-1$
- }
-
- // MPW - 3.9.07 - Also return NULL when attribute is unset or empty string.
- // There is no way to differentiate between being unset and being the empty string.
- if(strResult.equals("")) { //$NON-NLS-1$
- strResult = null;
- }
-
- // MPW: 3-11-07: Added support for java.lang.Integer conversion.
- try {
- if(modelAttrClass.equals(Class.forName(Integer.class.getName()))) {
- try {
- // Throw an exception if class cast fails.
- if(strResult != null) {
- Integer intResult = new Integer(strResult);
- row.add(intResult);
- } else {
- row.add(null);
- }
- } catch(NumberFormatException nfe) {
- throw new ConnectorException(nfe, "Element " + modelAttrName + " is typed as Integer, " + //$NON-NLS-1$ //$NON-NLS-2$
- "but it's value (" + strResult + ") cannot be converted from string " + //$NON-NLS-1$ //$NON-NLS-2$
- "to Integer. Please change type to String, or modify the data."); //$NON-NLS-1$
- }
- // java.lang.String
- } else if(modelAttrClass.equals(Class.forName(String.class.getName()))) {
- row.add(strResult);
- // java.sql.Timestamp
- } else if(modelAttrClass.equals(Class.forName(java.sql.Timestamp.class.getName()))) {
- Map<String, String> p = modelElement.getProperties();
-
- String timestampFormat = p.get("Format"); //$NON-NLS-1$
- SimpleDateFormat dateFormat;
- if(timestampFormat == null) {
- timestampFormat = LDAPConnectorConstants.ldapTimestampFormat;
-
- }
- dateFormat = new SimpleDateFormat(timestampFormat);
- try {
- if(strResult != null) {
- Date dateResult = dateFormat.parse(strResult);
- Timestamp tsResult = new Timestamp(dateResult.getTime());
- row.add(tsResult);
- } else {
- row.add(null);
- }
- } catch(ParseException pe) {
- throw new ConnectorException(pe, "Timestamp could not be parsed. Please check to ensure the " //$NON-NLS-1$
- + " Format field for attribute " //$NON-NLS-1$
- + modelAttrName + " is configured using SimpleDateFormat conventions."); //$NON-NLS-1$
- }
-
- // TODO: Extend support for more types in the future.
- // Specifically, add support for byte arrays, since that's actually supported
- // in the underlying data source.
- } else {
- throw new ConnectorException("Base type " + modelAttrClass.toString() //$NON-NLS-1$
- + " is not supported in the LDAP connector. " //$NON-NLS-1$
- + " Please modify the base model to use a supported type."); //$NON-NLS-1$
- }
- } catch(ClassNotFoundException cne) {
- final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.supportedClassNotFoundError"); //$NON-NLS-1$
- throw new ConnectorException(cne, msg);
- }
- }
-
-
- /**
- * Active Directory and OpenLDAP supports PagedResultsControls, so I left
- * this method in here in case we decide to extend support for this control
- * in the future.
- */
-// private void setADRequestControls(int maxBatchSize) {
-// try {
-// ldapCtx.setRequestControls(new Control[] { new PagedResultsControl(
-// maxBatchSize, Control.CRITICAL) });
-// } catch (NamingException ne) {
-// logger.logError("Failed to set page size for LDAP results. Please ensure that paged results controls are supported by the LDAP server implementation."); //$NON-NLS-1$
-// ne.printStackTrace();
-// } catch (IOException ioe) {
-// logger.logError("IO Exception while setting paged results control."); //$NON-NLS-1$
-// ioe.printStackTrace();
-// }
-// }
-}
Deleted: trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPUpdateExecution.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/main/java/org/teiid/resource/cci/ldap/LDAPUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,455 +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 com.metamatrix.connector.ldap;
-
-import java.util.List;
-
-import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.BasicAttribute;
-import javax.naming.directory.BasicAttributes;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.ModificationItem;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.language.ColumnReference;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Comparison;
-import org.teiid.connector.language.Condition;
-import org.teiid.connector.language.Delete;
-import org.teiid.connector.language.Expression;
-import org.teiid.connector.language.ExpressionValueSource;
-import org.teiid.connector.language.Insert;
-import org.teiid.connector.language.Literal;
-import org.teiid.connector.language.SetClause;
-import org.teiid.connector.language.Update;
-import org.teiid.connector.language.Comparison.Operator;
-import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-
-/**
- * Please see the user's guide for a full description of capabilties, etc.
- *
- * Description/Assumptions:
- * 1. Table's name in source defines the base DN (or context) for the search.
- * Example: Table.NameInSource=ou=people,dc=gene,dc=com
- * 2. Column's name in source defines the LDAP attribute name.
- * [Default] If no name in source is defined, then we attempt to use the column name
- * as the LDAP attribute name.
- * 3. Since all of the underlying LDAP methods for adding/deleting/updating
- * require specification of the LDAP distinguished name (DN) to change, for all
- * corresponding MetaMatrix operations the DN must be specified (as the sole
- * item in the WHERE clause for UPDATE and DELETE operations, and in the list
- * of attributes to assign values in an INSERT operation * Responsible for update/insert/delete operations against LDAP
- */
-public class LDAPUpdateExecution extends BasicExecution implements UpdateExecution {
- private RuntimeMetadata rm;
- private InitialLdapContext initialLdapContext;
- private LdapContext ldapCtx;
- private Command command;
- private LDAPManagedConnectionFactory config;
-
- public LDAPUpdateExecution(Command command, ExecutionContext ctx,
- RuntimeMetadata rm, InitialLdapContext ldapCtx, LDAPManagedConnectionFactory config) throws ConnectorException {
- this.rm = rm;
- this.initialLdapContext = ldapCtx;
- this.command = command;
- this.config = config;
- }
-
- /** execute generic update-class (either an update, delete, or insert)
- * operation and returns a count of affected rows. Since underlying
- * LDAP operations (and this connector) can modify at most one LDAP
- * leaf context at a time, this will always return 1. It will never
- * actually return 0, because if an operation fails, a
- * ConnectorException will be thrown instead.
- * Note that really it should return 0 if a delete is performed on
- * an entry that doesn't exist (but whose parent does exist), but
- * since the underlying LDAP operation will return success for such a
- * delete, we just blindly return 1. To return 0 would mean performing
- * a search for the entry first before deleting it (to confirm that it
- * did exist prior to the delete), so right now we sacrifice accuracy
- * here for the sake of efficiency.
- */
- @Override
- public void execute() throws ConnectorException {
- // first make a copy of the initial LDAP context we got from
- // the connection. The actual update-class operation will use
- // this copy. This will enable the close and cancel methods
- // to stop any LDAP operations we are making by calling the
- // close() method of the copy context, without closing our
- // real connection to the LDAP server
- try {
- ldapCtx = (LdapContext)this.initialLdapContext.lookup(""); //$NON-NLS-1$
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.createContextError",ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
-
- if (command instanceof Update) {
- executeUpdate();
- }
- else if (command instanceof Delete) {
- executeDelete();
- }
- else if (command instanceof Insert) {
- executeInsert();
- }
- else {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.incorrectCommandError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- }
-
- @Override
- public int[] getUpdateCounts() throws DataNotAvailableException,
- ConnectorException {
- return new int[] {1};
- }
-
-
- // Private method to actually do an insert operation. Per JNDI doc at
- // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html, JNDI method to add new entry to LDAP that does not contain a Java object is
- // DirContext.createSubContext(), so that is what is used here.
- //
- // The insert must include an element named "DN" (case insensitive)
- // which will be the fully qualified LDAP distinguished name of the
- // entry to add.
- //
- // Also, while we make no effort to prevent insert operations that
- // break these rules, the underlying LDAP operation will fail (and
- // pass back an explanatory message, which we will return in a
- // ConnectorException, in the following cases:
- // -if the parent context for this entry does not exist in the directory
- // -if the insert does not specify values for all required attributes
- // of the class. Since objectClass is required for all LDAP entries,
- // if it is not specified this condition will apply - and once it is
- // specified then all of the other required attributes for that
- // objectClass will of course also be required.
- //
- // Just as with the read support in the LDAPSyncQueryExecution class,
- // multi-value attributes are not supported by this implementation.
- //
- // TODO - maybe automatically specify objectClass based off of
- // Name/NameInSource RESTRICT property settings, like with read support
- private void executeInsert()
- throws ConnectorException {
-
- List<ColumnReference> insertElementList = ((Insert)command).getColumns();
- List<Expression> insertValueList = ((ExpressionValueSource)((Insert)command).getValueSource()).getValues();
- // create a new attribute list with case ignored in attribute
- // names
- Attributes insertAttrs = new BasicAttributes(true);
- Attribute insertAttr; // what we will use to populate the attribute list
- ColumnReference insertElement;
- String nameInsertElement;
- Object insertValue;
- String distinguishedName = null;
- // The IInsert interface uses separate List objects for
- // the element names and values to be inserted, limiting
- // the potential for code reuse in reading them (since all
- // other interfaces use ICriteria-based mechanisms for such
- // input).
- for (int i=0; i < insertElementList.size(); i++) {
- insertElement = insertElementList.get(i);
- // call utility class to get NameInSource/Name of element
- nameInsertElement = getNameFromElement(insertElement);
- // special handling for DN attribute - use it to set
- // distinguishedName value.
- if (nameInsertElement.toUpperCase().equals("DN")) { //$NON-NLS-1$
- insertValue = ((Literal)insertValueList.get(i)).getValue();
- if (insertValue == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.columnSourceNameDNNullError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- if (!(insertValue instanceof java.lang.String)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.columnSourceNameDNTypeError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- distinguishedName = (String)insertValue;
- }
- // for other attributes specified in the insert command,
- // create a new
- else {
- insertAttr = new BasicAttribute(nameInsertElement);
- insertValue = ((Literal)insertValueList.get(i)).getValue();
- insertAttr.add(insertValue);
- insertAttrs.put(insertAttr);
- }
- }
- // if the DN is not specified, we don't know enough to attempt
- // the LDAP add operation, so throw an exception
- if (distinguishedName == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.noInsertSourceNameDNError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- // just try to create a new LDAP entry using the DN and
- // attributes specified in the INSERT operation. If it isn't
- // legal, we'll get a NamingException back, whose explanation
- // we'll return in a ConnectorException
- try {
- ldapCtx.createSubcontext(distinguishedName, insertAttrs);
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.insertFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg);
- } catch (Exception e) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.insertFailedUnexpected",distinguishedName); //$NON-NLS-1$
- throw new ConnectorException(e, msg);
- }
- }
-
- // Private method to actually do a delete operation. Per JNDI doc at
- // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html,
- // a good JNDI method to delete an entry to LDAP is
- // DirContext.destroySubContext(), so that is what is used here.
- //
- // The delete criteria must include only an equals comparison
- // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
- // Note that the underlying LDAP operations here return successfully
- // even if the named entry doesn't exist (as long as its parent does
- // exist).
- private void executeDelete()
- throws ConnectorException {
-
- Condition criteria = ((Delete)command).getWhere();
-
- // since we have the exact same processing rules for criteria
- // for updates and deletes, we use a common private method to do this.
- // note that this private method will throw a ConnectorException
- // for illegal criteria, which we deliberately don't catch
- // so it gets passed on as is.
- String distinguishedName = getDNFromCriteria(criteria);
-
- // just try to delete an LDAP entry using the DN
- // specified in the DELETE operation. If it isn't
- // legal, we'll get a NamingException back, whose explanation
- // we'll return in a ConnectorException
- try {
- ldapCtx.destroySubcontext(distinguishedName);
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.deleteFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg);
- // don't remember why I added this generic catch of Exception,
- // but it does no harm...
- } catch (Exception e) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.deleteFailedUnexpected",distinguishedName); //$NON-NLS-1$
- throw new ConnectorException(e, msg);
- }
- }
-
- // Private method to actually do an update operation. Per JNDI doc at
- // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html,
- // the JNDI method to use to update an entry to LDAP is one of the
- // DirContext.modifyAttributes() methods that takes ModificationItem[]
- // as a parameter, so that is what is used here.
- // Note that this method does not allow for changing of the DN - to
- // implement that we would need to use Context.rename(). Since right
- // now we only call modifyAttributes(), and don't check for the DN
- // in the list of updates, we will attempt to update the DN using
- // modifyAttributes(), and let the LDAP server fail the request (and
- // send us the explanation for the failure, which is returned in
- // a ConnectorException)
- //
- // The update criteria must include only an equals comparison
- // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
- private void executeUpdate()
- throws ConnectorException {
-
- List<SetClause> updateList = ((Update)command).getChanges();
- Condition criteria = ((Update)command).getWhere();
-
- // since we have the exact same processing rules for criteria
- // for updates and deletes, we use a common private method to do this.
- // note that this private method will throw a ConnectorException
- // for illegal criteria, which we deliberately don't catch
- // so it gets passed on as is.
- String distinguishedName = getDNFromCriteria(criteria);
-
-
- // this will be the list of modifications to attempt. Since
- // we currently blindly try all the updates the query
- // specifies, right now this is the same size as the updateList.
- // When we start filtering out DN changes (which would need to
- // be performed separately using Context.rename()), we will
- // need to account for this in determining this list size.
- ModificationItem[] updateMods = new ModificationItem[updateList.size()];
- ColumnReference leftElement;
- Expression rightExpr;
- String nameLeftElement;
- Object valueRightExpr;
- // iterate through the supplied list of updates (each of
- // which is an ICompareCriteria with an IElement on the left
- // side and an IExpression on the right, per the Connector
- // API).
- for (int i=0; i < updateList.size(); i++) {
- SetClause setClause = updateList.get(i);
- // trust that connector API is right and left side
- // will always be an IElement
- leftElement = setClause.getSymbol();
- // call utility method to get NameInSource/Name for element
- nameLeftElement = getNameFromElement(leftElement);
- // get right expression - if it is not a literal we
- // can't handle that so throw an exception
- rightExpr = setClause.getValue();
- if (!(rightExpr instanceof Literal)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.valueNotLiteralError",nameLeftElement); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- valueRightExpr = ((Literal)rightExpr).getValue();
- // add in the modification as a replacement - meaning
- // any existing value(s) for this attribute will
- // be replaced by the new value. If the attribute
- // didn't exist, it will automatically be created
- // TODO - since null is a valid attribute
- // value, we don't do any special handling of it right
- // now. But maybe null should mean to delete an
- // attribute?
- updateMods[i] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute(nameLeftElement, valueRightExpr));
- }
- // just try to update an LDAP entry using the DN and
- // attributes specified in the UPDATE operation. If it isn't
- // legal, we'll get a NamingException back, whose explanation
- // we'll return in a ConnectorException
- try {
- ldapCtx.modifyAttributes(distinguishedName, updateMods);
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.updateFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
- throw new ConnectorException(msg);
- // don't remember why I added this generic catch of Exception,
- // but it does no harm...
- } catch (Exception e) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.updateFailedUnexpected",distinguishedName); //$NON-NLS-1$
- throw new ConnectorException(e, msg);
- }
- }
-
- // private method for extracting the distinguished name from
- // the criteria, which must include only an equals comparison
- // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
- // most of this code is to check the criteria to make sure it is in
- // this form and throw an appropriate exception if it is not
- // since there is no way to specify this granularity of criteria
- // right now in the connector capabilities
- private String getDNFromCriteria(Condition criteria)
- throws ConnectorException {
- if (criteria == null) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaEmptyError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- if (!(criteria instanceof Comparison)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaNotSimpleError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- Comparison compareCriteria = (Comparison)criteria;
- if (compareCriteria.getOperator() != Operator.EQ) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaNotEqualsError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- Expression leftExpr = compareCriteria.getLeftExpression();
- if (!(leftExpr instanceof ColumnReference)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaLHSNotElementError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- // call utility method to get NameInSource/Name for element
- String nameLeftExpr = getNameFromElement((ColumnReference)leftExpr);
- if (!(nameLeftExpr.toUpperCase().equals("DN"))) { //$NON-NLS-1$
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaSrcColumnError",nameLeftExpr); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- Expression rightExpr = compareCriteria.getRightExpression();
- if (!(rightExpr instanceof Literal)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaRHSNotLiteralError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- Object valueRightExpr = ((Literal)rightExpr).getValue();
- if (!(valueRightExpr instanceof java.lang.String)) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaRHSNotStringError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- return (String)valueRightExpr;
- }
-
- // This is an exact copy of the method with the same name in
- // IQueryToLdapSearchParser - really should be in a utility class
- private String getNameFromElement(ColumnReference e) throws ConnectorException {
- String ldapAttributeName = null;
- String elementNameDirect = e.getName();
- if (elementNameDirect == null) {
- } else {
- }
- AbstractMetadataRecord mdObject = e.getMetadataObject();
- if (mdObject == null) {
- return ""; //$NON-NLS-1$
- }
- ldapAttributeName = mdObject.getNameInSource();
- if(ldapAttributeName == null || ldapAttributeName.equals("")) { //$NON-NLS-1$
- ldapAttributeName = mdObject.getName();
- // If name in source is not set, then fall back to the column name.
- }
- return ldapAttributeName;
- }
-
-
- // cancel here by closing the copy of the ldap context (if it was
- // initialized, which is only true if execute() was previously called)
- // calling close on already closed context is safe per
- // javax.naming.Context javadoc so we won't worry about this also
- // happening in our close method
- public void cancel() throws ConnectorException {
- close();
- }
-
- // close here by closing the copy of the ldap context (if it was
- // initialized, which is only true if execute() was previously called)
- // calling close on already closed context is safe per
- // javax.naming.Context javadoc so we won't worry about this also
- // happening in our close method
- public void close() throws ConnectorException {
- try {
- if(ldapCtx != null) {
- ldapCtx.close();
- }
- } catch (NamingException ne) {
- final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.closeContextError",ne.getExplanation()); //$NON-NLS-1$
- this.config.getLogger().logError(msg);
- }
- }
-
-}
-
-
-
-
-
-
-
-
-
-
Modified: trunk/connectors/connector-ldap/src/main/rar/META-INF/ra.xml
===================================================================
--- trunk/connectors/connector-ldap/src/main/rar/META-INF/ra.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-ldap/src/main/rar/META-INF/ra.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,63 +34,13 @@
<license-required>true</license-required>
</license>
<resourceadapter>
- <resourceadapter-class>org.teiid.connector.basic.BasicResourceAdapter</resourceadapter-class>
+ <resourceadapter-class>org.teiid.resource.spi.BasicResourceAdapter</resourceadapter-class>
<outbound-resourceadapter>
<connection-definition>
- <managedconnectionfactory-class>com.metamatrix.connector.ldap.LDAPManagedConnectionFactory</managedconnectionfactory-class>
+ <managedconnectionfactory-class>org.teiid.resource.cci.ldap.LDAPManagedConnectionFactory</managedconnectionfactory-class>
<config-property>
- <description>{$display:"Connector Class",$advanced:"true"}</description>
- <config-property-name>ConnectorClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.ldap.LDAPConnector</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Connector Capabilities",$description:"The class to use to provide the Connector Capabilities",$advanced:"true"}</description>
- <config-property-name>CapabilitiesClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.ldap.LDAPConnectorCapabilities</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is Immutable",$description:"Is Immutable, True if the source never changes.",$advanced:"true"}</description>
- <config-property-name>Immutable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is XA Capable",$description:"True, if this connector supports XA Transactions",$advanced:"true"}</description>
- <config-property-name>XaCapable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Exception on Exceeding Max Rows",$description:"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",$advanced:"true"}</description>
- <config-property-name>ExceptionOnMaxRows</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Maximum Result Rows",$description:"Maximum Result Rows allowed",$advanced:"true"}</description>
- <config-property-name>MaxResultRows</config-property-name>
- <config-property-type>java.lang.Integer</config-property-type>
- <config-property-value>-1</config-property-value>
- </config-property>
-
- <!-- LDAP Specific properties -->
-
- <config-property>
- <description>{$display:"Default Search Base DN",$description:"Default Base DN for LDAP Searches",$advanced:"true"}</description>
- <config-property-name>SearchDefaultBaseDN</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
-
- <config-property>
<description>{$display:"Ldap Admin User DN",$description:"User DN for the LDAP admin account.",$required:"true"}</description>
<config-property-name>LdapAdminUserDN</config-property-name>
<config-property-type>java.lang.String</config-property-type>
@@ -104,13 +54,6 @@
</config-property>
<config-property>
- <description>{$display:"Restrict Searches To Named Object Class",$description:"Restrict Searches to objectClass named in the Name field for a table",$advanced:"true"}</description>
- <config-property-name>RestrictToObjectClass</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
<description>{$display:"Ldap Transaction Timeout (ms)",$description:"Timeout value for LDAP searches. Defaults to TCP timeout value."}</description>
<config-property-name>LdapTxnTimeoutInMillis</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
@@ -122,19 +65,19 @@
<config-property-name>LdapUrl</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>ldap://<ldapServer>:<389></config-property-value>
- </config-property>
+ </config-property>
<config-property>
- <description>{$display:"Default Search Scope",$description:"Default Scope for LDAP Searches",$allowed:["OBJECT_SCOPE","ONELEVEL_SCOPE","SUBTREE_SCOPE"],$required:"true"}</description>
- <config-property-name>SearchDefaultScope</config-property-name>
+ <description>{$display:"Ldap Context Factory",$description:"LDAP Context factory Class",$required:"true", readOnly="true"}</description>
+ <config-property-name>LdapContextFactory</config-property-name>
<config-property-type>java.lang.String</config-property-type>
- <config-property-value>SUBTREE_SCOPE</config-property-value>
- </config-property>
+ <config-property-value>com.sun.jndi.ldap.LdapCtxFactory</config-property-value>
+ </config-property>
- <connectionfactory-interface>org.teiid.connector.api.Connector</connectionfactory-interface>
- <connectionfactory-impl-class>org.teiid.connector.basic.WrappedConnector</connectionfactory-impl-class>
- <connection-interface>org.teiid.connector.api.Connection</connection-interface>
- <connection-impl-class>org.teiid.connector.basic.WrappedConnection</connection-impl-class>
+ <connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
+ <connectionfactory-impl-class>org.teiid.resource.spi.WrappedConnectionFactory</connectionfactory-impl-class>
+ <connection-interface>javax.resource.cci.Connection</connection-interface>
+ <connection-impl-class>org.teiid.resource.spi.WrappedConnection</connection-impl-class>
</connection-definition>
Added: trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/i18n.properties
===================================================================
--- trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/i18n.properties (rev 0)
+++ trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,83 @@
+#
+# 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.
+#
+
+LDAPConnector.loggerNotFound=Logger not found in current environment.
+LDAPConnector.getConnectionFailed=Connection pool is not initialized properly. Cannot create a new connection.
+#
+LDAPConnection.urlPropNotFound=Ldap URL property not found.
+LDAPConnection.adminUserDNPropNotFound=Ldap Admin User DN property not found.
+LDAPConnection.adminUserPassPropNotFound=Ldap Admin password property not found.
+LDAPConnection.maxCriteriaParseError=Ldap Max Criteria property has an invalid format.
+LDAPConnection.maxCriteriaPropNotFound=Ldap Max Criteria property not found.
+LDAPConnection.contextInitFailed=LDAP context initialization failed. Please check connector properties, and verify against LDAP server.
+LDAPConnection.propertyFileParseFailed=The Properties file could not be parsed.
+LDAPConnection.directoryNamingError=Initializing LDAP directory context failed. Please check LDAP connection properties, including username and password: {0}
+LDAPConnection.directoryInitError=Initializing LDAP directory context failed.
+LDAPConnection.unsupportedExecMode=LDAPConnector does not support requested execution mode.
+LDAPConnection.contextCloseError=The Connection failed to close LDAP context: {0}
+#
+IQueryToLdapSearchParser.noTablesInFromError=Cannot parse query - no tables defined in FROM clause.
+IQueryToLdapSearchParser.multiItemsInFromError=Cannot parse query - multiple items in FROM clause not supported.
+IQueryToLdapSearchParser.baseContextNameError=Base context name (DN) not specified in Name In Source or connector properties.
+IQueryToLdapSearchParser.groupCountExceededError=Query contained from clause that did not have exactly and only one group. Query not supported.
+IQueryToLdapSearchParser.criteriaNotParsableError=Compound criteria operator was not parsable.
+IQueryToLdapSearchParser.timestampClassNotFoundError=Timestamp class was not found.
+IQueryToLdapSearchParser.unsupportedElementError=Encountered an element type that is not supported. Revise the capabilities.
+IQueryToLdapSearchParser.missingNISError=An element (or expression) found in the query's compare criteria was missing a NameInSource definition (or name). Please ensure the name in source is defined for each element.
+IQueryToLdapSearchParser.criteriaNotSupportedError=Encountered a criteria that is not supported.
+IQueryToLdapSearchParser.searchDetailsLoggingError=Error writing LDAP search details to log
+#
+LDAPSyncQueryExecution.execModeError=Synchronous query was called by connector, but request does not match. Cannot execute request.
+LDAPSyncQueryExecution.setControlsError=Failed to set standard sort controls. Please verify that the server supports sorting, and that the bind user has permission to use sort controls.
+LDAPSyncQueryExecution.createContextError=Failed to create LDAP search context from the specified context name. Check the table/group name in source to ensure the context exists.
+LDAPSyncQueryExecution.configAttrsError=Failed to configure attributes properly.
+LDAPSyncQueryExecution.execSearchError=Execute search failed. Please check logs for search details.
+LDAPSyncQueryExecution.nullBatchError=A null Batch was encountered.
+LDAPSyncQueryExecution.nullAttrError=Encountered null attribute name for a select symbol. Please check name in source for each column.
+LDAPSyncQueryExecution.attrValueFetchError=Failed to fetch attribute value for attribute {0}. Rowset cannot be constructed from incomplete LDAP results.
+LDAPSyncQueryExecution.supportedClassNotFoundError=Supported class not found.
+LDAPSyncQueryExecution.closeContextError=LDAP error occurred during attempt to close context : {0}
+#
+LDAPUpdateExecution.execModeError=Update was called by connector, but request does not match. Cannot execute request.
+LDAPUpdateExecution.createContextError=Failed to create copy of the initial LDAP context: {0}
+LDAPUpdateExecution.incorrectCommandError=Incorrect command type. Expecting INSERT, UPDATE, or DELETE.
+LDAPUpdateExecution.columnSourceNameDNNullError=value for column with source name DN is null - must be set to distinguishedName for new record
+LDAPUpdateExecution.columnSourceNameDNTypeError=value for column with source name DN is not a string - must be set to distinguishedName string for new record
+LDAPUpdateExecution.noInsertSourceNameDNError=no column in insert statement with source name DN - must be present and set to distinguishedName for new record
+LDAPUpdateExecution.insertFailed=Insert of {0} failed: {1}
+LDAPUpdateExecution.insertFailedUnexpected=Insert of {0} failed for unexpected reason
+LDAPUpdateExecution.deleteFailed=Delete of {0} failed: {1}
+LDAPUpdateExecution.deleteFailedUnexpected=Delete of {0} failed for unexpected reason
+LDAPUpdateExecution.updateFailed=Update of {0} failed: {1}
+LDAPUpdateExecution.updateFailedUnexpected=Update of {0} failed for unexpected reason
+LDAPUpdateExecution.valueNotLiteralError=specified value for attribute {0} is not a literal
+LDAPUpdateExecution.criteriaEmptyError=No criteria specified on update - must specify DN in WHERE clause
+LDAPUpdateExecution.criteriaNotSimpleError=criteria is not a simple comparison - expecting simple equals comparison on DN as only item in WHERE clause
+LDAPUpdateExecution.criteriaNotEqualsError=criteria is not an equals comparison - expecting simple equals comparison on DN as only item in WHERE clause
+LDAPUpdateExecution.criteriaLHSNotElementError=left side of criteria is not an element name - expecting simple equals comparison on DN as only item in WHERE clause
+LDAPUpdateExecution.criteriaSrcColumnError=criteria is on source column {0}, but should be on a source column named DN
+LDAPUpdateExecution.criteriaRHSNotLiteralError=right side of equals comparison against DN is not a literal - must be a string literal
+LDAPUpdateExecution.criteriaRHSNotStringError=right side of equals comparison against DN is not a string - must be a string literal
+LDAPUpdateExecution.closeContextError=LDAP error occurred during attempt to close context : {0}
+#
+LDAPSourceConnectionFactory.creatingConnection=LDAPSourceConnectionFactory is creating a new connection.
+
Property changes on: trunk/connectors/connector-ldap/src/main/resources/org/teiid/resource/cci/ldap/i18n.properties
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap (from rev 2083, trunk/connectors/connector-ldap/src/test/java/com/metamatrix/connector/ldap)
Deleted: trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestIQueryToLdapSearchParser.java
===================================================================
--- trunk/connectors/connector-ldap/src/test/java/com/metamatrix/connector/ldap/TestIQueryToLdapSearchParser.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestIQueryToLdapSearchParser.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,309 +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 com.metamatrix.connector.ldap;
-
-import static org.mockito.Mockito.*;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.naming.directory.Attribute;
-import javax.naming.directory.SearchControls;
-import javax.naming.ldap.SortKey;
-
-import junit.framework.TestCase;
-
-import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.MetadataStore;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-import org.teiid.connector.metadata.runtime.Schema;
-import org.teiid.connector.metadata.runtime.Table;
-import org.teiid.connector.metadata.runtime.Column.SearchType;
-import org.teiid.dqp.internal.datamgr.metadata.RuntimeMetadataImpl;
-import org.teiid.metadata.CompositeMetadataStore;
-import org.teiid.metadata.TransformationMetadata;
-
-import com.metamatrix.cdk.CommandBuilder;
-import com.metamatrix.common.types.DataTypeManager;
-import com.metamatrix.query.metadata.QueryMetadataInterface;
-import com.metamatrix.query.unittest.RealMetadataFactory;
-
-/**
- * Test IQueryToLdapSearchParser.
- */
-/**
- * @author mdrilling
- *
- */
-public class TestIQueryToLdapSearchParser extends TestCase {
-
- public TestIQueryToLdapSearchParser(String name) {
- super(name);
- }
-
- /**
- * Get Resolved Command using SQL String and metadata.
- */
- public Command getCommand(String sql, QueryMetadataInterface metadata) {
- CommandBuilder builder = new CommandBuilder(metadata);
- return builder.getCommand(sql);
- }
-
- /**
- * Helper method for testing the provided LDAPSearchDetails against expected values
- * @param searchDetails the LDAPSearchDetails object
- * @param expectedContextName the expected context name
- * @param expectedContextFilter the expected context filter string
- * @param expectedAttrNameList list of expected attribute names
- * @param expectedCountLimit the expected count limit
- * @param expectedSearchScope the expected search scope
- * @param expectedSortKeys the expected sortKeys list.
- */
- public void helpTestSearchDetails(final LDAPSearchDetails searchDetails, final String expectedContextName,
- final String expectedContextFilter, final List expectedAttrNameList, final long expectedCountLimit,
- final int expectedSearchScope, final SortKey[] expectedSortKeys) {
-
- // Get all of the actual values
- String contextName = searchDetails.getContextName();
- String contextFilter = searchDetails.getContextFilter();
- List attrList = searchDetails.getAttributeList();
- long countLimit = searchDetails.getCountLimit();
- int searchScope = searchDetails.getSearchScope();
- SortKey[] sortKeys = searchDetails.getSortKeys();
-
- // Compare actual with Expected
- assertEquals(expectedContextName, contextName);
- assertEquals(expectedContextFilter, contextFilter);
-
- assertEquals(attrList.size(),expectedAttrNameList.size());
- Iterator iter = attrList.iterator();
- Iterator eIter = expectedAttrNameList.iterator();
- while(iter.hasNext()&&eIter.hasNext()) {
- String actualName = ((Attribute)iter.next()).getID();
- String expectedName = (String)eIter.next();
- assertEquals(actualName, expectedName);
- }
-
- assertEquals(expectedCountLimit, countLimit);
- assertEquals(expectedSearchScope, searchScope);
- assertEquals(expectedSortKeys, sortKeys);
- }
-
- /**
- * Test a Query without criteria
- */
- public void testSelectFrom1() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(objectClass=*)"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
-
- }
-
- /**
- * Test a Query with a criteria
- */
- public void testSelectFromWhere1() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name = 'R%'"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(cn=R%)"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
-
- }
-
- /**
- * Test a Query with a criteria
- */
- public void testEscaping() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name = 'R*'"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(cn=R\\2a)"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
-
- }
-
- public void testNot() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE not (Name like 'R%' or Name like 'S%')"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(&(!(cn=R*))(!(cn=S*)))"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
-
- }
-
- public void testGT() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name > 'R'"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(!(cn<=R))"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
- }
-
- public void testLT() throws Exception {
- LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name < 'R'"); //$NON-NLS-1$
-
- //-----------------------------------
- // Set Expected SearchDetails Values
- //-----------------------------------
- String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
- String expectedContextFilter = "(!(cn>=R))"; //$NON-NLS-1$
-
- List expectedAttrNameList = new ArrayList();
- expectedAttrNameList.add("uid"); //$NON-NLS-1$
- expectedAttrNameList.add("cn"); //$NON-NLS-1$
-
- long expectedCountLimit = -1;
- int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
- SortKey[] expectedSortKeys = null;
-
- helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
- expectedCountLimit, expectedSearchScope, expectedSortKeys);
- }
-
- private LDAPSearchDetails helpGetSearchDetails(String queryString) throws ConnectorException {
- QueryMetadataInterface metadata = exampleLdap();
- RuntimeMetadata rm = new RuntimeMetadataImpl(metadata);
-
- LDAPManagedConnectionFactory config = mock(LDAPManagedConnectionFactory.class);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
-
- IQueryToLdapSearchParser searchParser = new IQueryToLdapSearchParser(rm, config);
-
- Select query = (Select)getCommand(queryString, metadata);
-
- LDAPSearchDetails searchDetails = searchParser.translateSQLQueryToLDAPSearch(query);
- return searchDetails;
- }
-
- public static QueryMetadataInterface exampleLdap() {
- MetadataStore metadataStore = new MetadataStore();
-
- // Create models
- Schema ldapModel = RealMetadataFactory.createPhysicalModel("LdapModel", metadataStore); //$NON-NLS-1$
-
- // Create physical groups
- Table table = RealMetadataFactory.createPhysicalGroup("People", ldapModel); //$NON-NLS-1$
- table.setNameInSource("ou=people,dc=metamatrix,dc=com"); //$NON-NLS-1$
-
- // Create physical elements
- String[] elemNames = new String[] {
- "UserID", "Name" //$NON-NLS-1$ //$NON-NLS-2$
- };
- String[] elemTypes = new String[] {
- DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
- };
-
- List<Column> cols = RealMetadataFactory.createElements(table, elemNames, elemTypes);
-
- // Set name in source on each column
- String[] nameInSource = new String[] {
- "uid", "cn" //$NON-NLS-1$ //$NON-NLS-2$
- };
- for(int i=0; i<2; i++) {
- Column obj = cols.get(i);
- obj.setNameInSource(nameInSource[i]);
- }
-
- // Set column-specific properties
- for(int i=1; i<2; i++) {
- cols.get(i).setSearchType(SearchType.Unsearchable);
- }
-
- // Create the facade from the store
- return new TransformationMetadata(null, new CompositeMetadataStore(metadataStore), null, null);
- }
-}
-
Modified: trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestLDAPConnection.java
===================================================================
--- trunk/connectors/connector-ldap/src/test/java/com/metamatrix/connector/ldap/TestLDAPConnection.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-ldap/src/test/java/org/teiid/resource/cci/ldap/TestLDAPConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -20,11 +20,8 @@
* 02110-1301 USA.
*/
-package com.metamatrix.connector.ldap;
+package org.teiid.resource.cci.ldap;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.stub;
-
import java.util.Hashtable;
import javax.naming.Context;
@@ -33,7 +30,8 @@
import org.junit.Test;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorLogger;
+import org.teiid.resource.cci.ldap.LDAPConnectionImpl;
+import org.teiid.resource.cci.ldap.LDAPManagedConnectionFactory;
public class TestLDAPConnection {
@@ -48,14 +46,14 @@
@Test public void testInitialization() throws Exception {
- LDAPManagedConnectionFactory config = mock(LDAPManagedConnectionFactory.class);
- stub(config.getLdapUrl()).toReturn("ldap://foo");
- stub(config.getLdapAdminUserDN()).toReturn("admin");
- stub(config.getLdapAdminUserPassword()).toReturn("password");
+ LDAPManagedConnectionFactory config = new LDAPManagedConnectionFactory();
+ config.setLdapUrl("ldap://foo");
+ config.setLdapAdminUserDN("admin");
+ config.setLdapAdminUserPassword("password");
+ config.setLdapContextFactory(FakeFactory.class.getName());
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- new LDAPConnection(config, FakeFactory.class.getName());
+ new LDAPConnectionImpl(config);
}
}
Modified: trunk/connectors/connector-salesforce/pom.xml
===================================================================
--- trunk/connectors/connector-salesforce/pom.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,35 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
-<project
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <parent>
- <artifactId>connectors</artifactId>
- <groupId>org.jboss.teiid</groupId>
- <version>7.0.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>connector-salesforce</artifactId>
- <groupId>org.jboss.teiid.connectors</groupId>
- <name>Salesforce Connector</name>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>connector-salesforce</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>Salesforce Connector</name>
<packaging>rar</packaging>
- <description>Integrates the query engine with Salesforce.com.</description>
- <dependencies>
+ <description>Integrates the query engine with Salesforce.com.</description>
+ <dependencies>
<dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-connector-api</artifactId>
- <scope>provided</scope>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-common-core</artifactId>
- <scope>provided</scope>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.jboss.teiid.connectors</groupId>
- <artifactId>salesforce-api</artifactId>
- <version>${project.version}</version>
- </dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>salesforce-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
<dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>translator-salesforce</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>javax.resource</groupId>
<artifactId>connector-api</artifactId>
<scope>provided</scope>
@@ -58,7 +63,6 @@
<classifier>lib</classifier>
</configuration>
</execution>
-
</executions>
</plugin>
</plugins>
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,95 +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 com.metamatrix.connector.salesforce;
-
-import javax.security.auth.Subject;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectionContext;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-
-public class Connector extends org.teiid.connector.basic.BasicConnector {
-
- private SalesForceManagedConnectionFactory connectorEnv;
- private boolean singleIdentity;
-
- // ///////////////////////////////////////////////////////////
- // Connector implementation
- // ///////////////////////////////////////////////////////////
- @Override
- public Connection getConnection() throws ConnectorException {
- getLogger().logTrace("Enter SalesforceSourceConnection.getConnection()");
- Connection connection = null;
- if (singleIdentity) {
- connection = new SalesforceConnection(connectorEnv);
- } else {
- // if the security domain is enabled, then subject is not null.
- Subject subject = ConnectionContext.getSubject();
- if(subject != null) {
- connection = new SalesforceConnection(subject, connectorEnv);
- } else {
- throw new ConnectorException("Unknown trusted payload type");
- }
- }
- getLogger().logTrace("Return SalesforceSourceConnection.getConnection()");
- return connection;
- }
-
- @Override
- public void initialize(ConnectorEnvironment env) throws ConnectorException {
- super.initialize(env);
-
- this.connectorEnv = (SalesForceManagedConnectionFactory)env;
-
- getLogger().logInfo("Started"); //$NON-NLS-1$
- getLogger().logInfo("Initialized"); //$NON-NLS-1$
- getLogger().logTrace("Initialization Properties: " + this.connectorEnv.toString()); //$NON-NLS-1$
-
- //validate that both are empty or both have values
- if(this.connectorEnv.getUsername() != null) {
- singleIdentity = true;
- }
-
- getLogger().logTrace("Return SalesforceSourceConnection.initialize()");
- }
-
-
- /////////////////////////////////////////////////////////////
- //Utilities
- /////////////////////////////////////////////////////////////
-
- private ConnectorLogger getLogger(){
- return this.config.getLogger();
- }
-
-
- @Override
- public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
- return SalesforceCapabilities.class;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Constants.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Constants.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Constants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,51 +0,0 @@
-package com.metamatrix.connector.salesforce;
-
-public interface Constants {
-
- public static final String PICKLIST_TYPE = "picklist"; //$NON-NLS-1$
-
- public static final String MULTIPICKLIST_TYPE = "multipicklist"; //$NON-NLS-1$
-
- public static final String COMBOBOX_TYPE = "combobox"; //$NON-NLS-1$
-
- public static final String ANYTYPE_TYPE = "anyType"; //$NON-NLS-1$
-
- public static final String REFERENCE_TYPE = "reference"; //$NON-NLS-1$
-
- public static final String STRING_TYPE = "string"; //$NON-NLS-1$
-
- public static final String BASE64_TYPE = "base64"; //$NON-NLS-1$
-
- public static final String BOOLEAN_TYPE = "boolean"; //$NON-NLS-1$
-
- public static final String CURRENCY_TYPE = "currency"; //$NON-NLS-1$
-
- public static final String TEXTAREA_TYPE = "textarea"; //$NON-NLS-1$
-
- public static final String INT_TYPE = "int"; //$NON-NLS-1$
-
- public static final String DOUBLE_TYPE = "double"; //$NON-NLS-1$
-
- public static final String PERCENT_TYPE = "percent"; //$NON-NLS-1$
-
- public static final String PHONE_TYPE = "phone"; //$NON-NLS-1$
-
- public static final String ID_TYPE = "id"; //$NON-NLS-1$
-
- public static final String DATE_TYPE = "date"; //$NON-NLS-1$
-
- public static final String DATETIME_TYPE = "datetime"; //$NON-NLS-1$
-
- public static final String URL_TYPE = "url"; //$NON-NLS-1$
-
- public static final String EMAIL_TYPE = "email"; //$NON-NLS-1$
-
- public static final String RESTRICTED_PICKLIST_TYPE = "restrictedpicklist"; //$NON-NLS-1$
-
- public static final String RESTRICTED_MULTISELECT_PICKLIST_TYPE = "restrictedmultiselectpicklist"; //$NON-NLS-1$
-
- public static final String SUPPORTS_QUERY = "Supports Query";
-
- public static final String SUPPORTS_RETRIEVE = "Supports Retrieve";
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Messages.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Messages.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Messages.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,41 +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 com.metamatrix.connector.salesforce;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class Messages {
-
- private static final String BUNDLE_NAME = "com.metamatrix.connector.salesforce.i18n"; //$NON-NLS-1$
-
- private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
- public static String getString(String key) {
- try {
- return RESOURCE_BUNDLE.getString(key);
- } catch (MissingResourceException e) {
- return '!' + key + '!';
- }
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,291 +0,0 @@
-package com.metamatrix.connector.salesforce;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.KeyRecord;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.Table;
-import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
-import org.teiid.connector.metadata.runtime.Column.SearchType;
-
-import com.metamatrix.common.types.DataTypeManager;
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.sforce.soap.partner.ChildRelationship;
-import com.sforce.soap.partner.DescribeGlobalResult;
-import com.sforce.soap.partner.DescribeGlobalSObjectResult;
-import com.sforce.soap.partner.DescribeSObjectResult;
-import com.sforce.soap.partner.Field;
-import com.sforce.soap.partner.FieldType;
-import com.sforce.soap.partner.PicklistEntry;
-
-public class MetadataProcessor {
- private MetadataFactory metadataFactory;
- private SalesforceConnection connection;
- private SalesForceManagedConnectionFactory connectorEnv;
-
- private Map<String, Table> tableMap = new HashMap<String, Table>();
- private List<Relationship> relationships = new ArrayList<Relationship>();
- private boolean hasUpdateableColumn = false;
- private List<Column> columns;
-
- // Audit Fields
- public static final String AUDIT_FIELD_CREATED_BY_ID = "CreatedById"; //$NON-NLS-1$
- public static final String AUDIT_FIELD_CREATED_DATE = "CreatedDate"; //$NON-NLS-1$
- public static final String AUDIT_FIELD_LAST_MODIFIED_BY_ID = "LastModifiedById"; //$NON-NLS-1$
- public static final String AUDIT_FIELD_LAST_MODIFIED_DATE = "LastModifiedDate"; //$NON-NLS-1$
- public static final String AUDIT_FIELD_SYSTEM_MOD_STAMP = "SystemModstamp"; //$NON-NLS-1$
-
- // Model Extensions
- static final String TABLE_SUPPORTS_CREATE = "Supports Create"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_DELETE = "Supports Delete"; //$NON-NLS-1$
- static final String TABLE_CUSTOM = "Custom"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_LOOKUP = "Supports ID Lookup"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_MERGE = "Supports Merge"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_QUERY = "Supports Query"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_REPLICATE = "Supports Replicate"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_RETRIEVE = "Supports Retrieve"; //$NON-NLS-1$
- static final String TABLE_SUPPORTS_SEARCH = "Supports Search"; //$NON-NLS-1$
-
- static final String COLUMN_DEFAULTED = "Defaulted on Create"; //$NON-NLS-1$
- static final String COLUMN_CUSTOM = "Custom"; //$NON-NLS-1$
- static final String COLUMN_CALCULATED = "Calculated"; //$NON-NLS-1$
- static final String COLUMN_PICKLIST_VALUES = "Picklist Values"; //$NON-NLS-1$
-
- public MetadataProcessor(SalesforceConnection connection, MetadataFactory metadataFactory, SalesForceManagedConnectionFactory env) {
- this.connection = connection;
- this.metadataFactory = metadataFactory;
- this.connectorEnv = env;
- }
-
- public void processMetadata() throws ConnectorException {
- DescribeGlobalResult globalResult = connection.getObjects();
- List<DescribeGlobalSObjectResult> objects = globalResult.getSobjects();
- for (DescribeGlobalSObjectResult object : objects) {
- addTable(object);
- }
- addRelationships();
- }
-
- private void addRelationships() throws ConnectorException {
- for (Iterator<Relationship> iterator = relationships.iterator(); iterator.hasNext();) {
- Relationship relationship = iterator.next();
- if (!this.connectorEnv.isModelAuditFields() && isAuditField(relationship.getForeignKeyField())) {
- continue;
- }
-
- Table parent = tableMap.get(NameUtil.normalizeName(relationship.getParentTable()));
- KeyRecord pk = parent.getPrimaryKey();
- if (null == pk) {
- throw new RuntimeException("ERROR !!primary key column not found!!"); //$NON-NLS-1$
- }
- ArrayList<String> columnNames = new ArrayList<String>();
- columnNames.add(pk.getName());
-
-
- Table child = tableMap.get(NameUtil.normalizeName(relationship.getChildTable()));
-
- Column col = null;
- columns = child.getColumns();
- for (Iterator colIter = columns.iterator(); colIter.hasNext();) {
- Column column = (Column) colIter.next();
- if(column.getName().equals(relationship.getForeignKeyField())) {
- col = column;
- }
- }
- if (null == col) throw new RuntimeException(
- "ERROR !!foreign key column not found!! " + child.getName() + relationship.getForeignKeyField()); //$NON-NLS-1$
-
-
- String columnName = "FK_" + parent.getName() + "_" + col.getName();
- ArrayList<String> columnNames2 = new ArrayList<String>();
- columnNames2.add(col.getName());
- metadataFactory.addForiegnKey(columnName, columnNames2, parent, child);
-
- }
-
-
- }
-
- public static boolean isAuditField(String name) {
- boolean result = false;
- if(name.equals(AUDIT_FIELD_CREATED_BY_ID) ||
- name.equals(AUDIT_FIELD_CREATED_DATE) ||
- name.equals(AUDIT_FIELD_LAST_MODIFIED_BY_ID) ||
- name.equals(AUDIT_FIELD_LAST_MODIFIED_DATE) ||
- name.equals(AUDIT_FIELD_SYSTEM_MOD_STAMP)) {
- result = true;
- }
- return result;
- }
-
- private void addTable(DescribeGlobalSObjectResult object) throws ConnectorException {
- DescribeSObjectResult objectMetadata = connection.getObjectMetaData(object.getName());
- String name = NameUtil.normalizeName(objectMetadata.getName());
- Table table = metadataFactory.addTable(name);
-
- table.setNameInSource(objectMetadata.getName());
- tableMap.put(name, table);
- getRelationships(objectMetadata);
-
- table.setProperty(TABLE_CUSTOM, String.valueOf(objectMetadata.isCustom()));
- table.setProperty(TABLE_SUPPORTS_CREATE, String.valueOf(objectMetadata.isCreateable()));
- table.setProperty(TABLE_SUPPORTS_DELETE, String.valueOf(objectMetadata.isDeletable()));
- table.setProperty(TABLE_SUPPORTS_MERGE, String.valueOf(objectMetadata.isMergeable()));
- table.setProperty(TABLE_SUPPORTS_QUERY, String.valueOf(objectMetadata.isQueryable()));
- table.setProperty(TABLE_SUPPORTS_REPLICATE, String.valueOf(objectMetadata.isReplicateable()));
- table.setProperty(TABLE_SUPPORTS_RETRIEVE, String.valueOf(objectMetadata.isRetrieveable()));
- table.setProperty(TABLE_SUPPORTS_SEARCH, String.valueOf(objectMetadata.isSearchable()));
-
- hasUpdateableColumn = false;
- addColumns(objectMetadata, table);
-
- // Some SF objects return true for isUpdateable() but have no updateable columns.
- if(hasUpdateableColumn && objectMetadata.isUpdateable()) {
- table.setSupportsUpdate(true);
- }
- }
-
- private void getRelationships(DescribeSObjectResult objectMetadata) {
- List<ChildRelationship> children = objectMetadata.getChildRelationships();
- if(children != null && children.size() != 0) {
- for (ChildRelationship childRelation : children) {
- Relationship newRelation = new RelationshipImpl();
- newRelation.setParentTable(objectMetadata.getName());
- newRelation.setChildTable(childRelation.getChildSObject());
- newRelation.setForeignKeyField(childRelation.getField());
- newRelation.setCascadeDelete(childRelation.isCascadeDelete());
- relationships.add(newRelation);
- }
- }
- }
-
- private void addColumns(DescribeSObjectResult objectMetadata, Table table) throws ConnectorException {
- List<Field> fields = objectMetadata.getFields();
- for (Field field : fields) {
- String normalizedName = NameUtil.normalizeName(field.getName());
- FieldType fieldType = field.getType();
- if(!this.connectorEnv.isModelAuditFields() && isAuditField(field.getName())) {
- continue;
- }
- String sfTypeName = fieldType.value();
- Column column = null;
- if(sfTypeName.equals(FieldType.STRING) || //string
- sfTypeName.equals(FieldType.COMBOBOX) || //"combobox"
- sfTypeName.equals(FieldType.REFERENCE) || //"reference"
- sfTypeName.equals(FieldType.PHONE) || //"phone"
- sfTypeName.equals(FieldType.ID) || //"id"
- sfTypeName.equals(FieldType.URL) || //"url"
- sfTypeName.equals(FieldType.EMAIL) || //"email"
- sfTypeName.equals(FieldType.ENCRYPTEDSTRING) || //"encryptedstring"
- sfTypeName.equals(FieldType.ANY_TYPE)) { //"anytype"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
- column.setNativeType(sfTypeName);
- if(sfTypeName.equals(FieldType.ID)) {
- column.setNullType(NullType.No_Nulls);
- ArrayList<String> columnNames = new ArrayList<String>();
- columnNames.add(field.getName());
- metadataFactory.addPrimaryKey(field.getName()+"_PK", columnNames, table);
- }
- }
- else if(sfTypeName.equals(FieldType.PICKLIST)) { // "picklist"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
- if(field.isRestrictedPicklist()) {
- column.setNativeType("restrictedpicklist");
- } else {
- column.setNativeType(sfTypeName);
- }
-
- column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
- }
- else if(sfTypeName.equals(FieldType.MULTIPICKLIST)) { //"multipicklist"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
- if(field.isRestrictedPicklist()) {
- column.setNativeType("restrictedmultiselectpicklist");
- } else {
- column.setNativeType(sfTypeName);
- }
- column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
- }
- else if(sfTypeName.equals(FieldType.BASE_64)) { //"base64"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BLOB, table);
- column.setNativeType(sfTypeName);
- }
- else if(sfTypeName.equals(FieldType.BOOLEAN)) { //"boolean"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BOOLEAN, table);
- column.setNativeType(sfTypeName);
- }
- else if(sfTypeName.equals(FieldType.CURRENCY)) { //"currency"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
- column.setNativeType(sfTypeName);
- column.setCurrency(true);
- column.setScale(field.getScale());
- column.setPrecision(field.getPrecision());
- }
- else if(sfTypeName.equals(FieldType.TEXTAREA)) { //"textarea"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
- column.setNativeType(sfTypeName);
- column.setSearchType(SearchType.Unsearchable);
- }
- else if(sfTypeName.equals(FieldType.INT)) { //"int"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.INTEGER, table);
- column.setNativeType(sfTypeName);
- column.setPrecision(field.getPrecision());
- }
- else if(sfTypeName.equals(FieldType.DOUBLE) || //"double"
- sfTypeName.equals(FieldType.PERCENT)) { //"percent"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
- column.setNativeType(sfTypeName);
- column.setScale(field.getScale());
- column.setPrecision(field.getPrecision());
- }
- else if(sfTypeName.equals(FieldType.DATE)) { //"date"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DATE, table);
- column.setNativeType(sfTypeName);
- }
- else if(sfTypeName.equals(FieldType.DATETIME)) { //"datetime"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIMESTAMP, table);
- column.setNativeType(sfTypeName);
- }
- else if(sfTypeName.equals(FieldType.TIME)) { //"time"
- column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIME, table);
- column.setNativeType(sfTypeName);
- }
- if(null == column) {
- connectorEnv.getLogger().logError("Unknown type returned by SalesForce: " + sfTypeName);
- continue;
- } else {
- column.setNameInSource(field.getName());
- column.setLength(field.getLength());
- if(field.isUpdateable()) {
- column.setUpdatable(true);
- hasUpdateableColumn = true;
- }
- column.setProperty(COLUMN_CALCULATED, String.valueOf(field.isCalculated()));
- column.setProperty(COLUMN_CUSTOM, String.valueOf(field.isCustom()));
- column.setProperty(COLUMN_DEFAULTED, String.valueOf(field.isDefaultedOnCreate()));
- }
-
- }
- }
-
- private String getPicklistValues(Field field) {
- StringBuffer picklistValues = new StringBuffer();
- if(null != field.getPicklistValues() && 0 != field.getPicklistValues().size()) {
- List<PicklistEntry> entries = field.getPicklistValues();
- for (Iterator<PicklistEntry> iterator = entries.iterator(); iterator.hasNext();) {
- PicklistEntry entry = iterator.next();
- picklistValues.append(entry.getValue());
- if(iterator.hasNext()) {
- picklistValues.append(',');
- }
- }
- }
- return picklistValues.toString();
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,85 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- *
- * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
- *
- * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
- */
-package com.metamatrix.connector.salesforce;
-
-import org.teiid.connector.language.SQLReservedWords;
-
-public class NameUtil {
-
- public static String normalizeName( String nameIn ) {
- String normal = nameIn.trim();
- normal = removeDuplicate(normal);
- normal = removeSpaces(normal);
- normal = removeIllegalChars(normal);
- normal = removeTrailingUnderscore(normal);
- normal = removeLeadingUnderscore(normal);
- normal = checkReservedWords(normal);
- return normal;
-
- }
-
- /**
- * @param normal
- * @return
- */
- private static String checkReservedWords( String normal ) {
- if (SQLReservedWords.isReservedWord(normal)) {
- normal = normal + "_"; //$NON-NLS-1$
- }
- return normal;
- }
-
- private static String removeTrailingUnderscore( String normal ) {
- if (normal.endsWith("_")) { //$NON-NLS-1$
- return normal.substring(0, normal.lastIndexOf('_'));
- }
- return normal;
- }
-
- private static String removeIllegalChars( String normal ) {
- String edit = normal;
- edit = edit.replace('.', '_');
- edit = edit.replace('(', '_');
- edit = edit.replace(')', '_');
- edit = edit.replace('/', '_');
- edit = edit.replace('\\', '_');
- edit = edit.replace(':', '_');
- edit = edit.replace('\'', '_');
- edit = edit.replace('-', '_');
- edit = edit.replace("%", "percentage");//$NON-NLS-1$ //$NON-NLS-2$
- edit = edit.replace("#", "number");//$NON-NLS-1$ //$NON-NLS-2$
- edit = edit.replace("$", "_");//$NON-NLS-1$ //$NON-NLS-2$
- edit = edit.replace("{", "_");//$NON-NLS-1$ //$NON-NLS-2$
- edit = edit.replace("}", "_");//$NON-NLS-1$ //$NON-NLS-2$
- return edit;
- }
-
- private static String removeSpaces( String normal ) {
- return normal.replace(' ', '_');
- }
-
- private static String removeDuplicate( String normal ) {
- if (normal.indexOf('(') < 0 || normal.indexOf(')') != normal.length() - 1) return normal;
- String firstPart = normal.substring(0, normal.indexOf('(')).trim();
- String secondPart = normal.substring(normal.indexOf('(') + 1, normal.length() - 1).trim();
- if (firstPart.equals(secondPart) || secondPart.equals("null")) return firstPart; //$NON-NLS-1$
- return normal;
- }
-
- /**
- * @param normal
- * @return
- */
- private static String removeLeadingUnderscore( String normal ) {
- while (normal.indexOf('_') == 0) {
- normal = normal.substring(1);
- }
- return normal;
- }
-
-}
\ No newline at end of file
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,21 +0,0 @@
-package com.metamatrix.connector.salesforce;
-
-public interface Relationship {
-
- void setParentTable(String name);
-
- void setChildTable(String childSObject);
-
- void setForeignKeyField(String field);
-
- void setCascadeDelete(boolean cascadeDelete);
-
- public boolean isCascadeDelete();
-
- public String getChildTable();
-
- public String getForeignKeyField();
-
- public String getParentTable();
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,40 +0,0 @@
-package com.metamatrix.connector.salesforce;
-
-public class RelationshipImpl implements Relationship {
- boolean cascadeDelete;
- public String childTablename;
- public String parentTableName;
- public String foreignKeyField;
-
- public void setCascadeDelete(boolean delete) {
- cascadeDelete = delete;
- }
-
- public boolean isCascadeDelete() {
- return cascadeDelete;
- }
-
- public void setChildTable(String childTable) {
- childTablename = childTable;
- }
-
- public String getChildTable() {
- return childTablename;
- }
-
- public String getForeignKeyField() {
- return foreignKeyField;
- }
-
- public void setForeignKeyField(String foreignKeyField) {
- this.foreignKeyField = foreignKeyField;
- }
-
- public String getParentTable() {
- return parentTableName;
- }
-
- public void setParentTable(String parentTableName) {
- this.parentTableName = parentTableName;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForceManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForceManagedConnectionFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForceManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,101 +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 com.metamatrix.connector.salesforce;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.teiid.connector.basic.BasicManagedConnectionFactory;
-
-import com.metamatrix.core.MetaMatrixRuntimeException;
-
-public class SalesForceManagedConnectionFactory extends BasicManagedConnectionFactory {
- private static final long serialVersionUID = 5298591275313314698L;
-
- private String username;
- private String connectorStateClass;
- private String password;
- private URL URL;
- private long sourceConnectionTestInterval = -1;
- private int sourceConnectionTimeout = -1;
- private boolean auditModelFields = false;
-
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- if (username.trim().length() == 0) {
- throw new MetaMatrixRuntimeException("Name can not be null");
- }
- this.username = username;
- }
- public String getConnectorStateClass() {
- return this.connectorStateClass;
- }
- public void setConnectorStateClass(String connectorStateClass) {
- this.connectorStateClass = connectorStateClass;
- }
- public String getPassword() {
- return this.password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public URL getURL() {
- return this.URL;
- }
-
- public void setURL(String uRL) {
- try {
- this.URL = new URL(uRL);
- } catch (MalformedURLException e) {
- throw new MetaMatrixRuntimeException("URL Supplied is not valid URL"+ e.getMessage());
- }
- }
-
- public long getSourceConnectionTestInterval() {
- return sourceConnectionTestInterval;
- }
- public void setSourceConnectionTestInterval(Long sourceConnectionTestInterval) {
- this.sourceConnectionTestInterval = sourceConnectionTestInterval.longValue();
- }
- public int getSourceConnectionTimeout() {
- return sourceConnectionTimeout;
- }
- public void setSourceConnectionTimeout(Integer sourceConnectionTimeout) {
- this.sourceConnectionTimeout = sourceConnectionTimeout.intValue();
- }
- public void setModelAuditFields(Boolean modelAuditFields) {
- this.auditModelFields = modelAuditFields.booleanValue();
- }
- public boolean isModelAuditFields() {
- return this.auditModelFields;
- }
-
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("username=").append(this.username);
- sb.append(" ConnectorStateClass=").append(this.connectorStateClass);
- sb.append(" URL=").append(this.URL);
- return sb.toString();
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForcePlugin.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForcePlugin.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForcePlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,45 +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 com.metamatrix.connector.salesforce;
-
-import java.util.ResourceBundle;
-
-import com.metamatrix.core.BundleUtil;
-
-/**
- * For logging purposes
- */
-public class SalesForcePlugin {
-
- /**
- * The plug-in identifier of this plugin
- */
- public static final String PLUGIN_ID = "com.metamatrix.connector.salesforce" ; //$NON-NLS-1$
-
- /**
- * Provides access to the plugin's log and to it's resources.
- */
- private static final String BUNDLE_NAME = PLUGIN_ID + ".i18n"; //$NON-NLS-1$
- public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,BUNDLE_NAME,ResourceBundle.getBundle(BUNDLE_NAME));
-
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,95 +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 com.metamatrix.connector.salesforce;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-
-public class SalesforceCapabilities extends BasicConnectorCapabilities {
-
- public int getMaxInCriteriaSize() {
- return 700;
- }
-
- public List getSupportedFunctions() {
- List<String> supportedFunctions = new ArrayList<String>();
- supportedFunctions.add("includes");
- supportedFunctions.add("excludes");
- return supportedFunctions;
- }
-
- public boolean supportsCompareCriteriaEquals() {
- return true;
- }
-
- public boolean supportsInCriteria() {
- return true;
- }
-
- public boolean supportsLikeCriteria() {
- return true;
- }
-
- public boolean supportsRowLimit() {
- return true;
- }
-
- // http://jira.jboss.org/jira/browse/JBEDSP-306
- // Salesforce supports ORDER BY, but not on all column types
- public boolean supportsOrderBy() {
- return false;
- }
-
- @Override
- public boolean supportsAggregatesCountStar() {
- return true;
- }
-
- @Override
- public boolean supportsNotCriteria() {
- return true;
- }
-
- @Override
- public boolean supportsOrCriteria() {
- return true;
- }
-
- @Override
- public boolean supportsCompareCriteriaOrdered() {
- return true;
- }
-
- @Override
- public SupportedJoinCriteria getSupportedJoinCriteria() {
- return SupportedJoinCriteria.KEY;
- }
-
- @Override
- public boolean supportsOuterJoins() {
- return true;
- }
-
-
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Util.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Util.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Util.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,71 +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 com.metamatrix.connector.salesforce;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-
-import org.teiid.connector.api.ConnectorException;
-
-
-public class Util {
-
- public static String stripQutes(String id) {
- if((id.startsWith("'") && id.endsWith("'"))) {
- id = id.substring(1,id.length()-1);
- } else if ((id.startsWith("\"") && id.endsWith("\""))) {
- id = id.substring(1,id.length()-1);
- }
- return id;
- }
-
- public static String addSingleQuotes(String text) {
- StringBuffer result = new StringBuffer();
- if(!text.startsWith("'")) {
- result.append('\'');
- }
- result.append(text);
- if(!text.endsWith("'")) {
- result.append('\'');
- }
- return result.toString();
- }
-
- public static void validateQueryLength(StringBuffer query) throws ConnectorException {
- if(query.length() >= 10000) {
- throw new ConnectorException(Messages.getString("Util.query.exceeds.max.length"));
- }
- }
-
- public static SimpleDateFormat getSalesforceDateTimeFormat() {
- return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- }
-
- public static SimpleDateFormat getTimeZoneOffsetFormat() {
- return new SimpleDateFormat("Z");
- }
-
- public static DateFormat getSalesforceDateFormat() {
- return new SimpleDateFormat("yyyy-MM-dd");
- }
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,185 +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 com.metamatrix.connector.salesforce.connection;
-
-import java.util.List;
-
-import javax.security.auth.Subject;
-import javax.xml.datatype.XMLGregorianCalendar;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.MetadataProvider;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.Messages;
-import com.metamatrix.connector.salesforce.MetadataProcessor;
-import com.metamatrix.connector.salesforce.SalesForceManagedConnectionFactory;
-import com.metamatrix.connector.salesforce.connection.impl.ConnectionImpl;
-import com.metamatrix.connector.salesforce.execution.DataPayload;
-import com.metamatrix.connector.salesforce.execution.DeleteExecutionImpl;
-import com.metamatrix.connector.salesforce.execution.DeletedResult;
-import com.metamatrix.connector.salesforce.execution.InsertExecutionImpl;
-import com.metamatrix.connector.salesforce.execution.ProcedureExecutionParentImpl;
-import com.metamatrix.connector.salesforce.execution.QueryExecutionImpl;
-import com.metamatrix.connector.salesforce.execution.UpdateExecutionImpl;
-import com.metamatrix.connector.salesforce.execution.UpdatedResult;
-import com.metamatrix.core.MetaMatrixRuntimeException;
-import com.sforce.soap.partner.DescribeGlobalResult;
-import com.sforce.soap.partner.DescribeSObjectResult;
-import com.sforce.soap.partner.QueryResult;
-import com.sforce.soap.partner.sobject.SObject;
-
-public class SalesforceConnection extends BasicConnection implements MetadataProvider {
-
- private SalesForceManagedConnectionFactory connectorEnv;
- private ConnectionImpl connection;
-
- public SalesforceConnection(Subject subject, SalesForceManagedConnectionFactory env) {
- throw new MetaMatrixRuntimeException("not supported yet..");
- }
-
- public SalesforceConnection(SalesForceManagedConnectionFactory env) throws ConnectorException {
- try {
- connectorEnv = env;
-
- long pingInterval = env.getSourceConnectionTestInterval();
-
- //600000 - 10 minutes
- int timeout = env.getSourceConnectionTimeout();
-
- connection = new ConnectionImpl(env.getUsername(), env.getPassword(), env.getURL(), pingInterval, env.getLogger(), timeout);
- } catch(Throwable t) {
- env.getLogger().logError("SalesforceConnection() ErrorMessage: " + t.getMessage());
- if(t instanceof ConnectorException) {
- // don't wrap it again
- throw (ConnectorException) t;
- }
- throw new ConnectorException(t);
- }
- }
-
- @Override
- public ResultSetExecution createResultSetExecution(QueryExpression command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new QueryExecutionImpl(command, this, metadata, executionContext, connectorEnv);
- }
-
- @Override
- public UpdateExecution createUpdateExecution(Command command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- UpdateExecution result = null;
- if(command instanceof org.teiid.connector.language.Delete) {
- result = new DeleteExecutionImpl(command, this, metadata, executionContext, connectorEnv);
- } else if (command instanceof org.teiid.connector.language.Insert) {
- result = new InsertExecutionImpl(command, this, metadata, executionContext, connectorEnv);
- } else if (command instanceof org.teiid.connector.language.Update) {
- result = new UpdateExecutionImpl(command, this, metadata, executionContext, connectorEnv);
- }
- return result;
-
- }
-
- @Override
- public ProcedureExecution createProcedureExecution(Call command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new ProcedureExecutionParentImpl(command, this, metadata, executionContext, connectorEnv);
- }
-
- @Override
- public void close() {
- }
-
- public QueryResult query(String queryString, int maxBatchSize, Boolean queryAll) throws ConnectorException {
- if(maxBatchSize > 2000) {
- maxBatchSize = 2000;
- connectorEnv.getLogger().logInfo(
- Messages.getString("SalesforceQueryExecutionImpl.reduced.batch.size"));
- }
- return connection.query(queryString, maxBatchSize, queryAll);
- }
-
- public QueryResult queryMore(String queryLocator, int batchSize) throws ConnectorException {
- return connection.queryMore(queryLocator, batchSize);
- }
-
- @Override
- public boolean isAlive() {
- return connection.isAlive();
- }
-
- public int delete(String[] ids) throws ConnectorException {
- return connection.delete(ids);
- }
-
- public int create(DataPayload data) throws ConnectorException {
- return connection.create(data);
- }
-
- public int update(List<DataPayload> updateDataList) throws ConnectorException {
- return connection.update(updateDataList);
- }
-
- public UpdatedResult getUpdated(String objectName, XMLGregorianCalendar startCalendar,
- XMLGregorianCalendar endCalendar) throws ConnectorException {
- return connection.getUpdated(objectName, startCalendar, endCalendar);
- }
-
- public DeletedResult getDeleted(String objectName, XMLGregorianCalendar startCalendar,
- XMLGregorianCalendar endCalendar) throws ConnectorException {
- return connection.getDeleted(objectName, startCalendar, endCalendar);
- }
-
- public QueryResult retrieve(String fieldList, String sObjectType, List<String> ids) throws ConnectorException {
- List<SObject> objects = connection.retrieve(fieldList, sObjectType, ids);
- QueryResult result = new QueryResult();
- result.getRecords().addAll(objects);
- result.setSize(objects.size());
- return result;
- }
-
- public DescribeGlobalResult getObjects() throws ConnectorException {
- return connection.getObjects();
- }
-
- public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException {
- return connection.getObjectMetaData(objectName);
- }
-
- @Override
- public void getConnectorMetadata(MetadataFactory metadataFactory)
- throws ConnectorException {
- MetadataProcessor processor = new MetadataProcessor(this,metadataFactory, connectorEnv);
- processor.processMetadata();
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/AbstractUpdateExecution.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/AbstractUpdateExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/AbstractUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,122 +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 com.metamatrix.connector.salesforce.execution;
-
-import java.util.ArrayList;
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Comparison;
-import org.teiid.connector.language.Condition;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.Util;
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.metamatrix.connector.salesforce.execution.visitors.IQueryProvidingVisitor;
-import com.sforce.soap.partner.QueryResult;
-import com.sforce.soap.partner.sobject.SObject;
-
-/**
- *
- * Parent class to the Update, Delete, and Insert execution classes.
- * Provisions the correct impl and contains some common code to
- * get IDs of Salesforce objects.
- *
- */
-public abstract class AbstractUpdateExecution extends BasicExecution implements UpdateExecution {
-
- protected SalesforceConnection connection;
- protected RuntimeMetadata metadata;
- protected ExecutionContext context;
- protected ConnectorEnvironment connectorEnv;
- protected Command command;
- protected int result;
-
- public AbstractUpdateExecution(Command command, SalesforceConnection salesforceConnection,
- RuntimeMetadata metadata, ExecutionContext context,
- ConnectorEnvironment connectorEnv) {
- this.connection = salesforceConnection;
- this.metadata = metadata;
- this.context = context;
- this.connectorEnv = connectorEnv;
- this.command = command;
- }
-
- @Override
- public void cancel() throws ConnectorException {
- }
-
- @Override
- public void close() throws ConnectorException {
- }
-
- @Override
- public int[] getUpdateCounts() throws DataNotAvailableException,
- ConnectorException {
- return new int[] {result};
- }
-
- public RuntimeMetadata getMetadata() {
- return metadata;
- }
-
- public ConnectorEnvironment getConnectorEnv() {
- return connectorEnv;
- }
-
- public SalesforceConnection getConnection() {
- return connection;
- }
-
- String[] getIDs(Condition criteria, IQueryProvidingVisitor visitor) throws ConnectorException {
- String[] Ids = null;
- if (visitor.hasOnlyIDCriteria()) {
- try {
- String Id = ((Comparison)criteria).getRightExpression().toString();
- Id = Util.stripQutes(Id);
- Ids = new String[] { Id };
- } catch (ClassCastException cce) {
- throw new RuntimeException(
- "Error: The delete criteria is not a CompareCriteria");
- }
-
- } else if (visitor.hasCriteria()) {
- String query = visitor.getQuery();
- QueryResult results = getConnection().query(query, context.getBatchSize(), Boolean.FALSE);
- if (null != results && results.getSize() > 0) {
- ArrayList<String> idList = new ArrayList<String>(results
- .getRecords().size());
- for (int i = 0; i < results.getRecords().size(); i++) {
- SObject sObject = results.getRecords().get(i);
- idList.add(sObject.getId());
- }
- Ids = idList.toArray(new String[0]);
- }
- }
- return Ids;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DataPayload.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DataPayload.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DataPayload.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,65 +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 com.metamatrix.connector.salesforce.execution;
-
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-
-/**
- *
- * A bucket to pass data to the Salesforce connection.
- *
- */
-public class DataPayload {
-
- private String type;
- @SuppressWarnings("unchecked")
- private List<JAXBElement> messageElements;
- private String id;
-
- public void setType(String typeName) {
- type = typeName;
- }
-
- @SuppressWarnings("unchecked")
- public void setMessageElements(List<JAXBElement> elements) {
- this.messageElements = elements;
- }
-
- public String getType() {
- return type;
- }
-
- @SuppressWarnings("unchecked")
- public List<JAXBElement> getMessageElements() {
- return messageElements;
- }
-
- public void setID(String id) {
- this.id = id;
- }
-
- public String getID() {
- return id;
- }
-}
\ No newline at end of file
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeleteExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeleteExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeleteExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,53 +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 com.metamatrix.connector.salesforce.execution;
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Delete;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.metamatrix.connector.salesforce.execution.visitors.DeleteVisitor;
-
-public class DeleteExecutionImpl extends AbstractUpdateExecution {
-
-
- public DeleteExecutionImpl(Command command,
- SalesforceConnection salesforceConnection,
- RuntimeMetadata metadata, ExecutionContext context,
- ConnectorEnvironment connectorEnv) {
- super(command, salesforceConnection, metadata, context, connectorEnv);
- }
-
- @Override
- public void execute() throws ConnectorException {
- DeleteVisitor dVisitor = new DeleteVisitor(getMetadata());
- dVisitor.visitNode(command);
- String[] Ids = getIDs(((Delete)command).getWhere(), dVisitor);
- if(null != Ids && Ids.length > 0) {
- result = getConnection().delete(Ids);
- }
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedObject.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedObject.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedObject.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,22 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.util.Calendar;
-
-public class DeletedObject {
-
- String ID;
- Calendar deletedDate;
-
- public String getID() {
- return ID;
- }
- public void setID(String id) {
- ID = id;
- }
- public Calendar getDeletedDate() {
- return deletedDate;
- }
- public void setDeletedDate(Calendar deletedDate) {
- this.deletedDate = deletedDate;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedResult.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedResult.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/DeletedResult.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,36 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.util.Calendar;
-import java.util.List;
-
-public class DeletedResult {
-
- private Calendar latestDateCovered;
- private Calendar earliestDateAvailable;
- private List<DeletedObject> resultRecords;
-
- public Calendar getLatestDateCovered() {
- return latestDateCovered;
- }
-
- public void setLatestDateCovered(Calendar latestDateCovered) {
- this.latestDateCovered = latestDateCovered;
- }
-
-
- public Calendar getEarliestDateAvailable() {
- return earliestDateAvailable;
- }
-
- public void setEarliestDateAvailable(Calendar earliestDateAvailable) {
- this.earliestDateAvailable = earliestDateAvailable;
- }
-
- public void setResultRecords(List<DeletedObject> resultRecords) {
- this.resultRecords = resultRecords;
- }
-
- public List<DeletedObject> getResultRecords() {
- return resultRecords;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetDeletedExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetDeletedExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetDeletedExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,106 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.GregorianCalendar;
-import java.util.List;
-
-import javax.xml.datatype.DatatypeConfigurationException;
-import javax.xml.datatype.DatatypeFactory;
-import javax.xml.datatype.XMLGregorianCalendar;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.language.Argument;
-import org.teiid.connector.language.Call;
-
-/**
- *
- * The structure of the getDeleted procedure is:
- * Salesforce object type: String: IN param
- * startDate: datatime: IN param
- * enddate: datetime: IN param
- * earliestDateAvailable: datetime: OUT param
- * latestDateCovered: datetime: OUT param
- * getUpdatedResult: resultset: OUT param
- *
- */
-
-public class GetDeletedExecutionImpl implements SalesforceProcedureExecution {
-
- private static final int EARLIESTDATEAVAILABLE = 4;
- private static final int RESULT = 5;
-
- private ProcedureExecutionParent parent;
-
- private DeletedResult deletedResult;
- private int resultIndex = 0;
- DatatypeFactory factory;
-
- public GetDeletedExecutionImpl(
- ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
- this.parent = procedureExecutionParent;
- try {
- factory = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- throw new ConnectorException(e.getMessage());
- }
- }
-
- @Override
- public void cancel() {
- // nothing to do here
-
- }
-
- @Override
- public void close() {
- // nothing to do here
-
- }
-
- @Override
- public void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
- Call command = parent.getCommand();
- List<Argument> params = command.getArguments();
-
- Argument object = params.get(OBJECT);
- String objectName = (String) object.getArgumentValue().getValue();
-
- Argument start = params.get(STARTDATE);
- Timestamp startTime = (Timestamp) start.getArgumentValue().getValue();
- GregorianCalendar tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
- tempCalendar.setTime(startTime);
- XMLGregorianCalendar startCalendar = factory.newXMLGregorianCalendar(tempCalendar);
-
- Argument end = params.get(ENDDATE);
- Timestamp endTime = (Timestamp) end.getArgumentValue().getValue();
- tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
- tempCalendar.setTime(endTime);
- XMLGregorianCalendar endCalendar = factory.newXMLGregorianCalendar(tempCalendar);
-
- deletedResult = parent.getConnection().getDeleted(objectName, startCalendar, endCalendar);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public List<?> getOutputParameterValues() {
- List result = new ArrayList();
- result.add(deletedResult.getLatestDateCovered());
- result.add(deletedResult.getEarliestDateAvailable());
- return result;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public List<?> next() {
- List result = null;
- if(deletedResult.getResultRecords() != null && resultIndex < deletedResult.getResultRecords().size()){
- result = new ArrayList(2);
- result.add(deletedResult.getResultRecords().get(resultIndex).getID());
- result.add(deletedResult.getResultRecords().get(resultIndex).getDeletedDate());
- resultIndex++;
- }
- return result;
- }
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetUpdatedExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetUpdatedExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/GetUpdatedExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,99 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.List;
-
-import javax.xml.datatype.DatatypeConfigurationException;
-import javax.xml.datatype.DatatypeFactory;
-import javax.xml.datatype.XMLGregorianCalendar;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.language.Argument;
-import org.teiid.connector.language.Call;
-
-/**
- *
- * The structure of the getUpdated procedure is:
- * Salesforce object type: String: IN param
- * startDate: datatime: IN param
- * enddate: datetime: IN param
- * latestDateCovered: datetime: OUT param
- * getUpdatedResult: resultset: OUT param
- *
- */
-
-public class GetUpdatedExecutionImpl implements SalesforceProcedureExecution {
-
- private static final int RESULT = 4;
-
- private ProcedureExecutionParent parent;
- private UpdatedResult updatedResult;
- private int idIndex = 0;
- DatatypeFactory factory;
-
- public GetUpdatedExecutionImpl(
- ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
- this.parent = procedureExecutionParent;
- try {
- factory = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- throw new ConnectorException(e.getMessage());
- }
- }
-
- @Override
- public void cancel() {
- // nothing to do here
- }
-
- @Override
- public void close() {
- // nothing to do here
- }
-
- @Override
- public void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
- Call command = parent.getCommand();
- List<Argument> params = command.getArguments();
-
- Argument object = params.get(OBJECT);
- String objectName = (String) object.getArgumentValue().getValue();
-
- Argument start = params.get(STARTDATE);
- Timestamp startTime = (Timestamp) start.getArgumentValue().getValue();
- GregorianCalendar tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
- tempCalendar.setTime(startTime);
- XMLGregorianCalendar startCalendar = factory.newXMLGregorianCalendar(tempCalendar);
-
- Argument end = params.get(ENDDATE);
- Timestamp endTime = (Timestamp) end.getArgumentValue().getValue();
- tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
- tempCalendar.setTime(endTime);
- XMLGregorianCalendar endCalendar = factory.newXMLGregorianCalendar(tempCalendar);
-
- updatedResult = parent.getConnection().getUpdated(objectName, startCalendar, endCalendar);
- }
-
- @Override
- public List<Calendar> getOutputParameterValues() {
- List<Calendar> result = new ArrayList<Calendar>(1);
- result.add(updatedResult.getLatestDateCovered());
- return result;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public List next() {
- List result = null;
- if(updatedResult.getIDs() != null && idIndex < updatedResult.getIDs().size()){
- result = new ArrayList(1);
- result.add(updatedResult.getIDs().get(idIndex));
- idIndex++;
- }
- return result;
- }
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/InsertExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/InsertExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/InsertExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,53 +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 com.metamatrix.connector.salesforce.execution;
-
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Insert;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.metamatrix.connector.salesforce.execution.visitors.InsertVisitor;
-
-public class InsertExecutionImpl extends AbstractUpdateExecution {
-
- public InsertExecutionImpl(Command command,
- SalesforceConnection salesforceConnection,
- RuntimeMetadata metadata, ExecutionContext context,
- ConnectorEnvironment connectorEnv) {
- super(command, salesforceConnection, metadata, context, connectorEnv);
- }
-
- @Override
- public void execute() throws ConnectorException {
- InsertVisitor visitor = new InsertVisitor(getMetadata());
- visitor.visit((Insert)command);
- DataPayload data = new DataPayload();
- data.setType(visitor.getTableName());
- data.setMessageElements(visitor.getMessageElements());
- result = getConnection().create(data);
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParent.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParent.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParent.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,22 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-
-public interface ProcedureExecutionParent {
-
- public Call getCommand();
-
- public ExecutionContext getExecutionContext();
-
- public RuntimeMetadata getMetadata();
-
- public SalesforceConnection getConnection();
-
- public ConnectorEnvironment getConectorEnvironment();
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParentImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParentImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/ProcedureExecutionParentImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,105 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-
-public class ProcedureExecutionParentImpl implements ProcedureExecution, ProcedureExecutionParent {
-
- private Call command;
- private ExecutionContext executionContext;
- private RuntimeMetadata metadata;
- private SalesforceProcedureExecution execution;
- private SalesforceConnection connection;
- private ConnectorEnvironment connectorEnv;
-
- public ProcedureExecutionParentImpl(Call command,
- SalesforceConnection connection, RuntimeMetadata metadata, ExecutionContext executionContext, ConnectorEnvironment connectorEnv) {
- this.setCommand(command);
- this.setConnection(connection);
- this.setMetadata(metadata);
- this.setExecutionContext(executionContext);
- this.setConnectorEnvironment(connectorEnv);
- }
-
- @Override
- public List<?> getOutputParameterValues() throws ConnectorException {
- return execution.getOutputParameterValues();
- }
-
- @Override
- public List<?> next() throws ConnectorException, DataNotAvailableException {
- return execution.next();
- }
-
- @Override
- public void cancel() throws ConnectorException {
- execution.cancel();
- }
-
- @Override
- public void close() throws ConnectorException {
- execution.close();
- }
-
- @Override
- public void execute() throws ConnectorException {
- if(getCommand().getProcedureName().endsWith("getUpdated")) {
- execution = new GetUpdatedExecutionImpl(this);
- execution.execute(this);
- }
- else if(getCommand().getProcedureName().endsWith("getDeleted")) {
- execution = new GetDeletedExecutionImpl(this);
- execution.execute(this);
- }
- }
-
- public void setCommand(Call command) {
- this.command = command;
- }
-
- public Call getCommand() {
- return command;
- }
-
- private void setConnection(SalesforceConnection connection) {
- this.connection = connection;
- }
-
- public SalesforceConnection getConnection() {
- return connection;
- }
-
- private void setExecutionContext(ExecutionContext executionContext) {
- this.executionContext = executionContext;
- }
-
- public ExecutionContext getExecutionContext() {
- return executionContext;
- }
-
- private void setMetadata(RuntimeMetadata metadata) {
- this.metadata = metadata;
- }
-
- public RuntimeMetadata getMetadata() {
- return metadata;
- }
-
- private void setConnectorEnvironment(ConnectorEnvironment connectorEnv) {
- this.connectorEnv = connectorEnv;
- }
-
- public ConnectorEnvironment getConectorEnvironment() {
- return connectorEnv;
- }
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/QueryExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/QueryExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,376 +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 com.metamatrix.connector.salesforce.execution;
-
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import org.w3c.dom.Element;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.language.AggregateFunction;
-import org.teiid.connector.language.Join;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.language.TableReference;
-import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-import org.teiid.connector.metadata.runtime.Table;
-
-import com.metamatrix.connector.salesforce.Messages;
-import com.metamatrix.connector.salesforce.Util;
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.metamatrix.connector.salesforce.execution.visitors.JoinQueryVisitor;
-import com.metamatrix.connector.salesforce.execution.visitors.SelectVisitor;
-import com.sforce.soap.partner.QueryResult;
-import com.sforce.soap.partner.sobject.SObject;
-
-public class QueryExecutionImpl extends BasicExecution implements ResultSetExecution {
-
- private SalesforceConnection connection;
-
- private RuntimeMetadata metadata;
-
- private ExecutionContext context;
-
- private ConnectorEnvironment connectorEnv;
-
- private SelectVisitor visitor;
-
- private QueryResult results;
-
- private List<List<Object>> resultBatch;
-
- // Identifying values
- private String connectionIdentifier;
-
- private String connectorIdentifier;
-
- private String requestIdentifier;
-
- private String partIdentifier;
-
- private String logPreamble;
-
- private QueryExpression query;
-
- Map<String, Map<String,Integer>> sObjectToResponseField = new HashMap<String, Map<String,Integer>>();
-
- private int topResultIndex = 0;
-
- public QueryExecutionImpl(QueryExpression command, SalesforceConnection connection,
- RuntimeMetadata metadata, ExecutionContext context,
- ConnectorEnvironment connectorEnv) {
- this.connection = connection;
- this.metadata = metadata;
- this.context = context;
- this.connectorEnv = connectorEnv;
- this.query = command;
-
- connectionIdentifier = context.getConnectionIdentifier();
- connectorIdentifier = context.getConnectorIdentifier();
- requestIdentifier = context.getRequestIdentifier();
- partIdentifier = context.getPartIdentifier();
- }
-
- public void cancel() throws ConnectorException {
- connectorEnv.getLogger().logInfo(Messages.getString("SalesforceQueryExecutionImpl.cancel"));
- }
-
- public void close() throws ConnectorException {
- connectorEnv.getLogger().logInfo(Messages.getString("SalesforceQueryExecutionImpl.close"));
- }
-
- @Override
- public void execute() throws ConnectorException {
- connectorEnv.getLogger().logInfo(
- getLogPreamble() + "Incoming Query: " + query.toString());
- List<TableReference> from = ((Select)query).getFrom();
- String finalQuery;
- if(from.get(0) instanceof Join) {
- visitor = new JoinQueryVisitor(metadata);
- visitor.visitNode(query);
- finalQuery = visitor.getQuery().trim();
- connectorEnv.getLogger().logInfo(
- getLogPreamble() + "Executing Query: " + finalQuery);
-
- results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
- } else {
- visitor = new SelectVisitor(metadata);
- visitor.visitNode(query);
- if(visitor.canRetrieve()) {
- results = connection.retrieve(visitor.getRetrieveFieldList(),
- visitor.getTableName(), visitor.getIdInCriteria());
- } else {
- finalQuery = visitor.getQuery().trim();
- connectorEnv.getLogger().logInfo(
- getLogPreamble() + "Executing Query: " + finalQuery);
- results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public List next() throws ConnectorException, DataNotAvailableException {
- List<?> result;
- if (query.getProjectedQuery().getDerivedColumns().get(0)
- .getExpression() instanceof AggregateFunction) {
- result = Arrays.asList(results.getSize());
- results = null;
-
- } else {
- result = getRow(results);
- }
- return result;
- }
-
- private List<Object> getRow(QueryResult result) throws ConnectorException {
- List<Object> row;
- if(null == resultBatch) {
- loadBatch();
- }
- if(resultBatch.size() == topResultIndex) {
- row = null;
- } else {
- row = resultBatch.get(topResultIndex);
- topResultIndex++;
- if(resultBatch.size() == topResultIndex) {
- if(!result.isDone()) {
- loadBatch();
- }
- }
-
- }
- return row;
- }
-
- private void loadBatch() throws ConnectorException {
- if(null != resultBatch) { // if we have an old batch, then we have to get new results
- results = connection.queryMore(results.getQueryLocator(), context.getBatchSize());
- }
- resultBatch = new ArrayList<List<Object>>();
-
- for(int resultIndex = 0; resultIndex < results.getSize(); resultIndex++) {
- SObject sObject = results.getRecords().get(resultIndex);
- List<Object[]> result = getObjectData(sObject);
- for(Iterator<Object[]> i = result.iterator(); i.hasNext(); ) {
- resultBatch.add(Arrays.asList(i.next()));
- }
- }
- }
-
- private List<Object[]> getObjectData(SObject sObject) throws ConnectorException {
- List<Object> topFields = sObject.getAny();
- logAndMapFields(sObject.getType(), topFields);
- List<Object[]> result = new ArrayList<Object[]>();
- for(int i = 0; i < topFields.size(); i++) {
- Element element = (Element) topFields.get(i);
- QName qName = new QName(element.getNamespaceURI(), element.getLocalName());
- if(null != qName) {
- String type = qName.getLocalPart();
- if(type.equals("sObject")) {
- //SObject parent = (SObject)element.;
- //result.addAll(getObjectData(parent));
- } else if(type.equals("QueryResult")) {
- //QueryResult subResult = (QueryResult)element.getValue();
- //for(int resultIndex = 0; resultIndex < subResult.getSize(); resultIndex++) {
- // SObject subObject = subResult.getRecords().get(resultIndex);
- // result.addAll(getObjectData(subObject));
- //}
- }
- }
- }
- return extractDataFromFields(sObject, topFields, result);
-
- }
-
- private List<Object[]> extractDataFromFields(SObject sObject,
- List<Object> fields, List<Object[]> result) throws ConnectorException {
- Map<String,Integer> fieldToIndexMap = sObjectToResponseField.get(sObject.getType());
- for (int j = 0; j < visitor.getSelectSymbolCount(); j++) {
- Column element = visitor.getSelectSymbolMetadata(j);
- AbstractMetadataRecord parent = element.getParent();
- Table table;
- if(parent instanceof Table) {
- table = (Table)parent;
- } else {
- parent = parent.getParent();
- if(parent instanceof Table) {
- table = (Table)parent;
- } else {
- throw new ConnectorException("Could not resolve Table for column " + element.getName());
- }
- }
- if(table.getNameInSource().equals(sObject.getType())) {
- Integer index = fieldToIndexMap.get(element.getNameInSource());
- // id gets dropped from the result if it is not the
- // first field in the querystring. Add it back in.
- if (null == index) {
- if (element.getNameInSource().equalsIgnoreCase("id")) {
- setValueInColumn(j, sObject.getId(), result);
- } else {
- throw new ConnectorException("SalesforceQueryExecutionImpl.missing.field"
- + element.getNameInSource());
- }
- } else {
- Object cell;
- cell = getCellDatum(element, (Element)fields.get(index));
- setValueInColumn(j, cell, result);
- }
- }
- }
- return result;
- }
-
- private void setValueInColumn(int columnIndex, Object value, List<Object[]> result) {
- if(result.isEmpty()) {
- Object[] row = new Object[visitor.getSelectSymbolCount()];
- result.add(row);
- }
- Iterator<Object[]> iter = result.iterator();
- while (iter.hasNext()) {
- Object[] row = iter.next();
- row[columnIndex] = value;
- }
- }
-
- /**
- * Load the map of response field names to index.
- * @param fields
- * @throws ConnectorException
- */
- private void logAndMapFields(String sObjectName,
- List<Object> fields) throws ConnectorException {
- if (!sObjectToResponseField.containsKey(sObjectName)) {
- logFields(sObjectName, fields);
- Map<String, Integer> responseFieldToIndexMap;
- responseFieldToIndexMap = new HashMap<String, Integer>();
- for (int x = 0; x < fields.size(); x++) {
- Element element = (Element) fields.get(x);
- responseFieldToIndexMap.put(element.getLocalName(), x);
- }
- sObjectToResponseField.put(sObjectName, responseFieldToIndexMap);
- }
- }
-
- private void logFields(String sObjectName, List<Object> fields) throws ConnectorException {
- ConnectorLogger logger = connectorEnv.getLogger();
- logger.logDetail("SalesForce Object Name = " + sObjectName);
- logger.logDetail("FieldCount = " + fields.size());
- for(int i = 0; i < fields.size(); i++) {
- Element element;
- element = (Element) fields.get(i);
- logger.logDetail("Field # " + i + " is " + element.getLocalName());
- }
-
- }
-
- @SuppressWarnings("unchecked")
- private Object getCellDatum(Column element, Element elem)
- throws ConnectorException {
- if(!element.getNameInSource().equals(elem.getLocalName())) {
- throw new ConnectorException("SalesforceQueryExecutionImpl.column.mismatch1" + element.getNameInSource() +
- "SalesforceQueryExecutionImpl.column.mismatch2" + elem.getLocalName());
- }
- String value = (String) elem.getTextContent();
- Object result = null;
- Class type = element.getJavaType();
-
- if(type.equals(String.class)) {
- result = value;
- }
- else if (type.equals(Boolean.class)) {
- result = Boolean.valueOf(value);
- } else if (type.equals(Double.class)) {
- if (null != value) {
- if(value.isEmpty()) {
- result = null;
- } else {
- result = Double.valueOf(value);
- }
- }
- } else if (type.equals(Integer.class)) {
- if (null != value) {
- if(value.isEmpty()) {
- result = null;
- } else {
- result = Integer.valueOf(value);
- }
- }
- } else if (type.equals(java.sql.Date.class)) {
- if (null != value) {
- if(value.isEmpty()) {
- result = null;
- } else {
- result = java.sql.Date.valueOf(value);
- }
- }
- } else if (type.equals(java.sql.Timestamp.class)) {
- if (null != value) {
- if(value.isEmpty()) {
- result = null;
- } else try {
- Date date = Util.getSalesforceDateTimeFormat().parse(value);
- result = new Timestamp(date.getTime());
- } catch (ParseException e) {
- throw new ConnectorException(e, "SalesforceQueryExecutionImpl.datatime.parse" + value);
- }
- }
- } else {
- result = value;
- }
- return result;
- }
-
-
- private String getLogPreamble() {
- if (null == logPreamble) {
- StringBuffer preamble = new StringBuffer();
- preamble.append(connectorIdentifier);
- preamble.append('.');
- preamble.append(connectionIdentifier);
- preamble.append('.');
- preamble.append(requestIdentifier);
- preamble.append('.');
- preamble.append(partIdentifier);
- preamble.append(": ");
- logPreamble = preamble.toString();
- }
- return logPreamble;
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/SalesforceProcedureExecution.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/SalesforceProcedureExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/SalesforceProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,24 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorException;
-
-public interface SalesforceProcedureExecution {
-
- static final int OBJECT = 0;
- static final int STARTDATE = 1;
- static final int ENDDATE = 2;
- static final int LATESTDATECOVERED = 3;
-
- List<?> getOutputParameterValues();
-
- List<?> next();
-
- void cancel();
-
- void close();
-
- void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException;
-
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdateExecutionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdateExecutionImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdateExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,88 +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 com.metamatrix.connector.salesforce.execution;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-import javax.xml.namespace.QName;
-
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.ColumnReference;
-import org.teiid.connector.language.Literal;
-import org.teiid.connector.language.SetClause;
-import org.teiid.connector.language.Update;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.connector.salesforce.Util;
-import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
-import com.metamatrix.connector.salesforce.execution.visitors.UpdateVisitor;
-
-public class UpdateExecutionImpl extends AbstractUpdateExecution {
-
- @SuppressWarnings("unchecked")
- private static final Class stringClazz = new String().getClass();
-
- public UpdateExecutionImpl(Command command,
- SalesforceConnection salesforceConnection,
- RuntimeMetadata metadata, ExecutionContext context,
- ConnectorEnvironment connectorEnv) {
- super(command, salesforceConnection, metadata, context, connectorEnv);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public void execute() throws ConnectorException {
- UpdateVisitor visitor = new UpdateVisitor(getMetadata());
- visitor.visit((Update)command);
- String[] Ids = getIDs(((Update)command).getWhere(), visitor);
-
- if (null != Ids && Ids.length > 0) {
- List<JAXBElement> elements = new ArrayList<JAXBElement>();
- for (SetClause clause : ((Update)command).getChanges()) {
- ColumnReference element = clause.getSymbol();
- Column column = element.getMetadataObject();
- String val = ((Literal) clause.getValue())
- .toString();
- JAXBElement messageElem = new JAXBElement(new QName(
- column.getNameInSource()), stringClazz, Util.stripQutes(val));
- elements.add(messageElem);
- }
-
- List<DataPayload> updateDataList = new ArrayList<DataPayload>();
- for (int i = 0; i < Ids.length; i++) {
- DataPayload data = new DataPayload();
- data.setType(visitor.getTableName());
- data.setID(Ids[i]);
- data.setMessageElements(elements);
- updateDataList.add(data);
- }
-
- result = getConnection().update(updateDataList);
- }
- }
-}
Deleted: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdatedResult.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdatedResult.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/UpdatedResult.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,26 +0,0 @@
-package com.metamatrix.connector.salesforce.execution;
-
-import java.util.Calendar;
-import java.util.List;
-
-public class UpdatedResult {
-
- private Calendar latestDateCovered;
- private List<String> IDs;
-
- public Calendar getLatestDateCovered() {
- return latestDateCovered;
- }
-
- public void setLatestDateCovered(Calendar latestDateCovered) {
- this.latestDateCovered = latestDateCovered;
- }
-
- public List<String> getIDs() {
- return IDs;
- }
-
- public void setIDs(List<String> list) {
- this.IDs = list;
- }
-}
Copied: trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce (from rev 2083, trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl)
Deleted: trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/ConnectionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/ConnectionImpl.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/ConnectionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,367 +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 com.metamatrix.connector.salesforce.connection.impl;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.xml.datatype.XMLGregorianCalendar;
-import javax.xml.ws.BindingProvider;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-
-import com.metamatrix.connector.salesforce.execution.DataPayload;
-import com.metamatrix.connector.salesforce.execution.DeletedObject;
-import com.metamatrix.connector.salesforce.execution.DeletedResult;
-import com.metamatrix.connector.salesforce.execution.UpdatedResult;
-import com.sforce.soap.partner.CallOptions;
-import com.sforce.soap.partner.DeleteResult;
-import com.sforce.soap.partner.DeletedRecord;
-import com.sforce.soap.partner.DescribeGlobalResult;
-import com.sforce.soap.partner.DescribeSObjectResult;
-import com.sforce.soap.partner.GetDeletedResult;
-import com.sforce.soap.partner.GetUpdatedResult;
-import com.sforce.soap.partner.InvalidFieldFault;
-import com.sforce.soap.partner.InvalidIdFault;
-import com.sforce.soap.partner.LoginFault;
-import com.sforce.soap.partner.LoginResult;
-import com.sforce.soap.partner.MalformedQueryFault;
-import com.sforce.soap.partner.MruHeader;
-import com.sforce.soap.partner.ObjectFactory;
-import com.sforce.soap.partner.PackageVersionHeader;
-import com.sforce.soap.partner.QueryOptions;
-import com.sforce.soap.partner.QueryResult;
-import com.sforce.soap.partner.SaveResult;
-import com.sforce.soap.partner.SessionHeader;
-import com.sforce.soap.partner.SforceService;
-import com.sforce.soap.partner.Soap;
-import com.sforce.soap.partner.sobject.SObject;
-
-public class ConnectionImpl {
- private SforceService sfService;
- private Soap sfSoap;
- private SessionHeader sh;
- private CallOptions co;
- private ConnectorLogger logger;
-
- private ObjectFactory partnerFactory = new ObjectFactory();
-
- PackageVersionHeader pvHeader = partnerFactory.createPackageVersionHeader();
-
- public ConnectionImpl(String username, String password, URL url, long pingInterval, ConnectorLogger logger, int timeout) throws ConnectorException {
- this.logger = logger;
- login(username, password, url, timeout);
- }
-
- String getUserName() throws ConnectorException {
- try {
- return sfSoap.getUserInfo(sh).getUserName();
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e.getMessage());
- }
- }
-
- Soap getBinding() {
- return sfSoap;
- }
-
- private void login(String username, String password, URL url, int timeout)
- throws ConnectorException {
- if (!isAlive()) {
- LoginResult loginResult = null;
- sfSoap = null;
- sfService = null;
- co = new CallOptions();
- co.setClient("RedHat/MetaMatrix/");
-
- try {
- /*
- if(null != url) {
- sfService = new SforceService(url);
- sfSoap = sfService.getSoap();
- } else {
- */
- sfService = new SforceService();
- sfSoap = sfService.getSoap();
- //}
- loginResult = sfSoap.login(username, password);
- } catch (LoginFault e) {
- throw new ConnectorException(e.getCause().getMessage());
- } catch (InvalidIdFault e) {
- throw new ConnectorException(e.getCause().getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e.getCause().getMessage());
- }
- logger.logTrace("Login was successful for username " + username);
-
- sh = new SessionHeader();
- sh.setSessionId(loginResult.getSessionId());
- // Reset the SOAP endpoint to the returned server URL
- ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
- loginResult.getServerUrl());
- // or maybe org.apache.cxf.message.Message.ENDPOINT_ADDRESS
- ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,
- Boolean.TRUE);
- // Set the timeout.
- //((BindingProvider)sfSoap).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, timeout);
-
-
- // Test the connection.
- try {
- sfSoap.getUserInfo(sh);
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e.getMessage());
- }
- }
- }
-
-
- public boolean isAlive() {
- boolean result = true;
- if(sfSoap == null) {
- result = false;
- } else {
- try {
- sfSoap.getServerTimestamp(sh);
- } catch (Throwable t) {
- logger.logDetail("Caught Throwable in isAlive", t);
- result = false;
- }
- }
- return result;
- }
-
- public QueryResult query(String queryString, int batchSize, Boolean queryAll) throws ConnectorException {
- QueryResult qr = null;
- QueryOptions qo = partnerFactory.createQueryOptions();
- qo.setBatchSize(batchSize);
- try {
- if(queryAll) {
- qr = sfSoap.queryAll(queryString, sh);
- } else {
- MruHeader mruHeader = partnerFactory.createMruHeader();
- mruHeader.setUpdateMru(false);
-
- qr = sfSoap.query(queryString, sh);
- }
- } catch (InvalidFieldFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (MalformedQueryFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (InvalidIdFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidQueryLocatorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- return qr;
- }
-
- public QueryResult queryMore(String queryLocator, int batchSize) throws ConnectorException {
- QueryOptions qo = partnerFactory.createQueryOptions();
- qo.setBatchSize(batchSize);
- try {
- return sfSoap.queryMore(queryLocator, sh);
- } catch (InvalidFieldFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidQueryLocatorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
-
- }
-
- public int delete(String[] ids) throws ConnectorException {
- List<DeleteResult> results = null;
- try {
- results = sfSoap.delete(Arrays.asList(ids), sh);
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
-
- boolean allGood = true;
- StringBuffer errorMessages = new StringBuffer();
- for(int i = 0; i < results.size(); i++) {
- DeleteResult result = results.get(i);
- if(!result.isSuccess()) {
- if(allGood) {
- errorMessages.append("Error(s) executing DELETE: ");
- allGood = false;
- }
- List<com.sforce.soap.partner.Error> errors = result.getErrors();
- if(null != errors && errors.size() > 0) {
- for(int x = 0; x < errors.size(); x++) {
- com.sforce.soap.partner.Error error = errors.get(x);
- errorMessages.append(error.getMessage()).append(';');
- }
- }
-
- }
- }
- if(!allGood) {
- throw new ConnectorException(errorMessages.toString());
- }
- return results.size();
- }
-
- public int create(DataPayload data) throws ConnectorException {
- SObject toCreate = new SObject();
- toCreate.setType(data.getType());
- toCreate.getAny().addAll(data.getMessageElements());
- List<SObject> objects = new ArrayList<SObject>();
- objects.add(toCreate);
- List<SaveResult> result;
- try {
- result = sfSoap.create(objects, sh);
- } catch (InvalidFieldFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (InvalidIdFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- return analyzeResult(result);
- }
-
- public int update(List<DataPayload> updateDataList) throws ConnectorException {
- List<SObject> params = new ArrayList<SObject>(updateDataList.size());
- for(int i = 0; i < updateDataList.size(); i++) {
- DataPayload data = updateDataList.get(i);
- SObject toCreate = new SObject();
- toCreate.setType(data.getType());
- toCreate.setId(data.getID());
- toCreate.getAny().addAll(data.getMessageElements());
- params.add(i, toCreate);
- }
- List<SaveResult> result;
- try {
- result = sfSoap.update(params, sh);
- } catch (InvalidFieldFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (InvalidIdFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- return analyzeResult(result);
- }
-
- private int analyzeResult(List<SaveResult> results) throws ConnectorException {
- for (SaveResult result : results) {
- if(!result.isSuccess()) {
- throw new ConnectorException(result.getErrors().get(0).getMessage());
- }
- }
- return results.size();
- }
-
- public UpdatedResult getUpdated(String objectType, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) throws ConnectorException {
- GetUpdatedResult updated;
- try {
- updated = sfSoap.getUpdated(objectType, startDate, endDate, sh);
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- UpdatedResult result = new UpdatedResult();
- result.setLatestDateCovered(updated.getLatestDateCovered().toGregorianCalendar());
- result.setIDs(updated.getIds());
- return result;
- }
-
- public DeletedResult getDeleted(String objectName, XMLGregorianCalendar startCalendar,
- XMLGregorianCalendar endCalendar) throws ConnectorException {
- GetDeletedResult deleted;
- try {
- deleted = sfSoap.getDeleted(objectName, startCalendar, endCalendar, sh);
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- DeletedResult result = new DeletedResult();
- result.setLatestDateCovered(deleted.getLatestDateCovered().toGregorianCalendar());
- result.setEarliestDateAvailable(deleted.getEarliestDateAvailable().toGregorianCalendar());
- List<DeletedRecord> records = deleted.getDeletedRecords();
- List<DeletedObject> resultRecords = new ArrayList<DeletedObject>();
- DeletedObject object;
- if(null !=records) {
- for (DeletedObject record : resultRecords) {
- object = new DeletedObject();
- object.setID(record.getID());
- object.setDeletedDate(record.getDeletedDate());
- resultRecords.add(object);
- }
- }
- result.setResultRecords(resultRecords);
- return result;
- }
-
- public List<SObject> retrieve(String fieldList, String sObjectType, List<String> ids) throws ConnectorException {
- try {
- return sfSoap.retrieve(fieldList, sObjectType, ids, sh);
- } catch (InvalidFieldFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (MalformedQueryFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (InvalidIdFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
-
- }
-
- public DescribeGlobalResult getObjects() throws ConnectorException {
- try {
- return sfSoap.describeGlobal(sh);
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- ConnectorException ce = new ConnectorException(e.getCause().getMessage());
- ce.initCause(e.getCause());
- throw ce;
- }
- }
-
- public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException {
- try {
- return sfSoap.describeSObject(objectName, sh);
- } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
- throw new ConnectorException(e, e.getMessage());
- } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
- throw new ConnectorException(e, e.getMessage());
- }
- }
-}
Copied: trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesForceManagedConnectionFactory.java (from rev 2083, trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesForceManagedConnectionFactory.java)
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesForceManagedConnectionFactory.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesForceManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,107 @@
+/*
+ * 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.resource.cci.salesforce;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+
+import org.teiid.resource.spi.BasicConnectionFactory;
+import org.teiid.resource.spi.BasicManagedConnectionFactory;
+
+import com.metamatrix.core.MetaMatrixRuntimeException;
+
+public class SalesForceManagedConnectionFactory extends BasicManagedConnectionFactory {
+ private static final long serialVersionUID = 5298591275313314698L;
+
+ private String username;
+ private String connectorStateClass;
+ private String password;
+ private URL URL;
+ private long sourceConnectionTestInterval = -1;
+ private int sourceConnectionTimeout = -1;
+ private boolean auditModelFields = false;
+
+ public String getUsername() {
+ return username;
+ }
+ public void setUsername(String username) {
+ if (username.trim().length() == 0) {
+ throw new MetaMatrixRuntimeException("Name can not be null");
+ }
+ this.username = username;
+ }
+ public String getConnectorStateClass() {
+ return this.connectorStateClass;
+ }
+ public void setConnectorStateClass(String connectorStateClass) {
+ this.connectorStateClass = connectorStateClass;
+ }
+ public String getPassword() {
+ return this.password;
+ }
+ public void setPassword(String password) {
+ this.password = password;
+ }
+ public URL getURL() {
+ return this.URL;
+ }
+
+ public void setURL(String uRL) {
+ try {
+ this.URL = new URL(uRL);
+ } catch (MalformedURLException e) {
+ throw new MetaMatrixRuntimeException("URL Supplied is not valid URL"+ e.getMessage());
+ }
+ }
+
+ public long getSourceConnectionTestInterval() {
+ return sourceConnectionTestInterval;
+ }
+ public void setSourceConnectionTestInterval(Long sourceConnectionTestInterval) {
+ this.sourceConnectionTestInterval = sourceConnectionTestInterval.longValue();
+ }
+ public int getSourceConnectionTimeout() {
+ return sourceConnectionTimeout;
+ }
+ public void setSourceConnectionTimeout(Integer sourceConnectionTimeout) {
+ this.sourceConnectionTimeout = sourceConnectionTimeout.intValue();
+ }
+ public void setModelAuditFields(Boolean modelAuditFields) {
+ this.auditModelFields = modelAuditFields.booleanValue();
+ }
+ public boolean isModelAuditFields() {
+ return this.auditModelFields;
+ }
+
+ @Override
+ public Object createConnectionFactory() throws ResourceException {
+ return new BasicConnectionFactory() {
+ @Override
+ public Connection getConnection() throws ResourceException {
+ return new SalesforceConnectionImpl(getUsername(), getPassword(), getURL(), getSourceConnectionTestInterval(), getSourceConnectionTimeout());
+ }
+ };
+ }
+}
Added: trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesforceConnectionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesforceConnectionImpl.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/org/teiid/resource/cci/salesforce/SalesforceConnectionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,383 @@
+/*
+ * 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.resource.cci.salesforce;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.resource.ResourceException;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.ws.BindingProvider;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.Messages;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.execution.DataPayload;
+import org.teiid.resource.adapter.salesforce.execution.DeletedObject;
+import org.teiid.resource.adapter.salesforce.execution.DeletedResult;
+import org.teiid.resource.adapter.salesforce.execution.UpdatedResult;
+import org.teiid.resource.spi.BasicConnection;
+
+import com.sforce.soap.partner.CallOptions;
+import com.sforce.soap.partner.DeleteResult;
+import com.sforce.soap.partner.DeletedRecord;
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
+import com.sforce.soap.partner.GetDeletedResult;
+import com.sforce.soap.partner.GetUpdatedResult;
+import com.sforce.soap.partner.InvalidFieldFault;
+import com.sforce.soap.partner.InvalidIdFault;
+import com.sforce.soap.partner.LoginFault;
+import com.sforce.soap.partner.LoginResult;
+import com.sforce.soap.partner.MalformedQueryFault;
+import com.sforce.soap.partner.MruHeader;
+import com.sforce.soap.partner.ObjectFactory;
+import com.sforce.soap.partner.PackageVersionHeader;
+import com.sforce.soap.partner.QueryOptions;
+import com.sforce.soap.partner.QueryResult;
+import com.sforce.soap.partner.SaveResult;
+import com.sforce.soap.partner.SessionHeader;
+import com.sforce.soap.partner.SforceService;
+import com.sforce.soap.partner.Soap;
+import com.sforce.soap.partner.sobject.SObject;
+
+public class SalesforceConnectionImpl extends BasicConnection implements SalesforceConnection {
+ private SforceService sfService;
+ private Soap sfSoap;
+ private SessionHeader sh;
+ private CallOptions co;
+
+ private ObjectFactory partnerFactory = new ObjectFactory();
+
+ PackageVersionHeader pvHeader = partnerFactory.createPackageVersionHeader();
+
+ public SalesforceConnectionImpl(String username, String password, URL url, long pingInterval, int timeout) throws ConnectorException {
+ login(username, password, url, timeout);
+ }
+
+ String getUserName() throws ConnectorException {
+ try {
+ return sfSoap.getUserInfo(sh).getUserName();
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e.getMessage());
+ }
+ }
+
+ Soap getBinding() {
+ return sfSoap;
+ }
+
+ private void login(String username, String password, URL url, int timeout)
+ throws ConnectorException {
+ if (!isAlive()) {
+ LoginResult loginResult = null;
+ sfSoap = null;
+ sfService = null;
+ co = new CallOptions();
+ co.setClient("RedHat/MetaMatrix/"); //$NON-NLS-1$
+
+ try {
+ /*
+ if(null != url) {
+ sfService = new SforceService(url);
+ sfSoap = sfService.getSoap();
+ } else {
+ */
+ sfService = new SforceService();
+ sfSoap = sfService.getSoap();
+ //}
+ loginResult = sfSoap.login(username, password);
+ } catch (LoginFault e) {
+ throw new ConnectorException(e.getCause().getMessage());
+ } catch (InvalidIdFault e) {
+ throw new ConnectorException(e.getCause().getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e.getCause().getMessage());
+ }
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Login was successful for username " + username);
+
+ sh = new SessionHeader();
+ sh.setSessionId(loginResult.getSessionId());
+ // Reset the SOAP endpoint to the returned server URL
+ ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,loginResult.getServerUrl());
+ // or maybe org.apache.cxf.message.Message.ENDPOINT_ADDRESS
+ ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,Boolean.TRUE);
+ // Set the timeout.
+ //((BindingProvider)sfSoap).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, timeout);
+
+
+ // Test the connection.
+ try {
+ sfSoap.getUserInfo(sh);
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e.getMessage());
+ }
+ }
+ }
+
+
+ public boolean isAlive() {
+ boolean result = true;
+ if(sfSoap == null) {
+ result = false;
+ } else {
+ try {
+ sfSoap.getServerTimestamp(sh);
+ } catch (Throwable t) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Caught Throwable in isAlive", t); //$NON-NLS-1$
+ result = false;
+ }
+ }
+ return result;
+ }
+
+ public QueryResult query(String queryString, int batchSize, Boolean queryAll) throws ConnectorException {
+
+ if(batchSize > 2000) {
+ batchSize = 2000;
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, Messages.getString("SalesforceQueryExecutionImpl.reduced.batch.size")); //$NON-NLS-1$
+ }
+
+ QueryResult qr = null;
+ QueryOptions qo = partnerFactory.createQueryOptions();
+ qo.setBatchSize(batchSize);
+ try {
+ if(queryAll) {
+ qr = sfSoap.queryAll(queryString, sh);
+ } else {
+ MruHeader mruHeader = partnerFactory.createMruHeader();
+ mruHeader.setUpdateMru(false);
+
+ qr = sfSoap.query(queryString, sh);
+ }
+ } catch (InvalidFieldFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (MalformedQueryFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (InvalidIdFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidQueryLocatorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ return qr;
+ }
+
+ public QueryResult queryMore(String queryLocator, int batchSize) throws ConnectorException {
+ QueryOptions qo = partnerFactory.createQueryOptions();
+ qo.setBatchSize(batchSize);
+ try {
+ return sfSoap.queryMore(queryLocator, sh);
+ } catch (InvalidFieldFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidQueryLocatorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+
+ }
+
+ public int delete(String[] ids) throws ConnectorException {
+ List<DeleteResult> results = null;
+ try {
+ results = sfSoap.delete(Arrays.asList(ids), sh);
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+
+ boolean allGood = true;
+ StringBuffer errorMessages = new StringBuffer();
+ for(int i = 0; i < results.size(); i++) {
+ DeleteResult result = results.get(i);
+ if(!result.isSuccess()) {
+ if(allGood) {
+ errorMessages.append("Error(s) executing DELETE: ");
+ allGood = false;
+ }
+ List<com.sforce.soap.partner.Error> errors = result.getErrors();
+ if(null != errors && errors.size() > 0) {
+ for(int x = 0; x < errors.size(); x++) {
+ com.sforce.soap.partner.Error error = errors.get(x);
+ errorMessages.append(error.getMessage()).append(';');
+ }
+ }
+
+ }
+ }
+ if(!allGood) {
+ throw new ConnectorException(errorMessages.toString());
+ }
+ return results.size();
+ }
+
+ public int create(DataPayload data) throws ConnectorException {
+ SObject toCreate = new SObject();
+ toCreate.setType(data.getType());
+ toCreate.getAny().addAll(data.getMessageElements());
+ List<SObject> objects = new ArrayList<SObject>();
+ objects.add(toCreate);
+ List<SaveResult> result;
+ try {
+ result = sfSoap.create(objects, sh);
+ } catch (InvalidFieldFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (InvalidIdFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ return analyzeResult(result);
+ }
+
+ public int update(List<DataPayload> updateDataList) throws ConnectorException {
+ List<SObject> params = new ArrayList<SObject>(updateDataList.size());
+ for(int i = 0; i < updateDataList.size(); i++) {
+ DataPayload data = updateDataList.get(i);
+ SObject toCreate = new SObject();
+ toCreate.setType(data.getType());
+ toCreate.setId(data.getID());
+ toCreate.getAny().addAll(data.getMessageElements());
+ params.add(i, toCreate);
+ }
+ List<SaveResult> result;
+ try {
+ result = sfSoap.update(params, sh);
+ } catch (InvalidFieldFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (InvalidIdFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ return analyzeResult(result);
+ }
+
+ private int analyzeResult(List<SaveResult> results) throws ConnectorException {
+ for (SaveResult result : results) {
+ if(!result.isSuccess()) {
+ throw new ConnectorException(result.getErrors().get(0).getMessage());
+ }
+ }
+ return results.size();
+ }
+
+ public UpdatedResult getUpdated(String objectType, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) throws ConnectorException {
+ GetUpdatedResult updated;
+ try {
+ updated = sfSoap.getUpdated(objectType, startDate, endDate, sh);
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ UpdatedResult result = new UpdatedResult();
+ result.setLatestDateCovered(updated.getLatestDateCovered().toGregorianCalendar());
+ result.setIDs(updated.getIds());
+ return result;
+ }
+
+ public DeletedResult getDeleted(String objectName, XMLGregorianCalendar startCalendar,
+ XMLGregorianCalendar endCalendar) throws ConnectorException {
+ GetDeletedResult deleted;
+ try {
+ deleted = sfSoap.getDeleted(objectName, startCalendar, endCalendar, sh);
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ DeletedResult result = new DeletedResult();
+ result.setLatestDateCovered(deleted.getLatestDateCovered().toGregorianCalendar());
+ result.setEarliestDateAvailable(deleted.getEarliestDateAvailable().toGregorianCalendar());
+ List<DeletedRecord> records = deleted.getDeletedRecords();
+ List<DeletedObject> resultRecords = new ArrayList<DeletedObject>();
+ DeletedObject object;
+ if(null !=records) {
+ for (DeletedObject record : resultRecords) {
+ object = new DeletedObject();
+ object.setID(record.getID());
+ object.setDeletedDate(record.getDeletedDate());
+ resultRecords.add(object);
+ }
+ }
+ result.setResultRecords(resultRecords);
+ return result;
+ }
+
+ public QueryResult retrieve(String fieldList, String sObjectType, List<String> ids) throws ConnectorException {
+ try {
+ List<SObject> objects = sfSoap.retrieve(fieldList, sObjectType, ids, sh);
+ QueryResult result = new QueryResult();
+ result.getRecords().addAll(objects);
+ result.setSize(objects.size());
+ return result;
+ } catch (InvalidFieldFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (MalformedQueryFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (InvalidIdFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+
+ }
+
+ public DescribeGlobalResult getObjects() throws ConnectorException {
+ try {
+ return sfSoap.describeGlobal(sh);
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ ConnectorException ce = new ConnectorException(e.getCause().getMessage());
+ ce.initCause(e.getCause());
+ throw ce;
+ }
+ }
+
+ public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException {
+ try {
+ return sfSoap.describeSObject(objectName, sh);
+ } catch (com.sforce.soap.partner.InvalidSObjectFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ } catch (com.sforce.soap.partner.UnexpectedErrorFault e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ }
+
+ @Override
+ public void close() throws ResourceException {
+
+ }
+}
Modified: trunk/connectors/connector-salesforce/src/main/rar/META-INF/ra.xml
===================================================================
--- trunk/connectors/connector-salesforce/src/main/rar/META-INF/ra.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/main/rar/META-INF/ra.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,56 +34,13 @@
<license-required>true</license-required>
</license>
<resourceadapter>
- <resourceadapter-class>org.teiid.connector.basic.BasicResourceAdapter</resourceadapter-class>
+ <resourceadapter-class>org.teiid.resource.spi.BasicResourceAdapter</resourceadapter-class>
<outbound-resourceadapter>
<connection-definition>
- <managedconnectionfactory-class>com.metamatrix.connector.salesforce.SalesForceManagedConnectionFactory</managedconnectionfactory-class>
+ <managedconnectionfactory-class>org.teiid.resource.cci.salesforce.SalesForceManagedConnectionFactory</managedconnectionfactory-class>
<config-property>
- <description>{$display:"Connector Class",$advanced:"true"}</description>
- <config-property-name>ConnectorClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.salesforce.Connector</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Connector Capabilities",$description:"The class to use to provide the Connector Capabilities",$advanced:"true"}</description>
- <config-property-name>CapabilitiesClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.salesforce.SalesforceCapabilities</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is Immutable",$description:"Is Immutable, True if the source never changes.",$advanced:"true"}</description>
- <config-property-name>Immutable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is XA Capable",$description:"True, if this connector supports XA Transactions",$advanced:"true"}</description>
- <config-property-name>XaCapable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Exception on Exceeding Max Rows",$description:"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",$advanced:"true"}</description>
- <config-property-name>ExceptionOnMaxRows</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Maximum Result Rows",$description:"Maximum Result Rows allowed",$advanced:"true"}</description>
- <config-property-name>MaxResultRows</config-property-name>
- <config-property-type>java.lang.Integer</config-property-type>
- <config-property-value>-1</config-property-value>
- </config-property>
-
- <!-- Salesforce Specific properties -->
- <config-property>
<description>{$display:"User Name",$description:"Name value for Salesforce authentication",$required:"true"}</description>
<config-property-name>username</config-property-name>
<config-property-type>java.lang.String</config-property-type>
@@ -96,13 +53,6 @@
</config-property>
<config-property>
- <description>{$display:"Connector State Class",$description:"",$required:"true",$advanced:"true"}</description>
- <config-property-name>ConnectorStateClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.salesforce.ConnectorState</config-property-value>
- </config-property>
-
- <config-property>
<description>{$display:"Salesforce URL",$description:"URL for connecting to Salesforce",$advanced:"true"}</description>
<config-property-name>URL</config-property-name>
<config-property-type>java.lang.String</config-property-type>
@@ -122,17 +72,10 @@
<config-property-value>120000</config-property-value>
</config-property>
- <config-property>
- <description>{$display:"Audit Model Fields",$advanced:"true"}</description>
- <config-property-name>ModelAuditFields</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <connectionfactory-interface>org.teiid.connector.api.Connector</connectionfactory-interface>
- <connectionfactory-impl-class>org.teiid.connector.basic.WrappedConnector</connectionfactory-impl-class>
- <connection-interface>org.teiid.connector.api.Connection</connection-interface>
- <connection-impl-class>org.teiid.connector.basic.WrappedConnection</connection-impl-class>
+ <connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
+ <connectionfactory-impl-class>org.teiid.resource.spi.WrappedConnectionFactory</connectionfactory-impl-class>
+ <connection-interface>javax.resource.cci.Connection</connection-interface>
+ <connection-impl-class>org.teiid.resource.spi.WrappedConnection</connection-impl-class>
</connection-definition>
Deleted: trunk/connectors/connector-salesforce/src/test/java/com/metamatrix/connector/salesforce/execution/visitors/TestVisitors.java
===================================================================
--- trunk/connectors/connector-salesforce/src/test/java/com/metamatrix/connector/salesforce/execution/visitors/TestVisitors.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-salesforce/src/test/java/com/metamatrix/connector/salesforce/execution/visitors/TestVisitors.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,164 +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 com.metamatrix.connector.salesforce.execution.visitors;
-
-import static org.junit.Assert.*;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Test;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.MetadataStore;
-import org.teiid.connector.metadata.runtime.Schema;
-import org.teiid.connector.metadata.runtime.Table;
-import org.teiid.connector.metadata.runtime.Column.SearchType;
-import org.teiid.metadata.CompositeMetadataStore;
-import org.teiid.metadata.TransformationMetadata;
-
-import com.metamatrix.cdk.api.TranslationUtility;
-import com.metamatrix.common.types.DataTypeManager;
-import com.metamatrix.query.metadata.QueryMetadataInterface;
-import com.metamatrix.query.unittest.RealMetadataFactory;
-
-public class TestVisitors {
-
- public static QueryMetadataInterface exampleSalesforce() {
- MetadataStore store = new MetadataStore();
- // Create models
- Schema salesforceModel = RealMetadataFactory.createPhysicalModel("SalesforceModel", store); //$NON-NLS-1$
-
- // Create Account group
- Table accounTable = RealMetadataFactory.createPhysicalGroup("Account", salesforceModel); //$NON-NLS-1$
- accounTable.setNameInSource("Account"); //$NON-NLS-1$
- accounTable.setProperty("Supports Query", Boolean.TRUE.toString()); //$NON-NLS-1$
- // Create Account Columns
- String[] acctNames = new String[] {
- "ID", "Name", "Stuff", "Industry" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- };
- String[] acctTypes = new String[] {
- DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
- };
-
- List<Column> acctCols = RealMetadataFactory.createElements(accounTable, acctNames, acctTypes);
- acctCols.get(2).setNativeType("multipicklist"); //$NON-NLS-1$
- acctCols.get(2).setSearchType(SearchType.Like_Only);
- // Set name in source on each column
- String[] accountNameInSource = new String[] {
- "id", "AccountName", "Stuff", "Industry" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- };
- for(int i=0; i<2; i++) {
- Column obj = acctCols.get(i);
- obj.setNameInSource(accountNameInSource[i]);
- }
-
- // Create Contact group
- Table contactTable = RealMetadataFactory.createPhysicalGroup("Contact", salesforceModel); //$NON-NLS-1$
- contactTable.setNameInSource("Contact"); //$NON-NLS-1$
- contactTable.setProperty("Supports Query", Boolean.TRUE.toString()); //$NON-NLS-1$
- // Create Contact Columns
- String[] elemNames = new String[] {
- "ContactID", "Name", "AccountId" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- };
- String[] elemTypes = new String[] {
- DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
- };
-
- List<Column> contactCols = RealMetadataFactory.createElements(contactTable, elemNames, elemTypes);
- // Set name in source on each column
- String[] contactNameInSource = new String[] {
- "id", "ContactName", "accountid" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- };
- for(int i=0; i<2; i++) {
- Column obj = contactCols.get(i);
- obj.setNameInSource(contactNameInSource[i]);
- }
- return new TransformationMetadata(null, new CompositeMetadataStore(store), null, null);
- }
-
- private static TranslationUtility translationUtility = new TranslationUtility(exampleSalesforce());
-
- @Test public void testOr() throws Exception {
- Select command = (Select)translationUtility.parseCommand("select * from Account where Name = 'foo' or Stuff = 'bar'"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (Account.AccountName = 'foo') OR (Account.Stuff = 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
- @Test public void testNot() throws Exception {
- Select command = (Select)translationUtility.parseCommand("select * from Account where not (Name = 'foo' and Stuff = 'bar')"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (Account.AccountName != 'foo') OR (Account.Stuff != 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
- @Test public void testCountStart() throws Exception {
- Select command = (Select)translationUtility.parseCommand("select count(*) from Account"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT count() FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
- @Test public void testNotLike() throws Exception {
- Select command = (Select)translationUtility.parseCommand("select * from Account where Name not like '%foo' or Stuff = 'bar'"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (NOT (Account.AccountName LIKE '%foo')) OR (Account.Stuff = 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
-
- @Test public void testIN() throws Exception {
- Select command = (Select)translationUtility.parseCommand("select * from Account where Industry IN (1,2,3)"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertFalse(visitor.hasOnlyIDCriteria());
- assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE Industry IN('1','2','3')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
-
- }
-
- @Test public void testOnlyIDsIN() throws Exception {
- // this can resolve to a better performing retrieve call
- Select command = (Select)translationUtility.parseCommand("select * from Account where ID IN (1,2,3)"); //$NON-NLS-1$
- SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertTrue(visitor.hasOnlyIdInCriteria());
- assertEquals("Account", visitor.getTableName());
- assertEquals("Account.id, Account.AccountName, Account.Stuff, Account.Industry", visitor.getRetrieveFieldList());
- assertEquals(Arrays.asList(new String[]{"1", "2", "3"}), visitor.getIdInCriteria());
- }
-
- @Test public void testJoin() throws Exception {
- Select command = (Select)translationUtility.parseCommand("SELECT Account.Name, Contact.Name FROM Contact LEFT OUTER JOIN Account ON Account.Id = Contact.AccountId"); //$NON-NLS-1$
- SelectVisitor visitor = new JoinQueryVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT Account.AccountName, Contact.ContactName FROM Contact", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
- @Test public void testJoin2() throws Exception {
- Select command = (Select)translationUtility.parseCommand("SELECT Account.Name, Contact.Name FROM Account LEFT OUTER JOIN Contact ON Account.Id = Contact.AccountId"); //$NON-NLS-1$
- SelectVisitor visitor = new JoinQueryVisitor(translationUtility.createRuntimeMetadata());
- visitor.visit(command);
- assertEquals("SELECT Account.AccountName, (SELECT Contact.ContactName FROM Contacts) FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
- }
-
-}
Modified: trunk/connectors/connector-text/pom.xml
===================================================================
--- trunk/connectors/connector-text/pom.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,35 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <parent>
- <artifactId>connectors</artifactId>
- <groupId>org.jboss.teiid</groupId>
- <version>7.0.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>connector-text</artifactId>
- <groupId>org.jboss.teiid.connectors</groupId>
- <name>Text Connector</name>
- <packaging>rar</packaging>
- <description>This connector reads data from text files.</description>
-
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>connector-text</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>Text Connector</name>
+ <packaging>rar</packaging>
+ <description>This connector reads data from text files.</description>
+
<dependencies>
<dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-connector-api</artifactId>
- <scope>provided</scope>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-common-core</artifactId>
- <scope>provided</scope>
- </dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
<dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>translator-text</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>javax.resource</groupId>
<artifactId>connector-api</artifactId>
<scope>provided</scope>
- </dependency>
+ </dependency>
</dependencies>
-
<build>
<plugins>
<plugin>
@@ -52,10 +57,8 @@
<classifier>lib</classifier>
</configuration>
</execution>
-
</executions>
</plugin>
</plugins>
- </build>
-
+ </build>
</project>
\ No newline at end of file
Copied: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text (from rev 2083, trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text)
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/StringToDateTranslator.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/StringToDateTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/StringToDateTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,228 +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 com.metamatrix.connector.text;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-
-/**
- * <p>This is a helper class for TextTranslators that can be used to translate
- * any String that is a representation of a date to a java.util.Date object.
- * This class is created by passing it a properties object that contains at least
- * one property. The value of this property is a String that can be a delimited list of
- * date format Strings. Date format Strings can be any format String that a
- * java.text.SimpleDateFormat can be created with. There is also an optional
- * property that defines the delimiter for the list of Date format Strings.
- * If this property is not specified then the entire String value of the DateFormatStrings
- * property will be used as the only format that this class can translate.</p>
- *
- * <p>After this class is created it can the be used to translate Strings into
- * java.util.Date object using the translateStringToDate(String) method.</p>
- */
-public class StringToDateTranslator {
-
- TextManagedConnectionFactory config;
-
- /**
- * The SimpleDateFormat objects that are used to translate dates for this
- * connector.
- */
- private List simpleDateFormats;
-
- /**
- * The List of date format Strings that define the patterns of the Strings
- * that this translator can translate.
- */
- private List dateFormatStrings;
-
- /**
- * This boolean determines whether this instance has any DateFormatters
- * to translate Strings with. It is cached for performance reasons.
- */
- private boolean hasFormatters=false;
-
- /**
- * <p>This class is created by passing it a properties object that contains at least
- * one property. The value of this property is a String that can be a delimited list of
- * date format Strings. Date format Strings can be any format String that a
- * java.text.SimpleDateFormat can be created with. There is also an optional
- * property that defines the delimiter for the list of Date format Strings.
- * If this property is not specified then the entire String value of the DateFormatStrings
- * property will be used as the only format that this class can translate.</p>
- *
- * <p>Note that the order of the list of date format strings is important
- * because the translator attempts to translate the String passed to it in the
- * order of the date format Strings in the delimited property value.</p>
- *
- * <p>After this class is created it can the be used to translate Strings into
- * java.util.Date object using the translateStringToDate(String) method.</p>
- *
- * <pre>
- * The properties that are required in construction of this class are as
- * follows:
- *
- * PropertyName: TextPropertyNames.DATE_RESULT_FORMATS
- * PropertyValue: Delimited list of date format Strings: ie MM/dd/yy' 'hh:mm:ss
- *
- * PropertyName: TextPropertyNames.DATE_RESULT_FORMATS_DELIMITER
- * PropertyValue: Delimiter for value of TextPropertyNames.DATE_RESULT_FORMATS
- * </pre>
- */
- public StringToDateTranslator(TextManagedConnectionFactory config) {
- this.config = config;
-
- String dateFormats = config.getDateResultFormats();
- String dateFormatsDelimiter = config.getDateResultFormatsDelimiter();
-
- if (!(dateFormatsDelimiter == null || dateFormatsDelimiter.trim().length() == 0)) {
- if (!(dateFormats == null || dateFormats.trim().length() == 0)) {
- createSimpleDateFormats(dateFormats, dateFormatsDelimiter);
- }
- } else if (!(dateFormats == null || dateFormats.trim().length() == 0)) {
- createSimpleDateFormat(dateFormats);
- }
-
- if (simpleDateFormats != null && simpleDateFormats.size() > 0) {
- hasFormatters = true;
- }
- }
-
- /**
- * This method is used to translate String representations of dates into
- * java.util.Date objects using a set of formats passed into this class at
- * creation time. Has formatters should always be called on this class
- * prior to the use of this method to determine whether or not there are any
- * formatters this class can use to translate the String value passed in.
- * If there are no formatters and this method is called, it will throw
- * a parse Exception.
- *
- * @param string the String to be parsed into a java.util.Date
- * @return the java.util.Date representation of the passed in String
- * @throws ParseException if the String passed in could not be parsed
- */
- public java.util.Date translateStringToDate(String string) throws ParseException{
- List parseExceptionList = new ArrayList();
- Iterator iterator = simpleDateFormats.iterator();
-
- while (iterator.hasNext()) {
- SimpleDateFormat formatter = (SimpleDateFormat)iterator.next();
- try {
- java.util.Date date = formatter.parse(string);
- return date;
- }catch(ParseException e) {
- parseExceptionList.add(e);
- // Do nothing here will try again with the next formatter
- }
- }
-
- // if we have reached this point without returning a Date, we
- // have been unsuccessful in parsing: throw an exception
-
- // This should always be the case, but just for safety:
- if (dateFormatStrings.size() == parseExceptionList.size()) {
- StringBuffer message = new StringBuffer();
- int counter = 0;
- Object[] params = new Object[] { string };
- message.append(TextPlugin.Util.getString("StringToDateTranslator.Attempts_to_parse_String__{0}_to_a_java.util.Date_failed_for_the_following_reasons___1", params)); //$NON-NLS-1$
-
- if (!hasFormatters()) {
- message.append(TextPlugin.Util.getString("StringToDateTranslator.There_is_no_format_Strings_found_in_this_formatter_object._n_2", params)); //$NON-NLS-1$
- }
-
- Iterator exceptionsIterator = parseExceptionList.iterator();
- Iterator formatStringsIterator = dateFormatStrings.iterator();
- while (exceptionsIterator.hasNext()) {
- String format = (String)formatStringsIterator.next();
- String exceptionMessage = ((ParseException)exceptionsIterator.next()).getMessage();
- Object[] params2 = new Object[] { ""+counter, format, exceptionMessage }; //$NON-NLS-1$
- message.append(TextPlugin.Util.getString("StringToDateTranslator.Parse_Attempt__{0}_using_format__{1}_failed_for_the_following_reason__{2}_4", params2)); //$NON-NLS-1$
- counter++;
- }
-
- throw new ParseException(message.toString(),0);
- }
- Object params3 = new Object[] { string, dateFormatStrings };
- throw new ParseException(TextPlugin.Util.getString("StringToDateTranslator.Failed_to_convert_String__{0}_to_a_Date_using_one_of_the_following_format_Strings_that_are_specified_in_the_properties_for_this_Connector__{1}_1", params3), 0); //$NON-NLS-1$
- }
-
- /**
- * This method is used to check the status of this translator object.
- * It will return true if this translator has any 'formatters' to do parsing
- * of Strings in the translateStringToDate() method. This method should
- * always be called prior to using the translateStringToDate() method.
- * If there are no formatters for the instance of this class, all calls to
- * the translateStringToDate() method will throw a ParseException.
- *
- * @return true if this class has formatters to parse Strings to Dates
- */
- public boolean hasFormatters() {
- return hasFormatters;
- }
-
- /**
- * This method is a helper method that will instantiate the formatters that
- * this object uses to translate Strings into Dates.
- *
- * @param dateFormats the delimited String of date format templates to
- * be used to create the date formatters for this object.
- * @param dateFormatsDelimiter the delimiter used to delimit the dateFormats
- * String that is also passed into this method.
- */
- private void createSimpleDateFormats(String dateFormats, String dateFormatsDelimiter) {
- simpleDateFormats = new ArrayList();
- dateFormatStrings = new ArrayList();
- StringTokenizer tokenizer = new StringTokenizer(dateFormats, dateFormatsDelimiter);
-
- while (tokenizer.hasMoreTokens()) {
- String token = tokenizer.nextToken();
- this.config.getLogger().logTrace("Creating simple Date format for formatting String: " +token); //$NON-NLS-1$
-
- dateFormatStrings.add(token);
- SimpleDateFormat formatter = new SimpleDateFormat(token.trim());
- simpleDateFormats.add(formatter);
- }
- }
-
- /**
- * This method is as helper method that will create a single date formatter
- * from the date format template String that is passed into it.
- *
- * @param dateFormats the String that is the template for translating
- * Strings into java.util.Date objects
- */
- private void createSimpleDateFormat(String dateFormats) {
- simpleDateFormats = new ArrayList();
- dateFormatStrings = new ArrayList();
- this.config.getLogger().logTrace("Creating simple Date format for formatting String: " +dateFormats); //$NON-NLS-1$
-
- SimpleDateFormat formatter = new SimpleDateFormat(dateFormats);
- dateFormatStrings.add(dateFormats);
- simpleDateFormats.add(formatter);
- }
-
-}
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextCapabilities.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextCapabilities.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,31 +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 com.metamatrix.connector.text;
-
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-
-public class TextCapabilities extends BasicConnectorCapabilities {
-
- static TextCapabilities INSTANCE = new TextCapabilities();
-
-}
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnection.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextConnection.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,99 +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 com.metamatrix.connector.text;
-
-import java.util.Map;
-import java.util.Properties;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.MetadataProvider;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-import org.teiid.connector.metadata.runtime.Table;
-
-
-/**
- * Implementation of Connection interface for text connection.
- */
-public class TextConnection extends BasicConnection implements MetadataProvider {
-
- // metadata props -- Map<groupName --> Map<propName, propValue>
- Map <String, Properties> metadataProps;
-
- // connector props
- private TextManagedConnectionFactory config;
-
- /**
- * Constructor.
- * @param env
- */
- TextConnection(TextManagedConnectionFactory env, Map metadataProps) {
- this.config = env;
- this.metadataProps = metadataProps;
- }
-
- @Override
- public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new TextSynchExecution(this.config, (Select)command, this.metadataProps);
- }
-
- @Override
- public void close() {
- metadataProps = null;
- }
-
- @Override
- public void getConnectorMetadata(MetadataFactory metadataFactory) throws ConnectorException {
- for (Map.Entry<String, Properties> entry : this.metadataProps.entrySet()) {
- Properties p = entry.getValue();
- String columns = p.getProperty(TextPropertyNames.COLUMNS);
- if (columns == null) {
- continue;
- }
- String types = p.getProperty(TextPropertyNames.TYPES);
- String[] columnNames = columns.trim().split(","); //$NON-NLS-1$
- String[] typeNames = null;
- if (types != null) {
- typeNames = types.trim().split(","); //$NON-NLS-1$
- if (typeNames.length != columnNames.length) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnector.column_mismatch", entry.getKey())); //$NON-NLS-1$
- }
- }
- Table table = metadataFactory.addTable(entry.getKey().substring(entry.getKey().indexOf('.') + 1));
- for (int i = 0; i < columnNames.length; i++) {
- String type = typeNames == null?TypeFacility.RUNTIME_NAMES.STRING:typeNames[i].trim().toLowerCase();
- Column column = metadataFactory.addColumn(columnNames[i].trim(), type, table);
- column.setNameInSource(String.valueOf(i));
- column.setNativeType(TypeFacility.RUNTIME_NAMES.STRING);
- }
- }
- }
-}
Added: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionFactory.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionFactory.java (rev 0)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,317 @@
+/*
+ * 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.resource.cci.text;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.Connection;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.text.TextDescriptorPropertyNames;
+import org.teiid.resource.adapter.text.TextUtil;
+import org.teiid.resource.spi.BasicConnectionFactory;
+
+public class TextConnectionFactory extends BasicConnectionFactory {
+ private static final long serialVersionUID = 1838645911208083797L;
+ private TextManagedConnectionFactory mcf;
+ private Map<String, Properties> metadataProps = new HashMap<String, Properties>();
+ private int srcFiles = 0;
+ private int srcFileErrs = 0;
+ private String parentDirectory;
+
+ public TextConnectionFactory(TextManagedConnectionFactory mcf) throws ConnectorException {
+ this.mcf = mcf;
+ initMetaDataProps();
+ }
+
+ @Override
+ public Connection getConnection() throws ResourceException {
+ return new TextConnectionImpl(this.metadataProps);
+ }
+
+
+ private void initMetaDataProps() throws ConnectorException {
+ reinitFileCounts();
+ try {
+ readDescriptor(this.mcf.getDescriptorFile(), this.mcf.isPartialStartupAllowed());
+ reinitFileCounts();
+ } catch (ConnectorException ce) {
+ // If partial startup is not allowed, throw the exception
+ if(!this.mcf.isPartialStartupAllowed() ) {
+ reinitFileCounts();
+ throw ce;
+ // If partial startup is allowed, only throw exception if no files connected
+ } else if(this.srcFileErrs==this.srcFiles) {
+ reinitFileCounts();
+ throw ce;
+ }
+ }
+ }
+
+ private void reinitFileCounts() {
+ this.srcFiles=0;
+ this.srcFileErrs=0;
+ }
+
+ /**
+ * Read Descriptor file and get properties info for acessing the file.
+ * @param descriptorFile String standing for the name of descriptor file.
+ * @throws ConnectorException throws if error occurs
+ */
+ private void readDescriptor(String descriptorFile, boolean startPartial)
+ throws ConnectorException {
+
+ // Verify required items
+ if (descriptorFile == null || descriptorFile.trim().length() == 0) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_name_is_not_specified._2")); //$NON-NLS-1$
+ }
+ // Save first exception if there are multiple
+ ConnectorException connExcep = null;
+
+ BufferedReader br = null;
+ try {
+ br = getReader(descriptorFile);
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Reading descriptor file: " + descriptorFile); //$NON-NLS-1$
+
+ String line = null;
+ // Walk through records, finding matches
+ while(true) {
+ line = br.readLine();
+ if (line == null) {
+ break;
+ }
+
+ // Skip blank lines
+ if (line.length() == 0) {
+ continue;
+ }
+
+ // populate the map with metadata information for the given line. If readAll option is chosen,
+ // keep trying to read until everything is tried, then throw the first exception encountered.
+ try {
+ getMetadata(line);
+ } catch (ConnectorException e) {
+ if(!startPartial) {
+ throw e;
+ } else if (connExcep==null) {
+ connExcep=e;
+ }
+ }
+
+ }
+ // throw first exception if readAll was set
+ if(connExcep!=null) throw connExcep;
+
+ } catch (IOException e) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, e, TextPlugin.Util.getString("TextConnection.Error_while_reading_text_file__{0}_1", new Object[] {e.getMessage()})); //$NON-NLS-1$
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.Error_trying_to_establish_connection_5")); //$NON-NLS-1$
+ } finally {
+ if (br != null) {
+ try {br.close();} catch (Exception ee) {}
+ }
+ }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Successfully read metadata information from the descriptor file " + descriptorFile); //$NON-NLS-1$
+ }
+
+ /**
+ * Read the property string and populate the properties with info needed to access data files.
+ */
+ private void getMetadata(String propStr) throws ConnectorException {
+ try {
+ int index = 0;
+
+ // Property String --> <Fully_Qualified_Group>.location=<location of actual file>
+ int eqIndex = propStr.indexOf("=", index); //$NON-NLS-1$
+ String propString = propStr.substring(index, eqIndex);
+
+ if (!propString.equals(" ")) { //$NON-NLS-1$
+ propString = propString.trim();
+ }
+
+ int lastIndex = propString.lastIndexOf('.');
+
+ // group name
+ String groupName = propString.substring(0, lastIndex).toUpperCase();
+ // property name
+ String propertyName = propString.substring(lastIndex + 1).toUpperCase();
+
+ // Properties read from descriptor, which are properties for a given group
+ Properties props = metadataProps.get(groupName);
+ if (props == null) {
+ props = new Properties();
+ }
+
+ // Adjust index past '='
+ index = eqIndex + 1;
+
+ // Read property value
+ String propertyValue = propStr.substring(index).trim();
+
+ if (propertyName.equals(TextDescriptorPropertyNames.LOCATION)) {
+ srcFiles++;
+ // Verify required items
+ if (propertyValue == null || propertyValue.trim().length() == 0) {
+ srcFileErrs++;
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Text_file_name_is_not_specified_for_the_group___{0}_2", new Object[] {groupName})); //$NON-NLS-1$
+ }
+ try {
+ checkFile(propertyValue, props, groupName);
+ } catch (ConnectorException e) {
+ if (this.parentDirectory == null) {
+ throw e;
+ }
+ srcFileErrs--;
+ try {
+ checkFile(parentDirectory + "/" + propertyValue, props, groupName); //$NON-NLS-1$
+ } catch (ConnectorException e1) {
+ throw e;
+ }
+ }
+ } else if (propertyName.equals(TextDescriptorPropertyNames.HEADER_LINES)) {
+ try {
+ Integer.parseInt(propertyValue);
+ } catch (NumberFormatException e) {
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3", new Object[] {e.getMessage()})); //$NON-NLS-1$
+ }
+ } else if (propertyName.equals(TextDescriptorPropertyNames.HEADER_ROW)) {
+ try {
+ Integer.parseInt(propertyValue);
+ } catch (NumberFormatException e) {
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3", new Object[] {e.getMessage()})); //$NON-NLS-1$
+ }
+ } else if (!(propertyName.equals(TextDescriptorPropertyNames.COLUMNS) || propertyName.equals(TextDescriptorPropertyNames.TYPES) || propertyName.equals(TextDescriptorPropertyNames.TYPES) || propertyName.equals(TextDescriptorPropertyNames.TYPES) || propertyName.equals(TextDescriptorPropertyNames.TYPES) || propertyName.equals(TextDescriptorPropertyNames.DELIMITER) || propertyName.equals(TextDescriptorPropertyNames.QUALIFIER))) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.The_property_{0}_for_the_group_{1}_is_invalid._4", new Object[] {propertyName, groupName})); //$NON-NLS-1$
+ }
+
+ // Check for tab as a delimiter and use correct string
+ if (propertyValue != null && propertyValue.equals("\\t")) { //$NON-NLS-1$
+ propertyValue = "\t"; //$NON-NLS-1$
+ }
+
+ if (propertyValue != null && !propertyValue.equals("")) { //$NON-NLS-1$
+ // Add property
+ props.put(propertyName, propertyValue);
+ metadataProps.put(groupName, props);
+ }
+ } catch (Exception e) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Error_parsing_property_string_{0}__{1}_6", new Object[] {propStr, e.getMessage()})); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * This method gets the reader object for the descriptorfile present either on the local file system or the web.
+ * @param fileLocation String standing for the fileLocation either in file system or web.
+ * @return BufferReader for the file
+ */
+ private BufferedReader getReader(String fileLocation) throws ConnectorException {
+ BufferedReader br = null;
+ // Construct file and make sure it exists and is readable
+ File descfile = new File(fileLocation);
+ if (descfile.isFile()) {
+ if (!descfile.exists()) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_9", new Object[] {fileLocation})); //$NON-NLS-1$
+ } else if (!descfile.canRead()) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_{0}_found_but_does_not_have_Read_permissions_10", new Object[] {fileLocation})); //$NON-NLS-1$
+ }
+ this.parentDirectory = descfile.getParent();
+ try {
+ br = new BufferedReader(new FileReader(descfile));
+
+ } catch (FileNotFoundException fe) {
+ throw new ConnectorException(fe,TextPlugin.Util.getString("TextConnection.Couldn__t_find_the_file_of_name_{0}_11", new Object[] {descfile})); //$NON-NLS-1$
+ }
+ } else {
+ try {
+ URL url = new URL(fileLocation);
+ // create the connection to the URL
+ URLConnection conn = url.openConnection();
+ // establish the connection to the URL
+ conn.connect();
+ // get the stream from the connection
+ InputStreamReader inSR = new InputStreamReader(conn.getInputStream());
+ // place the stream into a buffered reader
+ br = new BufferedReader(inSR);
+ } catch (IOException e) {
+ throw new ConnectorException(e,TextPlugin.Util.getString("TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_12", new Object[] {fileLocation})); //$NON-NLS-1$
+ }
+ }
+ return br;
+ }
+
+ /**
+ * Check if the file or url of the given name exists and populate properties.
+ */
+ private void checkFile(String fileName, Properties props, String groupName)
+ throws ConnectorException {
+
+ // Construct file and make sure it exists and is readable
+ File datafile = new File(fileName);
+
+ File[] files= TextUtil.getFiles(fileName);
+
+
+ // determine if the wild card is used to indicate all files
+ // of the specified extension
+ if (files == null && TextUtil.usesWildCard(fileName)) {
+ srcFileErrs++;
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
+ }
+ if (files != null && files.length > 0) {
+ props.setProperty(TextDescriptorPropertyNames.FILE_LOCATION, fileName);
+ } else if (datafile.isFile()){
+ if (!datafile.exists()) {
+ srcFileErrs++;
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
+ }
+ else if (!datafile.canRead()) {
+ srcFileErrs++;
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Data_file_{0}_found_but_does_not_have_Read_permissions_8", new Object[] {fileName})); //$NON-NLS-1$
+ }
+ props.setProperty(TextDescriptorPropertyNames.FILE_LOCATION, fileName);
+ } else {
+ try {
+ URL url = new URL(fileName);
+ // create the connection to the URL
+ URLConnection conn = url.openConnection();
+ // establish the connection to the URL
+ conn.connect();
+ props.setProperty(TextDescriptorPropertyNames.URL_LOCATION, fileName);
+ } catch (IOException e) {
+ srcFileErrs++;
+ throw new ConnectorException(e,TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
+ }
+ }
+ }
+}
Property changes on: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionImpl.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionImpl.java (rev 0)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnectionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,311 @@
+/*
+ * 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.resource.cci.text;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.resource.ResourceException;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.text.TextConnection;
+import org.teiid.resource.adapter.text.TextDescriptorPropertyNames;
+import org.teiid.resource.adapter.text.TextPlugin;
+import org.teiid.resource.adapter.text.TextUtil;
+import org.teiid.resource.spi.BasicConnection;
+
+import com.metamatrix.core.util.StringUtil;
+
+
+/**
+ * Implementation of Connection interface for text connection.
+ */
+public class TextConnectionImpl extends BasicConnection implements TextConnection{
+
+ private Map<String, Properties> metadataProps;
+ private ArrayList readerQueue = new ArrayList();
+ private int readerQueueIndex = 0;
+ private String headerMsg;
+ private String firstLine = null;
+
+ // current Reader object
+ private BufferedReader currentreader = null;
+
+ // Line num in the text file
+ private int lineNum = 0;
+
+
+ public TextConnectionImpl(Map<String, Properties> props) {
+ this.metadataProps = props;
+ }
+
+ @Override
+ public void close() throws ResourceException {
+ if (readerQueue.size() > 0) {
+ for (Iterator it=readerQueue.iterator(); it.hasNext();) {
+ BufferedReader br = (BufferedReader) it.next();
+ try {
+ br.close();
+ } catch (IOException err) {
+ }
+
+ }
+ }
+ readerQueue.clear();
+ }
+
+ @Override
+ public Map<String, Properties> getMetadataProperties() {
+ return metadataProps;
+ }
+
+ private List<Reader> createReaders(String tableName) throws ConnectorException {
+ try {
+ createReaders(this.metadataProps.get(tableName), tableName);
+ } catch (IOException e) {
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Unable_get_Reader", new Object[] {tableName, e.getMessage() })); //$NON-NLS-1$
+
+ }
+ return readerQueue;
+ }
+
+ /**
+ * This method gets the reader object for the textfile present either on
+ * the local file system or the web.
+ * @param props Group's metadata properites string
+ * @return BufferReader Object
+ */
+ private void createReaders(Properties props, String groupName) throws IOException, ConnectorException {
+ if(readerQueue != null && readerQueue.size() > 0) {
+ return ;
+ }
+
+ if(props == null) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Error_obtain_properties_for_group", groupName)); //$NON-NLS-1$
+ }
+
+ String fileName = props.getProperty(TextDescriptorPropertyNames.FILE_LOCATION);
+
+
+ if(fileName != null) {
+ File datafile = new File(fileName);
+ File[] files= TextUtil.getFiles(fileName);
+
+
+ // determine if the wild card is used to indicate all files
+ // of the specified extension
+ if (files != null && files.length > 0) {
+ for (int i = 0; i<files.length; i++) {
+ File f = files[i];
+ addReader(f.getName(), f);
+ }
+
+ } else {
+ addReader(fileName, datafile);
+ }
+ } else {
+ String urlName = props.getProperty(TextDescriptorPropertyNames.URL_LOCATION);
+ if(urlName==null) {
+ Object[] params = new Object[] { groupName };
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Unable_get_Reader_for_group", params)); //$NON-NLS-1$
+ }
+
+ // create the URL object
+ URL url = new URL(urlName);
+ // create the connection to the URL
+ URLConnection conn = url.openConnection();
+ // establish the connection to the URL
+ conn.connect();
+ // get the stream from the connection
+ InputStreamReader inSR = new InputStreamReader(conn.getInputStream());
+ // place the stream into a buffered reader
+ addReader(fileName, inSR);
+ }
+
+ }
+
+ private void addReader(String fileName, File datafile) throws IOException {
+
+ FileInputStream fis = new FileInputStream(datafile);
+ InputStreamReader inSR = new InputStreamReader(fis);
+
+ BufferedReader r = new BufferedReader(inSR);
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Reading file: " + fileName); //$NON-NLS-1$
+ readerQueue.add(r);
+ }
+
+ private void addReader(String fileName, InputStreamReader inSr) {
+ BufferedReader r = new BufferedReader(inSr);
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Reading URL: " + fileName); //$NON-NLS-1$
+ readerQueue.add(r);
+ }
+
+ /**
+ * Gets the current reader, looking at the next
+ * one in the list if the current one is null.
+ *
+ * If HEADER_LINES is greater than 0, an attempt is made to
+ * read the column headers from the file. If HEADER_ROW is
+ * less than 1, row HEADER_LINES is used as the row that may
+ * contain column names. If HEADER_ROW is greater than 1,
+ * row HEADER_ROW is used as the row that may contain column
+ * names.
+ *
+ * @throws ConnectorException
+ */
+ private String nextLine(String tableName) throws ConnectorException {
+ if (currentreader == null && readerQueueIndex < readerQueue.size()) {
+ // reader queue index is advanced only by the nextReader()
+ // method. Don't do it here.
+ currentreader = (BufferedReader)readerQueue.get(readerQueueIndex);
+ }
+ /* Retrieve connector properties so that we can find a
+ * header row if necessary.
+ */
+ Properties groupProps = this.metadataProps.get(tableName);
+ String line = null;
+ String location = groupProps.getProperty(TextDescriptorPropertyNames.LOCATION);
+ String qualifier = groupProps.getProperty(TextDescriptorPropertyNames.QUALIFIER);
+ String topLines = groupProps.getProperty(TextDescriptorPropertyNames.HEADER_LINES);
+ String headerLine = groupProps.getProperty(TextDescriptorPropertyNames.HEADER_ROW);
+
+ int numTop = 0;
+ int headerRowNum = 0;
+ if (topLines != null && topLines.length() > 0)
+ numTop = Integer.parseInt(topLines);
+ if (headerLine != null && headerLine.length() > 0)
+ headerRowNum = Integer.parseInt(headerLine);
+
+ /* Check to see if the value for HEADER_ROW is greater than
+ * the number of lines to skip. If it is, it is invalid and
+ * we will use HEADER_LINES instead.
+ */
+ if ( headerRowNum > numTop ) {
+ Object[] params = new Object[] { TextDescriptorPropertyNames.HEADER_ROW, new Integer(headerRowNum), new Integer(numTop) };
+ String msg = TextPlugin.Util.getString("TextSynchExecution.Property_contains_an_invalid_value_Using_value", params); //$NON-NLS-1$
+ // TODO: We should include the group name in the log message.
+ LogManager.logWarning(LogConstants.CTX_CONNECTOR, msg);
+
+ headerRowNum = numTop;
+ }
+ try {
+ // set hasQualifier flag
+ boolean hasQualifier = false;
+ if (qualifier != null && qualifier.length() > 0)
+ hasQualifier = true;
+
+ // Walk through rows looking for header row
+ while (currentreader != null) {
+ line = currentreader.readLine();
+ // Hit the end of file or the file is empty then
+ // try next reader
+ if (line == null) {
+ advanceToNextReader();
+ lineNum = 0;
+ return nextLine(tableName);
+ }
+
+ // check if we have a qualifier defined
+ // if yes check that all qualifiers have been terminated
+ // if not then append the next line (if available)
+ if (hasQualifier) {
+ while (StringUtil.occurrences(line, qualifier) % 2 != 0) {
+ String nextLine = currentreader.readLine();
+ if (nextLine != null)
+ line = line + StringUtil.LINE_SEPARATOR + nextLine;
+ else {
+ Object[] params = new Object[] { line };
+ String msg = TextPlugin.Util.getString("TextSynchExecution.Text_has_no_determined_ending_qualifier", params); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ }
+ }
+ lineNum++;
+
+ // Skip blank lines
+ if (line.length() == 0) continue;
+
+ // Attempt to retrieve column names from header row
+ // or last row of header lines.
+ if ((headerRowNum > 0 && headerRowNum == lineNum) || (numTop == lineNum)) {
+ // This is the header row; check if null to avoid the second or clause
+ if (headerMsg == null) {
+ headerMsg = line;
+ }
+ continue;
+ } else if (numTop >= lineNum) {
+ continue;
+ }
+ return line;
+ }
+ } catch (Throwable e) {
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Error_reading_text_file", new Object[] { location, e.getMessage() })); //$NON-NLS-1$
+ }
+ // we are done reading..
+ return null;
+ }
+
+ /**
+ * Indicate that we are done with the current reader and we should
+ * advance to the next reader.
+ */
+ private void advanceToNextReader(){
+ currentreader = null;
+ readerQueueIndex++;
+ }
+
+ @Override
+ public String getHeaderLine(String tableName) throws ConnectorException {
+ if (this.headerMsg != null) {
+ return this.headerMsg;
+ }
+ createReaders(tableName);
+ this.firstLine = nextLine(tableName);
+ return this.headerMsg;
+ }
+
+ @Override
+ public String getNextLine(String tableName) throws ConnectorException {
+ // make sure the reader are created
+ createReaders(tableName);
+ if (this.firstLine != null) {
+ String copy = this.firstLine;
+ this.firstLine = null;
+ return copy;
+ }
+ return nextLine(tableName);
+ }
+}
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnector.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextConnector.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,331 +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 com.metamatrix.connector.text;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.basic.BasicConnector;
-
-
-/**
- * Implementation of text connector.
- */
-public class TextConnector extends BasicConnector {
-
- private TextManagedConnectionFactory config;
- private int srcFiles = 0;
- private int srcFileErrs = 0;
- private Map<String, Properties> metadataProps = new HashMap<String, Properties>();
- private String parentDirectory;
-
- @Override
- public void initialize(ConnectorEnvironment env) throws ConnectorException {
- super.initialize(env);
-
- this.config = (TextManagedConnectionFactory)env;
-
- initMetaDataProps();
-
- // test connection
- TextConnection test = new TextConnection(this.config, metadataProps);
- test.close();
- }
-
-
- public Connection getConnection() throws ConnectorException {
- return new TextConnection(this.config, metadataProps);
- }
-
- private void initMetaDataProps() throws ConnectorException {
- reinitFileCounts();
- try {
- readDescriptor(this.config.getDescriptorFile(),this.config.isPartialStartupAllowed());
- reinitFileCounts();
- } catch (ConnectorException ce) {
- // If partial startup is not allowed, throw the exception
- if(!this.config.isPartialStartupAllowed() ) {
- reinitFileCounts();
- throw ce;
- // If partial startup is allowed, only throw exception if no files connected
- } else if(this.srcFileErrs==this.srcFiles) {
- reinitFileCounts();
- throw ce;
- }
- }
- }
-
-
- private void reinitFileCounts() {
- this.srcFiles=0;
- this.srcFileErrs=0;
- }
-
- /**
- * Read Descriptor file and get properties info for acessing the file.
- * @param descriptorFile String standing for the name of descriptor file.
- * @throws ConnectorException throws if error occurs
- */
- private void readDescriptor(String descriptorFile, boolean startPartial)
- throws ConnectorException {
-
- // Verify required items
- if (descriptorFile == null || descriptorFile.trim().length() == 0) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_name_is_not_specified._2")); //$NON-NLS-1$
- }
- // Save first exception if there are multiple
- ConnectorException connExcep = null;
-
- BufferedReader br = null;
- try {
- br = getReader(descriptorFile);
- this.config.getLogger().logInfo("Reading descriptor file: " + descriptorFile); //$NON-NLS-1$
-
- String line = null;
- // Walk through records, finding matches
- while(true) {
- line = br.readLine();
- if (line == null) {
- break;
- }
-
- // Skip blank lines
- if (line.length() == 0) {
- continue;
- }
-
- // populate the map with metadata information for the given line. If readAll option is chosen,
- // keep trying to read until everything is tried, then throw the first exception encountered.
- try {
- getMetadata(line);
- } catch (ConnectorException e) {
- if(!startPartial) {
- throw e;
- } else if (connExcep==null) {
- connExcep=e;
- }
- }
-
- }
- // throw first exception if readAll was set
- if(connExcep!=null) throw connExcep;
-
- } catch (IOException e) {
- this.config.getLogger().logError(TextPlugin.Util.getString("TextConnection.Error_while_reading_text_file__{0}_1", new Object[] {e.getMessage()}), e); //$NON-NLS-1$
- throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.Error_trying_to_establish_connection_5")); //$NON-NLS-1$
- } finally {
- if (br != null) {
- try {br.close();} catch (Exception ee) {}
- }
- }
- this.config.getLogger().logDetail("Successfully read metadata information from the descriptor file " + descriptorFile); //$NON-NLS-1$
- }
-
- /**
- * Read the property string and populate the properties with info needed to access data files.
- */
- private void getMetadata(String propStr) throws ConnectorException {
- try {
- int index = 0;
-
- // Property String --> <Fully_Qualified_Group>.location=<location of actual file>
- int eqIndex = propStr.indexOf("=", index); //$NON-NLS-1$
- String propString = propStr.substring(index, eqIndex);
-
- if (!propString.equals(" ")) { //$NON-NLS-1$
- propString = propString.trim();
- }
-
- int lastIndex = propString.lastIndexOf('.');
-
- // group name
- String groupName = propString.substring(0, lastIndex).toUpperCase();
- // property name
- String propertyName = propString.substring(lastIndex + 1).toUpperCase();
-
- // Properties read from descriptor, which are properties for a given group
- Properties props = metadataProps.get(groupName);
- if (props == null) {
- props = new Properties();
- }
-
- // Adjust index past '='
- index = eqIndex + 1;
-
- // Read property value
- String propertyValue = propStr.substring(index).trim();
-
- if (propertyName.equals(TextPropertyNames.LOCATION)) {
- srcFiles++;
- // Verify required items
- if (propertyValue == null || propertyValue.trim().length() == 0) {
- srcFileErrs++;
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Text_file_name_is_not_specified_for_the_group___{0}_2", new Object[] {groupName})); //$NON-NLS-1$
- }
- try {
- checkFile(propertyValue, props, groupName);
- } catch (ConnectorException e) {
- if (this.parentDirectory == null) {
- throw e;
- }
- srcFileErrs--;
- try {
- checkFile(parentDirectory + "/" + propertyValue, props, groupName); //$NON-NLS-1$
- } catch (ConnectorException e1) {
- throw e;
- }
- }
- } else if (propertyName.equals(TextPropertyNames.HEADER_LINES)) {
- try {
- Integer.parseInt(propertyValue);
- } catch (NumberFormatException e) {
- throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3", new Object[] {e.getMessage()})); //$NON-NLS-1$
- }
- } else if (propertyName.equals(TextPropertyNames.HEADER_ROW)) {
- try {
- Integer.parseInt(propertyValue);
- } catch (NumberFormatException e) {
- throw new ConnectorException(e, TextPlugin.Util.getString("TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3", new Object[] {e.getMessage()})); //$NON-NLS-1$
- }
- } else if (!(propertyName.equals(TextPropertyNames.COLUMNS) || propertyName.equals(TextPropertyNames.TYPES) || propertyName.equals(TextPropertyNames.TYPES) || propertyName.equals(TextPropertyNames.TYPES) || propertyName.equals(TextPropertyNames.TYPES) || propertyName.equals(TextPropertyNames.DELIMITER) || propertyName.equals(TextPropertyNames.QUALIFIER))) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.The_property_{0}_for_the_group_{1}_is_invalid._4", new Object[] {propertyName, groupName})); //$NON-NLS-1$
- }
-
- // Check for tab as a delimiter and use correct string
- if (propertyValue != null && propertyValue.equals("\\t")) { //$NON-NLS-1$
- propertyValue = "\t"; //$NON-NLS-1$
- }
-
- if (propertyValue != null && !propertyValue.equals("")) { //$NON-NLS-1$
- // Add property
- props.put(propertyName, propertyValue);
- metadataProps.put(groupName, props);
- }
- } catch (Exception e) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Error_parsing_property_string_{0}__{1}_6", new Object[] {propStr, e.getMessage()})); //$NON-NLS-1$
- }
-
- }
-
- /**
- * Check if the file or url of the given name exists and populate properties.
- */
- private void checkFile(String fileName, Properties props, String groupName)
- throws ConnectorException {
-
- // Construct file and make sure it exists and is readable
- File datafile = new File(fileName);
-
- File[] files= TextUtil.getFiles(fileName);
-
-
- // determine if the wild card is used to indicate all files
- // of the specified extension
- if (files == null && TextUtil.usesWildCard(fileName)) {
- srcFileErrs++;
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
- }
- if (files != null && files.length > 0) {
- props.setProperty(TextPropertyNames.FILE_LOCATION, fileName);
- } else if (datafile.isFile()){
- if (!datafile.exists()) {
- srcFileErrs++;
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
- }
- else if (!datafile.canRead()) {
- srcFileErrs++;
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Data_file_{0}_found_but_does_not_have_Read_permissions_8", new Object[] {fileName})); //$NON-NLS-1$
- }
- props.setProperty(TextPropertyNames.FILE_LOCATION, fileName);
- } else {
- try {
- URL url = new URL(fileName);
- // create the connection to the URL
- URLConnection conn = url.openConnection();
- // establish the connection to the URL
- conn.connect();
- props.setProperty(TextPropertyNames.URL_LOCATION, fileName);
- } catch (IOException e) {
- srcFileErrs++;
- throw new ConnectorException(e,TextPlugin.Util.getString("TextConnection.fileDoesNotExistForGroup", new Object[] {fileName, groupName})); //$NON-NLS-1$
- }
- }
-
- }
-
- /**
- * This method gets the reader object for the descriptorfile present either on the local file system or the web.
- * @param fileLocation String standing for the fileLocation either in file system or web.
- * @return BufferReader for the file
- */
- private BufferedReader getReader(String fileLocation) throws ConnectorException {
- BufferedReader br = null;
- // Construct file and make sure it exists and is readable
- File descfile = new File(fileLocation);
- if (descfile.isFile()) {
- if (!descfile.exists()) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_9", new Object[] {fileLocation})); //$NON-NLS-1$
- } else if (!descfile.canRead()) {
- throw new ConnectorException(TextPlugin.Util.getString("TextConnection.Descriptor_file_{0}_found_but_does_not_have_Read_permissions_10", new Object[] {fileLocation})); //$NON-NLS-1$
- }
- this.parentDirectory = descfile.getParent();
- try {
- br = new BufferedReader(new FileReader(descfile));
-
- } catch (FileNotFoundException fe) {
- throw new ConnectorException(fe,TextPlugin.Util.getString("TextConnection.Couldn__t_find_the_file_of_name_{0}_11", new Object[] {descfile})); //$NON-NLS-1$
- }
- } else {
- try {
- URL url = new URL(fileLocation);
- // create the connection to the URL
- URLConnection conn = url.openConnection();
- // establish the connection to the URL
- conn.connect();
- // get the stream from the connection
- InputStreamReader inSR = new InputStreamReader(conn.getInputStream());
- // place the stream into a buffered reader
- br = new BufferedReader(inSR);
- } catch (IOException e) {
- throw new ConnectorException(e,TextPlugin.Util.getString("TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_12", new Object[] {fileLocation})); //$NON-NLS-1$
- }
- }
- return br;
- }
-
-
-
-
-}
Modified: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextManagedConnectionFactory.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -19,58 +19,36 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
-package com.metamatrix.connector.text;
+package org.teiid.resource.cci.text;
-import org.teiid.connector.basic.BasicManagedConnectionFactory;
+import javax.resource.ResourceException;
+import org.teiid.resource.spi.BasicManagedConnectionFactory;
+
public class TextManagedConnectionFactory extends BasicManagedConnectionFactory{
private static final long serialVersionUID = -1495488034205703625L;
-
private String descriptorFile;
- private boolean partialStartupAllowed = true;
- private boolean enforceColumnCount = false;
- private String dateResultFormatsDelimiter;
- private String dateResultFormats;
-
+ private boolean partialStartupAllowed;
+
+ @Override
+ public Object createConnectionFactory() throws ResourceException {
+ return new TextConnectionFactory(this);
+ }
+
public String getDescriptorFile() {
return descriptorFile;
}
public void setDescriptorFile(String descriptorFile) {
this.descriptorFile = descriptorFile;
- }
-
+ }
+
public boolean isPartialStartupAllowed() {
return partialStartupAllowed;
}
public void setPartialStartupAllowed(Boolean partialStartupAllowed) {
this.partialStartupAllowed = partialStartupAllowed.booleanValue();
- }
-
- public boolean isEnforceColumnCount() {
- return enforceColumnCount;
- }
-
- public void setEnforceColumnCount(Boolean enforceColumnCount) {
- this.enforceColumnCount = enforceColumnCount.booleanValue();
- }
-
- public String getDateResultFormatsDelimiter() {
- return dateResultFormatsDelimiter;
- }
-
- public void setDateResultFormatsDelimiter(String dateResultFormatsDelimiter) {
- this.dateResultFormatsDelimiter = dateResultFormatsDelimiter;
- }
-
- public String getDateResultFormats() {
- return dateResultFormats;
- }
-
- public void setDateResultFormats(String dateResultFormats) {
- this.dateResultFormats = dateResultFormats;
- }
-
+ }
}
Modified: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPlugin.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextPlugin.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -20,24 +20,14 @@
* 02110-1301 USA.
*/
-package com.metamatrix.connector.text;
+package org.teiid.resource.cci.text;
import java.util.ResourceBundle;
import com.metamatrix.core.BundleUtil;
-/**
- * TextPlugin
- * <p>Used here in <code>text</code> to have access to the new
- * logging framework.</p>
- */
-public class TextPlugin { // extends Plugin {
+public class TextPlugin {
- /**
- * The plug-in identifier of this plugin
- * (value <code>"com.metamatrix.dqp"</code>).
- */
- public static final String PLUGIN_ID = "com.metamatrix.connector.text" ; //$NON-NLS-1$
+ public static final String PLUGIN_ID = "org.teiid.resource.cci.text" ; //$NON-NLS-1$
- public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,
- PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
}
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPropertyNames.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextPropertyNames.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextPropertyNames.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,68 +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 com.metamatrix.connector.text;
-
-/**
- * Property names used in the text connector.
- */
-public class TextPropertyNames {
- public static final String DESCRIPTOR_FILE = "DescriptorFile"; //$NON-NLS-1$
- public static final String PARTIAL_STARTUP_ALLOWED = "PartialStartupAllowed"; //$NON-NLS-1$
- public static final String LOCATION = "LOCATION"; //$NON-NLS-1$
- public static final String FILE_LOCATION = "FILE"; //$NON-NLS-1$
- public static final String URL_LOCATION = "URL"; //$NON-NLS-1$
- public static final String DELIMITER = "DELIMITER"; //$NON-NLS-1$
- public static final String QUALIFIER = "QUALIFIER"; //$NON-NLS-1$
- public static final String HEADER_LINES = "SKIPHEADERLINES"; //$NON-NLS-1$
- public static final String COLUMNS = "COLUMNS"; //$NON-NLS-1$
- public static final String TYPES = "TYPES"; //$NON-NLS-1$
-
- /**
- * If HEADER_LINES is non-zero this property defines which row of HEADER_LINES
- * can be used as the header row. The value is 1-based and must be < HEADER_LINES.
- * @since 5.0.3
- */
- public static final String HEADER_ROW = "HEADERLINE"; //$NON-NLS-1$
- /**
- * This property can be used to specify specific date formats for String
- * type results that need to be converted into java.util.Date objects for
- * joins or comparisons. This property will be a String of formats
- * seperated by the DATE_RESULT_FORMATS_DELIMTER property value. No spaces
- * are allowed between these property values and their delimiters.
- */
- public static final String DATE_RESULT_FORMATS = "DateResultFormats"; //$NON-NLS-1$
-
- /**
- * This is the delimiter for the String property value of the DATE_RESULT_FORMATS
- * property.
- */
- public static final String DATE_RESULT_FORMATS_DELIMITER = "DateResultFormatsDelimiter"; //$NON-NLS-1$
-
-
- /**
- * This property can be used to force the edit that ensures the number of
- * columns in the text file matches the number of columns modeled.
- */
- public static final String COLUMN_CNT_MUST_MATCH_MODEL = "EnforceColumnCount"; //$NON-NLS-1$
-
-}
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextSynchExecution.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextSynchExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextSynchExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,869 +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 com.metamatrix.connector.text;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URLConnection;
-import java.sql.Date;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.language.ColumnReference;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.DerivedColumn;
-import org.teiid.connector.language.NamedTable;
-import org.teiid.connector.language.Select;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.Table;
-
-import com.metamatrix.core.util.StringUtil;
-
-/**
- * The essential part that executes the query. It keeps all the execution
- * states.
- */
-public class TextSynchExecution extends BasicExecution implements ResultSetExecution {
- // Command to be executed
- private Select cmd;
-
- // metadata properties
- private Map metadataProps;
-
- private TextManagedConnectionFactory config;
-
- // metadata properties for a given group
- private Properties groupProps = null;
-
- // Translator for String to Data translation
- private StringToDateTranslator stringToDateTranslator;
-
- /**
- * Current index to readerQueue
- */
- private int readerQueueIndex = 0;
- /**
- * Queue of readers that have yet to be read from.
- */
- private ArrayList readerQueue = new ArrayList();
- // current Reader object
- private BufferedReader currentreader = null;
-
- // Line num in the text file
- private int lineNum = 0;
-
- // List of column widths specified
- private List colWidths = new ArrayList();
-
- // the number of modeled columsn should match the
- // number of colums parsed from the file
- private int numModeledColumns = 0;
-
- // If a header row is to be used, this is where the
- // column names will be saved
- private List headerRow = null;
-
- //whether this execution is canceled
- private volatile boolean canceled;
-
- private int rowsProduced = 0;
-
- private int[] cols;
-
- /**
- * Constructor.
- * @param cmd
- * @param txtConn
- */
- public TextSynchExecution(TextManagedConnectionFactory config, Select query, Map <String, Properties> metaProps) {
- this.config = config;
- this.metadataProps = metaProps;
- this.cmd = query;
- }
-
- @Override
- public void execute() throws ConnectorException {
- //translate request
- Object translatedRequest = translateRequest(cmd);
-
- // submit request
- Object response = submitRequest(translatedRequest);
-
- // translate results
- translateResults(response, cmd);
-
- cols = getSelectCols(cmd.getDerivedColumns());
- }
-
- @Override
- public List next() throws ConnectorException, DataNotAvailableException {
- if (canceled) {
- throw new ConnectorException("Execution cancelled"); //$NON-NLS-1$
- }
- Select query = cmd;
-
- Class[] types = query.getColumnTypes();
-
- String location = groupProps.getProperty(TextPropertyNames.LOCATION);
- String delimiter = groupProps.getProperty(TextPropertyNames.DELIMITER);
- String qualifier = groupProps.getProperty(TextPropertyNames.QUALIFIER);
- String topLines = groupProps.getProperty(TextPropertyNames.HEADER_LINES);
-
- // set hasQualifier flag
- boolean hasQualifier = false;
- if (qualifier != null && qualifier.length() > 0) {
- hasQualifier = true;
- }
-
- int numTop = 0;
- if(topLines != null) {
- numTop = Integer.parseInt(topLines);
- }
-
- try {
- while (true) {
- BufferedReader br = getCurrentReader();
- if (br == null) {
- return null;
- }
-
- String line = br.readLine();
-
- // Hit the end of file or the file is empty then
- // try next reader
- if(line == null) {
- advanceToNextReader();
- lineNum = 0;
- continue;
- }
-
- // check if we have a qualifier defined
- // if yes check that all qualifiers have been terminated
- // if not then append the next line (if available)
- if (hasQualifier) {
- while (StringUtil.occurrences(line, qualifier)%2!=0) {
- String nextLine = br.readLine();
- if (nextLine != null) {
- line = line + StringUtil.LINE_SEPARATOR + nextLine;
- } else {
- Object[] params = new Object[] { line };
-
- String msg = TextPlugin.Util.getString("TextSynchExecution.Text_has_no_determined_ending_qualifier", params); //$NON-NLS-1$
- this.config.getLogger().logError(msg);
-
- throw new ConnectorException( msg);
- }
- }
- }
- lineNum++;
-
- //Skip blank lines and any remaining header lines
- if ( line.length() == 0 || numTop >= lineNum ) continue;
-
- // Get record from file for one row
- List record = getRecord(line, delimiter, qualifier, colWidths);
-
- ++rowsProduced;
- // Save selected columns into query results
-
- if (this.config.isEnforceColumnCount() && record.size() != numModeledColumns) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Input_column_cnt_incorrect", new Object[] { new Integer(numModeledColumns), new Integer(record.size()) }));
- }
-
- return getRow(record, cols, types);
- }
- } catch(ConnectorException ce) {
- throw ce;
- } catch(Throwable e) {
- throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Error_reading_text_file", new Object[] { location, e.getMessage() })); //$NON-NLS-1$
- }
- }
-
- /**
- * Gets the current reader, looking at the next
- * one in the list if the current one is null.
- *
- * If HEADER_LINES is greater than 0, an attempt is made to
- * read the column headers from the file. If HEADER_ROW is
- * less than 1, row HEADER_LINES is used as the row that may
- * contain column names. If HEADER_ROW is greater than 1,
- * row HEADER_ROW is used as the row that may contain column
- * names.
- *
- * @throws ConnectorException
- *
- * @since vhalbert 5.0.1
- */
- private BufferedReader getCurrentReader() throws ConnectorException {
- if (currentreader == null && readerQueueIndex < readerQueue.size()) {
- // reader queue index is advanced only by the nextReader()
- // method. Don't do it here.
- currentreader = (BufferedReader)readerQueue.get(readerQueueIndex);
-
- /* Retrieve connector properties so that we can find a
- * header row if necessary.
- */
- String line = null;
- String location = groupProps.getProperty(TextPropertyNames.LOCATION);
- String delimiter = groupProps.getProperty(TextPropertyNames.DELIMITER);
- String qualifier = groupProps.getProperty(TextPropertyNames.QUALIFIER);
- String topLines = groupProps.getProperty(TextPropertyNames.HEADER_LINES);
- String headerLine = groupProps.getProperty(TextPropertyNames.HEADER_ROW);
-
- int numTop = 0;
- int headerRowNum = 0;
- if (topLines != null && topLines.length() > 0)
- numTop = Integer.parseInt(topLines);
- if (headerLine != null && headerLine.length() > 0)
- headerRowNum = Integer.parseInt(headerLine);
-
- if (numTop > 0) {
- /* Check to see if the value for HEADER_ROW is greater than
- * the number of lines to skip. If it is, it is invalid and
- * we will use HEADER_LINES instead.
- */
- if ( headerRowNum > numTop ) {
- Object[] params = new Object[] { TextPropertyNames.HEADER_ROW, new Integer(headerRowNum), new Integer(numTop) };
- String msg = TextPlugin.Util.getString("TextSynchExecution.Property_contains_an_invalid_value_Using_value", params); //$NON-NLS-1$
- // TODO: We should include the group name in the log message.
- this.config.getLogger().logWarning(msg);
-
- headerRowNum = numTop;
- }
- try {
- // set hasQualifier flag
- boolean hasQualifier = false;
- if (qualifier != null && qualifier.length() > 0)
- hasQualifier = true;
-
- // Walk through rows looking for header row
- while (currentreader != null) {
- line = currentreader.readLine();
- // Hit the end of file or the file is empty then
- // try next reader
- if (line == null) {
- advanceToNextReader();
- lineNum = 0;
- return getCurrentReader();
- }
-
- // check if we have a qualifier defined
- // if yes check that all qualifiers have been terminated
- // if not then append the next line (if available)
- if (hasQualifier) {
- while (StringUtil.occurrences(line, qualifier) % 2 != 0) {
- String nextLine = currentreader.readLine();
- if (nextLine != null)
- line = line + StringUtil.LINE_SEPARATOR + nextLine;
- else {
- Object[] params = new Object[] { line };
- String msg = TextPlugin.Util.getString("TextSynchExecution.Text_has_no_determined_ending_qualifier", params); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- }
- }
- lineNum++;
-
- // Skip blank lines
- if (line.length() == 0) continue;
-
- // Attempt to retrieve column names from header row
- // or last row of header lines.
- if ((headerRowNum > 0 && headerRowNum == lineNum)
- || (numTop == lineNum)) {
- // This is the header row
- headerRow = getRecord(line, delimiter, qualifier, colWidths);
- break;
- } else if (numTop >= lineNum) continue;
- }
- } catch (Throwable e) {
- throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Error_reading_text_file", new Object[] { location, e.getMessage() })); //$NON-NLS-1$
- }
- }
-
- }
- return currentreader;
- }
-
- /**
- * Indicate that we are done with the current reader and we should
- * advance to the next reader.
- *
- * @since vhalbert 5.0.1
- */
- private void advanceToNextReader(){
- currentreader = null;
- readerQueueIndex++;
- }
-
- public void close() {
- if (readerQueue.size() > 0) {
- for (Iterator it=readerQueue.iterator(); it.hasNext();) {
- BufferedReader br = (BufferedReader) it.next();
- try {
- br.close();
- } catch (IOException err) {
- }
-
- }
- }
- readerQueue.clear();
- this.config.getLogger().logInfo("TextSynchExecution is successfully closed."); //$NON-NLS-1$
- }
-
- public void cancel() {
- canceled = true;
- }
-
- /**
- * Translate command.
- * @param request ICommand as request
- * @return Object translated request
- * @throws ConnectorException if error occurs
- */
- protected Object translateRequest(Command request) throws ConnectorException {
- if (request == null) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Request_is_null")); //$NON-NLS-1$
- }
-
- if (cmd == null) {
- Object[] params = new Object[] { cmd };
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Error_translating_request", params)); //$NON-NLS-1$
- }
-
- // Get the columns widths for all the elements in the group.
- Select query = (Select) request;
-
- /* Defect 13371
- * Can't use the select columns to get the columns widths because we may not be selecting all the columns. Instead,
- * we need to get all the child elements of the group being queried, and get the columns widths of each one of them.
- */
- NamedTable group = (NamedTable)query.getFrom().get(0);
- try {
- /* We need to create the reader queue before we
- * attempt to create the request as we may need
- * column names from the header row.
- */
- String groupName = group.getMetadataObject().getFullName();
- Map metadataMap = metadataProps;
- groupProps = (Properties) metadataMap.get(groupName.toUpperCase());
-
- if(groupProps == null) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Error_obtain_properties_for_group", groupName)); //$NON-NLS-1$
- }
- try {
- createReaders(groupProps,groupName);
- } catch (IOException ex) {
- Object[] params = new Object[] { groupName, ex.getMessage() };
- throw new ConnectorException(ex, TextPlugin.Util.getString("TextSynchExecution.Unable_get_Reader", params)); //$NON-NLS-1$
- }
- List<Column> elements = group.getMetadataObject().getColumns();
- numModeledColumns = elements.size();
- int[] colWidthArray = new int[elements.size()];
- for (int i = 0; i < colWidthArray.length; i++) {
- Column element = elements.get(i);
- colWidthArray[getColumn(element)] = element.getLength();
- }
- for (int i = 0; i < colWidthArray.length; i++) {
- colWidths.add(new Integer(colWidthArray[i]));
- }
- } catch (ConnectorException e) {
- Object[] params = new Object[] { query, e.getMessage() };
- throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Cannot_be_translated_by_the_TextTranslator.", params)); //$NON-NLS-1$
- }
-
- return request;
- }
-
- /**
- * Submit request and get back the metadata necessary for accessing the text file.
- * @param req
- * @return Object
- */
- protected Object submitRequest(Object req) {
- return metadataProps;
- }
-
- /**
- * Translate results.
- * @param response
- * @param cmd
- * @throws ConnectorException
- * @throws ConnectorException
- */
- protected void translateResults(Object response, Command cmd) throws ConnectorException, ConnectorException {
- if(!(response instanceof Map)) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Not_of_type_Map")); //$NON-NLS-1$
- }
-
- // get the group metadataID for group present on the command
- List groups = ((Select) cmd).getFrom();
- NamedTable symbol = (NamedTable) groups.get(0);
- Table group = symbol.getMetadataObject();
-
- String groupName = group.getFullName();
-
- Map metadataMap = (Map) response;
-
- if(this.config.getDateResultFormats() != null) {
- stringToDateTranslator = new StringToDateTranslator(this.config);
- }
-
- groupProps = (Properties) metadataMap.get(groupName.toUpperCase());
- if(groupProps == null) {
- Object[] params = new Object[] { groupName };
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Error_obtain_properties_for_group", params)); //$NON-NLS-1$
- }
-
- performQuery(groupProps,groupName);
- }
-
- /**
- * Helper method for #translateResults(ICommand).
- * @param props Metadata properties for a specific group
- * @throws ConnectorException occurs if IOException happens
- */
- private void performQuery(Properties props,String groupName) throws ConnectorException {
- try {
- createReaders(props,groupName);
- } catch (IOException ex) {
- Object[] params = new Object[] { groupName, ex.getMessage() };
- throw new ConnectorException(ex, TextPlugin.Util.getString("TextSynchExecution.Unable_get_Reader", params)); //$NON-NLS-1$
- }
- }
-
- /**
- * This method gets the reader object for the textfile present either on
- * the local file system or the web.
- * @param props Group's metadata properites string
- * @return BufferReader Object
- */
- private void createReaders(Properties props,String groupName) throws IOException, ConnectorException {
- if(readerQueue != null && readerQueue.size() > 0) {
- return ;
- }
- String fileName = props.getProperty(TextPropertyNames.FILE_LOCATION);
-
-
- if(fileName != null) {
- File datafile = new File(fileName);
- File[] files= TextUtil.getFiles(fileName);
-
-
- // determine if the wild card is used to indicate all files
- // of the specified extension
- if (files != null && files.length > 0) {
- for (int i = 0; i<files.length; i++) {
- File f = files[i];
- addReader(f.getName(), f);
- }
-
- } else {
-
- addReader(fileName, datafile);
-// new BufferedReader(new FileReader(datafile));
-// logger.logInfo("Reading file: " + fileName); //$NON-NLS-1$
-
- }
- } else {
- String urlName = props.getProperty(TextPropertyNames.URL_LOCATION);
- if(urlName==null) {
- Object[] params = new Object[] { groupName };
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Unable_get_Reader_for_group", params)); //$NON-NLS-1$
- }
-
- // create the URL object
- URL url = new URL(urlName);
- // create the connection to the URL
- URLConnection conn = url.openConnection();
- // establish the connection to the URL
- conn.connect();
- // get the stream from the commection
- InputStreamReader inSR = new InputStreamReader(conn.getInputStream());
- // place the stream into a buffered reader
- addReader(fileName, inSR);
-// BufferedReader reader = new BufferedReader(inSR);
-// logger.logInfo("Reading URL: " + urlName); //$NON-NLS-1$
-
- }
-
- }
-
- private void addReader(String fileName, File datafile) throws IOException {
-
- FileInputStream fis = new FileInputStream(datafile);
- InputStreamReader inSR = new InputStreamReader(fis);
-
- BufferedReader r = new BufferedReader(inSR);
- //new FileReader(datafile));
- this.config.getLogger().logInfo("Reading file: " + fileName); //$NON-NLS-1$
- readerQueue.add(r);
- }
-
- private void addReader(String fileName, InputStreamReader inSr) {
- BufferedReader r = new BufferedReader(inSr);
- this.config.getLogger().logInfo("Reading URL: " + fileName); //$NON-NLS-1$
- readerQueue.add(r);
- }
-
- /**
- * Convert selected column names to columns.
- * @param vars List of DataNodeIDs
- * @return Column numbers corresponding to vars
- */
- private int[] getSelectCols(List vars) throws ConnectorException{
- int[] cols = new int[vars.size()];
- for(int i=0; i<vars.size(); i++) {
- cols[i] = getColumn((DerivedColumn)vars.get(i));
- }
- return cols;
- }
-
- /**
- * Get column number in Source by ISelectSymbol
- *
- * An Element is created from the symbol and this method
- * invokes getColumn(Element).
- *
- * @param symbol Identifier to look up the column
- * @return int The column corresponding to that id
- * @throws ConnectorException
- */
- private int getColumn(DerivedColumn symbol) throws ConnectorException{
- return this.getColumn(getElementFromSymbol(symbol));
- }
-
- /**
- * Helper method for getting runtime {@link org.teiid.connector.metadata.runtime.Element} from a
- * {@link org.teiid.connector.language.DerivedColumn}.
- * @param symbol Input ISelectSymbol
- * @return Element returned metadata runtime Element
- */
- private Column getElementFromSymbol(DerivedColumn symbol) {
- ColumnReference expr = (ColumnReference) symbol.getExpression();
- return expr.getMetadataObject();
- }
-
- /**
- * Get column number in Source by Element
- *
- * An attempt is made to parse an int from the Name In Source
- * for the Element. If this fails it is assumed that
- * Name In Source is blank or contains an identifier
- * name. If blank, the Element.getMetadataID().getName()
- * is used otherwise, Name In Source is used.
- * @param elem
- * @return int
- * @throws ConnectorException
- */
- private int getColumn(Column elem) throws ConnectorException{
- String colStr = elem.getNameInSource();
- try {
- // If Name In Source is numeric, it is a column number
- return Integer.parseInt(colStr);
- } catch(NumberFormatException e) {
- // Name In Source was not numeric, so look for a column with a heading matching Name In Source
- if ( colStr == null ) {
- colStr = elem.getName();
- }
- if ( headerRow == null ) getCurrentReader();
- if ( headerRow != null ) {
- for ( int i = 0; i < headerRow.size(); i++ ) {
- if ( colStr.compareToIgnoreCase((String)headerRow.get(i) )==0) return i;
- }
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Column_not_found_in_header_row", new Object[] {colStr, elem.getFullName() } )); //$NON-NLS-1$
- }
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Invalid_column_number", new Object[] {colStr, elem.getFullName() } ) ); //$NON-NLS-1$
- }
- }
-
- /**
- * Open the file, read it, and parse it into memory.
- * @param line the line is being read
- * @param delimiter
- * @param qualifier
- * @param colWidths List of column widths
- * @return List of column values inside the line
- * @throws Exception
- */
- private List getRecord(String line, String delimiter, String qualifier, List colWidths) throws Exception {
- if(delimiter != null) {
- return parseDelimitedLine(line, delimiter, qualifier);
- }
- return parseFixedWidthLine(line, colWidths);
- }
-
- /**
- * @param line line's length will not be 0
- * @return List of parsed columns
- */
- private List parseDelimitedLine(String line, String delimiter, String qualifier) throws Exception {
- // the case with no qualifier
- if (qualifier == null || qualifier.trim().length()==0) {
- // parse on delimiters
- List strs = new ArrayList();
-
- int index = -1;
- while(true) {
- int newIndex = line.indexOf(delimiter, index);
- if(newIndex >= 0) {
- if(index >= 0) {
- // middle column
- addUnqualifiedColumnToList(strs, line.substring(index, newIndex));
- } else {
- // first column
- addUnqualifiedColumnToList(strs, line.substring(0, newIndex));
- }
- index = newIndex+1;
- } else if(index >= 0) {
- // end of line
- addUnqualifiedColumnToList(strs, line.substring(index));
- break;
- } else {
- // only one column
- addUnqualifiedColumnToList(strs, line);
- break;
- }
- }
- return strs;
-
- }
- // the case with qualifier
-
- char delimChar = delimiter.charAt(0);
- char qualChar = qualifier.charAt(0);
- char spaceChar = " ".charAt(0); //$NON-NLS-1$
-
- List columns = new ArrayList();
- int charIndex = 0;
- int totalChars = line.length();
-
- while(charIndex < totalChars) {
- // Read character
- char c = line.charAt(charIndex);
-
- if(c == delimChar) {
- addUnqualifiedColumnToList(columns, null);
- charIndex++; // past delimiter
-
- } else if(c == qualChar) {
- int endQualIndex = charIndex;
- while(true) {
- endQualIndex = line.indexOf(qualChar, endQualIndex+1);
- if(endQualIndex < 0) {
- Object[] params = new Object[] { ""+(columns.size()+1), line }; //$NON-NLS-1$
- // changed to Connectorexception so that the exception is thrown to the user
- // and becomes known a problem, rather than just
- // keeping it internally to the server
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Text_has_no_ending_qualifier", params)); //$NON-NLS-1$
- }
- // skipping escaped qualifier charachters
- if(line.length() > endQualIndex+1) {
- if(line.charAt(endQualIndex+1) == qualChar) {
- endQualIndex = endQualIndex+1;
- continue;
- }
- }
- // quoted column
- columns.add(line.substring(charIndex+1, endQualIndex));
- charIndex = endQualIndex+1; // past quoted column
-
- // Check for extra characters between quote and delimiter
- if(charIndex < totalChars && line.charAt(charIndex) != delimChar) {
- Object[] params = new Object[] { ""+(columns.size()+1), line }; //$NON-NLS-1$
- String msg = TextPlugin.Util.getString("TextSynchExecution.Text_file_must_have_delimiter", params);//$NON-NLS-1$
- // changed to Connectorexception so that the exception is thrown to the user
- // and becomes known a problem, rather than just
- // keeping it internally to the server
- throw new ConnectorException(msg);
-
- }
-
- charIndex++; // past delimiter
- break;
- }
-
- // skip any space between the delimiter
- // and the qualifier
- } else if(c == spaceChar) {
- charIndex++;
-
- } else {
- int endColIndex = line.indexOf(delimChar, charIndex);
- if(endColIndex < 0) {
- // last unquoted column
- addUnqualifiedColumnToList(columns, line.substring(charIndex));
-
- // We know the line is done so we should exit the loop here.
- // If we didn't exit the loop and just advanced the charIndex,
- // we would trip the "line ends in <delim>" case below, which
- // is not valid as we have not ended in a delimiter
- break;
- }
- // middle unquoted column
- addUnqualifiedColumnToList(columns, line.substring(charIndex, endColIndex));
- charIndex = endColIndex+1;
- }
-
- // line ends in <delimiter>
- if(charIndex == totalChars) {
- addUnqualifiedColumnToList(columns, null);
- }
-
- }
-
- return columns;
- }
-
- /**
- * Add column value, if null or length is 0, then add null.
- * @param
- * @param
- */
- private static void addUnqualifiedColumnToList(List list, String col) {
- if(col == null || col.length() == 0) {
- list.add(null);
- } else {
- list.add(col);
- }
- }
-
- /**
- *
- * @param line
- * @param colWidths
- * @return List
- * @throws ConnectorException
- */
- private List parseFixedWidthLine(String line, List colWidths) throws ConnectorException {
- int length = line.length();
- List fields = new ArrayList(colWidths.size());
- Iterator iter = colWidths.iterator();
- int current = 0;
- while(iter.hasNext()) {
- try {
- int width = ((Integer)iter.next()).intValue();
- if(width <= 0) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Column_length_must_be_positive")); //$NON-NLS-1$
- }
-
- int end = current + width;
- if(end > length) {
- end = length;
- }
-
- String colValue = line.substring(current, end).trim();
- if(colValue.length() == 0) {
- fields.add(null);
- } else {
- fields.add(colValue);
- }
- current += width;
- } catch(Exception e) {
- // ignore and fill column with null
- fields.add(null);
- }
- }
-
- return fields;
- }
-
- /**
- * Save selected columns from record into results.
- * @param batch batch to contain the record
- * @param record the record of one row
- * @param columns Columns to save in results
- * @param types Class of all columns' types
- */
- private List getRow(List record, int[] columns, Class[] types) throws ConnectorException {
- List newRecord = new ArrayList(columns.length);
- for(int i=0; i<columns.length; i++) {
- int column = columns[i];
- String value = (String) record.get(column);
- Class type = types[i];
- newRecord.add(convertString(value, type));
- }
- return newRecord;
- }
-
- /**
- * Convert String to Object of correct type.
- * @param value Input Value
- * @param type Input type
- * @return Object translated Object from String
- */
- private Object convertString(String value, Class type) throws ConnectorException {
- if (value==null) {
- return null;
- }
-
- if (type == TypeFacility.RUNTIME_TYPES.STRING) {
- return value;
- }
-
- if (java.util.Date.class.isAssignableFrom(type)) {
- //check defaults first
- try {
- return Timestamp.valueOf(value);
- } catch (IllegalArgumentException e) {
-
- }
- try {
- return Date.valueOf(value);
- } catch (IllegalArgumentException e) {
-
- }
- try {
- return Time.valueOf(value);
- } catch (IllegalArgumentException e) {
-
- }
- //check for overrides
- if (stringToDateTranslator!=null && stringToDateTranslator.hasFormatters()) {
- try {
- return new Timestamp(stringToDateTranslator.translateStringToDate(value).getTime());
- }catch(ParseException ex) {
- throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Unable_translate_String_to_Date", new Object[] { ex.getMessage() })); //$NON-NLS-1$
- }
- }
- }
- return value;
- }
-
-}
-
Deleted: trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextUtil.java
===================================================================
--- trunk/connectors/connector-text/src/main/java/com/metamatrix/connector/text/TextUtil.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/connector-text/src/main/java/org/teiid/resource/cci/text/TextUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,65 +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 com.metamatrix.connector.text;
-
-import java.io.File;
-
-import com.metamatrix.core.util.FileUtils;
-
-
-/**
- * @since 4.3
- */
-public class TextUtil {
-
- public static boolean usesWildCard(String location) {
- if (location == null) return false;
-
- File datafile = new File(location);
- String fname = datafile.getName();
-
- // determine if the wild card is used to indicate all files
- // of the specified extension
- if (fname.indexOf("*") >= 0) { //$NON-NLS-1$
- return true;
- }
- return false;
- }
- public static File[] getFiles(String location) {
- if (location == null) return null;
-
- File datafile = new File(location);
- String fname = datafile.getName();
-
- // determine if the wild card is used to indicate all files
- // of the specified extension
- if (fname.indexOf("*") >= 0) { //$NON-NLS-1$
-
- File parentDir = datafile.getParentFile();
- String ext = FileUtils.getExtension(fname);
- return FileUtils.findAllFilesInDirectoryHavingExtension(parentDir.getAbsolutePath(), "." + ext); //$NON-NLS-1$
- }
- return null;
-
- }
-}
Modified: trunk/connectors/connector-text/src/main/rar/META-INF/ra.xml
===================================================================
--- trunk/connectors/connector-text/src/main/rar/META-INF/ra.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/main/rar/META-INF/ra.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,57 +34,13 @@
<license-required>true</license-required>
</license>
<resourceadapter>
- <resourceadapter-class>org.teiid.connector.basic.BasicResourceAdapter</resourceadapter-class>
+ <resourceadapter-class>org.teiid.resource.spi.BasicResourceAdapter</resourceadapter-class>
<outbound-resourceadapter>
<connection-definition>
- <managedconnectionfactory-class>com.metamatrix.connector.text.TextManagedConnectionFactory</managedconnectionfactory-class>
+ <managedconnectionfactory-class>org.teiid.resource.cci.text.TextManagedConnectionFactory</managedconnectionfactory-class>
<config-property>
- <description>{$display:"Connector Class",$advanced:"true"}</description>
- <config-property-name>ConnectorClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.text.TextConnector</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Connector Capabilities",$description:"The class to use to provide the Connector Capabilities",$advanced:"true"}</description>
- <config-property-name>CapabilitiesClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>com.metamatrix.connector.text.TextCapabilities</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is Immutable",$description:"Is Immutable, True if the source never changes.",$advanced:"true"}</description>
- <config-property-name>Immutable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is XA Capable",$description:"True, if this connector supports XA Transactions",$advanced:"true"}</description>
- <config-property-name>XaCapable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Exception on Exceeding Max Rows",$description:"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",$advanced:"true"}</description>
- <config-property-name>ExceptionOnMaxRows</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Maximum Result Rows",$description:"Maximum Result Rows allowed",$advanced:"true"}</description>
- <config-property-name>MaxResultRows</config-property-name>
- <config-property-type>java.lang.Integer</config-property-type>
- <config-property-value>-1</config-property-value>
- </config-property>
-
- <!-- Text Connector Specific properties -->
-
- <config-property>
<description>{$display:"Text File Descriptor",$required:"true"}</description>
<config-property-name>DescriptorFile</config-property-name>
<config-property-type>java.lang.String</config-property-type>
@@ -97,31 +53,11 @@
<config-property-value>true</config-property-value>
</config-property>
- <config-property>
- <description>{$display:"Enforce Column Count",$description:"This forces the number of columns in text file to match what was modeled"}</description>
- <config-property-name>EnforceColumnCount</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Date Result Formats Delimiter",$advanced:"true"}</description>
- <config-property-name>DateResultFormatsDelimiter</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
+ <connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
+ <connectionfactory-impl-class>org.teiid.resource.spi.WrappedConnectionFactory</connectionfactory-impl-class>
+ <connection-interface>javax.resource.cci.Connection</connection-interface>
+ <connection-impl-class>org.teiid.resource.spi.WrappedConnection</connection-impl-class>
- <config-property>
- <description>{$display:"Date Result Formats",$advanced:"true"}</description>
- <config-property-name>DateResultFormats</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
-
-
- <connectionfactory-interface>org.teiid.connector.api.Connector</connectionfactory-interface>
- <connectionfactory-impl-class>org.teiid.connector.basic.WrappedConnector</connectionfactory-impl-class>
- <connection-interface>org.teiid.connector.api.Connection</connection-interface>
- <connection-impl-class>org.teiid.connector.basic.WrappedConnection</connection-impl-class>
-
</connection-definition>
<transaction-support>NoTransaction</transaction-support>
Copied: trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/text/i18n.properties (from rev 2083, trunk/connectors/connector-text/src/main/resources/com/metamatrix/connector/text/i18n.properties)
===================================================================
--- trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/text/i18n.properties (rev 0)
+++ trunk/connectors/connector-text/src/main/resources/org/teiid/resource/cci/text/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,71 @@
+#
+# 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.
+#
+
+StringToDateTranslator.Attempts_to_parse_String__{0}_to_a_java.util.Date_failed_for_the_following_reasons___1=Attempts to parse String: {0} to a java.util.Date failed for the following reasons:
+StringToDateTranslator.There_is_no_format_Strings_found_in_this_formatter_object._n_2=There is no format Strings found in this formatter object.\n
+StringToDateTranslator.Parse_Attempt__{0}_using_format__{1}_failed_for_the_following_reason__{2}_4=Parse Attempt: {0} using format: {1} failed for the following reason: {2}
+StringToDateTranslator.Failed_to_convert_String__{0}_to_a_Date_using_one_of_the_following_format_Strings_that_are_specified_in_the_properties_for_this_Connector__{1}_1=Failed to convert String: {0} to a Date using one of the following format Strings that are specified in the properties for this Connector: {1}
+TextConnection.Descriptor_file_name_is_not_specified._2=Descriptor file name is not specified.
+TextConnection.Error_trying_to_establish_connection_5=Error trying to establish connection
+TextConnection.Error_while_reading_text_file__{0}_1=Error while reading text file: {0}
+TextConnection.Text_file_name_is_not_specified_for_the_group___{0}_2=Text file name is not specified for the group : {0}
+TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3=The value for the property should be an integer. {0}
+TextConnection.The_property_{0}_for_the_group_{1}_is_invalid._4=The property {0} for the group {1} is invalid.
+TextConnection.Error_parsing_property_string_{0}_5=Error parsing property string {0}
+TextConnection.Error_parsing_property_string_{0}__{1}_6=Error parsing property string {0}: {1}
+TextConnection.fileDoesNotExistForGroup=Data file not found at this location: {0}, for group {1}
+TextConnection.Data_file_{0}_found_but_does_not_have_Read_permissions_8=Data file {0} found but does not have Read permissions
+TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_9=Descriptor file does not exist at this location: {0}
+TextConnection.Descriptor_file_{0}_found_but_does_not_have_Read_permissions_10=Descriptor file {0} found but does not have Read permissions
+TextConnection.Couldn__t_find_the_file_of_name_{0}_11=Couldn''t find the file of name {0}
+TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_12=Descriptor file does not exist at this location: {0}
+TextSynchExecution.Request_is_null=The Request is null.
+TextSynchExecution.No_element_in_Select=There are no element in the Select clause.
+TextSynchExecution.Not_of_type_Map=Response submitted for the request is not of type Map as expected.
+TextSynchExecution.Error_reading_text_file=Error while reading text file: {0}: {1}
+TextSynchExecution.Error_translating_request=Error translating request: Command not supported. {0}
+TextSynchExecution.Cannot_be_translated_by_the_TextTranslator.=''{0}'' cannot be translated by the TextTranslator. {1}
+TextSynchExecution.Error_obtain_properties_for_group=Error trying to obtain connector metadata properties for {0}. Group properties are not specified in the descriptor file.
+TextSynchExecution.Unable_get_Reader=Unable to get the Reader for group {0}, exception: {1}
+TextSynchExecution.Unable_get_Reader_for_group=Unable to get the Reader for group {0}. Source file undefined - check log for errors.
+TextSynchExecution.Cant_read_column_number=Cannot read column number from name in source for element. {0}
+TextSynchExecution.Invalid_column_number=Column {0} not found for element {1} and no header row is defined. If a header row cannot be defined, element {1} must define a numeric column number for its name in source property.
+TextSynchExecution.Column_not_found_in_header_row=Column {0} not found for element {1}. Verify column name \"{0}\" is defined in the header row of the text file and that the header row number is correctly defined in the descriptor file.
+TextSynchExecution.Can_read_column_number=Cannot read column number from name in source for element. {0}
+TextSynchExecution.Text_has_no_ending_qualifier=Text file has no ending qualifier in column {0}: [{1}]
+TextSynchExecution.Text_file_must_have_delimiter=Text file must have delimiter after ending qualifier in column {0}: [{1}]
+TextSynchExecution.Column_length_must_be_positive=Error trying to query the text file, column length must be a positive value.
+TextSynchExecution.Got_unknown_type_of_criteria=Got unknown type of criteria: {0}
+TextSynchExecution.Functions_not_supported._14=The criteria: {0} could not be applied to the results. Functions not supported.
+TextSynchExecution.Values_of_different_types=The following criteria cannot be executed because values are of different types: {0}
+TextSynchExecution.Unknown_compare_criteria_type=Unknown compare criteria type: {0}
+TextSynchExecution.Joins_and_Functions_not_supported._18=The criteria: {0} could not be translated by the TextConnectorTranslator. Joins and Functions not supported.
+TextSynchExecution.The_expression_cannot_be_used_as_criteria=The expression: {0} cannot be used as a criteria value in a query against a text file.
+TextSynchExecution.Functions_in_criteria_not_supported._20=The criteria: {0} cannot be translated by the TextConnectorTranslator. Functions in criteria not supported.
+TextSynchExecution.Functions_in_set_criteria_not_supported._21=The criteria: {0} cannot be translated by the TextConnectorTranslator. Functions in set criteria not supported.
+TextSynchExecution.Unable_translate_String_to_Date=Unable to translate String to Date using the format specified. {0}
+TextSynchExecution.Unable_get_Tranform=Unable to get the Tranform from String to {0}
+TextSynchExecution.Unable_to_transform_value=Unable to transform value {0} to Object of type {1}
+TextSynchExecution.Input_column_cnt_incorrect=Expected input file to have {0} columns based on model, but found {1}. This could be caused by misplaced quotes, causing multiple columns to be treated as one.
+TextSynchExecution.Text_has_no_determined_ending_qualifier=Text file has no matching ending qualifier in row {0}
+TextSynchExecution.Property_contains_an_invalid_value_Using_value=Property {0} contains an invalid value of {1}. Using value {2}.
+TextConnector.column_mismatch=Specified types and columns do not match for text table {0}
\ No newline at end of file
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestMultiFileTextSynchExecution.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestMultiFileTextSynchExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestMultiFileTextSynchExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,10 +27,10 @@
import java.util.List;
import java.util.Set;
-import org.teiid.connector.api.ConnectorException;
-
import junit.framework.TestCase;
+import org.teiid.resource.ConnectorException;
+
import com.metamatrix.cdk.api.ConnectorHost;
import com.metamatrix.core.util.UnitTestUtil;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -46,7 +46,7 @@
public void testSubmitRequest() throws Exception {
String sql = "SELECT ID FROM Library"; //$NON-NLS-1$
try {
- Util.getConnectorHostWithFakeMetadata(BAD_COUNT_FILE).executeCommand(sql);
+ Util.getConnectorHostWithFakeMetadata().executeCommand(sql, Util.createConnectionFactory(BAD_COUNT_FILE));
fail("Should have failed due to extra column defined in .csv file");//$NON-NLS-1$
} catch (ConnectorException e) {
assertEquals("Expected input file to have 3 columns based on model, but found 4. This could be caused by misplaced quotes, causing multiple columns to be treated as one.", e.getMessage()); //$NON-NLS-1$
@@ -56,7 +56,7 @@
public void testNextBatch3() throws Exception {
String sql = "SELECT ID FROM Library WHERE Author = 'Blind'"; //$NON-NLS-1$
try {
- Util.getConnectorHostWithFakeMetadata(BAD_COUNT_FILE).executeCommand(sql);
+ Util.getConnectorHostWithFakeMetadata().executeCommand(sql, Util.createConnectionFactory(BAD_COUNT_FILE));
fail("Should have failed due to extra column defined in .csv file");//$NON-NLS-1$
} catch (ConnectorException e) {
assertEquals("Expected input file to have 3 columns based on model, but found 4. This could be caused by misplaced quotes, causing multiple columns to be treated as one.", e.getMessage()); //$NON-NLS-1$
@@ -65,9 +65,9 @@
public void testNextBatch2() throws Exception {
String sql = "SELECT ID, PDate, Author FROM Library"; //$NON-NLS-1$
- ConnectorHost host = Util.getConnectorHostWithFakeMetadata(DEFAULT_DESC_FILE);
+ ConnectorHost host = Util.getConnectorHostWithFakeMetadata();
int expectedRows = 4;
- List results = host.executeCommand(sql);
+ List results = host.executeCommand(sql, Util.createConnectionFactory(DEFAULT_DESC_FILE));
assertEquals("Get batch size doesn't match expected one. ", expectedRows, results.size()); //$NON-NLS-1$
// expected values
@@ -103,7 +103,7 @@
*/
public void testDefect13066() throws Exception {
String sql = "SELECT TRADEID FROM SummitData.SUMMITDATA"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFileTest_1.vdb", "SummitData_Descriptor.txt", sql, 500, 4139); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFileTest_1.vdb", UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt", sql, 500, 4139); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -113,7 +113,7 @@
*/
public void testDefect13368() throws Exception {
String sql = "SELECT RATE, DESK FROM SummitData.SUMMITDATA"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFileTest_1.vdb", "SummitData_Descriptor.txt", sql, 5, 4139); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFileTest_1.vdb", UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt", sql, 5, 4139); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -123,18 +123,18 @@
*/
public void testDefect13371() throws Exception {
String sql = " SELECT SUMMITEXTRACTCDM.START, SUMMITEXTRACTCDM.SUMMIT_ID, SUMMITEXTRACTCDM.CURRENCY, SUMMITEXTRACTCDM.AMOUNT, SUMMITEXTRACTCDM.MATURITY, SUMMITEXTRACTCDM.RATE, SUMMITEXTRACTCDM.DESK, SUMMITEXTRACTCDM.CDM_ID FROM SUMMITEXTRACTCDM"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFiles.vdb", "SummitExtractCDM_Descriptor.txt", sql, 500, 52); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFiles.vdb", UnitTestUtil.getTestDataPath() + "/SummitExtractCDM_Descriptor.txt", sql, 500, 52); //$NON-NLS-1$ //$NON-NLS-2$
}
public void testDefect11402() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/** test case 4151 */
public void testCase4151() throws Exception {
String sql = "SELECT COLA, COLB, COLC FROM ThreeColString_Text.testfile"; //$NON-NLS-1$
- Util.helpTestExecution("case4151/MM_00004151.vdb", "testfile-descriptor.txt", sql, 15000, 5); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("case4151/MM_00004151.vdb", UnitTestUtil.getTestDataPath() + "/testfile-descriptor.txt", sql, 15000, 5); //$NON-NLS-1$ //$NON-NLS-2$
}
}
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestRowHeaderTextSynchExecution.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestRowHeaderTextSynchExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestRowHeaderTextSynchExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,12 +22,14 @@
package com.metamatrix.connector.text;
-import org.teiid.connector.api.ConnectorException;
-
import junit.framework.TestCase;
+import org.teiid.resource.ConnectorException;
+import com.metamatrix.core.util.UnitTestUtil;
+
+
public class TestRowHeaderTextSynchExecution extends TestCase {
public TestRowHeaderTextSynchExecution(String name) {
@@ -41,7 +43,7 @@
*/
public void testRowHeader() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -51,7 +53,7 @@
*/
public void testRowHeader2() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_NoNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -61,7 +63,7 @@
*/
public void testRowHeader3() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_AlphaNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -72,7 +74,7 @@
*/
public void testRowHeader4() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_AlphaDiffNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -82,7 +84,7 @@
*/
public void testRowHeader5() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_NoNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor_HeaderRowTest.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor_HeaderRowTest.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -92,7 +94,7 @@
*/
public void testRowHeader6() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_AlphaDiffNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor_HeaderRowTest.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor_HeaderRowTest.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -102,7 +104,7 @@
*/
public void testRowHeader7() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_NoNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor3.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor3.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -112,7 +114,7 @@
*/
public void testRowHeader8() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_SpaceNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -124,7 +126,7 @@
public void testRowHeader_Error() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_AlphaNameInSource"; //$NON-NLS-1$
try {
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
fail("Should have received ConnectorException due to an invalid header row being defined."); //$NON-NLS-1$
} catch (ConnectorException ce ) {
assertEquals("'SELECT PARTS_AlphaNameInSource.Part_Id, PARTS_AlphaNameInSource.Part_Name, PARTS_AlphaNameInSource.Part_Color, PARTS_AlphaNameInSource.Part_Weight FROM PARTS_AlphaNameInSource' cannot be translated by the TextTranslator. Column Part_Id not found for element Parts.PARTS_AlphaNameInSource.Part_Id. Verify column name \"Part_Id\" is defined in the header row of the text file and that the header row number is correctly defined in the descriptor file.", ce.getMessage()); //$NON-NLS-1$
@@ -141,7 +143,7 @@
*/
public void testRowHeader_Error2() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS_NoNameInSource"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor4.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
}
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnection.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnection.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,13 +23,14 @@
package com.metamatrix.connector.text;
import java.util.Map;
-import java.util.Properties;
import junit.framework.TestCase;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.text.TextConnectionFactory;
+import org.teiid.resource.cci.text.TextConnectionImpl;
+import org.teiid.resource.cci.text.TextManagedConnectionFactory;
import com.metamatrix.core.util.UnitTestUtil;
@@ -45,20 +46,14 @@
}
public void testDefect10371() throws Exception {
- Properties props = new Properties();
- String descFile = UnitTestUtil.getTestDataPath() + "/EmployeeTestDataSalary.txt"; //$NON-NLS-1$
- props.put(TextPropertyNames.DESCRIPTOR_FILE, descFile);
-
+ String descFile = UnitTestUtil.getTestDataPath() + "/EmployeeTestDataSalary.txt"; //$NON-NLS-1$
TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
Mockito.stub(config.getDescriptorFile()).toReturn(descFile);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- TextConnector txr = new TextConnector();
- txr.initialize(config);
+ TextConnectionFactory tcf = new TextConnectionFactory(config);
+ TextConnectionImpl conn = (TextConnectionImpl)tcf.getConnection();
- TextConnection conn = (TextConnection)txr.getConnection();
-
- Map actualProps = conn.metadataProps;
+ Map actualProps = conn.getMetadataProperties();
assertNotNull(actualProps);
}
@@ -66,33 +61,28 @@
* Test partial startup property - test default - should default to allow partial startup
*/
public void testCase4284Default() throws Exception {
- Properties props = new Properties();
String descFile = UnitTestUtil.getTestDataPath() + "/testDescriptorDelimited.txt"; //$NON-NLS-1$
TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
Mockito.stub(config.getDescriptorFile()).toReturn(descFile);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
Mockito.stub(config.isPartialStartupAllowed()).toReturn(true);
- TextConnector txr = new TextConnector();
- txr.initialize(config);
+ TextConnectionFactory tcf = new TextConnectionFactory(config);
+ assertNotNull(tcf.getConnection());
}
/**
* Test partial startup property - disallow partial startup
*/
public void testCase4284DisallowPartial() throws Exception {
- Properties props = new Properties();
String descFile = UnitTestUtil.getTestDataPath() + "/testDescriptorDelimited.txt"; //$NON-NLS-1$
TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
Mockito.stub(config.getDescriptorFile()).toReturn(descFile);
Mockito.stub(config.isPartialStartupAllowed()).toReturn(false);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- TextConnector txr = new TextConnector();
try {
- txr.initialize(config);
+ new TextConnectionFactory(config);
fail("expected exception"); //$NON-NLS-1$
} catch (ConnectorException e) {
String m1 = "Error parsing property string text.library2.location"; //$NON-NLS-1$
@@ -110,16 +100,14 @@
* Test partial startup property - allow partial startup
*/
public void testCase4284AllowPartial() throws Exception {
- Properties props = new Properties();
String descFile = UnitTestUtil.getTestDataPath() + "/testDescriptorDelimited.txt"; //$NON-NLS-1$
TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
Mockito.stub(config.getDescriptorFile()).toReturn(descFile);
Mockito.stub(config.isPartialStartupAllowed()).toReturn(true);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- TextConnector txr = new TextConnector();
- txr.initialize(config);
+ TextConnectionFactory tcf = new TextConnectionFactory(config);
+ assertNotNull(tcf.getConnection());
}
}
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnector.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,12 +30,12 @@
import java.util.Properties;
import org.junit.Test;
-import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.MetadataProvider;
import org.teiid.connector.metadata.runtime.Datatype;
import org.teiid.connector.metadata.runtime.MetadataFactory;
import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.resource.adapter.text.TextExecutionFactory;
+import org.teiid.resource.cci.MetadataProvider;
+import org.teiid.resource.cci.text.TextConnectionFactory;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.core.util.UnitTestUtil;
@@ -43,31 +43,11 @@
/**
*/
public class TestTextConnector {
- private static final String DESC_FILE = UnitTestUtil.getTestDataPath() + "/testDescriptorDelimited.txt"; //$NON-NLS-1$
- public TextConnector helpSetUp(String descFile) throws Exception {
- Properties props = new Properties();
- props.put(TextPropertyNames.DESCRIPTOR_FILE, descFile);
-
- TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
- Mockito.stub(config.getDescriptorFile()).toReturn(descFile);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- Mockito.stub(config.isPartialStartupAllowed()).toReturn(true);
-
- TextConnector connector = new TextConnector();
- connector.initialize(config);
- return connector;
- }
-
- // descriptor and data file both are files
- @Test public void testGetConnection() throws Exception{
- TextConnector connector = helpSetUp(DESC_FILE);
- TextConnection conn = (TextConnection) connector.getConnection();
- assertNotNull(conn);
- }
-
@Test public void testGetMetadata() throws Exception{
- TextConnector connector = helpSetUp(UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt"); //$NON-NLS-1$
+ TextConnectionFactory tcf = Util.createConnectionFactory(UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt"); //$NON-NLS-1$
+ TextExecutionFactory connector = new TextExecutionFactory();
+
Map<String, Datatype> datatypes = new HashMap<String, Datatype>();
datatypes.put(DataTypeManager.DefaultDataTypes.STRING, new Datatype());
datatypes.put(DataTypeManager.DefaultDataTypes.BIG_INTEGER, new Datatype());
@@ -76,7 +56,7 @@
MetadataFactory metadata = new MetadataFactory("SummitData", datatypes, new Properties()); //$NON-NLS-1$
- ((MetadataProvider)connector.getConnection()).getConnectorMetadata(metadata);
+ ((MetadataProvider)connector).getConnectorMetadata(metadata, tcf);
assertEquals(0, metadata.getMetadataStore().getSchemas().values().iterator().next().getProcedures().size());
Table group = metadata.getMetadataStore().getSchemas().values().iterator().next().getTables().get("summitdata"); //$NON-NLS-1$
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextSynchExecution.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextSynchExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/TestTextSynchExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -43,9 +43,9 @@
public void testNextBatch2() throws Exception {
String sql = "SELECT ID, PDate, Author FROM Library"; //$NON-NLS-1$
- ConnectorHost host = Util.getConnectorHostWithFakeMetadata(DEFAULT_DESC_FILE);
+ ConnectorHost host = Util.getConnectorHostWithFakeMetadata();
int expectedRows = 2;
- List results = host.executeCommand(sql);
+ List results = host.executeCommand(sql, Util.createConnectionFactory(DEFAULT_DESC_FILE));
assertEquals("Get batch size doesn't match expected one. ", expectedRows, results.size()); //$NON-NLS-1$
// expected values
@@ -74,7 +74,7 @@
*/
public void testDefect13066() throws Exception {
String sql = "SELECT TRADEID FROM SummitData.SUMMITDATA"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFileTest_1.vdb", "SummitData_Descriptor.txt", sql, 500, 4139); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFileTest_1.vdb", UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt", sql, 500, 4139); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -84,7 +84,7 @@
*/
public void testDefect13368() throws Exception {
String sql = "SELECT RATE, DESK FROM SummitData.SUMMITDATA"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFileTest_1.vdb", "SummitData_Descriptor.txt", sql, 5, 4139); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFileTest_1.vdb", UnitTestUtil.getTestDataPath() + "/SummitData_Descriptor.txt", sql, 5, 4139); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
@@ -94,18 +94,18 @@
*/
public void testDefect13371() throws Exception {
String sql = " SELECT SUMMITEXTRACTCDM.START, SUMMITEXTRACTCDM.SUMMIT_ID, SUMMITEXTRACTCDM.CURRENCY, SUMMITEXTRACTCDM.AMOUNT, SUMMITEXTRACTCDM.MATURITY, SUMMITEXTRACTCDM.RATE, SUMMITEXTRACTCDM.DESK, SUMMITEXTRACTCDM.CDM_ID FROM SUMMITEXTRACTCDM"; //$NON-NLS-1$
- Util.helpTestExecution("summitData/TextFiles.vdb", "SummitExtractCDM_Descriptor.txt", sql, 500, 52); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("summitData/TextFiles.vdb", UnitTestUtil.getTestDataPath() + "/SummitExtractCDM_Descriptor.txt", sql, 500, 52); //$NON-NLS-1$ //$NON-NLS-2$
}
public void testDefect11402() throws Exception {
String sql = "SELECT Part_ID, Part_Name, Part_Color, Part_Weight from PARTS.PARTS"; //$NON-NLS-1$
- Util.helpTestExecution("TextParts/TextParts.vdb", "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("TextParts/TextParts.vdb", UnitTestUtil.getTestDataPath() + "/TextParts/PartsDescriptor.txt", sql, 15000, 21); //$NON-NLS-1$ //$NON-NLS-2$
}
/** test case 4151 */
public void testCase4151() throws Exception {
String sql = "SELECT COLA, COLB, COLC FROM ThreeColString_Text.testfile"; //$NON-NLS-1$
- Util.helpTestExecution("case4151/MM_00004151.vdb", "testfile-descriptor.txt", sql, 15000, 5); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.helpTestExecution("case4151/MM_00004151.vdb", UnitTestUtil.getTestDataPath() + "/testfile-descriptor.txt", sql, 15000, 5); //$NON-NLS-1$ //$NON-NLS-2$
}
}
Modified: trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/Util.java
===================================================================
--- trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/Util.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/connectors/connector-text/src/test/java/com/metamatrix/connector/text/Util.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,13 +28,17 @@
import junit.framework.Assert;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorLogger;
import org.teiid.connector.metadata.runtime.Column;
import org.teiid.connector.metadata.runtime.MetadataStore;
import org.teiid.connector.metadata.runtime.Schema;
import org.teiid.connector.metadata.runtime.Table;
import org.teiid.metadata.CompositeMetadataStore;
import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.adapter.text.TextConnection;
+import org.teiid.resource.adapter.text.TextExecutionFactory;
+import org.teiid.resource.cci.text.TextConnectionFactory;
+import org.teiid.resource.cci.text.TextConnectionImpl;
+import org.teiid.resource.cci.text.TextManagedConnectionFactory;
import com.metamatrix.cdk.api.ConnectorHost;
import com.metamatrix.cdk.api.TranslationUtility;
@@ -43,35 +47,33 @@
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.unittest.RealMetadataFactory;
+ at SuppressWarnings("nls")
public class Util {
static void helpTestExecution(String vdb, String descriptorFile, String sql, int maxBatchSize, int expectedRowCount) throws Exception {
- descriptorFile = UnitTestUtil.getTestDataPath() + File.separator + descriptorFile;
-
- TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
- Mockito.stub(config.getDescriptorFile()).toReturn(descriptorFile);
- Mockito.stub(config.isPartialStartupAllowed()).toReturn(true);
- Mockito.stub(config.getDateResultFormats()).toReturn("yyyy-MM-dd,hh:mm:ss,hh:mm,dd/mm/yyyy");
- Mockito.stub(config.getDateResultFormatsDelimiter()).toReturn(",");
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
+ TextExecutionFactory connector = new TextExecutionFactory();
+ connector.setDateResultFormats("yyyy-MM-dd,hh:mm:ss,hh:mm,dd/mm/yyyy"); //$NON-NLS-1$
+ connector.setDateResultFormatsDelimiter(",");
- ConnectorHost host = new ConnectorHost(new TextConnector(), config, UnitTestUtil.getTestDataPath() + File.separator + vdb);
- List results = host.executeCommand(sql);
+ ConnectorHost host = new ConnectorHost(connector, UnitTestUtil.getTestDataPath() + File.separator + vdb);
+ List results = host.executeCommand(sql, createConnectionFactory(descriptorFile));
Assert.assertEquals("Total row count doesn't match expected size. ", expectedRowCount, results.size()); //$NON-NLS-1$
}
-
- public static ConnectorHost getConnectorHostWithFakeMetadata(String descriptorFile) throws Exception {
+
+ public static TextConnectionFactory createConnectionFactory(String descriptorFile) throws Exception {
TextManagedConnectionFactory config = Mockito.mock(TextManagedConnectionFactory.class);
Mockito.stub(config.getDescriptorFile()).toReturn(descriptorFile);
Mockito.stub(config.isPartialStartupAllowed()).toReturn(true);
- Mockito.stub(config.getDateResultFormats()).toReturn("yyyy-MM-dd,hh:mm:ss,hh:mm,dd/mm/yyyy");
- Mockito.stub(config.getDateResultFormatsDelimiter()).toReturn(",");
- Mockito.stub(config.isEnforceColumnCount()).toReturn(true);
+ return new TextConnectionFactory(config);
+ }
+
+ public static ConnectorHost getConnectorHostWithFakeMetadata() throws Exception {
+ TextExecutionFactory connector = new TextExecutionFactory();
+ connector.setDateResultFormats("yyyy-MM-dd,hh:mm:ss,hh:mm,dd/mm/yyyy"); //$NON-NLS-1$
+ connector.setDateResultFormatsDelimiter(",");
+ connector.setEnforceColumnCount(true);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
-
-
- ConnectorHost host = new ConnectorHost(new TextConnector(), config, new TranslationUtility(exampleText()));
+ ConnectorHost host = new ConnectorHost(connector, new TranslationUtility(exampleText()));
return host;
}
Copied: trunk/connectors/sandbox/translator-yahoo (from rev 2083, trunk/connectors/sandbox/connector-yahoo)
Modified: trunk/connectors/sandbox/translator-yahoo/pom.xml
===================================================================
--- trunk/connectors/sandbox/connector-yahoo/pom.xml 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/sandbox/translator-yahoo/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,58 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <parent>
- <artifactId>sandbox</artifactId>
- <groupId>org.jboss.teiid.connectors</groupId>
- <version>7.0.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>connector-yahoo</artifactId>
- <groupId>org.jboss.teiid.connectors.sandbox</groupId>
- <name>Yahoo Connector</name>
- <description>Test connector used to query ticker symbols from Yahoo website</description>
- <packaging>rar</packaging>
- <dependencies>
- <dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-connector-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-common-core</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.resource</groupId>
- <artifactId>connector-api</artifactId>
- <scope>provided</scope>
- </dependency>
- </dependencies>
+ <parent>
+ <artifactId>sandbox</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>translator-yahoo</artifactId>
+ <groupId>org.jboss.teiid.connectors.sandbox</groupId>
+ <name>Yahoo Translator</name>
+ <description>Test translator used to query ticker symbols from Yahoo website</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
<build>
- <plugins>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>build_jar</id>
- <phase>process-classes</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>deploy_jar</id>
- <phase>package</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <classifier>lib</classifier>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
\ No newline at end of file
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
Added: trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/TickerCollectorVisitor.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/TickerCollectorVisitor.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/TickerCollectorVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,104 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import java.util.*;
+
+import org.teiid.connector.language.*;
+import org.teiid.connector.visitor.framework.HierarchyVisitor;
+import org.teiid.resource.ConnectorException;
+
+
+/**
+ */
+public class TickerCollectorVisitor extends HierarchyVisitor {
+
+ private Set tickers = new HashSet();
+ private ConnectorException exception;
+
+ /**
+ *
+ */
+ public TickerCollectorVisitor() {
+ super();
+ }
+
+ public void reset() {
+ tickers = new HashSet();
+ }
+
+ public Set getTickers() {
+ return this.tickers;
+ }
+
+ public ConnectorException getException() {
+ return this.exception;
+ }
+
+ /*
+ * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.ICompareCriteria)
+ */
+ public void visit(Comparison obj) {
+ Expression expr = obj.getRightExpression();
+ addTickerFromExpression(expr);
+ }
+
+ /*
+ * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IInCriteria)
+ */
+ public void visit(In obj) {
+ List exprs = obj.getRightExpressions();
+ Iterator iter = exprs.iterator();
+ while(iter.hasNext()) {
+ Expression expr = (Expression) iter.next();
+ addTickerFromExpression(expr);
+ }
+ }
+
+ private void addTickerFromExpression(Expression expr) {
+ if(expr instanceof Literal) {
+ Literal literal = (Literal) expr;
+ if(literal.getType() == String.class) {
+ String ticker = (String) literal.getValue();
+ this.tickers.add(ticker.toUpperCase());
+ } else {
+ this.exception = new ConnectorException(YahooPlugin.Util.getString("TickerCollectorVisitor.Unexpected_type", literal.getType().getName())); //$NON-NLS-1$
+ }
+ } else {
+ this.exception = new ConnectorException(YahooPlugin.Util.getString("TickerCollectorVisitor.Unexpected_expression", expr)); //$NON-NLS-1$
+ }
+
+ }
+
+
+ public static Set getTickers(Condition crit) throws ConnectorException {
+ TickerCollectorVisitor visitor = new TickerCollectorVisitor();
+ crit.acceptVisitor(visitor);
+
+ if(visitor.getException() != null) {
+ throw visitor.getException();
+ }
+ return visitor.getTickers();
+ }
+
+}
Added: trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooCapabilities.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooCapabilities.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,81 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+
+/**
+ * Specifies the capabilities of this connector. The Yahoo connector
+ * supports only some basic criteria capability
+ */
+public class YahooCapabilities extends BasicConnectorCapabilities {
+
+ public static final int YAHOO_MAX_SET_SIZE = 100;
+
+ /**
+ * Construct the capabilities class
+ */
+ public YahooCapabilities() {
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List getSupportedFunctions() {
+ return Collections.EMPTY_LIST;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrCriteria()
+ */
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCompareCriteriaEquals()
+ */
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteria()
+ */
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ /**
+ * @see com.metamatrix.connector.jdbc.JDBCCapabilities#getMaxInCriteriaSize()
+ * @since 4.2
+ */
+ public int getMaxInCriteriaSize() {
+ return YAHOO_MAX_SET_SIZE;
+ }
+
+}
Added: trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecution.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecution.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,296 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.math.BigInteger;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Condition;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ResultSetExecution;
+
+
+/**
+ * Represents the execution of a command.
+ */
+public class YahooExecution extends BasicExecution implements ResultSetExecution {
+
+ public static final String JAVA_PROP_HTTP_PROXY_HOST = "http.proxyHost"; //$NON-NLS-1$
+ public static final String JAVA_PROP_HTTP_PROXY_PORT = "http.proxyPort"; //$NON-NLS-1$
+
+ private static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); //$NON-NLS-1$
+ private static SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mma"); //$NON-NLS-1$
+
+ // Connector resources
+ private RuntimeMetadata metadata;
+ private Select command;
+
+ // Execution state
+ List results;
+ int[] neededColumns;
+ int returnIndex = 0;
+ private Select query;
+
+ /**
+ *
+ */
+ public YahooExecution(Select query, RuntimeMetadata metadata) {
+ this.metadata = metadata;
+ this.query = query;
+ }
+
+ /*
+ * @see com.metamatrix.data.SynchQueryExecution#execute(com.metamatrix.data.language.IQuery, int)
+ */
+ @Override
+ public void execute() throws ConnectorException {
+ // Log our command
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Yahoo executing command: " + command); //$NON-NLS-1$
+
+ // Build url
+ String yahooUrl = translateIntoUrl(query);
+
+ // Execute url to get results
+ this.results = executeUrl(yahooUrl);
+
+ // Determine needed columns in results
+ this.neededColumns = getNeededColumns(query.getDerivedColumns(), this.metadata);
+ }
+
+ static String translateIntoUrl(Select query) throws ConnectorException {
+ StringBuffer url = new StringBuffer();
+ url.append(YahooPlugin.Util.getString("YahooExecution.URL_BEGIN")); //$NON-NLS-1$
+
+ Set tickers = getTickers(query);
+ if(tickers.size() == 0) {
+ throw new ConnectorException(YahooPlugin.Util.getString("YahooExecution.No_tickers")); //$NON-NLS-1$
+ }
+ String urlAppendChar = YahooPlugin.Util.getString("YahooExecution.URL_APPEND_CHAR"); //$NON-NLS-1$
+ Iterator tickerIter = tickers.iterator();
+ url.append(tickerIter.next());
+ while(tickerIter.hasNext()) {
+ url.append(urlAppendChar);
+ url.append(tickerIter.next());
+ }
+
+ url.append(YahooPlugin.Util.getString("YahooExecution.URL_END")); //$NON-NLS-1$
+ return url.toString();
+ }
+
+ /**
+ * @return
+ */
+ static Set getTickers(Select query) throws ConnectorException {
+ Condition crit = query.getWhere();
+ if(crit == null) {
+ throw new ConnectorException(YahooPlugin.Util.getString("YahooExecution.Must_have_criteria")); //$NON-NLS-1$
+ }
+ return TickerCollectorVisitor.getTickers(crit);
+ }
+
+ /**
+ * @param yahooUrl
+ * @return
+ */
+ protected List executeUrl(String yahooUrl) throws ConnectorException {
+ List rows = new ArrayList();
+ InputStreamReader inSR = null;
+ BufferedReader buffReader = null;
+
+ try {
+ // create the URL object
+ URL url = new URL(yahooUrl);
+
+ // create the connection to the URL
+ URLConnection conn = url.openConnection();
+
+ // establish the connection to the URL
+ conn.connect();
+
+ // get the stream from the commection
+ inSR = new InputStreamReader(conn.getInputStream());
+
+ // place the stream into a buffered reader
+ buffReader = new BufferedReader(inSR);
+
+ // now read each line from the Yahoo! Source and place
+ // it into a StringBuffer object
+ String line = null;
+ while((line = buffReader.readLine()) != null){
+ rows.add(parseLine(line));
+ }
+ // clean up our opened connections
+ buffReader.close();
+ inSR.close();
+
+ } catch(MalformedURLException mue){
+ throw new ConnectorException(mue, mue.getMessage());
+ } catch(IOException e) {
+ throw new ConnectorException(e, e.getMessage());
+ } finally {
+ buffReader = null;
+ inSR = null;
+ }
+
+ return rows;
+ }
+
+ /**
+ * @param line
+ * @return
+ */
+ static List parseLine(String line) {
+ List row = new ArrayList();
+ StringTokenizer rowToken = new StringTokenizer(line,","); //$NON-NLS-1$
+ for(int i=0; rowToken.hasMoreTokens(); i++){
+ String data = rowToken.nextToken();
+ if(data.charAt(0) == '"') {
+ data = data.substring(1, data.length()-1);
+ }
+
+ if(data.equals("N/A")) { //$NON-NLS-1$
+ row.add(null);
+ } else if(i==1 || i==4 || i== 5 || i==6 || i==7) {
+ row.add(Double.valueOf(data));
+ } else if(i==8) {
+ row.add(new BigInteger(data));
+ } else if(i==2) {
+ if(!data.equals("0")){ //$NON-NLS-1$
+ try {
+ Date date = DATE_FORMAT.parse(data);
+ row.add(new java.sql.Date(date.getTime()));
+ } catch(ParseException e) {
+ Object[] params = new Object[] { data, e.getMessage() };
+ LogManager.logWarning(LogConstants.CTX_CONNECTOR, YahooPlugin.Util.getString("YahooExecution.Parse_date_error", params)); //$NON-NLS-1$
+ row.add(null);
+ }
+ } else{
+ row.add(null);
+ }
+ } else if(i==3) {
+ if(!data.equals("0")){ //$NON-NLS-1$
+ try {
+ Date time = TIME_FORMAT.parse(data);
+ row.add(new java.sql.Time(time.getTime()));
+ } catch(ParseException e) {
+ Object[] params = new Object[] { data, e.getMessage() };
+ LogManager.logWarning(LogConstants.CTX_CONNECTOR, YahooPlugin.Util.getString("YahooExecution.Parse_time_value", params)); //$NON-NLS-1$
+ row.add(null);
+ }
+ } else {
+ row.add(null);
+ }
+
+ } else {
+ row.add(data);
+ }
+ }
+
+ return row;
+ }
+
+ /**
+ * @param select
+ * @return
+ */
+ static int[] getNeededColumns(List<DerivedColumn> select, RuntimeMetadata metadata) throws ConnectorException {
+ int[] cols = new int[select.size()];
+ Iterator iter = select.iterator();
+ for(int i=0; iter.hasNext(); i++) {
+ DerivedColumn symbol = (DerivedColumn) iter.next();
+ Expression expr = symbol.getExpression();
+ if(expr instanceof ColumnReference) {
+ Column element = ((ColumnReference)expr).getMetadataObject();
+ cols[i] = element.getPosition();
+ } else {
+ throw new ConnectorException(YahooPlugin.Util.getString("YahooExecution.Invalid_select_symbol", expr)); //$NON-NLS-1$
+ }
+ }
+
+ return cols;
+ }
+
+ @Override
+ public List next() throws ConnectorException, DataNotAvailableException {
+ if (returnIndex < results.size()) {
+ List row = (List) results.get(returnIndex++);
+ return projectRow(row, neededColumns);
+ }
+
+ return null;
+ }
+
+
+ /**
+ * @param row
+ * @param neededColumns
+ */
+ static List projectRow(List row, int[] neededColumns) {
+ List output = new ArrayList(neededColumns.length);
+
+ for(int i=0; i<neededColumns.length; i++) {
+ output.add(row.get(neededColumns[i]));
+ }
+
+ return output;
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#close()
+ */
+ @Override
+ public void close() throws ConnectorException {
+ // nothing to do
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#cancel()
+ */
+ @Override
+ public void cancel() throws ConnectorException {
+
+ }
+}
Added: trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecutionFactory.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecutionFactory.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,50 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ResultSetExecution;
+
+public class YahooExecutionFactory extends BasicExecutionFactory {
+
+ @Override
+ public void start() throws ConnectorException {
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return YahooCapabilities.class;
+ }
+
+ @Override
+ public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ return new YahooExecution((Select)command, metadata);
+ }
+}
Added: trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooPlugin.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooPlugin.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/java/org/teiid/resource/adapter/yahoo/YahooPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,32 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import java.util.ResourceBundle;
+import com.metamatrix.core.BundleUtil;
+
+
+public class YahooPlugin {
+ public static final String PLUGIN_ID = "org.teiid.resource.adapter.yahoo" ; //$NON-NLS-1$
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
+}
Added: trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.yahoo.YahooExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Property changes on: trunk/connectors/sandbox/translator-yahoo/src/main/resources/META-INF/jboss-beans.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/yahoo/i18n.properties
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/yahoo/i18n.properties (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/main/resources/org/teiid/resource/adapter/yahoo/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,33 @@
+#
+# 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.
+#
+
+YahooExecution.URL_BEGIN=http://finance.yahoo.com/d/quotes.csv?s=
+YahooExecution.URL_APPEND_CHAR=+
+YahooExecution.URL_END=&f=sl1d1t1c1ohgv&e=.csv
+TickerCollectorVisitor.Unexpected_type=Unable to parse literal of type: {0}
+TickerCollectorVisitor.Unexpected_expression=Unable to parse expression: {0}
+YahooExecution.No_tickers=Yahoo connector must be called with tickers in the criteria
+YahooExecution.Must_have_criteria=Query against Yahoo connector must have criteria
+YahooExecution.Parse_date_error=Unable to parse date value: {0}, got: {1}
+YahooExecution.Parse_time_value=Unable to parse time value: {0}, got: {1}
+YahooExecution.Invalid_select_symbol=Yahoo connector can''t handle {0} in SELECT
+YahooConnector.proxyPortNotSet=HTTP proxy port is not set. The default port number 80 will be used.
Added: trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/yahoo/TestYahooTranslation.java
===================================================================
--- trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/yahoo/TestYahooTranslation.java (rev 0)
+++ trunk/connectors/sandbox/translator-yahoo/src/test/java/org/teiid/resource/adapter/yahoo/TestYahooTranslation.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,61 @@
+/*
+ * 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.resource.adapter.yahoo;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Select;
+import org.teiid.resource.adapter.yahoo.YahooExecution;
+
+import junit.framework.TestCase;
+
+import com.metamatrix.cdk.unittest.FakeTranslationFactory;
+
+public class TestYahooTranslation extends TestCase {
+
+ public void helpTestTranslation(String sql, String expectedUrl) throws Exception {
+ Command command = FakeTranslationFactory.getInstance().getYahooTranslationUtility().parseCommand(sql);
+
+ String url = YahooExecution.translateIntoUrl((Select) command);
+ assertEquals("Did not get expected url", expectedUrl, url); //$NON-NLS-1$
+ }
+
+ public void testURLTranslation1() throws Exception {
+ helpTestTranslation(
+ "SELECT LastTrade FROM Yahoo.QuoteServer WHERE TickerSymbol = 'BA'", //$NON-NLS-1$
+ "http://finance.yahoo.com/d/quotes.csv?s=BA&f=sl1d1t1c1ohgv&e=.csv"); //$NON-NLS-1$
+ }
+
+ public void testURLTranslation2() throws Exception {
+ helpTestTranslation(
+ "SELECT LastTrade FROM Yahoo.QuoteServer WHERE TickerSymbol IN ('BA', 'MON')", //$NON-NLS-1$
+ "http://finance.yahoo.com/d/quotes.csv?s=MON+BA&f=sl1d1t1c1ohgv&e=.csv"); //$NON-NLS-1$
+ }
+
+ public void testURLTranslation3() throws Exception {
+ helpTestTranslation(
+ "SELECT LastTrade FROM Yahoo.QuoteServer WHERE TickerSymbol = 'BA' OR TickerSymbol = 'MON'", //$NON-NLS-1$
+ "http://finance.yahoo.com/d/quotes.csv?s=MON+BA&f=sl1d1t1c1ohgv&e=.csv"); //$NON-NLS-1$
+ }
+
+
+}
Copied: trunk/connectors/translator-jdbc (from rev 2083, trunk/connectors/connector-jdbc)
Modified: trunk/connectors/translator-jdbc/pom.xml
===================================================================
--- trunk/connectors/connector-jdbc/pom.xml 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -8,12 +8,11 @@
<version>7.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
- <artifactId>connector-jdbc</artifactId>
+ <artifactId>translator-jdbc</artifactId>
<groupId>org.jboss.teiid.connectors</groupId>
- <name>JDBC Connector</name>
- <packaging>rar</packaging>
+ <name>JDBC Translator</name>
- <description>This project contains connectors for a JDBC source. Currently this is an aggregator for all the JDBC connectors relational databases.</description>
+ <description>This project contains translators for a JDBC source. Currently this is an aggregator for all the JDBC translators relational databases.</description>
<dependencies>
<dependency>
<groupId>org.jboss.teiid</groupId>
@@ -31,33 +30,27 @@
<scope>provided</scope>
</dependency>
</dependencies>
-
+
<build>
- <plugins>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>build_jar</id>
- <phase>process-classes</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>deploy_jar</id>
- <phase>package</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <classifier>lib</classifier>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
-</project>
\ No newline at end of file
+</project>
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,219 +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.connector.jdbc;
-
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.SQLWarning;
-import java.sql.Statement;
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.basic.BasicExecution;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.jdbc.translator.Translator;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Literal;
-
-/**
- */
-public abstract class JDBCBaseExecution extends BasicExecution {
-
- // ===========================================================================================================================
- // Fields
- // ===========================================================================================================================
-
- // Passed to constructor
- protected Connection connection;
- protected Translator sqlTranslator;
- protected ConnectorLogger logger;
- protected ExecutionContext context;
- protected JDBCManagedConnectionFactory env;
-
- // Derived from properties
- protected boolean trimString;
- protected int fetchSize;
- protected int maxResultRows;
-
- // Set during execution
- protected Statement statement;
-
- // ===========================================================================================================================
- // Constructors
- // ===========================================================================================================================
-
- protected JDBCBaseExecution(Connection connection, ExecutionContext context, JDBCManagedConnectionFactory env) throws ConnectorException {
- this.connection = connection;
- this.sqlTranslator = env.getTranslator();
- this.logger = env.getLogger();
- this.context = context;
- this.env = env;
-
- trimString = env.isTrimStrings();
- fetchSize = (env.getFetchSize() != -1)?env.getFetchSize():context.getBatchSize();
- maxResultRows = env.getMaxResultRows();
-
- //if the connector work needs to throw an excpetion, set the size plus 1
- if (maxResultRows > 0 && env.isExceptionOnMaxRows()) {
- maxResultRows++;
- }
- if (maxResultRows > 0) {
- fetchSize = Math.min(fetchSize, maxResultRows);
- }
- }
-
- /**
- * Return true if this is a batched update
- */
- protected void bindPreparedStatementValues(PreparedStatement stmt, TranslatedCommand tc, int rowCount) throws SQLException {
- List<?> params = tc.getPreparedValues();
-
- for (int row = 0; row < rowCount; row++) {
- for (int i = 0; i< params.size(); i++) {
- Literal paramValue = (Literal)params.get(i);
- Object value = paramValue.getValue();
- if (paramValue.isMultiValued()) {
- value = ((List<?>)value).get(row);
- }
- Class<?> paramType = paramValue.getType();
- sqlTranslator.bindValue(stmt, value, paramType, i+1);
- }
- if (rowCount > 1) {
- stmt.addBatch();
- }
- }
- }
-
- // ===========================================================================================================================
- // Methods
- // ===========================================================================================================================
-
- protected TranslatedCommand translateCommand(Command command) throws ConnectorException {
- TranslatedCommand translatedCommand = new TranslatedCommand(context, sqlTranslator);
- translatedCommand.translateCommand(command);
-
- if (translatedCommand.getSql() != null && this.logger.isDetailEnabled()) {
- this.logger.logDetail("Source-specific command: " + translatedCommand.getSql()); //$NON-NLS-1$
- }
-
- return translatedCommand;
- }
-
- /*
- * @see com.metamatrix.data.Execution#close()
- */
- public synchronized void close() throws ConnectorException {
- try {
- if (statement != null) {
- statement.close();
- }
- } catch (SQLException e) {
- throw new ConnectorException(e);
- }
- }
-
- /*
- * @see com.metamatrix.data.Execution#cancel()
- */
- public synchronized void cancel() throws ConnectorException {
- // if both the DBMS and driver support aborting an SQL
- try {
- if (statement != null) {
- statement.cancel();
- }
- } catch (SQLException e) {
- // Defect 16187 - DataDirect does not support the cancel() method for
- // Statement.cancel() for DB2 and Informix. Here we are tolerant
- // of these and other JDBC drivers that do not support the cancel() operation.
- }
- }
-
- protected void setSizeContraints(Statement statement) throws SQLException {
- if (maxResultRows > 0) {
- statement.setMaxRows(maxResultRows);
- }
- statement.setFetchSize(fetchSize);
- }
-
- protected synchronized Statement getStatement() throws SQLException {
- if (statement != null) {
- statement.close();
- statement = null;
- }
- statement = connection.createStatement();
- setSizeContraints(statement);
- return statement;
- }
-
- protected synchronized CallableStatement getCallableStatement(String sql) throws SQLException {
- if (statement != null) {
- statement.close();
- statement = null;
- }
- statement = connection.prepareCall(sql);
- setSizeContraints(statement);
- return (CallableStatement)statement;
- }
-
- protected synchronized PreparedStatement getPreparedStatement(String sql) throws SQLException {
- if (statement != null) {
- statement.close();
- statement = null;
- }
- statement = connection.prepareStatement(sql);
- setSizeContraints(statement);
- return (PreparedStatement)statement;
- }
-
- /**
- * Returns the JDBC connection used by the execution object.
- *
- * @return Returns the connection.
- * @since 4.1.1
- */
- public Connection getConnection() {
- return this.connection;
- }
-
- public Translator getSqlTranslator() {
- return sqlTranslator;
- }
-
- public void addStatementWarnings() throws SQLException {
- SQLWarning warning = this.statement.getWarnings();
- while (warning != null) {
- SQLWarning toAdd = warning;
- warning = toAdd.getNextWarning();
- toAdd.setNextException(null);
- if (logger.isDetailEnabled()) {
- logger.logDetail(context.getRequestIdentifier() + " Warning: ", warning); //$NON-NLS-1$
- }
- context.addWarning(toAdd);
- }
- this.statement.clearWarnings();
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,331 +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.connector.jdbc;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-
-
-/**
- */
-public class JDBCCapabilities extends BasicConnectorCapabilities {
-
- /**
- *
- */
- public JDBCCapabilities() {
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
- */
- public List<String> getSupportedFunctions() {
- return Arrays.asList(new String[] { "+", "-", "*", "/" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- }
-
- /**
- * @see org.teiid.connector.basic.BasicConnectorCapabilities#getMaxInCriteriaSize()
- * @since 4.2
- */
- public int getMaxInCriteriaSize() {
- return 1000;
- }
-
- @Override
- public boolean supportsGroupBy() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesAvg()
- */
- public boolean supportsAggregatesAvg() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCount()
- */
- public boolean supportsAggregatesCount() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCountStar()
- */
- public boolean supportsAggregatesCountStar() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesDistinct()
- */
- public boolean supportsAggregatesDistinct() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMax()
- */
- public boolean supportsAggregatesMax() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMin()
- */
- public boolean supportsAggregatesMin() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesSum()
- */
- public boolean supportsAggregatesSum() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsAliasedGroup()
- */
- public boolean supportsAliasedGroup() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsBetweenCriteria()
- */
- public boolean supportsBetweenCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsCaseExpressions()
- */
- public boolean supportsCaseExpressions() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsCompareCriteriaEquals()
- */
- public boolean supportsCompareCriteriaEquals() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsCorrelatedSubqueries()
- */
- public boolean supportsCorrelatedSubqueries() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsExistsCriteria()
- */
- public boolean supportsExistsCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsFullOuterJoins()
- */
- public boolean supportsFullOuterJoins() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteria()
- */
- public boolean supportsInCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteriaSubquery()
- */
- public boolean supportsInCriteriaSubquery() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsIsNullCriteria()
- */
- public boolean supportsIsNullCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteria()
- */
- public boolean supportsLikeCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
- */
- public boolean supportsLikeCriteriaEscapeCharacter() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsNotCriteria()
- */
- public boolean supportsNotCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsOrCriteria()
- */
- public boolean supportsOrCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsOrderBy()
- */
- public boolean supportsOrderBy() {
- return true;
- }
-
- @Override
- public boolean supportsOrderByUnrelated() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsOuterJoins()
- */
- public boolean supportsOuterJoins() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
- */
- public boolean supportsQuantifiedCompareCriteriaAll() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsScalarSubqueries()
- */
- public boolean supportsScalarSubqueries() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsSearchedCaseExpressions()
- */
- public boolean supportsSearchedCaseExpressions() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsSelectDistinct()
- */
- public boolean supportsSelectDistinct() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.ConnectorCapabilities#supportsSelfJoins()
- */
- public boolean supportsSelfJoins() {
- return true;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsInlineViews()
- */
- public boolean supportsInlineViews() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
- */
- public boolean supportsQuantifiedCompareCriteriaSome() {
- return true;
- }
-
- /**
- * @see org.teiid.connector.basic.BasicConnectorCapabilities#supportsSetQueryOrderBy()
- */
- @Override
- public boolean supportsSetQueryOrderBy() {
- return true;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsUnions()
- */
- public boolean supportsUnions() {
- return true;
- }
-
- @Override
- public boolean supportsBulkUpdate() {
- return true;
- }
-
- @Override
- public boolean supportsBatchedUpdates() {
- return true;
- }
-
- @Override
- public boolean supportsCompareCriteriaOrdered() {
- return true;
- }
-
- @Override
- public SupportedJoinCriteria getSupportedJoinCriteria() {
- return SupportedJoinCriteria.ANY;
- }
-
- @Override
- public boolean supportsHaving() {
- return true;
- }
-
- @Override
- public boolean supportsInnerJoins() {
- return true;
- }
-
- @Override
- public boolean supportsSelectExpression() {
- return true;
- }
-
- @Override
- public boolean supportsInsertWithQueryExpression() {
- return true;
- }
-
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCConnector.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCConnector.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,100 +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.connector.jdbc;
-
-import java.sql.SQLException;
-
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.basic.BasicConnector;
-
-import com.metamatrix.core.util.StringUtil;
-
-/**
- * JDBC implementation of Connector interface.
- */
-public class JDBCConnector extends BasicConnector {
-
- private JDBCManagedConnectionFactory config;
- private ConnectorCapabilities capabilities;
-
-
- @Override
- public void initialize(ConnectorEnvironment env) throws ConnectorException {
- super.initialize(env);
-
- this.config = (JDBCManagedConnectionFactory)env;
-
- ConnectorLogger logger = config.getLogger();
-
- logger.logInfo(JDBCPlugin.Util.getString("JDBCConnector.JDBCConnector_initialized._1")); //$NON-NLS-1$
-
-
- // Get the JNDI name for the underlying JDBC source
- String dataSourceName = this.config.getSourceJNDIName();
-
- // Verify required items
- if (!StringUtil.isValid(dataSourceName)) {
- throw new ConnectorException(JDBCPlugin.Util.getString("JDBCSourceConnectionFactory.Missing_JDBC_jndi_1")); //$NON-NLS-1$
- }
-
- capabilities = config.getTranslator().getConnectorCapabilities();
-
- logger.logInfo(JDBCPlugin.Util.getString("JDBCConnector.JDBCConnector_started._4")); //$NON-NLS-1$
- }
-
-
- @Override
- public Connection getConnection() throws ConnectorException {
- DataSource dataSource = getDataSource();
- try {
- // TODO: credential mapping facility is now gone. so, no more re-authenticating user.
- return new JDBCSourceConnection(dataSource.getConnection(), this.config);
- } catch (SQLException e) {
- throw new ConnectorException(e);
- }
- }
-
-
- @Override
- public ConnectorCapabilities getCapabilities() {
- return capabilities;
- }
-
- protected DataSource getDataSource() throws ConnectorException {
- String dsName = this.config.getSourceJNDIName();
- try {
- InitialContext ic = new InitialContext();
- return (DataSource) ic.lookup(dsName);
- } catch (NamingException e) {
- throw new ConnectorException(e,JDBCPlugin.Util.getString("JDBCSourceConnectionFactory.Unable_to_find_jndi_ds", dsName)); //$NON-NLS-1$
- }
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCExecutionException.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCExecutionException.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCExecutionException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,39 +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.connector.jdbc;
-
-import java.sql.SQLException;
-import java.util.Arrays;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-
-
-public class JDBCExecutionException extends ConnectorException {
-
- public JDBCExecutionException(SQLException error,
- TranslatedCommand... commands) {
- super(error.getErrorCode(), commands == null ? error.getMessage() : JDBCPlugin.Util.getString("JDBCQueryExecution.Error_executing_query__1", //$NON-NLS-1$
- error.getMessage(), Arrays.toString(commands)));
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCManagedConnectionFactory.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,119 +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.connector.jdbc;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.basic.BasicManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.Translator;
-
-import com.metamatrix.core.MetaMatrixCoreException;
-import com.metamatrix.core.util.ReflectionHelper;
-import com.metamatrix.core.util.StringUtil;
-
-public class JDBCManagedConnectionFactory extends BasicManagedConnectionFactory {
-
- private static final long serialVersionUID = -6719853084334318668L;
- // JDBC connector properties
- private boolean useBindVariables = false;
- private String databaseTimeZone;
- private String extensionTranslationClassName;
- private String sourceJNDIName;
- private boolean trimStrings=false;
- private boolean useCommentsInSourceQuery = false;
- private int fetchSize = -1;
-
- // derived
- private Translator sqlTranslator;
-
- public boolean isUseBindVariables() {
- return useBindVariables;
- }
-
- public String getDatabaseTimeZone() {
- return databaseTimeZone;
- }
-
- public String getExtensionTranslationClassName() {
- return extensionTranslationClassName;
- }
-
- public Translator getTranslator() throws ConnectorException {
- if (this.sqlTranslator == null) {
- try {
- String className = getExtensionTranslationClassName();
- if (!StringUtil.isValid(className)) {
- this.sqlTranslator = new Translator();
- } else {
- this.sqlTranslator = (Translator)ReflectionHelper.create(className, null, Thread.currentThread().getContextClassLoader());
- }
- sqlTranslator.initialize(this);
- } catch (MetaMatrixCoreException e) {
- throw new ConnectorException(e);
- }
- }
- return this.sqlTranslator;
- }
-
- public String getSourceJNDIName() {
- return sourceJNDIName;
- }
-
- public boolean isTrimStrings() {
- return trimStrings;
- }
-
- public boolean isUseCommentsInSourceQuery() {
- return useCommentsInSourceQuery;
- }
-
- public void setUseBindVariables(Boolean arg0) {
- this.useBindVariables = arg0.booleanValue();
- }
-
- public void setDatabaseTimeZone(String arg0) {
- this.databaseTimeZone = arg0;
- }
-
- public void setExtensionTranslationClassName(String arg0) {
- this.extensionTranslationClassName = arg0;
- }
-
- public void setSourceJNDIName(String arg0) {
- this.sourceJNDIName = arg0;
- }
-
- public void setTrimStrings(Boolean arg0) {
- this.trimStrings = arg0.booleanValue();
- }
-
- public void setUseCommentsInSourceQuery(Boolean arg0) {
- this.useCommentsInSourceQuery = arg0.booleanValue();
- }
-
- public void setFetchSize(Integer arg0) {
- this.fetchSize = arg0.intValue();
- }
-
- public int getFetchSize() {
- return this.fetchSize;
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCMetdataProcessor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,441 +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.connector.jdbc;
-
-import java.sql.Connection;
-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;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
-import org.teiid.connector.metadata.runtime.BaseColumn;
-import org.teiid.connector.metadata.runtime.Column;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.Procedure;
-import org.teiid.connector.metadata.runtime.Table;
-import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
-import org.teiid.connector.metadata.runtime.ProcedureParameter.Type;
-
-import com.metamatrix.core.util.StringUtil;
-
-/**
- * Reads from {@link DatabaseMetaData} and creates metadata through the {@link MetadataFactory}.
- */
-public class JDBCMetdataProcessor {
-
- /**
- * A holder for table records that keeps track of catalog and schema information.
- */
- private static class TableInfo {
- private String catalog;
- private String schema;
- private String name;
- private Table table;
-
- public TableInfo(String catalog, String schema, String name, Table table) {
- this.catalog = catalog;
- this.schema = schema;
- this.name = name;
- this.table = table;
- }
- }
-
- private boolean importProcedures;
- private boolean importKeys;
- private boolean importIndexes;
- private String procedureNamePattern;
- private boolean useFullSchemaName;
- private String[] tableTypes;
- private String tableNamePattern;
- private String catalog;
- private String schemaPattern;
- private boolean importApproximateIndexes = true;
- private boolean widenUnsingedTypes = true;
- private boolean quoteNameInSource = true;
- //TODO add an option to not fully qualify name in source
-
- private ConnectorLogger logger;
- private Set<String> unsignedTypes = new HashSet<String>();
- private String quoteString;
-
-
-
- public JDBCMetdataProcessor(ConnectorLogger logger) {
- this.logger = logger;
- }
-
- public void getConnectorMetadata(Connection conn, MetadataFactory metadataFactory)
- throws SQLException, ConnectorException {
- DatabaseMetaData metadata = conn.getMetaData();
-
- quoteString = metadata.getIdentifierQuoteString();
- if (quoteString != null && quoteString.trim().length() == 0) {
- quoteString = null;
- }
-
- if (widenUnsingedTypes) {
- ResultSet rs = metadata.getTypeInfo();
- 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) {
- getPrimaryKeys(metadataFactory, metadata, tableMap);
-
- getForeignKeys(metadataFactory, metadata, tableMap);
- }
-
- if (importIndexes) {
- getIndexes(metadataFactory, metadata, tableMap);
- }
-
- if (importProcedures) {
- getProcedures(metadataFactory, metadata);
- }
-
- }
-
- private void getProcedures(MetadataFactory metadataFactory,
- DatabaseMetaData metadata) throws SQLException, ConnectorException {
- logger.logDetail("JDBCMetadataProcessor - Importing procedures"); //$NON-NLS-1$
- ResultSet procedures = metadata.getProcedures(catalog, schemaPattern, procedureNamePattern);
- while (procedures.next()) {
- String procedureCatalog = procedures.getString(1);
- String procedureSchema = procedures.getString(2);
- String procedureName = procedures.getString(3);
- String fullProcedureName = getFullyQualifiedName(procedureCatalog, procedureSchema, procedureName);
- Procedure procedure = metadataFactory.addProcedure(useFullSchemaName?fullProcedureName:procedureName);
- procedure.setNameInSource(getFullyQualifiedName(procedureCatalog, procedureSchema, procedureName, true));
- ResultSet columns = metadata.getProcedureColumns(catalog, procedureSchema, procedureName, null);
- while (columns.next()) {
- 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
- }
- BaseColumn record = null;
- if (columnType == DatabaseMetaData.procedureColumnResult) {
- Column column = metadataFactory.addProcedureResultSetColumn(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), procedure);
- record = column;
- column.setNativeType(typeName);
- } else {
- record = metadataFactory.addProcedureParameter(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), Type.values()[columnType], procedure);
- }
- record.setPrecision(columns.getInt(8));
- record.setLength(columns.getInt(9));
- record.setScale(columns.getInt(10));
- record.setRadix(columns.getInt(11));
- record.setNullType(NullType.values()[columns.getShort(12)]);
- record.setAnnotation(columns.getString(13));
- }
- }
- 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 {
- logger.logDetail("JDBCMetadataProcessor - Importing tables"); //$NON-NLS-1$
- ResultSet tables = metadata.getTables(catalog, schemaPattern, tableNamePattern, tableTypes);
- Map<String, TableInfo> tableMap = new HashMap<String, TableInfo>();
- while (tables.next()) {
- String tableCatalog = tables.getString(1);
- String tableSchema = tables.getString(2);
- String tableName = tables.getString(3);
- String fullName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
- Table table = metadataFactory.addTable(useFullSchemaName?fullName:tableName);
- table.setNameInSource(getFullyQualifiedName(tableCatalog, tableSchema, tableName, true));
- table.setSupportsUpdate(true);
- String remarks = tables.getString(5);
- table.setAnnotation(remarks);
- tableMap.put(fullName, new TableInfo(tableCatalog, tableSchema, tableName, table));
- tableMap.put(tableName, new TableInfo(tableCatalog, tableSchema, tableName, table));
- }
- tables.close();
-
- getColumns(metadataFactory, metadata, tableMap);
- return tableMap;
- }
-
- private void getColumns(MetadataFactory metadataFactory,
- DatabaseMetaData metadata, Map<String, TableInfo> tableMap)
- throws SQLException, ConnectorException {
- logger.logDetail("JDBCMetadataProcessor - Importing columns"); //$NON-NLS-1$
- ResultSet columns = metadata.getColumns(catalog, schemaPattern, tableNamePattern, null);
- int rsColumns = columns.getMetaData().getColumnCount();
- while (columns.next()) {
- String tableCatalog = columns.getString(1);
- String tableSchema = columns.getString(2);
- String tableName = columns.getString(3);
- String fullTableName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
- TableInfo tableInfo = tableMap.get(fullTableName);
- if (tableInfo == null) {
- tableInfo = tableMap.get(tableName);
- if (tableInfo == null) {
- continue;
- }
- }
- 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.setNameInSource(quoteName(columnName));
- column.setNativeType(columns.getString(6));
- column.setRadix(columns.getInt(10));
- column.setNullType(NullType.values()[columns.getShort(11)]);
- column.setUpdatable(true);
- String remarks = columns.getString(12);
- column.setAnnotation(remarks);
- column.setCharOctetLength(columns.getInt(16));
- if (rsColumns >= 23) {
- column.setAutoIncremented("YES".equalsIgnoreCase(columns.getString(23))); //$NON-NLS-1$
- }
- }
- columns.close();
- }
-
- private String quoteName(String name) {
- if (quoteNameInSource) {
- return quoteString + StringUtil.replaceAll(name, quoteString, quoteString + quoteString) + quoteString;
- }
- return name;
- }
-
- private void getPrimaryKeys(MetadataFactory metadataFactory,
- DatabaseMetaData metadata, Map<String, TableInfo> tableMap)
- throws SQLException, ConnectorException {
- logger.logDetail("JDBCMetadataProcessor - Importing primary keys"); //$NON-NLS-1$
- for (TableInfo tableInfo : tableMap.values()) {
- ResultSet pks = metadata.getPrimaryKeys(tableInfo.catalog, tableInfo.schema, tableInfo.name);
- TreeMap<Short, String> keyColumns = null;
- String pkName = null;
- while (pks.next()) {
- String columnName = pks.getString(4);
- short seqNum = pks.getShort(5);
- if (keyColumns == null) {
- keyColumns = new TreeMap<Short, String>();
- }
- keyColumns.put(seqNum, columnName);
- if (pkName == null) {
- pkName = pks.getString(6);
- if (pkName == null) {
- pkName = "PK_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
- }
- }
- }
- if (keyColumns != null) {
- metadataFactory.addPrimaryKey(pkName, new ArrayList<String>(keyColumns.values()), tableInfo.table);
- }
- pks.close();
- }
- }
-
- private void getForeignKeys(MetadataFactory metadataFactory,
- DatabaseMetaData metadata, Map<String, TableInfo> tableMap) throws SQLException, ConnectorException {
- logger.logDetail("JDBCMetadataProcessor - Importing foreign keys"); //$NON-NLS-1$
- for (TableInfo tableInfo : tableMap.values()) {
- ResultSet fks = metadata.getImportedKeys(tableInfo.catalog, tableInfo.schema, tableInfo.name);
- TreeMap<Short, String> keyColumns = null;
- String fkName = null;
- TableInfo pkTable = null;
- short savedSeqNum = Short.MAX_VALUE;
- while (fks.next()) {
- String columnName = fks.getString(8);
- short seqNum = fks.getShort(9);
- if (seqNum <= savedSeqNum) {
- if (keyColumns != null) {
- metadataFactory.addForiegnKey(fkName, new ArrayList<String>(keyColumns.values()), pkTable.table, tableInfo.table);
- }
- keyColumns = new TreeMap<Short, String>();
- fkName = null;
- }
- savedSeqNum = seqNum;
- keyColumns.put(seqNum, columnName);
- if (fkName == null) {
- String tableCatalog = fks.getString(1);
- String tableSchema = fks.getString(2);
- String tableName = fks.getString(3);
- String fullTableName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
- pkTable = tableMap.get(fullTableName);
- if (pkTable == null) {
- throw new ConnectorException(JDBCPlugin.Util.getString("JDBCMetadataProcessor.cannot_find_primary", fullTableName)); //$NON-NLS-1$
- }
- fkName = fks.getString(12);
- if (fkName == null) {
- fkName = "FK_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
- }
- }
- }
- if (keyColumns != null) {
- metadataFactory.addForiegnKey(fkName, new ArrayList<String>(keyColumns.values()), pkTable.table, tableInfo.table);
- }
- fks.close();
- }
- }
-
- private void getIndexes(MetadataFactory metadataFactory,
- DatabaseMetaData metadata, Map<String, TableInfo> tableMap) throws SQLException, ConnectorException {
- logger.logDetail("JDBCMetadataProcessor - Importing index info"); //$NON-NLS-1$
- for (TableInfo tableInfo : tableMap.values()) {
- ResultSet indexInfo = metadata.getIndexInfo(tableInfo.catalog, tableInfo.schema, tableInfo.name, false, importApproximateIndexes);
- TreeMap<Short, String> indexColumns = null;
- String indexName = null;
- short savedOrdinalPosition = Short.MAX_VALUE;
- boolean nonUnique = false;
- while (indexInfo.next()) {
- short type = indexInfo.getShort(7);
- if (type == DatabaseMetaData.tableIndexStatistic) {
- tableInfo.table.setCardinality(indexInfo.getInt(11));
- continue;
- }
- short ordinalPosition = indexInfo.getShort(8);
- if (ordinalPosition <= savedOrdinalPosition) {
- if (indexColumns != null) {
- metadataFactory.addIndex(indexName, nonUnique, new ArrayList<String>(indexColumns.values()), tableInfo.table);
- }
- indexColumns = new TreeMap<Short, String>();
- indexName = null;
- }
- savedOrdinalPosition = ordinalPosition;
- String columnName = indexInfo.getString(9);
- nonUnique = indexInfo.getBoolean(4);
- indexColumns.put(ordinalPosition, columnName);
- if (indexName == null) {
- indexName = indexInfo.getString(6);
- if (indexName == null) {
- indexName = "NDX_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
- }
- }
- }
- if (indexColumns != null) {
- metadataFactory.addIndex(indexName, nonUnique, new ArrayList<String>(indexColumns.values()), tableInfo.table);
- }
- indexInfo.close();
- }
- }
-
- private String getFullyQualifiedName(String catalogName, String schemaName, String objectName) {
- return getFullyQualifiedName(catalogName, schemaName, objectName, false);
- }
-
- private String getFullyQualifiedName(String catalogName, String schemaName, String objectName, boolean quoted) {
- String fullName = (quoted?quoteName(objectName):objectName);
- if (schemaName != null && schemaName.length() > 0) {
- fullName = (quoted?quoteName(schemaName):schemaName) + AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
- }
- if (catalogName != null && catalogName.length() > 0) {
- fullName = (quoted?quoteName(catalogName):catalogName) + AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
- }
- return fullName;
- }
-
-
-
- public void setTableNamePattern(String tableNamePattern) {
- this.tableNamePattern = tableNamePattern;
- }
-
- public void setTableTypes(String[] tableTypes) {
- this.tableTypes = tableTypes;
- }
-
- public void setUseFullSchemaName(boolean useFullSchemaName) {
- this.useFullSchemaName = useFullSchemaName;
- }
-
- public void setProcedureNamePattern(String procedureNamePattern) {
- this.procedureNamePattern = procedureNamePattern;
- }
-
- public void setImportIndexes(boolean importIndexes) {
- this.importIndexes = importIndexes;
- }
-
- public void setImportKeys(boolean importKeys) {
- this.importKeys = importKeys;
- }
-
- public void setImportProcedures(boolean importProcedures) {
- this.importProcedures = importProcedures;
- }
-
- public void setImportApproximateIndexes(boolean importApproximateIndexes) {
- this.importApproximateIndexes = importApproximateIndexes;
- }
-
- public void setWidenUnsingedTypes(boolean widenUnsingedTypes) {
- this.widenUnsingedTypes = widenUnsingedTypes;
- }
-
- public void setQuoteNameInSource(boolean quoteIdentifiers) {
- this.quoteNameInSource = quoteIdentifiers;
- }
-
- // Importer specific properties
- public void setCatalog(String catalog) {
- this.catalog = catalog;
- }
-
- public void setSchemaPattern(String schema) {
- this.schemaPattern = schema;
- }
-
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPlugin.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPlugin.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,41 +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.connector.jdbc;
-
-import java.util.ResourceBundle;
-import com.metamatrix.core.BundleUtil;
-
-/**
- * CommonPlugin
- * <p>Used here in <code>data</code> to have access to the new
- * logging framework for <code>LogManager</code>.</p>
- */
-public class JDBCPlugin { // extends Plugin {
-
- public static final String PLUGIN_ID = "org.teiid.connector.jdbc" ; //$NON-NLS-1$
-
- public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,
- PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCProcedureExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCProcedureExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,116 +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.connector.jdbc;
-
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.language.Argument;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.language.Command;
-
-/**
- */
-public class JDBCProcedureExecution extends JDBCQueryExecution implements ProcedureExecution {
-
- /**
- * @param connection
- * @param sqlTranslator
- * @param logger
- * @param props
- * @param id
- */
- public JDBCProcedureExecution(Command command, Connection connection, ExecutionContext context, JDBCManagedConnectionFactory env) throws ConnectorException {
- super(command, connection, context, env);
- }
-
- @Override
- public void execute() throws ConnectorException {
- Call procedure = (Call)command;
- columnDataTypes = procedure.getResultSetColumnTypes();
-
- //translate command
- TranslatedCommand translatedComm = translateCommand(procedure);
-
- //create statement or CallableStatement and execute
- String sql = translatedComm.getSql();
- try{
- //create parameter index map
- CallableStatement cstmt = getCallableStatement(sql);
- this.results = sqlTranslator.executeStoredProcedure(cstmt, translatedComm, procedure.getReturnType());
- addStatementWarnings();
- }catch(SQLException e){
- throw new ConnectorException(e, JDBCPlugin.Util.getString("JDBCQueryExecution.Error_executing_query__1", sql)); //$NON-NLS-1$
- }
-
- }
-
- @Override
- public List<?> next() throws ConnectorException, DataNotAvailableException {
- if (results == null) {
- return null;
- }
- return super.next();
- }
-
- @Override
- public List<?> getOutputParameterValues() throws ConnectorException {
- try {
- Call proc = (Call)this.command;
- List<Object> result = new ArrayList<Object>();
- int paramIndex = 1;
- if (proc.getReturnType() != null) {
- addParameterValue(result, paramIndex++, proc.getReturnType());
- }
- for (Argument parameter : proc.getArguments()) {
- switch (parameter.getDirection()) {
- case IN:
- paramIndex++;
- break;
- case INOUT:
- case OUT:
- addParameterValue(result, paramIndex++, parameter.getType());
- break;
- }
- }
- return result;
- } catch (SQLException e) {
- throw new ConnectorException(e);
- }
- }
-
- private void addParameterValue(List<Object> result, int paramIndex,
- Class<?> type) throws SQLException {
- Object value = sqlTranslator.retrieveValue((CallableStatement)this.statement, paramIndex, type);
- result.add(value);
- }
-
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,131 +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.connector.jdbc;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.QueryExpression;
-
-
-/**
- *
- */
-public class JDBCQueryExecution extends JDBCBaseExecution implements ResultSetExecution {
-
- // ===========================================================================================================================
- // Fields
- // ===========================================================================================================================
-
- protected ResultSet results;
- protected Command command;
- protected Class<?>[] columnDataTypes;
-
- // ===========================================================================================================================
- // Constructors
- // ===========================================================================================================================
-
- public JDBCQueryExecution(Command command, Connection connection, ExecutionContext context, JDBCManagedConnectionFactory env) throws ConnectorException {
- super(connection, context, env);
- this.command = command;
- }
-
- @Override
- public void execute() throws ConnectorException {
- // get column types
- columnDataTypes = ((QueryExpression)command).getColumnTypes();
-
- // translate command
- TranslatedCommand translatedComm = translateCommand(command);
-
- String sql = translatedComm.getSql();
-
- try {
-
- if (!translatedComm.isPrepared()) {
- results = getStatement().executeQuery(sql);
- } else {
- PreparedStatement pstatement = getPreparedStatement(sql);
- bindPreparedStatementValues(pstatement, translatedComm, 1);
- results = pstatement.executeQuery();
- }
- addStatementWarnings();
- } catch (SQLException e) {
- throw new JDBCExecutionException(e, translatedComm);
- }
- }
-
- @Override
- public List<?> next() throws ConnectorException, DataNotAvailableException {
- try {
- if (results.next()) {
- // New row for result set
- List<Object> vals = new ArrayList<Object>(columnDataTypes.length);
-
- for (int i = 0; i < columnDataTypes.length; i++) {
- // Convert from 0-based to 1-based
- Object value = sqlTranslator.retrieveValue(results, i+1, columnDataTypes[i]);
- vals.add(value);
- }
-
- return vals;
- }
- } catch (SQLException e) {
- throw new ConnectorException(e,
- JDBCPlugin.Util.getString("JDBCTranslator.Unexpected_exception_translating_results___8", e.getMessage())); //$NON-NLS-1$
- }
-
- return null;
- }
-
- /**
- * @see org.teiid.connector.jdbc.JDBCBaseExecution#close()
- */
- public synchronized void close() throws ConnectorException {
- // first we would need to close the result set here then we can close
- // the statement, using the base class.
- if (results != null) {
- try {
- results.close();
- results = null;
- } catch (SQLException e) {
- throw new ConnectorException(e);
- }
- }
- super.close();
- }
-
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCSourceConnection.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCSourceConnection.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCSourceConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,104 +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.connector.jdbc;
-
-import java.sql.SQLException;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.MetadataProvider;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.jdbc.translator.Translator;
-import org.teiid.connector.language.Call;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.QueryExpression;
-import org.teiid.connector.metadata.runtime.MetadataFactory;
-import org.teiid.connector.metadata.runtime.RuntimeMetadata;
-
-import com.metamatrix.common.util.PropertiesUtils;
-
-
-/**
- *
- */
-public class JDBCSourceConnection extends BasicConnection implements MetadataProvider{
- protected java.sql.Connection physicalConnection;
- protected JDBCManagedConnectionFactory environment;
- private Translator sqlTranslator;
-
- public JDBCSourceConnection(java.sql.Connection connection, JDBCManagedConnectionFactory environment) throws ConnectorException {
- this.physicalConnection = connection;
- this.environment = environment;
- this.sqlTranslator = environment.getTranslator();
- this.sqlTranslator.afterConnectionCreation(connection);
- }
-
- @Override
- public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new JDBCQueryExecution(command, this.physicalConnection, executionContext, this.environment);
- }
-
- @Override
- public ProcedureExecution createProcedureExecution(Call command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new JDBCProcedureExecution(command, this.physicalConnection, executionContext, this.environment);
- }
-
- @Override
- public UpdateExecution createUpdateExecution(Command command,
- ExecutionContext executionContext, RuntimeMetadata metadata)
- throws ConnectorException {
- return new JDBCUpdateExecution(command, this.physicalConnection, executionContext, this.environment);
- }
-
- @Override
- public void close() {
- closeSourceConnection();
- }
-
- protected void closeSourceConnection() {
- try {
- this.physicalConnection.close();
- } catch(SQLException e) {
- environment.getLogger().logDetail("Exception during close: " + e.getMessage()); //$NON-NLS-1$
- }
- }
-
- @Override
- public void getConnectorMetadata(MetadataFactory metadataFactory) throws ConnectorException {
- try {
- JDBCMetdataProcessor metadataProcessor = new JDBCMetdataProcessor(this.environment.getLogger());
- PropertiesUtils.setBeanProperties(metadataProcessor, metadataFactory.getImportProperties(), "importer"); //$NON-NLS-1$
- metadataProcessor.getConnectorMetadata(this.physicalConnection, metadataFactory);
- } catch (SQLException e) {
- throw new ConnectorException(e);
- }
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,256 +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.connector.jdbc;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.language.BatchedUpdates;
-import org.teiid.connector.language.Command;
-import org.teiid.connector.language.Literal;
-
-
-/**
- */
-public class JDBCUpdateExecution extends JDBCBaseExecution implements UpdateExecution {
-
- private Command command;
- private int[] result;
-
- /**
- * @param connection
- * @param sqlTranslator
- * @param logger
- * @param props
- * @param id
- */
- public JDBCUpdateExecution(Command command, Connection connection, ExecutionContext context, JDBCManagedConnectionFactory env) throws ConnectorException {
- super(connection, context, env);
- this.command = command;
- }
-
- // ===========================================================================================================================
- // Methods
- // ===========================================================================================================================
-
- @Override
- public void execute() throws ConnectorException {
- if (command instanceof BatchedUpdates) {
- result = execute(((BatchedUpdates)command));
- } else {
- // translate command
- TranslatedCommand translatedComm = translateCommand(command);
-
- result = executeTranslatedCommand(translatedComm);
- }
- }
-
- /**
- * @see com.metamatrix.data.api.BatchedUpdatesExecution#execute(org.teiid.connector.language.Command[])
- * @since 4.2
- */
- public int[] execute(BatchedUpdates batchedCommand) throws ConnectorException {
- boolean succeeded = false;
-
- boolean commitType = getAutoCommit(null);
- Command[] commands = batchedCommand.getUpdateCommands().toArray(new Command[batchedCommand.getUpdateCommands().size()]);
- int[] results = new int[commands.length];
-
- TranslatedCommand tCommand = null;
-
- try {
- // temporarily turn the auto commit off, and set it back to what it was
- // before at the end of the command execution.
- if (commitType) {
- connection.setAutoCommit(false);
- }
-
- List<TranslatedCommand> executedCmds = new ArrayList<TranslatedCommand>();
-
- TranslatedCommand previousCommand = null;
-
- for (int i = 0; i < commands.length; i++) {
- tCommand = translateCommand(commands[i]);
- if (tCommand.isPrepared()) {
- PreparedStatement pstmt = null;
- if (previousCommand != null && previousCommand.isPrepared() && previousCommand.getSql().equals(tCommand.getSql())) {
- pstmt = (PreparedStatement)statement;
- } else {
- if (!executedCmds.isEmpty()) {
- executeBatch(i, results, executedCmds);
- }
- pstmt = getPreparedStatement(tCommand.getSql());
- }
- bindPreparedStatementValues(pstmt, tCommand, 1);
- pstmt.addBatch();
- } else {
- if (previousCommand != null && previousCommand.isPrepared()) {
- executeBatch(i, results, executedCmds);
- getStatement();
- }
- if (statement == null) {
- getStatement();
- }
- statement.addBatch(tCommand.getSql());
- }
- executedCmds.add(tCommand);
- previousCommand = tCommand;
- }
- if (!executedCmds.isEmpty()) {
- executeBatch(commands.length, results, executedCmds);
- }
- succeeded = true;
- } catch (SQLException e) {
- throw new JDBCExecutionException(e, tCommand);
- } finally {
- if (commitType) {
- restoreAutoCommit(!succeeded, null);
- }
- }
-
- return results;
- }
-
- private void executeBatch(int commandCount,
- int[] results,
- List<TranslatedCommand> commands) throws ConnectorException {
- try {
- int[] batchResults = statement.executeBatch();
- addStatementWarnings();
- for (int j = 0; j < batchResults.length; j++) {
- results[commandCount - 1 - j] = batchResults[batchResults.length - 1 - j];
- }
- commands.clear();
- } catch (SQLException err) {
- throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()]));
- }
- }
-
- /**
- * @param translatedComm
- * @throws ConnectorException
- * @since 4.3
- */
- private int[] executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
- // create statement or PreparedStatement and execute
- String sql = translatedComm.getSql();
- boolean commitType = false;
- boolean succeeded = false;
- try {
- int updateCount = 0;
- if (!translatedComm.isPrepared()) {
- updateCount = getStatement().executeUpdate(sql);
- } else {
- PreparedStatement pstatement = getPreparedStatement(sql);
- int rowCount = 1;
- for (int i = 0; i< translatedComm.getPreparedValues().size(); i++) {
- Literal paramValue = (Literal)translatedComm.getPreparedValues().get(i);
- if (paramValue.isMultiValued()) {
- rowCount = ((List<?>)paramValue.getValue()).size();
- break;
- }
- }
- if (rowCount > 1) {
- commitType = getAutoCommit(translatedComm);
- if (commitType) {
- connection.setAutoCommit(false);
- }
- }
- bindPreparedStatementValues(pstatement, translatedComm, rowCount);
- if (rowCount > 1) {
- int[] results = pstatement.executeBatch();
-
- for (int i=0; i<results.length; i++) {
- updateCount += results[i];
- }
- succeeded = true;
- } else {
- updateCount = pstatement.executeUpdate();
- }
- }
- addStatementWarnings();
- return new int[] {updateCount};
- } catch (SQLException err) {
- throw new JDBCExecutionException(err, translatedComm);
- } finally {
- if (commitType) {
- restoreAutoCommit(!succeeded, translatedComm);
- }
- }
- }
-
- /**
- * @param command
- * @return
- * @throws ConnectorException
- */
- private boolean getAutoCommit(TranslatedCommand tCommand) throws ConnectorException {
- if (this.context.isTransactional()) {
- return false;
- }
- try {
- return connection.getAutoCommit();
- } catch (SQLException err) {
- throw new JDBCExecutionException(err, tCommand);
- }
- }
-
- /**
- * If the auto comm
- *
- * @param exceptionOccurred
- * @param command
- * @throws ConnectorException
- */
- private void restoreAutoCommit(boolean exceptionOccurred,
- TranslatedCommand tCommand) throws ConnectorException {
- try {
- if (exceptionOccurred) {
- connection.rollback();
- }
- } catch (SQLException err) {
- throw new JDBCExecutionException(err, tCommand);
- } finally {
- try {
- connection.commit(); // in JbossAs setAutocommit = true does not trigger the commit.
- connection.setAutoCommit(true);
- } catch (SQLException err) {
- throw new JDBCExecutionException(err, tCommand);
- }
- }
- }
-
- @Override
- public int[] getUpdateCounts() throws DataNotAvailableException,
- ConnectorException {
- return result;
- }
-}
Deleted: trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,274 +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.connector.jdbc;
-
-import java.util.List;
-
-
-/**
- * This is a "simple" capabilities class that allows criteria but no
- * complicated joins, subqueries, etc to be passed to the connector.
- * This capabilities class may come in handy for testing and for
- * sources that support JDBC but don't support extended JDBC capabilities.
- */
-public class SimpleCapabilities extends JDBCCapabilities {
-
- public SimpleCapabilities() {
- }
-
- @Override
- public int getMaxInCriteriaSize() {
- return 250;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
- */
- public boolean supportsCompareCriteriaEquals() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteria()
- */
- public boolean supportsInCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsIsNullCriteria()
- */
- public boolean supportsIsNullCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteria()
- */
- public boolean supportsLikeCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsNotCriteria()
- */
- public boolean supportsNotCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrCriteria()
- */
- public boolean supportsOrCriteria() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelectDistinct()
- */
- public boolean supportsSelectDistinct() {
- return true;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAliasedGroup()
- */
- public boolean supportsAliasedGroup() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelfJoins()
- */
- public boolean supportsSelfJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOuterJoins()
- */
- public boolean supportsOuterJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsFullOuterJoins()
- */
- public boolean supportsFullOuterJoins() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsBetweenCriteria()
- */
- public boolean supportsBetweenCriteria() {
- return false;
- }
-
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
- */
- public boolean supportsLikeCriteriaEscapeCharacter() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteriaSubquery()
- */
- public boolean supportsInCriteriaSubquery() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsExistsCriteria()
- */
- public boolean supportsExistsCriteria() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
- */
- public boolean supportsQuantifiedCompareCriteriaSome() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
- */
- public boolean supportsQuantifiedCompareCriteriaAll() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrderBy()
- */
- public boolean supportsOrderBy() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesSum()
- */
- public boolean supportsAggregatesSum() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesAvg()
- */
- public boolean supportsAggregatesAvg() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMin()
- */
- public boolean supportsAggregatesMin() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMax()
- */
- public boolean supportsAggregatesMax() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCount()
- */
- public boolean supportsAggregatesCount() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCountStar()
- */
- public boolean supportsAggregatesCountStar() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesDistinct()
- */
- public boolean supportsAggregatesDistinct() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsScalarSubqueries()
- */
- public boolean supportsScalarSubqueries() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCorrelatedSubqueries()
- */
- public boolean supportsCorrelatedSubqueries() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCaseExpressions()
- */
- public boolean supportsCaseExpressions() {
- return false;
- }
-
- /*
- * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSearchedCaseExpressions()
- */
- public boolean supportsSearchedCaseExpressions() {
- return false;
- }
-
- /**
- * Return null to indicate no functions are supported.
- * @return null
- * @see org.teiid.connector.api.ConnectorCapabilities#getSupportedFunctions()
- */
- public List getSupportedFunctions() {
- return null;
- }
-
- public boolean supportsInlineViews() {
- return false;
- }
-
- /**
- * @see org.teiid.connector.api.ConnectorCapabilities#supportsUnions()
- * @since 4.2
- */
- public boolean supportsUnions() {
- return false;
- }
-
- @Override
- public boolean supportsInsertWithQueryExpression() {
- return false;
- }
-
-}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCBaseExecution.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCBaseExecution.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCBaseExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,221 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.Statement;
+import java.util.List;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Literal;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ */
+public abstract class JDBCBaseExecution extends BasicExecution {
+
+ // ===========================================================================================================================
+ // Fields
+ // ===========================================================================================================================
+
+ // Passed to constructor
+ protected Connection connection;
+ protected Translator sqlTranslator;
+ protected ExecutionContext context;
+
+ // Derived from properties
+ protected boolean trimString;
+ protected int fetchSize;
+ protected int maxResultRows;
+
+ // Set during execution
+ protected Statement statement;
+
+ // ===========================================================================================================================
+ // Constructors
+ // ===========================================================================================================================
+
+ protected JDBCBaseExecution(Connection connection, ExecutionContext context, JDBCExecutionFactory env, Translator translator) {
+ this.connection = connection;
+ this.sqlTranslator = translator;
+ this.context = context;
+
+ trimString = env.isTrimStrings();
+ fetchSize = (env.getFetchSize() != -1)?env.getFetchSize():context.getBatchSize();
+ maxResultRows = env.getMaxResultRows();
+
+ //if the connector work needs to throw an excpetion, set the size plus 1
+ if (maxResultRows > 0 && env.isExceptionOnMaxRows()) {
+ maxResultRows++;
+ }
+ if (maxResultRows > 0) {
+ fetchSize = Math.min(fetchSize, maxResultRows);
+ }
+ }
+
+ /**
+ * Return true if this is a batched update
+ */
+ protected void bindPreparedStatementValues(PreparedStatement stmt, TranslatedCommand tc, int rowCount) throws SQLException {
+ List<?> params = tc.getPreparedValues();
+
+ for (int row = 0; row < rowCount; row++) {
+ for (int i = 0; i< params.size(); i++) {
+ Literal paramValue = (Literal)params.get(i);
+ Object value = paramValue.getValue();
+ if (paramValue.isMultiValued()) {
+ value = ((List<?>)value).get(row);
+ }
+ Class<?> paramType = paramValue.getType();
+ sqlTranslator.bindValue(stmt, value, paramType, i+1);
+ }
+ if (rowCount > 1) {
+ stmt.addBatch();
+ }
+ }
+ }
+
+ // ===========================================================================================================================
+ // Methods
+ // ===========================================================================================================================
+
+ protected TranslatedCommand translateCommand(Command command) throws ConnectorException {
+ TranslatedCommand translatedCommand = new TranslatedCommand(context, sqlTranslator);
+ translatedCommand.translateCommand(command);
+
+ if (translatedCommand.getSql() != null && LogManager.isMessageToBeRecorded(LogConstants.CTX_CONNECTOR, MessageLevel.DETAIL)) {
+ LogManager.logDetail("Source-specific command: " + translatedCommand.getSql()); //$NON-NLS-1$
+ }
+
+ return translatedCommand;
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#close()
+ */
+ public synchronized void close() throws ConnectorException {
+ try {
+ if (statement != null) {
+ statement.close();
+ }
+ if (connection != null) {
+ connection.close();
+ }
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#cancel()
+ */
+ public synchronized void cancel() throws ConnectorException {
+ // if both the DBMS and driver support aborting an SQL
+ try {
+ if (statement != null) {
+ statement.cancel();
+ }
+ } catch (SQLException e) {
+ // Defect 16187 - DataDirect does not support the cancel() method for
+ // Statement.cancel() for DB2 and Informix. Here we are tolerant
+ // of these and other JDBC drivers that do not support the cancel() operation.
+ }
+ }
+
+ protected void setSizeContraints(Statement statement) throws SQLException {
+ if (maxResultRows > 0) {
+ statement.setMaxRows(maxResultRows);
+ }
+ statement.setFetchSize(fetchSize);
+ }
+
+ protected synchronized Statement getStatement() throws SQLException {
+ if (statement != null) {
+ statement.close();
+ statement = null;
+ }
+ statement = connection.createStatement();
+ setSizeContraints(statement);
+ return statement;
+ }
+
+ protected synchronized CallableStatement getCallableStatement(String sql) throws SQLException {
+ if (statement != null) {
+ statement.close();
+ statement = null;
+ }
+ statement = connection.prepareCall(sql);
+ setSizeContraints(statement);
+ return (CallableStatement)statement;
+ }
+
+ protected synchronized PreparedStatement getPreparedStatement(String sql) throws SQLException {
+ if (statement != null) {
+ statement.close();
+ statement = null;
+ }
+ statement = connection.prepareStatement(sql);
+ setSizeContraints(statement);
+ return (PreparedStatement)statement;
+ }
+
+ /**
+ * Returns the JDBC connection used by the execution object.
+ *
+ * @return Returns the connection.
+ * @since 4.1.1
+ */
+ public Connection getConnection() {
+ return this.connection;
+ }
+
+ public Translator getSqlTranslator() {
+ return sqlTranslator;
+ }
+
+ public void addStatementWarnings() throws SQLException {
+ SQLWarning warning = this.statement.getWarnings();
+ while (warning != null) {
+ SQLWarning toAdd = warning;
+ warning = toAdd.getNextWarning();
+ toAdd.setNextException(null);
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_CONNECTOR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(context.getRequestIdentifier() + " Warning: ", warning); //$NON-NLS-1$
+ }
+ context.addWarning(toAdd);
+ }
+ this.statement.clearWarnings();
+ }
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCBaseExecution.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,331 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+
+/**
+ */
+public class JDBCCapabilities extends BasicConnectorCapabilities {
+
+ /**
+ *
+ */
+ public JDBCCapabilities() {
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ return Arrays.asList(new String[] { "+", "-", "*", "/" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#getMaxInCriteriaSize()
+ * @since 4.2
+ */
+ public int getMaxInCriteriaSize() {
+ return 1000;
+ }
+
+ @Override
+ public boolean supportsGroupBy() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesAvg()
+ */
+ public boolean supportsAggregatesAvg() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCount()
+ */
+ public boolean supportsAggregatesCount() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCountStar()
+ */
+ public boolean supportsAggregatesCountStar() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesDistinct()
+ */
+ public boolean supportsAggregatesDistinct() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMax()
+ */
+ public boolean supportsAggregatesMax() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMin()
+ */
+ public boolean supportsAggregatesMin() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesSum()
+ */
+ public boolean supportsAggregatesSum() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAliasedGroup()
+ */
+ public boolean supportsAliasedGroup() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsBetweenCriteria()
+ */
+ public boolean supportsBetweenCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCaseExpressions()
+ */
+ public boolean supportsCaseExpressions() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCompareCriteriaEquals()
+ */
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCorrelatedSubqueries()
+ */
+ public boolean supportsCorrelatedSubqueries() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsExistsCriteria()
+ */
+ public boolean supportsExistsCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsFullOuterJoins()
+ */
+ public boolean supportsFullOuterJoins() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteria()
+ */
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteriaSubquery()
+ */
+ public boolean supportsInCriteriaSubquery() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsIsNullCriteria()
+ */
+ public boolean supportsIsNullCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteria()
+ */
+ public boolean supportsLikeCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
+ */
+ public boolean supportsLikeCriteriaEscapeCharacter() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsNotCriteria()
+ */
+ public boolean supportsNotCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrCriteria()
+ */
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrderBy()
+ */
+ public boolean supportsOrderBy() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsOrderByUnrelated() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOuterJoins()
+ */
+ public boolean supportsOuterJoins() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
+ */
+ public boolean supportsQuantifiedCompareCriteriaAll() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsScalarSubqueries()
+ */
+ public boolean supportsScalarSubqueries() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSearchedCaseExpressions()
+ */
+ public boolean supportsSearchedCaseExpressions() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSelectDistinct()
+ */
+ public boolean supportsSelectDistinct() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSelfJoins()
+ */
+ public boolean supportsSelfJoins() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsInlineViews()
+ */
+ public boolean supportsInlineViews() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
+ */
+ public boolean supportsQuantifiedCompareCriteriaSome() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsSetQueryOrderBy()
+ */
+ @Override
+ public boolean supportsSetQueryOrderBy() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsUnions()
+ */
+ public boolean supportsUnions() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBulkUpdate() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchedUpdates() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsCompareCriteriaOrdered() {
+ return true;
+ }
+
+ @Override
+ public SupportedJoinCriteria getSupportedJoinCriteria() {
+ return SupportedJoinCriteria.ANY;
+ }
+
+ @Override
+ public boolean supportsHaving() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInnerJoins() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSelectExpression() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return true;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCCapabilities.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionException.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionException.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionException.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,42 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.SQLException;
+import java.util.Arrays;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.translator.jdbc.JDBCPlugin;
+import org.teiid.translator.jdbc.TranslatedCommand;
+
+
+public class JDBCExecutionException extends ConnectorException {
+
+ private static final long serialVersionUID = 1758087499488916573L;
+
+ public JDBCExecutionException(SQLException error,
+ TranslatedCommand... commands) {
+ super(error.getErrorCode(), commands == null ? error.getMessage() : JDBCPlugin.Util.getString("JDBCQueryExecution.Error_executing_query__1", //$NON-NLS-1$
+ error.getMessage(), Arrays.toString(commands)));
+ }
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,230 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.sql.DataSource;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.MetadataProvider;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TranslatorProperty;
+import org.teiid.resource.cci.UpdateExecution;
+import org.teiid.translator.jdbc.Translator;
+
+import com.metamatrix.common.util.PropertiesUtils;
+import com.metamatrix.core.MetaMatrixCoreException;
+import com.metamatrix.core.util.ReflectionHelper;
+import com.metamatrix.core.util.StringUtil;
+
+/**
+ * JDBC implementation of Connector interface.
+ */
+public class JDBCExecutionFactory extends BasicExecutionFactory implements MetadataProvider {
+
+ private ConnectorCapabilities capabilities;
+ private Translator sqlTranslator;
+ private boolean useBindVariables;
+ private String databaseTimeZone;
+ private String extensionTranslationClassName;
+ private boolean trimStrings;
+ private boolean useCommentsInSourceQuery;
+ private int fetchSize;
+
+ @Override
+ public void start() throws ConnectorException {
+ super.start();
+ capabilities = getTranslator().getConnectorCapabilities();
+ }
+
+ public Translator getTranslator() throws ConnectorException {
+ if (this.sqlTranslator == null) {
+ try {
+ String className = getExtensionTranslationClassName();
+ if (!StringUtil.isValid(className)) {
+ this.sqlTranslator = new Translator();
+ } else {
+ this.sqlTranslator = (Translator)ReflectionHelper.create(className, null, Thread.currentThread().getContextClassLoader());
+ }
+ sqlTranslator.initialize(this);
+ } catch (MetaMatrixCoreException e) {
+ throw new ConnectorException(e);
+ }
+ }
+ return this.sqlTranslator;
+ }
+
+ @Override
+ public ConnectorCapabilities getCapabilities() {
+ return capabilities;
+ }
+
+ @TranslatorProperty(name="UseBindVariables", display="Use Bind Variables", description="Use prepared statements and bind variables",advanced=true, defaultValue="false")
+ public boolean isUseBindVariables() {
+ return this.useBindVariables;
+ }
+
+ public void setUseBindVariables(boolean useBindVariables) {
+ this.useBindVariables = useBindVariables;
+ }
+
+ @TranslatorProperty(name="DatabaseTimeZone", display="Database time zone", description="Time zone of the database, if different than Integration Server", advanced=true)
+ public String getDatabaseTimeZone() {
+ return this.databaseTimeZone;
+ }
+
+ public void setDatabaseTimeZone(String databaseTimeZone) {
+ this.databaseTimeZone = databaseTimeZone;
+ }
+
+ @TranslatorProperty(name="ExtensionTranslationClassName", display="Extension SQL Translation Class", required=true,
+ defaultValue="org.teiid.translator.jdbc.translator.Translator",
+ allowed= {"org.teiid.translator.jdbc.translator.Translator",
+ "org.teiid.translator.jdbc.access.AccessSQLTranslator",
+ "org.teiid.translator.jdbc.db2.DB2SQLTranslator",
+ "org.teiid.translator.jdbc.derby.DerbySQLTranslator",
+ "org.teiid.translator.jdbc.h2.H2Translator",
+ "org.teiid.translator.jdbc.hsql.HsqlTranslator",
+ "org.teiid.translator.jdbc.mysql.MySQLTranslator",
+ "org.teiid.translator.jdbc.mysql.MySQL5Translator",
+ "org.teiid.translator.jdbc.oracle.OracleSQLTranslator",
+ "org.teiid.translator.jdbc.postgresql.PostgreSQLTranslator",
+ "org.teiid.translator.jdbc.sqlserver.SqlServerSQLTranslator",
+ "org.teiid.translator.jdbc.sybase.SybaseSQLTranslator"
+ })
+ public String getExtensionTranslationClassName() {
+ return this.extensionTranslationClassName;
+ }
+
+ public void setExtensionTranslationClassName(String extensionTranslationClassName) {
+ this.extensionTranslationClassName = extensionTranslationClassName;
+ }
+
+ @TranslatorProperty(name="TrimStrings",display="Trim string flag", description="Right Trim fixed character types returned as Strings - note that the native type must be char or nchar and the source must support the rtrim function.",advanced=true, defaultValue="false")
+ public boolean isTrimStrings() {
+ return this.trimStrings;
+ }
+
+ public void setTrimStrings(boolean trimStrings) {
+ this.trimStrings = trimStrings;
+ }
+
+ @TranslatorProperty(name="UseCommentsInSourceQuery", display="Use informational comments in Source Queries", description="This will embed /*comment*/ style comment with session/request id in source SQL query for informational purposes", advanced=true, defaultValue="false")
+ public boolean isUseCommentsInSourceQuery() {
+ return this.useCommentsInSourceQuery;
+ }
+
+ public void setUseCommentsInSourceQuery(boolean useCommentsInSourceQuery) {
+ this.useCommentsInSourceQuery = useCommentsInSourceQuery;
+ }
+
+
+ @TranslatorProperty(name="FetchSize", display="FetCh Size", description="fetch size used from the connector to its underlying source.", advanced=true, defaultValue="1024")
+ public int getFetchSize() {
+ return this.fetchSize;
+ }
+
+ @Override
+ public boolean isSourceRequired() {
+ return true;
+ }
+
+ public void setFetchSize(int fetchSize) {
+ this.fetchSize = fetchSize;
+ }
+
+ @Override
+ public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ DataSource ds = (DataSource)connectionFactory;
+ Connection conn = ds.getConnection();
+ //TODO: This is not correct; this should be only called once for connection creation
+ getTranslator().afterConnectionCreation(conn);
+ return new JDBCQueryExecution(command, conn, executionContext, this, getTranslator());
+ } catch(SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ DataSource ds = (DataSource)connectionFactory;
+ Connection conn = ds.getConnection();
+ //TODO: This is not correct; this should be only called once for connection creation
+ getTranslator().afterConnectionCreation(conn);
+ return new JDBCProcedureExecution(command, conn, executionContext, this, getTranslator());
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public UpdateExecution createUpdateExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ DataSource ds = (DataSource)connectionFactory;
+ Connection conn = ds.getConnection();
+
+ //TODO: This is not correct; this should be only called once for connection creation
+ getTranslator().afterConnectionCreation(conn);
+ return new JDBCUpdateExecution(command, conn, executionContext, this, getTranslator());
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public void getConnectorMetadata(MetadataFactory metadataFactory, Object connectionFactory) throws ConnectorException {
+ try {
+ Connection conn = null;
+ try {
+ DataSource ds = (DataSource)connectionFactory;
+ conn = ds.getConnection();
+
+ JDBCMetdataProcessor metadataProcessor = new JDBCMetdataProcessor();
+ PropertiesUtils.setBeanProperties(metadataProcessor, metadataFactory.getImportProperties(), "importer"); //$NON-NLS-1$
+ metadataProcessor.getConnectorMetadata(conn, metadataFactory);
+ } finally {
+ if (conn != null) {
+ conn.close();
+ }
+ }
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCExecutionFactory.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCMetdataProcessor.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCMetdataProcessor.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCMetdataProcessor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,435 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.Connection;
+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.metadata.runtime.AbstractMetadataRecord;
+import org.teiid.connector.metadata.runtime.BaseColumn;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.Procedure;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
+import org.teiid.connector.metadata.runtime.ProcedureParameter.Type;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.JDBCPlugin;
+
+import com.metamatrix.core.util.StringUtil;
+
+/**
+ * Reads from {@link DatabaseMetaData} and creates metadata through the {@link MetadataFactory}.
+ */
+public class JDBCMetdataProcessor {
+
+ /**
+ * A holder for table records that keeps track of catalog and schema information.
+ */
+ private static class TableInfo {
+ private String catalog;
+ private String schema;
+ private String name;
+ private Table table;
+
+ public TableInfo(String catalog, String schema, String name, Table table) {
+ this.catalog = catalog;
+ this.schema = schema;
+ this.name = name;
+ this.table = table;
+ }
+ }
+
+ private boolean importProcedures;
+ private boolean importKeys;
+ private boolean importIndexes;
+ private String procedureNamePattern;
+ private boolean useFullSchemaName;
+ private String[] tableTypes;
+ private String tableNamePattern;
+ private String catalog;
+ private String schemaPattern;
+ private boolean importApproximateIndexes = true;
+ private boolean widenUnsingedTypes = true;
+ private boolean quoteNameInSource = true;
+ //TODO add an option to not fully qualify name in source
+
+ private Set<String> unsignedTypes = new HashSet<String>();
+ private String quoteString;
+
+ public void getConnectorMetadata(Connection conn, MetadataFactory metadataFactory)
+ throws SQLException, ConnectorException {
+ DatabaseMetaData metadata = conn.getMetaData();
+
+ quoteString = metadata.getIdentifierQuoteString();
+ if (quoteString != null && quoteString.trim().length() == 0) {
+ quoteString = null;
+ }
+
+ if (widenUnsingedTypes) {
+ ResultSet rs = metadata.getTypeInfo();
+ 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) {
+ getPrimaryKeys(metadataFactory, metadata, tableMap);
+
+ getForeignKeys(metadataFactory, metadata, tableMap);
+ }
+
+ if (importIndexes) {
+ getIndexes(metadataFactory, metadata, tableMap);
+ }
+
+ if (importProcedures) {
+ getProcedures(metadataFactory, metadata);
+ }
+
+ }
+
+ private void getProcedures(MetadataFactory metadataFactory,
+ DatabaseMetaData metadata) throws SQLException, ConnectorException {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing procedures"); //$NON-NLS-1$
+ ResultSet procedures = metadata.getProcedures(catalog, schemaPattern, procedureNamePattern);
+ while (procedures.next()) {
+ String procedureCatalog = procedures.getString(1);
+ String procedureSchema = procedures.getString(2);
+ String procedureName = procedures.getString(3);
+ String fullProcedureName = getFullyQualifiedName(procedureCatalog, procedureSchema, procedureName);
+ Procedure procedure = metadataFactory.addProcedure(useFullSchemaName?fullProcedureName:procedureName);
+ procedure.setNameInSource(getFullyQualifiedName(procedureCatalog, procedureSchema, procedureName, true));
+ ResultSet columns = metadata.getProcedureColumns(catalog, procedureSchema, procedureName, null);
+ while (columns.next()) {
+ 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
+ }
+ BaseColumn record = null;
+ if (columnType == DatabaseMetaData.procedureColumnResult) {
+ Column column = metadataFactory.addProcedureResultSetColumn(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), procedure);
+ record = column;
+ column.setNativeType(typeName);
+ } else {
+ record = metadataFactory.addProcedureParameter(columnName, TypeFacility.getDataTypeNameFromSQLType(sqlType), Type.values()[columnType], procedure);
+ }
+ record.setPrecision(columns.getInt(8));
+ record.setLength(columns.getInt(9));
+ record.setScale(columns.getInt(10));
+ record.setRadix(columns.getInt(11));
+ record.setNullType(NullType.values()[columns.getShort(12)]);
+ record.setAnnotation(columns.getString(13));
+ }
+ }
+ 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 {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing tables"); //$NON-NLS-1$
+ ResultSet tables = metadata.getTables(catalog, schemaPattern, tableNamePattern, tableTypes);
+ Map<String, TableInfo> tableMap = new HashMap<String, TableInfo>();
+ while (tables.next()) {
+ String tableCatalog = tables.getString(1);
+ String tableSchema = tables.getString(2);
+ String tableName = tables.getString(3);
+ String fullName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
+ Table table = metadataFactory.addTable(useFullSchemaName?fullName:tableName);
+ table.setNameInSource(getFullyQualifiedName(tableCatalog, tableSchema, tableName, true));
+ table.setSupportsUpdate(true);
+ String remarks = tables.getString(5);
+ table.setAnnotation(remarks);
+ tableMap.put(fullName, new TableInfo(tableCatalog, tableSchema, tableName, table));
+ tableMap.put(tableName, new TableInfo(tableCatalog, tableSchema, tableName, table));
+ }
+ tables.close();
+
+ getColumns(metadataFactory, metadata, tableMap);
+ return tableMap;
+ }
+
+ private void getColumns(MetadataFactory metadataFactory,
+ DatabaseMetaData metadata, Map<String, TableInfo> tableMap)
+ throws SQLException, ConnectorException {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing columns"); //$NON-NLS-1$
+ ResultSet columns = metadata.getColumns(catalog, schemaPattern, tableNamePattern, null);
+ int rsColumns = columns.getMetaData().getColumnCount();
+ while (columns.next()) {
+ String tableCatalog = columns.getString(1);
+ String tableSchema = columns.getString(2);
+ String tableName = columns.getString(3);
+ String fullTableName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
+ TableInfo tableInfo = tableMap.get(fullTableName);
+ if (tableInfo == null) {
+ tableInfo = tableMap.get(tableName);
+ if (tableInfo == null) {
+ continue;
+ }
+ }
+ 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.setNameInSource(quoteName(columnName));
+ column.setNativeType(columns.getString(6));
+ column.setRadix(columns.getInt(10));
+ column.setNullType(NullType.values()[columns.getShort(11)]);
+ column.setUpdatable(true);
+ String remarks = columns.getString(12);
+ column.setAnnotation(remarks);
+ column.setCharOctetLength(columns.getInt(16));
+ if (rsColumns >= 23) {
+ column.setAutoIncremented("YES".equalsIgnoreCase(columns.getString(23))); //$NON-NLS-1$
+ }
+ }
+ columns.close();
+ }
+
+ private String quoteName(String name) {
+ if (quoteNameInSource) {
+ return quoteString + StringUtil.replaceAll(name, quoteString, quoteString + quoteString) + quoteString;
+ }
+ return name;
+ }
+
+ private void getPrimaryKeys(MetadataFactory metadataFactory,
+ DatabaseMetaData metadata, Map<String, TableInfo> tableMap)
+ throws SQLException, ConnectorException {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing primary keys"); //$NON-NLS-1$
+ for (TableInfo tableInfo : tableMap.values()) {
+ ResultSet pks = metadata.getPrimaryKeys(tableInfo.catalog, tableInfo.schema, tableInfo.name);
+ TreeMap<Short, String> keyColumns = null;
+ String pkName = null;
+ while (pks.next()) {
+ String columnName = pks.getString(4);
+ short seqNum = pks.getShort(5);
+ if (keyColumns == null) {
+ keyColumns = new TreeMap<Short, String>();
+ }
+ keyColumns.put(seqNum, columnName);
+ if (pkName == null) {
+ pkName = pks.getString(6);
+ if (pkName == null) {
+ pkName = "PK_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
+ }
+ }
+ }
+ if (keyColumns != null) {
+ metadataFactory.addPrimaryKey(pkName, new ArrayList<String>(keyColumns.values()), tableInfo.table);
+ }
+ pks.close();
+ }
+ }
+
+ private void getForeignKeys(MetadataFactory metadataFactory,
+ DatabaseMetaData metadata, Map<String, TableInfo> tableMap) throws SQLException, ConnectorException {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing foreign keys"); //$NON-NLS-1$
+ for (TableInfo tableInfo : tableMap.values()) {
+ ResultSet fks = metadata.getImportedKeys(tableInfo.catalog, tableInfo.schema, tableInfo.name);
+ TreeMap<Short, String> keyColumns = null;
+ String fkName = null;
+ TableInfo pkTable = null;
+ short savedSeqNum = Short.MAX_VALUE;
+ while (fks.next()) {
+ String columnName = fks.getString(8);
+ short seqNum = fks.getShort(9);
+ if (seqNum <= savedSeqNum) {
+ if (keyColumns != null) {
+ metadataFactory.addForiegnKey(fkName, new ArrayList<String>(keyColumns.values()), pkTable.table, tableInfo.table);
+ }
+ keyColumns = new TreeMap<Short, String>();
+ fkName = null;
+ }
+ savedSeqNum = seqNum;
+ keyColumns.put(seqNum, columnName);
+ if (fkName == null) {
+ String tableCatalog = fks.getString(1);
+ String tableSchema = fks.getString(2);
+ String tableName = fks.getString(3);
+ String fullTableName = getFullyQualifiedName(tableCatalog, tableSchema, tableName);
+ pkTable = tableMap.get(fullTableName);
+ if (pkTable == null) {
+ throw new ConnectorException(JDBCPlugin.Util.getString("JDBCMetadataProcessor.cannot_find_primary", fullTableName)); //$NON-NLS-1$
+ }
+ fkName = fks.getString(12);
+ if (fkName == null) {
+ fkName = "FK_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
+ }
+ }
+ }
+ if (keyColumns != null) {
+ metadataFactory.addForiegnKey(fkName, new ArrayList<String>(keyColumns.values()), pkTable.table, tableInfo.table);
+ }
+ fks.close();
+ }
+ }
+
+ private void getIndexes(MetadataFactory metadataFactory,
+ DatabaseMetaData metadata, Map<String, TableInfo> tableMap) throws SQLException, ConnectorException {
+ LogManager.logDetail("JDBCMetadataProcessor - Importing index info"); //$NON-NLS-1$
+ for (TableInfo tableInfo : tableMap.values()) {
+ ResultSet indexInfo = metadata.getIndexInfo(tableInfo.catalog, tableInfo.schema, tableInfo.name, false, importApproximateIndexes);
+ TreeMap<Short, String> indexColumns = null;
+ String indexName = null;
+ short savedOrdinalPosition = Short.MAX_VALUE;
+ boolean nonUnique = false;
+ while (indexInfo.next()) {
+ short type = indexInfo.getShort(7);
+ if (type == DatabaseMetaData.tableIndexStatistic) {
+ tableInfo.table.setCardinality(indexInfo.getInt(11));
+ continue;
+ }
+ short ordinalPosition = indexInfo.getShort(8);
+ if (ordinalPosition <= savedOrdinalPosition) {
+ if (indexColumns != null) {
+ metadataFactory.addIndex(indexName, nonUnique, new ArrayList<String>(indexColumns.values()), tableInfo.table);
+ }
+ indexColumns = new TreeMap<Short, String>();
+ indexName = null;
+ }
+ savedOrdinalPosition = ordinalPosition;
+ String columnName = indexInfo.getString(9);
+ nonUnique = indexInfo.getBoolean(4);
+ indexColumns.put(ordinalPosition, columnName);
+ if (indexName == null) {
+ indexName = indexInfo.getString(6);
+ if (indexName == null) {
+ indexName = "NDX_" + tableInfo.table.getName().toUpperCase(); //$NON-NLS-1$
+ }
+ }
+ }
+ if (indexColumns != null) {
+ metadataFactory.addIndex(indexName, nonUnique, new ArrayList<String>(indexColumns.values()), tableInfo.table);
+ }
+ indexInfo.close();
+ }
+ }
+
+ private String getFullyQualifiedName(String catalogName, String schemaName, String objectName) {
+ return getFullyQualifiedName(catalogName, schemaName, objectName, false);
+ }
+
+ private String getFullyQualifiedName(String catalogName, String schemaName, String objectName, boolean quoted) {
+ String fullName = (quoted?quoteName(objectName):objectName);
+ if (schemaName != null && schemaName.length() > 0) {
+ fullName = (quoted?quoteName(schemaName):schemaName) + AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
+ }
+ if (catalogName != null && catalogName.length() > 0) {
+ fullName = (quoted?quoteName(catalogName):catalogName) + AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
+ }
+ return fullName;
+ }
+
+
+
+ public void setTableNamePattern(String tableNamePattern) {
+ this.tableNamePattern = tableNamePattern;
+ }
+
+ public void setTableTypes(String[] tableTypes) {
+ this.tableTypes = tableTypes;
+ }
+
+ public void setUseFullSchemaName(boolean useFullSchemaName) {
+ this.useFullSchemaName = useFullSchemaName;
+ }
+
+ public void setProcedureNamePattern(String procedureNamePattern) {
+ this.procedureNamePattern = procedureNamePattern;
+ }
+
+ public void setImportIndexes(boolean importIndexes) {
+ this.importIndexes = importIndexes;
+ }
+
+ public void setImportKeys(boolean importKeys) {
+ this.importKeys = importKeys;
+ }
+
+ public void setImportProcedures(boolean importProcedures) {
+ this.importProcedures = importProcedures;
+ }
+
+ public void setImportApproximateIndexes(boolean importApproximateIndexes) {
+ this.importApproximateIndexes = importApproximateIndexes;
+ }
+
+ public void setWidenUnsingedTypes(boolean widenUnsingedTypes) {
+ this.widenUnsingedTypes = widenUnsingedTypes;
+ }
+
+ public void setQuoteNameInSource(boolean quoteIdentifiers) {
+ this.quoteNameInSource = quoteIdentifiers;
+ }
+
+ // Importer specific properties
+ public void setCatalog(String catalog) {
+ this.catalog = catalog;
+ }
+
+ public void setSchemaPattern(String schema) {
+ this.schemaPattern = schema;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCMetdataProcessor.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCProcedureExecution.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCProcedureExecution.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,118 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.translator.jdbc.JDBCPlugin;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+
+/**
+ */
+public class JDBCProcedureExecution extends JDBCQueryExecution implements ProcedureExecution {
+
+ /**
+ * @param connection
+ * @param sqlTranslator
+ * @param logger
+ * @param props
+ * @param id
+ */
+ public JDBCProcedureExecution(Command command, Connection connection, ExecutionContext context, JDBCExecutionFactory env, Translator translator) {
+ super(command, connection, context, env, translator);
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ Call procedure = (Call)command;
+ columnDataTypes = procedure.getResultSetColumnTypes();
+
+ //translate command
+ TranslatedCommand translatedComm = translateCommand(procedure);
+
+ //create statement or CallableStatement and execute
+ String sql = translatedComm.getSql();
+ try{
+ //create parameter index map
+ CallableStatement cstmt = getCallableStatement(sql);
+ this.results = sqlTranslator.executeStoredProcedure(cstmt, translatedComm, procedure.getReturnType());
+ addStatementWarnings();
+ }catch(SQLException e){
+ throw new ConnectorException(e, JDBCPlugin.Util.getString("JDBCQueryExecution.Error_executing_query__1", sql)); //$NON-NLS-1$
+ }
+
+ }
+
+ @Override
+ public List<?> next() throws ConnectorException, DataNotAvailableException {
+ if (results == null) {
+ return null;
+ }
+ return super.next();
+ }
+
+ @Override
+ public List<?> getOutputParameterValues() throws ConnectorException {
+ try {
+ Call proc = (Call)this.command;
+ List<Object> result = new ArrayList<Object>();
+ int paramIndex = 1;
+ if (proc.getReturnType() != null) {
+ addParameterValue(result, paramIndex++, proc.getReturnType());
+ }
+ for (Argument parameter : proc.getArguments()) {
+ switch (parameter.getDirection()) {
+ case IN:
+ paramIndex++;
+ break;
+ case INOUT:
+ case OUT:
+ addParameterValue(result, paramIndex++, parameter.getType());
+ break;
+ }
+ }
+ return result;
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ private void addParameterValue(List<Object> result, int paramIndex,
+ Class<?> type) throws SQLException {
+ Object value = sqlTranslator.retrieveValue((CallableStatement)this.statement, paramIndex, type);
+ result.add(value);
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCProcedureExecution.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCQueryExecution.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCQueryExecution.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCQueryExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,133 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.translator.jdbc.JDBCPlugin;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ *
+ */
+public class JDBCQueryExecution extends JDBCBaseExecution implements ResultSetExecution {
+
+ // ===========================================================================================================================
+ // Fields
+ // ===========================================================================================================================
+
+ protected ResultSet results;
+ protected Command command;
+ protected Class<?>[] columnDataTypes;
+
+ // ===========================================================================================================================
+ // Constructors
+ // ===========================================================================================================================
+
+ public JDBCQueryExecution(Command command, Connection connection, ExecutionContext context, JDBCExecutionFactory env, Translator translator) {
+ super(connection, context, env, translator);
+ this.command = command;
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ // get column types
+ columnDataTypes = ((QueryExpression)command).getColumnTypes();
+
+ // translate command
+ TranslatedCommand translatedComm = translateCommand(command);
+
+ String sql = translatedComm.getSql();
+
+ try {
+
+ if (!translatedComm.isPrepared()) {
+ results = getStatement().executeQuery(sql);
+ } else {
+ PreparedStatement pstatement = getPreparedStatement(sql);
+ bindPreparedStatementValues(pstatement, translatedComm, 1);
+ results = pstatement.executeQuery();
+ }
+ addStatementWarnings();
+ } catch (SQLException e) {
+ throw new JDBCExecutionException(e, translatedComm);
+ }
+ }
+
+ @Override
+ public List<?> next() throws ConnectorException, DataNotAvailableException {
+ try {
+ if (results.next()) {
+ // New row for result set
+ List<Object> vals = new ArrayList<Object>(columnDataTypes.length);
+
+ for (int i = 0; i < columnDataTypes.length; i++) {
+ // Convert from 0-based to 1-based
+ Object value = sqlTranslator.retrieveValue(results, i+1, columnDataTypes[i]);
+ vals.add(value);
+ }
+
+ return vals;
+ }
+ } catch (SQLException e) {
+ throw new ConnectorException(e,
+ JDBCPlugin.Util.getString("JDBCTranslator.Unexpected_exception_translating_results___8", e.getMessage())); //$NON-NLS-1$
+ }
+
+ return null;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.jdbc.JDBCBaseExecution#close()
+ */
+ public synchronized void close() throws ConnectorException {
+ // first we would need to close the result set here then we can close
+ // the statement, using the base class.
+ if (results != null) {
+ try {
+ results.close();
+ results = null;
+ } catch (SQLException e) {
+ throw new ConnectorException(e);
+ }
+ }
+ super.close();
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCQueryExecution.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCUpdateExecution.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCUpdateExecution.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,257 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.BatchedUpdates;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Literal;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.UpdateExecution;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ */
+public class JDBCUpdateExecution extends JDBCBaseExecution implements UpdateExecution {
+
+ private Command command;
+ private int[] result;
+
+ /**
+ * @param connection
+ * @param sqlTranslator
+ * @param logger
+ * @param props
+ * @param id
+ */
+ public JDBCUpdateExecution(Command command, Connection connection, ExecutionContext context, JDBCExecutionFactory env, Translator translator) {
+ super(connection, context, env, translator);
+ this.command = command;
+ }
+
+ // ===========================================================================================================================
+ // Methods
+ // ===========================================================================================================================
+
+ @Override
+ public void execute() throws ConnectorException {
+ if (command instanceof BatchedUpdates) {
+ result = execute(((BatchedUpdates)command));
+ } else {
+ // translate command
+ TranslatedCommand translatedComm = translateCommand(command);
+
+ result = executeTranslatedCommand(translatedComm);
+ }
+ }
+
+ /**
+ * @see com.metamatrix.data.api.BatchedUpdatesExecution#execute(org.teiid.connector.language.Command[])
+ * @since 4.2
+ */
+ public int[] execute(BatchedUpdates batchedCommand) throws ConnectorException {
+ boolean succeeded = false;
+
+ boolean commitType = getAutoCommit(null);
+ Command[] commands = batchedCommand.getUpdateCommands().toArray(new Command[batchedCommand.getUpdateCommands().size()]);
+ int[] results = new int[commands.length];
+
+ TranslatedCommand tCommand = null;
+
+ try {
+ // temporarily turn the auto commit off, and set it back to what it was
+ // before at the end of the command execution.
+ if (commitType) {
+ connection.setAutoCommit(false);
+ }
+
+ List<TranslatedCommand> executedCmds = new ArrayList<TranslatedCommand>();
+
+ TranslatedCommand previousCommand = null;
+
+ for (int i = 0; i < commands.length; i++) {
+ tCommand = translateCommand(commands[i]);
+ if (tCommand.isPrepared()) {
+ PreparedStatement pstmt = null;
+ if (previousCommand != null && previousCommand.isPrepared() && previousCommand.getSql().equals(tCommand.getSql())) {
+ pstmt = (PreparedStatement)statement;
+ } else {
+ if (!executedCmds.isEmpty()) {
+ executeBatch(i, results, executedCmds);
+ }
+ pstmt = getPreparedStatement(tCommand.getSql());
+ }
+ bindPreparedStatementValues(pstmt, tCommand, 1);
+ pstmt.addBatch();
+ } else {
+ if (previousCommand != null && previousCommand.isPrepared()) {
+ executeBatch(i, results, executedCmds);
+ getStatement();
+ }
+ if (statement == null) {
+ getStatement();
+ }
+ statement.addBatch(tCommand.getSql());
+ }
+ executedCmds.add(tCommand);
+ previousCommand = tCommand;
+ }
+ if (!executedCmds.isEmpty()) {
+ executeBatch(commands.length, results, executedCmds);
+ }
+ succeeded = true;
+ } catch (SQLException e) {
+ throw new JDBCExecutionException(e, tCommand);
+ } finally {
+ if (commitType) {
+ restoreAutoCommit(!succeeded, null);
+ }
+ }
+
+ return results;
+ }
+
+ private void executeBatch(int commandCount,
+ int[] results,
+ List<TranslatedCommand> commands) throws ConnectorException {
+ try {
+ int[] batchResults = statement.executeBatch();
+ addStatementWarnings();
+ for (int j = 0; j < batchResults.length; j++) {
+ results[commandCount - 1 - j] = batchResults[batchResults.length - 1 - j];
+ }
+ commands.clear();
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()]));
+ }
+ }
+
+ /**
+ * @param translatedComm
+ * @throws ConnectorException
+ * @since 4.3
+ */
+ private int[] executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
+ // create statement or PreparedStatement and execute
+ String sql = translatedComm.getSql();
+ boolean commitType = false;
+ boolean succeeded = false;
+ try {
+ int updateCount = 0;
+ if (!translatedComm.isPrepared()) {
+ updateCount = getStatement().executeUpdate(sql);
+ } else {
+ PreparedStatement pstatement = getPreparedStatement(sql);
+ int rowCount = 1;
+ for (int i = 0; i< translatedComm.getPreparedValues().size(); i++) {
+ Literal paramValue = (Literal)translatedComm.getPreparedValues().get(i);
+ if (paramValue.isMultiValued()) {
+ rowCount = ((List<?>)paramValue.getValue()).size();
+ break;
+ }
+ }
+ if (rowCount > 1) {
+ commitType = getAutoCommit(translatedComm);
+ if (commitType) {
+ connection.setAutoCommit(false);
+ }
+ }
+ bindPreparedStatementValues(pstatement, translatedComm, rowCount);
+ if (rowCount > 1) {
+ int[] results = pstatement.executeBatch();
+
+ for (int i=0; i<results.length; i++) {
+ updateCount += results[i];
+ }
+ succeeded = true;
+ } else {
+ updateCount = pstatement.executeUpdate();
+ }
+ }
+ addStatementWarnings();
+ return new int[] {updateCount};
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, translatedComm);
+ } finally {
+ if (commitType) {
+ restoreAutoCommit(!succeeded, translatedComm);
+ }
+ }
+ }
+
+ /**
+ * @param command
+ * @return
+ * @throws ConnectorException
+ */
+ private boolean getAutoCommit(TranslatedCommand tCommand) throws ConnectorException {
+ if (this.context.isTransactional()) {
+ return false;
+ }
+ try {
+ return connection.getAutoCommit();
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, tCommand);
+ }
+ }
+
+ /**
+ * If the auto comm
+ *
+ * @param exceptionOccurred
+ * @param command
+ * @throws ConnectorException
+ */
+ private void restoreAutoCommit(boolean exceptionOccurred,
+ TranslatedCommand tCommand) throws ConnectorException {
+ try {
+ if (exceptionOccurred) {
+ connection.rollback();
+ }
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, tCommand);
+ } finally {
+ try {
+ connection.commit(); // in JbossAs setAutocommit = true does not trigger the commit.
+ connection.setAutoCommit(true);
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, tCommand);
+ }
+ }
+ }
+
+ @Override
+ public int[] getUpdateCounts() throws DataNotAvailableException,
+ ConnectorException {
+ return result;
+ }
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/JDBCUpdateExecution.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/SimpleCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/SimpleCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/SimpleCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,274 @@
+/*
+ * 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.resource.adapter.jdbc;
+
+import java.util.List;
+
+
+/**
+ * This is a "simple" capabilities class that allows criteria but no
+ * complicated joins, subqueries, etc to be passed to the connector.
+ * This capabilities class may come in handy for testing and for
+ * sources that support JDBC but don't support extended JDBC capabilities.
+ */
+public class SimpleCapabilities extends JDBCCapabilities {
+
+ public SimpleCapabilities() {
+ }
+
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 250;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
+ */
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteria()
+ */
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsIsNullCriteria()
+ */
+ public boolean supportsIsNullCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteria()
+ */
+ public boolean supportsLikeCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsNotCriteria()
+ */
+ public boolean supportsNotCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrCriteria()
+ */
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelectDistinct()
+ */
+ public boolean supportsSelectDistinct() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAliasedGroup()
+ */
+ public boolean supportsAliasedGroup() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSelfJoins()
+ */
+ public boolean supportsSelfJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOuterJoins()
+ */
+ public boolean supportsOuterJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsFullOuterJoins()
+ */
+ public boolean supportsFullOuterJoins() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsBetweenCriteria()
+ */
+ public boolean supportsBetweenCriteria() {
+ return false;
+ }
+
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
+ */
+ public boolean supportsLikeCriteriaEscapeCharacter() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsInCriteriaSubquery()
+ */
+ public boolean supportsInCriteriaSubquery() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsExistsCriteria()
+ */
+ public boolean supportsExistsCriteria() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaSome()
+ */
+ public boolean supportsQuantifiedCompareCriteriaSome() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
+ */
+ public boolean supportsQuantifiedCompareCriteriaAll() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsOrderBy()
+ */
+ public boolean supportsOrderBy() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesSum()
+ */
+ public boolean supportsAggregatesSum() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesAvg()
+ */
+ public boolean supportsAggregatesAvg() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMin()
+ */
+ public boolean supportsAggregatesMin() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesMax()
+ */
+ public boolean supportsAggregatesMax() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCount()
+ */
+ public boolean supportsAggregatesCount() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesCountStar()
+ */
+ public boolean supportsAggregatesCountStar() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsAggregatesDistinct()
+ */
+ public boolean supportsAggregatesDistinct() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsScalarSubqueries()
+ */
+ public boolean supportsScalarSubqueries() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCorrelatedSubqueries()
+ */
+ public boolean supportsCorrelatedSubqueries() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCaseExpressions()
+ */
+ public boolean supportsCaseExpressions() {
+ return false;
+ }
+
+ /*
+ * @see com.metamatrix.data.api.ConnectorCapabilities#supportsSearchedCaseExpressions()
+ */
+ public boolean supportsSearchedCaseExpressions() {
+ return false;
+ }
+
+ /**
+ * Return null to indicate no functions are supported.
+ * @return null
+ * @see org.teiid.resource.cci.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List getSupportedFunctions() {
+ return null;
+ }
+
+ public boolean supportsInlineViews() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsUnions()
+ * @since 4.2
+ */
+ public boolean supportsUnions() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/resource/adapter/jdbc/SimpleCapabilities.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.List;
+
+import org.teiid.connector.language.*;
+
+public class AliasModifier extends FunctionModifier {
+ // The alias to use
+ protected String alias;
+
+ /**
+ * Constructor that takes the alias to use for functions.
+ * @param alias The alias to replace the incoming function name with
+ */
+ public AliasModifier(String alias) {
+ this.alias = alias;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ modify(function);
+ return null;
+ }
+
+ protected void modify(Function function) {
+ function.setName(alias);
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/AliasModifier.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ConvertModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ConvertModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ConvertModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,203 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.Literal;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+
+/**
+ * Base class for handling the convert function.
+ * <p>Convert is by far the most complicated pushdown function since it actually
+ * represents a matrix of possible functions. Additionally not every source supports
+ * the same semantics as our conversions.</p>
+ * <p>Each instance of this class makes a best effort at handling converts for for a
+ * given source - compensating for differing string representation, the lack a time type
+ * etc.
+ * <p>The choice of conversion logic is as follows:
+ * <ul>
+ * <li>Look for a specific conversion between the source and target - {@link #addConvert(int, int, FunctionModifier)}</li>
+ * <li>Filter common implicit conversions</li>
+ * <li>Look for a general source conversion - {@link #addSourceConversion(FunctionModifier, int...)}</li>
+ * <li>Look for a general target conversion - {@link #addTypeConversion(FunctionModifier, int...)}</li>
+ * <li>Look for a type mapping, which will replace the target type with the given native type - {@link #addTypeMapping(String, int...)}</li>
+ * <li>Drop the conversion</li>
+ * </ul>
+ */
+public class ConvertModifier extends FunctionModifier {
+
+ public static class FormatModifier extends AliasModifier {
+
+ private String format;
+
+ public FormatModifier(String alias) {
+ super(alias);
+ }
+
+ public FormatModifier(String alias, String format) {
+ super(alias);
+ this.format = format;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ modify(function);
+ if (format == null) {
+ function.getParameters().remove(1);
+ } else {
+ ((Literal)function.getParameters().get(1)).setValue(format);
+ }
+ return null;
+ }
+
+ }
+
+ private Map<Integer, String> typeMapping = new HashMap<Integer, String>();
+ private Map<Integer, FunctionModifier> typeModifier = new HashMap<Integer, FunctionModifier>();
+ private Map<Integer, FunctionModifier> sourceModifier = new HashMap<Integer, FunctionModifier>();
+ private Map<List<Integer>, FunctionModifier> specificConverts = new HashMap<List<Integer>, FunctionModifier>();
+ private boolean booleanNumeric;
+ private boolean wideningNumericImplicit;
+
+ public void addTypeConversion(FunctionModifier convert, int ... targetType) {
+ for (int i : targetType) {
+ this.typeModifier.put(i, convert);
+ }
+ }
+
+ public void addSourceConversion(FunctionModifier convert, int ... sourceType) {
+ for (int i : sourceType) {
+ this.sourceModifier.put(i, convert);
+ }
+ }
+
+ public void addTypeMapping(String nativeType, int ... targetType) {
+ for (int i : targetType) {
+ typeMapping.put(i, nativeType);
+ }
+ }
+
+ public void setWideningNumericImplicit(boolean wideningNumericImplicit) {
+ this.wideningNumericImplicit = wideningNumericImplicit;
+ }
+
+ public void addConvert(int sourceType, int targetType, FunctionModifier convert) {
+ specificConverts.put(Arrays.asList(sourceType, targetType), convert);
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ function.setName("cast"); //$NON-NLS-1$
+ int targetCode = getCode(function.getType());
+ List<Expression> args = function.getParameters();
+ Class<?> srcType = args.get(0).getType();
+ int sourceCode = getCode(srcType);
+
+ List<Integer> convesionCode = Arrays.asList(sourceCode, targetCode);
+ FunctionModifier convert = specificConverts.get(convesionCode);
+ if (convert != null) {
+ return convert.translate(function);
+ }
+
+ boolean implicit = sourceCode == CHAR && targetCode == STRING;
+
+ if (targetCode >= BYTE && targetCode <= BIGDECIMAL) {
+ if (booleanNumeric && sourceCode == BOOLEAN) {
+ sourceCode = BYTE;
+ implicit = targetCode == BYTE;
+ }
+ implicit |= wideningNumericImplicit && sourceCode >= BYTE && sourceCode <= BIGDECIMAL && sourceCode < targetCode;
+ }
+
+ if (!implicit) {
+ convert = this.sourceModifier.get(sourceCode);
+ if (convert != null
+ && (!convert.equals(sourceModifier.get(targetCode)) || sourceCode == targetCode)) { //checks for implicit, but allows for dummy converts
+ return convert.translate(function);
+ }
+
+ convert = this.typeModifier.get(targetCode);
+ if (convert != null
+ && (!convert.equals(typeModifier.get(sourceCode)) || sourceCode == targetCode)) { //checks for implicit, but allows for dummy converts
+ return convert.translate(function);
+ }
+
+ String type = typeMapping.get(targetCode);
+
+ if (type != null
+ && (!type.equals(typeMapping.get(sourceCode)) || sourceCode == targetCode)) { //checks for implicit, but allows for dummy converts
+ ((Literal)function.getParameters().get(1)).setValue(type);
+ return null;
+ }
+ }
+
+ return Arrays.asList(function.getParameters().get(0));
+ }
+
+ public static Function createConvertFunction(LanguageFactory langFactory, Expression expr, String typeName) {
+ Class<?> type = TypeFacility.getDataTypeClass(typeName);
+ return langFactory.createFunction(SourceSystemFunctions.CONVERT,
+ new Expression[] {expr, langFactory.createLiteral(typeName, type)}, type);
+ }
+
+ public void addNumericBooleanConversions() {
+ this.booleanNumeric = true;
+ //number -> boolean
+ this.addTypeConversion(new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ Expression stringValue = function.getParameters().get(0);
+ return Arrays.asList("CASE WHEN ", stringValue, " = 0 THEN 0 WHEN ", stringValue, " IS NOT NULL THEN 1 END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ }, FunctionModifier.BOOLEAN);
+ this.addConvert(FunctionModifier.BOOLEAN, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ Expression booleanValue = function.getParameters().get(0);
+ if (booleanValue instanceof Function) {
+ Function nested = (Function)booleanValue;
+ if (nested.getName().equalsIgnoreCase("convert") && Number.class.isAssignableFrom(nested.getParameters().get(0).getType())) { //$NON-NLS-1$
+ booleanValue = nested.getParameters().get(0);
+ }
+ }
+ return Arrays.asList("CASE WHEN ", booleanValue, " = 0 THEN 'false' WHEN ", booleanValue, " IS NOT NULL THEN 'true' END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ });
+ this.addConvert(FunctionModifier.STRING, FunctionModifier.BOOLEAN, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ Expression stringValue = function.getParameters().get(0);
+ return Arrays.asList("CASE WHEN ", stringValue, " IN ('false', '0') THEN 0 WHEN ", stringValue, " IS NOT NULL THEN 1 END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ });
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ConvertModifier.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,50 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.Function;
+
+
+/**
+ * Wrap a function in standard JDBC escape syntax. In some cases, the
+ * driver can then convert to the correct database syntax for us.
+ * @since 5.0
+ */
+public class EscapeSyntaxModifier extends FunctionModifier {
+
+ /**
+ * @see org.teiid.connector.jdbc.translator.BasicFunctionModifier#translate(org.teiid.connector.language.Function)
+ * @since 5.0
+ */
+ public List<?> translate(Function function) {
+ List<Object> objs = new ArrayList<Object>();
+ objs.add("{fn "); //$NON-NLS-1$
+ objs.add(function);
+ objs.add("}"); //$NON-NLS-1$
+ return objs;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/EscapeSyntaxModifier.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ExtractFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ExtractFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ExtractFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,88 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.connector.language.SQLReservedWords.Tokens;
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+
+/**
+ * Convert the YEAR/MONTH/DAY etc. function into an equivalent Extract function.
+ * Format: EXTRACT(YEAR from Element) or EXTRACT(YEAR from DATE '2004-03-03')
+ */
+public class ExtractFunctionModifier extends FunctionModifier {
+ public static final String YEAR = "YEAR"; //$NON-NLS-1$
+ public static final String QUARTER = "QUARTER"; //$NON-NLS-1$
+ public static final String MONTH = "MONTH"; //$NON-NLS-1$
+ public static final String DAYOFYEAR = "DOY"; //$NON-NLS-1$
+ public static final String DAY = "DAY"; //$NON-NLS-1$
+ public static final String WEEK = "WEEK"; //$NON-NLS-1$
+ public static final String DAYOFWEEK = "DOW"; //$NON-NLS-1$
+ public static final String HOUR = "HOUR"; //$NON-NLS-1$
+ public static final String MINUTE = "MINUTE"; //$NON-NLS-1$
+ public static final String SECOND = "SECOND"; //$NON-NLS-1$
+ public static final String MILLISECONDS = "MILLISECONDS"; //$NON-NLS-1$
+
+ private static Map<String, String> FUNCTION_PART_MAP = new HashMap<String, String>();
+
+ static {
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.WEEK, WEEK);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.DAYOFWEEK, DAYOFWEEK);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.DAYOFYEAR, DAYOFYEAR);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.YEAR, YEAR);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.QUARTER, QUARTER);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.MONTH, MONTH);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.DAYOFMONTH, DAY);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.HOUR, HOUR);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.MINUTE, MINUTE);
+ FUNCTION_PART_MAP.put(SourceSystemFunctions.SECOND, SECOND);
+ }
+
+ public ExtractFunctionModifier() {
+ }
+
+ public List<?> translate(Function function) {
+ List<Expression> args = function.getParameters();
+ List<Object> objs = new ArrayList<Object>();
+ objs.add("EXTRACT("); //$NON-NLS-1$
+ objs.add(FUNCTION_PART_MAP.get(function.getName().toLowerCase()));
+ objs.add(Tokens.SPACE);
+ objs.add(SQLReservedWords.FROM);
+ objs.add(Tokens.SPACE);
+ objs.add(args.get(0));
+ objs.add(Tokens.RPAREN);
+ if (function.getName().toLowerCase().equals(SourceSystemFunctions.DAYOFWEEK)) {
+ objs.add(0, Tokens.LPAREN);
+ objs.add(" + 1)"); //$NON-NLS-1$
+ }
+ return objs;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,102 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.resource.cci.TypeFacility;
+
+
+/**
+ * Implementations of this interface are used to modify Teiid functions
+ * coming in to the connector into alternate datasource-specific language, if
+ * necessary.
+ */
+public abstract class FunctionModifier {
+
+ /*
+ * Public sharing part for the mapping between class and type in format of Map<class->Integer>.
+ */
+ public static final int STRING = 0;
+ public static final int CHAR = 1;
+ public static final int BOOLEAN = 2;
+ public static final int BYTE = 3;
+ public static final int SHORT = 4;
+ public static final int INTEGER = 5;
+ public static final int LONG = 6;
+ public static final int BIGINTEGER = 7;
+ public static final int FLOAT = 8;
+ public static final int DOUBLE = 9;
+ public static final int BIGDECIMAL = 10;
+ public static final int DATE = 11;
+ public static final int TIME = 12;
+ public static final int TIMESTAMP = 13;
+ public static final int OBJECT = 14;
+ public static final int BLOB = 15;
+ public static final int CLOB = 16;
+ public static final int XML = 17;
+
+ private static final Map<Class<?>, Integer> typeMap = new HashMap<Class<?>, Integer>();
+
+ static {
+ typeMap.put(TypeFacility.RUNTIME_TYPES.STRING, new Integer(STRING));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.CHAR, new Integer(CHAR));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.BOOLEAN, new Integer(BOOLEAN));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.BYTE, new Integer(BYTE));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.SHORT, new Integer(SHORT));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.INTEGER, new Integer(INTEGER));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.LONG, new Integer(LONG));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_INTEGER, new Integer(BIGINTEGER));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.FLOAT, new Integer(FLOAT));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.DOUBLE, new Integer(DOUBLE));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.BIG_DECIMAL, new Integer(BIGDECIMAL));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.DATE, new Integer(DATE));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.TIME, new Integer(TIME));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.TIMESTAMP, new Integer(TIMESTAMP));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.OBJECT, new Integer(OBJECT));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.BLOB, new Integer(BLOB));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.CLOB, new Integer(CLOB));
+ typeMap.put(TypeFacility.RUNTIME_TYPES.XML, new Integer(XML));
+ }
+
+ public static int getCode(Class<?> source) {
+ return typeMap.get(source).intValue();
+ }
+
+ /**
+ * Return a List of translated parts ({@link LanguageObject}s and Objects), or null
+ * if this FunctionModifier wishes to rely on the default translation of the
+ * conversion visitor.
+ * @param function IFunction to be translated
+ * @return List of translated parts, or null
+ * @since 4.2
+ */
+ public abstract List<?> translate(Function function);
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/FunctionModifier.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,37 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.ResourceBundle;
+import com.metamatrix.core.BundleUtil;
+
+
+public class JDBCPlugin {
+
+ public static final String PLUGIN_ID = "org.teiid.translator.jdbc" ; //$NON-NLS-1$
+
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,
+ PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCPlugin.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/LocateFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/LocateFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/LocateFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,188 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.Comparison.Operator;
+import org.teiid.resource.cci.TypeFacility;
+
+
+/**
+ * A modifier class that can be used to translate the scalar function
+ * <code>locate(search_string, source_string)</code> and
+ * <code>locate(search_string, source_string, start_index)</code> to a function
+ * or expression that can be used at the data source.
+ * <p>
+ * If the default implementation is used, a function name of LOCATE will be used
+ * for the function name.
+ * <p>
+ * If the default implementation is used, the expression will not be modified if:
+ * <li><code>locate(search_string, source_string)</code> is used</li>
+ * <li><code>locate(search_string, source_string, start_index)</code> is used
+ * and <code>start_index</code> is a literal integer greater then 0</li>
+ * <li>the default function parameter order is used or unspecified</li>
+ * <p>
+ * If the default implementation is used, the expression will be modified if:
+ * <li><code>locate(search_string, source_string, start_index)</code> is used
+ * and <code>start_index</code> is a literal integer less then 1</li>
+ * <li><code>locate(search_string, source_string, start_index)</code> is used
+ * and <code>start_index</code> is not a literal integer</li>
+ * <li>the function parameter order is something other than the default</li>
+ * <p>
+ * If the default implementation is used and the expression is modified, it is
+ * modified to ensure that any literal integer value less than 1 is made equal
+ * to 1 and any non literal value is wrapped by a searched case expression
+ * to ensure that a value of less then 1 will be equal to 1 and the parameter
+ * order matches that of what the data source expects.
+ * <p>
+ * For example:
+ * <li><code>locate('a', 'abcdef')</code> --> <code>LOCATE('a', 'abcdef')</code></li>
+ * <li><code>locate('a', 'abcdef', 2)</code> --> <code>LOCATE('a', 'abcdef', 2)</code></li>
+ * <li><code>locate('a', 'abcdef', 0)</code> --> <code>LOCATE('a', 'abcdef', 1)</code></li>
+ * <li><code>locate('a', 'abcdef', intCol)</code> --> <code>LOCATE('a', 'abcdef', CASE WHEN intCol < 1 THEN 1 ELSE intCol END)</code></li>
+ *
+ * @since 6.2
+ */
+public class LocateFunctionModifier extends AliasModifier {
+
+ public static String LOCATE = "LOCATE"; //$NON-NLS-1$
+
+ private LanguageFactory langFactory;
+ private boolean sourceStringFirst;
+
+ /**
+ * Constructs a {@link BasicFunctionModifier} object that can be used to
+ * translate the scalar function LOCATE() to a source specific scalar
+ * function or expression.
+ *
+ * @param langFactory the language factory associated with translation
+ */
+ public LocateFunctionModifier(LanguageFactory langFactory) {
+ this(langFactory, LOCATE, false);
+ }
+
+ /**
+ * Constructs a {@link BasicFunctionModifier} object that can be used to
+ * translate the scalar function LOCATE() to a source specific scalar
+ * function or expression.
+ *
+ * @param langFactory the language factory associated with translation
+ * @param functionName the function name or alias to be used instead of LOCATE
+ * @param sourceStringFirst
+ */
+ public LocateFunctionModifier(LanguageFactory langFactory, final String functionName, boolean sourceStringFirst) {
+ super(functionName);
+ this.langFactory = langFactory;
+ this.sourceStringFirst = sourceStringFirst;
+ }
+
+ /**
+ * Returns a version of <code>function</code> suitable for executing at the
+ * data source.
+ * <p>
+ * First, a default function name or the value specified during construction
+ * of <code>MODFunctionModifier</code> is set on <code>function</code>.
+ * <p>
+ * If <code>function</code> represents <code>LOCATE(searchStr, sourceStr, startIndex)</code>
+ * and <code>startIndex</code> is a literal value, it is translated for
+ * consistency between the built-in system function
+ * <code>LOCATE(searchStr, sourceStr, startIndex)</code> and the sources
+ * implementation. This is done by calling {@link #getStartIndexExpression(Literal)}
+ * and passing it the literal <code>startIndex</code> value.
+ * <p>
+ * If <code>function</code> represents <code>LOCATE(searchStr, sourceStr, startIndex)</code>
+ * and <code>startIndex</code> is not a literal value, it is translated for
+ * consistency between the built-in system function
+ * <code>LOCATE(searchStr, sourceStr, startIndex)</code> and the sources
+ * implementation. This is done by calling {@link #getStartIndexExpression(Expression)}
+ * and passing it the non-literal <code>startIndex</code> value.
+ * <p>
+ * Finally, <code>function</code>'s parameters may be rearranged depending
+ * on the value specified by {@link ParameterOrder} during construction of
+ * <code>MODFunctionModifier</code>.
+ * <p>
+ * The translated <code>function</code> is then returned.
+ * <p>
+ * For example:
+ * <ul>
+ * <code>locate('a', 'abcdefg') ---> LOCATE('a', 'abcdefg')</code><br />
+ * <code>locate('a', 'abcdefg', 1) ---> LOCATE('a', 'abcdefg', 1)</code><br />
+ * <code>locate('a', 'abcdefg', 1) ---> INSTR('abcdefg', 'a', 1)</code><br />
+ * <code>locate('a', 'abcdefg', -5) ---> INSTR('abcdefg', 'a', 1)</code><br />
+ * <code>locate('a', 'abcdefg', 1) ---> FINDSTR('a', 'abcdefg', 1)</code><br />
+ * <code>locate('a', 'abcdefg', myCol) ---> LOCATE('a', 'abcdefg', CASE WHEN myCol < 1 THEN 1 ELSE myCol END)</code>
+ * </ul>
+ *
+ * @param function the LOCATE function that may need to be modified
+ */
+ public void modify(Function function) {
+ super.modify(function);
+ List<Expression> args = function.getParameters();
+ Expression searchStr = args.get(0);
+ Expression sourceStr = args.get(1);
+
+ // if startIndex was given then we may need to do additional work
+ if (args.size() > 2) {
+ args.set(2, ensurePositiveStartIndex(args.get(2)));
+ }
+ if (sourceStringFirst) {
+ args.set(0, sourceStr);
+ args.set(1, searchStr);
+ }
+ }
+
+ private Expression ensurePositiveStartIndex(Expression startIndex) {
+ if (startIndex instanceof Literal) {
+ Literal literal = (Literal)startIndex;
+ if (literal.getValue() instanceof Integer && ((Integer)literal.getValue() < 1)) {
+ literal.setValue(1);
+ }
+ } else {
+ Comparison whenExpr = langFactory.createCompareCriteria(
+ Operator.LT,
+ startIndex,
+ langFactory.createLiteral(1, Integer.class)
+ );
+ Literal thenExpr = langFactory.createLiteral(1, Integer.class);
+ startIndex = langFactory.createSearchedCaseExpression(Arrays.asList(langFactory.createSearchedWhenCondition(whenExpr, thenExpr)), startIndex, TypeFacility.RUNTIME_TYPES.INTEGER);
+ }
+ return startIndex;
+ }
+
+ /**
+ * Get the instance of {@link LanguageFactory} set during construction.
+ *
+ * @return the <code>ILanguageFactory</code> instance
+ */
+ protected LanguageFactory getLanguageFactory() {
+ return this.langFactory;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/LocateFunctionModifier.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,84 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+
+/**
+ * Adds mod (remainder) support for non-integral types
+ */
+public class ModFunctionModifier extends AliasModifier {
+
+ private Set<Class> supportedTypes = new HashSet<Class>(Arrays.asList(TypeFacility.RUNTIME_TYPES.INTEGER, TypeFacility.RUNTIME_TYPES.LONG));
+
+ private LanguageFactory langFactory;
+
+ public ModFunctionModifier(String modFunction, LanguageFactory langFactory) {
+ this(modFunction, langFactory, null);
+ }
+
+ public ModFunctionModifier(String modFunction, LanguageFactory langFactory, Collection<Class> supportedTypes) {
+ super(modFunction);
+ this.langFactory = langFactory;
+ if (supportedTypes != null) {
+ this.supportedTypes.addAll(supportedTypes);
+ }
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ List<Expression> expressions = function.getParameters();
+ Class<?> type = function.getType();
+ if (supportedTypes.contains(type)) {
+ modify(function);
+ return null;
+ }
+ //x % y => x - sign(x) * floor(abs(x / y)) * y
+ Function divide = langFactory.createFunction(SourceSystemFunctions.DIVIDE_OP, new ArrayList<Expression>(expressions), type);
+
+ Function abs = langFactory.createFunction(SourceSystemFunctions.ABS, Arrays.asList(divide), type);
+
+ Function floor = langFactory.createFunction(SourceSystemFunctions.FLOOR, Arrays.asList(abs), type);
+
+ Function sign = langFactory.createFunction(SourceSystemFunctions.SIGN, Arrays.asList(expressions.get(0)), type);
+
+ List<? extends Expression> multArgs = Arrays.asList(sign, floor, langFactory.createFunction(SourceSystemFunctions.ABS, Arrays.asList(expressions.get(1)), type));
+ Function mult = langFactory.createFunction(SourceSystemFunctions.MULTIPLY_OP, multArgs, type);
+
+ List<Expression> minusArgs = Arrays.asList(expressions.get(0), mult);
+
+ return Arrays.asList(langFactory.createFunction(SourceSystemFunctions.SUBTRACT_OP, minusArgs, type));
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/ModFunctionModifier.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,372 @@
+/*
+ * 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.translator.jdbc;
+
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.ExpressionValueSource;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.In;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.connector.language.Like;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.connector.language.SearchedCase;
+import org.teiid.connector.language.SetClause;
+import org.teiid.connector.language.SortSpecification;
+import org.teiid.connector.language.Argument.Direction;
+import org.teiid.connector.language.SQLReservedWords.Tokens;
+import org.teiid.connector.language.SetQuery.Operation;
+import org.teiid.connector.language.SortSpecification.Ordering;
+import org.teiid.connector.visitor.util.SQLStringVisitor;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.Translator.NullOrder;
+
+
+/**
+ * This visitor takes an ICommand and does DBMS-specific conversion on it
+ * to produce a SQL String. This class is expected to be subclassed.
+ */
+public class SQLConversionVisitor extends SQLStringVisitor{
+
+ private static DecimalFormat DECIMAL_FORMAT =
+ new DecimalFormat("#############################0.0#############################"); //$NON-NLS-1$
+ private static double SCIENTIC_LOW = Math.pow(10, -3);
+ private static double SCIENTIC_HIGH = Math.pow(10, 7);
+
+ private ExecutionContext context;
+ private Translator translator;
+
+ private boolean prepared;
+
+ private List preparedValues = new ArrayList();
+
+ private Set<LanguageObject> recursionObjects = Collections.newSetFromMap(new IdentityHashMap<LanguageObject, Boolean>());
+ private Map<LanguageObject, Object> translations = new IdentityHashMap<LanguageObject, Object>();
+
+ private boolean replaceWithBinding = false;
+
+ public SQLConversionVisitor(Translator translator) {
+ this.translator = translator;
+ this.prepared = translator.usePreparedStatements();
+ }
+
+ @Override
+ public void append(LanguageObject obj) {
+ boolean replacementMode = replaceWithBinding;
+ if (obj instanceof Command || obj instanceof Function) {
+ /*
+ * In general it is not appropriate to use bind values within a function
+ * unless the particulars of the function parameters are know.
+ * As needed, other visitors or modifiers can set the literals used within
+ * a particular function as bind variables.
+ */
+ this.replaceWithBinding = false;
+ }
+ List<?> parts = null;
+ if (!recursionObjects.contains(obj)) {
+ Object trans = this.translations.get(obj);
+ if (trans instanceof List<?>) {
+ parts = (List<?>)trans;
+ } else if (trans instanceof LanguageObject) {
+ obj = (LanguageObject)trans;
+ } else {
+ parts = translator.translate(obj, context);
+ if (parts != null) {
+ this.translations.put(obj, parts);
+ } else {
+ this.translations.put(obj, obj);
+ }
+ }
+ }
+ if (parts != null) {
+ recursionObjects.add(obj);
+ for (Object part : parts) {
+ if(part instanceof LanguageObject) {
+ append((LanguageObject)part);
+ } else {
+ buffer.append(part);
+ }
+ }
+ recursionObjects.remove(obj);
+ } else {
+ super.append(obj);
+ }
+ this.replaceWithBinding = replacementMode;
+ }
+
+ @Override
+ public void visit(SortSpecification obj) {
+ super.visit(obj);
+ NullOrder nullOrder = this.translator.getDefaultNullOrder();
+ if (!this.translator.supportsExplicitNullOrdering() || nullOrder == NullOrder.LOW) {
+ return;
+ }
+ if (obj.getOrdering() == Ordering.ASC) {
+ if (nullOrder != NullOrder.FIRST) {
+ buffer.append(" NULLS FIRST"); //$NON-NLS-1$
+ }
+ } else if (nullOrder == NullOrder.FIRST) {
+ buffer.append(" NULLS LAST"); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @param type
+ * @param object
+ * @param valuesbuffer
+ */
+ private void translateSQLType(Class type, Object obj, StringBuilder valuesbuffer) {
+ if (obj == null) {
+ valuesbuffer.append(SQLReservedWords.NULL);
+ } else {
+ if(Number.class.isAssignableFrom(type)) {
+ boolean useFormatting = false;
+
+ if (Double.class.isAssignableFrom(type)){
+ double value = ((Double)obj).doubleValue();
+ useFormatting = (value <= SCIENTIC_LOW || value >= SCIENTIC_HIGH);
+ }
+ else if (Float.class.isAssignableFrom(type)){
+ float value = ((Float)obj).floatValue();
+ useFormatting = (value <= SCIENTIC_LOW || value >= SCIENTIC_HIGH);
+ }
+ // The formatting is to avoid the so-called "scientic-notation"
+ // where toString will use for numbers greater than 10p7 and
+ // less than 10p-3, where database may not understand.
+ if (useFormatting) {
+ synchronized (DECIMAL_FORMAT) {
+ valuesbuffer.append(DECIMAL_FORMAT.format(obj));
+ }
+ }
+ else {
+ valuesbuffer.append(obj);
+ }
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.BOOLEAN)) {
+ valuesbuffer.append(translator.translateLiteralBoolean((Boolean)obj));
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.TIMESTAMP)) {
+ valuesbuffer.append(translator.translateLiteralTimestamp((Timestamp)obj));
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.TIME)) {
+ valuesbuffer.append(translator.translateLiteralTime((Time)obj));
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.DATE)) {
+ valuesbuffer.append(translator.translateLiteralDate((java.sql.Date)obj));
+ } else {
+ // If obj is string, toSting() will not create a new String
+ // object, it returns it self, so new object creation.
+ valuesbuffer.append(Tokens.QUOTE)
+ .append(escapeString(obj.toString(), Tokens.QUOTE))
+ .append(Tokens.QUOTE);
+ }
+ }
+ }
+
+ /**
+ * @see org.teiid.connector.visitor.util.SQLStringVisitor#visit(org.teiid.connector.language.Call)
+ */
+ public void visit(Call obj) {
+ this.prepared = true;
+ /*
+ * preparedValues is now a list of procedure params instead of just values
+ */
+ this.preparedValues = obj.getArguments();
+ buffer.append(generateSqlForStoredProcedure(obj));
+ }
+
+ /**
+ * @see org.teiid.connector.visitor.util.SQLStringVisitor#visit(org.teiid.connector.language.Literal)
+ */
+ public void visit(Literal obj) {
+ if (this.prepared && (replaceWithBinding || TranslatedCommand.isBindEligible(obj) || obj.isBindValue())) {
+ buffer.append(UNDEFINED_PARAM);
+ preparedValues.add(obj);
+ } else {
+ translateSQLType(obj.getType(), obj.getValue(), buffer);
+ }
+ }
+
+ @Override
+ public void visit(In obj) {
+ replaceWithBinding = true;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(Like obj) {
+ replaceWithBinding = true;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(Comparison obj) {
+ replaceWithBinding = true;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(ExpressionValueSource obj) {
+ replaceWithBinding = true;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(SetClause obj) {
+ replaceWithBinding = true;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(DerivedColumn obj) {
+ replaceWithBinding = false;
+ super.visit(obj);
+ }
+
+ @Override
+ public void visit(SearchedCase obj) {
+ replaceWithBinding = false;
+ super.visit(obj);
+ }
+
+ /**
+ * Set the per-command execution context on this visitor.
+ * @param context ExecutionContext
+ * @since 4.3
+ */
+ public void setExecutionContext(ExecutionContext context) {
+ this.context = context;
+ }
+
+ /**
+ * Retrieve the per-command execution context for this visitor
+ * (intended for subclasses to use).
+ * @return
+ * @since 4.3
+ */
+ protected ExecutionContext getExecutionContext() {
+ return this.context;
+ }
+
+ protected String getSourceComment(Command command) {
+ return this.translator.getSourceComment(this.context, command);
+ }
+
+ /**
+ * This is a generic implementation. Subclass should override this method
+ * if necessary.
+ * @param exec The command for the stored procedure.
+ * @return String to be executed by CallableStatement.
+ */
+ protected String generateSqlForStoredProcedure(Call exec) {
+ StringBuffer prepareCallBuffer = new StringBuffer();
+ prepareCallBuffer.append("{ "); //$NON-NLS-1$
+
+ List<Argument> params = exec.getArguments();
+
+ //check whether a "?" is needed if there are returns
+ boolean needQuestionMark = exec.getReturnType() != null;
+
+ prepareCallBuffer.append(getSourceComment(exec));
+
+ if(needQuestionMark){
+ prepareCallBuffer.append("?="); //$NON-NLS-1$
+ }
+
+ prepareCallBuffer.append(" call ");//$NON-NLS-1$
+ prepareCallBuffer.append(exec.getMetadataObject() != null ? getName(exec.getMetadataObject()) : exec.getProcedureName());
+ prepareCallBuffer.append("("); //$NON-NLS-1$
+
+ int numberOfParameters = 0;
+ for (Argument param : params) {
+ if(param.getDirection() == Direction.IN || param.getDirection() == Direction.OUT || param.getDirection() == Direction.INOUT){
+ if(numberOfParameters > 0){
+ prepareCallBuffer.append(","); //$NON-NLS-1$
+ }
+ prepareCallBuffer.append("?"); //$NON-NLS-1$
+ numberOfParameters++;
+ }
+ }
+ prepareCallBuffer.append(")"); //$NON-NLS-1$
+ prepareCallBuffer.append("}"); //$NON-NLS-1$
+ return prepareCallBuffer.toString();
+ }
+
+ /**
+ * @return the preparedValues
+ */
+ List getPreparedValues() {
+ return this.preparedValues;
+ }
+
+ public boolean isPrepared() {
+ return prepared;
+ }
+
+ public void setPrepared(boolean prepared) {
+ this.prepared = prepared;
+ }
+
+ @Override
+ protected boolean useAsInGroupAlias() {
+ return this.translator.useAsInGroupAlias();
+ }
+
+ @Override
+ protected boolean useParensForSetQueries() {
+ return translator.useParensForSetQueries();
+ }
+
+ @Override
+ protected String replaceElementName(String group, String element) {
+ return translator.replaceElementName(group, element);
+ }
+
+ @Override
+ protected void appendSetOperation(Operation operation) {
+ buffer.append(translator.getSetOperationString(operation));
+ }
+
+ @Override
+ protected boolean useParensForJoins() {
+ return translator.useParensForJoins();
+ }
+
+ protected boolean useSelectLimit() {
+ return translator.useSelectLimit();
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,146 @@
+/*
+ * 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.translator.jdbc;
+
+import java.util.List;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.visitor.util.CollectorVisitor;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.TypeFacility;
+
+
+/**
+ * This is a utility class used to translate an ICommand using a SQLConversionVisitor.
+ * The SQLConversionVisitor should not be invoked directly; this object will use it to
+ * translate the ICommand.
+ */
+public class TranslatedCommand {
+
+ private String sql;
+ private boolean prepared;
+ private List preparedValues;
+
+ private Translator sqlTranslator;
+ private ExecutionContext context;
+
+ /**
+ * Constructor, takes a SQLConversionVisitor subclass
+ * @param visitor a SQLConversionVisitor subclass
+ */
+ public TranslatedCommand(ExecutionContext context, Translator sqlTranslator){
+ this.sqlTranslator = sqlTranslator;
+ this.context = context;
+ }
+
+ /**
+ * The method to cause this object to do it's thing. This method should
+ * be called right after the constructor; afterward, all of the getter methods
+ * can be called to retrieve results.
+ * @param command ICommand to be translated
+ * @throws ConnectorException
+ */
+ public void translateCommand(Command command) throws ConnectorException {
+ SQLConversionVisitor sqlConversionVisitor = sqlTranslator.getSQLConversionVisitor();
+ sqlConversionVisitor.setExecutionContext(context);
+ if (sqlTranslator.usePreparedStatements() || hasBindValue(command)) {
+ sqlConversionVisitor.setPrepared(true);
+ }
+
+ sqlConversionVisitor.append(command);
+ this.sql = sqlConversionVisitor.toString();
+ this.preparedValues = sqlConversionVisitor.getPreparedValues();
+ this.prepared = sqlConversionVisitor.isPrepared();
+ }
+
+ /**
+ * Simple check to see if any values in the command should be replaced with bind values
+ *
+ * @param command
+ * @return
+ */
+ private boolean hasBindValue(Command command) {
+ for (Literal l : CollectorVisitor.collectObjects(Literal.class, command)) {
+ if (l.isBindValue() || isBindEligible(l)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param l
+ * @return
+ */
+ static boolean isBindEligible(Literal l) {
+ return TypeFacility.RUNTIME_TYPES.XML.equals(l.getType())
+ || TypeFacility.RUNTIME_TYPES.CLOB.equals(l.getType())
+ || TypeFacility.RUNTIME_TYPES.BLOB.equals(l.getType())
+ || TypeFacility.RUNTIME_TYPES.OBJECT.equals(l.getType());
+ }
+
+ /**
+ * Return List of values to set on a prepared statement, if
+ * necessary (see {@link #getStatementType})
+ * @return List of values to be set on a prepared statement
+ */
+ public List getPreparedValues() {
+ return preparedValues;
+ }
+
+ /**
+ * Get String SQL of translated command; but use
+ * {@link #nextLargeSetQuerySQL} if this command is
+ * a {@link #isLargeSetQuery large set query}
+ * @return SQL of translated command, or null if the
+ * command is a {@link #isLargeSetQuery large set query}
+ */
+ public String getSql() {
+ return sql;
+ }
+
+ /**
+ * Return the statement type, one of {@link #STMT_TYPE_STATEMENT},
+ * {@link #STMT_TYPE_PREPARED_STATEMENT}, or
+ * {@link #STMT_TYPE_CALLABLE_STATEMENT}
+ * @return statement type of translated command
+ */
+ public boolean isPrepared() {
+ return prepared;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ if (prepared) {
+ sb.append("Prepared Values: ").append(preparedValues).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ sb.append("SQL: ").append(sql); //$NON-NLS-1$
+ return sb.toString();
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/TranslatedCommand.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/Translator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/Translator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,820 @@
+/*
+ * 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.translator.jdbc;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SetQuery;
+import org.teiid.connector.language.Argument.Direction;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+
+import com.metamatrix.core.util.ReflectionHelper;
+
+/**
+ * Base class for creating source SQL queries and retrieving results.
+ * Specific databases should override as necessary.
+ */
+public class Translator {
+
+ public enum NullOrder {
+ HIGH,
+ LOW,
+ FIRST,
+ LAST
+ }
+
+ // Because the retrieveValue() method will be hit for every value of
+ // every JDBC result set returned, we do lots of weird special stuff here
+ // to improve the performance (most importantly to remove big if/else checks
+ // of every possible type.
+
+ private static final Map<Class<?>, Integer> TYPE_CODE_MAP = new HashMap<Class<?>, Integer>();
+
+ private static final int INTEGER_CODE = 0;
+ private static final int LONG_CODE = 1;
+ private static final int DOUBLE_CODE = 2;
+ private static final int BIGDECIMAL_CODE = 3;
+ private static final int SHORT_CODE = 4;
+ private static final int FLOAT_CODE = 5;
+ private static final int TIME_CODE = 6;
+ private static final int DATE_CODE = 7;
+ private static final int TIMESTAMP_CODE = 8;
+ private static final int BLOB_CODE = 9;
+ private static final int CLOB_CODE = 10;
+ private static final int BOOLEAN_CODE = 11;
+
+ static {
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.INTEGER, new Integer(INTEGER_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.LONG, new Integer(LONG_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.DOUBLE, new Integer(DOUBLE_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.BIG_DECIMAL, new Integer(BIGDECIMAL_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.SHORT, new Integer(SHORT_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.FLOAT, new Integer(FLOAT_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.TIME, new Integer(TIME_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.DATE, new Integer(DATE_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.TIMESTAMP, new Integer(TIMESTAMP_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.BLOB, new Integer(BLOB_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.CLOB, new Integer(CLOB_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.BOOLEAN, new Integer(BOOLEAN_CODE));
+ TYPE_CODE_MAP.put(TypeFacility.RUNTIME_TYPES.BYTE, new Integer(SHORT_CODE));
+ }
+
+ private static final ThreadLocal<MessageFormat> COMMENT = new ThreadLocal<MessageFormat>() {
+ protected MessageFormat initialValue() {
+ return new MessageFormat("/*teiid sessionid:{0}, requestid:{1}.{2}*/ "); //$NON-NLS-1$
+ }
+ };
+ public final static TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
+
+ private static final ThreadLocal<Calendar> CALENDAR = new ThreadLocal<Calendar>() {
+ @Override
+ protected Calendar initialValue() {
+ return Calendar.getInstance();
+ }
+ };
+
+ private Map<String, FunctionModifier> functionModifiers = new HashMap<String, FunctionModifier>();
+ private JDBCExecutionFactory environment;
+
+ private boolean useComments;
+ private boolean usePreparedStatements;
+
+ private TypeFacility typeFacility;
+
+ private volatile boolean initialConnection;
+ private boolean trimChar;
+
+ /**
+ * Initialize the SQLTranslator.
+ * @param env
+ * @param metadata
+ * @throws ConnectorException
+ */
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ this.environment = env;
+ this.typeFacility = env.getTypeFacility();
+
+ String timeZone = this.environment.getDatabaseTimeZone();
+ if(timeZone != null && timeZone.trim().length() > 0) {
+ TimeZone tz = TimeZone.getTimeZone(timeZone);
+ if(!DEFAULT_TIME_ZONE.hasSameRules(tz)) {
+ CALENDAR.set(Calendar.getInstance(tz));
+ }
+ }
+
+ this.useComments = this.environment.isUseCommentsInSourceQuery();
+ this.usePreparedStatements = this.environment.isUseBindVariables();
+ trimChar = this.environment.isTrimStrings();
+ }
+
+ /**
+ * Gets the database calendar. This will be set to the time zone
+ * specified by the property {@link JDBCPropertyNames#DATABASE_TIME_ZONE}, or
+ * the local time zone if none is specified.
+ * @return
+ */
+ public Calendar getDatabaseCalendar() {
+ return CALENDAR.get();
+ }
+
+ /**
+ * Gets the {@link LanguageFactory}
+ */
+ public final LanguageFactory getLanguageFactory() {
+ return environment.getLanguageFactory();
+ }
+
+ /**
+ * Return a List of translated parts ({@link LanguageObject}s and Objects), or null
+ * if to rely on the default translation. Override with care.
+ * @param command
+ * @param context
+ * @return
+ */
+ public List<?> translate(LanguageObject obj, ExecutionContext context) {
+ List<?> parts = null;
+ if (obj instanceof Function) {
+ Function function = (Function)obj;
+ if (functionModifiers != null) {
+ FunctionModifier modifier = functionModifiers.get(function.getName().toLowerCase());
+ if (modifier != null) {
+ parts = modifier.translate(function);
+ }
+ }
+ } else if (obj instanceof Command) {
+ parts = translateCommand((Command)obj, context);
+ } else if (obj instanceof Limit) {
+ parts = translateLimit((Limit)obj, context);
+ } else if (obj instanceof ColumnReference) {
+ ColumnReference elem = (ColumnReference)obj;
+ if (trimChar && elem.getType() == TypeFacility.RUNTIME_TYPES.STRING && elem.getMetadataObject() != null
+ && ("char".equalsIgnoreCase(elem.getMetadataObject().getNativeType()) || "nchar".equalsIgnoreCase(elem.getMetadataObject().getNativeType()))) { //$NON-NLS-1$ //$NON-NLS-2$
+ return Arrays.asList(getLanguageFactory().createFunction(SourceSystemFunctions.RTRIM, new Expression[] {elem}, TypeFacility.RUNTIME_TYPES.STRING));
+ }
+ }
+ return parts;
+ }
+
+ /**
+ * Return a List of translated parts ({@link LanguageObject}s and Objects), or null
+ * if to rely on the default translation.
+ * @param command
+ * @param context
+ * @return
+ */
+ public List<?> translateCommand(Command command, ExecutionContext context) {
+ return null;
+ }
+
+ /**
+ * Return a List of translated parts ({@link LanguageObject}s and Objects), or null
+ * if to rely on the default translation.
+ * @param limit
+ * @param context
+ * @return
+ */
+ public List<?> translateLimit(Limit limit, ExecutionContext context) {
+ return null;
+ }
+
+ /**
+ * Return a map of function name in lower case to FunctionModifier.
+ * @return Map of function name to FunctionModifier.
+ */
+ public Map<String, FunctionModifier> getFunctionModifiers() {
+ return functionModifiers;
+ }
+
+ /**
+ * Add the {@link FunctionModifier} to the set of known modifiers.
+ * @param name
+ * @param modifier
+ */
+ public void registerFunctionModifier(String name, FunctionModifier modifier) {
+ this.functionModifiers.put(name, modifier);
+ }
+
+ /**
+ * Subclasses should override this method to provide a different sql translation
+ * of the literal boolean value. By default, a boolean literal is represented as:
+ * <code>'0'</code> or <code>'1'</code>.
+ * @param booleanValue Boolean value, never null
+ * @return Translated string
+ */
+ public String translateLiteralBoolean(Boolean booleanValue) {
+ if(booleanValue.booleanValue()) {
+ return "1"; //$NON-NLS-1$
+ }
+ return "0"; //$NON-NLS-1$
+ }
+
+ /**
+ * Subclasses should override this method to provide a different sql translation
+ * of the literal date value. By default, a date literal is represented as:
+ * <code>{d '2002-12-31'}</code>
+ * @param dateValue Date value, never null
+ * @return Translated string
+ */
+ public String translateLiteralDate(java.sql.Date dateValue) {
+ return "{d '" + formatDateValue(dateValue) + "'}"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Subclasses should override this method to provide a different sql translation
+ * of the literal time value. By default, a time literal is represented as:
+ * <code>{t '23:59:59'}</code>
+ *
+ * See {@link Translator#hasTimeType()} to represent literal times as timestamps.
+ *
+ * @param timeValue Time value, never null
+ * @return Translated string
+ */
+ public String translateLiteralTime(Time timeValue) {
+ if (!hasTimeType()) {
+ return "{ts '1970-01-01 " + formatDateValue(timeValue) + "'}"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return "{t '" + formatDateValue(timeValue) + "'}"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Subclasses should override this method to provide a different sql translation
+ * of the literal timestamp value. By default, a timestamp literal is
+ * represented as: <code>{ts '2002-12-31 23:59:59'}</code>.
+ *
+ * See {@link Translator#getTimestampNanoPrecision()} to control the literal
+ * precision.
+ *
+ * @param timestampValue Timestamp value, never null
+ * @return Translated string
+ */
+ public String translateLiteralTimestamp(Timestamp timestampValue) {
+ return "{ts '" + formatDateValue(timestampValue) + "'}"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Format the dateObject (of type date, time, or timestamp) into a string
+ * using the DatabaseTimeZone format.
+ * @param dateObject
+ * @return Formatted string
+ */
+ public String formatDateValue(java.util.Date dateObject) {
+ if (dateObject instanceof Timestamp && getTimestampNanoPrecision() < 9) {
+ Timestamp ts = (Timestamp)dateObject;
+ Timestamp newTs = new Timestamp(ts.getTime());
+ if (getTimestampNanoPrecision() > 0) {
+ int mask = (int)Math.pow(10, 9-getTimestampNanoPrecision());
+ newTs.setNanos(ts.getNanos()/mask*mask);
+ } else {
+ newTs.setNanos(0);
+ }
+ dateObject = newTs;
+ }
+ return this.environment.getTypeFacility().convertDate(dateObject,
+ DEFAULT_TIME_ZONE, getDatabaseCalendar(), dateObject.getClass()).toString();
+ }
+
+ /**
+ * Returns true to indicate that SQL should include a comment
+ * indicating the session and request ids.
+ */
+ public boolean addSourceComment() {
+ return useComments;
+ }
+
+ /**
+ * Indicates whether group alias should be of the form
+ * "...FROM groupA AS X" or "...FROM groupA X". Certain
+ * data sources (such as Oracle) may not support the first
+ * form.
+ * @return boolean
+ */
+ public boolean useAsInGroupAlias(){
+ return true;
+ }
+
+ /**
+ * Use PreparedStatements (or CallableStatements) as
+ * appropriate for all commands. Bind values will be
+ * determined by the {@link BindValueVisitor}. {@link Literal#setBindValue(boolean)}
+ * can be used to force a literal to be a bind value.
+ */
+ public boolean usePreparedStatements() {
+ return this.usePreparedStatements;
+ }
+
+ /**
+ * Set to true to indicate that every branch of a set query
+ * should have parenthesis, i.e. (query) union (query)
+ * @return
+ */
+ public boolean useParensForSetQueries() {
+ return false;
+ }
+
+ /**
+ * Return false to indicate that time support should be emulated
+ * with timestamps.
+ * @return
+ */
+ public boolean hasTimeType() {
+ return true;
+ }
+
+ /**
+ * Returns the name for a given {@link SetQuery.Operation}
+ * @param operation
+ * @return
+ */
+ public String getSetOperationString(SetQuery.Operation operation) {
+ return operation.toString();
+ }
+
+ /**
+ * Returns the source comment for
+ * @param context
+ * @param command
+ * @return
+ */
+ public String getSourceComment(ExecutionContext context, Command command) {
+ if (addSourceComment() && context != null) {
+ return COMMENT.get().format(new Object[] {context.getConnectionIdentifier(), context.getRequestIdentifier(), context.getPartIdentifier()});
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Override to return a name other than the default [group.]element
+ * @param group
+ * @param element
+ * @return
+ */
+ public String replaceElementName(String group, String element) {
+ return null;
+ }
+
+ /**
+ * Return the precision of timestamp literals. Defaults to 9
+ * @return
+ */
+ public int getTimestampNanoPrecision() {
+ return 9;
+ }
+
+ public TypeFacility getTypeFacility() {
+ return typeFacility;
+ }
+
+ /**
+ * This is a generic implementation. Because different databases handle
+ * stored procedures differently, subclasses should override this method
+ * if necessary.
+ */
+ public ResultSet executeStoredProcedure(CallableStatement statement, TranslatedCommand command, Class<?> returnType) throws SQLException {
+ List params = command.getPreparedValues();
+ int index = 1;
+
+ if(returnType != null){
+ registerSpecificTypeOfOutParameter(statement, returnType, index++);
+ }
+
+ Iterator iter = params.iterator();
+ while(iter.hasNext()){
+ Argument param = (Argument)iter.next();
+
+ if(param.getDirection() == Direction.INOUT){
+ registerSpecificTypeOfOutParameter(statement,param.getType(), index);
+ }else if(param.getDirection() == Direction.OUT){
+ registerSpecificTypeOfOutParameter(statement,param.getType(), index++);
+ }
+
+ if(param.getDirection() == Direction.IN || param.getDirection() == Direction.INOUT){
+ bindValue(statement, param.getArgumentValue().getValue(), param.getType(), index++);
+ }
+ }
+ boolean resultSetNext = statement.execute();
+
+ while (!resultSetNext) {
+ int update_count = statement.getUpdateCount();
+ if (update_count == -1) {
+ break;
+ }
+ resultSetNext = statement.getMoreResults();
+ }
+ return statement.getResultSet();
+ }
+
+ /**
+ * For registering specific output parameter types we need to translate these into the appropriate
+ * java.sql.Types output parameters
+ * We will need to match these up with the appropriate standard sql types
+ * @param cstmt
+ * @param parameter
+ * @throws SQLException
+ */
+ protected void registerSpecificTypeOfOutParameter(CallableStatement statement, Class<?> runtimeType, int index) throws SQLException {
+ int typeToSet = TypeFacility.getSQLTypeFromRuntimeType(runtimeType);
+
+ statement.registerOutParameter(index,typeToSet);
+ }
+
+ /**
+ * Sets prepared statement parameter i with param.
+ *
+ * Performs special handling to translate dates using the database time zone and to
+ * translate biginteger, float, and char to JDBC safe objects.
+ *
+ * @param stmt
+ * @param param
+ * @param paramType
+ * @param i
+ * @param cal
+ * @throws SQLException
+ */
+ public void bindValue(PreparedStatement stmt, Object param, Class<?> paramType, int i) throws SQLException {
+ int type = TypeFacility.getSQLTypeFromRuntimeType(paramType);
+
+ if (param == null) {
+ stmt.setNull(i, type);
+ return;
+ }
+ //if this is a Date object, then use the database calendar
+ if (paramType.equals(TypeFacility.RUNTIME_TYPES.DATE)) {
+ stmt.setDate(i,(java.sql.Date)param, getDatabaseCalendar());
+ return;
+ }
+ if (paramType.equals(TypeFacility.RUNTIME_TYPES.TIME)) {
+ stmt.setTime(i,(java.sql.Time)param, getDatabaseCalendar());
+ return;
+ }
+ if (paramType.equals(TypeFacility.RUNTIME_TYPES.TIMESTAMP)) {
+ stmt.setTimestamp(i,(java.sql.Timestamp)param, getDatabaseCalendar());
+ return;
+ }
+ //convert these the following to jdbc safe values
+ if (TypeFacility.RUNTIME_TYPES.BIG_INTEGER.equals(paramType)) {
+ param = new BigDecimal((BigInteger)param);
+ } else if (TypeFacility.RUNTIME_TYPES.FLOAT.equals(paramType)) {
+ param = new Double(((Float)param).doubleValue());
+ } else if (TypeFacility.RUNTIME_TYPES.CHAR.equals(paramType)) {
+ param = ((Character)param).toString();
+ }
+ stmt.setObject(i, param, type);
+ }
+
+ /**
+ * Retrieve the value on the current resultset row for the given column index.
+ * @param results
+ * @param columnIndex
+ * @param expectedType
+ * @return
+ * @throws SQLException
+ */
+ public Object retrieveValue(ResultSet results, int columnIndex, Class<?> expectedType) throws SQLException {
+ Integer code = TYPE_CODE_MAP.get(expectedType);
+ if(code != null) {
+ // Calling the specific methods here is more likely to get uniform (and fast) results from different
+ // data sources as the driver likely knows the best and fastest way to convert from the underlying
+ // raw form of the data to the expected type. We use a switch with codes in order without gaps
+ // as there is a special bytecode instruction that treats this case as a map such that not every value
+ // needs to be tested, which means it is very fast.
+ switch(code.intValue()) {
+ case INTEGER_CODE: {
+ int value = results.getInt(columnIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Integer.valueOf(value);
+ }
+ case LONG_CODE: {
+ long value = results.getLong(columnIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Long.valueOf(value);
+ }
+ case DOUBLE_CODE: {
+ double value = results.getDouble(columnIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Double.valueOf(value);
+ }
+ case BIGDECIMAL_CODE: {
+ return results.getBigDecimal(columnIndex);
+ }
+ case SHORT_CODE: {
+ short value = results.getShort(columnIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Short.valueOf(value);
+ }
+ case FLOAT_CODE: {
+ float value = results.getFloat(columnIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Float.valueOf(value);
+ }
+ case TIME_CODE: {
+ return results.getTime(columnIndex, getDatabaseCalendar());
+ }
+ case DATE_CODE: {
+ return results.getDate(columnIndex, getDatabaseCalendar());
+ }
+ case TIMESTAMP_CODE: {
+ return results.getTimestamp(columnIndex, getDatabaseCalendar());
+ }
+ case BLOB_CODE: {
+ try {
+ return results.getBlob(columnIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ try {
+ return results.getBytes(columnIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ break;
+ }
+ case CLOB_CODE: {
+ try {
+ return results.getClob(columnIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ break;
+ }
+ case BOOLEAN_CODE: {
+ return results.getBoolean(columnIndex);
+ }
+ }
+ }
+
+ return results.getObject(columnIndex);
+ }
+
+ /**
+ * Retrieve the value for the given parameter index
+ * @param results
+ * @param parameterIndex
+ * @param expectedType
+ * @return
+ * @throws SQLException
+ */
+ public Object retrieveValue(CallableStatement results, int parameterIndex, Class expectedType) throws SQLException{
+ Integer code = TYPE_CODE_MAP.get(expectedType);
+ if(code != null) {
+ switch(code.intValue()) {
+ case INTEGER_CODE: {
+ int value = results.getInt(parameterIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Integer.valueOf(value);
+ }
+ case LONG_CODE: {
+ long value = results.getLong(parameterIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Long.valueOf(value);
+ }
+ case DOUBLE_CODE: {
+ double value = results.getDouble(parameterIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return new Double(value);
+ }
+ case BIGDECIMAL_CODE: {
+ return results.getBigDecimal(parameterIndex);
+ }
+ case SHORT_CODE: {
+ short value = results.getShort(parameterIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return Short.valueOf(value);
+ }
+ case FLOAT_CODE: {
+ float value = results.getFloat(parameterIndex);
+ if(results.wasNull()) {
+ return null;
+ }
+ return new Float(value);
+ }
+ case TIME_CODE: {
+ return results.getTime(parameterIndex, getDatabaseCalendar());
+ }
+ case DATE_CODE: {
+ return results.getDate(parameterIndex, getDatabaseCalendar());
+ }
+ case TIMESTAMP_CODE: {
+ return results.getTimestamp(parameterIndex, getDatabaseCalendar());
+ }
+ case BLOB_CODE: {
+ try {
+ return results.getBlob(parameterIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ try {
+ return results.getBytes(parameterIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ }
+ case CLOB_CODE: {
+ try {
+ return results.getClob(parameterIndex);
+ } catch (SQLException e) {
+ // ignore
+ }
+ }
+ case BOOLEAN_CODE: {
+ return results.getBoolean(parameterIndex);
+ }
+ }
+ }
+
+ // otherwise fall through and call getObject() and rely on the normal
+ // translation routines
+ return results.getObject(parameterIndex);
+ }
+
+ /**
+ * Called exactly once for this source.
+ * @param connection
+ */
+ protected void afterInitialConnectionCreation(Connection connection) {
+ // now dig some details about this driver/database for log.
+ try {
+ StringBuffer sb = new StringBuffer();
+ DatabaseMetaData dbmd = connection.getMetaData();
+ sb.append("Commit=").append(connection.getAutoCommit()); //$NON-NLS-1$
+ sb.append(";DatabaseProductName=").append(dbmd.getDatabaseProductName()); //$NON-NLS-1$
+ sb.append(";DatabaseProductVersion=").append(dbmd.getDatabaseProductVersion()); //$NON-NLS-1$
+ sb.append(";DriverMajorVersion=").append(dbmd.getDriverMajorVersion()); //$NON-NLS-1$
+ sb.append(";DriverMajorVersion=").append(dbmd.getDriverMinorVersion()); //$NON-NLS-1$
+ sb.append(";DriverName=").append(dbmd.getDriverName()); //$NON-NLS-1$
+ sb.append(";DriverVersion=").append(dbmd.getDriverVersion()); //$NON-NLS-1$
+ sb.append(";IsolationLevel=").append(dbmd.getDefaultTransactionIsolation()); //$NON-NLS-1$
+
+ LogManager.logInfo(LogConstants.CTX_CONNECTOR, sb.toString());
+ } catch (SQLException e) {
+ String errorStr = JDBCPlugin.Util.getString("ConnectionListener.failed_to_report_jdbc_connection_details"); //$NON-NLS-1$
+ LogManager.logInfo(LogConstants.CTX_CONNECTOR, errorStr);
+ }
+ }
+
+ /**
+ * Provides a hook to call source specific logic when
+ * a connection is created.
+ *
+ * defect request 13979 & 13978
+ */
+ public void afterConnectionCreation(Connection connection) {
+ if (initialConnection) {
+ synchronized (this) {
+ if (!initialConnection) {
+ return;
+ }
+ initialConnection = false;
+ afterInitialConnectionCreation(connection);
+ }
+ }
+ }
+
+
+
+ /**
+ * Create the {@link SQLConversionVisitor} that will perform translation. Typical custom
+ * JDBC connectors will not need to create custom conversion visitors, rather implementors
+ * should override existing {@link Translator} methods.
+ * @return
+ */
+ public SQLConversionVisitor getSQLConversionVisitor() {
+ return new SQLConversionVisitor(this);
+ }
+
+ /**
+ * Get the default capabilities class. Will be used by {@link #getConnectorCapabilities()} to
+ * return a capabilities instance.
+ * @return
+ */
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return JDBCCapabilities.class;
+ }
+
+ /**
+ * Get the capabilties for the source.
+ * @return
+ * @throws ConnectorException
+ */
+ public ConnectorCapabilities getConnectorCapabilities() throws ConnectorException {
+ // create Capabilities
+ String className = this.environment.getCapabilitiesClass();
+ try {
+ ConnectorCapabilities result = null;
+ if (className != null && className.length() > 0) {
+ result = (ConnectorCapabilities) ReflectionHelper.create(className, null, Thread.currentThread().getContextClassLoader());
+ } else {
+ result = getDefaultCapabilities().newInstance();
+ }
+
+ return result;
+ } catch (Exception e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ /**
+ * Set to true to indicate that every branch of a join
+ * should have parenthesis.
+ * @return
+ */
+ public boolean useParensForJoins() {
+ return false;
+ }
+
+ /**
+ * get the default null ordering
+ * @return
+ */
+ public NullOrder getDefaultNullOrder() {
+ return NullOrder.LOW;
+ }
+
+ /**
+ *
+ * @return true if nulls high|low can be specified
+ */
+ public boolean supportsExplicitNullOrdering() {
+ return false;
+ }
+
+ /**
+ *
+ * @return true if the limit clause is part of the select
+ */
+ public boolean useSelectLimit() {
+ return false;
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/Translator.java
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,46 @@
+/*
+ * 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.translator.jdbc.access;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+public class AccessCapabilities extends JDBCCapabilities{
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrderBy()
+ */
+ public boolean supportsOrderBy() {
+ return false;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/access/AccessSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.translator.jdbc.access;
+
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.translator.jdbc.sybase.SybaseSQLTranslator;
+
+
+public class AccessSQLTranslator extends SybaseSQLTranslator {
+
+ @Override
+ public String translateLiteralBoolean(Boolean booleanValue) {
+ if(booleanValue.booleanValue()) {
+ return "-1"; //$NON-NLS-1$
+ }
+ return "0"; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean addSourceComment() {
+ return false;
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return AccessCapabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2Capabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2Capabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2Capabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,141 @@
+/*
+ * 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.translator.jdbc.db2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+/**
+ */
+public class DB2Capabilities extends JDBCCapabilities {
+
+ public DB2Capabilities() {
+ }
+
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ //supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ //supportedFunctions.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ //supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("RAND"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ //supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ //supportedFunctions.add("TRANSLATE"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("DAY"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsExcept()
+ */
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsIntersect()
+ */
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2SQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2SQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/db2/DB2SQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,159 @@
+/*
+ * 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.translator.jdbc.db2;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.Join;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.Comparison.Operator;
+import org.teiid.connector.language.Join.JoinType;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.LocateFunctionModifier;
+import org.teiid.translator.jdbc.ModFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+
+public class DB2SQLTranslator extends Translator {
+
+ private final class NullHandlingFormatModifier extends
+ ConvertModifier.FormatModifier {
+ private NullHandlingFormatModifier(String alias) {
+ super(alias);
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ Expression arg = function.getParameters().get(0);
+ if (arg instanceof Literal && ((Literal)arg).getValue() == null) {
+ ((Literal)function.getParameters().get(1)).setValue(this.alias);
+ return null;
+ }
+ return super.translate(function);
+ }
+ }
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.CHAR, new AliasModifier("chr")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new AliasModifier("day")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.IFNULL, new AliasModifier("coalesce")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new AliasModifier("substr")); //$NON-NLS-1$
+
+ registerFunctionModifier(SourceSystemFunctions.MOD, new ModFunctionModifier("MOD", getLanguageFactory())); //$NON-NLS-1$
+
+ //add in type conversion
+ ConvertModifier convertModifier = new ConvertModifier();
+ convertModifier.addTypeMapping("real", FunctionModifier.FLOAT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(31,0)", FunctionModifier.BIGINTEGER); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(31,12)", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
+ convertModifier.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convertModifier.addTypeMapping("blob", FunctionModifier.BLOB, FunctionModifier.OBJECT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("clob", FunctionModifier.CLOB, FunctionModifier.XML); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.TIMESTAMP, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("timestamp('1970-01-01', ", function.getParameters().get(0), ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.DATE, FunctionModifier.TIMESTAMP, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("timestamp(",function.getParameters().get(0), ", '00:00:00')"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ //the next convert is not strictly necessary for db2, but it also works for derby
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.FLOAT, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("cast(double(", function.getParameters().get(0), ") as real)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("char"), FunctionModifier.STRING); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("smallint"), FunctionModifier.BYTE, FunctionModifier.SHORT); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("integer"), FunctionModifier.INTEGER); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("bigint"), FunctionModifier.LONG); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("double"), FunctionModifier.DOUBLE); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("date"), FunctionModifier.DATE); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("time"), FunctionModifier.TIME); //$NON-NLS-1$
+ convertModifier.addTypeConversion(new NullHandlingFormatModifier("timestamp"), FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convertModifier.addNumericBooleanConversions();
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<?> translateLimit(Limit limit, ExecutionContext context) {
+ return Arrays.asList("FETCH FIRST ", limit.getRowLimit(), " ROWS ONLY"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public List<?> translate(LanguageObject obj, ExecutionContext context) {
+ //DB2 doesn't support cross join
+ if (obj instanceof Join) {
+ Join join = (Join)obj;
+ if (join.getJoinType() == JoinType.CROSS_JOIN) {
+ Literal one = getLanguageFactory().createLiteral(1, TypeFacility.RUNTIME_TYPES.INTEGER);
+ join.setCondition(getLanguageFactory().createCompareCriteria(Operator.EQ, one, one));
+ join.setJoinType(JoinType.INNER_JOIN);
+ }
+ }
+ //DB2 needs projected nulls wrapped in casts
+ if (obj instanceof DerivedColumn) {
+ DerivedColumn selectSymbol = (DerivedColumn)obj;
+ if (selectSymbol.getExpression() instanceof Literal) {
+ Literal literal = (Literal)selectSymbol.getExpression();
+ if (literal.getValue() == null) {
+ selectSymbol.setExpression(ConvertModifier.createConvertFunction(getLanguageFactory(), literal, TypeFacility.getDataTypeName(literal.getType())));
+ }
+ }
+ }
+ return super.translate(obj, context);
+ }
+
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return DB2Capabilities.class;
+ }
+
+ @Override
+ public NullOrder getDefaultNullOrder() {
+ return NullOrder.HIGH;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbyCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbyCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbyCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,192 @@
+/*
+ * 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.translator.jdbc.derby;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+
+/**
+ * @since 5.0
+ */
+public class DerbyCapabilities extends JDBCCapabilities {
+
+ public static final String TEN_1 = "10.1"; //$NON-NLS-1$
+ public static final String TEN_2 = "10.2"; //$NON-NLS-1$
+ public static final String TEN_4 = "10.4"; //$NON-NLS-1$
+ public static final String TEN_5 = "10.5"; //$NON-NLS-1$
+
+ private String version = TEN_1;
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ if (version.compareTo(TEN_2) >= 0) {
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ }
+ if (version.compareTo(TEN_4) >= 0) {
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ }
+ // These are executed within the server and never pushed down
+ //supportedFunctions.add("BITAND"); //$NON-NLS-1$
+ //supportedFunctions.add("BITNOT"); //$NON-NLS-1$
+ //supportedFunctions.add("BITOR"); //$NON-NLS-1$
+ //supportedFunctions.add("BITXOR"); //$NON-NLS-1$
+ if (version.compareTo(TEN_2) >= 0) {
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ }
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ if (version.compareTo(TEN_2) >= 0) {
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ //supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ //supportedFunctions.add("ROUND"); //$NON-NLS-1$
+ if (version.compareTo(TEN_4) >= 0) {
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ }
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ }
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ //supportedFunctions.add("TAN"); //$NON-NLS-1$
+
+ //supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ //supportedFunctions.add("CHR"); //$NON-NLS-1$
+ //supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ //supportedFunctions.add("INSERT"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ //supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ //supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ //supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ //supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ //supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+
+ // These are executed within the server and never pushed down
+ //supportedFunctions.add("CURDATE"); //$NON-NLS-1$
+ //supportedFunctions.add("CURTIME"); //$NON-NLS-1$
+ //supportedFunctions.add("NOW"); //$NON-NLS-1$
+ //supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ //supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ //supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ //supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ //supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ //supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+ return supportedFunctions;
+ }
+
+ public void setDatabaseVersion(String version) {
+ this.version = version;
+ }
+
+ /**
+ * Derby supports only SearchedCaseExpression, not CaseExpression.
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsCaseExpressions()
+ * @since 5.0
+ */
+ public boolean supportsCaseExpressions() {
+ return false;
+ }
+
+ /**
+ * Derby supports only left and right outer joins.
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFullOuterJoins()
+ * @since 5.0
+ */
+ public boolean supportsFullOuterJoins() {
+ return false;
+ }
+
+ /**
+ * Inline views (subqueries in the FROM clause) are supported.
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsInlineViews()
+ * @since 4.3
+ */
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsExcept()
+ */
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsIntersect()
+ */
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsRowLimit() {
+ return this.version.compareTo(TEN_5) >= 0;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbySQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbySQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/derby/DerbySQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,73 @@
+/*
+ * 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.translator.jdbc.derby;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.EscapeSyntaxModifier;
+import org.teiid.translator.jdbc.db2.DB2SQLTranslator;
+import org.teiid.translator.jdbc.oracle.LeftOrRightFunctionModifier;
+
+
+
+/**
+ * @since 4.3
+ */
+public class DerbySQLTranslator extends DB2SQLTranslator {
+
+ private String version = DerbyCapabilities.TEN_1;
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ //additional derby functions
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.LEFT, new LeftOrRightFunctionModifier(getLanguageFactory()));
+
+ //overrides of db2 functions
+ registerFunctionModifier(SourceSystemFunctions.CONCAT, new EscapeSyntaxModifier());
+ }
+
+ @Override
+ public boolean addSourceComment() {
+ return false;
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return DerbyCapabilities.class;
+ }
+
+ @Override
+ public boolean supportsExplicitNullOrdering() {
+ return version.compareTo(DerbyCapabilities.TEN_4) >= 0;
+ }
+
+ public void setDatabaseVersion(String version) {
+ this.version = version;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Capabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Capabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Capabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,133 @@
+/*
+ * 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.translator.jdbc.h2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+public class H2Capabilities extends JDBCCapabilities {
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+
+ supportedFunctions.add(SourceSystemFunctions.ABS);
+ supportedFunctions.add(SourceSystemFunctions.ACOS);
+ supportedFunctions.add(SourceSystemFunctions.ASIN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN2);
+ supportedFunctions.add(SourceSystemFunctions.BITAND);
+ //supportedFunctions.add(SourceSystemFunctions.BITNOT);
+ supportedFunctions.add(SourceSystemFunctions.BITOR);
+ supportedFunctions.add(SourceSystemFunctions.BITXOR);
+ supportedFunctions.add(SourceSystemFunctions.CEILING);
+ supportedFunctions.add(SourceSystemFunctions.COS);
+ supportedFunctions.add(SourceSystemFunctions.COT);
+ supportedFunctions.add(SourceSystemFunctions.DEGREES);
+ supportedFunctions.add(SourceSystemFunctions.EXP);
+ supportedFunctions.add(SourceSystemFunctions.FLOOR);
+ supportedFunctions.add(SourceSystemFunctions.LOG);
+ supportedFunctions.add(SourceSystemFunctions.LOG10);
+ supportedFunctions.add(SourceSystemFunctions.MOD);
+ supportedFunctions.add(SourceSystemFunctions.PI);
+ supportedFunctions.add(SourceSystemFunctions.POWER);
+ supportedFunctions.add(SourceSystemFunctions.RADIANS);
+ supportedFunctions.add(SourceSystemFunctions.ROUND);
+ supportedFunctions.add(SourceSystemFunctions.SIGN);
+ supportedFunctions.add(SourceSystemFunctions.SIN);
+ supportedFunctions.add(SourceSystemFunctions.SQRT);
+ supportedFunctions.add(SourceSystemFunctions.TAN);
+
+ supportedFunctions.add(SourceSystemFunctions.ASCII);
+ supportedFunctions.add(SourceSystemFunctions.CHAR);
+ supportedFunctions.add(SourceSystemFunctions.CONCAT);
+ supportedFunctions.add(SourceSystemFunctions.INSERT);
+ supportedFunctions.add(SourceSystemFunctions.LCASE);
+ supportedFunctions.add(SourceSystemFunctions.LEFT);
+ supportedFunctions.add(SourceSystemFunctions.LENGTH);
+ supportedFunctions.add(SourceSystemFunctions.LOCATE);
+ supportedFunctions.add(SourceSystemFunctions.LPAD);
+ supportedFunctions.add(SourceSystemFunctions.LTRIM);
+ supportedFunctions.add(SourceSystemFunctions.REPEAT);
+ supportedFunctions.add(SourceSystemFunctions.REPLACE);
+ supportedFunctions.add(SourceSystemFunctions.RIGHT);
+ supportedFunctions.add(SourceSystemFunctions.RPAD);
+ supportedFunctions.add(SourceSystemFunctions.RTRIM);
+ supportedFunctions.add(SourceSystemFunctions.SUBSTRING);
+ supportedFunctions.add(SourceSystemFunctions.UCASE);
+
+ supportedFunctions.add(SourceSystemFunctions.DAYNAME);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFMONTH);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFWEEK);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFYEAR);
+
+ supportedFunctions.add(SourceSystemFunctions.FORMATTIMESTAMP);
+ supportedFunctions.add(SourceSystemFunctions.HOUR);
+ supportedFunctions.add(SourceSystemFunctions.MINUTE);
+ supportedFunctions.add(SourceSystemFunctions.MONTH);
+ supportedFunctions.add(SourceSystemFunctions.MONTHNAME);
+
+ supportedFunctions.add(SourceSystemFunctions.PARSETIMESTAMP);
+ supportedFunctions.add(SourceSystemFunctions.QUARTER);
+ supportedFunctions.add(SourceSystemFunctions.SECOND);
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPADD);
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPDIFF);
+ //supportedFunctions.add(SourceSystemFunctions.TIMESTAMPCREATE);
+ supportedFunctions.add(SourceSystemFunctions.WEEK);
+ supportedFunctions.add(SourceSystemFunctions.YEAR);
+
+ supportedFunctions.add(SourceSystemFunctions.CONVERT);
+ supportedFunctions.add(SourceSystemFunctions.IFNULL);
+ supportedFunctions.add(SourceSystemFunctions.COALESCE);
+ return supportedFunctions;
+ }
+
+ @Override
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsRowOffset() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Translator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Translator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/h2/H2Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,96 @@
+/*
+ * 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.translator.jdbc.h2;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.ModFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.hsql.AddDiffModifier;
+import org.teiid.translator.jdbc.oracle.ConcatFunctionModifier;
+
+public class H2Translator extends Translator {
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.PARSETIMESTAMP, new AliasModifier("parsedatetime")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.FORMATTIMESTAMP, new AliasModifier("formatdatetime")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new AliasModifier("day_of_month")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFWEEK, new AliasModifier("day_of_week")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFYEAR, new AliasModifier("day_of_year")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.MOD, new ModFunctionModifier(SourceSystemFunctions.MOD, getLanguageFactory()));
+ //TODO: this behavior is configurable in h2 starting with 1.1.119
+ registerFunctionModifier(SourceSystemFunctions.CONCAT, new ConcatFunctionModifier(getLanguageFactory()));
+
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new AddDiffModifier(true, getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new AddDiffModifier(false, getLanguageFactory()));
+
+ ConvertModifier convert = new ConvertModifier();
+ convert.addTypeMapping("boolean", FunctionModifier.BOOLEAN); //$NON-NLS-1$
+ convert.addTypeMapping("tinyint", FunctionModifier.BYTE); //$NON-NLS-1$
+ convert.addTypeMapping("smallint", FunctionModifier.SHORT); //$NON-NLS-1$
+ convert.addTypeMapping("int", FunctionModifier.INTEGER); //$NON-NLS-1$
+ convert.addTypeMapping("bigint", FunctionModifier.LONG); //$NON-NLS-1$
+ convert.addTypeMapping("real", FunctionModifier.FLOAT); //$NON-NLS-1$
+ convert.addTypeMapping("double", FunctionModifier.DOUBLE); //$NON-NLS-1$
+ convert.addTypeMapping("decimal", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
+ convert.addTypeMapping("decimal(38,0)", FunctionModifier.BIGINTEGER); //$NON-NLS-1$
+ convert.addTypeMapping("date", FunctionModifier.DATE); //$NON-NLS-1$
+ convert.addTypeMapping("time", FunctionModifier.TIME); //$NON-NLS-1$
+ convert.addTypeMapping("timestamp", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convert.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convert.addTypeMapping("varchar", FunctionModifier.STRING); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convert);
+ }
+
+ @Override
+ public String translateLiteralDate(Date dateValue) {
+ return "DATE '" + formatDateValue(dateValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTime(Time timeValue) {
+ return "TIME '" + formatDateValue(timeValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTimestamp(Timestamp timestampValue) {
+ return "TIMESTAMP '" + formatDateValue(timestampValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return H2Capabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/AddDiffModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,101 @@
+/*
+ * 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.translator.jdbc.hsql;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.ExtractFunctionModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+public class AddDiffModifier extends FunctionModifier {
+
+ private static Map<String, String> INTERVAL_MAP = new HashMap<String, String>();
+
+ static {
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_DAY, ExtractFunctionModifier.DAY);
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_HOUR, ExtractFunctionModifier.HOUR);
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_MINUTE, ExtractFunctionModifier.MINUTE);
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_MONTH, ExtractFunctionModifier.MONTH);
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_SECOND, ExtractFunctionModifier.SECOND);
+ INTERVAL_MAP.put(SQLReservedWords.SQL_TSI_YEAR, ExtractFunctionModifier.YEAR);
+ }
+
+ private boolean add;
+ private LanguageFactory factory;
+
+ public AddDiffModifier(boolean add, LanguageFactory factory) {
+ this.add = add;
+ this.factory = factory;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ if (add) {
+ function.setName("dateadd"); //$NON-NLS-1$
+ } else {
+ function.setName("datediff"); //$NON-NLS-1$
+ }
+ Literal intervalType = (Literal)function.getParameters().get(0);
+ String interval = ((String)intervalType.getValue()).toUpperCase();
+ String newInterval = INTERVAL_MAP.get(interval);
+ if (newInterval != null) {
+ intervalType.setValue(newInterval);
+ return null;
+ }
+ if (add) {
+ if (interval.equals(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+ intervalType.setValue("MILLISECOND"); //$NON-NLS-1$
+ Expression[] args = new Expression[] {function.getParameters().get(1), factory.createLiteral(1000000, TypeFacility.RUNTIME_TYPES.INTEGER)};
+ function.getParameters().set(1, factory.createFunction("/", args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
+ } else if (interval.equals(SQLReservedWords.SQL_TSI_QUARTER)) {
+ intervalType.setValue(ExtractFunctionModifier.DAY);
+ Expression[] args = new Expression[] {function.getParameters().get(1), factory.createLiteral(91, TypeFacility.RUNTIME_TYPES.INTEGER)};
+ function.getParameters().set(1, factory.createFunction("*", args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
+ } else {
+ intervalType.setValue(ExtractFunctionModifier.DAY);
+ Expression[] args = new Expression[] {function.getParameters().get(1), factory.createLiteral(7, TypeFacility.RUNTIME_TYPES.INTEGER)};
+ function.getParameters().set(1, factory.createFunction("*", args, TypeFacility.RUNTIME_TYPES.INTEGER)); //$NON-NLS-1$
+ }
+ return null;
+ }
+ if (interval.equals(SQLReservedWords.SQL_TSI_FRAC_SECOND)) {
+ intervalType.setValue("MILLISECOND"); //$NON-NLS-1$
+ return Arrays.asList(function, " * 1000000"); //$NON-NLS-1$
+ } else if (interval.equals(SQLReservedWords.SQL_TSI_QUARTER)) {
+ intervalType.setValue(ExtractFunctionModifier.DAY);
+ return Arrays.asList(function, " / 91"); //$NON-NLS-1$
+ }
+ intervalType.setValue(ExtractFunctionModifier.DAY);
+ return Arrays.asList(function, " / 7"); //$NON-NLS-1$
+ }
+
+}
\ No newline at end of file
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,133 @@
+/*
+ * 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.translator.jdbc.hsql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+public class HsqlCapabilities extends JDBCCapabilities {
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+
+ supportedFunctions.add(SourceSystemFunctions.ABS);
+ supportedFunctions.add(SourceSystemFunctions.ACOS);
+ supportedFunctions.add(SourceSystemFunctions.ASIN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN2);
+ supportedFunctions.add(SourceSystemFunctions.BITAND);
+ //supportedFunctions.add(SourceSystemFunctions.BITNOT);
+ supportedFunctions.add(SourceSystemFunctions.BITOR);
+ //supportedFunctions.add(SourceSystemFunctions.BITXOR);
+ supportedFunctions.add(SourceSystemFunctions.CEILING);
+ supportedFunctions.add(SourceSystemFunctions.COS);
+ supportedFunctions.add(SourceSystemFunctions.COT);
+ supportedFunctions.add(SourceSystemFunctions.DEGREES);
+ supportedFunctions.add(SourceSystemFunctions.EXP);
+ supportedFunctions.add(SourceSystemFunctions.FLOOR);
+ supportedFunctions.add(SourceSystemFunctions.LOG);
+ supportedFunctions.add(SourceSystemFunctions.LOG10);
+ supportedFunctions.add(SourceSystemFunctions.MOD);
+ supportedFunctions.add(SourceSystemFunctions.PI);
+ supportedFunctions.add(SourceSystemFunctions.POWER);
+ supportedFunctions.add(SourceSystemFunctions.RADIANS);
+ supportedFunctions.add(SourceSystemFunctions.ROUND);
+ supportedFunctions.add(SourceSystemFunctions.SIGN);
+ supportedFunctions.add(SourceSystemFunctions.SIN);
+ supportedFunctions.add(SourceSystemFunctions.SQRT);
+ supportedFunctions.add(SourceSystemFunctions.TAN);
+
+ supportedFunctions.add(SourceSystemFunctions.ASCII);
+ supportedFunctions.add(SourceSystemFunctions.CHAR);
+ supportedFunctions.add(SourceSystemFunctions.CONCAT);
+ supportedFunctions.add(SourceSystemFunctions.INSERT);
+ supportedFunctions.add(SourceSystemFunctions.LCASE);
+ supportedFunctions.add(SourceSystemFunctions.LEFT);
+ supportedFunctions.add(SourceSystemFunctions.LENGTH);
+ supportedFunctions.add(SourceSystemFunctions.LOCATE);
+ supportedFunctions.add(SourceSystemFunctions.LPAD);
+ supportedFunctions.add(SourceSystemFunctions.LTRIM);
+ supportedFunctions.add(SourceSystemFunctions.REPEAT);
+ supportedFunctions.add(SourceSystemFunctions.REPLACE);
+ supportedFunctions.add(SourceSystemFunctions.RIGHT);
+ supportedFunctions.add(SourceSystemFunctions.RPAD);
+ supportedFunctions.add(SourceSystemFunctions.RTRIM);
+ supportedFunctions.add(SourceSystemFunctions.SUBSTRING);
+ supportedFunctions.add(SourceSystemFunctions.UCASE);
+
+ supportedFunctions.add(SourceSystemFunctions.DAYNAME);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFMONTH);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFWEEK);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFYEAR);
+
+ //supportedFunctions.add(SourceSystemFunctions.FORMATDATE);
+ //supportedFunctions.add(SourceSystemFunctions.FORMATTIME);
+ //supportedFunctions.add(SourceSystemFunctions.FORMATTIMESTAMP);
+ supportedFunctions.add(SourceSystemFunctions.HOUR);
+ supportedFunctions.add(SourceSystemFunctions.MINUTE);
+ supportedFunctions.add(SourceSystemFunctions.MONTH);
+ supportedFunctions.add(SourceSystemFunctions.MONTHNAME);
+
+ //supportedFunctions.add(SourceSystemFunctions.PARSEDATE);
+ //supportedFunctions.add(SourceSystemFunctions.PARSETIME);
+ //supportedFunctions.add(SourceSystemFunctions.PARSETIMESTAMP);
+ supportedFunctions.add(SourceSystemFunctions.QUARTER);
+ supportedFunctions.add(SourceSystemFunctions.SECOND);
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPADD);
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPDIFF);
+ supportedFunctions.add(SourceSystemFunctions.WEEK);
+ supportedFunctions.add(SourceSystemFunctions.YEAR);
+
+ supportedFunctions.add(SourceSystemFunctions.CONVERT);
+ supportedFunctions.add(SourceSystemFunctions.IFNULL);
+ supportedFunctions.add(SourceSystemFunctions.COALESCE);
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ public boolean supportsRowOffset() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/hsql/HsqlTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,83 @@
+/*
+ * 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.translator.jdbc.hsql;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+
+public class HsqlTranslator extends Translator {
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new AddDiffModifier(true, getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new AddDiffModifier(false, getLanguageFactory()));
+
+ ConvertModifier convert = new ConvertModifier();
+ convert.addTypeMapping("boolean", FunctionModifier.BOOLEAN); //$NON-NLS-1$
+ convert.addTypeMapping("tinyint", FunctionModifier.BYTE); //$NON-NLS-1$
+ convert.addTypeMapping("smallint", FunctionModifier.SHORT); //$NON-NLS-1$
+ convert.addTypeMapping("int", FunctionModifier.INTEGER); //$NON-NLS-1$
+ convert.addTypeMapping("bigint", FunctionModifier.LONG); //$NON-NLS-1$
+ convert.addTypeMapping("real", FunctionModifier.FLOAT); //$NON-NLS-1$
+ convert.addTypeMapping("double", FunctionModifier.DOUBLE); //$NON-NLS-1$
+ convert.addTypeMapping("decimal", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
+ convert.addTypeMapping("decimal(38,0)", FunctionModifier.BIGINTEGER); //$NON-NLS-1$
+ convert.addTypeMapping("date", FunctionModifier.DATE); //$NON-NLS-1$
+ convert.addTypeMapping("time", FunctionModifier.TIME); //$NON-NLS-1$
+ convert.addTypeMapping("timestamp", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convert.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convert.addTypeMapping("varchar", FunctionModifier.STRING); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convert);
+ }
+
+ @Override
+ public String translateLiteralDate(Date dateValue) {
+ return "DATE '" + formatDateValue(dateValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTime(Time timeValue) {
+ return "TIME '" + formatDateValue(timeValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTimestamp(Timestamp timestampValue) {
+ return "TIMESTAMP '" + formatDateValue(timestampValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return HsqlCapabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,45 @@
+/*
+ * 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.translator.jdbc.informix;
+
+import java.util.*;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+/**
+ */
+public class InformixCapabilities extends JDBCCapabilities {
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List getSupportedFunctions() {
+ List supportedFunctons = new ArrayList();
+ supportedFunctons.addAll(super.getSupportedFunctions());
+ supportedFunctons.add("CAST"); //$NON-NLS-1$
+ supportedFunctons.add("CONVERT"); //$NON-NLS-1$
+ return supportedFunctons;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/informix/InformixSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,50 @@
+/*
+ * 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.translator.jdbc.informix;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ */
+public class InformixSQLTranslator extends Translator {
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, new ConvertModifier());
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return InformixCapabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mm/MMCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mm/MMCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mm/MMCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2000-2005 MetaMatrix, Inc. All rights reserved.
+ */
+/*
+ */
+package org.teiid.translator.jdbc.mm;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+/**
+ * Capabilities compatible with MM 5.5.x
+ */
+public class MMCapabilities extends JDBCCapabilities {
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATBIGDECIMAL"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATBIGINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATDOUBLE"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATFLOAT"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATLONG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEBIGDECIMAL"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEBIGINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEDOUBLE"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEFLOAT"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("PARSELONG"); //$NON-NLS-1$
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("RAND"); //$NON-NLS-1$
+ supportedFunctions.add("ROUND"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT2"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ supportedFunctions.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("INSERT"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("TRANSLATE"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("CURDATE"); //$NON-NLS-1$
+ supportedFunctions.add("CURTIME"); //$NON-NLS-1$
+ supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+ supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+ supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("MODIFYTIMEZONE"); //$NON-NLS-1$
+ supportedFunctions.add("DECODESTRING"); //$NON-NLS-1$
+ supportedFunctions.add("DECODEINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("USER"); //$NON-NLS-1$
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ public boolean supportsRowOffset() {
+ return true;
+ }
+}
\ No newline at end of file
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/BitFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/BitFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/BitFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.translator.jdbc.mysql;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+
+public class BitFunctionModifier extends AliasModifier {
+ private LanguageFactory langFactory;
+
+ public BitFunctionModifier(String alias, LanguageFactory langFactory) {
+ super(alias);
+ this.langFactory = langFactory;
+ }
+
+ /**
+ * Wrap the renamed function in a convert back to integer
+ */
+ @Override
+ public List<?> translate(Function function) {
+ modify(function);
+ return Arrays.asList(ConvertModifier.createConvertFunction(langFactory, function, TypeFacility.RUNTIME_NAMES.INTEGER));
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Capabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Capabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Capabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,49 @@
+/*
+ * 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.translator.jdbc.mysql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+
+
+/**
+ * @since 4.3
+ */
+public class MySQL5Capabilities extends MySQLCapabilities {
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPADD);
+ supportedFunctions.add(SourceSystemFunctions.TIMESTAMPDIFF);
+ return supportedFunctions;
+ }
+
+ @Override
+ public boolean supportsInlineViews() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Translator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Translator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQL5Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,54 @@
+/*
+ * 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.translator.jdbc.mysql;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Function;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+public class MySQL5Translator extends MySQLTranslator {
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.CHAR, new FunctionModifier() {
+
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("char(", function.getParameters().get(0), " USING ASCII)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return MySQL5Capabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,282 @@
+/*
+ * 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.translator.jdbc.mysql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+
+
+/**
+ * @since 4.3
+ */
+public class MySQLCapabilities extends JDBCCapabilities {
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+
+ supportedFunctions.add(SourceSystemFunctions.ABS);
+ supportedFunctions.add(SourceSystemFunctions.ACOS);
+ supportedFunctions.add(SourceSystemFunctions.ASIN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN);
+ supportedFunctions.add(SourceSystemFunctions.ATAN2);
+ supportedFunctions.add(SourceSystemFunctions.BITAND);
+ supportedFunctions.add(SourceSystemFunctions.BITNOT);
+ supportedFunctions.add(SourceSystemFunctions.BITOR);
+ supportedFunctions.add(SourceSystemFunctions.BITXOR);
+ supportedFunctions.add(SourceSystemFunctions.CEILING);
+ supportedFunctions.add(SourceSystemFunctions.COS);
+ supportedFunctions.add(SourceSystemFunctions.COT);
+ supportedFunctions.add(SourceSystemFunctions.DEGREES);
+ supportedFunctions.add(SourceSystemFunctions.EXP);
+ supportedFunctions.add(SourceSystemFunctions.FLOOR);
+ supportedFunctions.add(SourceSystemFunctions.LOG);
+ supportedFunctions.add(SourceSystemFunctions.LOG10);
+ supportedFunctions.add(SourceSystemFunctions.MOD);
+ supportedFunctions.add(SourceSystemFunctions.PI);
+ supportedFunctions.add(SourceSystemFunctions.POWER);
+ supportedFunctions.add(SourceSystemFunctions.RADIANS);
+ supportedFunctions.add(SourceSystemFunctions.ROUND);
+ supportedFunctions.add(SourceSystemFunctions.SIGN);
+ supportedFunctions.add(SourceSystemFunctions.SIN);
+ supportedFunctions.add(SourceSystemFunctions.SQRT);
+ supportedFunctions.add(SourceSystemFunctions.TAN);
+
+ supportedFunctions.add(SourceSystemFunctions.ASCII);
+ supportedFunctions.add(SourceSystemFunctions.CHAR);
+ supportedFunctions.add(SourceSystemFunctions.CONCAT);
+ supportedFunctions.add(SourceSystemFunctions.INSERT);
+ supportedFunctions.add(SourceSystemFunctions.LCASE);
+ supportedFunctions.add(SourceSystemFunctions.LEFT);
+ supportedFunctions.add(SourceSystemFunctions.LENGTH);
+ supportedFunctions.add(SourceSystemFunctions.LOCATE);
+ supportedFunctions.add(SourceSystemFunctions.LPAD);
+ supportedFunctions.add(SourceSystemFunctions.LTRIM);
+ supportedFunctions.add(SourceSystemFunctions.REPEAT);
+ supportedFunctions.add(SourceSystemFunctions.REPLACE);
+ supportedFunctions.add(SourceSystemFunctions.RIGHT);
+ supportedFunctions.add(SourceSystemFunctions.RPAD);
+ supportedFunctions.add(SourceSystemFunctions.RTRIM);
+ supportedFunctions.add(SourceSystemFunctions.SUBSTRING);
+ supportedFunctions.add(SourceSystemFunctions.UCASE);
+
+ // These are executed within the server and never pushed down
+// supportedFunctions.add("CURDATE"); //$NON-NLS-1$
+// supportedFunctions.add("CURTIME"); //$NON-NLS-1$
+// supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add(SourceSystemFunctions.DAYNAME);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFMONTH);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFWEEK);
+ supportedFunctions.add(SourceSystemFunctions.DAYOFYEAR);
+
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add(SourceSystemFunctions.HOUR);
+ supportedFunctions.add(SourceSystemFunctions.MINUTE);
+ supportedFunctions.add(SourceSystemFunctions.MONTH);
+ supportedFunctions.add(SourceSystemFunctions.MONTHNAME);
+
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add(SourceSystemFunctions.QUARTER);
+ supportedFunctions.add(SourceSystemFunctions.SECOND);
+// supportedFunctions.add(SourceSystemFunctions.TIMESTAMPADD);
+// supportedFunctions.add(SourceSystemFunctions.TIMESTAMPDIFF);
+ supportedFunctions.add(SourceSystemFunctions.WEEK);
+ supportedFunctions.add(SourceSystemFunctions.YEAR);
+
+ supportedFunctions.add(SourceSystemFunctions.CONVERT);
+ supportedFunctions.add(SourceSystemFunctions.IFNULL);
+ supportedFunctions.add(SourceSystemFunctions.COALESCE);
+
+// supportedFunctions.add("GREATEST"); //$NON-NLS-1$
+// supportedFunctions.add("ISNULL"); //$NON-NLS-1$
+// supportedFunctions.add("LEAST"); //$NON-NLS-1$
+// supportedFunctions.add("STRCMP"); // String-specific //$NON-NLS-1$
+//
+// // String
+// supportedFunctions.add("BIN"); //$NON-NLS-1$
+// supportedFunctions.add("BIT_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("CHAR_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("CHARACTER_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("COMPRESS"); //$NON-NLS-1$
+// supportedFunctions.add("CONCAT_WS"); //$NON-NLS-1$
+// supportedFunctions.add("CONV"); //$NON-NLS-1$
+// supportedFunctions.add("ELT"); //$NON-NLS-1$
+// supportedFunctions.add("EXPORT_SET"); //$NON-NLS-1$
+// supportedFunctions.add("FIELD"); //$NON-NLS-1$
+// supportedFunctions.add("FIND_IN_SET"); //$NON-NLS-1$
+// supportedFunctions.add("FORMAT"); //$NON-NLS-1$
+// supportedFunctions.add("HEX"); //$NON-NLS-1$
+// supportedFunctions.add("INSTR"); //$NON-NLS-1$
+// supportedFunctions.add("LOAD_FILE"); //$NON-NLS-1$
+// supportedFunctions.add("MAKE_SET"); //$NON-NLS-1$
+// supportedFunctions.add("MID"); //$NON-NLS-1$
+// supportedFunctions.add("OCT"); //$NON-NLS-1$
+// supportedFunctions.add("OCTET_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("ORD"); //$NON-NLS-1$
+// supportedFunctions.add("QUOTE"); //$NON-NLS-1$
+// supportedFunctions.add("REVERSE"); //$NON-NLS-1$
+// supportedFunctions.add("SOUNDEX"); //$NON-NLS-1$
+// supportedFunctions.add("SPACE"); //$NON-NLS-1$
+// supportedFunctions.add("SUBSTR"); //$NON-NLS-1$
+// supportedFunctions.add("SUBSTRING_INDEX"); //$NON-NLS-1$
+// supportedFunctions.add("TRIM"); //$NON-NLS-1$
+// supportedFunctions.add("UNCOMPRESS"); //$NON-NLS-1$
+// supportedFunctions.add("UNHEX"); //$NON-NLS-1$
+//
+// // Math
+// supportedFunctions.add("CEIL"); //$NON-NLS-1$
+// supportedFunctions.add("CRC32"); //$NON-NLS-1$
+// // DIV is an operator equivalent to '/'
+// supportedFunctions.add("DIV"); //$NON-NLS-1$
+// supportedFunctions.add("FORMAT"); //$NON-NLS-1$
+// supportedFunctions.add("LN"); //$NON-NLS-1$
+// supportedFunctions.add("LOG2"); //$NON-NLS-1$
+// supportedFunctions.add("POW"); //$NON-NLS-1$
+// supportedFunctions.add("RAND"); //$NON-NLS-1$
+// supportedFunctions.add("TRUNCATE"); //$NON-NLS-1$
+//
+// // Date / Time
+// supportedFunctions.add("ADDDATE"); //$NON-NLS-1$
+// supportedFunctions.add("ADDTIME"); //$NON-NLS-1$
+// supportedFunctions.add("CONVERT_TZ"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_DATE"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_TIME"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_TIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("DATE"); //$NON-NLS-1$
+// supportedFunctions.add("DATEDIFF"); //$NON-NLS-1$
+//// supportedFunctions.add("DATE_ADD");
+//// supportedFunctions.add("DATE_SUB");
+// supportedFunctions.add("DATE_FORMAT"); //$NON-NLS-1$
+// supportedFunctions.add("DAY"); //$NON-NLS-1$
+//// supportedFunctions.add("EXTRACT");
+// supportedFunctions.add("FROM_DAYS"); //$NON-NLS-1$
+// supportedFunctions.add("FROM_UNIXTIME"); //$NON-NLS-1$
+// supportedFunctions.add("GET_FORMAT"); //$NON-NLS-1$
+// supportedFunctions.add("LAST_DAY"); //$NON-NLS-1$
+// supportedFunctions.add("LOCALTIME"); //$NON-NLS-1$
+// supportedFunctions.add("LOCALTIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("MAKEDATE"); //$NON-NLS-1$
+// supportedFunctions.add("MAKETIME"); //$NON-NLS-1$
+// supportedFunctions.add("MICROSECOND"); //$NON-NLS-1$
+// supportedFunctions.add("PERIOD_ADD"); //$NON-NLS-1$
+// supportedFunctions.add("PERIOD_DIFF"); //$NON-NLS-1$
+// supportedFunctions.add("SEC_TO_TIME"); //$NON-NLS-1$
+// supportedFunctions.add("STR_TO_DATE"); //$NON-NLS-1$
+// supportedFunctions.add("SUBDATE"); //$NON-NLS-1$
+// supportedFunctions.add("SUBTIME"); //$NON-NLS-1$
+// supportedFunctions.add("SYSDATE"); //$NON-NLS-1$
+// supportedFunctions.add("TIME"); //$NON-NLS-1$
+// supportedFunctions.add("TIMEDIFF"); //$NON-NLS-1$
+// supportedFunctions.add("TIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("TIME_FORMAT"); //$NON-NLS-1$
+// supportedFunctions.add("TIME_TO_SEC"); //$NON-NLS-1$
+// supportedFunctions.add("TO_DAYS"); //$NON-NLS-1$
+// supportedFunctions.add("UNIX_TIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("UTC_DATE"); //$NON-NLS-1$
+// supportedFunctions.add("UTC_TIME"); //$NON-NLS-1$
+// supportedFunctions.add("UTC_TIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("WEEKDAY"); //$NON-NLS-1$
+// supportedFunctions.add("WEEKOFYEAR"); //$NON-NLS-1$
+// supportedFunctions.add("YEARWEEK"); //$NON-NLS-1$
+//
+// // Bit
+// supportedFunctions.add("|"); //$NON-NLS-1$
+// supportedFunctions.add("&"); //$NON-NLS-1$
+// supportedFunctions.add("^"); //$NON-NLS-1$
+// supportedFunctions.add("<<"); //$NON-NLS-1$
+// supportedFunctions.add(">>"); //$NON-NLS-1$
+// supportedFunctions.add("~"); //$NON-NLS-1$
+// supportedFunctions.add("BIT_COUNT"); //$NON-NLS-1$
+//
+// // Encryption
+// supportedFunctions.add("AES_ENCRYPT"); //$NON-NLS-1$
+// supportedFunctions.add("AES_DECRYPT"); //$NON-NLS-1$
+// supportedFunctions.add("DECODE"); //$NON-NLS-1$
+// supportedFunctions.add("ENCODE"); //$NON-NLS-1$
+// supportedFunctions.add("DES_ENCRYPT"); //$NON-NLS-1$
+// supportedFunctions.add("DES_DECRYPT"); //$NON-NLS-1$
+// supportedFunctions.add("MD5"); //$NON-NLS-1$
+// supportedFunctions.add("OLD_PASSWORD"); //$NON-NLS-1$
+// supportedFunctions.add("PASSWORD"); //$NON-NLS-1$
+// supportedFunctions.add("SHA"); //$NON-NLS-1$
+// supportedFunctions.add("SHA1"); //$NON-NLS-1$
+//
+// // Information
+// supportedFunctions.add("BENCHMARK"); //$NON-NLS-1$
+// supportedFunctions.add("CHARSET"); //$NON-NLS-1$
+// supportedFunctions.add("COERCIBILITY"); //$NON-NLS-1$
+// supportedFunctions.add("COLLATION"); //$NON-NLS-1$
+// supportedFunctions.add("CONNECTION_ID"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_USER"); //$NON-NLS-1$
+// supportedFunctions.add("DATABASE"); //$NON-NLS-1$
+// supportedFunctions.add("FOUND_ROWS"); //$NON-NLS-1$
+// supportedFunctions.add("LAST_INSERT_ID"); //$NON-NLS-1$
+// supportedFunctions.add("ROW_COUNT"); //$NON-NLS-1$
+// supportedFunctions.add("SCHEMA"); //$NON-NLS-1$
+// supportedFunctions.add("SESSION_USER"); //$NON-NLS-1$
+// supportedFunctions.add("SYSTEM_USER"); //$NON-NLS-1$
+// supportedFunctions.add("USER"); //$NON-NLS-1$
+// supportedFunctions.add("VERSION"); //$NON-NLS-1$
+//
+// // Misc.
+// supportedFunctions.add("DEFAULT"); //$NON-NLS-1$
+// supportedFunctions.add("FORMAT"); //$NON-NLS-1$
+//// supportedFunctions.add("GET_LOCK"); //$NON-NLS-1$
+// supportedFunctions.add("INET_ATON"); //$NON-NLS-1$
+// supportedFunctions.add("INET_NTOA"); //$NON-NLS-1$
+//// supportedFunctions.add("IS_FREE_LOCK"); //$NON-NLS-1$
+//// supportedFunctions.add("IS_USED_LOCK"); //$NON-NLS-1$
+//// supportedFunctions.add("MASTER_POS_WAIT"); //$NON-NLS-1$
+//// supportedFunctions.add("NAME_CONST"); //$NON-NLS-1$
+//// supportedFunctions.add("RELEASE_LOCK"); //$NON-NLS-1$
+//// supportedFunctions.add("SLEEP"); //$NON-NLS-1$
+// supportedFunctions.add("UUID"); //$NON-NLS-1$
+// supportedFunctions.add("VALUES"); //$NON-NLS-1$
+ return supportedFunctions;
+ }
+
+ public boolean supportsFullOuterJoins() {
+ return false;
+ }
+
+ public boolean supportsAggregatesDistinct() {
+ return false;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+ public boolean supportsRowOffset() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/mysql/MySQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,156 @@
+/*
+ * 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.translator.jdbc.mysql;
+
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Function;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.LocateFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ * @since 4.3
+ */
+public class MySQLTranslator extends Translator {
+
+ /**
+ * Adds support for the 2 argument form of padding
+ */
+ private final class PadFunctionModifier extends FunctionModifier {
+ @Override
+ public List<?> translate(Function function) {
+ if (function.getParameters().size() == 2) {
+ function.getParameters().add(getLanguageFactory().createLiteral(" ", TypeFacility.RUNTIME_TYPES.STRING)); //$NON-NLS-1$
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.BITAND, new BitFunctionModifier("&", getLanguageFactory())); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITNOT, new BitFunctionModifier("~", getLanguageFactory())); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITOR, new BitFunctionModifier("|", getLanguageFactory())); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITXOR, new BitFunctionModifier("^", getLanguageFactory())); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.LPAD, new PadFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.RPAD, new PadFunctionModifier());
+ //add in type conversion
+ ConvertModifier convertModifier = new ConvertModifier();
+ convertModifier.addTypeMapping("signed", FunctionModifier.BOOLEAN, FunctionModifier.BYTE, FunctionModifier.SHORT, FunctionModifier.INTEGER, FunctionModifier.LONG); //$NON-NLS-1$
+ //char(n) assume 4.1 or later
+ convertModifier.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convertModifier.addTypeMapping("char", FunctionModifier.STRING); //$NON-NLS-1$
+ convertModifier.addTypeMapping("date", FunctionModifier.DATE); //$NON-NLS-1$
+ convertModifier.addTypeMapping("time", FunctionModifier.TIME); //$NON-NLS-1$
+ convertModifier.addTypeMapping("timestamp", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.DATE, new ConvertModifier.FormatModifier("DATE")); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.TIME, new ConvertModifier.FormatModifier("TIME")); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.TIMESTAMP, new ConvertModifier.FormatModifier("TIMESTAMP")); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.DATE, FunctionModifier.STRING, new ConvertModifier.FormatModifier("date_format", "%Y-%m-%d")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.STRING, new ConvertModifier.FormatModifier("date_format", "%H:%i:%S")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.STRING, new ConvertModifier.FormatModifier("date_format", "%Y-%m-%d %H:%i:%S.%f")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addTypeConversion(new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList(function.getParameters().get(0), " + 0.0"); //$NON-NLS-1$
+ }
+ }, FunctionModifier.BIGDECIMAL, FunctionModifier.BIGINTEGER, FunctionModifier.FLOAT, FunctionModifier.DOUBLE);
+ convertModifier.addNumericBooleanConversions();
+ convertModifier.setWideningNumericImplicit(true);
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
+ }
+
+ @Override
+ public String translateLiteralDate(Date dateValue) {
+ return "DATE('" + formatDateValue(dateValue) + "')"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTime(Time timeValue) {
+ return "TIME('" + formatDateValue(timeValue) + "')"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTimestamp(Timestamp timestampValue) {
+ return "{ts '" + formatDateValue(timestampValue) + "'}"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public boolean useParensForSetQueries() {
+ return true;
+ }
+
+ @Override
+ public int getTimestampNanoPrecision() {
+ return 0;
+ }
+
+ @Override
+ public void afterConnectionCreation(Connection connection) {
+ super.afterConnectionCreation(connection);
+
+ Statement stmt = null;
+ try {
+ stmt = connection.createStatement();
+ stmt.execute("set SESSION sql_mode = 'ANSI'"); //$NON-NLS-1$
+ } catch (SQLException e) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, e, "Error setting ANSI mode"); //$NON-NLS-1$
+ } finally {
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException e) {
+ LogManager.logDetail("Error closing statement", e); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return MySQLCapabilities.class;
+ }
+
+ public boolean useParensForJoins() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/ConcatFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/ConcatFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/ConcatFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,111 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Condition;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SearchedWhenClause;
+import org.teiid.connector.language.AndOr.Operator;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+
+/**
+ * This Function modifier used to support ANSI concat on Oracle 9i.
+ * <code>
+ * CONCAT(a, b) ==> CASE WHEN (a is NULL OR b is NULL) THEN NULL ELSE CONCAT(a, b)
+ * </code>
+ */
+public class ConcatFunctionModifier extends FunctionModifier {
+ private LanguageFactory langFactory;
+
+ /**
+ * @param langFactory
+ */
+ public ConcatFunctionModifier(LanguageFactory langFactory) {
+ this.langFactory = langFactory;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ Expression a = function.getParameters().get(0);
+ Expression b = function.getParameters().get(1);
+ List<Condition> crits = new ArrayList<Condition>();
+
+ Literal nullValue = langFactory.createLiteral(null, TypeFacility.RUNTIME_TYPES.STRING);
+ if (isNull(a)) {
+ return Arrays.asList(nullValue);
+ } else if (!isNotNull(a)) {
+ crits.add(langFactory.createIsNullCriteria(a, false));
+ }
+ if (isNull(b)) {
+ return Arrays.asList(nullValue);
+ } else if (!isNotNull(b)) {
+ crits.add(langFactory.createIsNullCriteria(b, false));
+ }
+
+ Condition crit = null;
+
+ if (crits.isEmpty()) {
+ return null;
+ } else if (crits.size() == 1) {
+ crit = crits.get(0);
+ } else {
+ crit = langFactory.createAndOr(Operator.OR, crits.get(0), crits.get(1));
+ }
+ List<SearchedWhenClause> cases = Arrays.asList(langFactory.createSearchedWhenCondition(crit, nullValue));
+ return Arrays.asList(langFactory.createSearchedCaseExpression(cases, function, TypeFacility.RUNTIME_TYPES.STRING));
+ }
+
+ private boolean isNotNull(Expression expr) {
+ if (expr instanceof Literal) {
+ Literal literal = (Literal)expr;
+ return literal.getValue() != null;
+ }
+ if (expr instanceof Function) {
+ Function function = (Function)expr;
+ if (function.getName().equalsIgnoreCase("NVL") || function.getName().equalsIgnoreCase(SourceSystemFunctions.IFNULL)) { //$NON-NLS-1$
+ return isNotNull(function.getParameters().get(1));
+ }
+ }
+ return false;
+ }
+
+ private boolean isNull(Expression expr) {
+ if (expr instanceof Literal) {
+ Literal literal = (Literal)expr;
+ return literal.getValue() == null;
+ }
+ return false;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/DayWeekQuarterFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/DayWeekQuarterFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/DayWeekQuarterFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,52 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Function;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+/**
+ * This a method for multiple use. It can be used for:
+ * 1) dayofyear
+ * 2) dayofmonth
+ * 3) dayofweek
+ * 4) week
+ * 5) quarter
+ */
+public class DayWeekQuarterFunctionModifier extends FunctionModifier {
+ private String format;
+
+ public DayWeekQuarterFunctionModifier(String format) {
+ this.format = format;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("to_number(TO_CHAR(",function.getParameters().get(0), ", '", format,"'))"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+}
+
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/LeftOrRightFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/LeftOrRightFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/LeftOrRightFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,72 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+/**
+ * Convert left(string, count) --> substr(string, 1, count)
+ * or right(string, count) --> substr(string, -1 * count) - we lack a way to express a unary negation
+ */
+public class LeftOrRightFunctionModifier extends FunctionModifier {
+ private LanguageFactory langFactory;
+
+ public LeftOrRightFunctionModifier(LanguageFactory langFactory) {
+ this.langFactory = langFactory;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ List<Expression> args = function.getParameters();
+ Function func = null;
+
+ if (function.getName().equalsIgnoreCase("left")) { //$NON-NLS-1$
+ func = langFactory.createFunction("SUBSTR", //$NON-NLS-1$
+ Arrays.asList(
+ args.get(0),
+ langFactory.createLiteral(Integer.valueOf(1), TypeFacility.RUNTIME_TYPES.INTEGER),
+ args.get(1)),
+ String.class);
+ } else if (function.getName().equalsIgnoreCase("right")) { //$NON-NLS-1$
+ Function negIndex = langFactory.createFunction("*", //$NON-NLS-1$
+ Arrays.asList(langFactory.createLiteral(Integer.valueOf(-1), TypeFacility.RUNTIME_TYPES.INTEGER), args.get(1)),
+ Integer.class);
+
+ func = langFactory.createFunction("SUBSTR", //$NON-NLS-1$
+ Arrays.asList(
+ args.get(0),
+ negIndex),
+ String.class);
+ }
+
+ return Arrays.asList(func);
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/Log10FunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/Log10FunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/Log10FunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,52 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+public class Log10FunctionModifier extends FunctionModifier {
+
+ private LanguageFactory languageFactory;
+
+ public Log10FunctionModifier(LanguageFactory languageFactory) {
+ this.languageFactory = languageFactory;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ function.setName("log"); //$NON-NLS-1$
+
+ List<Expression> args = function.getParameters();
+ args.add(args.get(0));
+ args.set(0, languageFactory.createLiteral(new Integer(10), TypeFacility.RUNTIME_TYPES.INTEGER));
+ return null;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/MonthOrDayNameFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/MonthOrDayNameFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/MonthOrDayNameFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,65 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+/**
+ * Convert the MONTHNAME etc. function into an equivalent Oracle function.
+ * Format: to_char(timestampvalue/dayvalue, 'Month'/'Day')
+ */
+public class MonthOrDayNameFunctionModifier extends FunctionModifier {
+ private LanguageFactory langFactory;
+ private String format;
+
+ public MonthOrDayNameFunctionModifier(LanguageFactory langFactory, String format) {
+ this.langFactory = langFactory;
+ this.format = format;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ List<Expression> args = function.getParameters();
+
+ Function func = langFactory.createFunction("TO_CHAR", //$NON-NLS-1$
+ Arrays.asList(
+ args.get(0),
+ langFactory.createLiteral(format, TypeFacility.RUNTIME_TYPES.STRING)),
+ TypeFacility.RUNTIME_TYPES.STRING);
+
+ // For some reason, these values have trailing spaces
+ Function trimFunc = langFactory.createFunction(SourceSystemFunctions.RTRIM,
+ Arrays.asList( func ), TypeFacility.RUNTIME_TYPES.STRING);
+
+ return Arrays.asList(trimFunc);
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,154 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+import org.teiid.resource.cci.SourceSystemFunctions;
+
+
+/**
+ */
+public class OracleCapabilities extends JDBCCapabilities {
+
+ public OracleCapabilities() {
+ }
+
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add(SourceSystemFunctions.COT);
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ supportedFunctions.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("TRANSLATE"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("DAY"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ //supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+ //supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+ //supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ //supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+ //supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+ //supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+
+ supportedFunctions.add(OracleSQLTranslator.RELATE);
+ supportedFunctions.add(OracleSQLTranslator.NEAREST_NEIGHBOR);
+ supportedFunctions.add(OracleSQLTranslator.FILTER);
+ supportedFunctions.add(OracleSQLTranslator.NEAREST_NEIGHBOR_DISTANCE);
+ supportedFunctions.add(OracleSQLTranslator.WITHIN_DISTANCE);
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+ public boolean supportsRowOffset() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsExcept()
+ */
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsIntersect()
+ */
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,439 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.ExpressionValueSource;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.Insert;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.language.SQLReservedWords.Tokens;
+import org.teiid.connector.language.SetQuery.Operation;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.visitor.util.CollectorVisitor;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.ExtractFunctionModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.JDBCPlugin;
+import org.teiid.translator.jdbc.LocateFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+
+
+
+public class OracleSQLTranslator extends Translator {
+
+ /*
+ * Spatial Functions
+ */
+ public static final String RELATE = "sdo_relate"; //$NON-NLS-1$
+ public static final String NEAREST_NEIGHBOR = "sdo_nn"; //$NON-NLS-1$
+ public static final String FILTER = "sdo_filter"; //$NON-NLS-1$
+ public static final String WITHIN_DISTANCE = "sdo_within_distance"; //$NON-NLS-1$
+ public static final String NEAREST_NEIGHBOR_DISTANCE = "sdo_nn_distance"; //$NON-NLS-1$
+
+ public final static String HINT_PREFIX = "/*+"; //$NON-NLS-1$
+ public final static String DUAL = "DUAL"; //$NON-NLS-1$
+ public final static String ROWNUM = "ROWNUM"; //$NON-NLS-1$
+ public final static String SEQUENCE = ":SEQUENCE="; //$NON-NLS-1$
+
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.CHAR, new AliasModifier("chr")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("lower")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("upper")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.IFNULL, new AliasModifier("nvl")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOG, new AliasModifier("ln")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.CEILING, new AliasModifier("ceil")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOG10, new Log10FunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.HOUR, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.YEAR, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MINUTE, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.SECOND, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MONTH, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MONTHNAME, new MonthOrDayNameFunctionModifier(getLanguageFactory(), "Month"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYNAME, new MonthOrDayNameFunctionModifier(getLanguageFactory(), "Day"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.WEEK, new DayWeekQuarterFunctionModifier("WW"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.QUARTER, new DayWeekQuarterFunctionModifier("Q"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFWEEK, new DayWeekQuarterFunctionModifier("D"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFYEAR, new DayWeekQuarterFunctionModifier("DDD"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory(), "INSTR", true)); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new AliasModifier("substr"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LEFT, new LeftOrRightFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.RIGHT, new LeftOrRightFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.CONCAT, new ConcatFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.COT, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ function.setName(SourceSystemFunctions.TAN);
+ return Arrays.asList(getLanguageFactory().createFunction(SourceSystemFunctions.DIVIDE_OP, new Expression[] {new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER), function}, TypeFacility.RUNTIME_TYPES.DOUBLE));
+ }
+ });
+
+ //spatial functions
+ registerFunctionModifier(RELATE, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(NEAREST_NEIGHBOR, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(FILTER, new OracleSpatialFunctionModifier());
+ registerFunctionModifier(WITHIN_DISTANCE, new OracleSpatialFunctionModifier());
+
+ //add in type conversion
+ ConvertModifier convertModifier = new ConvertModifier();
+ convertModifier.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convertModifier.addTypeMapping("date", FunctionModifier.DATE, FunctionModifier.TIME); //$NON-NLS-1$
+ convertModifier.addTypeMapping("timestamp", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.TIME, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("case when ", function.getParameters().get(0), " is null then null else to_date('1970-01-01 ' || to_char(",function.getParameters().get(0),", 'HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') end"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.DATE, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("trunc(cast(",function.getParameters().get(0)," AS date))"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.DATE, FunctionModifier.STRING, new ConvertModifier.FormatModifier("to_char", "YYYY-MM-DD")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.STRING, new ConvertModifier.FormatModifier("to_char", "HH24:MI:SS")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ //if column and type is date, just use date format
+ Expression ex = function.getParameters().get(0);
+ String format = "YYYY-MM-DD HH24:MI:SS.FF"; //$NON-NLS-1$
+ if (ex instanceof ColumnReference) {
+ if ("date".equals(((ColumnReference)ex).getMetadataObject().getNativeType())) { //$NON-NLS-1$
+ format = "YYYY-MM-DD HH24:MI:SS"; //$NON-NLS-1$
+ }
+ } else if (!(ex instanceof Function) && !(ex instanceof Literal)) {
+ //this isn't needed in every case, but it's simpler than inspecting the expression more
+ ex = ConvertModifier.createConvertFunction(getLanguageFactory(), function.getParameters().get(0), TypeFacility.RUNTIME_NAMES.TIMESTAMP);
+ }
+ return Arrays.asList("to_char(", ex, ", '", format, "')"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.DATE, new ConvertModifier.FormatModifier("to_date", "YYYY-MM-DD")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.TIME, new ConvertModifier.FormatModifier("to_date", "HH24:MI:SS")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.STRING, FunctionModifier.TIMESTAMP, new ConvertModifier.FormatModifier("to_timestamp", "YYYY-MM-DD HH24:MI:SS.FF")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addTypeConversion(new ConvertModifier.FormatModifier("to_char"), FunctionModifier.STRING); //$NON-NLS-1$
+ //NOTE: numeric handling in Oracle is split only between integral vs. floating/decimal types
+ convertModifier.addTypeConversion(new ConvertModifier.FormatModifier("to_number"), //$NON-NLS-1$
+ FunctionModifier.FLOAT, FunctionModifier.DOUBLE, FunctionModifier.BIGDECIMAL);
+ convertModifier.addTypeConversion(new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ if (Number.class.isAssignableFrom(function.getParameters().get(0).getType())) {
+ return Arrays.asList("trunc(", function.getParameters().get(0), ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return Arrays.asList("trunc(to_number(", function.getParameters().get(0), "))"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ },
+ FunctionModifier.BYTE, FunctionModifier.SHORT, FunctionModifier.INTEGER, FunctionModifier.LONG, FunctionModifier.BIGINTEGER);
+ convertModifier.addNumericBooleanConversions();
+ convertModifier.setWideningNumericImplicit(true);
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
+ }
+
+ public void handleInsertSequences(Insert insert) throws ConnectorException {
+ /*
+ * If a missing auto_increment column is modeled with name in source indicating that an Oracle Sequence
+ * then pull the Sequence name out of the name in source of the column.
+ */
+ if (!(insert.getValueSource() instanceof ExpressionValueSource)) {
+ return;
+ }
+ ExpressionValueSource values = (ExpressionValueSource)insert.getValueSource();
+ List<Column> allElements = insert.getTable().getMetadataObject().getColumns();
+ if (allElements.size() == values.getValues().size()) {
+ return;
+ }
+
+ int index = 0;
+ List<ColumnReference> elements = insert.getColumns();
+
+ for (Column element : allElements) {
+ if (!element.isAutoIncremented()) {
+ continue;
+ }
+ String name = element.getNameInSource();
+ int seqIndex = name.indexOf(SEQUENCE);
+ if (seqIndex == -1) {
+ continue;
+ }
+ boolean found = false;
+ while (index < elements.size()) {
+ if (element.equals(elements.get(index).getMetadataObject())) {
+ found = true;
+ break;
+ }
+ index++;
+ }
+ if (found) {
+ continue;
+ }
+
+ String sequence = name.substring(seqIndex + SEQUENCE.length());
+
+ int delimiterIndex = sequence.indexOf(Tokens.DOT);
+ if (delimiterIndex == -1) {
+ throw new ConnectorException("Invalid name in source sequence format. Expected <element name>" + SEQUENCE + "<sequence name>.<sequence value>, but was " + name); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ String sequenceGroupName = sequence.substring(0, delimiterIndex);
+ String sequenceElementName = sequence.substring(delimiterIndex + 1);
+
+ NamedTable sequenceGroup = this.getLanguageFactory().createNamedTable(sequenceGroupName, null, null);
+ ColumnReference sequenceElement = this.getLanguageFactory().createColumnReference(sequenceElementName, sequenceGroup, null, element.getJavaType());
+ insert.getColumns().add(index, this.getLanguageFactory().createColumnReference(element.getName(), insert.getTable(), element, element.getJavaType()));
+ values.getValues().add(index, sequenceElement);
+ }
+ }
+
+ @Override
+ public List<?> translateCommand(Command command, ExecutionContext context) {
+ if (command instanceof Insert) {
+ try {
+ handleInsertSequences((Insert)command);
+ } catch (ConnectorException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ if (!(command instanceof QueryExpression)) {
+ return null;
+ }
+ QueryExpression queryCommand = (QueryExpression)command;
+ if (queryCommand.getLimit() == null) {
+ return null;
+ }
+ Limit limit = queryCommand.getLimit();
+ queryCommand.setLimit(null);
+ List<Object> parts = new ArrayList<Object>();
+ parts.add("SELECT "); //$NON-NLS-1$
+ /*
+ * if all of the columns are aliased, assume that names matter - it actually only seems to matter for
+ * the first query of a set op when there is a order by. Rather than adding logic to traverse up,
+ * we just use the projected names
+ */
+ boolean allAliased = true;
+ for (DerivedColumn selectSymbol : queryCommand.getProjectedQuery().getDerivedColumns()) {
+ if (selectSymbol.getAlias() == null) {
+ allAliased = false;
+ break;
+ }
+ }
+ if (allAliased) {
+ String[] columnNames = queryCommand.getColumnNames();
+ for (int i = 0; i < columnNames.length; i++) {
+ if (i > 0) {
+ parts.add(", "); //$NON-NLS-1$
+ }
+ parts.add(columnNames[i]);
+ }
+ } else {
+ parts.add("*"); //$NON-NLS-1$
+ }
+ if (limit.getRowOffset() > 0) {
+ parts.add(" FROM (SELECT VIEW_FOR_LIMIT.*, ROWNUM ROWNUM_ FROM ("); //$NON-NLS-1$
+ } else {
+ parts.add(" FROM ("); //$NON-NLS-1$
+ }
+ parts.add(queryCommand);
+ if (limit.getRowOffset() > 0) {
+ parts.add(") VIEW_FOR_LIMIT WHERE ROWNUM <= "); //$NON-NLS-1$
+ parts.add(limit.getRowLimit() + limit.getRowOffset());
+ parts.add(") WHERE ROWNUM_ > "); //$NON-NLS-1$
+ parts.add(limit.getRowOffset());
+ } else {
+ parts.add(") WHERE ROWNUM <= "); //$NON-NLS-1$
+ parts.add(limit.getRowLimit());
+ }
+ return parts;
+ }
+
+ @Override
+ public boolean useAsInGroupAlias(){
+ return false;
+ }
+
+ @Override
+ public String getSetOperationString(Operation operation) {
+ if (operation == Operation.EXCEPT) {
+ return "MINUS"; //$NON-NLS-1$
+ }
+ return super.getSetOperationString(operation);
+ }
+
+ @Override
+ public String getSourceComment(ExecutionContext context, Command command) {
+ String comment = super.getSourceComment(context, command);
+
+ if (context != null) {
+ // Check for db hints
+ Object payload = context.getExecutionPayload();
+ if (payload instanceof String) {
+ String payloadString = (String)payload;
+ if (payloadString.startsWith(HINT_PREFIX)) {
+ comment += payloadString + " "; //$NON-NLS-1$
+ }
+ }
+ }
+
+ if (command instanceof Select) {
+ //
+ // This simple algorithm determines the hint which will be added to the
+ // query.
+ // Right now, we look through all functions passed in the query
+ // (returned as a collection)
+ // Then we check if any of those functions are sdo_relate
+ // If so, the ORDERED hint is added, if not, it isn't
+ Collection<Function> col = CollectorVisitor.collectObjects(Function.class, command);
+ for (Function func : col) {
+ if (func.getName().equalsIgnoreCase(RELATE)) {
+ return comment + "/*+ ORDERED */ "; //$NON-NLS-1$
+ }
+ }
+ }
+ return comment;
+ }
+
+ /**
+ * Don't fully qualify elements if table = DUAL or element = ROWNUM or special stuff is packed into name in source value.
+ *
+ * @see org.teiid.connector.visitor.util.SQLStringVisitor#skipGroupInElement(java.lang.String, java.lang.String)
+ * @since 5.0
+ */
+ @Override
+ public String replaceElementName(String group, String element) {
+
+ // Check if the element was modeled as using a Sequence
+ int useIndex = element.indexOf(SEQUENCE);
+ if (useIndex >= 0) {
+ String name = element.substring(0, useIndex);
+ if (group != null) {
+ return group + Tokens.DOT + name;
+ }
+ return name;
+ }
+
+ // Check if the group name should be discarded
+ if((group != null && DUAL.equalsIgnoreCase(group)) || element.equalsIgnoreCase(ROWNUM)) {
+ // Strip group if group or element are pseudo-columns
+ return element;
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean hasTimeType() {
+ return false;
+ }
+
+ @Override
+ public void bindValue(PreparedStatement stmt, Object param, Class<?> paramType, int i) throws SQLException {
+ if(param == null && Object.class.equals(paramType)){
+ //Oracle drive does not support JAVA_OBJECT type
+ stmt.setNull(i, Types.LONGVARBINARY);
+ return;
+ }
+ super.bindValue(stmt, param, paramType, i);
+ }
+
+ @Override
+ public void afterInitialConnectionCreation(Connection connection) {
+ String errorStr = JDBCPlugin.Util.getString("ConnectionListener.failed_to_report_oracle_connection_details"); //$NON-NLS-1$
+ ResultSet rs = null;
+ Statement stmt = null;
+ try {
+ stmt = connection.createStatement();
+ rs = stmt.executeQuery("select * from v$instance"); //$NON-NLS-1$
+
+ int columnCount = rs.getMetaData().getColumnCount();
+ while (rs.next()) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 1; i <= columnCount; i++) {
+ sb.append(rs.getMetaData().getColumnName(i)).append("=").append(rs.getString(i)).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ // log the queried information
+ LogManager.logInfo(LogConstants.CTX_CONNECTOR, sb.toString());
+ }
+
+ } catch (SQLException e) {
+ LogManager.logInfo(LogConstants.CTX_CONNECTOR, errorStr);
+ }finally {
+ try {
+ if (rs != null) {
+ rs.close();
+ }
+ if (stmt != null) {
+ stmt.close();
+ }
+ } catch (SQLException e1) {
+ LogManager.logInfo(LogConstants.CTX_CONNECTOR, errorStr);
+ }
+ }
+ }
+
+ @Override
+ public NullOrder getDefaultNullOrder() {
+ return NullOrder.HIGH;
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return OracleCapabilities.class;
+ }
+
+ public boolean supportsExplicitNullOrdering() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSpatialFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSpatialFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/OracleSpatialFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,67 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.Literal;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+public class OracleSpatialFunctionModifier extends FunctionModifier {
+
+ /**
+ * If either of the first two parameters are a Literal String, then we need to put the literal itself in the SQL
+ * to be passed to Oracle, without the tick marks
+ */
+ public List<?> translate(Function function) {
+ List<Expression> params = function.getParameters();
+ List<Object> objs = new ArrayList<Object>();
+ objs.add(function.getName());
+ objs.add("("); //$NON-NLS-1$
+ addParamWithConversion(objs, params.get(0));
+ objs.add(", "); //$NON-NLS-1$
+
+ addParamWithConversion(objs, params.get(1));
+ for (int i = 2; i < params.size(); i++) {
+ objs.add(", "); //$NON-NLS-1$
+ objs.add(params.get(i));
+ }
+ objs.add(")"); //$NON-NLS-1$
+ return objs;
+ }
+
+ protected void addParamWithConversion(List<Object> objs,
+ Expression expression) {
+ if ((expression instanceof Literal)
+ && (((Literal) expression).getValue() instanceof String)) {
+ objs.add(((Literal) expression).getValue());
+ } else {
+ objs.add(expression);
+ }
+ }
+
+}
\ No newline at end of file
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/SequeLinkOracleCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/SequeLinkOracleCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/oracle/SequeLinkOracleCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,37 @@
+/*
+ * 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.translator.jdbc.oracle;
+
+
+
+/**
+ * @since 5.0
+ */
+public class SequeLinkOracleCapabilities extends OracleCapabilities {
+
+ @Override
+ public boolean supportsBulkUpdate() {
+ return false;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/LocateFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/LocateFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/LocateFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,77 @@
+/*
+ * 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.translator.jdbc.postgresql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.connector.language.Literal;
+import org.teiid.resource.cci.TypeFacility;
+
+public class LocateFunctionModifier extends org.teiid.translator.jdbc.LocateFunctionModifier {
+
+ public LocateFunctionModifier(LanguageFactory factory) {
+ super(factory);
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ modify(function);
+ List<Object> parts = new ArrayList<Object>();
+ List<Expression> params = function.getParameters();
+ parts.add("position("); //$NON-NLS-1$
+ parts.add(params.get(0));
+ parts.add(" in "); //$NON-NLS-1$
+ boolean useSubStr = false;
+ if (params.size() == 3) {
+ useSubStr = true;
+ if (params.get(2) instanceof Literal && ((Literal)params.get(2)).getValue() instanceof Integer) {
+ Integer value = (Integer)((Literal)params.get(2)).getValue();
+ if (value <= 1) {
+ useSubStr = false;
+ }
+ }
+ }
+ if (useSubStr) {
+ parts.add(0, "("); //$NON-NLS-1$
+ parts.add(this.getLanguageFactory().createFunction("substr", params.subList(1, 3), TypeFacility.RUNTIME_TYPES.STRING)); //$NON-NLS-1$
+ parts.add(")"); //$NON-NLS-1$
+ parts.add(" + "); //$NON-NLS-1$
+ if (params.get(2) instanceof Literal && ((Literal)params.get(2)).getValue() instanceof Integer) {
+ Integer value = (Integer)((Literal)params.get(2)).getValue();
+ parts.add(value - 1);
+ } else {
+ parts.add(params.get(2));
+ parts.add(" - 1"); //$NON-NLS-1$
+ }
+ } else {
+ parts.add(params.get(1));
+ }
+ parts.add(")"); //$NON-NLS-1$
+ return parts;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,284 @@
+/*
+ * 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.translator.jdbc.postgresql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+
+/**
+ * @since 4.3
+ */
+public class PostgreSQLCapabilities extends JDBCCapabilities {
+
+ public static final String EIGHT_0 = "8.0"; //$NON-NLS-1$
+ public static final String EIGHT_1 = "8.1"; //$NON-NLS-1$
+ public static final String EIGHT_2 = "8.2"; //$NON-NLS-1$
+ public static final String EIGHT_3 = "8.3"; //$NON-NLS-1$
+ public static final String EIGHT_4 = "8.4"; //$NON-NLS-1$
+
+ private String version = EIGHT_0;
+
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("BITAND"); //$NON-NLS-1$
+ supportedFunctions.add("BITNOT"); //$NON-NLS-1$
+ supportedFunctions.add("BITOR"); //$NON-NLS-1$
+ supportedFunctions.add("BITXOR"); //$NON-NLS-1$
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("FORMATBIGDECIMAL"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATBIGINTEGER"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATDOUBLE"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATFLOAT"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATINTEGER"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATLONG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("ROUND"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+
+ // These are executed within the server and never pushed down
+// supportedFunctions.add("CURDATE"); //$NON-NLS-1$
+// supportedFunctions.add("CURTIME"); //$NON-NLS-1$
+// supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+// supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ // These should not be pushed down since the grammar for string conversion is different
+// supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+// supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ if (this.version.compareTo(EIGHT_2) >= 0) {
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ }
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+
+ // Additional functions
+// // Math
+// supportedFunctions.add("%"); //$NON-NLS-1$
+// supportedFunctions.add("^"); //$NON-NLS-1$
+// supportedFunctions.add("|/"); //$NON-NLS-1$
+// supportedFunctions.add("||/"); //$NON-NLS-1$
+// supportedFunctions.add("!"); //$NON-NLS-1$
+// supportedFunctions.add("!!"); //$NON-NLS-1$
+// supportedFunctions.add("@"); //$NON-NLS-1$
+// // Bit manipulation
+// supportedFunctions.add("&"); //$NON-NLS-1$
+// supportedFunctions.add("|"); //$NON-NLS-1$
+// supportedFunctions.add("#"); //$NON-NLS-1$
+// supportedFunctions.add("~"); //$NON-NLS-1$
+// supportedFunctions.add("<<"); //$NON-NLS-1$
+// supportedFunctions.add(">>"); //$NON-NLS-1$
+//
+// supportedFunctions.add("CBRT"); //$NON-NLS-1$
+// supportedFunctions.add("CEIL"); //$NON-NLS-1$
+// supportedFunctions.add("LN"); //$NON-NLS-1$
+// supportedFunctions.add("MOD"); //$NON-NLS-1$
+// supportedFunctions.add("RANDOM"); //$NON-NLS-1$
+// supportedFunctions.add("SETSEED"); //$NON-NLS-1$
+// supportedFunctions.add("TRUNC"); //$NON-NLS-1$
+// supportedFunctions.add("WIDTH_BUCKET"); //$NON-NLS-1$
+//
+// // String
+// supportedFunctions.add("BIT_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("BTRIM"); //$NON-NLS-1$
+// supportedFunctions.add("CHAR_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("CHARACTER_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("DECODE"); //$NON-NLS-1$
+// supportedFunctions.add("ENCODE"); //$NON-NLS-1$
+// supportedFunctions.add("MD5"); //$NON-NLS-1$
+// supportedFunctions.add("OCTET_LENGTH"); //$NON-NLS-1$
+// supportedFunctions.add("PG_CLIENT_ENCODING"); //$NON-NLS-1$
+// supportedFunctions.add("QUOTE_IDENT"); //$NON-NLS-1$
+// supportedFunctions.add("QUOTE_LITERAL"); //$NON-NLS-1$
+// supportedFunctions.add("SPLIT_PART"); //$NON-NLS-1$
+// supportedFunctions.add("STRPOS"); //$NON-NLS-1$
+// supportedFunctions.add("SUBSTR"); //$NON-NLS-1$
+// supportedFunctions.add("TO_ASCII"); //$NON-NLS-1$
+// supportedFunctions.add("TO_HEX"); //$NON-NLS-1$
+// supportedFunctions.add("TRANSLATE"); //$NON-NLS-1$
+//
+// // Bit operations
+// supportedFunctions.add("GET_BIT"); //$NON-NLS-1$
+// supportedFunctions.add("GET_BYTE"); //$NON-NLS-1$
+// supportedFunctions.add("SET_BIT"); //$NON-NLS-1$
+// supportedFunctions.add("SET_BYTE"); //$NON-NLS-1$
+//
+// // Formatting
+// supportedFunctions.add("TO_CHAR"); //$NON-NLS-1$
+// supportedFunctions.add("TO_DATE"); //$NON-NLS-1$
+// supportedFunctions.add("TO_TIMESTAMP"); //$NON-NLS-1$
+// supportedFunctions.add("TO_NUMBER"); //$NON-NLS-1$
+//
+// // Date / Time
+// supportedFunctions.add("AGE"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_DATE"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("CURRENT_TIME"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("CURRENT_TIMESTAMP"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("DATE_PART"); //$NON-NLS-1$
+// supportedFunctions.add("DATE_TRUNC"); //$NON-NLS-1$
+// supportedFunctions.add("ISFINITE"); //$NON-NLS-1$
+// supportedFunctions.add("JUSTIFY_HOURS"); //$NON-NLS-1$
+// supportedFunctions.add("JUSTIFY_DAYS"); //$NON-NLS-1$
+// supportedFunctions.add("LOCALTIME"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("LOCALTIMESTAMP"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("TIMEOFDAY"); //$NON-NLS-1$
+//
+// // Conditional
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+// supportedFunctions.add("NULLIF"); //$NON-NLS-1$
+// supportedFunctions.add("GREATEST"); //$NON-NLS-1$
+// supportedFunctions.add("LEAST"); //$NON-NLS-1$
+//
+// // Network Addresses
+//// supportedFunctions.add("BROADCAST"); //$NON-NLS-1$
+//// supportedFunctions.add("HOST"); //$NON-NLS-1$
+//// supportedFunctions.add("MASKLEN"); //$NON-NLS-1$
+//// supportedFunctions.add("SET_MASKLEN"); //$NON-NLS-1$
+//// supportedFunctions.add("NETMASK"); //$NON-NLS-1$
+//// supportedFunctions.add("HOSTMASK"); //$NON-NLS-1$
+//// supportedFunctions.add("NETWORK"); //$NON-NLS-1$
+//// supportedFunctions.add("TEXT"); //$NON-NLS-1$
+//// supportedFunctions.add("ABBREV"); //$NON-NLS-1$
+//// supportedFunctions.add("FAMILY"); //$NON-NLS-1$
+//// supportedFunctions.add("TRUNC"); //$NON-NLS-1$
+//
+// // Set generator
+// supportedFunctions.add("GENERATE_SERIES"); //$NON-NLS-1$
+//
+// // Information
+// supportedFunctions.add("CURRENT_DATABASE"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_SCHEMA"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_SCHEMAS"); //$NON-NLS-1$
+// supportedFunctions.add("CURRENT_USER"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("INET_CLIENT_ADDR"); //$NON-NLS-1$
+// supportedFunctions.add("INET_CLIENT_PORT"); //$NON-NLS-1$
+// supportedFunctions.add("INET_SERVER_ADDR"); //$NON-NLS-1$
+// supportedFunctions.add("INET_SERVER_PORT"); //$NON-NLS-1$
+// supportedFunctions.add("SESSION_USER"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("USER"); //$NON-NLS-1$ // no ()
+// supportedFunctions.add("VERSION"); //$NON-NLS-1$
+//
+ return supportedFunctions;
+ }
+
+ /**
+ * This is true only after Postgre version 7.1
+ * However, since version 7 was released in 2000 we'll assume a post 7 instance.
+ *
+ * @see org.teiid.resource.adapter.jdbc.JDBCCapabilities#supportsInlineViews()
+ */
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+ public boolean supportsRowOffset() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsExcept()
+ */
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#supportsIntersect()
+ */
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+ public void setDatabaseVersion(String version) {
+ this.version = version;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,224 @@
+/*
+ * 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.translator.jdbc.postgresql;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.AggregateFunction;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.EscapeSyntaxModifier;
+import org.teiid.translator.jdbc.ExtractFunctionModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.ModFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.oracle.LeftOrRightFunctionModifier;
+import org.teiid.translator.jdbc.oracle.MonthOrDayNameFunctionModifier;
+
+
+
+/**
+ * Translator class for PostgreSQL. Updated to expect a 8.0+ jdbc client
+ * @since 4.3
+ */
+public class PostgreSQLTranslator extends Translator {
+
+ private String version = PostgreSQLCapabilities.EIGHT_0;
+
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ //TODO: all of the functions (except for convert) can be handled through just the escape syntax
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.LOG, new AliasModifier("ln")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LOG10, new AliasModifier("log")); //$NON-NLS-1$
+
+ registerFunctionModifier(SourceSystemFunctions.BITAND, new AliasModifier("&")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITNOT, new AliasModifier("~")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITOR, new AliasModifier("|")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.BITXOR, new AliasModifier("#")); //$NON-NLS-1$
+
+ registerFunctionModifier(SourceSystemFunctions.CHAR, new AliasModifier("chr")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.CONCAT, new AliasModifier("||")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("lower")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LEFT, new LeftOrRightFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.RIGHT, new LeftOrRightFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new AliasModifier("substr")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("upper")); //$NON-NLS-1$
+
+ registerFunctionModifier(SourceSystemFunctions.DAYNAME, new MonthOrDayNameFunctionModifier(getLanguageFactory(), "Day"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.DAYOFWEEK, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFYEAR, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.HOUR, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MINUTE, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MONTH, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.MONTHNAME, new MonthOrDayNameFunctionModifier(getLanguageFactory(), "Month"));//$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.QUARTER, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.SECOND, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.WEEK, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.YEAR, new ExtractFunctionModifier());
+ registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.IFNULL, new AliasModifier("coalesce")); //$NON-NLS-1$
+
+ registerFunctionModifier(SourceSystemFunctions.MOD, new ModFunctionModifier("%", getLanguageFactory(), Arrays.asList(TypeFacility.RUNTIME_TYPES.BIG_INTEGER, TypeFacility.RUNTIME_TYPES.BIG_DECIMAL))); //$NON-NLS-1$
+
+ //specific to 8.2 client or later
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new EscapeSyntaxModifier());
+
+ //add in type conversion
+ ConvertModifier convertModifier = new ConvertModifier();
+ convertModifier.addTypeMapping("boolean", FunctionModifier.BOOLEAN); //$NON-NLS-1$
+ convertModifier.addTypeMapping("smallint", FunctionModifier.BYTE, FunctionModifier.SHORT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("integer", FunctionModifier.INTEGER); //$NON-NLS-1$
+ convertModifier.addTypeMapping("bigint", FunctionModifier.LONG); //$NON-NLS-1$
+ convertModifier.addTypeMapping("real", FunctionModifier.FLOAT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("float8", FunctionModifier.DOUBLE); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(38)", FunctionModifier.BIGINTEGER); //$NON-NLS-1$
+ convertModifier.addTypeMapping("decimal", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
+ convertModifier.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convertModifier.addTypeMapping("varchar(4000)", FunctionModifier.STRING); //$NON-NLS-1$
+ convertModifier.addTypeMapping("date", FunctionModifier.DATE); //$NON-NLS-1$
+ convertModifier.addTypeMapping("time", FunctionModifier.TIME); //$NON-NLS-1$
+ convertModifier.addTypeMapping("timestamp", FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.TIMESTAMP, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList(function.getParameters().get(0), " + TIMESTAMP '1970-01-01'"); //$NON-NLS-1$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.TIME, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return Arrays.asList("cast(date_trunc('second', ", function.getParameters().get(0), ") AS time)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.DATE, FunctionModifier.STRING, new ConvertModifier.FormatModifier("to_char", "YYYY-MM-DD")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.STRING, new ConvertModifier.FormatModifier("to_char", "HH24:MI:SS")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.STRING, new ConvertModifier.FormatModifier("to_char", "YYYY-MM-DD HH24:MI:SS.UF")); //$NON-NLS-1$ //$NON-NLS-2$
+ convertModifier.addConvert(FunctionModifier.BOOLEAN, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ Expression stringValue = function.getParameters().get(0);
+ return Arrays.asList("CASE WHEN ", stringValue, " THEN 'true' WHEN not(", stringValue, ") THEN 'false' END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ });
+ convertModifier.addSourceConversion(new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ ((Literal)function.getParameters().get(1)).setValue("integer"); //$NON-NLS-1$
+ return null;
+ }
+ }, FunctionModifier.BOOLEAN);
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
+ }
+
+ @Override
+ public String translateLiteralBoolean(Boolean booleanValue) {
+ if(booleanValue.booleanValue()) {
+ return "TRUE"; //$NON-NLS-1$
+ }
+ return "FALSE"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String translateLiteralDate(Date dateValue) {
+ return "DATE '" + formatDateValue(dateValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTime(Time timeValue) {
+ return "TIME '" + formatDateValue(timeValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public String translateLiteralTimestamp(Timestamp timestampValue) {
+ return "TIMESTAMP '" + formatDateValue(timestampValue) + "'"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ @Override
+ public int getTimestampNanoPrecision() {
+ return 6;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<?> translateLimit(Limit limit, ExecutionContext context) {
+ if (limit.getRowOffset() > 0) {
+ return Arrays.asList("LIMIT ", limit.getRowLimit(), " OFFSET ", limit.getRowOffset()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return null;
+ }
+
+ /**
+ * Postgres doesn't provide min/max(boolean), so this conversion writes a min(BooleanValue) as
+ * bool_and(BooleanValue)
+ * @see org.teiid.connector.visitor.framework.LanguageObjectVisitor#visit(org.teiid.connector.language.AggregateFunction)
+ * @since 4.3
+ */
+ @Override
+ public List<?> translate(LanguageObject obj, ExecutionContext context) {
+ if (obj instanceof AggregateFunction) {
+ AggregateFunction agg = (AggregateFunction)obj;
+ if (agg.getExpression() != null && TypeFacility.RUNTIME_TYPES.BOOLEAN.equals(agg.getExpression().getType())) {
+ if (agg.getName().equalsIgnoreCase(SQLReservedWords.MIN)) {
+ agg.setName("bool_and"); //$NON-NLS-1$
+ } else if (agg.getName().equalsIgnoreCase(SQLReservedWords.MAX)) {
+ agg.setName("bool_or"); //$NON-NLS-1$
+ }
+ }
+ }
+ return super.translate(obj, context);
+ }
+
+ @Override
+ public NullOrder getDefaultNullOrder() {
+ return NullOrder.HIGH;
+ }
+
+ @Override
+ public boolean supportsExplicitNullOrdering() {
+ return version.compareTo(PostgreSQLCapabilities.EIGHT_4) >= 0;
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return PostgreSQLCapabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,138 @@
+/*
+ * 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.translator.jdbc.sqlserver;
+
+import java.util.*;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+/**
+ */
+public class SQLServerCapabilities extends JDBCCapabilities {
+
+ public SQLServerCapabilities() {
+ }
+
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ //supportedFunctons.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ //supportedFunctons.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ //supportedFunctons.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ //supportedFunctions.add("RAND"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ //supportedFunctons.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SPACE"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ //supportedFunctons.add("TRANSLATE"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+ //supportedFunctons.add("CURDATE"); //$NON-NLS-1$
+ //supportedFunctons.add("CURTIME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ //supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+ public boolean supportsExcept() {
+ return true;
+ };
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sqlserver/SQLServerSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,71 @@
+/*
+ * 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.translator.jdbc.sqlserver;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageObject;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.sybase.SybaseSQLTranslator;
+
+/**
+ * Updated to assume the use of the DataDirect, 2005 driver, or later.
+ */
+public class SQLServerSQLTranslator extends SybaseSQLTranslator {
+
+ //TEIID-31 remove mod modifier for SQL Server 2008
+
+ @Override
+ protected List<Object> convertDateToString(Function function) {
+ return Arrays.asList("replace(convert(varchar, ", function.getParameters().get(0), ", 102), '.', '-')"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected List<?> convertTimestampToString(Function function) {
+ return Arrays.asList("convert(varchar, ", function.getParameters().get(0), ", 21)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return SQLServerCapabilities.class;
+ }
+
+ @Override
+ public List<?> translate(LanguageObject obj, ExecutionContext context) {
+ if (obj instanceof ColumnReference) {
+ ColumnReference elem = (ColumnReference)obj;
+ if (TypeFacility.RUNTIME_TYPES.STRING.equals(elem.getType()) && elem.getMetadataObject() != null && "uniqueidentifier".equalsIgnoreCase(elem.getMetadataObject().getNativeType())) { //$NON-NLS-1$
+ return Arrays.asList("cast(", elem, " as char(36))"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ return super.translate(obj, context);
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SubstringFunctionModifier.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SubstringFunctionModifier.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SubstringFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,57 @@
+/*
+ * 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.translator.jdbc.sybase;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.FunctionModifier;
+
+
+/**
+ * Common logic for Substring modifiers requiring 3 parameters
+ */
+public class SubstringFunctionModifier extends FunctionModifier {
+
+ private LanguageFactory languageFactory;
+
+ public SubstringFunctionModifier(LanguageFactory languageFactory) {
+ this.languageFactory = languageFactory;
+ }
+
+ @Override
+ public List<?> translate(Function function) {
+ List<Expression> args = function.getParameters();
+
+ if(args.size() == 2) {
+ args.add(languageFactory.createFunction(SourceSystemFunctions.LENGTH, Arrays.asList(args.get(0)), TypeFacility.RUNTIME_TYPES.INTEGER));
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,134 @@
+/*
+ * 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.translator.jdbc.sybase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+/**
+ */
+public class SybaseCapabilities extends JDBCCapabilities {
+
+ public SybaseCapabilities() {
+ }
+
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 250;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ //supportedFunctions.add("RAND"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SPACE"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+ //supportedFunctons.add("CURDATE"); //$NON-NLS-1$
+ //supportedFunctons.add("CURTIME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ //supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add("QUARTER"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+ //supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.adapter.BasicConnectorCapabilities#getMaxFromGroups()
+ */
+ public int getMaxFromGroups() {
+ return 50;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseSQLTranslator.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseSQLTranslator.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/sybase/SybaseSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,214 @@
+/*
+ * 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.translator.jdbc.sybase;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.OrderBy;
+import org.teiid.connector.language.SetQuery;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.AliasModifier;
+import org.teiid.translator.jdbc.ConvertModifier;
+import org.teiid.translator.jdbc.EscapeSyntaxModifier;
+import org.teiid.translator.jdbc.FunctionModifier;
+import org.teiid.translator.jdbc.ModFunctionModifier;
+import org.teiid.translator.jdbc.Translator;
+
+
+/**
+ */
+public class SybaseSQLTranslator extends Translator {
+
+ /*
+ * @see com.metamatrix.connector.jdbc.extension.SQLTranslator#initialize(com.metamatrix.data.api.ConnectorEnvironment, com.metamatrix.data.metadata.runtime.RuntimeMetadata)
+ */
+ public void initialize(JDBCExecutionFactory env) throws ConnectorException {
+ super.initialize(env);
+ registerFunctionModifier(SourceSystemFunctions.MOD, new ModFunctionModifier("%", getLanguageFactory())); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.CONCAT, new AliasModifier("+")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("lower")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.IFNULL, new AliasModifier("isnull")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("upper")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.REPEAT, new AliasModifier("replicate")); //$NON-NLS-1$
+ registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new SubstringFunctionModifier(getLanguageFactory()));
+ registerFunctionModifier(SourceSystemFunctions.DAYNAME, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.MONTHNAME, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFWEEK, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFYEAR, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.DAYOFMONTH, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.HOUR, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.MINUTE, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.QUARTER, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.SECOND, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.WEEK, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPADD, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.TIMESTAMPDIFF, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.LENGTH, new EscapeSyntaxModifier());
+ registerFunctionModifier(SourceSystemFunctions.ATAN2, new EscapeSyntaxModifier());
+
+ //add in type conversion
+ ConvertModifier convertModifier = new ConvertModifier();
+ //boolean isn't treated as bit, since it doesn't support null
+ //byte is treated as smallint, since tinyint is unsigned
+ convertModifier.addTypeMapping("smallint", FunctionModifier.BYTE, FunctionModifier.SHORT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("int", FunctionModifier.INTEGER); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(19,0)", FunctionModifier.LONG); //$NON-NLS-1$
+ convertModifier.addTypeMapping("real", FunctionModifier.FLOAT); //$NON-NLS-1$
+ convertModifier.addTypeMapping("double precision", FunctionModifier.DOUBLE); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(38, 0)", FunctionModifier.BIGINTEGER); //$NON-NLS-1$
+ convertModifier.addTypeMapping("numeric(38, 19)", FunctionModifier.BIGDECIMAL); //$NON-NLS-1$
+ convertModifier.addTypeMapping("char(1)", FunctionModifier.CHAR); //$NON-NLS-1$
+ convertModifier.addTypeMapping("varchar(40)", FunctionModifier.STRING); //$NON-NLS-1$
+ convertModifier.addTypeMapping("datetime", FunctionModifier.DATE, FunctionModifier.TIME, FunctionModifier.TIMESTAMP); //$NON-NLS-1$
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.TIME, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ List<Object> result = new ArrayList<Object>();
+ result.add("cast("); //$NON-NLS-1$
+ result.add("'1970-01-01 ' + "); //$NON-NLS-1$
+ result.addAll(convertTimeToString(function));
+ result.add(" AS datetime)"); //$NON-NLS-1$
+ return result;
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.DATE, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ List<Object> result = new ArrayList<Object>();
+ result.add("cast("); //$NON-NLS-1$
+ result.addAll(convertDateToString(function));
+ result.add(" AS datetime)"); //$NON-NLS-1$
+ return result;
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.TIME, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return convertTimeToString(function);
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.DATE, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return convertDateToString(function);
+ }
+ });
+ convertModifier.addConvert(FunctionModifier.TIMESTAMP, FunctionModifier.STRING, new FunctionModifier() {
+ @Override
+ public List<?> translate(Function function) {
+ return convertTimestampToString(function);
+ }
+ });
+ convertModifier.addNumericBooleanConversions();
+ registerFunctionModifier(SourceSystemFunctions.CONVERT, convertModifier);
+ }
+
+ private List<Object> convertTimeToString(Function function) {
+ return Arrays.asList("convert(varchar, ", function.getParameters().get(0), ", 8)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ protected List<Object> convertDateToString(Function function) {
+ return Arrays.asList("stuff(stuff(convert(varchar, ", function.getParameters().get(0), ", 102), 5, 1, '-'), 8, 1, '-')"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Written to only support version 15
+ * @param function
+ * @return
+ */
+ protected List<?> convertTimestampToString(Function function) {
+ return Arrays.asList("stuff(convert(varchar, ", function.getParameters().get(0), ", 123), 11, 1, ' ')"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public boolean useAsInGroupAlias() {
+ return false;
+ }
+
+ @Override
+ public boolean hasTimeType() {
+ return false;
+ }
+
+ @Override
+ public int getTimestampNanoPrecision() {
+ return 3;
+ }
+
+ /**
+ * SetQueries don't have a concept of TOP, an inline view is needed.
+ */
+ @Override
+ public List<?> translateCommand(Command command, ExecutionContext context) {
+ if (!(command instanceof SetQuery)) {
+ return null;
+ }
+ SetQuery queryCommand = (SetQuery)command;
+ if (queryCommand.getLimit() == null) {
+ return null;
+ }
+ Limit limit = queryCommand.getLimit();
+ OrderBy orderBy = queryCommand.getOrderBy();
+ queryCommand.setLimit(null);
+ queryCommand.setOrderBy(null);
+ List<Object> parts = new ArrayList<Object>(6);
+ parts.add("SELECT "); //$NON-NLS-1$
+ parts.addAll(translateLimit(limit, context));
+ parts.add(" * FROM ("); //$NON-NLS-1$
+ parts.add(queryCommand);
+ parts.add(") AS X"); //$NON-NLS-1$
+ if (orderBy != null) {
+ parts.add(" "); //$NON-NLS-1$
+ parts.add(orderBy);
+ }
+ return parts;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<?> translateLimit(Limit limit, ExecutionContext context) {
+ return Arrays.asList("TOP ", limit.getRowLimit()); //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean useSelectLimit() {
+ return true;
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return SybaseCapabilities.class;
+ }
+
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teiid/TeiidCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teiid/TeiidCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teiid/TeiidCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,167 @@
+/*
+ * 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.translator.jdbc.teiid;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+/**
+ * @since 4.3
+ */
+public class TeiidCapabilities extends JDBCCapabilities {
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#getSupportedFunctions()
+ * @since 4.3
+ */
+ public List<String> getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("CEILING"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("COT"); //$NON-NLS-1$
+ supportedFunctions.add("DEGREES"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+ supportedFunctions.add("FLOOR"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATBIGDECIMAL"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATBIGINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATDOUBLE"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATFLOAT"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATLONG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG"); //$NON-NLS-1$
+ supportedFunctions.add("LOG10"); //$NON-NLS-1$
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEBIGDECIMAL"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEBIGINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEDOUBLE"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEFLOAT"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("PARSELONG"); //$NON-NLS-1$
+ supportedFunctions.add("PI"); //$NON-NLS-1$
+ supportedFunctions.add("POWER"); //$NON-NLS-1$
+ supportedFunctions.add("RADIANS"); //$NON-NLS-1$
+ supportedFunctions.add("RAND"); //$NON-NLS-1$
+ supportedFunctions.add("ROUND"); //$NON-NLS-1$
+ supportedFunctions.add("SIGN"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("ASCII"); //$NON-NLS-1$
+ supportedFunctions.add("CHAR"); //$NON-NLS-1$
+ supportedFunctions.add("CHR"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT"); //$NON-NLS-1$
+ supportedFunctions.add("CONCAT2"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+ supportedFunctions.add("INITCAP"); //$NON-NLS-1$
+ supportedFunctions.add("INSERT"); //$NON-NLS-1$
+ supportedFunctions.add("LCASE"); //$NON-NLS-1$
+ supportedFunctions.add("LENGTH"); //$NON-NLS-1$
+ supportedFunctions.add("LEFT"); //$NON-NLS-1$
+ supportedFunctions.add("LOCATE"); //$NON-NLS-1$
+ supportedFunctions.add("LPAD"); //$NON-NLS-1$
+ supportedFunctions.add("LTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("REPEAT"); //$NON-NLS-1$
+ supportedFunctions.add("REPLACE"); //$NON-NLS-1$
+ supportedFunctions.add("RPAD"); //$NON-NLS-1$
+ supportedFunctions.add("RIGHT"); //$NON-NLS-1$
+ supportedFunctions.add("RTRIM"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+ supportedFunctions.add("TRANSLATE"); //$NON-NLS-1$
+ supportedFunctions.add("UCASE"); //$NON-NLS-1$
+ supportedFunctions.add("CURDATE"); //$NON-NLS-1$
+ supportedFunctions.add("CURTIME"); //$NON-NLS-1$
+ supportedFunctions.add("NOW"); //$NON-NLS-1$
+ supportedFunctions.add("DAYNAME"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFMONTH"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFWEEK"); //$NON-NLS-1$
+ supportedFunctions.add("DAYOFYEAR"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATDATE"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATTIME"); //$NON-NLS-1$
+ supportedFunctions.add("FORMATTIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("MONTHNAME"); //$NON-NLS-1$
+ supportedFunctions.add("PARSEDATE"); //$NON-NLS-1$
+ supportedFunctions.add("PARSETIME"); //$NON-NLS-1$
+ supportedFunctions.add("PARSETIMESTAMP"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPADD"); //$NON-NLS-1$
+ supportedFunctions.add("TIMESTAMPDIFF"); //$NON-NLS-1$
+ supportedFunctions.add("WEEK"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("MODIFYTIMEZONE"); //$NON-NLS-1$
+ supportedFunctions.add("DECODESTRING"); //$NON-NLS-1$
+ supportedFunctions.add("DECODEINTEGER"); //$NON-NLS-1$
+ supportedFunctions.add("IFNULL"); //$NON-NLS-1$
+ supportedFunctions.add("NVL"); //$NON-NLS-1$
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ supportedFunctions.add("CONVERT"); //$NON-NLS-1$
+ supportedFunctions.add("USER"); //$NON-NLS-1$
+ supportedFunctions.add("FROM_UNIXTIME"); //$NON-NLS-1$
+ supportedFunctions.add("NULLIF"); //$NON-NLS-1$
+ supportedFunctions.add("COALESCE"); //$NON-NLS-1$
+ return supportedFunctions;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.ConnectorCapabilities#supportsFunctionsInGroupBy()
+ * @since 5.0
+ */
+ public boolean supportsFunctionsInGroupBy() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ public boolean supportsRowOffset() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+}
Added: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataCapabilities.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataCapabilities.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,87 @@
+/*
+ * 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.translator.jdbc.teradata;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.jdbc.JDBCCapabilities;
+
+
+
+/**
+ * for Teradata database Release V2R5.1
+ */
+public class TeradataCapabilities extends JDBCCapabilities {
+
+ public TeradataCapabilities() {
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsFullOuterJoins()
+ */
+ public boolean supportsFullOuterJoins() {
+ return false;
+ }
+
+ /**
+ * @see org.teiid.resource.cci.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List getSupportedFunctions() {
+ List supportedFunctions = new ArrayList();
+ supportedFunctions.addAll(super.getSupportedFunctions());
+ supportedFunctions.add("ABS"); //$NON-NLS-1$
+ supportedFunctions.add("ACOS"); //$NON-NLS-1$
+ supportedFunctions.add("ASIN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN"); //$NON-NLS-1$
+ supportedFunctions.add("ATAN2"); //$NON-NLS-1$
+ supportedFunctions.add("COS"); //$NON-NLS-1$
+ supportedFunctions.add("EXP"); //$NON-NLS-1$
+// supportedFunctions.add("LOG"); //$NON-NLS-1$ // "LN"
+// supportedFunctions.add("LOG10"); //$NON-NLS-1$ // "LOG"
+ supportedFunctions.add("MOD"); //$NON-NLS-1$
+ supportedFunctions.add("SIN"); //$NON-NLS-1$
+ supportedFunctions.add("SQRT"); //$NON-NLS-1$
+ supportedFunctions.add("TAN"); //$NON-NLS-1$
+ supportedFunctions.add("||"); //$NON-NLS-1$
+// supportedFunctions.add("CONCAT"); //$NON-NLS-1$ // "||"
+// supportedFunctions.add("LCASE"); //$NON-NLS-1$ // "LOWER"
+// supportedFunctions.add("LOCATE"); //$NON-NLS-1$ //"POSITION", "INDEX" ?
+ supportedFunctions.add("LOWER"); //$NON-NLS-1$
+ supportedFunctions.add("SUBSTRING"); //$NON-NLS-1$
+// supportedFunctions.add("UCASE"); //$NON-NLS-1$ // "UPPER"
+ supportedFunctions.add("UPPER"); //$NON-NLS-1$
+ supportedFunctions.add("HOUR"); //$NON-NLS-1$
+ supportedFunctions.add("MONTH"); //$NON-NLS-1$
+ supportedFunctions.add("YEAR"); //$NON-NLS-1$
+ supportedFunctions.add("DAY"); //$NON-NLS-1$
+ supportedFunctions.add("MINUTE"); //$NON-NLS-1$
+ supportedFunctions.add("SECOND"); //$NON-NLS-1$
+
+ supportedFunctions.add("CAST"); //$NON-NLS-1$
+ //supportedFunctions.add("CONVERT"); //$NON-NLS-1$ "CAST"
+
+ return supportedFunctions;
+ }
+
+}
Deleted: trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml
===================================================================
--- trunk/connectors/connector-jdbc/src/main/rar/META-INF/ra.xml 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<connector xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
- version="1.5">
-
- <vendor-name>Red Hat Middleware LLC</vendor-name>
- <eis-type>Teiid JDBC Connector</eis-type>
- <resourceadapter-version>1.0</resourceadapter-version>
- <license>
- <description>
- JBoss, Home of Professional Open Source.
- Copyright 2006, Red Hat Middleware LLC, and individual contributors
- as indicated by the @author tags. See the copyright.txt file in the
- distribution for a full listing of individual contributors.
-
- This 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 software 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 software; if not, write to the Free
- Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- </description>
- <license-required>true</license-required>
- </license>
- <resourceadapter>
- <resourceadapter-class>org.teiid.connector.basic.BasicResourceAdapter</resourceadapter-class>
-
- <outbound-resourceadapter>
- <connection-definition>
- <managedconnectionfactory-class>org.teiid.connector.jdbc.JDBCManagedConnectionFactory</managedconnectionfactory-class>
-
- <config-property>
- <description>{$display:"Connector Class",$advanced:"true"}</description>
- <config-property-name>ConnectorClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>org.teiid.connector.jdbc.JDBCConnector</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Connector Capabilities",$description:"The class to use to provide the Connector Capabilities",$advanced:"true"}</description>
- <config-property-name>CapabilitiesClass</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
-
- <config-property>
- <description>{$display:"Is Immutable",$description:"Is Immutable, True if the source never changes.",$advanced:"true"}</description>
- <config-property-name>Immutable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Is XA Capable",$description:"True, if this connector supports XA Transactions",$advanced:"true"}</description>
- <config-property-name>XaCapable</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Exception on Exceeding Max Rows",$description:"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",$advanced:"true"}</description>
- <config-property-name>ExceptionOnMaxRows</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>true</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Maximum Result Rows",$description:"Maximum Result Rows allowed",$advanced:"true"}</description>
- <config-property-name>MaxResultRows</config-property-name>
- <config-property-type>java.lang.Integer</config-property-type>
- <config-property-value>-1</config-property-value>
- </config-property>
-
- <!-- JDBC Specific properties -->
-
- <config-property>
- <description>{$display:"Use prepared statements and bind variables",$advanced:"true"}</description>
- <config-property-name>UseBindVariables</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"fetch size used from the connector to its underlying source.",$advanced:"true"}</description>
- <config-property-name>FetchSize</config-property-name>
- <config-property-type>java.lang.Integer</config-property-type>
- <config-property-value>1024</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Database time zone",$description:"Time zone of the database, if different than Integration Server",$advanced:"true"}</description>
- <config-property-name>DatabaseTimeZone</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
-
- <config-property>
- <description>{$display:"Extension SQL Translation Class",$required:"true",$advanced:"true",$allowed:["org.teiid.connector.jdbc.translator.Translator","org.teiid.connector.jdbc.oracle.OracleSQLTranslator","org.teiid.connector.jdbc.db2.DB2SQLTranslator", "org.teiid.connector.jdbc.sqlserver.SqlServerSQLTranslator", "org.teiid.connector.jdbc.mysql.MySQLTranslator","org.teiid.connector.jdbc.mysql.MySQL5Translator", "org.teiid.connector.jdbc.postgresql.PostgreSQLTranslator", "org.teiid.connector.jdbc.derby.DerbySQLTranslator", "org.teiid.connector.jdbc.access.AccessSQLTranslator","org.teiid.connector.jdbc.h2.H2Translator","org.teiid.connector.jdbc.h2.H2Translator"]}</description>
- <config-property-name>ExtensionTranslationClassName</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- <config-property-value>org.teiid.connector.jdbc.translator.Translator</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Source Connection JNDI Name",$required:"true"}</description>
- <description>JNDI Name of the physical resource.</description>
- <config-property-name>SourceJNDIName</config-property-name>
- <config-property-type>java.lang.String</config-property-type>
- </config-property>
-
- <config-property>
- <description>{$display:"Trim string flag",$description:"Right Trim fixed character types returned as Strings - note that the native type must be char or nchar and the source must support the rtrim function.",$advanced:"true"}</description>
- <config-property-name>TrimStrings</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <config-property>
- <description>{$display:"Use informational comments in Source Queries",$description:"This will embed /*comment*/ style comment with session/request id in source SQL query for informational purposes",$advanced:"true"}</description>
- <config-property-name>UseCommentsInSourceQuery</config-property-name>
- <config-property-type>java.lang.Boolean</config-property-type>
- <config-property-value>false</config-property-value>
- </config-property>
-
- <connectionfactory-interface>org.teiid.connector.api.Connector</connectionfactory-interface>
- <connectionfactory-impl-class>org.teiid.connector.basic.WrappedConnector</connectionfactory-impl-class>
- <connection-interface>org.teiid.connector.api.Connection</connection-interface>
- <connection-impl-class>org.teiid.connector.basic.WrappedConnection</connection-impl-class>
-
- </connection-definition>
-
- <transaction-support>NoTransaction</transaction-support>
-
- <authentication-mechanism>
- <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
- <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
- </authentication-mechanism>
- <reauthentication-support>false</reauthentication-support>
- </outbound-resourceadapter>
- </resourceadapter>
-</connector>
Copied: trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml (from rev 2084, trunk/connectors/connector-jdbc/src/main/rar/META-INF/ra.xml)
===================================================================
--- trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/rar/META-INF/ra.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<connector xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+ http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
+ version="1.5">
+
+ <vendor-name>Red Hat Middleware LLC</vendor-name>
+ <eis-type>Teiid JDBC Connector</eis-type>
+ <resourceadapter-version>1.0</resourceadapter-version>
+ <license>
+ <description>
+ JBoss, Home of Professional Open Source.
+ Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ as indicated by the @author tags. See the copyright.txt file in the
+ distribution for a full listing of individual contributors.
+
+ This 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 software 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 software; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ </description>
+ <license-required>true</license-required>
+ </license>
+ <resourceadapter>
+ <resourceadapter-class>org.teiid.connector.basic.BasicResourceAdapter</resourceadapter-class>
+
+ <outbound-resourceadapter>
+ <connection-definition>
+ <managedconnectionfactory-class>org.teiid.connector.jdbc.JDBCManagedConnectionFactory</managedconnectionfactory-class>
+
+ <config-property>
+ <!-- This property is for the auto creation of the Connector from DS -->
+ <description>{$display:"Connection Factory Class",$required:"true"}</description>
+ <config-property-name>ConnectionFactoryClass</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ <config-property-value>org.teiid.connector.jdbc.JDBCManagedConnectionFactory</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Connector Class"}</description>
+ <config-property-name>ConnectorClass</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ <config-property-value>org.teiid.connector.jdbc.JDBCConnector</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Connector Capabilities",$description:"The class to use to provide the Connector Capabilities"}</description>
+ <config-property-name>CapabilitiesClass</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Is Immutable",$description:"Is Immutable, True if the source never changes.",$advanced:"true"}</description>
+ <config-property-name>Immutable</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>false</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Is XA Capable",$description:"True, if this connector supports XA Transactions"}</description>
+ <config-property-name>XaCapable</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>false</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Exception on Exceeding Max Rows",$description:"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",$advanced:"true"}</description>
+ <config-property-name>ExceptionOnMaxRows</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>true</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Maximum Result Rows",$description:"Maximum Result Rows allowed",$advanced:"true"}</description>
+ <config-property-name>MaxResultRows</config-property-name>
+ <config-property-type>java.lang.Integer</config-property-type>
+ <config-property-value>-1</config-property-value>
+ </config-property>
+
+ <!-- JDBC Specific properties -->
+
+ <config-property>
+ <description>{$display:"Use prepared statements and bind variables",$advanced:"true"}</description>
+ <config-property-name>UseBindVariables</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>false</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"fetch size used from the connector to its underlying source.",$advanced:"true"}</description>
+ <config-property-name>FetchSize</config-property-name>
+ <config-property-type>java.lang.Integer</config-property-type>
+ <config-property-value>1024</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Database time zone",$description:"Time zone of the database, if different than Integration Server",$advanced:"true"}</description>
+ <config-property-name>DatabaseTimeZone</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Extension SQL Translation Class",$required:"true",$allowed:["org.teiid.connector.jdbc.translator.Translator","org.teiid.connector.jdbc.oracle.OracleSQLTranslator","org.teiid.connector.jdbc.db2.DB2SQLTranslator", "org.teiid.connector.jdbc.sqlserver.SqlServerSQLTranslator", "org.teiid.connector.jdbc.mysql.MySQLTranslator","org.teiid.connector.jdbc.mysql.MySQL5Translator", "org.teiid.connector.jdbc.postgresql.PostgreSQLTranslator", "org.teiid.connector.jdbc.derby.DerbySQLTranslator", "org.teiid.connector.jdbc.access.AccessSQLTranslator","org.teiid.connector.jdbc.h2.H2Translator","org.teiid.connector.jdbc.h2.H2Translator"]}</description>
+ <config-property-name>ExtensionTranslationClassName</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
+ <config-property-value>org.teiid.connector.jdbc.translator.Translator</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Trim string flag",$description:"Right Trim fixed character types returned as Strings - note that the native type must be char or nchar and the source must support the rtrim function.",$advanced:"true"}</description>
+ <config-property-name>TrimStrings</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>false</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>{$display:"Use informational comments in Source Queries",$description:"This will embed /*comment*/ style comment with session/request id in source SQL query for informational purposes",$advanced:"true"}</description>
+ <config-property-name>UseCommentsInSourceQuery</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>false</config-property-value>
+ </config-property>
+
+ <connectionfactory-interface>org.teiid.connector.api.Connector</connectionfactory-interface>
+ <connectionfactory-impl-class>org.teiid.connector.basic.WrappedConnector</connectionfactory-impl-class>
+ <connection-interface>org.teiid.connector.api.Connection</connection-interface>
+ <connection-impl-class>org.teiid.connector.basic.WrappedConnection</connection-impl-class>
+
+ </connection-definition>
+
+ <transaction-support>NoTransaction</transaction-support>
+
+ <authentication-mechanism>
+ <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+ <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+ </authentication-mechanism>
+ <reauthentication-support>false</reauthentication-support>
+ </outbound-resourceadapter>
+ </resourceadapter>
+</connector>
Added: trunk/connectors/translator-jdbc/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/translator-jdbc/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.jdbc.JDBCExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Property changes on: trunk/connectors/translator-jdbc/src/main/resources/META-INF/jboss-beans.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/jdbc/i18n.properties
===================================================================
--- trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/jdbc/i18n.properties (rev 0)
+++ trunk/connectors/translator-jdbc/src/main/resources/org/teiid/translator/jdbc/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,76 @@
+#
+# 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.
+#
+
+JDBCSourceConnectionFactory.Missing_JDBC_jndi_1=Missing JDBC Source JNDI Name
+JDBCSourceConnectionFactory.Missing_JDBC_protocol_name_2=Missing JDBC protocol name
+JDBCSourceConnectionFactory.Missing_JDBC_database_name_3=Missing JDBC database name
+JDBCSourceConnectionFactory.Unable_to_load_the_JDBC_driver_class_6=Unable to load the JDBC driver class "{0}".
+JDBCSourceConnectionFactory.Driver__7=Driver "{0}" can not load "{1}".
+JDBCUpdateExecution.batch_prep_stmt=Executing batched prepared statements is not supported: {0}
+JDBCUpdateExecution.batch_stored_proc=Executing batched stored procedures is not supported: {0}
+JDBCSourceConnectionFactory.til=Unsupported transaction isolation level "{0}".
+JDBCSourceConnectionFactory.MissingProp=Missing required property: {0}
+JDBCSourceXAConnecton.Connection_still_leased=Connection is still leased to connector worker. However, transaction ended, so terminating the lease.
+JDBCSourceConnectionFactory.Unable_to_find_jndi_ds=Failed to locate data source named {0} through JNDI lookup.
+
+JDBCTranslator.Unexpected_exception_translating_results___8=Unexpected exception while translating results: {0}
+JDBCTranslator.Unknown_error_translating_results___9=Unknown error translating results: {0}
+
+JDBCTranslator._Unable_to_get_Blob_and_set_parameter._{0}=\ Unable to get Blob and set parameter. {0}
+JDBCTranslator._Unable_to_get_Clob_and_set_parameter._{0}=\ Unable to get Clob and set parameter. {0}
+JDBCTranslator.Unable_to_set_appropriate_output_parameter_type_of_class({0})=Unable to set the appropriate output parameter type of class({0}) to JDBC Driver
+
+JDBCConnector.No_license_found_for_{0}=No license found for {0}
+JDBCConnector.JDBCConnector_initialized._1=JDBCConnector initialized.
+JDBCConnector.JDBCConnector_stopped._3=JDBCConnector stopped.
+JDBCConnector.JDBCConnector_started._4=JDBCConnector started.
+JDBCConnector.JDBCConnector_is_not_started._5=JDBCConnector is not started.
+JDBCConnector.unsupported_identity_type=Unsupported identity type.
+JDBCConnector.non_xa_connection_source=Connection source does not support XA.
+JDBCConnector.invalid_source=Specified connection source {0} is not a XADataSource, DataSource, or Driver
+
+BlobValueReference.Unable_to_read_BLOB_data=Unable to read BLOB data from InputStream.
+ClobValueReference.Unable_to_read_CLOB_data=Unable to read CLOB data from character stream.
+BasicSQLTranslator.The_format_of_set_criteria_batch_size_is_incorrect._1=The format of set criteria batch size is incorrect.
+JDBCSynchExecution.Statement_type_not_support_for_command_1=Statement type {0} not support for command {1}
+JDBCSourceConnection.Property_{0}_is_required,_but_not_defined_1=Property {0} is required, but not defined
+DropFunctionModifier.DropFunctionModifier_can_only_be_used_on_functions_with___1=DropFunctionModifier can only be used on functions with minimum or more number of arguments:
+JDBCSourceConnection.Execution_mode_not_supported__{0}_1=Execution mode not supported: {0}
+JDBCProcedureExecution.The_parameter_direction_must_be_out_or_inout_1=The parameter direction must be out or inout
+JDBCProcedureExecution.Unexpected_exception_1=Unexpected exception
+JDBCQueryExecution.Error_executing_query__1 = {0}\n\nExecuting statement:\n\n {1}
+JDBCQueryExecution.Error_executing_query__2 = {0}\n\nAfter executing batch statements:\n
+JDBCQueryExecution.Error_executing_query__3 = {0}\n\nWhile executing batch statements:\n
+
+JDBCSingleIdentityDSConnectionFactory.Unable_to_set_DataSource_property=Unable to set DataSource property name \"{0}\" to value \"{1}"
+JDBCXAConnector.Connector_use_exclusive_mode_1=Connector uses exclusive connections for transactions.
+
+ConnectionListener.failed_to_report_jdbc_connection_details=Failed to report the JDBC driver and connection information
+ConnectionListener.failed_to_report_oracle_connection_details=Failed to report Oracle driver and connection information, consider making the V$ tables public for providing useful information for tuning purposes
+StringToTimestampWithTimeZoneTransform=Unable to parse timestamp string: {0}
+
+JDBCUserIdentityConnectionFactory.Unable_to_get_credentials=Unable to extract credentials from command payload or trusted session payload for per-user connection.
+JDBCUserIdentityConnectionFactory.Connection_property_missing=Required connection property "{0}" missing for system "{1}".
+
+BasicResultsTranslator.Couldn__t_parse_property=Could not parse property: {0}
+
+JDBCMetadataProcessor.cannot_find_primary=Cannot find primary key table {0}
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/FakeMetadataFactory.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/FakeMetadataFactory.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/FakeMetadataFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,11 +26,11 @@
import junit.framework.Assert;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
import com.metamatrix.cdk.api.TranslationUtility;
import com.metamatrix.cdk.unittest.FakeTranslationFactory;
@@ -56,7 +56,7 @@
// Convert from sql to objects
Command obj = helpTranslate(vdb, input);
- TranslatedCommand tc = new TranslatedCommand(Mockito.mock(ExecutionContext.class), translator); //$NON-NLS-1$
+ TranslatedCommand tc = new TranslatedCommand(Mockito.mock(ExecutionContext.class), translator);
tc.translateCommand(obj);
// Check stuff
Added: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,44 @@
+/*
+ * 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.connector.jdbc;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.sqlserver.SQLServerSQLTranslator;
+public class TestJDBCExecutionFactory {
+
+ @Test public void testGetExtensionTranslationClassDefault() throws Exception {
+ JDBCExecutionFactory mcf = new JDBCExecutionFactory();
+ assertSame(Translator.class, mcf.getTranslator().getClass());
+ }
+
+ @Test public void testGetExtensionTranslationClass() throws Exception {
+ JDBCExecutionFactory mcf = new JDBCExecutionFactory();
+ mcf.setExtensionTranslationClassName(SQLServerSQLTranslator.class.getName());
+ assertSame(SQLServerSQLTranslator.class, mcf.getTranslator().getClass());
+ }
+
+}
Property changes on: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCExecutionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCManagedConnectionFactory.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCManagedConnectionFactory.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCManagedConnectionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,43 +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.connector.jdbc;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-import org.teiid.connector.jdbc.sqlserver.SQLServerSQLTranslator;
-import org.teiid.connector.jdbc.translator.Translator;
-public class TestJDBCManagedConnectionFactory {
-
- @Test public void testGetExtensionTranslationClassDefault() throws Exception {
- JDBCManagedConnectionFactory mcf = new JDBCManagedConnectionFactory();
- assertSame(Translator.class, mcf.getTranslator().getClass());
- }
-
- @Test public void testGetExtensionTranslationClass() throws Exception {
- JDBCManagedConnectionFactory mcf = new JDBCManagedConnectionFactory();
- mcf.setExtensionTranslationClassName(SQLServerSQLTranslator.class.getName());
- assertSame(SQLServerSQLTranslator.class, mcf.getTranslator().getClass());
- }
-
-}
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCProcedureExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCProcedureExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,10 +31,11 @@
import org.junit.Test;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.adapter.jdbc.JDBCProcedureExecution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.Translator;
public class TestJDBCProcedureExecution {
@@ -47,11 +48,10 @@
Mockito.stub(connection.prepareCall("{ call spTest8a(?)}")).toReturn(cs); //$NON-NLS-1$
Translator sqlTranslator = new Translator();
- JDBCManagedConnectionFactory config = Mockito.mock(JDBCManagedConnectionFactory.class);
+ JDBCExecutionFactory config = Mockito.mock(JDBCExecutionFactory.class);
Mockito.stub(config.getTranslator()).toReturn(sqlTranslator);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- JDBCProcedureExecution procedureExecution = new JDBCProcedureExecution(command, connection, Mockito.mock(ExecutionContext.class), config);
+ JDBCProcedureExecution procedureExecution = new JDBCProcedureExecution(command, connection, Mockito.mock(ExecutionContext.class), config, sqlTranslator);
procedureExecution.execute();
assertEquals(Arrays.asList(5), procedureExecution.getOutputParameterValues());
Mockito.verify(cs, Mockito.times(1)).registerOutParameter(1, Types.INTEGER);
@@ -65,11 +65,10 @@
Mockito.stub(connection.prepareCall("{ call spTest8(?,?)}")).toReturn(cs); //$NON-NLS-1$
Translator sqlTranslator = new Translator();
- JDBCManagedConnectionFactory config = Mockito.mock(JDBCManagedConnectionFactory.class);
+ JDBCExecutionFactory config = Mockito.mock(JDBCExecutionFactory.class);
Mockito.stub(config.getTranslator()).toReturn(sqlTranslator);
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- JDBCProcedureExecution procedureExecution = new JDBCProcedureExecution(command, connection, Mockito.mock(ExecutionContext.class), config );
+ JDBCProcedureExecution procedureExecution = new JDBCProcedureExecution(command, connection, Mockito.mock(ExecutionContext.class), config, sqlTranslator);
procedureExecution.execute();
assertEquals(Arrays.asList(5), procedureExecution.getOutputParameterValues());
Mockito.verify(cs, Mockito.times(1)).registerOutParameter(2, Types.INTEGER);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCUpdateExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCUpdateExecution.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,13 +28,14 @@
import org.junit.Test;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorLogger;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
+import org.teiid.connector.language.ExpressionValueSource;
import org.teiid.connector.language.Insert;
-import org.teiid.connector.language.ExpressionValueSource;
import org.teiid.connector.language.Literal;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.adapter.jdbc.JDBCUpdateExecution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.Translator;
public class TestJDBCUpdateExecution {
@@ -53,11 +54,10 @@
Mockito.stub(p.executeBatch()).toReturn(new int [] {1, 1});
Mockito.stub(connection.prepareStatement("INSERT INTO SmallA (IntKey, IntNum) VALUES (?, ?)")).toReturn(p); //$NON-NLS-1$
- JDBCManagedConnectionFactory config = Mockito.mock(JDBCManagedConnectionFactory.class);
+ JDBCExecutionFactory config = Mockito.mock(JDBCExecutionFactory.class);
Mockito.stub(config.getTranslator()).toReturn(new Translator());
- Mockito.stub(config.getLogger()).toReturn(Mockito.mock(ConnectorLogger.class));
- JDBCUpdateExecution updateExecution = new JDBCUpdateExecution(command, connection, Mockito.mock(ExecutionContext.class), config);
+ JDBCUpdateExecution updateExecution = new JDBCUpdateExecution(command, connection, Mockito.mock(ExecutionContext.class), config, config.getTranslator());
updateExecution.execute();
Mockito.verify(p, Mockito.times(2)).addBatch();
}
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TranslationHelper.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TranslationHelper.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/TranslationHelper.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,11 +30,11 @@
import junit.framework.Assert;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
import com.metamatrix.cdk.api.TranslationUtility;
import com.metamatrix.cdk.unittest.FakeTranslationFactory;
@@ -66,7 +66,7 @@
Collection <FunctionMethod> methods = FunctionMetadataReader.loadFunctionMethods(TranslationHelper.class.getResource(udf).openStream());
util.setUDF(methods);
} catch (IOException e) {
- throw new MetaMatrixRuntimeException("failed to load UDF");
+ throw new MetaMatrixRuntimeException("failed to load UDF"); //$NON-NLS-1$
}
}
return util.parseCommand(sql);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/access/TestAccessSQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/access/TestAccessSQLTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/access/TestAccessSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,12 +25,13 @@
import junit.framework.TestCase;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.access.AccessSQLTranslator;
import com.metamatrix.cdk.unittest.FakeTranslationFactory;
@@ -45,7 +46,7 @@
static {
try {
TRANSLATOR = new AccessSQLTranslator();
- TRANSLATOR.initialize( Mockito.mock(JDBCManagedConnectionFactory.class));
+ TRANSLATOR.initialize(Mockito.mock(JDBCExecutionFactory.class));
} catch(ConnectorException e) {
e.printStackTrace();
}
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2ConvertModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2ConvertModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2ConvertModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,12 +29,13 @@
import junit.framework.TestCase;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.db2.DB2SQLTranslator;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -54,7 +55,7 @@
public String helpGetString(Expression expr) throws Exception {
DB2SQLTranslator trans = new DB2SQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(expr);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,12 +27,13 @@
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.db2.DB2SQLTranslator;
import com.metamatrix.cdk.api.TranslationUtility;
import com.metamatrix.cdk.unittest.FakeTranslationFactory;
@@ -47,7 +48,7 @@
@BeforeClass
public static void setUp() throws ConnectorException {
TRANSLATOR = new DB2SQLTranslator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
public String getTestVDB() {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbyCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbyCapabilities.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbyCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,6 +25,7 @@
import static org.junit.Assert.*;
import org.junit.Test;
+import org.teiid.translator.jdbc.derby.DerbyCapabilities;
public class TestDerbyCapabilities {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbySQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbySQLTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/derby/TestDerbySQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,9 +24,11 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
+import org.mockito.Mockito;
import org.teiid.connector.jdbc.TranslationHelper;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.derby.DerbySQLTranslator;
/**
@@ -38,7 +40,7 @@
@BeforeClass
public static void setUp() throws ConnectorException {
TRANSLATOR = new DerbySQLTranslator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(Mockito.mock(JDBCExecutionFactory.class));
}
@Test
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/extension/TestSQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/extension/TestSQLConversionVisitor.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/extension/TestSQLConversionVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,16 +22,11 @@
package org.teiid.connector.jdbc.extension;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.LanguageObject;
import org.teiid.connector.metadata.runtime.RuntimeMetadata;
import org.teiid.dqp.internal.datamgr.impl.ExecutionContextImpl;
@@ -41,6 +36,11 @@
import org.teiid.dqp.internal.datamgr.language.TestQueryImpl;
import org.teiid.dqp.internal.datamgr.language.TestUpdateImpl;
import org.teiid.dqp.internal.datamgr.language.TstLanguageBridgeFactory;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.Translator;
/**
*/
@@ -59,7 +59,7 @@
@BeforeClass public static void oneTimeSetup() throws ConnectorException {
TRANSLATOR = new Translator();
- JDBCManagedConnectionFactory env = new JDBCManagedConnectionFactory();
+ JDBCExecutionFactory env = new JDBCExecutionFactory();
env.setTrimStrings(true);
TRANSLATOR.initialize(env);
}
@@ -74,7 +74,7 @@
public void helpTestVisitor(String vdb, String input, String expectedOutput, boolean usePreparedStatement) {
Translator trans = new Translator();
- JDBCManagedConnectionFactory env = new JDBCManagedConnectionFactory();
+ JDBCExecutionFactory env = new JDBCExecutionFactory();
if (usePreparedStatement) {
env.setUseBindVariables(true);
}
@@ -89,7 +89,7 @@
public static final RuntimeMetadata metadata = TstLanguageBridgeFactory.metadataFactory;
private String getStringWithContext(LanguageObject obj) throws ConnectorException {
- JDBCManagedConnectionFactory env = new JDBCManagedConnectionFactory();
+ JDBCExecutionFactory env = new JDBCExecutionFactory();
env.setUseCommentsInSourceQuery(true);
Translator trans = new Translator();
trans.initialize(env);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/h2/TestH2Translator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/h2/TestH2Translator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/h2/TestH2Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,9 +24,10 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.h2.H2Translator;
public class TestH2Translator {
@@ -35,7 +36,7 @@
@BeforeClass
public static void setUp() throws ConnectorException {
TRANSLATOR = new H2Translator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
@Test public void testTimestampDiff() throws Exception {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQL5Translator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQL5Translator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQL5Translator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,9 +24,10 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.mysql.MySQL5Translator;
/**
*/
@@ -36,7 +37,7 @@
@BeforeClass public static void oneTimeSetup() throws ConnectorException {
TRANSLATOR = new MySQL5Translator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
@Test public void testChar() throws Exception {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQLTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/mysql/TestMySQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,9 +25,10 @@
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.mysql.MySQLTranslator;
/**
*/
@@ -37,7 +38,7 @@
@BeforeClass public static void oneTimeSetup() throws ConnectorException {
TRANSLATOR = new MySQLTranslator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
private String getTestVDB() {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestDayWeekQuarterFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestDayWeekQuarterFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestDayWeekQuarterFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,12 +27,13 @@
import junit.framework.TestCase;
-import org.teiid.connector.api.SourceSystemFunctions;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -56,7 +57,7 @@
String.class);
OracleSQLTranslator trans = new OracleSQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLeftOrRightFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLeftOrRightFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLeftOrRightFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,11 +26,12 @@
import junit.framework.TestCase;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
/**
*/
@@ -52,7 +53,7 @@
String.class);
OracleSQLTranslator trans = new OracleSQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLog10FunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLog10FunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestLog10FunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -32,6 +32,7 @@
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
import org.teiid.connector.visitor.util.SQLStringVisitor;
+import org.teiid.translator.jdbc.oracle.Log10FunctionModifier;
/**
*/
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestMonthOrDayNameFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestMonthOrDayNameFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestMonthOrDayNameFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,11 +27,12 @@
import junit.framework.TestCase;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -55,7 +56,7 @@
String.class);
OracleSQLTranslator trans = new OracleSQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleConvertModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleConvertModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleConvertModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.connector.jdbc.oracle;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -31,13 +31,14 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -50,12 +51,12 @@
private static Translator TRANSLATOR = new OracleSQLTranslator();
@BeforeClass public static void oneTimeSetup() throws Exception {
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
public String helpGetString(Expression expr) throws Exception {
OracleSQLTranslator trans = new OracleSQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = TRANSLATOR.getSQLConversionVisitor();
sqlVisitor.append(expr);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestOracleTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,12 +28,7 @@
import org.junit.Before;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
-import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.Command;
import org.teiid.connector.metadata.runtime.Column;
import org.teiid.connector.metadata.runtime.MetadataStore;
@@ -43,6 +38,12 @@
import org.teiid.dqp.internal.datamgr.impl.FakeExecutionContextImpl;
import org.teiid.metadata.CompositeMetadataStore;
import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.Translator;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
import com.metamatrix.cdk.CommandBuilder;
import com.metamatrix.cdk.api.TranslationUtility;
@@ -64,7 +65,7 @@
@Before
public void setup() throws Exception {
TRANSLATOR = new OracleSQLTranslator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
private void helpTestVisitor(String input, String expectedOutput) throws ConnectorException {
@@ -140,6 +141,17 @@
input, output,
TRANSLATOR);
}
+
+ /**
+ * here we use the date form of the conversion
+ */
+ @Test public void testConversion6a() throws Exception {
+ String input = "SELECT convert(timestampvalue, string) FROM BQT1.SMALLA"; //$NON-NLS-1$
+ String output = "SELECT to_char(SmallishA.timestampvalue, 'YYYY-MM-DD HH24:MI:SS') FROM SmallishA"; //$NON-NLS-1$
+
+ helpTestVisitor(getOracleSpecificMetadata(), input, EMPTY_CONTEXT, null, output);
+ }
+
@Test public void testConversion8() throws Exception {
String input = "SELECT nvl(INTNUM, 'otherString') FROM BQT1.SMALLA"; //$NON-NLS-1$
String output = "SELECT nvl(to_char(SmallA.IntNum), 'otherString') FROM SmallA"; //$NON-NLS-1$
@@ -414,12 +426,7 @@
*/
@Test public void test_sdo_within_distance3() throws Exception {
String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance(STRINGKEY, 'SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
- // using ? for bind value as r marks the criteria as bindEligible
- // due to literal of type Object appearing in left side of criteria.
- // The literal Object is a result of the sdo_within_distance function
- // signature being sdo_within_distance(string, object, string) : string
- // as the signature was the best match for this query.
- String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SmallA.StringKey, SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = ?"; //$NON-NLS-1$
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SmallA.StringKey, SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = 'true'"; //$NON-NLS-1$
TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, UDF,
input, output,
@@ -435,12 +442,7 @@
*/
@Test public void test_sdo_within_distance4() throws Exception {
String input = "SELECT INTKEY FROM BQT1.SMALLA WHERE sdo_within_distance('SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL)', 'DISTANCE=25.0 UNIT=NAUT_MILE') = true"; //$NON-NLS-1$
- // using ? for bind value as r marks the criteria as bindEligible
- // due to literal of type Object appearing in left side of criteria.
- // The literal Object is a result of the sdo_within_distance function
- // signature being sdo_within_distance(string, object, string) : string
- // as the signature was the best match for this query.
- String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = ?"; //$NON-NLS-1$
+ String output = "SELECT SmallA.IntKey FROM SmallA WHERE sdo_within_distance(SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), SDO_GEOMETRY(2001, 8307, MDSYS.SDO_POINT_TYPE(90.0, -45.0, NULL), NULL, NULL), 'DISTANCE=25.0 UNIT=NAUT_MILE') = 'true'"; //$NON-NLS-1$
TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, UDF,
input, output,
@@ -521,7 +523,7 @@
private void helpTestVisitor(Command obj, ExecutionContext context, String dbmsTimeZone, String expectedOutput) throws ConnectorException {
OracleSQLTranslator translator = new OracleSQLTranslator();
- JDBCManagedConnectionFactory f = new JDBCManagedConnectionFactory();
+ JDBCExecutionFactory f = new JDBCExecutionFactory();
if (dbmsTimeZone != null) {
f.setDatabaseTimeZone(dbmsTimeZone);
}
@@ -705,14 +707,17 @@
String[] elemNames = new String[] {
"DoubleNum", //$NON-NLS-1$
"ID", //$NON-NLS-1$
+ "timestampvalue", //$NON-NLS-1$
};
String[] elemTypes = new String[] {
DataTypeManager.DefaultDataTypes.DOUBLE,
DataTypeManager.DefaultDataTypes.INTEGER,
+ DataTypeManager.DefaultDataTypes.TIMESTAMP,
};
List<Column> cols = RealMetadataFactory.createElements(table, elemNames, elemTypes);
cols.get(1).setAutoIncremented(true);
cols.get(1).setNameInSource("ID:SEQUENCE=MYSEQUENCE.nextVal"); //$NON-NLS-1$
+ cols.get(2).setNativeType("date"); //$NON-NLS-1$
RealMetadataFactory.createElements(dual, new String[] {"something"}, new String[] {DataTypeManager.DefaultDataTypes.STRING}); //$NON-NLS-1$
CompositeMetadataStore store = new CompositeMetadataStore(metadataStore);
@@ -757,9 +762,15 @@
String input = "(select intkey from bqt1.smalla limit 50, 100) union select intnum from bqt1.smalla order by intkey"; //$NON-NLS-1$
String output = "SELECT c_0 FROM (SELECT VIEW_FOR_LIMIT.*, ROWNUM ROWNUM_ FROM (SELECT g_1.IntKey AS c_0 FROM SmallA g_1) VIEW_FOR_LIMIT WHERE ROWNUM <= 150) WHERE ROWNUM_ > 50 UNION SELECT g_0.IntNum AS c_0 FROM SmallA g_0 ORDER BY c_0 NULLS FIRST"; //$NON-NLS-1$
- CommandBuilder commandBuilder = new CommandBuilder(FakeMetadataFactory.exampleBQTCached());
+ CommandBuilder commandBuilder = new CommandBuilder(FakeMetadataFactory.exampleBQTCached());
Command obj = commandBuilder.getCommand(input, true, true);
this.helpTestVisitor(obj, EMPTY_CONTEXT, null, output);
}
+
+ @Test public void testCot() throws Exception {
+ String sql = "select cot(doublenum) from BQT1.Smalla"; //$NON-NLS-1$
+ String expected = "SELECT (1 / tan(SmallA.DoubleNum)) FROM SmallA"; //$NON-NLS-1$
+ helpTestVisitor(FakeMetadataFactory.exampleBQTCached(), sql, EMPTY_CONTEXT, null, expected);
+ }
}
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestSubstringFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestSubstringFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/oracle/TestSubstringFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,12 +26,13 @@
import junit.framework.TestCase;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.oracle.OracleSQLTranslator;
/**
*/
@@ -53,7 +54,7 @@
Arrays.asList(args), TypeFacility.RUNTIME_TYPES.STRING);
OracleSQLTranslator trans = new OracleSQLTranslator();
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/postgresql/TestPostgreSQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/postgresql/TestPostgreSQLTranslator.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/postgresql/TestPostgreSQLTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,9 +24,10 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.postgresql.PostgreSQLTranslator;
public class TestPostgreSQLTranslator {
@@ -34,7 +35,7 @@
@BeforeClass public static void setupOnce() throws Exception {
TRANSLATOR = new PostgreSQLTranslator();
- TRANSLATOR.initialize(new JDBCManagedConnectionFactory());
+ TRANSLATOR.initialize(new JDBCExecutionFactory());
}
public String getTestVDB() {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sqlserver/TestSqlServerConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/sqlserver/TestSqlServerConversionVisitor.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sqlserver/TestSqlServerConversionVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,8 +26,6 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
import org.teiid.connector.language.Command;
import org.teiid.connector.metadata.runtime.Column;
@@ -36,6 +34,9 @@
import org.teiid.connector.metadata.runtime.Table;
import org.teiid.metadata.CompositeMetadataStore;
import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.sqlserver.SQLServerSQLTranslator;
import com.metamatrix.cdk.api.TranslationUtility;
import com.metamatrix.common.types.DataTypeManager;
@@ -50,7 +51,7 @@
@BeforeClass
public static void setup() throws ConnectorException {
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
}
public String getTestVDB() {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseConvertModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseConvertModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseConvertModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.connector.jdbc.sybase;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -30,13 +30,14 @@
import org.junit.BeforeClass;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
-import org.teiid.connector.jdbc.translator.SQLConversionVisitor;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.sybase.SybaseSQLTranslator;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -50,7 +51,7 @@
@BeforeClass
public static void setup() throws ConnectorException {
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
}
public String helpGetString(Expression expr) throws Exception {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseSQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseSQLConversionVisitor.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/sybase/TestSybaseSQLConversionVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,17 +22,18 @@
package org.teiid.connector.jdbc.sybase;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.jdbc.TranslationHelper;
-import org.teiid.connector.jdbc.translator.TranslatedCommand;
import org.teiid.connector.language.Command;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.translator.jdbc.TranslatedCommand;
+import org.teiid.translator.jdbc.sybase.SybaseSQLTranslator;
/**
*/
@@ -42,7 +43,7 @@
@BeforeClass
public static void setup() throws ConnectorException {
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
}
public String getTestVDB() {
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestEscapeSyntaxModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestEscapeSyntaxModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestEscapeSyntaxModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,10 +26,10 @@
import java.util.Arrays;
import java.util.List;
-import org.teiid.connector.jdbc.translator.EscapeSyntaxModifier;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.Literal;
import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.translator.jdbc.EscapeSyntaxModifier;
import junit.framework.TestCase;
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestExtractFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestExtractFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestExtractFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,15 +27,18 @@
import junit.framework.TestCase;
-import org.teiid.connector.api.SourceSystemFunctions;
-import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.language.ColumnReference;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
import org.teiid.connector.language.Literal;
import org.teiid.connector.language.NamedTable;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.translator.jdbc.ExtractFunctionModifier;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.Translator;
import com.metamatrix.query.unittest.TimestampUtil;
@@ -61,7 +64,7 @@
ExtractFunctionModifier mod = new ExtractFunctionModifier ();
Translator trans = new Translator();
trans.registerFunctionModifier(target, mod);
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestLocateFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestLocateFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestLocateFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,17 +22,20 @@
package org.teiid.connector.jdbc.translator;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.SourceSystemFunctions;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.LocateFunctionModifier;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.Translator;
/**
* Test <code>LOCATEFunctionModifier</code> by invoking its methods with varying
@@ -97,14 +100,14 @@
Translator trans = new Translator() {
@Override
- public void initialize(JDBCManagedConnectionFactory env)
+ public void initialize(JDBCExecutionFactory env)
throws ConnectorException {
super.initialize(env);
registerFunctionModifier(SourceSystemFunctions.LOCATE, new LocateFunctionModifier(getLanguageFactory(), locateFunctionName, parameterOrder));
}
};
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestModFunctionModifier.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestModFunctionModifier.java 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/connector/jdbc/translator/TestModFunctionModifier.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,15 +28,16 @@
import junit.framework.TestCase;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.SourceSystemFunctions;
-import org.teiid.connector.jdbc.JDBCManagedConnectionFactory;
import org.teiid.connector.language.Expression;
import org.teiid.connector.language.Function;
import org.teiid.connector.language.LanguageFactory;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.jdbc.JDBCExecutionFactory;
+import org.teiid.resource.cci.SourceSystemFunctions;
+import org.teiid.translator.jdbc.ModFunctionModifier;
+import org.teiid.translator.jdbc.SQLConversionVisitor;
+import org.teiid.translator.jdbc.Translator;
-import com.metamatrix.cdk.CommandBuilder;
-
/**
* Test <code>ModFunctionModifier</code> by invoking its methods with varying
* parameters to validate it performs as designed and expected.
@@ -92,14 +93,14 @@
Translator trans = new Translator() {
@Override
- public void initialize(JDBCManagedConnectionFactory env)
+ public void initialize(JDBCExecutionFactory env)
throws ConnectorException {
super.initialize(env);
registerFunctionModifier(SourceSystemFunctions.MOD, new ModFunctionModifier(modFunctionName, getLanguageFactory()));
}
};
- trans.initialize(new JDBCManagedConnectionFactory());
+ trans.initialize(new JDBCExecutionFactory());
SQLConversionVisitor sqlVisitor = trans.getSQLConversionVisitor();
sqlVisitor.append(func);
Property changes on: trunk/connectors/translator-ldap
___________________________________________________________________
Name: svn:ignore
+ target
.settings
.classpath
.project
Added: trunk/connectors/translator-ldap/pom.xml
===================================================================
--- trunk/connectors/translator-ldap/pom.xml (rev 0)
+++ trunk/connectors/translator-ldap/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,52 @@
+<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">
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>translator-ldap</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>LDAP Translator</name>
+ <description>LDAP Translator</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/IQueryToLdapSearchParser.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/IQueryToLdapSearchParser.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/IQueryToLdapSearchParser.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,654 @@
+/*
+ * 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.
+ */
+
+/**
+ * Utility class to handle the parsing of an IQuery object into all the relevant LDAP search
+ * information. Uses LdapSearchDetails class to store this information and return the search details.
+ * This class was intended for use by the execution classes that need to translate SQL. As new capabilities
+ * are implemented, this class will be expanded to accommodate the appropriate SQL.
+ *
+ * This class should remove all the MMX-specific stuff, and turn it into something any
+ * LDAP implementation can understand.
+ *
+ */
+
+package org.teiid.resource.adapter.ldap;
+
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.naming.NamingException;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.ldap.SortKey;
+
+import org.teiid.connector.language.AggregateFunction;
+import org.teiid.connector.language.AndOr;
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.Condition;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Exists;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.In;
+import org.teiid.connector.language.Like;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.Not;
+import org.teiid.connector.language.OrderBy;
+import org.teiid.connector.language.ScalarSubquery;
+import org.teiid.connector.language.SearchedCase;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.language.SortSpecification;
+import org.teiid.connector.language.TableReference;
+import org.teiid.connector.language.Comparison.Operator;
+import org.teiid.connector.language.SortSpecification.Ordering;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+
+
+
+/**
+ * Utility class which translates a SQL query into an LDAP search.
+ */
+public class IQueryToLdapSearchParser {
+ LDAPExecutionFactory executionFactory;
+
+ /**
+ * Constructor.
+ * @param logger the connector logger
+ * @param rm the RuntimeMetadata
+ */
+ public IQueryToLdapSearchParser(LDAPExecutionFactory factory) {
+ this.executionFactory = factory;
+ }
+
+ /**
+ * Public entry point to the parser.
+ * Parses the IQuery object, and constructs an equivalent LDAP search filter,
+ * keeping track of the attributes of interest.
+ * Here are some example SQL queries, and the equivalent LDAP search info:
+ * SQL: select cn, managerName from people_table where managerName LIKE "John%" and cn!="Mar()"
+ * Context name: [people_table's NameInSource, e.g. (ou=people,dc=company,dc=com)]
+ * LDAP attributes: (cn, String), (managerName, String)
+ * LDAP search filter: (&(managerName="John*")(!(cn="Mar\(\)")))
+ *
+ * @param query the query
+ * @return the LDAPSearchDetails object
+ */
+ // GHH 20080326 - added ability to restrict queries to only values where
+ // objectClass = table name. This is done by adding a third parameter,
+ // RESTRICT, to the NameInSource property in the model:
+ // ou=people,dc=company,dc=com?SUBTREE_SCOPE?RESTRICT
+ // TODO - change method for calling RESTRICT to also specify
+ // object class name (RESTRICT=inetOrgPerson)
+ public LDAPSearchDetails translateSQLQueryToLDAPSearch(Select query) throws ConnectorException {
+ // Parse SELECT symbols.
+ // The columns will be translated into LDAP attributes of interest.
+ ArrayList attributeList = getAttributesFromSelectSymbols(query);
+ ArrayList elementList = getElementsFromSelectSymbols(query);
+
+ // Parse FROM table.
+ // Only one table is expected here.
+ List fromList = query.getFrom();
+ Iterator itr = fromList.listIterator();
+ if(!itr.hasNext()) {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.noTablesInFromError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ TableReference fItm = (TableReference)itr.next();
+ if(itr.hasNext()) {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.multiItemsInFromError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ String contextName = getContextNameFromFromItem(fItm);
+ int searchScope = getSearchScopeFromFromItem(fItm);
+ // GHH 20080326 - added check for RESTRICT parameter in
+ // NameInSource of from item
+ String classRestriction = getRestrictToNamedClass(fItm);
+
+ // Parse the WHERE clause.
+ // Create an equivalent LDAP search filter.
+ List searchStringList = new LinkedList();
+ searchStringList = getSearchFilterFromWhereClause(query.getWhere(), searchStringList);
+ String filter = new String();
+ ListIterator filterItr = searchStringList.listIterator();
+ while(filterItr.hasNext()) {
+ filter += filterItr.next();
+ }
+ // GHH 20080326 - if there is a class restriction,
+ // add it to the search filter
+ if (classRestriction != null && classRestriction.trim().length()>0) {
+ filter = "(&"+filter+"(objectClass="+classRestriction+"))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ // Parse the ORDER BY clause.
+ // Create an ordered sort list.
+ OrderBy orderBy = (OrderBy)query.getOrderBy();
+ // Referenced the JNDI standard...arguably, this should not be done inside this
+ // class, and we should make our own key class. In practice, this makes things simpler.
+ SortKey[] sortKeys = getSortKeysFromOrderByClause(orderBy);
+
+ // Parse LIMIT clause.
+ // Note that offsets are not supported.
+ Limit limit = (Limit)query.getLimit();
+ long countLimit = -1;
+ if(limit != null) {
+ countLimit = limit.getRowLimit();
+ }
+
+ // Create Search Details
+ LDAPSearchDetails sd = new LDAPSearchDetails(contextName, searchScope, filter, attributeList, sortKeys, countLimit, elementList);
+ // Search Details logging
+ try {
+ sd.printDetailsToLog();
+ } catch (NamingException nme) {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.searchDetailsLoggingError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+
+ return sd;
+
+ }
+
+ /**
+ * get SortKeys from the supplied ORDERBY clause.
+ * @param orderBy the OrderBy clause
+ * @param the array of SortKeys
+ */
+ private SortKey[] getSortKeysFromOrderByClause(OrderBy orderBy) throws ConnectorException {
+ SortKey[] sortKeys = null;
+ if(orderBy != null) {
+ List orderItems = orderBy.getSortSpecifications();
+ if(orderItems == null) {
+ return null;
+ }
+ SortKey sortKey = null;
+ sortKeys = new SortKey[orderItems.size()];
+ Iterator orderItr = orderItems.iterator();
+ int i = 0;
+ while(orderItr.hasNext()) {
+ SortSpecification item = (SortSpecification)orderItr.next();
+ if(item != null) {
+ String itemName = getExpressionString((Expression)item.getExpression());
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Adding sort key for item: " + itemName); //$NON-NLS-1$
+ if(item.getOrdering() == Ordering.ASC) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "with ASC ordering."); //$NON-NLS-1$
+ sortKey = new SortKey(itemName, true, null);
+ } else if(item.getOrdering() == Ordering.DESC){
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "with DESC ordering."); //$NON-NLS-1$
+ sortKey = new SortKey(itemName, false, null);
+ }
+ }
+ sortKeys[i] = sortKey;
+ i++;
+ }
+
+ } else {
+ // Insert a default? No, allow the Execution to do this. Just return a null list.
+ }
+ return sortKeys;
+ }
+
+ /**
+ * Utility method to pull the name in source (or, base DN/context name) from the table.
+ * @param fromItem
+ * @return name in source
+ */
+ // GHH 20080409 - changed to fall back on new connector property
+ // for default base DN if available
+ private String getContextNameFromFromItem(TableReference fromItem) throws ConnectorException {
+ String nameInSource;
+ String contextName;
+
+ // TODO: Re-use the getExpressionString method if possible, rather than
+ // rewriting the same code twice.
+ if(fromItem instanceof NamedTable) {
+ Table group = ((NamedTable)fromItem).getMetadataObject();
+ nameInSource = group.getNameInSource();
+ // if NameInSource is null set it to an empty
+ // string instead so we can safely call split on it
+ if(nameInSource == null) {
+ nameInSource = ""; //$NON-NLS-1$
+ }
+ // now split it on ? to find the part of it that specifies context name
+ String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
+ contextName = nameInSourceArray[0];
+ // if there is no context name specified
+ // try the default in the connector properties
+ if(contextName.equals("")) { //$NON-NLS-1$
+ contextName = this.executionFactory.getSearchDefaultBaseDN();
+ }
+ } else {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ // if the context name is not specified either in Name in Source
+ // or in the default connector properties it'll be either
+ // null or an empty string
+ if(contextName == null || contextName.equals("")) { //$NON-NLS-1$
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.baseContextNameError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ return contextName;
+
+ }
+
+ // GHH 20080326 - added below method to check for RESTRICT parameter in
+ // from item's NameInSource, and if true return name (not NameInSource)
+ // of from item as the objectClass name on to which the query should
+ // be restricted
+ private String getRestrictToNamedClass(TableReference fromItem) throws ConnectorException {
+ String nameInSource;
+ String namedClass = null;
+ if(fromItem instanceof NamedTable) {
+ // Here we use slightly different logic than in
+ // getContextNameFromFromItem so it is easier to get
+ // the group name later if needed
+ Table mdIDGroup = ((NamedTable)fromItem).getMetadataObject();
+ nameInSource = mdIDGroup.getNameInSource();
+ // groupName = mdIDGroup.getName();
+ // if NameInSource is null set it to an empty
+ // string instead so we can safely call split on it
+ if(nameInSource == null) {
+ nameInSource = ""; //$NON-NLS-1$
+ }
+ // now split it on ? to find the part of it that specifies the objectClass we should restrict on
+ String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
+ if(nameInSourceArray.length >= 3) {
+ namedClass = nameInSourceArray[2];
+ }
+ // if there is no specification in the Name In Source,
+ // see if the connector property is set to true. If
+ // it is, use the Name of the class for the restriction.
+ if(namedClass == null || namedClass.equals("")) { //$NON-NLS-1$
+ if (!this.executionFactory.isRestrictToObjectClass()) {
+ namedClass = ""; //$NON-NLS-1$
+ } else {
+ namedClass = mdIDGroup.getName();
+ }
+ }
+ } else {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ return namedClass;
+ }
+
+ private int getSearchScopeFromFromItem(TableReference fromItem) throws ConnectorException {
+ String searchScopeString = ""; //$NON-NLS-1$
+ int searchScope = LDAPConnectorConstants.ldapDefaultSearchScope;
+ // TODO: Re-use the getExpressionString method if possible, rather than
+ // rewriting the same code twice.
+ if(fromItem instanceof NamedTable) {
+ Table group = ((NamedTable)fromItem).getMetadataObject();
+ String nameInSource = group.getNameInSource();
+ // if NameInSource is null set it to an empty
+ // string instead so we can safely call split on it
+ if(nameInSource == null) {
+ nameInSource = ""; //$NON-NLS-1$
+ }
+ // now split it on ? to find the part of it that specifies search scope
+ String nameInSourceArray[] = nameInSource.split("\\?"); //$NON-NLS-1$
+ if(nameInSourceArray.length >= 2) {
+ searchScopeString = nameInSourceArray[1];
+ }
+ // if there is no search scope specified
+ // try the default in the connector properties
+ if(searchScopeString.equals("")) { //$NON-NLS-1$
+ searchScopeString = this.executionFactory.getSearchDefaultScope();
+ // protect against getting null back from the property
+ if(searchScopeString == null) {
+ searchScopeString = ""; //$NON-NLS-1$
+ }
+ }
+ if(searchScopeString.equals("SUBTREE_SCOPE")) { //$NON-NLS-1$
+ searchScope = SearchControls.SUBTREE_SCOPE;
+ } else if(searchScopeString.equals("ONELEVEL_SCOPE")) { //$NON-NLS-1$
+ searchScope = SearchControls.ONELEVEL_SCOPE;
+ } else if(searchScopeString.equals("OBJECT_SCOPE")) { //$NON-NLS-1$
+ searchScope = SearchControls.OBJECT_SCOPE;
+ }
+ } else {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.groupCountExceededError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ return searchScope;
+ }
+
+ /**
+ * Utility method to convert operator to the appropriate string value for LDAP.
+ * @param op operator to evaluate
+ * @return LDAP-specific string equivalent of the operator
+ */
+ private String parseCompoundCriteriaOp(AndOr.Operator op) throws ConnectorException {
+ switch(op) {
+ case AND:
+ return "&"; //$NON-NLS-1$
+ case OR:
+ return "|"; //$NON-NLS-1$
+ default:
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.criteriaNotParsableError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ }
+
+ /**
+ * Utility method to convert expression to the appropriate string value for LDAP.
+ * @param e expression to evaluate
+ * @return LDAP-specific string equivalent of the expression
+ */
+ // GHH 20080326 - found that code to fall back on Name if NameInSource
+ // was null wasn't working properly, so replaced with tried and true
+ // code from another custom connector.
+ private String getExpressionString(Expression e) throws ConnectorException {
+ String expressionName = null;
+ // GHH 20080326 - changed around the IElement handling here
+ // - the rest of this method is unchanged
+ if(e instanceof ColumnReference) {
+ Column mdIDElement = ((ColumnReference)e).getMetadataObject();
+ expressionName = mdIDElement.getNameInSource();
+ if(expressionName == null || expressionName.equals("")) { //$NON-NLS-1$
+ expressionName = mdIDElement.getName();
+ }
+ } else if(e instanceof Literal) {
+ try {
+ if(((Literal)e).getType().equals(Class.forName(Timestamp.class.getName()))) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Found an expression that uses timestamp; converting to LDAP string format."); //$NON-NLS-1$
+ Timestamp ts = (Timestamp)((Literal)e).getValue();
+ Date dt = new Date(ts.getTime());
+ //TODO: Fetch format if provided.
+ SimpleDateFormat sdf = new SimpleDateFormat(LDAPConnectorConstants.ldapTimestampFormat);
+ expressionName = sdf.format(dt);
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Timestamp to stsring is: " + expressionName); //$NON-NLS-1$
+ }
+ else {
+ expressionName = ((Literal)e).getValue().toString();
+ }
+ } catch (ClassNotFoundException cce) {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.timestampClassNotFoundError"); //$NON-NLS-1$
+ throw new ConnectorException(cce, msg);
+ }
+
+ } else {
+ if(e instanceof AggregateFunction) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Received IAggregate, but it is not supported. Check capabilities."); //$NON-NLS-1$
+ } else if(e instanceof Function) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Received IFunction, but it is not supported. Check capabilties."); //$NON-NLS-1$
+ } else if(e instanceof ScalarSubquery) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Received IScalarSubquery, but it is not supported. Check capabilties."); //$NON-NLS-1$
+ } else if (e instanceof SearchedCase) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Received ISearchedCaseExpression, but it is not supported. Check capabilties."); //$NON-NLS-1$
+ }
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.unsupportedElementError"); //$NON-NLS-1$
+ throw new ConnectorException(msg + e.toString());
+ }
+ expressionName = escapeReservedChars(expressionName);
+ return expressionName;
+ }
+
+ private String escapeReservedChars(String expr) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < expr.length(); i++) {
+ char curChar = expr.charAt(i);
+ switch (curChar) {
+ case '\\':
+ sb.append("\\5c"); //$NON-NLS-1$
+ break;
+ case '*':
+ sb.append("\\2a"); //$NON-NLS-1$
+ break;
+ case '(':
+ sb.append("\\28"); //$NON-NLS-1$
+ break;
+ case ')':
+ sb.append("\\29"); //$NON-NLS-1$
+ break;
+ case '\u0000':
+ sb.append("\\00"); //$NON-NLS-1$
+ break;
+ default:
+ sb.append(curChar);
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Recursive method to translate the where clause into an LDAP search filter.
+ * The goal is to convert infix notation to prefix (Polish) notation.
+ * TODO: There's probably a clever way to do this with a Visitor.
+ * @param criteria Criteria to evaluate.
+ * @param List list to hold each pre-fix character of the search filter.
+ * @return list list that can be traversed in order to construct the search filter.
+ */
+ private List<String> getSearchFilterFromWhereClause(Condition criteria, List<String> filterList) throws ConnectorException {
+ if(criteria == null) {
+ filterList.add("(objectClass=*)"); //$NON-NLS-1$
+ }
+ boolean isNegated = false;
+ // Recursive case: compound criteria
+ if(criteria instanceof AndOr) {
+ AndOr crit = (AndOr)criteria;
+ AndOr.Operator op = crit.getOperator();
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing compound criteria."); //$NON-NLS-1$
+ String stringOp = parseCompoundCriteriaOp(op);
+
+ filterList.add("("); //$NON-NLS-1$
+ filterList.add(stringOp);
+ filterList.addAll(getSearchFilterFromWhereClause(crit.getLeftCondition(), new LinkedList<String>()));
+ filterList.addAll(getSearchFilterFromWhereClause(crit.getRightCondition(), new LinkedList<String>()));
+ filterList.add(")"); //$NON-NLS-1$
+ // Base case
+ } else if(criteria instanceof Comparison) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing compare criteria."); //$NON-NLS-1$
+ Comparison.Operator op = ((Comparison) criteria).getOperator();
+
+ isNegated = op == Operator.NE || op == Operator.GT || op == Operator.LT;
+
+ Expression lhs = ((Comparison) criteria).getLeftExpression();
+ Expression rhs = ((Comparison) criteria).getRightExpression();
+
+ String lhsString = getExpressionString(lhs);
+ String rhsString = getExpressionString(rhs);
+ if(lhsString == null || rhsString == null) {
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.missingNISError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+
+ addCompareCriteriaToList(filterList, op, lhsString, rhsString);
+ // Base case
+ } else if(criteria instanceof Exists) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing EXISTS criteria: NOT IMPLEMENTED YET"); //$NON-NLS-1$
+ // TODO Exists should be supported in a future release.
+ // Base case
+ } else if(criteria instanceof Like) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing LIKE criteria."); //$NON-NLS-1$
+ isNegated = ((Like) criteria).isNegated();
+ // Convert LIKE to Equals, where any "%" symbol is replaced with "*".
+ Comparison.Operator op = Operator.EQ;
+ Expression lhs = ((Like) criteria).getLeftExpression();
+ Expression rhs = ((Like) criteria).getRightExpression();
+
+ String lhsString = getExpressionString(lhs);
+ String rhsString = getExpressionString(rhs);
+ rhsString = rhsString.replace("%", "*"); //$NON-NLS-1$ //$NON-NLS-2$
+ addCompareCriteriaToList(filterList, op, lhsString, rhsString);
+
+ // Base case
+ } else if(criteria instanceof In) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing IN criteria."); //$NON-NLS-1$
+ isNegated = ((In) criteria).isNegated();
+ Expression lhs = ((In)criteria).getLeftExpression();
+ List rhsList = ((In)criteria).getRightExpressions();
+ // Recursively add each IN expression to the filter list.
+ processInCriteriaList(filterList, rhsList, lhs);
+ } else if (criteria instanceof Not) {
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing NOT criteria."); //$NON-NLS-1$
+ isNegated = true;
+ filterList.addAll(getSearchFilterFromWhereClause(((Not)criteria).getCriteria(), new LinkedList()));
+ }
+
+ if (isNegated) {
+ filterList.add(0, "("); //$NON-NLS-1$
+ filterList.add(1, "!"); //$NON-NLS-1$
+ filterList.add(")"); //$NON-NLS-1$
+ }
+
+ return filterList;
+ }
+
+ /**
+ * Process a list of right-hand side IN expresssions and add the corresponding LDAP filter
+ * clause string to the given filterList.
+ */
+ private void processInCriteriaList(List filterList, List rhsList, Expression lhs) throws ConnectorException {
+ if(rhsList.size() == 0) {
+ return;
+ }
+ filterList.add("("); //$NON-NLS-1$
+ filterList.add(parseCompoundCriteriaOp(org.teiid.connector.language.AndOr.Operator.OR));
+ Iterator rhsItr = rhsList.iterator();
+ while(rhsItr.hasNext()) {
+ addCompareCriteriaToList(filterList, Operator.EQ, getExpressionString(lhs),
+ getExpressionString((Expression)rhsItr.next()));
+ }
+ filterList.add(")"); //$NON-NLS-1$
+ }
+
+ /**
+ * Add Compare Criteria to List
+ * @param filterList the filter list
+ * @param op
+ * @param lhs left hand side expression
+ * @param rhs right hand side expression
+ */
+ private void addCompareCriteriaToList(List filterList, Comparison.Operator op, String lhs, String rhs) throws ConnectorException {
+ // Push the comparison statement into the list, e.g.:
+ // (sn=Mike)
+ // !(empNum>=100)
+ filterList.add("("); //$NON-NLS-1$
+ filterList.add(lhs);
+
+ switch(op) {
+ case NE:
+ case EQ:
+ filterList.add("="); //$NON-NLS-1$
+ break;
+ case LT:
+ case GE:
+ filterList.add(">="); //$NON-NLS-1$
+ break;
+ case GT:
+ case LE:
+ filterList.add("<="); //$NON-NLS-1$
+ break;
+ default:
+ final String msg = LDAPPlugin.Util.getString("IQueryToLdapSearchParser.criteriaNotSupportedError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+
+ }
+ filterList.add(rhs);
+ filterList.add(")"); //$NON-NLS-1$
+ }
+
+ /**
+ * Method to get name from the supplied Element
+ * @param e the supplied Element
+ * @return the name
+ */
+ // GHH 20080326 - found that code to fall back on Name if NameInSource
+ // was null wasn't working properly, so replaced with tried and true
+ // code from another custom connector.
+ public String getNameFromElement(Column e) throws ConnectorException {
+ String ldapAttributeName = null;
+ ldapAttributeName = e.getNameInSource();
+ if (ldapAttributeName == null || ldapAttributeName.equals("")) { //$NON-NLS-1$
+ ldapAttributeName = e.getName();
+ // If name in source is not set, then fall back to the column name.
+ }
+ return ldapAttributeName;
+ }
+
+ /**
+ * Method to get SELECT Element list from the supplied query
+ * @param query the supplied Query
+ * @return the list of SELECT elements
+ */
+ private ArrayList getElementsFromSelectSymbols(Select query) throws ConnectorException {
+ ArrayList selectElementList = new ArrayList();
+ Iterator selectSymbolItr = query.getDerivedColumns().iterator();
+
+ while(selectSymbolItr.hasNext()) {
+ Column e = getElementFromSymbol((DerivedColumn)selectSymbolItr.next());
+ selectElementList.add(e);
+ }
+ return selectElementList;
+ }
+
+ /**
+ * Method to get attribute list from the supplied query
+ * @param query the supplied Query
+ * @return the list of attributes
+ */
+ private ArrayList getAttributesFromSelectSymbols(Select query) throws ConnectorException {
+ ArrayList ldapAttributeList = new ArrayList();
+
+ Iterator selectSymbolItr = query.getDerivedColumns().iterator();
+ int i=0;
+ while(selectSymbolItr.hasNext()) {
+ Column e = getElementFromSymbol((DerivedColumn)selectSymbolItr.next());
+ String ldapAttributeName = this.getNameFromElement(e);
+ Object ldapAttributeClass = e.getJavaType();
+
+ // Store the element's name and class type, so that we know what to look for in the search results.
+ BasicAttribute newAttr = new BasicAttribute(ldapAttributeName, ldapAttributeClass);
+ ldapAttributeList.add(newAttr);
+ i++;
+ }
+ return ldapAttributeList;
+ }
+
+ /**
+ * Helper method for getting runtime {@link org.teiid.connector.metadata.runtime.Element} from a
+ * {@link org.teiid.connector.language.DerivedColumn}.
+ * @param symbol Input ISelectSymbol
+ * @return Element returned metadata runtime Element
+ */
+ private Column getElementFromSymbol(DerivedColumn symbol) throws ConnectorException {
+ ColumnReference expr = (ColumnReference) symbol.getExpression();
+ return expr.getMetadataObject();
+ }
+
+
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnection.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnection.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,29 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import javax.naming.NamingException;
+
+public interface LDAPConnection {
+ Object lookup(String context) throws NamingException;
+ void close();
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorCapabilities.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorCapabilities.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,82 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+/**
+ * This class extends the BasicConnectorCapabilities class, and establishes
+ * the capabilities that are supported by the LDAPConnector.
+ */
+public class LDAPConnectorCapabilities extends BasicConnectorCapabilities {
+
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 1000;
+ }
+
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ public boolean supportsLikeCriteria() {
+ return true;
+ }
+
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ public boolean supportsOrderBy() {
+ // Removed this support -- see LDAPSyncQueryExecution comments for details.
+ return false;
+ }
+
+ public boolean supportsRowLimit() {
+ // GHH 20080408 - turned this on, because I fixed issue
+ // in nextBatch that was causing this to fail
+ return true;
+ }
+
+ public boolean supportsRowOffset() {
+ // TODO This might actually be possible in future releases,
+ // when using virtual list views/Sun. note that this requires the ability
+ // to set the count limit, as well as an offset, so setCountLimit::searchControls
+ // won't do it alone.
+ return false;
+ }
+
+ @Override
+ public boolean supportsCompareCriteriaOrdered() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsNotCriteria() {
+ return true;
+ }
+
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorConstants.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorConstants.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPConnectorConstants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,38 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import javax.naming.directory.*;
+
+/**
+ * Utility class to maintain list of constants for the LDAPConnector.
+ * Please modify constants here; changes should be reflected throughout
+ * the connector code.
+ */
+public class LDAPConnectorConstants {
+
+ public static final String ldapDefaultSortName = "guid"; //$NON-NLS-1$
+ public static final int ldapDefaultSearchScope = SearchControls.ONELEVEL_SCOPE;
+ public static final boolean ldapDefaultIsAscending = true;
+
+ public static final String ldapTimestampFormat = "yyyyMMddhhmmss\'Z\'"; //$NON-NLS-1$
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPExecutionFactory.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,102 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.ConnectionFactory;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TranslatorProperty;
+import org.teiid.resource.cci.UpdateExecution;
+
+
+/**
+ * LDAPConnector. This is responsible for initializing
+ * a connection factory, and obtaining connections to LDAP.
+ */
+public class LDAPExecutionFactory extends BasicExecutionFactory {
+
+ private String searchDefaultBaseDN;
+ private boolean restrictToObjectClass = false;
+ private String searchDefaultScope = "SUBTREE_SCOPE"; //$NON-NLS-1$
+
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return LDAPConnectorCapabilities.class;
+ }
+
+ @TranslatorProperty(name="SearchDefaultBaseDN", display="Default Search Base DN", description="Default Base DN for LDAP Searches",advanced=true, defaultValue="")
+ public String getSearchDefaultBaseDN() {
+ return searchDefaultBaseDN;
+ }
+
+ public void setSearchDefaultBaseDN(String searchDefaultBaseDN) {
+ this.searchDefaultBaseDN = searchDefaultBaseDN;
+ }
+
+ @TranslatorProperty(name="RestrictToObjectClass", display="Restrict Searches To Named Object Class", description="Restrict Searches to objectClass named in the Name field for a table", advanced=true, defaultValue="false")
+ public boolean isRestrictToObjectClass() {
+ return restrictToObjectClass;
+ }
+
+ public void setRestrictToObjectClass(Boolean restrictToObjectClass) {
+ this.restrictToObjectClass = restrictToObjectClass.booleanValue();
+ }
+
+ @TranslatorProperty(name="SearchDefaultScope", display="Default Search Scope", description="Default Scope for LDAP Searches", allowed={"OBJECT_SCOPE","ONELEVEL_SCOPE","SUBTREE_SCOPE"},required=true, defaultValue="SUBTREE_SCOPE")
+ public String getSearchDefaultScope() {
+ return searchDefaultScope;
+ }
+
+ public void setSearchDefaultScope(String searchDefaultScope) {
+ this.searchDefaultScope = searchDefaultScope;
+ }
+
+ @Override
+ public ResultSetExecution createResultSetExecution(QueryExpression command,ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ ConnectionFactory cf = (ConnectionFactory)connectionFactory;
+ return new LDAPSyncQueryExecution((Select)command, this, (LDAPConnection)cf.getConnection());
+ } catch (ResourceException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public UpdateExecution createUpdateExecution(Command command,ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ ConnectionFactory cf = (ConnectionFactory)connectionFactory;
+ return new LDAPUpdateExecution(command, (LDAPConnection)cf.getConnection());
+ } catch (ResourceException e) {
+ throw new ConnectorException(e);
+ }
+ }
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPPlugin.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPPlugin.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -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.
+ *
+ * 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.resource.adapter.ldap;
+
+import java.util.ResourceBundle;
+
+import com.metamatrix.core.BundleUtil;
+
+/**
+ * LDAPPlugin
+ */
+public class LDAPPlugin {
+
+ public static final String PLUGIN_ID = "org.teiid.resource.adapter.ldap" ; //$NON-NLS-1$
+
+ /**
+ * Provides access to the plugin's log and to it's resources.
+ */
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID, PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
+
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSearchDetails.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSearchDetails.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSearchDetails.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,193 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.ldap.SortKey;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
+
+
+/**
+ * Utility class used to maintain the details of a particular LDAP search,
+ * such as the context, the attributes of interest, the filter, and the
+ * search scope.
+ */
+public class LDAPSearchDetails {
+ private String contextName;
+ private int searchScope;
+ private String contextFilter;
+ private ArrayList attributeList;
+ private SortKey[] keys;
+// private LdapSortKey[] netscapeKeys;
+ // If limit is set to -1, this means no limit (return all rows)
+ private long limit;
+ private ArrayList elementList;
+
+ /**
+ * Constructor
+ * @param name the context name
+ * @param searchScope the search scope
+ * @param filter the context filter
+ * @param attributeList the list of attributes
+ * @param keys
+ * @param limit
+ * @param elementList
+ */
+ public LDAPSearchDetails(String name, int searchScope, String filter, ArrayList attributeList, SortKey[] keys, long limit, ArrayList elementList) {
+
+ this.contextName = name;
+ this.searchScope = searchScope;
+ this.contextFilter = filter;
+ this.attributeList = attributeList;
+ this.keys = keys;
+ this.limit = limit;
+ this.elementList = elementList;
+ }
+
+ /**
+ * get the context name
+ * @return the context name
+ */
+ public String getContextName() {
+ return contextName;
+ }
+
+ /**
+ * get the context name
+ * @return the context name
+ */
+ public int getSearchScope() {
+ return searchScope;
+ }
+
+ /**
+ * get the context filter
+ * @return the context filter
+ */
+ public String getContextFilter() {
+ return contextFilter;
+ }
+
+ /**
+ * get the attribute list
+ * @return the attribute list
+ */
+ public ArrayList getAttributeList() {
+ return attributeList;
+ }
+
+ /**
+ * get the element list
+ * @return the element list
+ */
+ public ArrayList getElementList() {
+ return elementList;
+ }
+
+ /**
+ * get the sort keys
+ * @return the sort keys
+ */
+ public SortKey[] getSortKeys() {
+ return keys;
+ }
+
+ /**
+ * get the count limit
+ * @return the count limit
+ */
+ public long getCountLimit() {
+ return limit;
+ }
+ /*
+ public LdapSortKey[] getNetscapeSortKeys() {
+ return netscapeKeys;
+ }
+ private void createNetscapeKeys() {
+ if(keys != null) {
+ netscapeKeys = new LdapSortKey[keys.length];
+ for(int i=0; i<keys.length; i++) {
+ LdapSortKey nKey = new LdapSortKey(keys[i].getAttributeID(),
+ keys[i].isAscending());
+ netscapeKeys[i] = nKey;
+ }
+ } else {
+ // set it null
+ netscapeKeys = null;
+ }
+ }
+ */
+
+ /**
+ * Print Method for Logging - (Detail level logging)
+ * @param logger the connector logger.
+ */
+ public void printDetailsToLog() throws NamingException {
+ // Log Search Scope
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Search context: " + contextName); //$NON-NLS-1$
+ if(searchScope == SearchControls.SUBTREE_SCOPE) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Search scope = SUBTREE_SCOPE"); //$NON-NLS-1$
+ } else if(searchScope == SearchControls.OBJECT_SCOPE) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Search scope = OBJECT_SCOPE"); //$NON-NLS-1$
+ } else if(searchScope == SearchControls.ONELEVEL_SCOPE) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Search scope = ONELEVEL_SCOPE"); //$NON-NLS-1$
+ }
+
+ // Log Search Attributes
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Search attributes: "); //$NON-NLS-1$
+ Iterator itr = this.attributeList.iterator();
+ int i = 0;
+ while(itr.hasNext()) {
+ Attribute attr = (Attribute)itr.next();
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Attribute [" + i + "]: " + attr.getID() + " (" +attr.get().toString() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ i++;
+ }
+
+ // Log Context Filter
+ if(contextFilter != null && (!contextFilter.equals(""))) { //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Where clause was translated into Ldap search filter: " + contextFilter); //$NON-NLS-1$
+ }
+
+ // Log Sort Keys
+ if(keys != null) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"Sort keys: "); //$NON-NLS-1$
+ for(int j=0; j<keys.length; j++) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"\tName: " + keys[j].getAttributeID()); //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"\tOrder: "); //$NON-NLS-1$
+ if(keys[j].isAscending()) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"ASC"); //$NON-NLS-1$
+ } else {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR,"DESC"); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSyncQueryExecution.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSyncQueryExecution.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPSyncQueryExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,487 @@
+/*
+ * 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.
+ */
+
+/**
+ *
+ * Please see the user's guide for a full description of capabilties, etc.
+ *
+ * Description/Assumptions:
+ * 1. Table's name in source defines the base DN (or context) for the search.
+ * Example: Table.NameInSource=ou=people,dc=gene,dc=com
+ * [Optional] The table's name in source can also define a search scope. Append
+ * a "?" character as a delimiter to the base DN, and add the search scope string.
+ * The following scopes are available:
+ * SUBTREE_SCOPE
+ * ONELEVEL_SCOPE
+ * OBJECT_SCOPE
+ * [Default] LDAPConnectorConstants.ldapDefaultSearchScope
+ * is the default scope used, if no scope is defined (currently, ONELEVEL_SCOPE).
+ *
+ * 2. Column's name in source defines the LDAP attribute name.
+ * [Default] If no name in source is defined, then we attempt to use the column name
+ * as the LDAP attribute name.
+ *
+ *
+ * TODO: Implement paged searches -- the LDAP server must support VirtualListViews.
+ * TODO: Implement cancel.
+ * TODO: Add Sun/Netscape implementation, AD/OpenLDAP implementation.
+ *
+ *
+ * Note:
+ * Greater than is treated as >=
+ * Less-than is treater as <=
+ * If an LDAP entry has more than one entry for an attribute of interest (e.g. a select item), we only return the
+ * first occurrance. The first occurance is not predictably the same each time, either, according to the LDAP spec.
+ * If an attribute is not present, we return the empty string. Arguably, we could throw an exception.
+ *
+ * Sun LDAP won't support Sort Orders for very large datasets. So, we've set the sorting to NONCRITICAL, which
+ * allows Sun to ignore the sort order. This will result in the results to come back as unsorted, without any error.
+ *
+ * Removed support for ORDER BY for two reasons:
+ * 1: LDAP appears to have a limit to the number of records that
+ * can be server-side sorted. When the limit is reached, two things can happen:
+ * a. If sortControl is set to CRITICAL, then the search fails.
+ * b. If sortControl is NONCRITICAL, then the search returns, unsorted.
+ * We'd like to support ORDER BY, no matter how large the size, so we turn it off,
+ * and allow MetaMatrix to do it for us.
+ * 2: Supporting ORDER BY appears to negatively effect the query plan
+ * when cost analysis is used. We stop using dependent queries, and start
+ * using inner joins.
+ *
+ */
+
+package org.teiid.resource.adapter.ldap;
+
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.SizeLimitExceededException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.Control;
+import javax.naming.ldap.LdapContext;
+import javax.naming.ldap.SortControl;
+import javax.naming.ldap.SortKey;
+
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.ResultSetExecution;
+
+
+
+/**
+ * LDAPSyncQueryExecution is responsible for executing an LDAP search
+ * corresponding to a read-only "select" query from MetaMatrix.
+ */
+public class LDAPSyncQueryExecution extends BasicExecution implements ResultSetExecution {
+
+ private LDAPSearchDetails searchDetails;
+ private LDAPConnection ldapConnection;
+ private LdapContext ldapCtx;
+ private NamingEnumeration searchEnumeration;
+ private IQueryToLdapSearchParser parser;
+ private Select query;
+ private LDAPExecutionFactory executionFactory;
+
+ /**
+ * Constructor
+ * @param executionMode the execution mode.
+ * @param ctx the execution context.
+ * @param rm the runtimeMetadata
+ * @param logger the ConnectorLogger
+ * @param ldapCtx the LDAP Context
+ */
+ public LDAPSyncQueryExecution(Select query, LDAPExecutionFactory factory, LDAPConnection ldapCtx) {
+ this.ldapConnection = ldapCtx;
+ this.query = query;
+ this.executionFactory = factory;
+ }
+
+ /**
+ * method to execute the supplied query
+ * @param query the query object.
+ * @param maxBatchSize the max batch size.
+ */
+ @Override
+ public void execute() throws ConnectorException {
+ // Parse the IQuery, and translate it into an appropriate LDAP search.
+ this.parser = new IQueryToLdapSearchParser(this.executionFactory);
+ searchDetails = parser.translateSQLQueryToLDAPSearch(query);
+
+ // Create and configure the new search context.
+ createSearchContext();
+ SearchControls ctrls = setSearchControls();
+ setStandardRequestControls();
+ // Execute the search.
+ executeSearch(ctrls);
+ }
+
+ /**
+ * Set the standard request controls
+ */
+ private void setStandardRequestControls() throws ConnectorException {
+ Control[] sortCtrl = new Control[1];
+ SortKey[] keys = searchDetails.getSortKeys();
+ if (keys != null) {
+ try {
+ sortCtrl[0] = new SortControl(keys, Control.NONCRITICAL);
+ this.ldapCtx.setRequestControls(sortCtrl);
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Sort ordering was requested, and sort control was created successfully."); //$NON-NLS-1$
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.setControlsError") + //$NON-NLS-1$
+ " : "+ne.getExplanation(); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ } catch(IOException e) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.setControlsError"); //$NON-NLS-1$
+ throw new ConnectorException(e,msg);
+ }
+ }
+ }
+
+ /**
+ * Perform a lookup against the initial LDAP context, which
+ * sets the context to something appropriate for the search that is about to occur.
+ *
+ */
+ private void createSearchContext() throws ConnectorException {
+ try {
+ ldapCtx = (LdapContext) this.ldapConnection.lookup(searchDetails.getContextName());
+ } catch (NamingException ne) {
+ if (searchDetails.getContextName() != null) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Attempted to search context: " //$NON-NLS-1$
+ + searchDetails.getContextName());
+ }
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.createContextError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ }
+
+
+ /**
+ * Set the search controls
+ */
+ private SearchControls setSearchControls() throws ConnectorException {
+ SearchControls ctrls = new SearchControls();
+ //ArrayList modelAttrList = searchDetails.getAttributeList();
+ ArrayList modelAttrList = searchDetails.getElementList();
+ String[] attrs = new String[modelAttrList.size()];
+ Iterator itr = modelAttrList.iterator();
+ int i = 0;
+ while(itr.hasNext()) {
+ attrs[i] = (parser.getNameFromElement((Column)itr.next()));
+ //attrs[i] = (((Attribute)itr.next()).getID();
+ //logger.logTrace("Adding attribute named " + attrs[i] + " to the search list.");
+ i++;
+ }
+
+ ctrls.setSearchScope(searchDetails.getSearchScope());
+ ctrls.setReturningAttributes(attrs);
+
+ long limit = searchDetails.getCountLimit();
+ if(limit != -1) {
+ ctrls.setCountLimit(limit);
+ }
+ return ctrls;
+ }
+
+ /**
+ * Perform the LDAP search against the subcontext, using the filter and
+ * search controls appropriate to the query and model metadata.
+ */
+ private void executeSearch(SearchControls ctrls) throws ConnectorException {
+ String ctxName = searchDetails.getContextName();
+ String filter = searchDetails.getContextFilter();
+ if (ctxName == null || filter == null || ctrls == null) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Search context, filter, or controls were null. Cannot execute search."); //$NON-NLS-1$
+ }
+ try {
+ searchEnumeration = this.ldapCtx.search("", filter, ctrls); //$NON-NLS-1$
+ } catch (NamingException ne) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "LDAP search failed. Attempted to search context " //$NON-NLS-1$
+ + ctxName + " using filter " + filter); //$NON-NLS-1$
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.execSearchError"); //$NON-NLS-1$
+ throw new ConnectorException(msg + " : " + ne.getExplanation()); //$NON-NLS-1$
+ } catch(Exception e) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "LDAP search failed. Attempted to search context " //$NON-NLS-1$
+ + ctxName + " using filter " + filter); //$NON-NLS-1$
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.execSearchError"); //$NON-NLS-1$
+ throw new ConnectorException(e, msg);
+ }
+ }
+
+ // GHH 20080326 - attempt to implement cancel here. First try to
+ // close the searchEnumeration, then the search context.
+ // We are very conservative when closing the enumeration
+ // but less so when closing context, since it is safe to call close
+ // on contexts multiple times
+ @Override
+ public void cancel() throws ConnectorException {
+ close();
+ }
+
+ // GHH 20080326 - replaced existing implementation with the same
+ // code as used by cancel method. First try to
+ // close the searchEnumeration, then the search context
+ // We are very conservative when closing the enumeration
+ // but less so when closing context, since it is safe to call close
+ // on contexts multiple times
+ @Override
+ public void close() throws ConnectorException {
+ if (searchEnumeration != null) {
+ try {
+ searchEnumeration.close();
+ } catch (Exception e) { } // catch everything, because NamingEnumeration has undefined behavior if it previously hit an exception
+ }
+ if (ldapCtx != null) {
+ try {
+ ldapCtx.close();
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.closeContextError",ne.getExplanation()); //$NON-NLS-1$
+ LogManager.logError(LogConstants.CTX_CONNECTOR, msg);
+ }
+ }
+ }
+
+ /**
+ * Fetch the next batch of data from the LDAP searchEnumerationr result.
+ * @return the next Batch of results.
+ */
+ // GHH 20080326 - set all batches as last batch after an exception
+ // is thrown calling a method on the enumeration. Per Javadoc for
+ // javax.naming.NamingEnumeration, enumeration is invalid after an
+ // exception is thrown - by setting last batch indicator we prevent
+ // it from being used again.
+ // GHH 20080326 - also added return of explanation for generic
+ // NamingException
+ public List next() throws ConnectorException {
+ try {
+ // The search has been executed, so process up to one batch of
+ // results.
+ List result = null;
+ while (result == null && searchEnumeration != null && searchEnumeration.hasMore())
+ {
+ SearchResult searchResult = (SearchResult) searchEnumeration.next();
+ result = getRow(searchResult);
+ }
+
+ return result;
+ } catch (SizeLimitExceededException e) {
+ LogManager.logWarning(LogConstants.CTX_CONNECTOR, "Search results exceeded size limit. Results may be incomplete."); //$NON-NLS-1$
+ searchEnumeration = null; // GHH 20080326 - NamingEnumartion's are no longer good after an exception so toss it
+ return null; // GHH 20080326 - if size limit exceeded don't try to read more results
+ } catch (NamingException ne) {
+ final String msg = "Ldap error while processing next batch of results: " + ne.getExplanation(); //$NON-NLS-1$
+ LogManager.logError(LogConstants.CTX_CONNECTOR, msg); // GHH 20080326 - changed to output explanation from LDAP server
+ searchEnumeration = null; // GHH 20080326 - NamingEnumertion's are no longer good after an exception so toss it
+ throw new ConnectorException(msg);
+ }
+ }
+
+ /**
+ * Create a row using the searchResult and add it to the supplied batch.
+ * @param batch the supplied batch
+ * @param result the search result
+ */
+ // GHH 20080326 - added fetching of DN of result, for directories that
+ // do not include it as an attribute
+ private List getRow(SearchResult result) throws ConnectorException {
+ Attributes attrs = result.getAttributes();
+ String resultDN = result.getNameInNamespace(); // added GHH 20080326
+ ArrayList attributeList = searchDetails.getElementList();
+ List row = new ArrayList();
+
+ if (attrs != null && attrs.size()>0) {
+ Iterator itr = attributeList.iterator();
+ while(itr.hasNext()) {
+ addResultToRow((Column)itr.next(), resultDN, attrs, row); // GHH 20080326 - added resultDN parameter to call
+ }
+ return row;
+ }
+ return null;
+ }
+
+ /**
+ * Add Result to Row
+ * @param modelElement the model element
+ * @param attrs the attributes
+ * @param row the row
+ */
+ // GHH 20080326 - added resultDistinguishedName to method signature. If
+ // there is an element in the model named "DN" and there is no attribute
+ // with this name in the search result, we return this new parameter
+ // value for that column in the result
+ // GHH 20080326 - added handling of ClassCastException when non-string
+ // attribute is returned
+ private void addResultToRow(Column modelElement, String resultDistinguishedName, Attributes attrs, List row) throws ConnectorException {
+
+ String strResult;
+ String modelAttrName = parser.getNameFromElement(modelElement);
+ Class modelAttrClass = modelElement.getJavaType();
+ if(modelAttrName == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.nullAttrError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+
+ Attribute resultAttr = attrs.get(modelAttrName);
+
+ // If the attribute is not present, we return NULL.
+ if(resultAttr == null) {
+ // MPW - 2-20-07 - Changed from returning empty string to returning null.
+ //row.add("");
+ //logger.logTrace("Did not find a match for attribute named: " + modelAttrName);
+ // GHH 20080326 - return DN from input parameter
+ // if DN attribute is not present in search result
+ if (modelAttrName.toUpperCase().equals("DN")) { //$NON-NLS-1$
+ row.add(resultDistinguishedName);
+ }
+ else {
+ row.add(null);
+ }
+ return;
+ }
+ // TODO: Currently, if an LDAP entry contains more than one matching
+ // attribute, we only return the first.
+ // Since attribute order is not guaranteed, this means that we may not
+ // always return the exact same information.
+ // Putting multi-valued attributes into a single row (or multiple rows) requires
+ // some design decisions.
+ // GHH 20080326 - first get attribute as generic object
+ // so we can check to make sure it is a string separately - previously it was just put straight into a string.
+ Object objResult = null;
+ try {
+ objResult = resultAttr.get();
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.attrValueFetchError",modelAttrName); //$NON-NLS-1$
+ LogManager.logWarning(LogConstants.CTX_CONNECTOR, msg+" : "+ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg+" : "+ne.getExplanation()); //$NON-NLS-1$
+ }
+
+ // GHH 20080326 - if attribute is not a string, just
+ // return an empty string.
+ // TODO - allow return of non-strings (always byte[]) as
+ // MM object. Perhaps also add directory-specific logic
+ // to deserialize byte[] attributes into Java objects
+ // when appropriate
+ try {
+ strResult = (String)objResult;
+ } catch (ClassCastException cce) {
+ strResult = ""; //$NON-NLS-1$
+ }
+
+ // MPW - 3.9.07 - Also return NULL when attribute is unset or empty string.
+ // There is no way to differentiate between being unset and being the empty string.
+ if(strResult.equals("")) { //$NON-NLS-1$
+ strResult = null;
+ }
+
+ // MPW: 3-11-07: Added support for java.lang.Integer conversion.
+ try {
+ if(modelAttrClass.equals(Class.forName(Integer.class.getName()))) {
+ try {
+ // Throw an exception if class cast fails.
+ if(strResult != null) {
+ Integer intResult = new Integer(strResult);
+ row.add(intResult);
+ } else {
+ row.add(null);
+ }
+ } catch(NumberFormatException nfe) {
+ throw new ConnectorException(nfe, "Element " + modelAttrName + " is typed as Integer, " + //$NON-NLS-1$ //$NON-NLS-2$
+ "but it's value (" + strResult + ") cannot be converted from string " + //$NON-NLS-1$ //$NON-NLS-2$
+ "to Integer. Please change type to String, or modify the data."); //$NON-NLS-1$
+ }
+ // java.lang.String
+ } else if(modelAttrClass.equals(Class.forName(String.class.getName()))) {
+ row.add(strResult);
+ // java.sql.Timestamp
+ } else if(modelAttrClass.equals(Class.forName(java.sql.Timestamp.class.getName()))) {
+ Map<String, String> p = modelElement.getProperties();
+
+ String timestampFormat = p.get("Format"); //$NON-NLS-1$
+ SimpleDateFormat dateFormat;
+ if(timestampFormat == null) {
+ timestampFormat = LDAPConnectorConstants.ldapTimestampFormat;
+
+ }
+ dateFormat = new SimpleDateFormat(timestampFormat);
+ try {
+ if(strResult != null) {
+ Date dateResult = dateFormat.parse(strResult);
+ Timestamp tsResult = new Timestamp(dateResult.getTime());
+ row.add(tsResult);
+ } else {
+ row.add(null);
+ }
+ } catch(ParseException pe) {
+ throw new ConnectorException(pe, "Timestamp could not be parsed. Please check to ensure the " //$NON-NLS-1$
+ + " Format field for attribute " //$NON-NLS-1$
+ + modelAttrName + " is configured using SimpleDateFormat conventions."); //$NON-NLS-1$
+ }
+
+ // TODO: Extend support for more types in the future.
+ // Specifically, add support for byte arrays, since that's actually supported
+ // in the underlying data source.
+ } else {
+ throw new ConnectorException("Base type " + modelAttrClass.toString() //$NON-NLS-1$
+ + " is not supported in the LDAP connector. " //$NON-NLS-1$
+ + " Please modify the base model to use a supported type."); //$NON-NLS-1$
+ }
+ } catch(ClassNotFoundException cne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPSyncQueryExecution.supportedClassNotFoundError"); //$NON-NLS-1$
+ throw new ConnectorException(cne, msg);
+ }
+ }
+
+
+ /**
+ * Active Directory and OpenLDAP supports PagedResultsControls, so I left
+ * this method in here in case we decide to extend support for this control
+ * in the future.
+ */
+// private void setADRequestControls(int maxBatchSize) {
+// try {
+// ldapCtx.setRequestControls(new Control[] { new PagedResultsControl(
+// maxBatchSize, Control.CRITICAL) });
+// } catch (NamingException ne) {
+// logger.logError("Failed to set page size for LDAP results. Please ensure that paged results controls are supported by the LDAP server implementation."); //$NON-NLS-1$
+// ne.printStackTrace();
+// } catch (IOException ioe) {
+// logger.logError("IO Exception while setting paged results control."); //$NON-NLS-1$
+// ioe.printStackTrace();
+// }
+// }
+}
Added: trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPUpdateExecution.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPUpdateExecution.java (rev 0)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/resource/adapter/ldap/LDAPUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,450 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import java.util.List;
+
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.ModificationItem;
+import javax.naming.ldap.LdapContext;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.Condition;
+import org.teiid.connector.language.Delete;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.ExpressionValueSource;
+import org.teiid.connector.language.Insert;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SetClause;
+import org.teiid.connector.language.Update;
+import org.teiid.connector.language.Comparison.Operator;
+import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.UpdateExecution;
+
+
+
+/**
+ * Please see the user's guide for a full description of capabilties, etc.
+ *
+ * Description/Assumptions:
+ * 1. Table's name in source defines the base DN (or context) for the search.
+ * Example: Table.NameInSource=ou=people,dc=gene,dc=com
+ * 2. Column's name in source defines the LDAP attribute name.
+ * [Default] If no name in source is defined, then we attempt to use the column name
+ * as the LDAP attribute name.
+ * 3. Since all of the underlying LDAP methods for adding/deleting/updating
+ * require specification of the LDAP distinguished name (DN) to change, for all
+ * corresponding MetaMatrix operations the DN must be specified (as the sole
+ * item in the WHERE clause for UPDATE and DELETE operations, and in the list
+ * of attributes to assign values in an INSERT operation * Responsible for update/insert/delete operations against LDAP
+ */
+public class LDAPUpdateExecution extends BasicExecution implements UpdateExecution {
+ private LDAPConnection ldapConnection;
+ private LdapContext ldapCtx;
+ private Command command;
+
+ public LDAPUpdateExecution(Command command, LDAPConnection ldapCtx) {
+ this.ldapConnection = ldapCtx;
+ this.command = command;
+ }
+
+ /** execute generic update-class (either an update, delete, or insert)
+ * operation and returns a count of affected rows. Since underlying
+ * LDAP operations (and this connector) can modify at most one LDAP
+ * leaf context at a time, this will always return 1. It will never
+ * actually return 0, because if an operation fails, a
+ * ConnectorException will be thrown instead.
+ * Note that really it should return 0 if a delete is performed on
+ * an entry that doesn't exist (but whose parent does exist), but
+ * since the underlying LDAP operation will return success for such a
+ * delete, we just blindly return 1. To return 0 would mean performing
+ * a search for the entry first before deleting it (to confirm that it
+ * did exist prior to the delete), so right now we sacrifice accuracy
+ * here for the sake of efficiency.
+ */
+ @Override
+ public void execute() throws ConnectorException {
+ // first make a copy of the initial LDAP context we got from
+ // the connection. The actual update-class operation will use
+ // this copy. This will enable the close and cancel methods
+ // to stop any LDAP operations we are making by calling the
+ // close() method of the copy context, without closing our
+ // real connection to the LDAP server
+ try {
+ ldapCtx = (LdapContext)this.ldapConnection.lookup(""); //$NON-NLS-1$
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.createContextError",ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+
+ if (command instanceof Update) {
+ executeUpdate();
+ }
+ else if (command instanceof Delete) {
+ executeDelete();
+ }
+ else if (command instanceof Insert) {
+ executeInsert();
+ }
+ else {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.incorrectCommandError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ }
+
+ @Override
+ public int[] getUpdateCounts() throws DataNotAvailableException,
+ ConnectorException {
+ return new int[] {1};
+ }
+
+
+ // Private method to actually do an insert operation. Per JNDI doc at
+ // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html, JNDI method to add new entry to LDAP that does not contain a Java object is
+ // DirContext.createSubContext(), so that is what is used here.
+ //
+ // The insert must include an element named "DN" (case insensitive)
+ // which will be the fully qualified LDAP distinguished name of the
+ // entry to add.
+ //
+ // Also, while we make no effort to prevent insert operations that
+ // break these rules, the underlying LDAP operation will fail (and
+ // pass back an explanatory message, which we will return in a
+ // ConnectorException, in the following cases:
+ // -if the parent context for this entry does not exist in the directory
+ // -if the insert does not specify values for all required attributes
+ // of the class. Since objectClass is required for all LDAP entries,
+ // if it is not specified this condition will apply - and once it is
+ // specified then all of the other required attributes for that
+ // objectClass will of course also be required.
+ //
+ // Just as with the read support in the LDAPSyncQueryExecution class,
+ // multi-value attributes are not supported by this implementation.
+ //
+ // TODO - maybe automatically specify objectClass based off of
+ // Name/NameInSource RESTRICT property settings, like with read support
+ private void executeInsert()
+ throws ConnectorException {
+
+ List<ColumnReference> insertElementList = ((Insert)command).getColumns();
+ List<Expression> insertValueList = ((ExpressionValueSource)((Insert)command).getValueSource()).getValues();
+ // create a new attribute list with case ignored in attribute
+ // names
+ Attributes insertAttrs = new BasicAttributes(true);
+ Attribute insertAttr; // what we will use to populate the attribute list
+ ColumnReference insertElement;
+ String nameInsertElement;
+ Object insertValue;
+ String distinguishedName = null;
+ // The IInsert interface uses separate List objects for
+ // the element names and values to be inserted, limiting
+ // the potential for code reuse in reading them (since all
+ // other interfaces use ICriteria-based mechanisms for such
+ // input).
+ for (int i=0; i < insertElementList.size(); i++) {
+ insertElement = insertElementList.get(i);
+ // call utility class to get NameInSource/Name of element
+ nameInsertElement = getNameFromElement(insertElement);
+ // special handling for DN attribute - use it to set
+ // distinguishedName value.
+ if (nameInsertElement.toUpperCase().equals("DN")) { //$NON-NLS-1$
+ insertValue = ((Literal)insertValueList.get(i)).getValue();
+ if (insertValue == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.columnSourceNameDNNullError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ if (!(insertValue instanceof java.lang.String)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.columnSourceNameDNTypeError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ distinguishedName = (String)insertValue;
+ }
+ // for other attributes specified in the insert command,
+ // create a new
+ else {
+ insertAttr = new BasicAttribute(nameInsertElement);
+ insertValue = ((Literal)insertValueList.get(i)).getValue();
+ insertAttr.add(insertValue);
+ insertAttrs.put(insertAttr);
+ }
+ }
+ // if the DN is not specified, we don't know enough to attempt
+ // the LDAP add operation, so throw an exception
+ if (distinguishedName == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.noInsertSourceNameDNError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ // just try to create a new LDAP entry using the DN and
+ // attributes specified in the INSERT operation. If it isn't
+ // legal, we'll get a NamingException back, whose explanation
+ // we'll return in a ConnectorException
+ try {
+ ldapCtx.createSubcontext(distinguishedName, insertAttrs);
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.insertFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ } catch (Exception e) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.insertFailedUnexpected",distinguishedName); //$NON-NLS-1$
+ throw new ConnectorException(e, msg);
+ }
+ }
+
+ // Private method to actually do a delete operation. Per JNDI doc at
+ // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html,
+ // a good JNDI method to delete an entry to LDAP is
+ // DirContext.destroySubContext(), so that is what is used here.
+ //
+ // The delete criteria must include only an equals comparison
+ // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
+ // Note that the underlying LDAP operations here return successfully
+ // even if the named entry doesn't exist (as long as its parent does
+ // exist).
+ private void executeDelete()
+ throws ConnectorException {
+
+ Condition criteria = ((Delete)command).getWhere();
+
+ // since we have the exact same processing rules for criteria
+ // for updates and deletes, we use a common private method to do this.
+ // note that this private method will throw a ConnectorException
+ // for illegal criteria, which we deliberately don't catch
+ // so it gets passed on as is.
+ String distinguishedName = getDNFromCriteria(criteria);
+
+ // just try to delete an LDAP entry using the DN
+ // specified in the DELETE operation. If it isn't
+ // legal, we'll get a NamingException back, whose explanation
+ // we'll return in a ConnectorException
+ try {
+ ldapCtx.destroySubcontext(distinguishedName);
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.deleteFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ // don't remember why I added this generic catch of Exception,
+ // but it does no harm...
+ } catch (Exception e) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.deleteFailedUnexpected",distinguishedName); //$NON-NLS-1$
+ throw new ConnectorException(e, msg);
+ }
+ }
+
+ // Private method to actually do an update operation. Per JNDI doc at
+ // http://java.sun.com/products/jndi/tutorial/ldap/models/operations.html,
+ // the JNDI method to use to update an entry to LDAP is one of the
+ // DirContext.modifyAttributes() methods that takes ModificationItem[]
+ // as a parameter, so that is what is used here.
+ // Note that this method does not allow for changing of the DN - to
+ // implement that we would need to use Context.rename(). Since right
+ // now we only call modifyAttributes(), and don't check for the DN
+ // in the list of updates, we will attempt to update the DN using
+ // modifyAttributes(), and let the LDAP server fail the request (and
+ // send us the explanation for the failure, which is returned in
+ // a ConnectorException)
+ //
+ // The update criteria must include only an equals comparison
+ // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
+ private void executeUpdate()
+ throws ConnectorException {
+
+ List<SetClause> updateList = ((Update)command).getChanges();
+ Condition criteria = ((Update)command).getWhere();
+
+ // since we have the exact same processing rules for criteria
+ // for updates and deletes, we use a common private method to do this.
+ // note that this private method will throw a ConnectorException
+ // for illegal criteria, which we deliberately don't catch
+ // so it gets passed on as is.
+ String distinguishedName = getDNFromCriteria(criteria);
+
+
+ // this will be the list of modifications to attempt. Since
+ // we currently blindly try all the updates the query
+ // specifies, right now this is the same size as the updateList.
+ // When we start filtering out DN changes (which would need to
+ // be performed separately using Context.rename()), we will
+ // need to account for this in determining this list size.
+ ModificationItem[] updateMods = new ModificationItem[updateList.size()];
+ ColumnReference leftElement;
+ Expression rightExpr;
+ String nameLeftElement;
+ Object valueRightExpr;
+ // iterate through the supplied list of updates (each of
+ // which is an ICompareCriteria with an IElement on the left
+ // side and an IExpression on the right, per the Connector
+ // API).
+ for (int i=0; i < updateList.size(); i++) {
+ SetClause setClause = updateList.get(i);
+ // trust that connector API is right and left side
+ // will always be an IElement
+ leftElement = setClause.getSymbol();
+ // call utility method to get NameInSource/Name for element
+ nameLeftElement = getNameFromElement(leftElement);
+ // get right expression - if it is not a literal we
+ // can't handle that so throw an exception
+ rightExpr = setClause.getValue();
+ if (!(rightExpr instanceof Literal)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.valueNotLiteralError",nameLeftElement); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ valueRightExpr = ((Literal)rightExpr).getValue();
+ // add in the modification as a replacement - meaning
+ // any existing value(s) for this attribute will
+ // be replaced by the new value. If the attribute
+ // didn't exist, it will automatically be created
+ // TODO - since null is a valid attribute
+ // value, we don't do any special handling of it right
+ // now. But maybe null should mean to delete an
+ // attribute?
+ updateMods[i] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute(nameLeftElement, valueRightExpr));
+ }
+ // just try to update an LDAP entry using the DN and
+ // attributes specified in the UPDATE operation. If it isn't
+ // legal, we'll get a NamingException back, whose explanation
+ // we'll return in a ConnectorException
+ try {
+ ldapCtx.modifyAttributes(distinguishedName, updateMods);
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.updateFailed",distinguishedName,ne.getExplanation()); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ // don't remember why I added this generic catch of Exception,
+ // but it does no harm...
+ } catch (Exception e) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.updateFailedUnexpected",distinguishedName); //$NON-NLS-1$
+ throw new ConnectorException(e, msg);
+ }
+ }
+
+ // private method for extracting the distinguished name from
+ // the criteria, which must include only an equals comparison
+ // on the "DN" column ("WHERE DN='cn=John Doe,ou=people,dc=company,dc=com'")
+ // most of this code is to check the criteria to make sure it is in
+ // this form and throw an appropriate exception if it is not
+ // since there is no way to specify this granularity of criteria
+ // right now in the connector capabilities
+ private String getDNFromCriteria(Condition criteria)
+ throws ConnectorException {
+ if (criteria == null) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaEmptyError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ if (!(criteria instanceof Comparison)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaNotSimpleError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ Comparison compareCriteria = (Comparison)criteria;
+ if (compareCriteria.getOperator() != Operator.EQ) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaNotEqualsError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ Expression leftExpr = compareCriteria.getLeftExpression();
+ if (!(leftExpr instanceof ColumnReference)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaLHSNotElementError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ // call utility method to get NameInSource/Name for element
+ String nameLeftExpr = getNameFromElement((ColumnReference)leftExpr);
+ if (!(nameLeftExpr.toUpperCase().equals("DN"))) { //$NON-NLS-1$
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaSrcColumnError",nameLeftExpr); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ Expression rightExpr = compareCriteria.getRightExpression();
+ if (!(rightExpr instanceof Literal)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaRHSNotLiteralError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ Object valueRightExpr = ((Literal)rightExpr).getValue();
+ if (!(valueRightExpr instanceof java.lang.String)) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.criteriaRHSNotStringError"); //$NON-NLS-1$
+ throw new ConnectorException(msg);
+ }
+ return (String)valueRightExpr;
+ }
+
+ // This is an exact copy of the method with the same name in
+ // IQueryToLdapSearchParser - really should be in a utility class
+ private String getNameFromElement(ColumnReference e) {
+ String ldapAttributeName = null;
+ String elementNameDirect = e.getName();
+ if (elementNameDirect == null) {
+ } else {
+ }
+ AbstractMetadataRecord mdObject = e.getMetadataObject();
+ if (mdObject == null) {
+ return ""; //$NON-NLS-1$
+ }
+ ldapAttributeName = mdObject.getNameInSource();
+ if(ldapAttributeName == null || ldapAttributeName.equals("")) { //$NON-NLS-1$
+ ldapAttributeName = mdObject.getName();
+ // If name in source is not set, then fall back to the column name.
+ }
+ return ldapAttributeName;
+ }
+
+
+ // cancel here by closing the copy of the ldap context (if it was
+ // initialized, which is only true if execute() was previously called)
+ // calling close on already closed context is safe per
+ // javax.naming.Context javadoc so we won't worry about this also
+ // happening in our close method
+ public void cancel() throws ConnectorException {
+ close();
+ }
+
+ // close here by closing the copy of the ldap context (if it was
+ // initialized, which is only true if execute() was previously called)
+ // calling close on already closed context is safe per
+ // javax.naming.Context javadoc so we won't worry about this also
+ // happening in our close method
+ public void close() throws ConnectorException {
+ try {
+ if(ldapCtx != null) {
+ ldapCtx.close();
+ }
+ } catch (NamingException ne) {
+ final String msg = LDAPPlugin.Util.getString("LDAPUpdateExecution.closeContextError",ne.getExplanation()); //$NON-NLS-1$
+ LogManager.logError(LogConstants.CTX_CONNECTOR,msg);
+ }
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
Added: trunk/connectors/translator-ldap/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/translator-ldap/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/translator-ldap/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.ldap.LDAPExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Property changes on: trunk/connectors/translator-ldap/src/main/resources/META-INF/jboss-beans.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/ldap/i18n.properties
===================================================================
--- trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/ldap/i18n.properties (rev 0)
+++ trunk/connectors/translator-ldap/src/main/resources/org/teiid/resource/adapter/ldap/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,37 @@
+#
+# 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.
+#
+
+#
+LDAPConnection.urlPropNotFound=Ldap URL property not found.
+LDAPConnection.adminUserDNPropNotFound=Ldap Admin User DN property not found.
+LDAPConnection.adminUserPassPropNotFound=Ldap Admin password property not found.
+LDAPConnection.maxCriteriaParseError=Ldap Max Criteria property has an invalid format.
+LDAPConnection.maxCriteriaPropNotFound=Ldap Max Criteria property not found.
+LDAPConnection.contextInitFailed=LDAP context initialization failed. Please check connector properties, and verify against LDAP server.
+LDAPConnection.propertyFileParseFailed=The Properties file could not be parsed.
+LDAPConnection.directoryNamingError=Initializing LDAP directory context failed. Please check LDAP connection properties, including username and password: {0}
+LDAPConnection.directoryInitError=Initializing LDAP directory context failed.
+LDAPConnection.unsupportedExecMode=LDAPConnector does not support requested execution mode.
+LDAPConnection.contextCloseError=The Connection failed to close LDAP context: {0}
+#
+ILDAPSourceConnectionFactory.creatingConnection=LDAPSourceConnectionFactory is creating a new connection.
+
Added: trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/ldap/TestIQueryToLdapSearchParser.java
===================================================================
--- trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/ldap/TestIQueryToLdapSearchParser.java (rev 0)
+++ trunk/connectors/translator-ldap/src/test/java/org/teiid/resource/adapter/ldap/TestIQueryToLdapSearchParser.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,309 @@
+/*
+ * 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.resource.adapter.ldap;
+
+import static org.mockito.Mockito.mock;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.naming.directory.Attribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.ldap.SortKey;
+
+import junit.framework.TestCase;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.MetadataStore;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Schema;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.metadata.runtime.Column.SearchType;
+import org.teiid.dqp.internal.datamgr.metadata.RuntimeMetadataImpl;
+import org.teiid.metadata.CompositeMetadataStore;
+import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.ldap.IQueryToLdapSearchParser;
+import org.teiid.resource.adapter.ldap.LDAPExecutionFactory;
+import org.teiid.resource.adapter.ldap.LDAPSearchDetails;
+
+import com.metamatrix.cdk.CommandBuilder;
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.query.metadata.QueryMetadataInterface;
+import com.metamatrix.query.unittest.RealMetadataFactory;
+
+/**
+ * Test IQueryToLdapSearchParser.
+ */
+/**
+ * @author mdrilling
+ *
+ */
+public class TestIQueryToLdapSearchParser extends TestCase {
+
+ public TestIQueryToLdapSearchParser(String name) {
+ super(name);
+ }
+
+ /**
+ * Get Resolved Command using SQL String and metadata.
+ */
+ public Command getCommand(String sql, QueryMetadataInterface metadata) {
+ CommandBuilder builder = new CommandBuilder(metadata);
+ return builder.getCommand(sql);
+ }
+
+ /**
+ * Helper method for testing the provided LDAPSearchDetails against expected values
+ * @param searchDetails the LDAPSearchDetails object
+ * @param expectedContextName the expected context name
+ * @param expectedContextFilter the expected context filter string
+ * @param expectedAttrNameList list of expected attribute names
+ * @param expectedCountLimit the expected count limit
+ * @param expectedSearchScope the expected search scope
+ * @param expectedSortKeys the expected sortKeys list.
+ */
+ public void helpTestSearchDetails(final LDAPSearchDetails searchDetails, final String expectedContextName,
+ final String expectedContextFilter, final List expectedAttrNameList, final long expectedCountLimit,
+ final int expectedSearchScope, final SortKey[] expectedSortKeys) {
+
+ // Get all of the actual values
+ String contextName = searchDetails.getContextName();
+ String contextFilter = searchDetails.getContextFilter();
+ List attrList = searchDetails.getAttributeList();
+ long countLimit = searchDetails.getCountLimit();
+ int searchScope = searchDetails.getSearchScope();
+ SortKey[] sortKeys = searchDetails.getSortKeys();
+
+ // Compare actual with Expected
+ assertEquals(expectedContextName, contextName);
+ assertEquals(expectedContextFilter, contextFilter);
+
+ assertEquals(attrList.size(),expectedAttrNameList.size());
+ Iterator iter = attrList.iterator();
+ Iterator eIter = expectedAttrNameList.iterator();
+ while(iter.hasNext()&&eIter.hasNext()) {
+ String actualName = ((Attribute)iter.next()).getID();
+ String expectedName = (String)eIter.next();
+ assertEquals(actualName, expectedName);
+ }
+
+ assertEquals(expectedCountLimit, countLimit);
+ assertEquals(expectedSearchScope, searchScope);
+ assertEquals(expectedSortKeys, sortKeys);
+ }
+
+ /**
+ * Test a Query without criteria
+ */
+ public void testSelectFrom1() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(objectClass=*)"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+
+ }
+
+ /**
+ * Test a Query with a criteria
+ */
+ public void testSelectFromWhere1() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name = 'R%'"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(cn=R%)"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+
+ }
+
+ /**
+ * Test a Query with a criteria
+ */
+ public void testEscaping() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name = 'R*'"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(cn=R\\2a)"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+
+ }
+
+ public void testNot() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE not (Name like 'R%' or Name like 'S%')"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(&(!(cn=R*))(!(cn=S*)))"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+
+ }
+
+ public void testGT() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name > 'R'"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(!(cn<=R))"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+ }
+
+ public void testLT() throws Exception {
+ LDAPSearchDetails searchDetails = helpGetSearchDetails("SELECT UserID, Name FROM LdapModel.People WHERE Name < 'R'"); //$NON-NLS-1$
+
+ //-----------------------------------
+ // Set Expected SearchDetails Values
+ //-----------------------------------
+ String expectedContextName = "ou=people,dc=metamatrix,dc=com"; //$NON-NLS-1$
+ String expectedContextFilter = "(!(cn>=R))"; //$NON-NLS-1$
+
+ List expectedAttrNameList = new ArrayList();
+ expectedAttrNameList.add("uid"); //$NON-NLS-1$
+ expectedAttrNameList.add("cn"); //$NON-NLS-1$
+
+ long expectedCountLimit = -1;
+ int expectedSearchScope = SearchControls.ONELEVEL_SCOPE;
+ SortKey[] expectedSortKeys = null;
+
+ helpTestSearchDetails(searchDetails, expectedContextName, expectedContextFilter, expectedAttrNameList,
+ expectedCountLimit, expectedSearchScope, expectedSortKeys);
+ }
+
+ private LDAPSearchDetails helpGetSearchDetails(String queryString) throws ConnectorException {
+ QueryMetadataInterface metadata = exampleLdap();
+ RuntimeMetadata rm = new RuntimeMetadataImpl(metadata);
+
+ LDAPExecutionFactory config = mock(LDAPExecutionFactory.class);
+
+ IQueryToLdapSearchParser searchParser = new IQueryToLdapSearchParser(config);
+
+ Select query = (Select)getCommand(queryString, metadata);
+
+ LDAPSearchDetails searchDetails = searchParser.translateSQLQueryToLDAPSearch(query);
+ return searchDetails;
+ }
+
+ public static QueryMetadataInterface exampleLdap() {
+ MetadataStore metadataStore = new MetadataStore();
+
+ // Create models
+ Schema ldapModel = RealMetadataFactory.createPhysicalModel("LdapModel", metadataStore); //$NON-NLS-1$
+
+ // Create physical groups
+ Table table = RealMetadataFactory.createPhysicalGroup("People", ldapModel); //$NON-NLS-1$
+ table.setNameInSource("ou=people,dc=metamatrix,dc=com"); //$NON-NLS-1$
+
+ // Create physical elements
+ String[] elemNames = new String[] {
+ "UserID", "Name" //$NON-NLS-1$ //$NON-NLS-2$
+ };
+ String[] elemTypes = new String[] {
+ DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
+ };
+
+ List<Column> cols = RealMetadataFactory.createElements(table, elemNames, elemTypes);
+
+ // Set name in source on each column
+ String[] nameInSource = new String[] {
+ "uid", "cn" //$NON-NLS-1$ //$NON-NLS-2$
+ };
+ for(int i=0; i<2; i++) {
+ Column obj = cols.get(i);
+ obj.setNameInSource(nameInSource[i]);
+ }
+
+ // Set column-specific properties
+ for(int i=1; i<2; i++) {
+ cols.get(i).setSearchType(SearchType.Unsearchable);
+ }
+
+ // Create the facade from the store
+ return new TransformationMetadata(null, new CompositeMetadataStore(metadataStore), null, null);
+ }
+}
+
Copied: trunk/connectors/translator-loopback (from rev 2083, trunk/connectors/connector-loopback)
Modified: trunk/connectors/translator-loopback/pom.xml
===================================================================
--- trunk/connectors/connector-loopback/pom.xml 2010-04-27 17:56:40 UTC (rev 2083)
+++ trunk/connectors/translator-loopback/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -8,11 +8,10 @@
<version>7.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
- <artifactId>connector-loopback</artifactId>
+ <artifactId>translator-loopback</artifactId>
<groupId>org.jboss.teiid.connectors</groupId>
- <name>Loopback Connector</name>
- <packaging>rar</packaging>
- <description>Loopback Connector</description>
+ <name>Loopback Translator</name>
+ <description>Loopback Translator</description>
<dependencies>
<dependency>
@@ -31,33 +30,26 @@
<scope>provided</scope>
</dependency>
</dependencies>
-
+
<build>
- <plugins>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>build_jar</id>
- <phase>process-classes</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>deploy_jar</id>
- <phase>package</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <classifier>lib</classifier>
- </configuration>
- </execution>
-
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
\ No newline at end of file
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
Added: trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackCapabilities.java
===================================================================
--- trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackCapabilities.java (rev 0)
+++ trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,317 @@
+/*
+ * 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.resource.adapter.loopback;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+
+/**
+ * Specifies the capabilities of this connector. Since we want this
+ * connector to be able to emulate most other connectors, these
+ * capabilities support everything.
+ */
+public class LoopbackCapabilities extends BasicConnectorCapabilities {
+
+ /**
+ * Construct the capabilities class
+ */
+ public LoopbackCapabilities() {
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
+ */
+ public List getSupportedFunctions() {
+ List functions = Arrays.asList(new String[] {
+ "+", "-", "*", "/", "abs", "acos", "asin", "atan", "atan2", "ceiling", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "bitand", "bitnot", "bitor", "bitxor", "cos", "cot", "degrees", "cos", "cot", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ "degrees", "exp", "floor", "log", "log10", "mod", "pi", "power", "radians", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ "round", "sign", "sin", "sqrt", "tan", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ "ascii", "chr", "char", "concat", "initcap", "insert", "lcase", "left", "length", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ "locate", "lower", "lpad", "ltrim", "repeat", "replace", "right", "rpad", "rtrim", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
+ "substring", "translate", "ucase", "upper", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ "curdate", "curtime", "now", "dayname", "dayofmonth", "dayofweek", "dayofyear", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+ "hour", "minute", "month", "monthname", "quarter", "second", "timestampadd", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+ "timestampdiff", "week", "year", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ "cast", "convert", "ifnull", "nvl" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ });
+ return functions;
+ }
+
+ @Override
+ public boolean supportsGroupBy() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesAvg()
+ */
+ public boolean supportsAggregatesAvg() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCount()
+ */
+ public boolean supportsAggregatesCount() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesCountStar()
+ */
+ public boolean supportsAggregatesCountStar() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesDistinct()
+ */
+ public boolean supportsAggregatesDistinct() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMax()
+ */
+ public boolean supportsAggregatesMax() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesMin()
+ */
+ public boolean supportsAggregatesMin() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAggregatesSum()
+ */
+ public boolean supportsAggregatesSum() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsAliasedGroup()
+ */
+ public boolean supportsAliasedGroup() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsBetweenCriteria()
+ */
+ public boolean supportsBetweenCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCaseExpressions()
+ */
+ public boolean supportsCaseExpressions() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCompareCriteriaEquals()
+ */
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsCorrelatedSubqueries()
+ */
+ public boolean supportsCorrelatedSubqueries() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsExistsCriteria()
+ */
+ public boolean supportsExistsCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsFullOuterJoins()
+ */
+ public boolean supportsFullOuterJoins() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteria()
+ */
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsInCriteriaSubquery()
+ */
+ public boolean supportsInCriteriaSubquery() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsIsNullCriteria()
+ */
+ public boolean supportsIsNullCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteria()
+ */
+ public boolean supportsLikeCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsLikeCriteriaEscapeCharacter()
+ */
+ public boolean supportsLikeCriteriaEscapeCharacter() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsNotCriteria()
+ */
+ public boolean supportsNotCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrCriteria()
+ */
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOrderBy()
+ */
+ public boolean supportsOrderBy() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsOuterJoins()
+ */
+ public boolean supportsOuterJoins() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsQuantifiedCompareCriteriaAll()
+ */
+ public boolean supportsQuantifiedCompareCriteriaAll() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsScalarSubqueries()
+ */
+ public boolean supportsScalarSubqueries() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSearchedCaseExpressions()
+ */
+ public boolean supportsSearchedCaseExpressions() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSelectDistinct()
+ */
+ public boolean supportsSelectDistinct() {
+ return true;
+ }
+
+ /*
+ * @see com.metamatrix.data.ConnectorCapabilities#supportsSelfJoins()
+ */
+ public boolean supportsSelfJoins() {
+ return true;
+ }
+
+ public boolean supportsInlineViews() {
+ return true;
+ }
+
+ public boolean supportsQuantifiedCompareCriteriaSome() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSelectExpression() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSetQueryOrderBy() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsUnions() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsCompareCriteriaOrdered() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsInnerJoins() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsExcept() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsHaving() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIntersect() {
+ return true;
+ }
+
+}
Added: trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecution.java
===================================================================
--- trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecution.java (rev 0)
+++ trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,265 @@
+/*
+ * 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.resource.adapter.loopback;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Random;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Argument.Direction;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.TypeFacility;
+import org.teiid.resource.cci.UpdateExecution;
+
+
+/**
+ * Represents the execution of a command.
+ */
+public class LoopbackExecution extends BasicExecution implements UpdateExecution, ProcedureExecution {
+
+ private static final String ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //$NON-NLS-1$
+
+ // Connector resources
+ private LoopbackExecutionFactory config;
+ private Command command;
+
+ // Execution state
+ private Random randomNumber = new Random(System.currentTimeMillis());
+ private List<Object> row;
+ private boolean waited = false;
+ private int rowsReturned = 0;
+ private int rowsNeeded = 1;
+
+ public LoopbackExecution(Command command, LoopbackExecutionFactory config) {
+ this.config = config;
+ this.command = command;
+ }
+
+ @Override
+ public List<?> next() throws ConnectorException, DataNotAvailableException {
+ // Wait on first batch if necessary
+ if(this.config.getWaitTime() > 0 && !waited) {
+ // Wait a random amount of time up to waitTime milliseconds
+ int randomTimeToWait = randomNumber.nextInt(this.config.getWaitTime());
+
+ // If we're asynch and the wait time was longer than the poll interval,
+ // then just say we don't have results instead
+ if(randomTimeToWait > this.config.getPollIntervalInMilli()) {
+ waited = true;
+ throw new DataNotAvailableException(randomTimeToWait);
+ }
+ try {
+ Thread.sleep(randomTimeToWait);
+ } catch(InterruptedException e) {
+ }
+ waited = true;
+ }
+
+ if(rowsReturned < this.rowsNeeded && row.size() > 0) {
+ rowsReturned++;
+ return row;
+ }
+
+ return null;
+ }
+
+ /*
+ * @see com.metamatrix.data.SynchQueryExecution#execute(com.metamatrix.data.language.IQuery, int)
+ */
+ @Override
+ public void execute() throws ConnectorException {
+
+ // Log our command
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Loopback executing command: " + command); //$NON-NLS-1$
+
+ if(this.config.isThrowError()) {
+ throw new ConnectorException("Failing because Error=true"); //$NON-NLS-1$
+ }
+
+ this.rowsNeeded = this.config.getRowCount();
+
+ if (command instanceof QueryExpression) {
+ QueryExpression queryCommand = (QueryExpression)command;
+ if (queryCommand.getLimit() != null) {
+ this.rowsNeeded = queryCommand.getLimit().getRowLimit();
+ }
+ }
+
+ // Prepare for execution
+ List types = determineOutputTypes(this.command);
+ createDummyRow(types);
+ }
+
+ @Override
+ public int[] getUpdateCounts() throws DataNotAvailableException,
+ ConnectorException {
+ return new int [] {0};
+ }
+
+ @Override
+ public List<?> getOutputParameterValues() throws ConnectorException {
+ Call proc = (Call)this.command;
+ int count = proc.getReturnType() != null ? 1:0;
+ for (Argument param : proc.getArguments()) {
+ if (param.getDirection() == Direction.INOUT || param.getDirection() == Direction.OUT) {
+ count++;
+ }
+ }
+ return Arrays.asList(new Object[count]);
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#close()
+ */
+ @Override
+ public void close() throws ConnectorException {
+ // nothing to do
+ }
+
+ /*
+ * @see com.metamatrix.data.Execution#cancel()
+ */
+ @Override
+ public void cancel() throws ConnectorException {
+
+ }
+
+ private List determineOutputTypes(Command command) {
+ // Get select columns and lookup the types in metadata
+ if(command instanceof QueryExpression) {
+ QueryExpression query = (QueryExpression) command;
+ return Arrays.asList(query.getColumnTypes());
+ }
+ if (command instanceof Call) {
+ return Arrays.asList(((Call)command).getResultSetColumnTypes());
+ }
+ List<Class<?>> types = new ArrayList<Class<?>>(1);
+ types.add(Integer.class);
+ return types;
+ }
+
+ private void createDummyRow(List<Class<?>> types) {
+ row = new ArrayList<Object>(types.size());
+
+ for (Class<?> type : types) {
+ row.add( getValue(type) );
+ }
+ }
+
+ /**
+ * Get a variable-sized string.
+ * @param size The size (in characters) of the string
+ */
+ private String getVariableString( int size ) {
+ int multiplier = size / ALPHA.length();
+ int remainder = size % ALPHA.length();
+ String value = ""; //$NON-NLS-1$
+ for ( int k = 0; k < multiplier; k++ ) {
+ value += ALPHA;
+ }
+ value += ALPHA.substring(0,remainder);
+ return value;
+ }
+
+ private static final Integer INTEGER_VAL = new Integer(0);
+ private static final Long LONG_VAL = new Long(0);
+ private static final Float FLOAT_VAL = new Float(0.0);
+ private static final Short SHORT_VAL = new Short((short)0);
+ private static final Double DOUBLE_VAL = new Double(0.0);
+ private static final Character CHAR_VAL = new Character('c');
+ private static final Byte BYTE_VAL = new Byte((byte)0);
+ private static final Boolean BOOLEAN_VAL = Boolean.FALSE;
+ private static final BigInteger BIG_INTEGER_VAL = new BigInteger("0"); //$NON-NLS-1$
+ private static final BigDecimal BIG_DECIMAL_VAL = new BigDecimal("0"); //$NON-NLS-1$
+ public static java.sql.Date SQL_DATE_VAL;
+ public static java.sql.Time TIME_VAL;
+ public static java.sql.Timestamp TIMESTAMP_VAL;
+
+ /*
+ * Set the date/time fields to UTC 0 as displayed in US/Central
+ */
+ static {
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.set(1969, 11, 31, 18, 0, 0);
+ SQL_DATE_VAL = new Date(cal.getTimeInMillis());
+ TIME_VAL = new Time(cal.getTimeInMillis());
+ TIMESTAMP_VAL = new Timestamp(cal.getTimeInMillis());
+ }
+
+ private Object getValue(Class type) {
+ if(type.equals(java.lang.String.class)) {
+ return getVariableString(10);
+ } else if(type.equals(java.lang.Integer.class)) {
+ return INTEGER_VAL;
+ } else if(type.equals(java.lang.Short.class)) {
+ return SHORT_VAL;
+ } else if(type.equals(java.lang.Long.class)) {
+ return LONG_VAL;
+ } else if(type.equals(java.lang.Float.class)) {
+ return FLOAT_VAL;
+ } else if(type.equals(java.lang.Double.class)) {
+ return DOUBLE_VAL;
+ } else if(type.equals(java.lang.Character.class)) {
+ return CHAR_VAL;
+ } else if(type.equals(java.lang.Byte.class)) {
+ return BYTE_VAL;
+ } else if(type.equals(java.lang.Boolean.class)) {
+ return BOOLEAN_VAL;
+ } else if(type.equals(java.math.BigInteger.class)) {
+ return BIG_INTEGER_VAL;
+ } else if(type.equals(java.math.BigDecimal.class)) {
+ return BIG_DECIMAL_VAL;
+ } else if(type.equals(java.sql.Date.class)) {
+ return SQL_DATE_VAL;
+ } else if(type.equals(java.sql.Time.class)) {
+ return TIME_VAL;
+ } else if(type.equals(java.sql.Timestamp.class)) {
+ return TIMESTAMP_VAL;
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.CLOB)) {
+ return this.config.getTypeFacility().convertToRuntimeType(ALPHA.toCharArray());
+ } else if(type.equals(TypeFacility.RUNTIME_TYPES.BLOB)) {
+ return this.config.getTypeFacility().convertToRuntimeType(ALPHA.getBytes());
+ } else {
+ return getVariableString(10);
+ }
+ }
+
+}
Added: trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecutionFactory.java
===================================================================
--- trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-loopback/src/main/java/org/teiid/resource/adapter/loopback/LoopbackExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,100 @@
+/*
+ * 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.resource.adapter.loopback;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.Execution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.TranslatorProperty;
+
+/**
+ * Loopback connector.
+ */
+public class LoopbackExecutionFactory extends BasicExecutionFactory {
+
+ private int waitTime = 0;
+ private int rowCount = 1;
+ private boolean throwError = false;
+ private long pollIntervalInMilli = -1;
+
+ @TranslatorProperty(name="wait-time", display="Max Random Wait Time",required=true, advanced=true, defaultValue="0")
+ public int getWaitTime() {
+ return waitTime;
+ }
+
+ public void setWaitTime(Integer waitTime) {
+ this.waitTime = waitTime.intValue();
+ }
+
+ @TranslatorProperty(name="row-count", display="Rows Per Query",required=true, advanced=true, defaultValue="1")
+ public int getRowCount() {
+ return rowCount;
+ }
+
+ public void setRowCount(Integer rowCount) {
+ this.rowCount = rowCount;
+ }
+
+ @TranslatorProperty(name="throw-error", display="Always Throw Error", defaultValue="false")
+ public boolean isThrowError() {
+ return this.throwError;
+ }
+
+ public void setThrowError(Boolean error) {
+ this.throwError = error.booleanValue();
+ }
+
+ @TranslatorProperty(name="poll-intervel", display="Poll interval if using a Asynchronous Connector", defaultValue="-1")
+ public long getPollIntervalInMilli() {
+ return this.pollIntervalInMilli;
+ }
+
+ public void setPollIntervalInMilli(Long intervel) {
+ this.pollIntervalInMilli = intervel.longValue();
+ }
+
+ @Override
+ public void start() throws ConnectorException {
+ super.start();
+ }
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return LoopbackCapabilities.class;
+ }
+
+ @Override
+ public Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionfactory)
+ throws ConnectorException {
+ return new LoopbackExecution(command, this);
+ }
+
+ @Override
+ public boolean isSourceRequired() {
+ return false;
+ }
+}
Added: trunk/connectors/translator-loopback/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/translator-loopback/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/translator-loopback/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.loopback.LoopbackExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Property changes on: trunk/connectors/translator-loopback/src/main/resources/META-INF/jboss-beans.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoobackAsynch.java
===================================================================
--- trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoobackAsynch.java (rev 0)
+++ trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoobackAsynch.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.resource.adaptor.loopback;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.teiid.resource.adapter.loopback.LoopbackExecutionFactory;
+
+import com.metamatrix.cdk.api.ConnectorHost;
+import com.metamatrix.cdk.unittest.FakeTranslationFactory;
+
+
+/**
+ * @since 4.3
+ */
+public class TestLoobackAsynch extends TestCase {
+
+ public void test() throws Exception {
+ LoopbackExecutionFactory connector = new LoopbackExecutionFactory();
+ connector.setWaitTime(200);
+ connector.setRowCount(1000);
+ connector.setPollIntervalInMilli(100L);
+
+ ConnectorHost host = new ConnectorHost(connector, FakeTranslationFactory.getInstance().getBQTTranslationUtility());
+ List results = host.executeCommand("SELECT intkey from bqt1.smalla", null); //$NON-NLS-1$
+ assertEquals(1000, results.size());
+ }
+
+}
Added: trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoopbackExecution.java
===================================================================
--- trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoopbackExecution.java (rev 0)
+++ trunk/connectors/translator-loopback/src/test/java/org/teiid/resource/adaptor/loopback/TestLoopbackExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,172 @@
+/*
+ * 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.resource.adaptor.loopback;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.loopback.LoopbackExecution;
+import org.teiid.resource.adapter.loopback.LoopbackExecutionFactory;
+
+import com.metamatrix.cdk.api.ConnectorHost;
+import com.metamatrix.cdk.api.TranslationUtility;
+import com.metamatrix.cdk.unittest.FakeTranslationFactory;
+
+public class TestLoopbackExecution extends TestCase {
+
+ public TestLoopbackExecution(String name) {
+ super(name);
+ }
+
+ public LoopbackExecutionFactory exampleProperties(int waitTime, int rowCount) {
+ LoopbackExecutionFactory config = new LoopbackExecutionFactory();
+ config.setWaitTime(waitTime);
+ config.setRowCount(rowCount);
+ return config;
+ }
+
+ public void helpTestQuery(String sql, TranslationUtility metadata, Object[][] expectedResults) throws ConnectorException {
+ helpTestQuery(sql, metadata, 0, 1, expectedResults);
+ }
+
+ public void helpTestQuery(String sql, TranslationUtility metadata, int waitTime, int rowCount, Object[][] expectedResults) throws ConnectorException {
+ ConnectorHost host = new ConnectorHost(exampleProperties(waitTime, rowCount), metadata);
+
+ List actualResults = host.executeCommand(sql, null);
+
+ // Compare actual and expected results
+ assertEquals("Did not get expected number of rows", expectedResults.length, actualResults.size()); //$NON-NLS-1$
+
+ if(expectedResults.length > 0) {
+ // Compare column sizes
+ assertEquals("Did not get expected number of columns", expectedResults[0].length, ((List)actualResults.get(0)).size()); //$NON-NLS-1$
+
+ // Compare results
+ for(int r=0; r<expectedResults.length; r++) {
+ Object[] expectedRow = expectedResults[r];
+ List actualRow = (List) actualResults.get(r);
+
+ for(int c=0; c<expectedRow.length; c++) {
+ Object expectedValue = expectedRow[c];
+ Object actualValue = actualRow.get(c);
+
+ if(expectedValue == null) {
+ if(actualValue != null) {
+ fail("Row " + r + ", Col " + c + ": Expected null but got " + actualValue + " of type " + actualValue.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+ } else if(actualValue == null) {
+ fail("Row " + r + ", Col " + c + ": Expected " + expectedValue + " but got null"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ } else {
+ assertEquals("Row " + r + ", Col " + c + ": Expected " + expectedValue + " but got " + actualValue, expectedValue, actualValue); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+ }
+ }
+ }
+ }
+
+ public void testSimple() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { new Integer(0) }
+ };
+ helpTestQuery("SELECT intkey FROM BQT1.SmallA", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testMostTypes() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { new Integer(0), "ABCDEFGHIJ", new Float(0), new Long(0), new Double(0), new Byte((byte)0), //$NON-NLS-1$
+ LoopbackExecution.SQL_DATE_VAL, LoopbackExecution.TIME_VAL,
+ LoopbackExecution.TIMESTAMP_VAL, Boolean.FALSE,
+ new BigInteger("0"), new BigDecimal("0"), "ABCDEFGHIJ", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ new Short((short)0), new Character('c')
+ }
+ };
+
+ helpTestQuery("SELECT intkey, StringKey, floatnum, longnum, doublenum, bytenum, " + //$NON-NLS-1$
+ "datevalue, timevalue, timestampvalue, booleanvalue, bigintegervalue, bigdecimalvalue, " + //$NON-NLS-1$
+ "objectvalue, shortvalue, charvalue FROM BQT1.SmallA", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testInsert() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { new Integer(0) }
+ };
+ helpTestQuery("INSERT INTO BQT1.SmallA (stringkey) VALUES ('x')", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testUpdate() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { new Integer(0) }
+ };
+ helpTestQuery("UPDATE BQT1.SmallA SET stringkey = 'x'", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testDelete() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { new Integer(0) }
+ };
+ helpTestQuery("DELETE FROM BQT1.SmallA", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testExec() throws Exception {
+ Object[][] results = new Object[][] {
+ new Object[] { "ABCDEFGHIJ" } //$NON-NLS-1$
+ };
+ helpTestQuery("EXEC mmspTest1.MMSP1()", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ public void testExecWithoutResultSet() throws Exception {
+ Object[][] results = new Object[][] {
+ };
+ helpTestQuery("exec pm4.spTest9(1)", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), results); //$NON-NLS-1$
+ }
+
+ /**
+ * wait time is implemented as a random value up to the specified value. assertions are then not really possible
+ * based upon that time.
+ */
+ public void defer_testWaitTime() throws Exception {
+ int waitTime = 100;
+ int testCount = 10;
+
+ ConnectorHost host = new ConnectorHost(exampleProperties(waitTime, 1), FakeTranslationFactory.getInstance().getBQTTranslationUtility());
+
+ for(int i=0; i<testCount; i++) {
+ long before = System.currentTimeMillis();
+ host.executeCommand("SELECT intkey FROM BQT1.SmallA", null); //$NON-NLS-1$
+ long after = System.currentTimeMillis();
+ assertTrue("Waited too long", (after-before) <= waitTime); //$NON-NLS-1$
+ }
+ }
+
+ public void testQueryWithLimit() throws Exception {
+ Object[][] expected = {{new Integer(0)},
+ {new Integer(0)},
+ {new Integer(0)}};
+ helpTestQuery("SELECT intkey FROM BQT1.SmallA LIMIT 3", FakeTranslationFactory.getInstance().getBQTTranslationUtility(), 0, 100, expected); //$NON-NLS-1$
+ }
+
+}
Property changes on: trunk/connectors/translator-salesforce
___________________________________________________________________
Name: svn:ignore
+ target
.classpath
.project
.settings
Added: trunk/connectors/translator-salesforce/pom.xml
===================================================================
--- trunk/connectors/translator-salesforce/pom.xml (rev 0)
+++ trunk/connectors/translator-salesforce/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>translator-salesforce</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>Salesforce Translator</name>
+ <description>Integrates the query engine with Salesforce.com.</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <artifactId>salesforce-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Constants.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Constants.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Constants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+package org.teiid.resource.adapter.salesforce;
+
+public interface Constants {
+
+ public static final String PICKLIST_TYPE = "picklist"; //$NON-NLS-1$
+
+ public static final String MULTIPICKLIST_TYPE = "multipicklist"; //$NON-NLS-1$
+
+ public static final String COMBOBOX_TYPE = "combobox"; //$NON-NLS-1$
+
+ public static final String ANYTYPE_TYPE = "anyType"; //$NON-NLS-1$
+
+ public static final String REFERENCE_TYPE = "reference"; //$NON-NLS-1$
+
+ public static final String STRING_TYPE = "string"; //$NON-NLS-1$
+
+ public static final String BASE64_TYPE = "base64"; //$NON-NLS-1$
+
+ public static final String BOOLEAN_TYPE = "boolean"; //$NON-NLS-1$
+
+ public static final String CURRENCY_TYPE = "currency"; //$NON-NLS-1$
+
+ public static final String TEXTAREA_TYPE = "textarea"; //$NON-NLS-1$
+
+ public static final String INT_TYPE = "int"; //$NON-NLS-1$
+
+ public static final String DOUBLE_TYPE = "double"; //$NON-NLS-1$
+
+ public static final String PERCENT_TYPE = "percent"; //$NON-NLS-1$
+
+ public static final String PHONE_TYPE = "phone"; //$NON-NLS-1$
+
+ public static final String ID_TYPE = "id"; //$NON-NLS-1$
+
+ public static final String DATE_TYPE = "date"; //$NON-NLS-1$
+
+ public static final String DATETIME_TYPE = "datetime"; //$NON-NLS-1$
+
+ public static final String URL_TYPE = "url"; //$NON-NLS-1$
+
+ public static final String EMAIL_TYPE = "email"; //$NON-NLS-1$
+
+ public static final String RESTRICTED_PICKLIST_TYPE = "restrictedpicklist"; //$NON-NLS-1$
+
+ public static final String RESTRICTED_MULTISELECT_PICKLIST_TYPE = "restrictedmultiselectpicklist"; //$NON-NLS-1$
+
+ public static final String SUPPORTS_QUERY = "Supports Query";//$NON-NLS-1$
+
+ public static final String SUPPORTS_RETRIEVE = "Supports Retrieve";//$NON-NLS-1$
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Messages.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Messages.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Messages.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,41 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+
+ private static final String BUNDLE_NAME = "com.metamatrix.connector.salesforce.i18n"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/MetadataProcessor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/MetadataProcessor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/MetadataProcessor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,292 @@
+package org.teiid.resource.adapter.salesforce;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.KeyRecord;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
+import org.teiid.connector.metadata.runtime.Column.SearchType;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.sforce.soap.partner.ChildRelationship;
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeGlobalSObjectResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
+import com.sforce.soap.partner.Field;
+import com.sforce.soap.partner.FieldType;
+import com.sforce.soap.partner.PicklistEntry;
+
+public class MetadataProcessor {
+ private MetadataFactory metadataFactory;
+ private SalesforceConnection connection;
+ private SalesForceExecutionFactory connectorEnv;
+
+ private Map<String, Table> tableMap = new HashMap<String, Table>();
+ private List<Relationship> relationships = new ArrayList<Relationship>();
+ private boolean hasUpdateableColumn = false;
+ private List<Column> columns;
+
+ // Audit Fields
+ public static final String AUDIT_FIELD_CREATED_BY_ID = "CreatedById"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_CREATED_DATE = "CreatedDate"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_LAST_MODIFIED_BY_ID = "LastModifiedById"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_LAST_MODIFIED_DATE = "LastModifiedDate"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_SYSTEM_MOD_STAMP = "SystemModstamp"; //$NON-NLS-1$
+
+ // Model Extensions
+ static final String TABLE_SUPPORTS_CREATE = "Supports Create"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_DELETE = "Supports Delete"; //$NON-NLS-1$
+ static final String TABLE_CUSTOM = "Custom"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_LOOKUP = "Supports ID Lookup"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_MERGE = "Supports Merge"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_QUERY = "Supports Query"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_REPLICATE = "Supports Replicate"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_RETRIEVE = "Supports Retrieve"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_SEARCH = "Supports Search"; //$NON-NLS-1$
+
+ static final String COLUMN_DEFAULTED = "Defaulted on Create"; //$NON-NLS-1$
+ static final String COLUMN_CUSTOM = "Custom"; //$NON-NLS-1$
+ static final String COLUMN_CALCULATED = "Calculated"; //$NON-NLS-1$
+ static final String COLUMN_PICKLIST_VALUES = "Picklist Values"; //$NON-NLS-1$
+
+ public MetadataProcessor(SalesforceConnection connection, MetadataFactory metadataFactory, SalesForceExecutionFactory env) {
+ this.connection = connection;
+ this.metadataFactory = metadataFactory;
+ this.connectorEnv = env;
+ }
+
+ public void processMetadata() throws ConnectorException {
+ DescribeGlobalResult globalResult = connection.getObjects();
+ List<DescribeGlobalSObjectResult> objects = globalResult.getSobjects();
+ for (DescribeGlobalSObjectResult object : objects) {
+ addTable(object);
+ }
+ addRelationships();
+ }
+
+ private void addRelationships() throws ConnectorException {
+ for (Iterator<Relationship> iterator = relationships.iterator(); iterator.hasNext();) {
+ Relationship relationship = iterator.next();
+ if (!this.connectorEnv.isModelAuditFields() && isAuditField(relationship.getForeignKeyField())) {
+ continue;
+ }
+
+ Table parent = tableMap.get(NameUtil.normalizeName(relationship.getParentTable()));
+ KeyRecord pk = parent.getPrimaryKey();
+ if (null == pk) {
+ throw new RuntimeException("ERROR !!primary key column not found!!"); //$NON-NLS-1$
+ }
+ ArrayList<String> columnNames = new ArrayList<String>();
+ columnNames.add(pk.getName());
+
+
+ Table child = tableMap.get(NameUtil.normalizeName(relationship.getChildTable()));
+
+ Column col = null;
+ columns = child.getColumns();
+ for (Iterator colIter = columns.iterator(); colIter.hasNext();) {
+ Column column = (Column) colIter.next();
+ if(column.getName().equals(relationship.getForeignKeyField())) {
+ col = column;
+ }
+ }
+ if (null == col) throw new RuntimeException(
+ "ERROR !!foreign key column not found!! " + child.getName() + relationship.getForeignKeyField()); //$NON-NLS-1$
+
+
+ String columnName = "FK_" + parent.getName() + "_" + col.getName();//$NON-NLS-1$ //$NON-NLS-2$
+ ArrayList<String> columnNames2 = new ArrayList<String>();
+ columnNames2.add(col.getName());
+ metadataFactory.addForiegnKey(columnName, columnNames2, parent, child);
+
+ }
+
+
+ }
+
+ public static boolean isAuditField(String name) {
+ boolean result = false;
+ if(name.equals(AUDIT_FIELD_CREATED_BY_ID) ||
+ name.equals(AUDIT_FIELD_CREATED_DATE) ||
+ name.equals(AUDIT_FIELD_LAST_MODIFIED_BY_ID) ||
+ name.equals(AUDIT_FIELD_LAST_MODIFIED_DATE) ||
+ name.equals(AUDIT_FIELD_SYSTEM_MOD_STAMP)) {
+ result = true;
+ }
+ return result;
+ }
+
+ private void addTable(DescribeGlobalSObjectResult object) throws ConnectorException {
+ DescribeSObjectResult objectMetadata = connection.getObjectMetaData(object.getName());
+ String name = NameUtil.normalizeName(objectMetadata.getName());
+ Table table = metadataFactory.addTable(name);
+
+ table.setNameInSource(objectMetadata.getName());
+ tableMap.put(name, table);
+ getRelationships(objectMetadata);
+
+ table.setProperty(TABLE_CUSTOM, String.valueOf(objectMetadata.isCustom()));
+ table.setProperty(TABLE_SUPPORTS_CREATE, String.valueOf(objectMetadata.isCreateable()));
+ table.setProperty(TABLE_SUPPORTS_DELETE, String.valueOf(objectMetadata.isDeletable()));
+ table.setProperty(TABLE_SUPPORTS_MERGE, String.valueOf(objectMetadata.isMergeable()));
+ table.setProperty(TABLE_SUPPORTS_QUERY, String.valueOf(objectMetadata.isQueryable()));
+ table.setProperty(TABLE_SUPPORTS_REPLICATE, String.valueOf(objectMetadata.isReplicateable()));
+ table.setProperty(TABLE_SUPPORTS_RETRIEVE, String.valueOf(objectMetadata.isRetrieveable()));
+ table.setProperty(TABLE_SUPPORTS_SEARCH, String.valueOf(objectMetadata.isSearchable()));
+
+ hasUpdateableColumn = false;
+ addColumns(objectMetadata, table);
+
+ // Some SF objects return true for isUpdateable() but have no updateable columns.
+ if(hasUpdateableColumn && objectMetadata.isUpdateable()) {
+ table.setSupportsUpdate(true);
+ }
+ }
+
+ private void getRelationships(DescribeSObjectResult objectMetadata) {
+ List<ChildRelationship> children = objectMetadata.getChildRelationships();
+ if(children != null && children.size() != 0) {
+ for (ChildRelationship childRelation : children) {
+ Relationship newRelation = new RelationshipImpl();
+ newRelation.setParentTable(objectMetadata.getName());
+ newRelation.setChildTable(childRelation.getChildSObject());
+ newRelation.setForeignKeyField(childRelation.getField());
+ newRelation.setCascadeDelete(childRelation.isCascadeDelete());
+ relationships.add(newRelation);
+ }
+ }
+ }
+
+ private void addColumns(DescribeSObjectResult objectMetadata, Table table) throws ConnectorException {
+ List<Field> fields = objectMetadata.getFields();
+ for (Field field : fields) {
+ String normalizedName = NameUtil.normalizeName(field.getName());
+ FieldType fieldType = field.getType();
+ if(!this.connectorEnv.isModelAuditFields() && isAuditField(field.getName())) {
+ continue;
+ }
+ String sfTypeName = fieldType.value();
+ Column column = null;
+ if(sfTypeName.equals(FieldType.STRING) || //string
+ sfTypeName.equals(FieldType.COMBOBOX) || //"combobox"
+ sfTypeName.equals(FieldType.REFERENCE) || //"reference"
+ sfTypeName.equals(FieldType.PHONE) || //"phone"
+ sfTypeName.equals(FieldType.ID) || //"id"
+ sfTypeName.equals(FieldType.URL) || //"url"
+ sfTypeName.equals(FieldType.EMAIL) || //"email"
+ sfTypeName.equals(FieldType.ENCRYPTEDSTRING) || //"encryptedstring"
+ sfTypeName.equals(FieldType.ANY_TYPE)) { //"anytype"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ column.setNativeType(sfTypeName);
+ if(sfTypeName.equals(FieldType.ID)) {
+ column.setNullType(NullType.No_Nulls);
+ ArrayList<String> columnNames = new ArrayList<String>();
+ columnNames.add(field.getName());
+ metadataFactory.addPrimaryKey(field.getName()+"_PK", columnNames, table);
+ }
+ }
+ else if(sfTypeName.equals(FieldType.PICKLIST)) { // "picklist"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ if(field.isRestrictedPicklist()) {
+ column.setNativeType("restrictedpicklist");
+ } else {
+ column.setNativeType(sfTypeName);
+ }
+
+ column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
+ }
+ else if(sfTypeName.equals(FieldType.MULTIPICKLIST)) { //"multipicklist"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ if(field.isRestrictedPicklist()) {
+ column.setNativeType("restrictedmultiselectpicklist");
+ } else {
+ column.setNativeType(sfTypeName);
+ }
+ column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
+ }
+ else if(sfTypeName.equals(FieldType.BASE_64)) { //"base64"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BLOB, table);
+ column.setNativeType(sfTypeName);
+ }
+ else if(sfTypeName.equals(FieldType.BOOLEAN)) { //"boolean"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BOOLEAN, table);
+ column.setNativeType(sfTypeName);
+ }
+ else if(sfTypeName.equals(FieldType.CURRENCY)) { //"currency"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
+ column.setNativeType(sfTypeName);
+ column.setCurrency(true);
+ column.setScale(field.getScale());
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType.TEXTAREA)) { //"textarea"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ column.setNativeType(sfTypeName);
+ column.setSearchType(SearchType.Unsearchable);
+ }
+ else if(sfTypeName.equals(FieldType.INT)) { //"int"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.INTEGER, table);
+ column.setNativeType(sfTypeName);
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType.DOUBLE) || //"double"
+ sfTypeName.equals(FieldType.PERCENT)) { //"percent"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
+ column.setNativeType(sfTypeName);
+ column.setScale(field.getScale());
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType.DATE)) { //"date"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DATE, table);
+ column.setNativeType(sfTypeName);
+ }
+ else if(sfTypeName.equals(FieldType.DATETIME)) { //"datetime"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIMESTAMP, table);
+ column.setNativeType(sfTypeName);
+ }
+ else if(sfTypeName.equals(FieldType.TIME)) { //"time"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIME, table);
+ column.setNativeType(sfTypeName);
+ }
+ if(null == column) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, "Unknown type returned by SalesForce: " + sfTypeName);
+ continue;
+ } else {
+ column.setNameInSource(field.getName());
+ column.setLength(field.getLength());
+ if(field.isUpdateable()) {
+ column.setUpdatable(true);
+ hasUpdateableColumn = true;
+ }
+ column.setProperty(COLUMN_CALCULATED, String.valueOf(field.isCalculated()));
+ column.setProperty(COLUMN_CUSTOM, String.valueOf(field.isCustom()));
+ column.setProperty(COLUMN_DEFAULTED, String.valueOf(field.isDefaultedOnCreate()));
+ }
+
+ }
+ }
+
+ private String getPicklistValues(Field field) {
+ StringBuffer picklistValues = new StringBuffer();
+ if(null != field.getPicklistValues() && 0 != field.getPicklistValues().size()) {
+ List<PicklistEntry> entries = field.getPicklistValues();
+ for (Iterator<PicklistEntry> iterator = entries.iterator(); iterator.hasNext();) {
+ PicklistEntry entry = iterator.next();
+ picklistValues.append(entry.getValue());
+ if(iterator.hasNext()) {
+ picklistValues.append(',');
+ }
+ }
+ }
+ return picklistValues.toString();
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/NameUtil.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/NameUtil.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/NameUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ *
+ * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
+ *
+ * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
+ */
+package org.teiid.resource.adapter.salesforce;
+
+import org.teiid.connector.language.SQLReservedWords;
+
+public class NameUtil {
+
+ public static String normalizeName( String nameIn ) {
+ String normal = nameIn.trim();
+ normal = removeDuplicate(normal);
+ normal = removeSpaces(normal);
+ normal = removeIllegalChars(normal);
+ normal = removeTrailingUnderscore(normal);
+ normal = removeLeadingUnderscore(normal);
+ normal = checkReservedWords(normal);
+ return normal;
+
+ }
+
+ /**
+ * @param normal
+ * @return
+ */
+ private static String checkReservedWords( String normal ) {
+ if (SQLReservedWords.isReservedWord(normal)) {
+ normal = normal + "_"; //$NON-NLS-1$
+ }
+ return normal;
+ }
+
+ private static String removeTrailingUnderscore( String normal ) {
+ if (normal.endsWith("_")) { //$NON-NLS-1$
+ return normal.substring(0, normal.lastIndexOf('_'));
+ }
+ return normal;
+ }
+
+ private static String removeIllegalChars( String normal ) {
+ String edit = normal;
+ edit = edit.replace('.', '_');
+ edit = edit.replace('(', '_');
+ edit = edit.replace(')', '_');
+ edit = edit.replace('/', '_');
+ edit = edit.replace('\\', '_');
+ edit = edit.replace(':', '_');
+ edit = edit.replace('\'', '_');
+ edit = edit.replace('-', '_');
+ edit = edit.replace("%", "percentage");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("#", "number");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("$", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("{", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("}", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ return edit;
+ }
+
+ private static String removeSpaces( String normal ) {
+ return normal.replace(' ', '_');
+ }
+
+ private static String removeDuplicate( String normal ) {
+ if (normal.indexOf('(') < 0 || normal.indexOf(')') != normal.length() - 1) return normal;
+ String firstPart = normal.substring(0, normal.indexOf('(')).trim();
+ String secondPart = normal.substring(normal.indexOf('(') + 1, normal.length() - 1).trim();
+ if (firstPart.equals(secondPart) || secondPart.equals("null")) return firstPart; //$NON-NLS-1$
+ return normal;
+ }
+
+ /**
+ * @param normal
+ * @return
+ */
+ private static String removeLeadingUnderscore( String normal ) {
+ while (normal.indexOf('_') == 0) {
+ normal = normal.substring(1);
+ }
+ return normal;
+ }
+
+}
\ No newline at end of file
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Relationship.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Relationship.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Relationship.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,21 @@
+package org.teiid.resource.adapter.salesforce;
+
+public interface Relationship {
+
+ void setParentTable(String name);
+
+ void setChildTable(String childSObject);
+
+ void setForeignKeyField(String field);
+
+ void setCascadeDelete(boolean cascadeDelete);
+
+ public boolean isCascadeDelete();
+
+ public String getChildTable();
+
+ public String getForeignKeyField();
+
+ public String getParentTable();
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/RelationshipImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/RelationshipImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/RelationshipImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,40 @@
+package org.teiid.resource.adapter.salesforce;
+
+public class RelationshipImpl implements Relationship {
+ boolean cascadeDelete;
+ public String childTablename;
+ public String parentTableName;
+ public String foreignKeyField;
+
+ public void setCascadeDelete(boolean delete) {
+ cascadeDelete = delete;
+ }
+
+ public boolean isCascadeDelete() {
+ return cascadeDelete;
+ }
+
+ public void setChildTable(String childTable) {
+ childTablename = childTable;
+ }
+
+ public String getChildTable() {
+ return childTablename;
+ }
+
+ public String getForeignKeyField() {
+ return foreignKeyField;
+ }
+
+ public void setForeignKeyField(String foreignKeyField) {
+ this.foreignKeyField = foreignKeyField;
+ }
+
+ public String getParentTable() {
+ return parentTableName;
+ }
+
+ public void setParentTable(String parentTableName) {
+ this.parentTableName = parentTableName;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForceExecutionFactory.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForceExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForceExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,111 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.execution.DeleteExecutionImpl;
+import org.teiid.resource.adapter.salesforce.execution.InsertExecutionImpl;
+import org.teiid.resource.adapter.salesforce.execution.ProcedureExecutionParentImpl;
+import org.teiid.resource.adapter.salesforce.execution.QueryExecutionImpl;
+import org.teiid.resource.adapter.salesforce.execution.UpdateExecutionImpl;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.MetadataProvider;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TranslatorProperty;
+import org.teiid.resource.cci.UpdateExecution;
+
+
+public class SalesForceExecutionFactory extends org.teiid.resource.adapter.BasicExecutionFactory implements MetadataProvider {
+
+ private String connectorStateClass;
+ private boolean auditModelFields = false;
+
+
+ public String getConnectorStateClass() {
+ return this.connectorStateClass;
+ }
+ public void setConnectorStateClass(String connectorStateClass) {
+ this.connectorStateClass = connectorStateClass;
+ }
+
+ @TranslatorProperty(name="ModelAuditFields", display="Audit Model Fields", advanced=true, defaultValue="false")
+ public boolean isModelAuditFields() {
+ return this.auditModelFields;
+ }
+
+ public void setModelAuditFields(boolean modelAuditFields) {
+ this.auditModelFields = modelAuditFields;
+ }
+
+ @Override
+ public void start() throws ConnectorException {
+ super.start();
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Started"); //$NON-NLS-1$
+ }
+
+
+ @Override
+ public Class<? extends ConnectorCapabilities> getDefaultCapabilities() {
+ return SalesforceCapabilities.class;
+ }
+
+ @Override
+ public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ return new QueryExecutionImpl(command, (SalesforceConnection)connectionFactory, metadata, executionContext);
+ }
+
+ @Override
+ public UpdateExecution createUpdateExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory) throws ConnectorException {
+ UpdateExecution result = null;
+ if(command instanceof org.teiid.connector.language.Delete) {
+ result = new DeleteExecutionImpl(command, (SalesforceConnection)connectionFactory, metadata, executionContext);
+ } else if (command instanceof org.teiid.connector.language.Insert) {
+ result = new InsertExecutionImpl(command, (SalesforceConnection)connectionFactory, metadata, executionContext);
+ } else if (command instanceof org.teiid.connector.language.Update) {
+ result = new UpdateExecutionImpl(command, (SalesforceConnection)connectionFactory, metadata, executionContext);
+ }
+ return result;
+
+ }
+
+ @Override
+ public ProcedureExecution createProcedureExecution(Call command,ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ return new ProcedureExecutionParentImpl(command, (SalesforceConnection)connectionFactory, metadata, executionContext);
+ }
+ @Override
+ public void getConnectorMetadata(MetadataFactory metadataFactory, Object connectionFactory) throws ConnectorException {
+ MetadataProcessor processor = new MetadataProcessor((SalesforceConnection)connectionFactory,metadataFactory, this);
+ processor.processMetadata();
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForcePlugin.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForcePlugin.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesForcePlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,45 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import java.util.ResourceBundle;
+
+import com.metamatrix.core.BundleUtil;
+
+/**
+ * For logging purposes
+ */
+public class SalesForcePlugin {
+
+ /**
+ * The plug-in identifier of this plugin
+ */
+ public static final String PLUGIN_ID = "org.teiid.resource.adapter.salesforce" ; //$NON-NLS-1$
+
+ /**
+ * Provides access to the plugin's log and to it's resources.
+ */
+ private static final String BUNDLE_NAME = PLUGIN_ID + ".i18n"; //$NON-NLS-1$
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,BUNDLE_NAME,ResourceBundle.getBundle(BUNDLE_NAME));
+
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceCapabilities.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceCapabilities.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,96 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+public class SalesforceCapabilities extends BasicConnectorCapabilities {
+
+ public int getMaxInCriteriaSize() {
+ return 700;
+ }
+
+ public List getSupportedFunctions() {
+ List<String> supportedFunctions = new ArrayList<String>();
+ supportedFunctions.add("includes");
+ supportedFunctions.add("excludes");
+ return supportedFunctions;
+ }
+
+ public boolean supportsCompareCriteriaEquals() {
+ return true;
+ }
+
+ public boolean supportsInCriteria() {
+ return true;
+ }
+
+ public boolean supportsLikeCriteria() {
+ return true;
+ }
+
+ public boolean supportsRowLimit() {
+ return true;
+ }
+
+ // http://jira.jboss.org/jira/browse/JBEDSP-306
+ // Salesforce supports ORDER BY, but not on all column types
+ public boolean supportsOrderBy() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsAggregatesCountStar() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsNotCriteria() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsOrCriteria() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsCompareCriteriaOrdered() {
+ return true;
+ }
+
+ @Override
+ public SupportedJoinCriteria getSupportedJoinCriteria() {
+ return SupportedJoinCriteria.KEY;
+ }
+
+ @Override
+ public boolean supportsOuterJoins() {
+ return true;
+ }
+
+
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnection.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnection.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,60 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import java.util.List;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.execution.DataPayload;
+import org.teiid.resource.adapter.salesforce.execution.DeletedResult;
+import org.teiid.resource.adapter.salesforce.execution.UpdatedResult;
+
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
+import com.sforce.soap.partner.QueryResult;
+
+public interface SalesforceConnection {
+
+ public QueryResult query(String queryString, int maxBatchSize, Boolean queryAll) throws ConnectorException;
+
+ public QueryResult queryMore(String queryLocator, int batchSize) throws ConnectorException;
+
+ public boolean isAlive();
+
+ public int delete(String[] ids) throws ConnectorException ;
+
+ public int create(DataPayload data) throws ConnectorException;
+
+ public int update(List<DataPayload> updateDataList) throws ConnectorException;
+
+ public UpdatedResult getUpdated(String objectName, XMLGregorianCalendar startCalendar, XMLGregorianCalendar endCalendar) throws ConnectorException;
+
+ public DeletedResult getDeleted(String objectName, XMLGregorianCalendar startCalendar, XMLGregorianCalendar endCalendar) throws ConnectorException;
+
+ public QueryResult retrieve(String fieldList, String sObjectType, List<String> ids) throws ConnectorException;
+
+ public DescribeGlobalResult getObjects() throws ConnectorException;
+
+ public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException;
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Util.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Util.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/Util.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,71 @@
+/*
+ * 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.resource.adapter.salesforce;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import org.teiid.resource.ConnectorException;
+
+
+public class Util {
+
+ public static String stripQutes(String id) {
+ if((id.startsWith("'") && id.endsWith("'"))) {
+ id = id.substring(1,id.length()-1);
+ } else if ((id.startsWith("\"") && id.endsWith("\""))) {
+ id = id.substring(1,id.length()-1);
+ }
+ return id;
+ }
+
+ public static String addSingleQuotes(String text) {
+ StringBuffer result = new StringBuffer();
+ if(!text.startsWith("'")) {
+ result.append('\'');
+ }
+ result.append(text);
+ if(!text.endsWith("'")) {
+ result.append('\'');
+ }
+ return result.toString();
+ }
+
+ public static void validateQueryLength(StringBuffer query) throws ConnectorException {
+ if(query.length() >= 10000) {
+ throw new ConnectorException(Messages.getString("Util.query.exceeds.max.length"));
+ }
+ }
+
+ public static SimpleDateFormat getSalesforceDateTimeFormat() {
+ return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ }
+
+ public static SimpleDateFormat getTimeZoneOffsetFormat() {
+ return new SimpleDateFormat("Z");
+ }
+
+ public static DateFormat getSalesforceDateFormat() {
+ return new SimpleDateFormat("yyyy-MM-dd");
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/AbstractUpdateExecution.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/AbstractUpdateExecution.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/AbstractUpdateExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,115 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+import java.util.ArrayList;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.Condition;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.Util;
+import org.teiid.resource.adapter.salesforce.execution.visitors.IQueryProvidingVisitor;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.UpdateExecution;
+
+import com.sforce.soap.partner.QueryResult;
+import com.sforce.soap.partner.sobject.SObject;
+
+/**
+ *
+ * Parent class to the Update, Delete, and Insert execution classes.
+ * Provisions the correct impl and contains some common code to
+ * get IDs of Salesforce objects.
+ *
+ */
+public abstract class AbstractUpdateExecution extends BasicExecution implements UpdateExecution {
+
+ protected SalesforceConnection connection;
+ protected RuntimeMetadata metadata;
+ protected ExecutionContext context;
+ protected Command command;
+ protected int result;
+
+ public AbstractUpdateExecution(Command command,
+ SalesforceConnection salesforceConnection,
+ RuntimeMetadata metadata, ExecutionContext context) {
+ this.connection = salesforceConnection;
+ this.metadata = metadata;
+ this.context = context;
+ this.command = command;
+ }
+
+ @Override
+ public void cancel() throws ConnectorException {
+ }
+
+ @Override
+ public void close() throws ConnectorException {
+ }
+
+ @Override
+ public int[] getUpdateCounts() throws DataNotAvailableException,
+ ConnectorException {
+ return new int[] {result};
+ }
+
+ public RuntimeMetadata getMetadata() {
+ return metadata;
+ }
+
+ public SalesforceConnection getConnection() {
+ return connection;
+ }
+
+ String[] getIDs(Condition criteria, IQueryProvidingVisitor visitor) throws ConnectorException {
+ String[] Ids = null;
+ if (visitor.hasOnlyIDCriteria()) {
+ try {
+ String Id = ((Comparison)criteria).getRightExpression().toString();
+ Id = Util.stripQutes(Id);
+ Ids = new String[] { Id };
+ } catch (ClassCastException cce) {
+ throw new RuntimeException(
+ "Error: The delete criteria is not a CompareCriteria");
+ }
+
+ } else if (visitor.hasCriteria()) {
+ String query = visitor.getQuery();
+ QueryResult results = getConnection().query(query, context.getBatchSize(), Boolean.FALSE);
+ if (null != results && results.getSize() > 0) {
+ ArrayList<String> idList = new ArrayList<String>(results
+ .getRecords().size());
+ for (int i = 0; i < results.getRecords().size(); i++) {
+ SObject sObject = results.getRecords().get(i);
+ idList.add(sObject.getId());
+ }
+ Ids = idList.toArray(new String[0]);
+ }
+ }
+ return Ids;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DataPayload.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DataPayload.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DataPayload.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,65 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+import java.util.List;
+
+import javax.xml.bind.JAXBElement;
+
+/**
+ *
+ * A bucket to pass data to the Salesforce connection.
+ *
+ */
+public class DataPayload {
+
+ private String type;
+ @SuppressWarnings("unchecked")
+ private List<JAXBElement> messageElements;
+ private String id;
+
+ public void setType(String typeName) {
+ type = typeName;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setMessageElements(List<JAXBElement> elements) {
+ this.messageElements = elements;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<JAXBElement> getMessageElements() {
+ return messageElements;
+ }
+
+ public void setID(String id) {
+ this.id = id;
+ }
+
+ public String getID() {
+ return id;
+ }
+}
\ No newline at end of file
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeleteExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeleteExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeleteExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Delete;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.execution.visitors.DeleteVisitor;
+import org.teiid.resource.cci.ExecutionContext;
+
+
+public class DeleteExecutionImpl extends AbstractUpdateExecution {
+
+
+ public DeleteExecutionImpl(Command command,
+ SalesforceConnection salesforceConnection,
+ RuntimeMetadata metadata, ExecutionContext context) {
+ super(command, salesforceConnection, metadata, context);
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ DeleteVisitor dVisitor = new DeleteVisitor(getMetadata());
+ dVisitor.visitNode(command);
+ String[] Ids = getIDs(((Delete)command).getWhere(), dVisitor);
+ if(null != Ids && Ids.length > 0) {
+ result = getConnection().delete(Ids);
+ }
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedObject.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedObject.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedObject.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,22 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.util.Calendar;
+
+public class DeletedObject {
+
+ String ID;
+ Calendar deletedDate;
+
+ public String getID() {
+ return ID;
+ }
+ public void setID(String id) {
+ ID = id;
+ }
+ public Calendar getDeletedDate() {
+ return deletedDate;
+ }
+ public void setDeletedDate(Calendar deletedDate) {
+ this.deletedDate = deletedDate;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedResult.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedResult.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/DeletedResult.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,36 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.util.Calendar;
+import java.util.List;
+
+public class DeletedResult {
+
+ private Calendar latestDateCovered;
+ private Calendar earliestDateAvailable;
+ private List<DeletedObject> resultRecords;
+
+ public Calendar getLatestDateCovered() {
+ return latestDateCovered;
+ }
+
+ public void setLatestDateCovered(Calendar latestDateCovered) {
+ this.latestDateCovered = latestDateCovered;
+ }
+
+
+ public Calendar getEarliestDateAvailable() {
+ return earliestDateAvailable;
+ }
+
+ public void setEarliestDateAvailable(Calendar earliestDateAvailable) {
+ this.earliestDateAvailable = earliestDateAvailable;
+ }
+
+ public void setResultRecords(List<DeletedObject> resultRecords) {
+ this.resultRecords = resultRecords;
+ }
+
+ public List<DeletedObject> getResultRecords() {
+ return resultRecords;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetDeletedExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetDeletedExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetDeletedExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,106 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.Call;
+import org.teiid.resource.ConnectorException;
+
+/**
+ *
+ * The structure of the getDeleted procedure is:
+ * Salesforce object type: String: IN param
+ * startDate: datatime: IN param
+ * enddate: datetime: IN param
+ * earliestDateAvailable: datetime: OUT param
+ * latestDateCovered: datetime: OUT param
+ * getUpdatedResult: resultset: OUT param
+ *
+ */
+
+public class GetDeletedExecutionImpl implements SalesforceProcedureExecution {
+
+ private static final int EARLIESTDATEAVAILABLE = 4;
+ private static final int RESULT = 5;
+
+ private ProcedureExecutionParent parent;
+
+ private DeletedResult deletedResult;
+ private int resultIndex = 0;
+ DatatypeFactory factory;
+
+ public GetDeletedExecutionImpl(
+ ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
+ this.parent = procedureExecutionParent;
+ try {
+ factory = DatatypeFactory.newInstance();
+ } catch (DatatypeConfigurationException e) {
+ throw new ConnectorException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void cancel() {
+ // nothing to do here
+
+ }
+
+ @Override
+ public void close() {
+ // nothing to do here
+
+ }
+
+ @Override
+ public void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
+ Call command = parent.getCommand();
+ List<Argument> params = command.getArguments();
+
+ Argument object = params.get(OBJECT);
+ String objectName = (String) object.getArgumentValue().getValue();
+
+ Argument start = params.get(STARTDATE);
+ Timestamp startTime = (Timestamp) start.getArgumentValue().getValue();
+ GregorianCalendar tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
+ tempCalendar.setTime(startTime);
+ XMLGregorianCalendar startCalendar = factory.newXMLGregorianCalendar(tempCalendar);
+
+ Argument end = params.get(ENDDATE);
+ Timestamp endTime = (Timestamp) end.getArgumentValue().getValue();
+ tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
+ tempCalendar.setTime(endTime);
+ XMLGregorianCalendar endCalendar = factory.newXMLGregorianCalendar(tempCalendar);
+
+ deletedResult = parent.getConnection().getDeleted(objectName, startCalendar, endCalendar);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<?> getOutputParameterValues() {
+ List result = new ArrayList();
+ result.add(deletedResult.getLatestDateCovered());
+ result.add(deletedResult.getEarliestDateAvailable());
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<?> next() {
+ List result = null;
+ if(deletedResult.getResultRecords() != null && resultIndex < deletedResult.getResultRecords().size()){
+ result = new ArrayList(2);
+ result.add(deletedResult.getResultRecords().get(resultIndex).getID());
+ result.add(deletedResult.getResultRecords().get(resultIndex).getDeletedDate());
+ resultIndex++;
+ }
+ return result;
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetUpdatedExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetUpdatedExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/GetUpdatedExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,99 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+
+import org.teiid.connector.language.Argument;
+import org.teiid.connector.language.Call;
+import org.teiid.resource.ConnectorException;
+
+/**
+ *
+ * The structure of the getUpdated procedure is:
+ * Salesforce object type: String: IN param
+ * startDate: datatime: IN param
+ * enddate: datetime: IN param
+ * latestDateCovered: datetime: OUT param
+ * getUpdatedResult: resultset: OUT param
+ *
+ */
+
+public class GetUpdatedExecutionImpl implements SalesforceProcedureExecution {
+
+ private static final int RESULT = 4;
+
+ private ProcedureExecutionParent parent;
+ private UpdatedResult updatedResult;
+ private int idIndex = 0;
+ DatatypeFactory factory;
+
+ public GetUpdatedExecutionImpl(
+ ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
+ this.parent = procedureExecutionParent;
+ try {
+ factory = DatatypeFactory.newInstance();
+ } catch (DatatypeConfigurationException e) {
+ throw new ConnectorException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void cancel() {
+ // nothing to do here
+ }
+
+ @Override
+ public void close() {
+ // nothing to do here
+ }
+
+ @Override
+ public void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException {
+ Call command = parent.getCommand();
+ List<Argument> params = command.getArguments();
+
+ Argument object = params.get(OBJECT);
+ String objectName = (String) object.getArgumentValue().getValue();
+
+ Argument start = params.get(STARTDATE);
+ Timestamp startTime = (Timestamp) start.getArgumentValue().getValue();
+ GregorianCalendar tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
+ tempCalendar.setTime(startTime);
+ XMLGregorianCalendar startCalendar = factory.newXMLGregorianCalendar(tempCalendar);
+
+ Argument end = params.get(ENDDATE);
+ Timestamp endTime = (Timestamp) end.getArgumentValue().getValue();
+ tempCalendar = (GregorianCalendar) GregorianCalendar.getInstance();
+ tempCalendar.setTime(endTime);
+ XMLGregorianCalendar endCalendar = factory.newXMLGregorianCalendar(tempCalendar);
+
+ updatedResult = parent.getConnection().getUpdated(objectName, startCalendar, endCalendar);
+ }
+
+ @Override
+ public List<Calendar> getOutputParameterValues() {
+ List<Calendar> result = new ArrayList<Calendar>(1);
+ result.add(updatedResult.getLatestDateCovered());
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List next() {
+ List result = null;
+ if(updatedResult.getIDs() != null && idIndex < updatedResult.getIDs().size()){
+ result = new ArrayList(1);
+ result.add(updatedResult.getIDs().get(idIndex));
+ idIndex++;
+ }
+ return result;
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/InsertExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/InsertExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/InsertExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Insert;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.execution.visitors.InsertVisitor;
+import org.teiid.resource.cci.ExecutionContext;
+
+
+public class InsertExecutionImpl extends AbstractUpdateExecution {
+
+ public InsertExecutionImpl(Command command,
+ SalesforceConnection salesforceConnection,
+ RuntimeMetadata metadata, ExecutionContext context) {
+ super(command, salesforceConnection, metadata, context);
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ InsertVisitor visitor = new InsertVisitor(getMetadata());
+ visitor.visit((Insert)command);
+ DataPayload data = new DataPayload();
+ data.setType(visitor.getTableName());
+ data.setMessageElements(visitor.getMessageElements());
+ result = getConnection().create(data);
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParent.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParent.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParent.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,18 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.cci.ExecutionContext;
+
+
+public interface ProcedureExecutionParent {
+
+ public Call getCommand();
+
+ public ExecutionContext getExecutionContext();
+
+ public RuntimeMetadata getMetadata();
+
+ public SalesforceConnection getConnection();
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParentImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParentImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/ProcedureExecutionParentImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,93 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.util.List;
+
+import org.teiid.connector.language.Call;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ProcedureExecution;
+
+
+public class ProcedureExecutionParentImpl implements ProcedureExecution, ProcedureExecutionParent {
+
+ private Call command;
+ private ExecutionContext executionContext;
+ private RuntimeMetadata metadata;
+ private SalesforceProcedureExecution execution;
+ private SalesforceConnection connection;
+
+ public ProcedureExecutionParentImpl(Call command,
+ SalesforceConnection connection, RuntimeMetadata metadata, ExecutionContext executionContext) {
+ this.setCommand(command);
+ this.setConnection(connection);
+ this.setMetadata(metadata);
+ this.setExecutionContext(executionContext);
+ }
+
+ @Override
+ public List<?> getOutputParameterValues() throws ConnectorException {
+ return execution.getOutputParameterValues();
+ }
+
+ @Override
+ public List<?> next() throws ConnectorException, DataNotAvailableException {
+ return execution.next();
+ }
+
+ @Override
+ public void cancel() throws ConnectorException {
+ execution.cancel();
+ }
+
+ @Override
+ public void close() throws ConnectorException {
+ execution.close();
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ if(getCommand().getProcedureName().endsWith("getUpdated")) {
+ execution = new GetUpdatedExecutionImpl(this);
+ execution.execute(this);
+ }
+ else if(getCommand().getProcedureName().endsWith("getDeleted")) {
+ execution = new GetDeletedExecutionImpl(this);
+ execution.execute(this);
+ }
+ }
+
+ public void setCommand(Call command) {
+ this.command = command;
+ }
+
+ public Call getCommand() {
+ return command;
+ }
+
+ private void setConnection(SalesforceConnection connection) {
+ this.connection = connection;
+ }
+
+ public SalesforceConnection getConnection() {
+ return connection;
+ }
+
+ private void setExecutionContext(ExecutionContext executionContext) {
+ this.executionContext = executionContext;
+ }
+
+ public ExecutionContext getExecutionContext() {
+ return executionContext;
+ }
+
+ private void setMetadata(RuntimeMetadata metadata) {
+ this.metadata = metadata;
+ }
+
+ public RuntimeMetadata getMetadata() {
+ return metadata;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/QueryExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/QueryExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,365 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.teiid.connector.language.AggregateFunction;
+import org.teiid.connector.language.Join;
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.language.TableReference;
+import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.adapter.salesforce.Messages;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.Util;
+import org.teiid.resource.adapter.salesforce.execution.visitors.JoinQueryVisitor;
+import org.teiid.resource.adapter.salesforce.execution.visitors.SelectVisitor;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.w3c.dom.Element;
+
+import com.sforce.soap.partner.QueryResult;
+import com.sforce.soap.partner.sobject.SObject;
+
+public class QueryExecutionImpl extends BasicExecution implements ResultSetExecution {
+
+ private SalesforceConnection connection;
+
+ private RuntimeMetadata metadata;
+
+ private ExecutionContext context;
+
+
+ private SelectVisitor visitor;
+
+ private QueryResult results;
+
+ private List<List<Object>> resultBatch;
+
+ // Identifying values
+ private String connectionIdentifier;
+
+ private String connectorIdentifier;
+
+ private String requestIdentifier;
+
+ private String partIdentifier;
+
+ private String logPreamble;
+
+ private QueryExpression query;
+
+ Map<String, Map<String,Integer>> sObjectToResponseField = new HashMap<String, Map<String,Integer>>();
+
+ private int topResultIndex = 0;
+
+ public QueryExecutionImpl(QueryExpression command, SalesforceConnection connection, RuntimeMetadata metadata, ExecutionContext context) {
+ this.connection = connection;
+ this.metadata = metadata;
+ this.context = context;
+ this.query = command;
+
+ connectionIdentifier = context.getConnectionIdentifier();
+ connectorIdentifier = context.getConnectorIdentifier();
+ requestIdentifier = context.getRequestIdentifier();
+ partIdentifier = context.getPartIdentifier();
+ }
+
+ public void cancel() throws ConnectorException {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, Messages.getString("SalesforceQueryExecutionImpl.cancel"));//$NON-NLS-1$
+ }
+
+ public void close() throws ConnectorException {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, Messages.getString("SalesforceQueryExecutionImpl.close")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, getLogPreamble() + "Incoming Query: " + query.toString()); //$NON-NLS-1$
+ List<TableReference> from = ((Select)query).getFrom();
+ String finalQuery;
+ if(from.get(0) instanceof Join) {
+ visitor = new JoinQueryVisitor(metadata);
+ visitor.visitNode(query);
+ finalQuery = visitor.getQuery().trim();
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, getLogPreamble() + "Executing Query: " + finalQuery); //$NON-NLS-1$
+
+ results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
+ } else {
+ visitor = new SelectVisitor(metadata);
+ visitor.visitNode(query);
+ if(visitor.canRetrieve()) {
+ results = connection.retrieve(visitor.getRetrieveFieldList(),
+ visitor.getTableName(), visitor.getIdInCriteria());
+ } else {
+ finalQuery = visitor.getQuery().trim();
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, getLogPreamble() + "Executing Query: " + finalQuery); //$NON-NLS-1$
+ results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List next() throws ConnectorException, DataNotAvailableException {
+ List<?> result;
+ if (query.getProjectedQuery().getDerivedColumns().get(0)
+ .getExpression() instanceof AggregateFunction) {
+ result = Arrays.asList(results.getSize());
+ results = null;
+
+ } else {
+ result = getRow(results);
+ }
+ return result;
+ }
+
+ private List<Object> getRow(QueryResult result) throws ConnectorException {
+ List<Object> row;
+ if(null == resultBatch) {
+ loadBatch();
+ }
+ if(resultBatch.size() == topResultIndex) {
+ row = null;
+ } else {
+ row = resultBatch.get(topResultIndex);
+ topResultIndex++;
+ if(resultBatch.size() == topResultIndex) {
+ if(!result.isDone()) {
+ loadBatch();
+ }
+ }
+
+ }
+ return row;
+ }
+
+ private void loadBatch() throws ConnectorException {
+ if(null != resultBatch) { // if we have an old batch, then we have to get new results
+ results = connection.queryMore(results.getQueryLocator(), context.getBatchSize());
+ }
+ resultBatch = new ArrayList<List<Object>>();
+
+ for(int resultIndex = 0; resultIndex < results.getSize(); resultIndex++) {
+ SObject sObject = results.getRecords().get(resultIndex);
+ List<Object[]> result = getObjectData(sObject);
+ for(Iterator<Object[]> i = result.iterator(); i.hasNext(); ) {
+ resultBatch.add(Arrays.asList(i.next()));
+ }
+ }
+ }
+
+ private List<Object[]> getObjectData(SObject sObject) throws ConnectorException {
+ List<Object> topFields = sObject.getAny();
+ logAndMapFields(sObject.getType(), topFields);
+ List<Object[]> result = new ArrayList<Object[]>();
+ for(int i = 0; i < topFields.size(); i++) {
+ Element element = (Element) topFields.get(i);
+ QName qName = new QName(element.getNamespaceURI(), element.getLocalName());
+ if(null != qName) {
+ String type = qName.getLocalPart();
+ if(type.equals("sObject")) { //$NON-NLS-1$
+ //SObject parent = (SObject)element.;
+ //result.addAll(getObjectData(parent));
+ } else if(type.equals("QueryResult")) { //$NON-NLS-1$
+ //QueryResult subResult = (QueryResult)element.getValue();
+ //for(int resultIndex = 0; resultIndex < subResult.getSize(); resultIndex++) {
+ // SObject subObject = subResult.getRecords().get(resultIndex);
+ // result.addAll(getObjectData(subObject));
+ //}
+ }
+ }
+ }
+ return extractDataFromFields(sObject, topFields, result);
+
+ }
+
+ private List<Object[]> extractDataFromFields(SObject sObject,
+ List<Object> fields, List<Object[]> result) throws ConnectorException {
+ Map<String,Integer> fieldToIndexMap = sObjectToResponseField.get(sObject.getType());
+ for (int j = 0; j < visitor.getSelectSymbolCount(); j++) {
+ Column element = visitor.getSelectSymbolMetadata(j);
+ AbstractMetadataRecord parent = element.getParent();
+ Table table;
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ parent = parent.getParent();
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ throw new ConnectorException("Could not resolve Table for column " + element.getName()); //$NON-NLS-1$
+ }
+ }
+ if(table.getNameInSource().equals(sObject.getType())) {
+ Integer index = fieldToIndexMap.get(element.getNameInSource());
+ // id gets dropped from the result if it is not the
+ // first field in the querystring. Add it back in.
+ if (null == index) {
+ if (element.getNameInSource().equalsIgnoreCase("id")) { //$NON-NLS-1$
+ setValueInColumn(j, sObject.getId(), result);
+ } else {
+ throw new ConnectorException("SalesforceQueryExecutionImpl.missing.field"+ element.getNameInSource()); //$NON-NLS-1$
+ }
+ } else {
+ Object cell;
+ cell = getCellDatum(element, (Element)fields.get(index));
+ setValueInColumn(j, cell, result);
+ }
+ }
+ }
+ return result;
+ }
+
+ private void setValueInColumn(int columnIndex, Object value, List<Object[]> result) {
+ if(result.isEmpty()) {
+ Object[] row = new Object[visitor.getSelectSymbolCount()];
+ result.add(row);
+ }
+ Iterator<Object[]> iter = result.iterator();
+ while (iter.hasNext()) {
+ Object[] row = iter.next();
+ row[columnIndex] = value;
+ }
+ }
+
+ /**
+ * Load the map of response field names to index.
+ * @param fields
+ * @throws ConnectorException
+ */
+ private void logAndMapFields(String sObjectName,
+ List<Object> fields) throws ConnectorException {
+ if (!sObjectToResponseField.containsKey(sObjectName)) {
+ logFields(sObjectName, fields);
+ Map<String, Integer> responseFieldToIndexMap;
+ responseFieldToIndexMap = new HashMap<String, Integer>();
+ for (int x = 0; x < fields.size(); x++) {
+ Element element = (Element) fields.get(x);
+ responseFieldToIndexMap.put(element.getLocalName(), x);
+ }
+ sObjectToResponseField.put(sObjectName, responseFieldToIndexMap);
+ }
+ }
+
+ private void logFields(String sObjectName, List<Object> fields) throws ConnectorException {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "SalesForce Object Name = " + sObjectName); //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "FieldCount = " + fields.size()); //$NON-NLS-1$
+ for(int i = 0; i < fields.size(); i++) {
+ Element element;
+ element = (Element) fields.get(i);
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Field # " + i + " is " + element.getLocalName()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ }
+
+ @SuppressWarnings("unchecked")
+ private Object getCellDatum(Column element, Element elem) throws ConnectorException {
+ if(!element.getNameInSource().equals(elem.getLocalName())) {
+ throw new ConnectorException("SalesforceQueryExecutionImpl.column.mismatch1" + element.getNameInSource() + "SalesforceQueryExecutionImpl.column.mismatch2" + elem.getLocalName()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ String value = elem.getTextContent();
+ Object result = null;
+ Class type = element.getJavaType();
+
+ if(type.equals(String.class)) {
+ result = value;
+ }
+ else if (type.equals(Boolean.class)) {
+ result = Boolean.valueOf(value);
+ } else if (type.equals(Double.class)) {
+ if (null != value) {
+ if(value.isEmpty()) {
+ result = null;
+ } else {
+ result = Double.valueOf(value);
+ }
+ }
+ } else if (type.equals(Integer.class)) {
+ if (null != value) {
+ if(value.isEmpty()) {
+ result = null;
+ } else {
+ result = Integer.valueOf(value);
+ }
+ }
+ } else if (type.equals(java.sql.Date.class)) {
+ if (null != value) {
+ if(value.isEmpty()) {
+ result = null;
+ } else {
+ result = java.sql.Date.valueOf(value);
+ }
+ }
+ } else if (type.equals(java.sql.Timestamp.class)) {
+ if (null != value) {
+ if(value.isEmpty()) {
+ result = null;
+ } else try {
+ Date date = Util.getSalesforceDateTimeFormat().parse(value);
+ result = new Timestamp(date.getTime());
+ } catch (ParseException e) {
+ throw new ConnectorException(e, "SalesforceQueryExecutionImpl.datatime.parse" + value); //$NON-NLS-1$
+ }
+ }
+ } else {
+ result = value;
+ }
+ return result;
+ }
+
+
+ private String getLogPreamble() {
+ if (null == logPreamble) {
+ StringBuffer preamble = new StringBuffer();
+ preamble.append(connectorIdentifier);
+ preamble.append('.');
+ preamble.append(connectionIdentifier);
+ preamble.append('.');
+ preamble.append(requestIdentifier);
+ preamble.append('.');
+ preamble.append(partIdentifier);
+ preamble.append(": "); //$NON-NLS-1$
+ logPreamble = preamble.toString();
+ }
+ return logPreamble;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/SalesforceProcedureExecution.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/SalesforceProcedureExecution.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/SalesforceProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,24 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.util.List;
+
+import org.teiid.resource.ConnectorException;
+
+public interface SalesforceProcedureExecution {
+
+ static final int OBJECT = 0;
+ static final int STARTDATE = 1;
+ static final int ENDDATE = 2;
+ static final int LATESTDATECOVERED = 3;
+
+ List<?> getOutputParameterValues();
+
+ List<?> next();
+
+ void cancel();
+
+ void close();
+
+ void execute(ProcedureExecutionParent procedureExecutionParent) throws ConnectorException;
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdateExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdateExecutionImpl.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdateExecutionImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,84 @@
+/*
+ * 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.resource.adapter.salesforce.execution;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.namespace.QName;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.SetClause;
+import org.teiid.connector.language.Update;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.SalesforceConnection;
+import org.teiid.resource.adapter.salesforce.Util;
+import org.teiid.resource.adapter.salesforce.execution.visitors.UpdateVisitor;
+import org.teiid.resource.cci.ExecutionContext;
+
+
+public class UpdateExecutionImpl extends AbstractUpdateExecution {
+
+ @SuppressWarnings("unchecked")
+ private static final Class stringClazz = new String().getClass();
+
+ public UpdateExecutionImpl(Command command,
+ SalesforceConnection salesforceConnection,
+ RuntimeMetadata metadata, ExecutionContext context) {
+ super(command, salesforceConnection, metadata, context);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void execute() throws ConnectorException {
+ UpdateVisitor visitor = new UpdateVisitor(getMetadata());
+ visitor.visit((Update)command);
+ String[] Ids = getIDs(((Update)command).getWhere(), visitor);
+
+ if (null != Ids && Ids.length > 0) {
+ List<JAXBElement> elements = new ArrayList<JAXBElement>();
+ for (SetClause clause : ((Update)command).getChanges()) {
+ ColumnReference element = clause.getSymbol();
+ Column column = element.getMetadataObject();
+ String val = ((Literal) clause.getValue()).toString();
+ JAXBElement messageElem = new JAXBElement(new QName(column.getNameInSource()), stringClazz, Util.stripQutes(val));
+ elements.add(messageElem);
+ }
+
+ List<DataPayload> updateDataList = new ArrayList<DataPayload>();
+ for (int i = 0; i < Ids.length; i++) {
+ DataPayload data = new DataPayload();
+ data.setType(visitor.getTableName());
+ data.setID(Ids[i]);
+ data.setMessageElements(elements);
+ updateDataList.add(data);
+ }
+
+ result = getConnection().update(updateDataList);
+ }
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdatedResult.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdatedResult.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/UpdatedResult.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,26 @@
+package org.teiid.resource.adapter.salesforce.execution;
+
+import java.util.Calendar;
+import java.util.List;
+
+public class UpdatedResult {
+
+ private Calendar latestDateCovered;
+ private List<String> IDs;
+
+ public Calendar getLatestDateCovered() {
+ return latestDateCovered;
+ }
+
+ public void setLatestDateCovered(Calendar latestDateCovered) {
+ this.latestDateCovered = latestDateCovered;
+ }
+
+ public List<String> getIDs() {
+ return IDs;
+ }
+
+ public void setIDs(List<String> list) {
+ this.IDs = list;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/CriteriaVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/CriteriaVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/CriteriaVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,455 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.AndOr;
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Function;
+import org.teiid.connector.language.In;
+import org.teiid.connector.language.Like;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.Not;
+import org.teiid.connector.language.Comparison.Operator;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.visitor.framework.HierarchyVisitor;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.Messages;
+import org.teiid.resource.adapter.salesforce.Util;
+
+
+/**
+ * Parses Criteria in support of all of the ExecutionImpl classes.
+ */
+public abstract class CriteriaVisitor extends HierarchyVisitor implements ICriteriaVisitor {
+
+ private static final String RESTRICTEDMULTISELECTPICKLIST = "restrictedmultiselectpicklist";
+ private static final String MULTIPICKLIST = "multipicklist";
+ protected static final String SELECT = "SELECT";
+ protected static final String FROM = "FROM";
+ protected static final String WHERE = "WHERE";
+ protected static final String ORDER_BY = "ORDER BY";
+ protected static final String LIMIT = "LIMIT";
+ protected static final String SPACE = " ";
+ protected static final String EXCLUDES = "EXCLUDES";
+ protected static final String INCLUDES = "includes";
+ protected static final String COMMA = ",";
+ protected static final String SEMI = ";";
+ protected static final String APOS = "'";
+ protected static final String OPEN = "(";
+ protected static final String CLOSE = ")";
+
+ protected RuntimeMetadata metadata;
+ private HashMap<Comparison.Operator, String> comparisonOperators;
+ protected List<String> criteriaList = new ArrayList<String>();
+ protected boolean hasCriteria;
+ protected Map<String, Column> columnElementsByName = new HashMap<String, Column>();
+ protected List<ConnectorException> exceptions = new ArrayList<ConnectorException>();
+ protected Table table;
+ boolean onlyIDCriteria;
+ protected Boolean queryAll = Boolean.FALSE;
+
+ // support for invoking a retrieve when possible.
+ protected In idInCriteria = null;
+
+
+ public CriteriaVisitor( RuntimeMetadata metadata ) {
+ this.metadata = metadata;
+ comparisonOperators = new HashMap<Comparison.Operator, String>();
+ comparisonOperators.put(Operator.EQ, "=");
+ comparisonOperators.put(Operator.GE, ">=");
+ comparisonOperators.put(Operator.GT, ">");
+ comparisonOperators.put(Operator.LE, "<=");
+ comparisonOperators.put(Operator.LT, "<");
+ comparisonOperators.put(Operator.NE, "!=");
+ }
+
+ @Override
+ public void visit( Comparison criteria ) {
+ super.visit(criteria);
+ try {
+ addCompareCriteria(criteriaList, criteria);
+ boolean isAcceptableID = (Operator.EQ == criteria.getOperator() && isIdColumn(criteria.getLeftExpression()));
+ setHasCriteria(true, isAcceptableID);
+ } catch (ConnectorException e) {
+ exceptions.add(e);
+ }
+ }
+
+ @Override
+ public void visit( Like criteria ) {
+ try {
+ if (isIdColumn(criteria.getLeftExpression())) {
+ ConnectorException e = new ConnectorException(Messages.getString("CriteriaVisitor.LIKE.not.supported.on.Id"));
+ exceptions.add(e);
+ }
+ if (isMultiSelectColumn(criteria.getLeftExpression())) {
+ ConnectorException e = new ConnectorException(
+ Messages.getString("CriteriaVisitor.LIKE.not.supported.on.multiselect"));
+ exceptions.add(e);
+ }
+ } catch (ConnectorException e) {
+ exceptions.add(e);
+ }
+ boolean negated = criteria.isNegated();
+ criteria.setNegated(false);
+ criteriaList.add(criteria.toString());
+ if (negated) {
+ addNot();
+ criteria.setNegated(true);
+ }
+ // don't check if it's ID, Id LIKE '123%' still requires a query
+ setHasCriteria(true, false);
+ }
+
+ @Override
+ public void visit(AndOr obj) {
+ List<String> savedCriteria = new LinkedList<String>();
+ savedCriteria.add(OPEN);
+ super.visitNode(obj.getLeftCondition());
+ savedCriteria.addAll(this.criteriaList);
+ this.criteriaList.clear();
+ savedCriteria.add(CLOSE);
+ savedCriteria.add(SPACE);
+ savedCriteria.add(obj.getOperator().toString());
+ savedCriteria.add(SPACE);
+ savedCriteria.add(OPEN);
+ super.visitNode(obj.getRightCondition());
+ savedCriteria.addAll(this.criteriaList);
+ this.criteriaList.clear();
+ this.criteriaList = savedCriteria;
+ this.criteriaList.add(CLOSE);
+ }
+
+ @Override
+ public void visit(Not obj) {
+ super.visit(obj);
+ addNot();
+ }
+
+ private void addNot() {
+ if (!criteriaList.isEmpty()) {
+ criteriaList.add(0, "NOT ("); //$NON-NLS-1$
+ criteriaList.add(CLOSE);
+ }
+ }
+
+ @Override
+ public void visit( In criteria ) {
+ try {
+ Expression lExpr = criteria.getLeftExpression();
+ String columnName = lExpr.toString();
+ if (columnElementsByName.containsKey(columnName)) {
+ Column column = columnElementsByName.get(columnName);
+ if (MULTIPICKLIST.equalsIgnoreCase(column.getNativeType()) || RESTRICTEDMULTISELECTPICKLIST.equalsIgnoreCase(column.getNativeType())) {
+ appendMultiselectIn(column, criteria);
+ } else {
+ appendCriteria(criteria);
+ }
+ }
+ setHasCriteria(true, isIdColumn(criteria.getLeftExpression()));
+ } catch (ConnectorException e) {
+ exceptions.add(e);
+ }
+ }
+
+ public void parseFunction( Function func ) {
+ String functionName = func.getName();
+ try {
+ if (functionName.equalsIgnoreCase("includes")) {
+ generateMultiSelect(func, INCLUDES);
+ } else if (functionName.equalsIgnoreCase("excludes")) {
+ generateMultiSelect(func, EXCLUDES);
+ }
+ } catch (ConnectorException e) {
+ exceptions.add(e);
+ }
+ }
+
+ private void generateMultiSelect( Function func,
+ String funcName ) throws ConnectorException {
+ List<Expression> expressions = func.getParameters();
+ validateFunction(expressions);
+ Expression columnExpression = expressions.get(0);
+ Column column = ((ColumnReference)columnExpression).getMetadataObject();
+ StringBuffer criterion = new StringBuffer();
+ criterion.append(column.getNameInSource()).append(SPACE).append(funcName);
+ addFunctionParams((Literal)expressions.get(1), criterion);
+ criteriaList.add(criterion.toString());
+ }
+
+ private void appendMultiselectIn( Column column,
+ In criteria ) throws ConnectorException {
+ StringBuffer result = new StringBuffer();
+ result.append(column.getNameInSource()).append(SPACE);
+ if (criteria.isNegated()) {
+ result.append(EXCLUDES).append(SPACE);
+ } else {
+ result.append(INCLUDES).append(SPACE);
+ }
+ result.append('(');
+ List<Expression> rightExpressions = criteria.getRightExpressions();
+ Iterator<Expression> iter = rightExpressions.iterator();
+ boolean first = true;
+ while (iter.hasNext()) {
+ Expression rightExpression = iter.next();
+ if (first) {
+ result.append(rightExpression.toString());
+ first = false;
+ } else {
+ result.append(COMMA).append(rightExpression.toString());
+ }
+
+ }
+ result.append(')');
+ criteriaList.add(result.toString());
+ }
+
+ private void validateFunction( List<Expression> expressions ) throws ConnectorException {
+ if (expressions.size() != 2) {
+ throw new ConnectorException(Messages.getString("CriteriaVisitor.invalid.arg.count"));
+ }
+ if (!(expressions.get(0) instanceof ColumnReference)) {
+ throw new ConnectorException(Messages.getString("CriteriaVisitor.function.not.column.arg"));
+ }
+ if (!(expressions.get(1) instanceof Literal)) {
+ throw new ConnectorException(Messages.getString("CriteriaVisitor.function.not.literal.arg"));
+ }
+ }
+
+ private void addFunctionParams( Literal param,
+ StringBuffer criterion ) {
+ criterion.append(OPEN);
+ boolean first = true;
+ String fullParam = param.toString();
+ String[] params = fullParam.split(",");
+ for (int i = 0; i < params.length; i++) {
+ String token = params[i];
+ if (first) {
+ criterion.append(SPACE).append(Util.addSingleQuotes(token));
+ first = false;
+ } else {
+ criterion.append(COMMA).append(SPACE).append(Util.addSingleQuotes(token));
+ }
+ }
+ criterion.append(CLOSE);
+ }
+
+ protected void addCompareCriteria( List criteriaList,
+ Comparison compCriteria ) throws ConnectorException {
+ Expression lExpr = compCriteria.getLeftExpression();
+ if (lExpr instanceof Function) {
+ parseFunction((Function)lExpr);
+ } else {
+ ColumnReference left = (ColumnReference)lExpr;
+ Column column = left.getMetadataObject();
+ String columnName = column.getNameInSource();
+ StringBuffer queryString = new StringBuffer();
+ queryString.append(column.getParent().getNameInSource());
+ queryString.append('.');
+ queryString.append(columnName).append(SPACE);
+ queryString.append(comparisonOperators.get(compCriteria.getOperator()));
+ queryString.append(' ');
+ Expression rExp = compCriteria.getRightExpression();
+ if(rExp instanceof Literal) {
+ Literal literal = (Literal)rExp;
+ if (column.getJavaType().equals(Boolean.class)) {
+ queryString.append(((Boolean)literal.getValue()).toString());
+ } else if (column.getJavaType().equals(java.sql.Timestamp.class)) {
+ Timestamp datetime = (java.sql.Timestamp)literal.getValue();
+ String value = Util.getSalesforceDateTimeFormat().format(datetime);
+ String zoneValue = Util.getTimeZoneOffsetFormat().format(datetime);
+ queryString.append(value).append(zoneValue.subSequence(0, 3)).append(':').append(zoneValue.subSequence(3, 5));
+ } else if (column.getJavaType().equals(java.sql.Time.class)) {
+ String value = Util.getSalesforceDateTimeFormat().format((java.sql.Time)literal.getValue());
+ queryString.append(value);
+ } else if (column.getJavaType().equals(java.sql.Date.class)) {
+ String value = Util.getSalesforceDateFormat().format((java.sql.Date)literal.getValue());
+ queryString.append(value);
+ } else {
+ queryString.append(compCriteria.getRightExpression().toString());
+ }
+ } else if(rExp instanceof ColumnReference) {
+ ColumnReference right = (ColumnReference)lExpr;
+ column = left.getMetadataObject();
+ columnName = column.getNameInSource();
+ queryString.append(columnName);
+ }
+
+ criteriaList.add(queryString.toString());
+
+ if (columnName.equals("IsDeleted")) {
+ Literal isDeletedLiteral = (Literal)compCriteria.getRightExpression();
+ Boolean isDeleted = (Boolean)isDeletedLiteral.getValue();
+ if (isDeleted) {
+ this.queryAll = isDeleted;
+ }
+ }
+ }
+ }
+
+ private void appendCriteria( In criteria ) throws ConnectorException {
+ StringBuffer queryString = new StringBuffer();
+ Expression leftExp = criteria.getLeftExpression();
+ if(isIdColumn(leftExp)) {
+ idInCriteria = criteria;
+ }
+ queryString.append(getValue(leftExp));
+ queryString.append(' ');
+ if (criteria.isNegated()) {
+ queryString.append("NOT ");
+ }
+ queryString.append("IN");
+ queryString.append('(');
+ Column column = ((ColumnReference)criteria.getLeftExpression()).getMetadataObject();
+ boolean timeColumn = isTimeColumn(column);
+ boolean first = true;
+ Iterator iter = criteria.getRightExpressions().iterator();
+ while (iter.hasNext()) {
+ if (!first) queryString.append(',');
+ if (!timeColumn) queryString.append('\'');
+ queryString.append(getValue((Expression)iter.next()));
+ if (!timeColumn) queryString.append('\'');
+ first = false;
+ }
+ queryString.append(')');
+ criteriaList.add(queryString.toString());
+ }
+
+ private boolean isTimeColumn( Column column ) throws ConnectorException {
+ boolean result = false;
+ if (column.getJavaType().equals(java.sql.Timestamp.class) || column.getJavaType().equals(java.sql.Time.class)
+ || column.getJavaType().equals(java.sql.Date.class)) {
+ result = true;
+ }
+ return result;
+ }
+
+ protected String getValue( Expression expr ) throws ConnectorException {
+ String result;
+ if (expr instanceof ColumnReference) {
+ ColumnReference element = (ColumnReference)expr;
+ Column element2 = element.getMetadataObject();
+ result = element2.getNameInSource();
+ } else if (expr instanceof Literal) {
+ Literal literal = (Literal)expr;
+ result = literal.getValue().toString();
+ } else {
+ throw new RuntimeException("unknown type in SalesforceQueryExecution.getValue(): " + expr.toString());
+ }
+ return result;
+ }
+
+ protected void loadColumnMetadata( NamedTable group ) throws ConnectorException {
+ table = group.getMetadataObject();
+ String supportsQuery = table.getProperties().get("Supports Query");
+ if (!Boolean.valueOf(supportsQuery)) {
+ throw new ConnectorException(table.getNameInSource() + " "
+ + Messages.getString("CriteriaVisitor.query.not.supported"));
+ }
+ List<Column> columnIds = table.getColumns();
+ for (Column element : columnIds) {
+ String name = table.getName() + '.' + element.getNameInSource();
+ columnElementsByName.put(name, element);
+
+ // influences queryAll behavior
+ if (element.getNameInSource().equals("IsDeleted")) {
+ String isDeleted = element.getDefaultValue();
+ if (Boolean.parseBoolean(isDeleted)) {
+ this.queryAll = true;
+ }
+ }
+ }
+ }
+
+ protected boolean isIdColumn( Expression expression ) throws ConnectorException {
+ boolean result = false;
+ if (expression instanceof ColumnReference) {
+ Column element = ((ColumnReference)expression).getMetadataObject();
+ String nameInSource = element.getNameInSource();
+ if (nameInSource.equalsIgnoreCase("id")) {
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ protected boolean isMultiSelectColumn( Expression expression ) throws ConnectorException {
+ boolean result = false;
+ if (expression instanceof ColumnReference) {
+ Column element = ((ColumnReference)expression).getMetadataObject();
+ String nativeType = element.getNativeType();
+ if (MULTIPICKLIST.equalsIgnoreCase(nativeType) || RESTRICTEDMULTISELECTPICKLIST.equalsIgnoreCase(nativeType)) {
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ public boolean hasCriteria() {
+ return hasCriteria;
+ }
+
+ public void setHasCriteria( boolean hasCriteria,
+ boolean isIdCriteria ) {
+ if (isIdCriteria) {
+ if (hasCriteria()) {
+ this.onlyIDCriteria = false;
+ } else {
+ this.onlyIDCriteria = true;
+ }
+ } else if (this.onlyIDCriteria) {
+ this.onlyIDCriteria = false;
+ }
+ this.hasCriteria = hasCriteria;
+ }
+
+ public boolean hasOnlyIDCriteria() {
+ return this.onlyIDCriteria;
+ }
+
+ public String getTableName() throws ConnectorException {
+ return table.getNameInSource();
+ }
+
+ protected void addCriteriaString(StringBuffer result) {
+ if(hasCriteria()) {
+ result.append(WHERE).append(SPACE);
+ for (String string : criteriaList) {
+ result.append(string);
+ }
+ result.append(SPACE);
+ }
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/DeleteVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/DeleteVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/DeleteVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,65 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import java.util.Iterator;
+
+import org.teiid.connector.language.Delete;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+
+
+public class DeleteVisitor extends CriteriaVisitor implements IQueryProvidingVisitor {
+
+ public DeleteVisitor(RuntimeMetadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ public void visit(Delete delete) {
+ super.visit(delete);
+ try {
+ loadColumnMetadata(delete.getTable());
+ } catch (ConnectorException ce) {
+ exceptions.add(ce);
+ }
+ }
+
+ /*
+ * The SOQL SELECT command uses the following syntax: SELECT fieldList FROM
+ * objectType [WHERE The Condition Expression (WHERE Clause)] [ORDER BY]
+ * LIMIT ?
+ */
+
+ public String getQuery() throws ConnectorException {
+ if (!exceptions.isEmpty()) {
+ throw exceptions.get(0);
+ }
+ StringBuffer result = new StringBuffer();
+ result.append(SELECT).append(SPACE);
+ result.append("Id").append(SPACE);
+ result.append(FROM).append(SPACE);
+ result.append(table.getNameInSource()).append(SPACE);
+ addCriteriaString(result);
+ return result.toString();
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/ICriteriaVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/ICriteriaVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/ICriteriaVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,36 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import org.teiid.resource.ConnectorException;
+
+public interface ICriteriaVisitor {
+
+ public boolean hasCriteria();
+
+ public void setHasCriteria(boolean hasCriteria, boolean isIdCriteria);
+
+ public boolean hasOnlyIDCriteria();
+
+ public String getTableName() throws ConnectorException;
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/IQueryProvidingVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/IQueryProvidingVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/IQueryProvidingVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,30 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import org.teiid.resource.ConnectorException;
+
+public interface IQueryProvidingVisitor extends ICriteriaVisitor {
+
+ public String getQuery() throws ConnectorException;
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/InsertVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/InsertVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/InsertVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,101 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.namespace.QName;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Insert;
+import org.teiid.connector.language.ExpressionValueSource;
+import org.teiid.connector.language.Literal;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+
+
+public class InsertVisitor extends CriteriaVisitor {
+
+ @SuppressWarnings("unchecked")
+ List<JAXBElement> elements = new ArrayList<JAXBElement>();
+
+ private static Class<?> stringClazz = new String().getClass();
+
+ public InsertVisitor(RuntimeMetadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ public void visit(Insert insert) {
+ super.visit(insert);
+ try {
+ loadColumnMetadata(insert.getTable());
+
+ List<ColumnReference> columns = insert.getColumns();
+ List<Expression> values = ((ExpressionValueSource)insert.getValueSource()).getValues();
+ if(columns.size() != values.size()) {
+ throw new ConnectorException("Error: columns.size and values.size are not the same.");
+ }
+
+ for(int i = 0; i < columns.size(); i++) {
+ ColumnReference element = columns.get(i);
+ Column column = element.getMetadataObject();
+ Object value = values.get(i);
+ String val;
+ if(value instanceof Literal) {
+ Literal literalValue = (Literal)value;
+ val = literalValue.getValue().toString();
+ if(null != val && !val.isEmpty()) {
+ val = this.stripQutes(val);
+ }
+ } else {
+ val = value.toString();
+ }
+ QName qname = new QName(column.getNameInSource());
+ @SuppressWarnings( "unchecked" )
+ JAXBElement jbe = new JAXBElement( qname, stringClazz, val );
+ elements.add(jbe);
+ }
+
+ } catch (ConnectorException ce) {
+ exceptions.add(ce);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<JAXBElement> getMessageElements() {
+ return elements;
+ }
+
+ private String stripQutes(String id) {
+ if((id.startsWith("'") && id.endsWith("'"))) {
+ id = id.substring(1,id.length()-1);
+ } else if ((id.startsWith("\"") && id.endsWith("\""))) {
+ id = id.substring(1,id.length()-1);
+ }
+ return id;
+ }
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/JoinQueryVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/JoinQueryVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/JoinQueryVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,165 @@
+package org.teiid.resource.adapter.salesforce.execution.visitors;
+
+import org.teiid.connector.language.AggregateFunction;
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Comparison;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Join;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.TableReference;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.Util;
+
+
+/**
+ * Salesforce supports joins only on primary key/foreign key relationships. The connector
+ * is supporting these joins through the OUTER JOIN syntax. All RIGHT OUTER JOINS are
+ * rewritten by the query processor as LEFT OUTER JOINS, so that is all this visitor has
+ * to expect.
+ *
+ * Salesforce also requires a different syntax depending upon if you are joining from parent
+ * to child, or from child to parent.
+ * http://www.salesforce.com/us/developer/docs/api/index_Left.htm#StartTopic=Content/sforce_api_calls_soql_relationships.htm
+ *
+ */
+
+public class JoinQueryVisitor extends SelectVisitor {
+
+ private Table leftTableInJoin;
+ private Table rightTableInJoin;
+ private Table childTable;
+
+ public JoinQueryVisitor(RuntimeMetadata metadata) {
+ super(metadata);
+ }
+
+ // Has to be a left outer join
+ @Override
+ public void visit(Join join) {
+ try {
+ TableReference left = join.getLeftItem();
+ if (left instanceof NamedTable) {
+ NamedTable leftGroup = (NamedTable) left;
+ leftTableInJoin = leftGroup.getMetadataObject();
+ loadColumnMetadata(leftGroup);
+ }
+
+ TableReference right = join.getRightItem();
+ if (right instanceof NamedTable) {
+ NamedTable rightGroup = (NamedTable) right;
+ rightTableInJoin = rightGroup.getMetadataObject();
+ loadColumnMetadata((NamedTable) right);
+ }
+ super.visit(join);
+ } catch (ConnectorException ce) {
+ exceptions.add(ce);
+ }
+
+ }
+
+ @Override
+ public void visit(Comparison criteria) {
+
+ // Find the criteria that joins the two tables
+ try {
+ Expression rExp = criteria.getRightExpression();
+ if (rExp instanceof ColumnReference) {
+ Expression lExp = criteria.getLeftExpression();
+ if (isIdColumn(rExp) || isIdColumn(lExp)) {
+
+ Column rColumn = ((ColumnReference) rExp).getMetadataObject();
+ String rTableName = rColumn.getParent().getNameInSource();
+
+ Column lColumn = ((ColumnReference) lExp).getMetadataObject();
+ String lTableName = lColumn.getParent().getNameInSource();
+
+ if (leftTableInJoin.getNameInSource().equals(rTableName)
+ || leftTableInJoin.getNameInSource().equals(lTableName)
+ && rightTableInJoin.getNameInSource().equals(rTableName)
+ || rightTableInJoin.getNameInSource().equals(lTableName)
+ && !rTableName.equals(lTableName)) {
+ // This is the join criteria, the one that is the ID is the parent.
+ Expression fKey = !isIdColumn(lExp) ? lExp : rExp;
+ table = childTable = (Table)((ColumnReference) fKey).getMetadataObject().getParent();
+ } else {
+ // Only add the criteria to the query if it is not the join criteria.
+ // The join criteria is implicit in the salesforce syntax.
+ super.visit(criteria);
+ }
+ }
+ } else {
+ super.visit(criteria);
+ }
+ } catch (ConnectorException e) {
+ exceptions.add(e);
+ }
+ }
+
+ @Override
+ public String getQuery() throws ConnectorException {
+
+ if (isParentToChildJoin()) {
+ return super.getQuery();
+ }
+ if (!exceptions.isEmpty()) {
+ throw exceptions.get(0);
+ }
+ StringBuffer select = new StringBuffer();
+ select.append(SELECT).append(SPACE);
+ addSelectSymbols(leftTableInJoin.getNameInSource(), select);
+ select.append(COMMA).append(SPACE).append(OPEN);
+
+ StringBuffer subselect = new StringBuffer();
+ subselect.append(SELECT).append(SPACE);
+ addSelectSymbols(rightTableInJoin.getNameInSource(), subselect);
+ subselect.append(SPACE);
+ subselect.append(FROM).append(SPACE);
+ subselect.append(rightTableInJoin.getNameInSource()).append('s');
+ subselect.append(CLOSE).append(SPACE);
+ select.append(subselect);
+ select.append(FROM).append(SPACE);
+ select.append(leftTableInJoin.getNameInSource()).append(SPACE);
+ addCriteriaString(select);
+ select.append(limitClause);
+ Util.validateQueryLength(select);
+ return select.toString();
+ }
+
+ public boolean isParentToChildJoin() {
+ return childTable.equals(leftTableInJoin);
+ }
+
+ protected void addSelectSymbols(String tableNameInSource, StringBuffer result) throws ConnectorException {
+ boolean firstTime = true;
+ for (DerivedColumn symbol : selectSymbols) {
+ Expression expression = symbol.getExpression();
+ if (expression instanceof ColumnReference) {
+ Column element = ((ColumnReference) expression).getMetadataObject();
+ String tableName = element.getParent().getNameInSource();
+ if(!isParentToChildJoin() && tableNameInSource.equals(tableName) ||
+ isParentToChildJoin()) {
+ if (!firstTime) {
+ result.append(", ");
+ } else {
+ firstTime = false;
+ }
+ result.append(tableName);
+ result.append('.');
+ result.append(element.getNameInSource());
+ }
+ } else if (expression instanceof AggregateFunction) {
+ if (!firstTime) {
+ result.append(", ");
+ } else {
+ firstTime = false;
+ }
+ result.append("count()"); //$NON-NLS-1$
+ }
+ }
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/SelectVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/SelectVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,235 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.language.AggregateFunction;
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.Expression;
+import org.teiid.connector.language.Limit;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.salesforce.Constants;
+import org.teiid.resource.adapter.salesforce.Messages;
+import org.teiid.resource.adapter.salesforce.Util;
+
+
+public class SelectVisitor extends CriteriaVisitor implements IQueryProvidingVisitor {
+
+ private Map<Integer, Column> selectSymbolIndexToElement = new HashMap<Integer, Column>();
+ private Map<String, Integer> selectSymbolNameToIndex = new HashMap<String, Integer>();
+ private int selectSymbolCount;
+ private int idIndex = -1; // index of the ID select symbol.
+ protected List<DerivedColumn> selectSymbols;
+ protected StringBuffer limitClause = new StringBuffer();
+ private Boolean objectSupportsRetrieve;
+
+ public SelectVisitor(RuntimeMetadata metadata) {
+ super(metadata);
+ }
+
+ public void visit(Select query) {
+ super.visit(query);
+ if (query.isDistinct()) {
+ exceptions.add(new ConnectorException(
+ Messages.getString("SelectVisitor.distinct.not.supported")));
+ }
+ selectSymbols = query.getDerivedColumns();
+ selectSymbolCount = selectSymbols.size();
+ Iterator<DerivedColumn> symbolIter = selectSymbols.iterator();
+ int index = 0;
+ while (symbolIter.hasNext()) {
+ DerivedColumn symbol = symbolIter.next();
+ // get the name in source
+ Expression expression = symbol.getExpression();
+ if (expression instanceof ColumnReference) {
+ Column element = ((ColumnReference) expression).getMetadataObject();
+ selectSymbolIndexToElement.put(index, element);
+ selectSymbolNameToIndex .put(element.getNameInSource(), index);
+ String nameInSource = element.getNameInSource();
+ if (null == nameInSource || nameInSource.length() == 0) {
+ exceptions.add(new ConnectorException(
+ "name in source is null or empty for column "
+ + symbol.toString()));
+ continue;
+ }
+ if (nameInSource.equalsIgnoreCase("id")) {
+ idIndex = index;
+ }
+ }
+ ++index;
+ }
+ }
+
+ @Override
+ public void visit(NamedTable obj) {
+ try {
+ table = obj.getMetadataObject();
+ String supportsQuery = table.getProperties().get(Constants.SUPPORTS_QUERY);
+ objectSupportsRetrieve = Boolean.valueOf(table.getProperties().get(Constants.SUPPORTS_RETRIEVE));
+ if (!Boolean.valueOf(supportsQuery)) {
+ throw new ConnectorException(table.getNameInSource() + " "
+ + Messages.getString("CriteriaVisitor.query.not.supported"));
+ }
+ loadColumnMetadata(obj);
+ } catch (ConnectorException ce) {
+ exceptions.add(ce);
+ }
+ }
+
+ @Override
+ public void visit(Limit obj) {
+ super.visit(obj);
+ limitClause.append(LIMIT).append(SPACE).append(obj.getRowLimit());
+ }
+
+ /*
+ * The SOQL SELECT command uses the following syntax: SELECT fieldList FROM
+ * objectType [WHERE The Condition Expression (WHERE Clause)] [ORDER BY]
+ * LIMIT ?
+ */
+
+ public String getQuery() throws ConnectorException {
+ if (!exceptions.isEmpty()) {
+ throw ((ConnectorException) exceptions.get(0));
+ }
+ StringBuffer result = new StringBuffer();
+ result.append(SELECT).append(SPACE);
+ addSelectSymbols(table.getNameInSource(), result);
+ result.append(SPACE);
+ result.append(FROM).append(SPACE);
+ result.append(table.getNameInSource()).append(SPACE);
+ addCriteriaString(result);
+ //result.append(orderByClause).append(SPACE);
+ result.append(limitClause);
+ Util.validateQueryLength(result);
+ return result.toString();
+ }
+
+ protected void addSelectSymbols(String tableNameInSource, StringBuffer result) throws ConnectorException {
+ boolean firstTime = true;
+ for (DerivedColumn symbol : selectSymbols) {
+ if (!firstTime) {
+ result.append(", ");
+ } else {
+ firstTime = false;
+ }
+ Expression expression = symbol.getExpression();
+ if (expression instanceof ColumnReference) {
+ Column element = ((ColumnReference) expression).getMetadataObject();
+ AbstractMetadataRecord parent = element.getParent();
+ Table table;
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ parent = parent.getParent();
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ throw new ConnectorException("Could not resolve Table for column " + element.getName());
+ }
+ }
+ result.append(table.getNameInSource());
+ result.append('.');
+ result.append(element.getNameInSource());
+ } else if (expression instanceof AggregateFunction) {
+ result.append("count()"); //$NON-NLS-1$
+ }
+ }
+ }
+
+
+ public int getSelectSymbolCount() {
+ return selectSymbolCount;
+ }
+
+ public Column getSelectSymbolMetadata(int index) {
+ return selectSymbolIndexToElement.get(index);
+ }
+
+ public Column getSelectSymbolMetadata(String name) {
+ Column result = null;
+ Integer index = selectSymbolNameToIndex.get(name);
+ if(null != index) {
+ result = selectSymbolIndexToElement.get(index);
+ }
+ return result;
+ }
+
+ /**
+ * Returns the index of the ID column.
+ * @return the index of the ID column, -1 if there is no ID column.
+ */
+ public int getIdIndex() {
+ return idIndex;
+ }
+
+
+ public Boolean getQueryAll() {
+ return queryAll;
+ }
+
+
+ public String getRetrieveFieldList() throws ConnectorException {
+ assertRetrieveValidated();
+ StringBuffer result = new StringBuffer();
+ addSelectSymbols(table.getNameInSource(), result);
+ return result.toString();
+ }
+
+
+ public List<String> getIdInCriteria() throws ConnectorException {
+ assertRetrieveValidated();
+ List<Expression> expressions = this.idInCriteria.getRightExpressions();
+ List<String> result = new ArrayList<String>(expressions.size());
+ for(int i = 0; i < expressions.size(); i++) {
+ result.add(getValue(expressions.get(i)));
+ }
+ return result;
+ }
+
+ private void assertRetrieveValidated() throws AssertionError {
+ if(!hasOnlyIDCriteria()) {
+ throw new AssertionError("Must call hasOnlyIdInCriteria() before this method");
+ }
+ }
+
+ public boolean hasOnlyIdInCriteria() {
+ return hasOnlyIDCriteria() && idInCriteria != null;
+ }
+
+ public boolean canRetrieve() {
+ return objectSupportsRetrieve && hasOnlyIDCriteria();
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/UpdateVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/UpdateVisitor.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/resource/adapter/salesforce/execution/visitors/UpdateVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,66 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import org.teiid.connector.language.Update;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+
+
+public class UpdateVisitor extends CriteriaVisitor implements IQueryProvidingVisitor {
+
+ public UpdateVisitor(RuntimeMetadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ public void visit(Update update) {
+ // don't visit the changes or they will be in the query.
+ visitNode(update.getTable());
+ visitNode(update.getWhere());
+ try {
+ loadColumnMetadata(update.getTable());
+ } catch (ConnectorException ce) {
+ exceptions.add(ce);
+ }
+ }
+
+ /*
+ * The SOQL SELECT command uses the following syntax: SELECT fieldList FROM
+ * objectType [WHERE The Condition Expression (WHERE Clause)] [ORDER BY]
+ * LIMIT ?
+ */
+
+ public String getQuery() throws ConnectorException {
+ if (!exceptions.isEmpty()) {
+ throw ((ConnectorException) exceptions.get(0));
+ }
+ StringBuffer result = new StringBuffer();
+ result.append(SELECT).append(SPACE);
+ result.append("Id").append(SPACE);
+ result.append(FROM).append(SPACE);
+ result.append(table.getNameInSource()).append(SPACE);
+ addCriteriaString(result);
+ return result.toString();
+ }
+
+}
Added: trunk/connectors/translator-salesforce/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/translator-salesforce/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.salesforce.SalesForceExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Property changes on: trunk/connectors/translator-salesforce/src/main/resources/META-INF/jboss-beans.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/salesforce/i18n.properties
===================================================================
--- trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/salesforce/i18n.properties (rev 0)
+++ trunk/connectors/translator-salesforce/src/main/resources/org/teiid/resource/adapter/salesforce/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,48 @@
+#
+# 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.
+#
+SalesforceConnection.update.not.supported=Update Execution is not supported.
+SalesforceConnection.procedures.not.supported=Procedure Execution is not supported.
+SalesforceConnection.invalid.execution.mode=Execution mode not supported.
+SalesforceConnection.bad.IN.value=Exception parsing the IN Criteria Limit value.
+SalesforceConnection.bad.ping.value=Exception parsing the Data Source Test Connect Interval value.
+
+SalesforceSourceConnectionFactory.Invalid.username.password.pair=Invalid credential configuration. The Username and Password binding properties must both be empty or both have values.
+
+SalesforceQueryExecutionImpl.cancel=SynchQueryExecution.cancel() called
+SalesforceQueryExecutionImpl.close=SynchQueryExecution.close() called
+SalesforceQueryExecutionImpl.missing.field=No field in result for SelectSymbol
+SalesforceQueryExecutionImpl.column.mismatch1=Error: Column mismatch, expected
+SalesforceQueryExecutionImpl.column.mismatch2= received
+SalesforceQueryExecutionImpl.datatime.parse=Error parsing date_time: Value =
+SalesforceQueryExecutionImpl.reduced.batch.size=Reduced batch size to 2000
+
+SelectVisitor.distinct.not.supported=Distinct is not supported by the connector.
+
+CriteriaVisitor.query.not.supported= does not support the query statement.
+CriteriaVisitor.invalid.arg.count=The includes and excludes functions require two parameters.
+CriteriaVisitor.function.not.column.arg=The first parameter of the includes and excludes functions must be a column name.
+CriteriaVisitor.function.not.literal.arg=The second parameter of the includes and excludes functions must be a literal value.
+CriteriaVisitor.IN.not.supported.on.col=The IN criteria is not supported on multi-select columns:
+CriteriaVisitor.LIKE.not.supported.on.Id=LIKE criteria are not allowed on columns of native type Id
+CriteriaVisitor.LIKE.not.supported.on.multiselect=LIKE criteria are not allowed on columns of native type Multi-Select Picklist
+
+Util.query.exceeds.max.length=Queries cannot exceed 10,000 characters
\ No newline at end of file
Added: trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/visitors/TestVisitors.java
===================================================================
--- trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/visitors/TestVisitors.java (rev 0)
+++ trunk/connectors/translator-salesforce/src/test/java/org/teiid/resource/adapter/salesforce/execution/visitors/TestVisitors.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,166 @@
+/*
+ * 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.resource.adapter.salesforce.execution.visitors;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.MetadataStore;
+import org.teiid.connector.metadata.runtime.Schema;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.metadata.runtime.Column.SearchType;
+import org.teiid.metadata.CompositeMetadataStore;
+import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.adapter.salesforce.execution.visitors.JoinQueryVisitor;
+import org.teiid.resource.adapter.salesforce.execution.visitors.SelectVisitor;
+
+import com.metamatrix.cdk.api.TranslationUtility;
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.query.metadata.QueryMetadataInterface;
+import com.metamatrix.query.unittest.RealMetadataFactory;
+
+public class TestVisitors {
+
+ public static QueryMetadataInterface exampleSalesforce() {
+ MetadataStore store = new MetadataStore();
+ // Create models
+ Schema salesforceModel = RealMetadataFactory.createPhysicalModel("SalesforceModel", store); //$NON-NLS-1$
+
+ // Create Account group
+ Table accounTable = RealMetadataFactory.createPhysicalGroup("Account", salesforceModel); //$NON-NLS-1$
+ accounTable.setNameInSource("Account"); //$NON-NLS-1$
+ accounTable.setProperty("Supports Query", Boolean.TRUE.toString()); //$NON-NLS-1$
+ // Create Account Columns
+ String[] acctNames = new String[] {
+ "ID", "Name", "Stuff", "Industry" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ };
+ String[] acctTypes = new String[] {
+ DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
+ };
+
+ List<Column> acctCols = RealMetadataFactory.createElements(accounTable, acctNames, acctTypes);
+ acctCols.get(2).setNativeType("multipicklist"); //$NON-NLS-1$
+ acctCols.get(2).setSearchType(SearchType.Like_Only);
+ // Set name in source on each column
+ String[] accountNameInSource = new String[] {
+ "id", "AccountName", "Stuff", "Industry" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ };
+ for(int i=0; i<2; i++) {
+ Column obj = acctCols.get(i);
+ obj.setNameInSource(accountNameInSource[i]);
+ }
+
+ // Create Contact group
+ Table contactTable = RealMetadataFactory.createPhysicalGroup("Contact", salesforceModel); //$NON-NLS-1$
+ contactTable.setNameInSource("Contact"); //$NON-NLS-1$
+ contactTable.setProperty("Supports Query", Boolean.TRUE.toString()); //$NON-NLS-1$
+ // Create Contact Columns
+ String[] elemNames = new String[] {
+ "ContactID", "Name", "AccountId" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ };
+ String[] elemTypes = new String[] {
+ DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING
+ };
+
+ List<Column> contactCols = RealMetadataFactory.createElements(contactTable, elemNames, elemTypes);
+ // Set name in source on each column
+ String[] contactNameInSource = new String[] {
+ "id", "ContactName", "accountid" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ };
+ for(int i=0; i<2; i++) {
+ Column obj = contactCols.get(i);
+ obj.setNameInSource(contactNameInSource[i]);
+ }
+ return new TransformationMetadata(null, new CompositeMetadataStore(store), null, null);
+ }
+
+ private static TranslationUtility translationUtility = new TranslationUtility(exampleSalesforce());
+
+ @Test public void testOr() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("select * from Account where Name = 'foo' or Stuff = 'bar'"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (Account.AccountName = 'foo') OR (Account.Stuff = 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+ @Test public void testNot() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("select * from Account where not (Name = 'foo' and Stuff = 'bar')"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (Account.AccountName != 'foo') OR (Account.Stuff != 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+ @Test public void testCountStart() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("select count(*) from Account"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT count() FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+ @Test public void testNotLike() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("select * from Account where Name not like '%foo' or Stuff = 'bar'"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE (NOT (Account.AccountName LIKE '%foo')) OR (Account.Stuff = 'bar')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+
+ @Test public void testIN() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("select * from Account where Industry IN (1,2,3)"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertFalse(visitor.hasOnlyIDCriteria());
+ assertEquals("SELECT Account.id, Account.AccountName, Account.Stuff, Account.Industry FROM Account WHERE Industry IN('1','2','3')", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+
+ }
+
+ @Test public void testOnlyIDsIN() throws Exception {
+ // this can resolve to a better performing retrieve call
+ Select command = (Select)translationUtility.parseCommand("select * from Account where ID IN (1,2,3)"); //$NON-NLS-1$
+ SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertTrue(visitor.hasOnlyIdInCriteria());
+ assertEquals("Account", visitor.getTableName());
+ assertEquals("Account.id, Account.AccountName, Account.Stuff, Account.Industry", visitor.getRetrieveFieldList());
+ assertEquals(Arrays.asList(new String[]{"1", "2", "3"}), visitor.getIdInCriteria());
+ }
+
+ @Test public void testJoin() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("SELECT Account.Name, Contact.Name FROM Contact LEFT OUTER JOIN Account ON Account.Id = Contact.AccountId"); //$NON-NLS-1$
+ SelectVisitor visitor = new JoinQueryVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT Account.AccountName, Contact.ContactName FROM Contact", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+ @Test public void testJoin2() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("SELECT Account.Name, Contact.Name FROM Account LEFT OUTER JOIN Contact ON Account.Id = Contact.AccountId"); //$NON-NLS-1$
+ SelectVisitor visitor = new JoinQueryVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT Account.AccountName, (SELECT Contact.ContactName FROM Contacts) FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
+}
Property changes on: trunk/connectors/translator-text
___________________________________________________________________
Name: svn:ignore
+ target
.project
.settings
.classpath
Added: trunk/connectors/translator-text/pom.xml
===================================================================
--- trunk/connectors/translator-text/pom.xml (rev 0)
+++ trunk/connectors/translator-text/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <parent>
+ <artifactId>connectors</artifactId>
+ <groupId>org.jboss.teiid</groupId>
+ <version>7.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>translator-text</artifactId>
+ <groupId>org.jboss.teiid.connectors</groupId>
+ <name>Text Translator</name>
+ <description>This translator converts the text file data into relational tables</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.teiid</groupId>
+ <artifactId>teiid-common-core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <outputDirectory>target/classes</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.xml</include>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ <exclude>**/*.properties</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/StringToDateTranslator.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/StringToDateTranslator.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/StringToDateTranslator.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,231 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
+
+/**
+ * <p>This is a helper class for TextTranslators that can be used to translate
+ * any String that is a representation of a date to a java.util.Date object.
+ * This class is created by passing it a properties object that contains at least
+ * one property. The value of this property is a String that can be a delimited list of
+ * date format Strings. Date format Strings can be any format String that a
+ * java.text.SimpleDateFormat can be created with. There is also an optional
+ * property that defines the delimiter for the list of Date format Strings.
+ * If this property is not specified then the entire String value of the DateFormatStrings
+ * property will be used as the only format that this class can translate.</p>
+ *
+ * <p>After this class is created it can the be used to translate Strings into
+ * java.util.Date object using the translateStringToDate(String) method.</p>
+ */
+public class StringToDateTranslator {
+
+ TextExecutionFactory config;
+
+ /**
+ * The SimpleDateFormat objects that are used to translate dates for this
+ * connector.
+ */
+ private List simpleDateFormats;
+
+ /**
+ * The List of date format Strings that define the patterns of the Strings
+ * that this translator can translate.
+ */
+ private List dateFormatStrings;
+
+ /**
+ * This boolean determines whether this instance has any DateFormatters
+ * to translate Strings with. It is cached for performance reasons.
+ */
+ private boolean hasFormatters=false;
+
+ /**
+ * <p>This class is created by passing it a properties object that contains at least
+ * one property. The value of this property is a String that can be a delimited list of
+ * date format Strings. Date format Strings can be any format String that a
+ * java.text.SimpleDateFormat can be created with. There is also an optional
+ * property that defines the delimiter for the list of Date format Strings.
+ * If this property is not specified then the entire String value of the DateFormatStrings
+ * property will be used as the only format that this class can translate.</p>
+ *
+ * <p>Note that the order of the list of date format strings is important
+ * because the translator attempts to translate the String passed to it in the
+ * order of the date format Strings in the delimited property value.</p>
+ *
+ * <p>After this class is created it can the be used to translate Strings into
+ * java.util.Date object using the translateStringToDate(String) method.</p>
+ *
+ * <pre>
+ * The properties that are required in construction of this class are as
+ * follows:
+ *
+ * PropertyName: TextPropertyNames.DATE_RESULT_FORMATS
+ * PropertyValue: Delimited list of date format Strings: ie MM/dd/yy' 'hh:mm:ss
+ *
+ * PropertyName: TextPropertyNames.DATE_RESULT_FORMATS_DELIMITER
+ * PropertyValue: Delimiter for value of TextPropertyNames.DATE_RESULT_FORMATS
+ * </pre>
+ */
+ public StringToDateTranslator(TextExecutionFactory config) {
+ this.config = config;
+
+ String dateFormats = config.getDateResultFormats();
+ String dateFormatsDelimiter = config.getDateResultFormatsDelimiter();
+
+ if (!(dateFormatsDelimiter == null || dateFormatsDelimiter.trim().length() == 0)) {
+ if (!(dateFormats == null || dateFormats.trim().length() == 0)) {
+ createSimpleDateFormats(dateFormats, dateFormatsDelimiter);
+ }
+ } else if (!(dateFormats == null || dateFormats.trim().length() == 0)) {
+ createSimpleDateFormat(dateFormats);
+ }
+
+ if (simpleDateFormats != null && simpleDateFormats.size() > 0) {
+ hasFormatters = true;
+ }
+ }
+
+ /**
+ * This method is used to translate String representations of dates into
+ * java.util.Date objects using a set of formats passed into this class at
+ * creation time. Has formatters should always be called on this class
+ * prior to the use of this method to determine whether or not there are any
+ * formatters this class can use to translate the String value passed in.
+ * If there are no formatters and this method is called, it will throw
+ * a parse Exception.
+ *
+ * @param string the String to be parsed into a java.util.Date
+ * @return the java.util.Date representation of the passed in String
+ * @throws ParseException if the String passed in could not be parsed
+ */
+ public java.util.Date translateStringToDate(String string) throws ParseException{
+ List parseExceptionList = new ArrayList();
+ Iterator iterator = simpleDateFormats.iterator();
+
+ while (iterator.hasNext()) {
+ SimpleDateFormat formatter = (SimpleDateFormat)iterator.next();
+ try {
+ java.util.Date date = formatter.parse(string);
+ return date;
+ }catch(ParseException e) {
+ parseExceptionList.add(e);
+ // Do nothing here will try again with the next formatter
+ }
+ }
+
+ // if we have reached this point without returning a Date, we
+ // have been unsuccessful in parsing: throw an exception
+
+ // This should always be the case, but just for safety:
+ if (dateFormatStrings.size() == parseExceptionList.size()) {
+ StringBuffer message = new StringBuffer();
+ int counter = 0;
+ Object[] params = new Object[] { string };
+ message.append(TextPlugin.Util.getString("StringToDateTranslator.Attempts_to_parse_String__{0}_to_a_java.util.Date_failed_for_the_following_reasons___1", params)); //$NON-NLS-1$
+
+ if (!hasFormatters()) {
+ message.append(TextPlugin.Util.getString("StringToDateTranslator.There_is_no_format_Strings_found_in_this_formatter_object._n_2", params)); //$NON-NLS-1$
+ }
+
+ Iterator exceptionsIterator = parseExceptionList.iterator();
+ Iterator formatStringsIterator = dateFormatStrings.iterator();
+ while (exceptionsIterator.hasNext()) {
+ String format = (String)formatStringsIterator.next();
+ String exceptionMessage = ((ParseException)exceptionsIterator.next()).getMessage();
+ Object[] params2 = new Object[] { ""+counter, format, exceptionMessage }; //$NON-NLS-1$
+ message.append(TextPlugin.Util.getString("StringToDateTranslator.Parse_Attempt__{0}_using_format__{1}_failed_for_the_following_reason__{2}_4", params2)); //$NON-NLS-1$
+ counter++;
+ }
+
+ throw new ParseException(message.toString(),0);
+ }
+ Object params3 = new Object[] { string, dateFormatStrings };
+ throw new ParseException(TextPlugin.Util.getString("StringToDateTranslator.Failed_to_convert_String__{0}_to_a_Date_using_one_of_the_following_format_Strings_that_are_specified_in_the_properties_for_this_Connector__{1}_1", params3), 0); //$NON-NLS-1$
+ }
+
+ /**
+ * This method is used to check the status of this translator object.
+ * It will return true if this translator has any 'formatters' to do parsing
+ * of Strings in the translateStringToDate() method. This method should
+ * always be called prior to using the translateStringToDate() method.
+ * If there are no formatters for the instance of this class, all calls to
+ * the translateStringToDate() method will throw a ParseException.
+ *
+ * @return true if this class has formatters to parse Strings to Dates
+ */
+ public boolean hasFormatters() {
+ return hasFormatters;
+ }
+
+ /**
+ * This method is a helper method that will instantiate the formatters that
+ * this object uses to translate Strings into Dates.
+ *
+ * @param dateFormats the delimited String of date format templates to
+ * be used to create the date formatters for this object.
+ * @param dateFormatsDelimiter the delimiter used to delimit the dateFormats
+ * String that is also passed into this method.
+ */
+ private void createSimpleDateFormats(String dateFormats, String dateFormatsDelimiter) {
+ simpleDateFormats = new ArrayList();
+ dateFormatStrings = new ArrayList();
+ StringTokenizer tokenizer = new StringTokenizer(dateFormats, dateFormatsDelimiter);
+
+ while (tokenizer.hasMoreTokens()) {
+ String token = tokenizer.nextToken();
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Creating simple Date format for formatting String: " +token); //$NON-NLS-1$
+
+ dateFormatStrings.add(token);
+ SimpleDateFormat formatter = new SimpleDateFormat(token.trim());
+ simpleDateFormats.add(formatter);
+ }
+ }
+
+ /**
+ * This method is as helper method that will create a single date formatter
+ * from the date format template String that is passed into it.
+ *
+ * @param dateFormats the String that is the template for translating
+ * Strings into java.util.Date objects
+ */
+ private void createSimpleDateFormat(String dateFormats) {
+ simpleDateFormats = new ArrayList();
+ dateFormatStrings = new ArrayList();
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Creating simple Date format for formatting String: " +dateFormats); //$NON-NLS-1$
+
+ SimpleDateFormat formatter = new SimpleDateFormat(dateFormats);
+ dateFormatStrings.add(dateFormats);
+ simpleDateFormats.add(formatter);
+ }
+
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextCapabilities.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextCapabilities.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,31 @@
+/*
+ * 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.resource.adapter.text;
+
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+
+public class TextCapabilities extends BasicConnectorCapabilities {
+
+ static TextCapabilities INSTANCE = new TextCapabilities();
+
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextConnection.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextConnection.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextConnection.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,35 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.util.Map;
+import java.util.Properties;
+
+import javax.resource.cci.Connection;
+
+import org.teiid.resource.ConnectorException;
+
+public interface TextConnection extends Connection {
+ Map<String, Properties> getMetadataProperties();
+ String getNextLine(String tableName)throws ConnectorException;
+ String getHeaderLine(String tableName)throws ConnectorException;
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextDescriptorPropertyNames.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextDescriptorPropertyNames.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextDescriptorPropertyNames.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,44 @@
+/*
+ * 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.resource.adapter.text;
+
+/**
+ * Property names used in the text descriptor file.
+ */
+public class TextDescriptorPropertyNames {
+ public static final String LOCATION = "LOCATION"; //$NON-NLS-1$
+ public static final String FILE_LOCATION = "FILE"; //$NON-NLS-1$
+ public static final String URL_LOCATION = "URL"; //$NON-NLS-1$
+ public static final String DELIMITER = "DELIMITER"; //$NON-NLS-1$
+ public static final String QUALIFIER = "QUALIFIER"; //$NON-NLS-1$
+ public static final String HEADER_LINES = "SKIPHEADERLINES"; //$NON-NLS-1$
+ public static final String COLUMNS = "COLUMNS"; //$NON-NLS-1$
+ public static final String TYPES = "TYPES"; //$NON-NLS-1$
+
+ /**
+ * If HEADER_LINES is non-zero this property defines which row of HEADER_LINES
+ * can be used as the header row. The value is 1-based and must be < HEADER_LINES.
+ * @since 5.0.3
+ */
+ public static final String HEADER_ROW = "HEADERLINE"; //$NON-NLS-1$
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextExecutionFactory.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextExecutionFactory.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextExecutionFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,134 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.util.Map;
+import java.util.Properties;
+
+import javax.resource.ResourceException;
+import javax.resource.cci.ConnectionFactory;
+
+import org.teiid.connector.language.QueryExpression;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.MetadataProvider;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TranslatorProperty;
+import org.teiid.resource.cci.TypeFacility;
+
+
+/**
+ * Implementation of text connector.
+ */
+public class TextExecutionFactory extends BasicExecutionFactory implements MetadataProvider{
+
+ private boolean enforceColumnCount = false;
+ private String dateResultFormatsDelimiter;
+ private String dateResultFormats;
+
+ @Override
+ public void start() throws ConnectorException {
+ super.start();
+ }
+
+ @TranslatorProperty(name="EnforceColumnCount", display="Enforce Column Count",description="This forces the number of columns in text file to match what was modeled", defaultValue="false")
+ public boolean isEnforceColumnCount() {
+ return enforceColumnCount;
+ }
+
+ public void setEnforceColumnCount(Boolean enforceColumnCount) {
+ this.enforceColumnCount = enforceColumnCount.booleanValue();
+ }
+
+ @TranslatorProperty(name="DateResultFormatsDelimiter", display="Date Result Formats Delimiter", advanced=true)
+ public String getDateResultFormatsDelimiter() {
+ return dateResultFormatsDelimiter;
+ }
+
+ public void setDateResultFormatsDelimiter(String dateResultFormatsDelimiter) {
+ this.dateResultFormatsDelimiter = dateResultFormatsDelimiter;
+ }
+
+ @TranslatorProperty(name="DateResultFormats", display="Date Result Formats",advanced=true)
+ public String getDateResultFormats() {
+ return dateResultFormats;
+ }
+
+ public void setDateResultFormats(String dateResultFormats) {
+ this.dateResultFormats = dateResultFormats;
+ }
+
+ @Override
+ public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connectionFactory)
+ throws ConnectorException {
+ try {
+ ConnectionFactory cf = (ConnectionFactory)connectionFactory;
+
+ return new TextSynchExecution(this, (Select)command, (TextConnection)cf.getConnection());
+ } catch (ResourceException e) {
+ throw new ConnectorException(e);
+ }
+ }
+
+ @Override
+ public void getConnectorMetadata(MetadataFactory metadataFactory, Object connectionFactory) throws ConnectorException {
+ TextConnection conn;
+ try {
+ ConnectionFactory cf = (ConnectionFactory)connectionFactory;
+ conn = (TextConnection)cf.getConnection();
+ } catch (ResourceException e) {
+ throw new ConnectorException(e);
+ }
+
+ for (Map.Entry<String, Properties> entry : conn.getMetadataProperties().entrySet()) {
+ Properties p = entry.getValue();
+ String columns = p.getProperty(TextDescriptorPropertyNames.COLUMNS);
+ if (columns == null) {
+ continue;
+ }
+ String types = p.getProperty(TextDescriptorPropertyNames.TYPES);
+ String[] columnNames = columns.trim().split(","); //$NON-NLS-1$
+ String[] typeNames = null;
+ if (types != null) {
+ typeNames = types.trim().split(","); //$NON-NLS-1$
+ if (typeNames.length != columnNames.length) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextConnector.column_mismatch", entry.getKey())); //$NON-NLS-1$
+ }
+ }
+ Table table = metadataFactory.addTable(entry.getKey().substring(entry.getKey().indexOf('.') + 1));
+ for (int i = 0; i < columnNames.length; i++) {
+ String type = typeNames == null?TypeFacility.RUNTIME_NAMES.STRING:typeNames[i].trim().toLowerCase();
+ Column column = metadataFactory.addColumn(columnNames[i].trim(), type, table);
+ column.setNameInSource(String.valueOf(i));
+ column.setNativeType(TypeFacility.RUNTIME_NAMES.STRING);
+ }
+ }
+ }
+
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextPlugin.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextPlugin.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextPlugin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,33 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.util.ResourceBundle;
+import com.metamatrix.core.BundleUtil;
+
+public class TextPlugin {
+
+ public static final String PLUGIN_ID = "org.teiid.resource.adapter.text" ; //$NON-NLS-1$
+
+ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID,PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$
+}
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextSynchExecution.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextSynchExecution.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextSynchExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,555 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.resource.ResourceException;
+
+import org.teiid.connector.language.ColumnReference;
+import org.teiid.connector.language.Command;
+import org.teiid.connector.language.DerivedColumn;
+import org.teiid.connector.language.NamedTable;
+import org.teiid.connector.language.Select;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.TypeFacility;
+
+import com.metamatrix.core.util.StringUtil;
+
+/**
+ * The essential part that executes the query. It keeps all the execution
+ * states.
+ */
+public class TextSynchExecution extends BasicExecution implements ResultSetExecution {
+ // Command to be executed
+ private Select cmd;
+
+ private TextExecutionFactory config;
+
+ // Translator for String to Data translation
+ private StringToDateTranslator stringToDateTranslator;
+
+ // List of column widths specified
+ private List colWidths = new ArrayList();
+
+ // the number of modeled columsn should match the
+ // number of colums parsed from the file
+ private int numModeledColumns = 0;
+
+ // If a header row is to be used, this is where the
+ // column names will be saved
+ private List headerRow = null;
+
+ //whether this execution is canceled
+ private volatile boolean canceled;
+
+ private int rowsProduced = 0;
+
+ private int[] cols;
+
+ private TextConnection connection;
+
+ /**
+ * Constructor.
+ * @param cmd
+ * @param txtConn
+ */
+ public TextSynchExecution(TextExecutionFactory config, Select query, TextConnection connection) {
+ this.config = config;
+ this.cmd = query;
+ this.connection = connection;
+
+ if(this.config.getDateResultFormats() != null) {
+ stringToDateTranslator = new StringToDateTranslator(this.config);
+ }
+ }
+
+ @Override
+ public void execute() throws ConnectorException {
+ //translate request
+ translateRequest(cmd);
+
+ cols = getSelectCols(cmd.getDerivedColumns());
+ }
+
+ @Override
+ public List next() throws ConnectorException, DataNotAvailableException {
+ if (canceled) {
+ throw new ConnectorException("Execution cancelled"); //$NON-NLS-1$
+ }
+ Select query = cmd;
+ NamedTable group = (NamedTable)query.getFrom().get(0);
+ String tableName = group.getMetadataObject().getFullName().toUpperCase();
+ Properties groupProps = this.connection.getMetadataProperties().get(tableName);
+
+ Class[] types = query.getColumnTypes();
+
+ String location = groupProps.getProperty(TextDescriptorPropertyNames.LOCATION);
+ String delimiter = groupProps.getProperty(TextDescriptorPropertyNames.DELIMITER);
+ String qualifier = groupProps.getProperty(TextDescriptorPropertyNames.QUALIFIER);
+
+ try {
+ while (true) {
+ String line = this.connection.getNextLine(tableName);
+ // Hit the end of file or the file is empty then
+ if(line == null) {
+ return null;
+ }
+
+ // Get record from file for one row
+ List record = getRecord(line, delimiter, qualifier, colWidths);
+
+ ++rowsProduced;
+ // Save selected columns into query results
+
+ if (this.config.isEnforceColumnCount() && record.size() != numModeledColumns) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Input_column_cnt_incorrect", new Object[] { new Integer(numModeledColumns), new Integer(record.size()) })); //$NON-NLS-1$
+ }
+
+ return getRow(record, cols, types);
+ }
+ } catch(ConnectorException ce) {
+ throw ce;
+ } catch(Throwable e) {
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Error_reading_text_file", new Object[] { location, e.getMessage() })); //$NON-NLS-1$
+ }
+ }
+
+
+ public void close() {
+ try {
+ this.connection.close();
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "TextSynchExecution is successfully closed.");//$NON-NLS-1$
+ } catch (ResourceException e) {
+ }
+ }
+
+ public void cancel() {
+ canceled = true;
+ }
+
+ /**
+ * Translate command.
+ * @param request ICommand as request
+ * @return Object translated request
+ * @throws ConnectorException if error occurs
+ */
+ protected Object translateRequest(Command request) throws ConnectorException {
+ if (request == null) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Request_is_null")); //$NON-NLS-1$
+ }
+
+ if (cmd == null) {
+ Object[] params = new Object[] { cmd };
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Error_translating_request", params)); //$NON-NLS-1$
+ }
+
+ // Get the columns widths for all the elements in the group.
+ Select query = (Select) request;
+
+ /* Defect 13371
+ * Can't use the select columns to get the columns widths because we may not be selecting all the columns. Instead,
+ * we need to get all the child elements of the group being queried, and get the columns widths of each one of them.
+ */
+ NamedTable group = (NamedTable)query.getFrom().get(0);
+ try {
+ /* We need to create the reader queue before we
+ * attempt to create the request as we may need
+ * column names from the header row.
+ */
+ String headerLine = this.connection.getHeaderLine(group.getMetadataObject().getFullName().toUpperCase());
+ if (headerLine != null) {
+ String tableName = group.getMetadataObject().getFullName().toUpperCase();
+ Properties groupProps = this.connection.getMetadataProperties().get(tableName);
+ String delimiter = groupProps.getProperty(TextDescriptorPropertyNames.DELIMITER);
+ String qualifier = groupProps.getProperty(TextDescriptorPropertyNames.QUALIFIER);
+ this.headerRow = getRecord(headerLine, delimiter, qualifier, colWidths);
+ }
+
+ List<Column> elements = group.getMetadataObject().getColumns();
+ numModeledColumns = elements.size();
+ int[] colWidthArray = new int[elements.size()];
+ for (int i = 0; i < colWidthArray.length; i++) {
+ Column element = elements.get(i);
+ colWidthArray[getColumn(element)] = element.getLength();
+ }
+ for (int i = 0; i < colWidthArray.length; i++) {
+ colWidths.add(new Integer(colWidthArray[i]));
+ }
+
+
+ } catch (ConnectorException e) {
+ Object[] params = new Object[] { query, e.getMessage() };
+ throw new ConnectorException(e, TextPlugin.Util.getString("TextSynchExecution.Cannot_be_translated_by_the_TextTranslator.", params)); //$NON-NLS-1$
+ }
+
+ return request;
+ }
+
+ /**
+ * Convert selected column names to columns.
+ * @param vars List of DataNodeIDs
+ * @return Column numbers corresponding to vars
+ */
+ private int[] getSelectCols(List vars) throws ConnectorException{
+ int[] cols = new int[vars.size()];
+ for(int i=0; i<vars.size(); i++) {
+ cols[i] = getColumn((DerivedColumn)vars.get(i));
+ }
+ return cols;
+ }
+
+ /**
+ * Get column number in Source by ISelectSymbol
+ *
+ * An Element is created from the symbol and this method
+ * invokes getColumn(Element).
+ *
+ * @param symbol Identifier to look up the column
+ * @return int The column corresponding to that id
+ * @throws ConnectorException
+ */
+ private int getColumn(DerivedColumn symbol) throws ConnectorException{
+ return this.getColumn(getElementFromSymbol(symbol));
+ }
+
+ /**
+ * Helper method for getting runtime {@link org.teiid.connector.metadata.runtime.Element} from a
+ * {@link org.teiid.connector.language.DerivedColumn}.
+ * @param symbol Input ISelectSymbol
+ * @return Element returned metadata runtime Element
+ */
+ private Column getElementFromSymbol(DerivedColumn symbol) {
+ ColumnReference expr = (ColumnReference) symbol.getExpression();
+ return expr.getMetadataObject();
+ }
+
+ /**
+ * Get column number in Source by Element
+ *
+ * An attempt is made to parse an int from the Name In Source
+ * for the Element. If this fails it is assumed that
+ * Name In Source is blank or contains an identifier
+ * name. If blank, the Element.getMetadataID().getName()
+ * is used otherwise, Name In Source is used.
+ * @param elem
+ * @return int
+ * @throws ConnectorException
+ */
+ private int getColumn(Column elem) throws ConnectorException{
+ String colStr = elem.getNameInSource();
+ try {
+ // If Name In Source is numeric, it is a column number
+ return Integer.parseInt(colStr);
+ } catch(NumberFormatException e) {
+ // Name In Source was not numeric, so look for a column with a heading matching Name In Source
+ if ( colStr == null ) {
+ colStr = elem.getName();
+ }
+ if ( headerRow != null ) {
+ for ( int i = 0; i < headerRow.size(); i++ ) {
+ if ( colStr.compareToIgnoreCase((String)headerRow.get(i) )==0) return i;
+ }
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Column_not_found_in_header_row", new Object[] {colStr, elem.getFullName() } )); //$NON-NLS-1$
+ }
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Invalid_column_number", new Object[] {colStr, elem.getFullName() } ) ); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Open the file, read it, and parse it into memory.
+ * @param line the line is being read
+ * @param delimiter
+ * @param qualifier
+ * @param colWidths List of column widths
+ * @return List of column values inside the line
+ * @throws Exception
+ */
+ private List getRecord(String line, String delimiter, String qualifier, List colWidths) throws ConnectorException {
+ if(delimiter != null) {
+ return parseDelimitedLine(line, delimiter, qualifier);
+ }
+ return parseFixedWidthLine(line, colWidths);
+ }
+
+ /**
+ * @param line line's length will not be 0
+ * @return List of parsed columns
+ */
+ private List parseDelimitedLine(String line, String delimiter, String qualifier) throws ConnectorException {
+ // the case with no qualifier
+ if (qualifier == null || qualifier.trim().length()==0) {
+ // parse on delimiters
+ List strs = new ArrayList();
+
+ int index = -1;
+ while(true) {
+ int newIndex = line.indexOf(delimiter, index);
+ if(newIndex >= 0) {
+ if(index >= 0) {
+ // middle column
+ addUnqualifiedColumnToList(strs, line.substring(index, newIndex));
+ } else {
+ // first column
+ addUnqualifiedColumnToList(strs, line.substring(0, newIndex));
+ }
+ index = newIndex+1;
+ } else if(index >= 0) {
+ // end of line
+ addUnqualifiedColumnToList(strs, line.substring(index));
+ break;
+ } else {
+ // only one column
+ addUnqualifiedColumnToList(strs, line);
+ break;
+ }
+ }
+ return strs;
+
+ }
+ // the case with qualifier
+
+ char delimChar = delimiter.charAt(0);
+ char qualChar = qualifier.charAt(0);
+ char spaceChar = " ".charAt(0); //$NON-NLS-1$
+
+ List columns = new ArrayList();
+ int charIndex = 0;
+ int totalChars = line.length();
+
+ while(charIndex < totalChars) {
+ // Read character
+ char c = line.charAt(charIndex);
+
+ if(c == delimChar) {
+ addUnqualifiedColumnToList(columns, null);
+ charIndex++; // past delimiter
+
+ } else if(c == qualChar) {
+ int endQualIndex = charIndex;
+ while(true) {
+ endQualIndex = line.indexOf(qualChar, endQualIndex+1);
+ if(endQualIndex < 0) {
+ Object[] params = new Object[] { ""+(columns.size()+1), line }; //$NON-NLS-1$
+ // changed to Connectorexception so that the exception is thrown to the user
+ // and becomes known a problem, rather than just
+ // keeping it internally to the server
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Text_has_no_ending_qualifier", params)); //$NON-NLS-1$
+ }
+ // skipping escaped qualifier charachters
+ if(line.length() > endQualIndex+1) {
+ if(line.charAt(endQualIndex+1) == qualChar) {
+ endQualIndex = endQualIndex+1;
+ continue;
+ }
+ }
+ // quoted column
+ columns.add(line.substring(charIndex+1, endQualIndex));
+ charIndex = endQualIndex+1; // past quoted column
+
+ // Check for extra characters between quote and delimiter
+ if(charIndex < totalChars && line.charAt(charIndex) != delimChar) {
+ Object[] params = new Object[] { ""+(columns.size()+1), line }; //$NON-NLS-1$
+ String msg = TextPlugin.Util.getString("TextSynchExecution.Text_file_must_have_delimiter", params);//$NON-NLS-1$
+ // changed to Connectorexception so that the exception is thrown to the user
+ // and becomes known a problem, rather than just
+ // keeping it internally to the server
+ throw new ConnectorException(msg);
+
+ }
+
+ charIndex++; // past delimiter
+ break;
+ }
+
+ // skip any space between the delimiter
+ // and the qualifier
+ } else if(c == spaceChar) {
+ charIndex++;
+
+ } else {
+ int endColIndex = line.indexOf(delimChar, charIndex);
+ if(endColIndex < 0) {
+ // last unquoted column
+ addUnqualifiedColumnToList(columns, line.substring(charIndex));
+
+ // We know the line is done so we should exit the loop here.
+ // If we didn't exit the loop and just advanced the charIndex,
+ // we would trip the "line ends in <delim>" case below, which
+ // is not valid as we have not ended in a delimiter
+ break;
+ }
+ // middle unquoted column
+ addUnqualifiedColumnToList(columns, line.substring(charIndex, endColIndex));
+ charIndex = endColIndex+1;
+ }
+
+ // line ends in <delimiter>
+ if(charIndex == totalChars) {
+ addUnqualifiedColumnToList(columns, null);
+ }
+
+ }
+
+ return columns;
+ }
+
+ /**
+ * Add column value, if null or length is 0, then add null.
+ * @param
+ * @param
+ */
+ private static void addUnqualifiedColumnToList(List list, String col) {
+ if(col == null || col.length() == 0) {
+ list.add(null);
+ } else {
+ list.add(col);
+ }
+ }
+
+ /**
+ *
+ * @param line
+ * @param colWidths
+ * @return List
+ * @throws ConnectorException
+ */
+ private List parseFixedWidthLine(String line, List colWidths) throws ConnectorException {
+ int length = line.length();
+ List fields = new ArrayList(colWidths.size());
+ Iterator iter = colWidths.iterator();
+ int current = 0;
+ while(iter.hasNext()) {
+ try {
+ int width = ((Integer)iter.next()).intValue();
+ if(width <= 0) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Column_length_must_be_positive")); //$NON-NLS-1$
+ }
+
+ int end = current + width;
+ if(end > length) {
+ end = length;
+ }
+
+ String colValue = line.substring(current, end).trim();
+ if(colValue.length() == 0) {
+ fields.add(null);
+ } else {
+ fields.add(colValue);
+ }
+ current += width;
+ } catch(Exception e) {
+ // ignore and fill column with null
+ fields.add(null);
+ }
+ }
+
+ return fields;
+ }
+
+ /**
+ * Save selected columns from record into results.
+ * @param batch batch to contain the record
+ * @param record the record of one row
+ * @param columns Columns to save in results
+ * @param types Class of all columns' types
+ */
+ private List getRow(List record, int[] columns, Class[] types) throws ConnectorException {
+ List newRecord = new ArrayList(columns.length);
+ for(int i=0; i<columns.length; i++) {
+ int column = columns[i];
+ String value = (String) record.get(column);
+ Class type = types[i];
+ newRecord.add(convertString(value, type));
+ }
+ return newRecord;
+ }
+
+ /**
+ * Convert String to Object of correct type.
+ * @param value Input Value
+ * @param type Input type
+ * @return Object translated Object from String
+ */
+ private Object convertString(String value, Class type) throws ConnectorException {
+ if (value==null) {
+ return null;
+ }
+
+ if (type == TypeFacility.RUNTIME_TYPES.STRING) {
+ return value;
+ }
+
+ if (java.util.Date.class.isAssignableFrom(type)) {
+ //check defaults first
+ try {
+ return Timestamp.valueOf(value);
+ } catch (IllegalArgumentException e) {
+
+ }
+ try {
+ return Date.valueOf(value);
+ } catch (IllegalArgumentException e) {
+
+ }
+ try {
+ return Time.valueOf(value);
+ } catch (IllegalArgumentException e) {
+
+ }
+ //check for overrides
+ if (stringToDateTranslator!=null && stringToDateTranslator.hasFormatters()) {
+ try {
+ return new Timestamp(stringToDateTranslator.translateStringToDate(value).getTime());
+ }catch(ParseException ex) {
+ throw new ConnectorException(TextPlugin.Util.getString("TextSynchExecution.Unable_translate_String_to_Date", new Object[] { ex.getMessage() })); //$NON-NLS-1$
+ }
+ }
+ }
+ return value;
+ }
+
+}
+
Added: trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextUtil.java
===================================================================
--- trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextUtil.java (rev 0)
+++ trunk/connectors/translator-text/src/main/java/org/teiid/resource/adapter/text/TextUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,65 @@
+/*
+ * 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.resource.adapter.text;
+
+import java.io.File;
+
+import com.metamatrix.core.util.FileUtils;
+
+
+/**
+ * @since 4.3
+ */
+public class TextUtil {
+
+ public static boolean usesWildCard(String location) {
+ if (location == null) return false;
+
+ File datafile = new File(location);
+ String fname = datafile.getName();
+
+ // determine if the wild card is used to indicate all files
+ // of the specified extension
+ if (fname.indexOf("*") >= 0) { //$NON-NLS-1$
+ return true;
+ }
+ return false;
+ }
+ public static File[] getFiles(String location) {
+ if (location == null) return null;
+
+ File datafile = new File(location);
+ String fname = datafile.getName();
+
+ // determine if the wild card is used to indicate all files
+ // of the specified extension
+ if (fname.indexOf("*") >= 0) { //$NON-NLS-1$
+
+ File parentDir = datafile.getParentFile();
+ String ext = FileUtils.getExtension(fname);
+ return FileUtils.findAllFilesInDirectoryHavingExtension(parentDir.getAbsolutePath(), "." + ext); //$NON-NLS-1$
+ }
+ return null;
+
+ }
+}
Added: trunk/connectors/translator-text/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- trunk/connectors/translator-text/src/main/resources/META-INF/jboss-beans.xml (rev 0)
+++ trunk/connectors/translator-text/src/main/resources/META-INF/jboss-beans.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="${project.artifactId}-${project.version}" class="org.teiid.templates.TranslatorDeploymentTemplate">
+ <property name="info"><inject bean="${project.artifactId}-templateinfo"/></property>
+ <property name="managedObjectFactory"><inject bean="ManagedObjectFactory"/></property>
+ </bean>
+
+ <bean name="${project.artifactId}-templateinfo" class="org.teiid.templates.TranslatorTemplateInfo">
+ <constructor factoryMethod="createTemplateInfo">
+ <factory bean="TranslatorDeploymentTemplateInfoFactory"/>
+ <parameter class="java.lang.Class">org.teiid.templates.TranslatorTemplateInfo</parameter>
+ <parameter class="java.lang.Class">org.teiid.resource.adapter.text.TextExecutionFactory</parameter>
+ <parameter class="java.lang.String">${project.artifactId}-${project.version}</parameter>
+ <parameter class="java.lang.String">${project.description}</parameter>
+ </constructor>
+ </bean>
+
+</deployment>
\ No newline at end of file
Added: trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/text/i18n.properties
===================================================================
--- trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/text/i18n.properties (rev 0)
+++ trunk/connectors/translator-text/src/main/resources/org/teiid/resource/adapter/text/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,71 @@
+#
+# 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.
+#
+
+StringToDateTranslator.Attempts_to_parse_String__{0}_to_a_java.util.Date_failed_for_the_following_reasons___1=Attempts to parse String: {0} to a java.util.Date failed for the following reasons:
+StringToDateTranslator.There_is_no_format_Strings_found_in_this_formatter_object._n_2=There is no format Strings found in this formatter object.\n
+StringToDateTranslator.Parse_Attempt__{0}_using_format__{1}_failed_for_the_following_reason__{2}_4=Parse Attempt: {0} using format: {1} failed for the following reason: {2}
+StringToDateTranslator.Failed_to_convert_String__{0}_to_a_Date_using_one_of_the_following_format_Strings_that_are_specified_in_the_properties_for_this_Connector__{1}_1=Failed to convert String: {0} to a Date using one of the following format Strings that are specified in the properties for this Connector: {1}
+TextConnection.Descriptor_file_name_is_not_specified._2=Descriptor file name is not specified.
+TextConnection.Error_trying_to_establish_connection_5=Error trying to establish connection
+TextConnection.Error_while_reading_text_file__{0}_1=Error while reading text file: {0}
+TextConnection.Text_file_name_is_not_specified_for_the_group___{0}_2=Text file name is not specified for the group : {0}
+TextConnection.The_value_for_the_property_should_be_an_integer._{0}_3=The value for the property should be an integer. {0}
+TextConnection.The_property_{0}_for_the_group_{1}_is_invalid._4=The property {0} for the group {1} is invalid.
+TextConnection.Error_parsing_property_string_{0}_5=Error parsing property string {0}
+TextConnection.Error_parsing_property_string_{0}__{1}_6=Error parsing property string {0}: {1}
+TextConnection.fileDoesNotExistForGroup=Data file not found at this location: {0}, for group {1}
+TextConnection.Data_file_{0}_found_but_does_not_have_Read_permissions_8=Data file {0} found but does not have Read permissions
+TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_9=Descriptor file does not exist at this location: {0}
+TextConnection.Descriptor_file_{0}_found_but_does_not_have_Read_permissions_10=Descriptor file {0} found but does not have Read permissions
+TextConnection.Couldn__t_find_the_file_of_name_{0}_11=Couldn''t find the file of name {0}
+TextConnection.Descriptor_file_does_not_exist_at_this_location__{0}_12=Descriptor file does not exist at this location: {0}
+TextSynchExecution.Request_is_null=The Request is null.
+TextSynchExecution.No_element_in_Select=There are no element in the Select clause.
+TextSynchExecution.Not_of_type_Map=Response submitted for the request is not of type Map as expected.
+TextSynchExecution.Error_reading_text_file=Error while reading text file: {0}: {1}
+TextSynchExecution.Error_translating_request=Error translating request: Command not supported. {0}
+TextSynchExecution.Cannot_be_translated_by_the_TextTranslator.=''{0}'' cannot be translated by the TextTranslator. {1}
+TextSynchExecution.Error_obtain_properties_for_group=Error trying to obtain connector metadata properties for {0}. Group properties are not specified in the descriptor file.
+TextSynchExecution.Unable_get_Reader=Unable to get the Reader for group {0}, exception: {1}
+TextSynchExecution.Unable_get_Reader_for_group=Unable to get the Reader for group {0}. Source file undefined - check log for errors.
+TextSynchExecution.Cant_read_column_number=Cannot read column number from name in source for element. {0}
+TextSynchExecution.Invalid_column_number=Column {0} not found for element {1} and no header row is defined. If a header row cannot be defined, element {1} must define a numeric column number for its name in source property.
+TextSynchExecution.Column_not_found_in_header_row=Column {0} not found for element {1}. Verify column name \"{0}\" is defined in the header row of the text file and that the header row number is correctly defined in the descriptor file.
+TextSynchExecution.Can_read_column_number=Cannot read column number from name in source for element. {0}
+TextSynchExecution.Text_has_no_ending_qualifier=Text file has no ending qualifier in column {0}: [{1}]
+TextSynchExecution.Text_file_must_have_delimiter=Text file must have delimiter after ending qualifier in column {0}: [{1}]
+TextSynchExecution.Column_length_must_be_positive=Error trying to query the text file, column length must be a positive value.
+TextSynchExecution.Got_unknown_type_of_criteria=Got unknown type of criteria: {0}
+TextSynchExecution.Functions_not_supported._14=The criteria: {0} could not be applied to the results. Functions not supported.
+TextSynchExecution.Values_of_different_types=The following criteria cannot be executed because values are of different types: {0}
+TextSynchExecution.Unknown_compare_criteria_type=Unknown compare criteria type: {0}
+TextSynchExecution.Joins_and_Functions_not_supported._18=The criteria: {0} could not be translated by the TextConnectorTranslator. Joins and Functions not supported.
+TextSynchExecution.The_expression_cannot_be_used_as_criteria=The expression: {0} cannot be used as a criteria value in a query against a text file.
+TextSynchExecution.Functions_in_criteria_not_supported._20=The criteria: {0} cannot be translated by the TextConnectorTranslator. Functions in criteria not supported.
+TextSynchExecution.Functions_in_set_criteria_not_supported._21=The criteria: {0} cannot be translated by the TextConnectorTranslator. Functions in set criteria not supported.
+TextSynchExecution.Unable_translate_String_to_Date=Unable to translate String to Date using the format specified. {0}
+TextSynchExecution.Unable_get_Tranform=Unable to get the Tranform from String to {0}
+TextSynchExecution.Unable_to_transform_value=Unable to transform value {0} to Object of type {1}
+TextSynchExecution.Input_column_cnt_incorrect=Expected input file to have {0} columns based on model, but found {1}. This could be caused by misplaced quotes, causing multiple columns to be treated as one.
+TextSynchExecution.Text_has_no_determined_ending_qualifier=Text file has no matching ending qualifier in row {0}
+TextSynchExecution.Property_contains_an_invalid_value_Using_value=Property {0} contains an invalid value of {1}. Using value {2}.
+TextConnector.column_mismatch=Specified types and columns do not match for text table {0}
\ No newline at end of file
Added: trunk/connectors/translator-text/src/test/resources/EmpData.txt
===================================================================
--- trunk/connectors/translator-text/src/test/resources/EmpData.txt (rev 0)
+++ trunk/connectors/translator-text/src/test/resources/EmpData.txt 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,51 @@
+LastName,FirstName,MiddleName,EmpId,Department,AnnualSalary,Title,HomePhone,Manager,Street,City,State,Zip
+Kisselburg,Abbiegale,Tikvica ,9000059,G,64000,MGMT WannaBe,670-270-7947,9000073,123 State St.,New York,NY,10001
+Glore,Diodie,Vojvoda ,9000060,G,71000,Associate,480-650-9750,9000073,127 State St.,Los Angeles,CA,10005
+Dawson,Pinckney,Ostoja ,9000061,G,71000,Associate,110-400-3600,9000073,135 State St.,Detroit,MI,10013
+Waldrip,Trixie,Curic ,9000062,G,57000,Newbie,820-210-7045,9000073,136 State St.,Albany,NY,10014
+Kitchen,Zilpha,Buic ,9000063,G,60000,MGMT WannaBe,660-390-3785,9000073,138 State St.,Trenton,NJ,10016
+Wakeman,Gerard,Vlahovic ,9000064,G,78000,Newbie,700-190-5880,9000073,130 State St.,Jefferson City,MO,10008
+Rafferty,Dock,Korda ,9000065,G,70000,Newbie,400-190-6192,9000073,128 State St.,Sacramento,CA,10006
+Kersavage,Zelda,Mjesecevic ,9000066,G,56000,MGMT WannaBe,802-930-1482,9000073,137 State St.,Montpelier,VT,10015
+Zummer,Gerda,Milan ,9000067,G,69000,Newbie,920-100-9701,9000073,131 State St.,Bangor,ME,10009
+Davies,Allwyne,Radic ,9000068,G,61000,Associate,470-820-6096,9000073,126 State St.,Montgomery,AL,10004
+Deanford,Abe,Skrabalo ,9000069,G,67000,Associate,907-660-8233,9000073,124 State St.,Juneau,AK,10002
+Garcia,Orsal,Ucovic ,9000070,ML,79000,CFO,480-490-7710,9000075,150 State St.,Phoenix,AZ,10028
+Zook,Orson,Bendevis ,9000071,G,71000,Newbie,350-260-8654,9000073,133 State St.,Boston,MA,10011
+Rainier,Adelaid,Marinovic ,9000072,G,67000,Newbie,316-550-3499,9000073,125 State St.,Topeka,KS,10003
+Nealon,General,,9000073,G,77000,COO,203-420-3113,9000075,129 State St.,Hartford,CT,10007
+Garahana,Jarrod,Cvjetkovic ,9000074,G,66000,Associate,620-430-1782,9000073,132 State St.,New York,NY,10010
+Neely,Petronella,Goravica ,9000075,G,80000,CEO,230-320-6330,,134 State St.,Los Angeles,CA,10012
+Gamble,Johney,Kordic ,9000123,TM,74000,Associate,330-200-8319,9000132,162 State St.,Detroit,MI,10040
+Gertanovich,Orthell,Tvrdisa ,9000124,TM,63000,Associate,600-410-3667,9000132,165 State St.,Albany,NY,10043
+Kenyon,Jim,Radovanovic ,9000125,TM,80000,MGMT WannaBe,800-510-7741,9000132,161 State St.,Trenton,NJ,10039
+Gerber,Tristan,Rogec ,9000126,TM,57000,Associate,120-990-7278,9000132,169 State St.,Jefferson City,MO,10047
+Gibb,Jaromy,Kristic ,9000127,TM,69000,Associate,270-390-9549,9000132,160 State St.,Sacramento,CA,10038
+Rader,Allissa,Radicevic ,9000128,TM,59000,Newbie,750-420-2128,9000132,157 State St.,Montpelier,VT,10035
+Kammerer,Dilbert,Capor ,9000129,TM,70000,Associate,700-280-3808,9000132,159 State St.,Bangor,ME,10037
+Knippers,Tuesday,Balic ,9000130,TM,68000,MGMT WannaBe,960-140-1045,9000132,170 State St.,Montgomery,AL,10048
+Zumwalt,Patrycia,Srezovic ,9000131,TM,72000,Newbie,210-400-7920,9000132,167 State St.,Juneau,AK,10045
+Needham,Katlyn,Metkovic ,9000132,TM,76000,Goon,380-210-1611,9000070,163 State St.,Phoenix,AZ,10041
+Keefer,Almedia,,9000133,TM,61000,MGMT WannaBe,850-640-3038,9000132,158 State St.,Boston,MA,10036
+Rampton,Orman,Cavelis ,9000134,TM,76000,Newbie,950-930-1038,9000132,164 State St.,Topeka,KS,10042
+Krepps,Paul,Skobelj ,9000135,TM,64000,MGMT WannaBe,430-500-8830,9000132,168 State St.,Hartford,CT,10046
+Deans,Zeno,Jozovic ,9000136,TM,79000,Associate,830-190-9156,9000132,172 State St.,New York,NY,10050
+Zarafonetis,Parazetti,Roncevic ,9000137,TM,73000,Newbie,710-890-2886,9000132,166 State St.,Los Angeles,CA,10044
+Davis,Tyler,Vukic ,9000138,TM,80000,Associate,540-420-5160,9000132,171 State St.,Detroit,MI,10049
+Randolph,Orwin,Rasica ,9010233,ML,44000,Newbie,200-870-4749,9000070,151 State St.,Albany,NY,10029
+Ramsey,Orran,Slade ,9010234,ML,42000,Newbie,500-830-2947,9000070,149 State St.,Trenton,NJ,10027
+Wagonlander,Blondeena,Djano ,9010235,ML,41000,Newbie,780-760-9188,9000070,141 State St.,Jefferson City,MO,10019
+Wadsworth,Alice,Hasan ,9010236,ML,40000,Newbie,230-360-1247,9000070,140 State St.,Sacramento,CA,10018
+Nolen,Parnell,Buconic ,9010237,ML,47000,Newbie,620-300-7125,9000070,152 State St.,Montpelier,VT,10030
+Glidewell,Xoe,Bagovic ,9010238,ML,45000,Associate,850-850-5647,9000070,156 State St.,Bangor,ME,10034
+Zutter,Adam,Hendic ,9010239,ML,48000,Newbie,890-300-9999,9000070,139 State St.,Montgomery,AL,10017
+Gale,Turwayne,Dalmatin ,9010240,ML,36000,Associate,600-290-9758,9000070,154 State St.,Juneau,AK,10032
+Krikwood,Javin,Vidak ,9010241,ML,42000,MGMT WannaBe,380-280-5100,9000070,146 State St.,Phoenix,AZ,10024
+Giggs,Philbert,Vidak ,9010242,ML,52000,Associate,620-270-6404,9000070,153 State St.,Boston,MA,10031
+Danford,Garnett,Brigovic ,9010243,ML,39000,Associate,880-160-7833,9000070,145 State St.,Topeka,KS,10023
+Nash,Xavier,Semes ,9010244,ML,53000,MGMT WannaBe,800-550-5917,9000070,155 State St.,Hartford,CT,10033
+Kasparek,Gallard,Jelic ,9010245,ML,47000,Associate,590-460-5850,9000070,144 State St.,New York,NY,10022
+Kernodle,Dextor,Bupic ,9010246,ML,55000,MGMT WannaBe,440-750-1427,9000070,142 State St.,Los Angeles,CA,10020
+Neighbors,Karron,Stuk ,9010247,ML,40000,Newbie,430-790-9550,9000070,147 State St.,Detroit,MI,10025
+Gilbertson,Doil,Radic ,9010248,ML,51000,Associate,870-510-5367,9000070,143 State St.,Albany,NY,10021
+Neilsen,Katheleen,,9010249,ML,36000,Newbie,550-200-5470,9000070,148 State St.,Trenton,NJ,10026
Added: trunk/connectors/translator-text/src/test/resources/EmployeeTestDataSalary.txt
===================================================================
--- trunk/connectors/translator-text/src/test/resources/EmployeeTestDataSalary.txt (rev 0)
+++ trunk/connectors/translator-text/src/test/resources/EmployeeTestDataSalary.txt 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,4 @@
+Employees.EmpTable.location = src/test/resources/EmpData.txt
+Employees.EmpTable.qualifier = "
+Employees.EmpTable.delimiter = ,
+Employees.EmpTable.skipHeaderLines = 1
Added: trunk/connectors/translator-text/src/test/resources/libraryDelimited.txt
===================================================================
--- trunk/connectors/translator-text/src/test/resources/libraryDelimited.txt (rev 0)
+++ trunk/connectors/translator-text/src/test/resources/libraryDelimited.txt 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,2 @@
+"1", "2003-03-25", "Blind"
+"2","1998-04-29", "Antipop"
\ No newline at end of file
Added: trunk/connectors/translator-text/src/test/resources/testDescriptorDelimited.txt
===================================================================
--- trunk/connectors/translator-text/src/test/resources/testDescriptorDelimited.txt (rev 0)
+++ trunk/connectors/translator-text/src/test/resources/testDescriptorDelimited.txt 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,6 @@
+text.library.location = src/test/resources/libraryDelimited.txt
+text.library.qualifier = "
+text.library.delimiter = ,
+text.library2.location = src/test/resources/libraryDelimited2.txt
+text.library2.qualifier = "
+text.library2.delimiter = ,
Modified: trunk/engine/src/main/java/com/metamatrix/common/buffer/TupleBuffer.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/buffer/TupleBuffer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/buffer/TupleBuffer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,10 +31,11 @@
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicLong;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.common.types.Streamable;
import com.metamatrix.core.util.Assertion;
Modified: trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/BufferManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/BufferManagerImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/BufferManagerImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -43,6 +43,9 @@
import javax.xml.transform.Source;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BatchManager;
@@ -52,8 +55,6 @@
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.TupleBuffer;
import com.metamatrix.common.buffer.BatchManager.ManagedBatch;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.common.types.InputStreamFactory;
import com.metamatrix.common.types.SQLXMLImpl;
Modified: trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/FileStorageManager.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/FileStorageManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/buffer/impl/FileStorageManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,11 +31,12 @@
import java.util.Map;
import java.util.TreeMap;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.common.buffer.FileStore;
import com.metamatrix.common.buffer.StorageManager;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.query.execution.QueryExecPlugin;
@@ -223,8 +224,8 @@
File createFile(String name, int fileNumber) throws MetaMatrixComponentException {
try {
File storageFile = File.createTempFile(FILE_PREFIX + name + "_" + String.valueOf(fileNumber) + "_", null, this.dirFile); //$NON-NLS-1$ //$NON-NLS-2$
- if (LogManager.isMessageToBeRecorded(com.metamatrix.common.log.LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
- LogManager.logDetail(com.metamatrix.common.log.LogConstants.CTX_BUFFER_MGR, "Created temporary storage area file " + storageFile.getAbsoluteFile()); //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
+ LogManager.logDetail(org.teiid.logging.LogConstants.CTX_BUFFER_MGR, "Created temporary storage area file " + storageFile.getAbsoluteFile()); //$NON-NLS-1$
}
return storageFile;
} catch(IOException e) {
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/JavaLogWriter.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/JavaLogWriter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/JavaLogWriter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,75 +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 com.metamatrix.common.log;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Write to Java logging
- */
-public class JavaLogWriter implements LogListener {
-
- @Override
- public boolean isEnabled(String context, int msgLevel) {
- Logger logger = Logger.getLogger(context);
-
- Level javaLevel = convertLevel(msgLevel);
- return logger.isLoggable(javaLevel);
- }
-
- public void log(int level, String context, Object msg) {
- Logger logger = Logger.getLogger(context);
-
- Level javaLevel = convertLevel(level);
- logger.log(javaLevel, msg.toString());
- }
-
- public void log(int level, String context, Throwable t, Object msg) {
- Logger logger = Logger.getLogger(context);
-
- Level javaLevel = convertLevel(level);
- logger.log(javaLevel, msg.toString(), t);
- }
-
- public Level convertLevel(int level) {
- switch (level) {
- case MessageLevel.CRITICAL:
- case MessageLevel.ERROR:
- return Level.SEVERE;
- case MessageLevel.WARNING:
- return Level.WARNING;
- case MessageLevel.INFO:
- return Level.FINE;
- case MessageLevel.DETAIL:
- return Level.FINER;
- case MessageLevel.TRACE:
- return Level.FINEST;
- }
- return Level.ALL;
- }
-
- public void shutdown() {
- }
-
-}
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/LogConstants.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/LogConstants.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/LogConstants.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,44 +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 com.metamatrix.common.log;
-
-
-public interface LogConstants {
- // add the new contexts to the Log4JUtil.java class, for configuration purpose
- public static final String CTX_SECURITY = "org.teiid.SECURITY"; //$NON-NLS-1$
- public static final String CTX_TRANSPORT = "org.teiid.TRANSPORT"; //$NON-NLS-1$
- public static final String CTX_QUERY_PLANNER = "org.teiid.PLANNER"; //$NON-NLS-1$
- public static final String CTX_DQP = "org.teiid.PROCESSOR"; //$NON-NLS-1$
- public static final String CTX_CONNECTOR = "org.teiid.CONNECTOR"; //$NON-NLS-1$
- public static final String CTX_BUFFER_MGR = "org.teiid.BUFFER_MGR"; //$NON-NLS-1$
- public static final String CTX_TXN_LOG = "org.teiid.TXN_LOG"; //$NON-NLS-1$
- public static final String CTX_COMMANDLOGGING = "org.teiid.COMMAND_LOG"; //$NON-NLS-1$
- public static final String CTX_AUDITLOGGING = "org.teiid.AUDIT_LOG"; //$NON-NLS-1$
- public static final String CTX_ADMIN_API = "org.teiid.ADMIN_API"; //$NON-NLS-1$
- public static final String CTX_RUNTIME = "org.teiid.RUNTIME"; //$NON-NLS-1$
- // Query contexts
- public static final String CTX_FUNCTION_TREE = CTX_QUERY_PLANNER + ".FUNCTION_TREE"; //$NON-NLS-1$
- public static final String CTX_QUERY_RESOLVER = CTX_QUERY_PLANNER + ".RESOLVER"; //$NON-NLS-1$
- public static final String CTX_XML_PLANNER = CTX_QUERY_PLANNER + ".XML_PLANNER"; //$NON-NLS-1$
- public static final String CTX_XML_PLAN = CTX_DQP + ".XML_PLAN"; //$NON-NLS-1$
-}
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/LogListener.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/LogListener.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/LogListener.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,51 +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 com.metamatrix.common.log;
-
-
-/**
- * LogListener
- */
-public interface LogListener {
-
- /**
- * Is the logging for the given context at the specified message level enabled.
- * @param context
- * @param msgLevel
- * @return
- */
- boolean isEnabled(String context, int msgLevel);
-
- void log(int level, String context, Object msg);
-
- void log(int level, String context, Throwable t, Object msg);
-
- /**
- * Shut down this listener, requesting it clean up and release any resources it
- * may have acquired during its use. The listener is free to ignore this
- * request if it is not responsible for managing the resources it uses or if
- * there are no resources.
- */
- void shutdown();
-
-}
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/LogManager.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/LogManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/LogManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,399 +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 com.metamatrix.common.log;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-
-
-
-/**
- * This class represents the interface to a single logging framework
- * that is easily accessible by any component. Using the LogManager, a component
- * can quickly submit a log message, and can rely upon the LogManager to determine
- * (a) whether that message is to be recorded or discarded; and (b) where
- * to send any recorded messages. Thus, the component's code that submits
- * messages does not have to be modified to alter the logging behavior of the
- * application.
- * <p>
- * By default, all context(s) are logged by the LogManager. The messages that
- * the LogManager actually records and sends to the destinations
- * can be controlled using two different and orthogonal parameters.
- * The first is a message <i>level</i> that filters messages based upon detail,
- * and the second is a message <i>context</i> that filters messages based upon
- * origin. The LogManager tracks only those context(s) that should NOT be
- * logged. Only if a message (which also is defined with these two parameters)
- * passes both filters will it be sent to the destinations.
- * <p>
- * Each message is submitted with one of the following levels (determined
- * by the particular method used to submit the message), sorted from the
- * least detailed to the greatest:
- * <li><b>Critical</b>: This level of message is generally
- * used to record an event or error that must be recorded (if any logging
- * is used). If it is used to record an error, it generally means that the
- * system encountered a critical error which affects the integrity, accuracy,
- * reliability and/or capability of the system.</li>
- * <li><b>Error</b>: Error messages are generally used
- * to record unexpected problems, or errors that are not critical in nature
- * and from which the system can automatically recover.</li>
- * <li><b>Warning</b>: Warning messages generally described
- * expected errors from which the system should recover. However, this level
- * is used to record the fact that such an error or event did occur.</li>
- * <li><b>Information</b>: This level of logging is the usually
- * the normal level. All interesting periodic events should be logged at this
- * level so someone looking through the log can see the amount and kind of
- * processing happening in the system.</li>
- * <li><b>Detail</b>: Such messages are moderately detailed,
- * and help to debug typical problems in the system. Generally, these
- * messages are not so detailed that the big picture gets lost.</li>
- * <li><b>Trace</b>: A trace message is the most detailed
- * logging level, used to trace system execution for really nasty problems.
- * At this level, logging will be so verbose that the system performance
- * may be affected.</li>
- * <p>
- * The context for a message is any application-specified String. Again, only
- * those message contexts that match those in the LogManager's configuration will
- * be sent to the destinations.
- *
- */
-public final class LogManager {
-
- public static class LoggingProxy implements InvocationHandler {
- private final Object instance;
- private final String loggingContext;
- private final int level;
-
- public LoggingProxy(Object instance, String loggingContext, int level) {
- this.instance = instance;
- this.loggingContext = loggingContext;
- this.level = level;
- }
-
- public Object invoke(Object proxy,
- Method method,
- Object[] args) throws Throwable {
- boolean log = LogManager.isMessageToBeRecorded(loggingContext, level);
- if (log) {
- StringBuffer message = new StringBuffer();
- message.append("before "); //$NON-NLS-1$
- message.append(method.getName());
- message.append(":"); //$NON-NLS-1$
- message.append(instance);
- message.append("("); //$NON-NLS-1$
- if (args != null) {
- for (int i = 0; i < args.length; i++) {
- if (args[i] != null) {
- message.append(args[i]);
- } else {
- message.append("null"); //$NON-NLS-1$
- }
- if (i != args.length - 1) {
- message.append(","); //$NON-NLS-1$
- }
- }
- }
- message.append(")"); //$NON-NLS-1$
- LogManager.log(level, loggingContext, message.toString());
- }
- try {
- Object result = method.invoke(instance, args);
- if (log) {
- LogManager.log(level, loggingContext,
- "after " + method.getName()+ " : "+result); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return result;
- } catch (InvocationTargetException e) {
- throw e.getTargetException();
- }
- }
- }
-
- static LogListener logListener = new JavaLogWriter(); // either injected or manually set using the set methods
-
- /**
- * Send a critical message to the log. This level of message is generally
- * used to record an event or error that must be recorded (if any logging
- * is used). If it is used to record an error, it generally means that the
- * system encountered a critical error which affects the integrity, accuracy,
- * reliability and/or capability of the system.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param message the log message; the message is
- * not logged if this parameter is null
- */
- public static void logCritical(String context, String message) {
- logMessage(MessageLevel.CRITICAL, context, message);
- }
-
- /**
- * Send a critical message to the log. This level of message is generally
- * used to record an event or error that must be recorded (if any logging
- * is used). If it is used to record an error, it generally means that the
- * system encountered a critical error which affects the integrity, accuracy,
- * reliability and/or capability of the system.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param message the log message (may be null)
- */
- public static void logCritical(String context, Throwable e, String message) {
- log(MessageLevel.CRITICAL,context,e,message);
- }
-
- /**
- * Send an error message to the log. Error messages are generally used
- * to record unexpected problems, or errors that are not critical in nature
- * and from which the system can automatically recover.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param message the log message; the message is
- * not logged if this parameter is null
- */
- public static void logError(String context, String message) {
- logMessage(MessageLevel.ERROR, context,message);
- }
-
- /**
- * Send an error message to the log. Error messages are generally used
- * to record unexpected problems, or errors that are not critical in nature
- * and from which the system can automatically recover.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param message the log message (may be null)
- */
- public static void logError(String context, Throwable e, String message) {
- log(MessageLevel.ERROR,context,e,message);
- }
-
- /**
- * Send a warning message to the log. Warning messages generally described
- * expected errors from which the system should recover. However, this level
- * is used to record the fact that such an error or event did occur.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param message the log message; the message is
- * not logged if this parameter is null
- */
- public static void logWarning(String context, String message) {
- logMessage(MessageLevel.WARNING, context,message);
- }
-
- /**
- * Send a warning message to the log. Warning messages generally described
- * expected errors from which the system should recover. However, this level
- * is used to record the fact that such an error or event did occur.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param message the log message (may be null)
- */
- public static void logWarning(String context, Throwable e, String message) {
- log(MessageLevel.WARNING,context,e,message);
- }
-
- /**
- * Send a information message to the log. This level of logging is the usually
- * the normal level. All interesting periodic events should be logged at this
- * level so someone looking through the log can see the amount and kind of
- * processing happening in the system.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param message the log message; the message is
- * not logged if this parameter is null
- */
- public static void logInfo(String context, String message) {
- logMessage(MessageLevel.INFO, context,message);
- }
-
- /**
- * Send a detail message to the log. Such messages are moderately detailed,
- * and help to debug typical problems in the system. Generally, these
- * messages are not so detailed that the big picture gets lost.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param msgParts the individual parts of the log message; the message is
- * not logged if this parameter is null
- */
- public static void logDetail(String context, Object ... msgParts) {
- logMessage(MessageLevel.DETAIL, context, msgParts);
- }
-
- /**
- * Send a detail message to the log. Such messages are moderately detailed,
- * and help to debug typical problems in the system. Generally, these
- * messages are not so detailed that the big picture gets lost.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param message the log message (may be null)
- */
- public static void logDetail(String context, Throwable e, Object ... message) {
- log(MessageLevel.DETAIL,context,e,message);
- }
-
- /**
- * Send a trace message to the log. A trace message is the most detailed
- * logging level, used to trace system execution for really nasty problems.
- * At this level, logging will be so verbose that the system performance
- * may be affected.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param msgParts the individual parts of the log message; the message is
- * not logged if this parameter is null
- */
- public static void logTrace(String context, Object ... msgParts) {
- logMessage(MessageLevel.TRACE, context, msgParts);
- }
-
- /**
- * Send a trace message to the log. A trace message is the most detailed
- * logging level, used to trace system execution for really nasty problems.
- * At this level, logging will be so verbose that the system performance
- * may be affected.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param msgParts the individual parts of the log message (may be null)
- */
- public static void logTrace(String context, Throwable e, Object ... msgParts) {
- logMessage(MessageLevel.TRACE,context,e,msgParts);
- }
-
- /**
- * Send a message of the specified level to the log.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param msgLevel
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param message the individual parts of the log message; the message is
- * not logged if this parameter is null
- */
- public static void log(int msgLevel, String context, Object message) {
- logMessage(msgLevel, context, message);
- }
-
- /**
- * Send a message of the specified level to the log.
- * <p>
- * Only if the log manager is configured to send such messages to the
- * destination will the message be recorded.
- * @param context the context for this log message (for example, the component
- * that is generating this message).
- * @param e the exception that is to be logged; the message is
- * not logged if this parameter is null
- * @param message the individual parts of the log message; the message is
- * not logged if this parameter is null
- */
- public static void log(int msgLevel, String context, Throwable e, Object message) {
- if (!isMessageToBeRecorded(context, msgLevel)) {
- return;
- }
- logListener.log(msgLevel, context, e, message);
- }
-
- public static void setLogListener(LogListener listener) {
- logListener.shutdown();
- if (listener != null) {
- logListener = listener;
- }
- else {
- logListener = new JavaLogWriter();
- }
- }
-
- /**
- * Utility method to identify whether a log message with the specified
- * context and level will be recorded in the LogManager's destinations.
- * @param context
- * @param msgLevel
- * @return true if the message would be recorded if sent to the LogManager,
- * or false if it would be discarded by the LogManager.
- */
- public static boolean isMessageToBeRecorded(String context, int msgLevel) {
- if (logListener != null) {
- return logListener.isEnabled(context, msgLevel);
- }
- return true;
- }
-
- private static void logMessage(int level, String context, Object ... msgParts) {
- if (msgParts == null || msgParts.length == 0 || !isMessageToBeRecorded(context, level)) {
- return;
- }
- logListener.log(level, context, new LogMessage(msgParts));
- }
-
-
- /**
- * Create a logging proxy, that logs at entry and exit points of the method calls on the provided interfaces.
- */
- public static Object createLoggingProxy(final String loggingContext,
- final Object instance,
- final Class<?>[] interfaces,
- final int level) {
- return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), interfaces, new LoggingProxy(instance, loggingContext, level));
- }
-}
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/LogMessage.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/LogMessage.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/LogMessage.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,62 +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 com.metamatrix.common.log;
-
-import java.io.Serializable;
-
-
-public class LogMessage implements Serializable{
-
- private Object[] msgParts;
-
- public LogMessage(Object[] msgParts) {
- this.msgParts = msgParts;
- }
-
- public Object[] getMessageParts() {
- return this.msgParts;
- }
-
- public String getText() {
- StringBuffer text = null;
- if(msgParts != null) {
- text = new StringBuffer();
- for(int i=0; i<msgParts.length; i++) {
- if (i>0) text.append(" "); //$NON-NLS-1$
- Object omsg = msgParts[i];
- if ( omsg != null ) {
- text.append(omsg.toString());
- }
- }
- }
-
- if (text == null) {
- return "NULL"; //$NON-NLS-1$
- }
- return text.toString();
- }
-
- public String toString() {
- return getText();
- }
-}
Deleted: trunk/engine/src/main/java/com/metamatrix/common/log/MessageLevel.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/common/log/MessageLevel.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/common/log/MessageLevel.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,230 +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 com.metamatrix.common.log;
-
-import java.util.*;
-
-/**
- * Constants that define the level of the messages that are to be recorded
- * by the LogManager.
- */
-public final class MessageLevel {
-
- /**
- * Message level value that specifies that no messages are to be recorded.
- */
- public static final int NONE = 0;
-
- /**
- * Message level value that specifies that critical messages are to be recorded.
- */
- public static final int CRITICAL = 1;
-
- /**
- * Message level value that specifies that error messages and critical
- * messages are to be recorded.
- */
- public static final int ERROR = 2;
-
- /**
- * Message level value that specifies that warning, error and critical
- * messages are to be recorded.
- */
- public static final int WARNING = 3;
-
- /**
- * Message level value that specifies that information, warning, error and critical
- * messages are to be recorded.
- */
- public static final int INFO = 4;
-
- /**
- * Message level value that specifies that detailed, information, warning, error and critical
- * messages are to be recorded.
- */
- public static final int DETAIL = 5;
-
- /**
- * Message level value that specifies that all messages are to be recorded.
- */
- public static final int TRACE = 6;
-
-
- /**
- * The default message level is WARNING.
- */
- public static final int DEFAULT_MESSAGE_LEVEL = WARNING;
-
- private static final int MINIMUM = NONE;
- private static final int MAXIMUM = TRACE;
-
- /**
- * Constants that define the types of the messages that are to be recorded
- * by the LogManager.
- */
- public static class Labels {
- public static final String CRITICAL = "CRITICAL"; //$NON-NLS-1$
- public static final String ERROR = "ERROR"; //$NON-NLS-1$
- public static final String WARNING = "WARNING"; //$NON-NLS-1$
- public static final String INFO = "INFO"; //$NON-NLS-1$
- public static final String DETAIL = "DETAIL"; //$NON-NLS-1$
- public static final String TRACE = "TRACE"; //$NON-NLS-1$
- public static final String NONE = "NONE"; //$NON-NLS-1$
- static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$
- }
-
- /**
- * Constants that define the types of the messages that are to be recorded
- * by the LogManager.
- */
- public static class DisplayNames {
- public static final String CRITICAL = "Critical"; //$NON-NLS-1$
- public static final String ERROR = "Error"; //$NON-NLS-1$
- public static final String WARNING = "Warning"; //$NON-NLS-1$
- public static final String INFO = "Information"; //$NON-NLS-1$
- public static final String DETAIL = "Detail"; //$NON-NLS-1$
- public static final String TRACE = "Trace"; //$NON-NLS-1$
- public static final String NONE = "None"; //$NON-NLS-1$
- }
-
- private static Map LABEL_TO_LEVEL_MAP = new HashMap();
- private static Map DISPLAY_TO_LEVEL_MAP = new HashMap();
- private static List LABELS = new ArrayList(MAXIMUM - MINIMUM + 1);
- private static List DISPLAYS = new ArrayList(MAXIMUM - MINIMUM + 1);
-
- static {
- LABEL_TO_LEVEL_MAP.put(Labels.CRITICAL, new Integer(CRITICAL) );
- LABEL_TO_LEVEL_MAP.put(Labels.ERROR, new Integer(ERROR) );
- LABEL_TO_LEVEL_MAP.put(Labels.WARNING, new Integer(WARNING) );
- LABEL_TO_LEVEL_MAP.put(Labels.INFO, new Integer(INFO) );
- LABEL_TO_LEVEL_MAP.put(Labels.DETAIL, new Integer(DETAIL) );
- LABEL_TO_LEVEL_MAP.put(Labels.TRACE, new Integer(TRACE) );
- LABEL_TO_LEVEL_MAP.put(Labels.NONE, new Integer(NONE) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.CRITICAL, new Integer(CRITICAL) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.ERROR, new Integer(ERROR) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.WARNING, new Integer(WARNING) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.INFO, new Integer(INFO) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.DETAIL, new Integer(DETAIL) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.TRACE, new Integer(TRACE) );
- DISPLAY_TO_LEVEL_MAP.put(DisplayNames.NONE, new Integer(NONE) );
-
- // Do in the correct order so that the indexes match the levels
- LABELS.add(Labels.NONE);
- LABELS.add(Labels.CRITICAL);
- LABELS.add(Labels.ERROR);
- LABELS.add(Labels.WARNING);
- LABELS.add(Labels.INFO);
- LABELS.add(Labels.DETAIL);
- LABELS.add(Labels.TRACE);
- DISPLAYS.add(DisplayNames.NONE);
- DISPLAYS.add(DisplayNames.CRITICAL);
- DISPLAYS.add(DisplayNames.ERROR);
- DISPLAYS.add(DisplayNames.WARNING);
- DISPLAYS.add(DisplayNames.INFO);
- DISPLAYS.add(DisplayNames.DETAIL);
- DISPLAYS.add(DisplayNames.TRACE);
- }
-
- /**
- * Utility method to set the level of messages that are recorded for this VM.
- * @param newMessageLevel the new level; must be either
- * <code>MessageLevel.NONE</code>,
- * <code>MessageLevel.CRITICAL</code>,
- * <code>MessageLevel.ERROR</code>,
- * <code>MessageLevel.WARNING</code>,
- * <code>MessageLevel.INFO</code>,
- * <code>MessageLevel.DETAIL</code>, or
- * <code>MessageLevel.TRACE.
- * @throws IllegalArgumentException if the level is out of range.
- */
- public static boolean isMessageLevelValid( int newMessageLevel ) {
- return !( newMessageLevel < MessageLevel.NONE || newMessageLevel > MessageLevel.TRACE );
- }
-
- /**
- * Utility method for knowing what is the lower boundary for
- * a valid message level.
- * @return int message level
- * @see #validUpperMessageLevel
- */
- public static int getValidLowerMessageLevel() {
- return MessageLevel.NONE;
- }
-
- /**
- * Utility method for knowing what is the upper boundary for
- * a valid message level.
- * @return int message level
- * @see #validLowerMessageLevel
- */
- public static int getValidUpperMessageLevel() {
- return MessageLevel.TRACE;
- }
-
- public static String getLabelForLevel( int level ) {
- switch ( level ) {
- case MessageLevel.NONE:
- return Labels.NONE;
- case MessageLevel.CRITICAL:
- return Labels.CRITICAL;
- case MessageLevel.ERROR:
- return Labels.ERROR;
- case MessageLevel.WARNING:
- return Labels.WARNING;
- case MessageLevel.INFO:
- return Labels.INFO;
- case MessageLevel.DETAIL:
- return Labels.DETAIL;
- case MessageLevel.TRACE:
- return Labels.TRACE;
- }
- return Labels.UNKNOWN;
- //throw new IllegalArgumentException("The specified message level \"" + level + "\" is invalid");
- }
-
- public static int getMinimumLevel() {
- return MINIMUM;
- }
-
- public static int getMaximumLevel() {
- return MAXIMUM;
- }
-
- public static Collection getDisplayNames() {
- return DISPLAYS;
- }
-
-
- /**
- * Utility method to get the labels for the levels, starting with the lowest
- * level and ending with the highest level.
- * @return an ordered list of String labels
- */
- public static List getLabels() {
- return LABELS;
- }
-
-
-
-}
-
Modified: trunk/engine/src/main/java/com/metamatrix/query/analysis/AnalysisRecord.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/analysis/AnalysisRecord.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/analysis/AnalysisRecord.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -33,10 +33,10 @@
import org.teiid.client.plan.Annotation;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.sql.LanguageObject;
import com.metamatrix.query.sql.lang.SubqueryContainer;
Modified: trunk/engine/src/main/java/com/metamatrix/query/function/FunctionTree.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/function/FunctionTree.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/function/FunctionTree.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -35,8 +35,9 @@
import java.util.Map;
import java.util.Set;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.core.MetaMatrixRuntimeException;
import com.metamatrix.core.util.Assertion;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/BasicSourceCapabilities.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/BasicSourceCapabilities.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/BasicSourceCapabilities.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -41,7 +41,7 @@
}
/**
- * @see com.metamatrix.server.datatier.ConnectorCapabilities#supportsCapability(java.lang.String)
+ * @see org.teiid.resource.cci.server.datatier.ConnectorCapabilities#supportsCapability(java.lang.String)
*/
public boolean supportsCapability(Capability capability) {
Boolean supports = (Boolean) capabilityMap.get(capability);
@@ -49,7 +49,7 @@
}
/**
- * @see com.metamatrix.server.datatier.ConnectorCapabilities#supportsFunction(java.lang.String)
+ * @see org.teiid.resource.cci.server.datatier.ConnectorCapabilities#supportsFunction(java.lang.String)
*/
public boolean supportsFunction(String functionName) {
Boolean supports = (Boolean) functionMap.get(functionName);
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,6 +34,8 @@
import org.teiid.client.plan.Annotation;
import org.teiid.client.plan.Annotation.Priority;
import org.teiid.dqp.internal.process.Request;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
@@ -41,8 +43,6 @@
import com.metamatrix.api.exception.query.QueryParserException;
import com.metamatrix.api.exception.query.QueryPlannerException;
import com.metamatrix.api.exception.query.QueryResolverException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.id.IDGenerator;
import com.metamatrix.query.QueryPlugin;
import com.metamatrix.query.analysis.AnalysisRecord;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/CapabilitiesUtil.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/CapabilitiesUtil.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/CapabilitiesUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,8 +27,8 @@
import java.util.Iterator;
import java.util.List;
-import org.teiid.connector.api.ConnectorCapabilities.SupportedJoinCriteria;
import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.resource.cci.ConnectorCapabilities.SupportedJoinCriteria;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/NewCalculateCostUtil.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/NewCalculateCostUtil.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/NewCalculateCostUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,11 +34,12 @@
import java.util.List;
import java.util.Map;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
import com.metamatrix.common.buffer.BufferManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.QueryPlugin;
import com.metamatrix.query.metadata.QueryMetadataInterface;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCopyCriteria.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCopyCriteria.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCopyCriteria.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -32,10 +32,11 @@
import java.util.Map;
import java.util.Set;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryPlannerException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.optimizer.capabilities.CapabilitiesFinder;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePlanJoins.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePlanJoins.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePlanJoins.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -33,7 +33,7 @@
import java.util.Map;
import java.util.Set;
-import org.teiid.connector.api.ConnectorCapabilities.SupportedJoinCriteria;
+import org.teiid.resource.cci.ConnectorCapabilities.SupportedJoinCriteria;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,7 +28,7 @@
import java.util.List;
import java.util.Set;
-import org.teiid.connector.api.ConnectorCapabilities.SupportedJoinCriteria;
+import org.teiid.resource.cci.ConnectorCapabilities.SupportedJoinCriteria;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/xml/XMLPlanner.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/xml/XMLPlanner.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/xml/XMLPlanner.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,11 +27,12 @@
import java.util.Iterator;
import java.util.List;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
import com.metamatrix.api.exception.query.QueryPlannerException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.id.IDGenerator;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.execution.QueryExecPlugin;
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/QueryProcessor.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/QueryProcessor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,7 +24,10 @@
import java.util.List;
-import org.teiid.connector.api.DataNotAvailableException;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.resource.cci.DataNotAvailableException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixException;
@@ -34,9 +37,6 @@
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.BufferManager.BufferReserveMode;
import com.metamatrix.common.buffer.BufferManager.TupleSourceType;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.MetaMatrixRuntimeException;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.query.execution.QueryExecPlugin;
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/proc/AssignmentInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/proc/AssignmentInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/proc/AssignmentInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,12 +27,12 @@
import java.util.Arrays;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.processor.program.ProgramInstruction;
import com.metamatrix.query.sql.symbol.ElementSymbol;
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ErrorInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ErrorInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ErrorInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,10 +26,10 @@
import org.teiid.client.ProcedureErrorInstructionException;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.processor.program.ProgramInstruction;
import com.metamatrix.query.sql.symbol.Expression;
@@ -76,7 +76,7 @@
public void process(ProcedurePlan env) throws MetaMatrixComponentException,
MetaMatrixProcessingException {
Object value = env.evaluateExpression(expression);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP,
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP,
new Object[] {"Processing RaiseErrorInstruction with the value :", value}); //$NON-NLS-1$
throw new ProcedureErrorInstructionException(ERROR_PREFIX + (value != null ? value.toString() : "")); //$NON-NLS-1$
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ExecDynamicSqlInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ExecDynamicSqlInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ExecDynamicSqlInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -33,12 +33,12 @@
import org.teiid.client.plan.PlanNode;
import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.api.exception.query.QueryProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.core.id.IDGenerator;
import com.metamatrix.query.analysis.AnalysisRecord;
@@ -133,7 +133,7 @@
.getString("ExecDynamicSqlInstruction.0")); //$NON-NLS-1$
}
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP,
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP,
new Object[] { "Executing dynamic sql ", value }); //$NON-NLS-1$
Command command = QueryParser.getQueryParser().parseCommand(value.toString());
@@ -230,7 +230,7 @@
for (SetClause setClause : dynamicCommand.getUsing().getClauses()) {
Object assignment = procEnv.evaluateExpression(setClause.getValue());
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP,
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP,
new Object[] { this, " The using variable ", //$NON-NLS-1$
setClause.getSymbol(), " has value :", assignment }); //$NON-NLS-1$
localContext.setValue(setClause.getSymbol(), assignment);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/proc/IfInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/proc/IfInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/proc/IfInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,11 +25,11 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.processor.program.Program;
import com.metamatrix.query.processor.program.ProgramInstruction;
import com.metamatrix.query.sql.lang.Criteria;
@@ -91,13 +91,13 @@
boolean evalValue = procEnv.evaluateCriteria(condition);
if(evalValue) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[]{"IFInstruction: "+ //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, new Object[]{"IFInstruction: "+ //$NON-NLS-1$
" The criteria on the if block evaluated to true, processing the if block"}); //$NON-NLS-1$
//push the "if" Program onto the stack
procEnv.push(ifProgram);
} else if(elseProgram != null) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[]{"IFInstruction: "+ //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, new Object[]{"IFInstruction: "+ //$NON-NLS-1$
" The criteria on the if block evaluated to false, processing the else block"}); //$NON-NLS-1$
//push the "else" Program onto the stack
procEnv.push(elseProgram);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ProcedurePlan.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ProcedurePlan.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/proc/ProcedurePlan.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -36,6 +36,7 @@
import java.util.Stack;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
@@ -45,7 +46,6 @@
import com.metamatrix.common.buffer.IndexedTupleSource;
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.TupleSource;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.metadata.QueryMetadataInterface;
@@ -173,7 +173,7 @@
originalProgram.resetProgramCounter();
programs.clear();
programs.push(originalProgram);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "ProcedurePlan reset"); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "ProcedurePlan reset"); //$NON-NLS-1$
}
public ProcessorDataManager getDataManager() {
@@ -272,23 +272,23 @@
Program program = peek();
inst = program.getCurrentInstruction();
if (inst == null){
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Finished program", program); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Finished program", program); //$NON-NLS-1$
this.pop();
continue;
}
if (inst instanceof RepeatedInstruction) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Executing repeated instruction", inst); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Executing repeated instruction", inst); //$NON-NLS-1$
RepeatedInstruction loop = (RepeatedInstruction)inst;
if (loop.testCondition(this)) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Passed condition, executing program " + loop.getNestedProgram()); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Passed condition, executing program " + loop.getNestedProgram()); //$NON-NLS-1$
inst.process(this);
this.push(loop.getNestedProgram());
continue;
}
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Exiting repeated instruction", inst); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Exiting repeated instruction", inst); //$NON-NLS-1$
loop.postInstruction(this);
} else {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Executing instruction", inst); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Executing instruction", inst); //$NON-NLS-1$
inst.process(this);
}
program.incrementProgramCounter();
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,12 +27,12 @@
import java.util.List;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.TupleBatch;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.processor.ProcessorPlan;
import com.metamatrix.query.sql.util.VariableContext;
import com.metamatrix.query.util.CommandContext;
@@ -141,7 +141,7 @@
try {
plan.close();
} catch (MetaMatrixComponentException e1){
- LogManager.logDetail(com.metamatrix.common.log.LogConstants.CTX_DQP, e1, "Error closing processor"); //$NON-NLS-1$
+ LogManager.logDetail(org.teiid.logging.LogConstants.CTX_DQP, e1, "Error closing processor"); //$NON-NLS-1$
}
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,14 +31,14 @@
import java.util.Map;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.BufferManager;
import com.metamatrix.common.buffer.TupleBatch;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.processor.ProcessorDataManager;
@@ -385,7 +385,7 @@
* @param batch Batch being sent
*/
private void recordBatch(TupleBatch batch) {
- if (!this.context.getProcessDebug() || !LogManager.isMessageToBeRecorded(com.metamatrix.common.log.LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
+ if (!this.context.getProcessDebug() || !LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
return;
}
// Print summary
@@ -401,7 +401,7 @@
for (int row = batch.getBeginRow(); row <= batch.getEndRow(); row++) {
str.append("\t").append(row).append(": ").append(batch.getTuple(row)).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
- LogManager.logDetail(com.metamatrix.common.log.LogConstants.CTX_DQP, str.toString());
+ LogManager.logDetail(org.teiid.logging.LogConstants.CTX_DQP, str.toString());
}
// =========================================================================
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/SortUtility.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/SortUtility.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/SortUtility.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,6 +29,9 @@
import java.util.ListIterator;
import java.util.TreeSet;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
@@ -38,8 +41,6 @@
import com.metamatrix.common.buffer.TupleSource;
import com.metamatrix.common.buffer.BufferManager.BufferReserveMode;
import com.metamatrix.common.buffer.BufferManager.TupleSourceType;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.query.sql.lang.OrderBy;
import com.metamatrix.query.sql.symbol.SingleElementSymbol;
@@ -261,8 +262,8 @@
bufferManager.releaseBuffers(release);
reserved -= release;
try {
- if (LogManager.isMessageToBeRecorded(com.metamatrix.common.log.LogConstants.CTX_DQP, MessageLevel.TRACE)) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, "Merging", maxSortIndex, "sublists out of", activeTupleBuffers.size()); //$NON-NLS-1$ //$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_DQP, MessageLevel.TRACE)) {
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, "Merging", maxSortIndex, "sublists out of", activeTupleBuffers.size()); //$NON-NLS-1$ //$NON-NLS-2$
}
// initialize the sublists with the min value
for(int i = 0; i<maxSortIndex; i++) {
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AbortProcessingInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AbortProcessingInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AbortProcessingInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,11 +23,11 @@
package com.metamatrix.query.processor.xml;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.util.ErrorMessageKeys;
@@ -59,7 +59,7 @@
public XMLContext process(XMLProcessorEnvironment env, XMLContext context)
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException{
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, "ABORT processing now."); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, "ABORT processing now."); //$NON-NLS-1$
throw new MetaMatrixComponentException(DEFAULT_MESSAGE);
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddCommentInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddCommentInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddCommentInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,12 +25,12 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
/**
* Adds a comment to an element of the document in progress
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddNodeInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddNodeInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/AddNodeInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,11 +30,11 @@
import java.util.Properties;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.sql.symbol.ElementSymbol;
@@ -97,15 +97,15 @@
if (defaultValue != null){
if(isElement) {
success = doc.addElement(descriptor, defaultValue);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"fixed value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"fixed value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
} else {
success = doc.addAttribute(descriptor, defaultValue);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"fixed value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"fixed value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
if(isElement) {
success = doc.addElement(descriptor, nillableDescriptor);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName()}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName()}); //$NON-NLS-1$
} //else nothing gets outputted for attribute with no content
}
} else {
@@ -115,24 +115,24 @@
if (valueStr != null){
if(isElement) {
success = doc.addElement(descriptor, valueStr);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"value",valueStr}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"value",valueStr}); //$NON-NLS-1$ //$NON-NLS-2$
} else {
success = doc.addAttribute(descriptor, valueStr);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"value",valueStr}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"value",valueStr}); //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
if (defaultValue != null){
if(isElement) {
success = doc.addElement(descriptor, defaultValue);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"default value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"default value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
} else {
success = doc.addAttribute(descriptor, defaultValue);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"default value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG attr",descriptor.getName(),"default value",defaultValue}); //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
if(isElement) {
success = doc.addElement(descriptor, nillableDescriptor);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"no value"}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"TAG elem",descriptor.getName(),"no value"}); //$NON-NLS-1$ //$NON-NLS-2$
} //else nothing gets outputted for attribute with no content
}
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndBlockInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndBlockInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndBlockInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,11 +25,11 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
/**
* <p>This instruction closes a result set, which closes and removes the TupleSource
@@ -66,7 +66,7 @@
context.removeResultSet(resultSetName);
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{CLOSE_FINISHED,resultSetName});
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{CLOSE_FINISHED,resultSetName});
env.incrementCurrentProgramCounter();
return context;
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndDocumentInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndDocumentInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/EndDocumentInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,11 +23,11 @@
package com.metamatrix.query.processor.xml;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
/**
* This instruction marks the current document in progress as
@@ -52,7 +52,7 @@
// program stack (don't want to start a new doc in the middle of
// recursive processing)
if (!env.isRecursiveProgramInStack()) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, "ending document"); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, "ending document"); //$NON-NLS-1$
env.getDocumentInProgress().markAsFinished();
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecSqlInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecSqlInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecSqlInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,11 +25,11 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.mapping.xml.ResultSetInfo;
/**
@@ -48,7 +48,7 @@
public XMLContext process(XMLProcessorEnvironment env, XMLContext context)
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException{
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"SQL: Result set DOESN'T exist:",resultSetName}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"SQL: Result set DOESN'T exist:",resultSetName}); //$NON-NLS-1$
PlanExecutor executor = context.getResultExecutor(resultSetName);
if (executor == null) {
executor = env.createResultExecutor(resultSetName, info);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecStagingTableInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecStagingTableInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/ExecStagingTableInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,11 +27,11 @@
import java.util.Map;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.mapping.xml.ResultSetInfo;
@@ -61,7 +61,7 @@
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException {
if (!env.isStagingTableLoaded(this.resultSetName)) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"SQL: Result set DOESN'T exist:",resultSetName}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"SQL: Result set DOESN'T exist:",resultSetName}); //$NON-NLS-1$
PlanExecutor executor = context.getResultExecutor(resultSetName);
if (executor == null) {
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/IfInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/IfInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/IfInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,11 +28,11 @@
import java.util.List;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
/**
* <p>This instruction holds a List of Criteria, and for each Criteria there is a
@@ -196,7 +196,7 @@
Program thenProgram = condition.getThenProgram();
env.pushProgram(thenProgram, condition.isProgramRecursive());
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"IF: true condition", condition, "- then program:", thenProgram}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"IF: true condition", condition, "- then program:", thenProgram}); //$NON-NLS-1$ //$NON-NLS-2$
}
return context;
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/InitializeDocumentInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/InitializeDocumentInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/InitializeDocumentInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,11 +25,11 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.mapping.xml.MappingNodeConstants;
import com.metamatrix.query.util.XMLFormatConstants;
@@ -78,7 +78,7 @@
public XMLContext process(XMLProcessorEnvironment env, XMLContext context)
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException{
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, "DOC begin"); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, "DOC begin"); //$NON-NLS-1$
// Only process this instruction if there are no recursive programs in the
// program stack (don't want to start a new doc in the middle of
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveCursorInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveCursorInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveCursorInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,11 +25,11 @@
import static com.metamatrix.query.analysis.AnalysisRecord.*;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
/**
*/
@@ -52,7 +52,7 @@
public XMLContext process(XMLProcessorEnvironment env, XMLContext context)
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"NEXT", resultSetName}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"NEXT", resultSetName}); //$NON-NLS-1$
context.getNextRow(resultSetName);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveDocInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveDocInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/MoveDocInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,12 +23,12 @@
package com.metamatrix.query.processor.xml;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import org.xml.sax.SAXException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.util.ErrorMessageKeys;
@@ -59,7 +59,7 @@
switch(this.direction) {
case UP:
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, "UP in document"); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, "UP in document"); //$NON-NLS-1$
try {
doc.moveToParent();
} catch (SAXException err) {
@@ -67,7 +67,7 @@
}
break;
case DOWN:
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, "LAST child in document"); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, "LAST child in document"); //$NON-NLS-1$
doc.moveToLastChild();
break;
default:
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/RelationalPlanExecutor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/RelationalPlanExecutor.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/RelationalPlanExecutor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,12 +25,13 @@
import java.util.List;
import java.util.Map;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.BufferManager;
import com.metamatrix.common.buffer.IndexedTupleSource;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.mapping.xml.ResultSetInfo;
import com.metamatrix.query.processor.BatchIterator;
@@ -153,7 +154,7 @@
*/
public void close() throws MetaMatrixComponentException {
this.internalProcessor.closeProcessing();
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"closed executor", resultInfo.getResultSetName()}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"closed executor", resultInfo.getResultSetName()}); //$NON-NLS-1$
}
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/SAXDocumentInProgress.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/SAXDocumentInProgress.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/SAXDocumentInProgress.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -33,12 +33,12 @@
import net.sf.saxon.TransformerFactoryImpl;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.xml.sax.SAXException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.common.buffer.FileStore;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.query.mapping.xml.MappingNodeConstants;
/**
@@ -154,7 +154,7 @@
return true;
}
} catch (SAXException e) {
- LogManager.logError(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, e, e.getMessage());
+ LogManager.logError(org.teiid.logging.LogConstants.CTX_XML_PLAN, e, e.getMessage());
return false;
}
showState( "addElement(2) - BOT" ); //$NON-NLS-1$
@@ -323,19 +323,19 @@
private void showState( String sOccasion ) {
- if (LogManager.isMessageToBeRecorded(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, MessageLevel.TRACE)) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"\n [showState] State Vars at: " + sOccasion} ); //$NON-NLS-1$
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent: " + currentParent} ); //$NON-NLS-1$
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentObject: " + currentObject} ); //$NON-NLS-1$
+ if (LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_XML_PLAN, MessageLevel.TRACE)) {
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"\n [showState] State Vars at: " + sOccasion} ); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent: " + currentParent} ); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentObject: " + currentObject} ); //$NON-NLS-1$
if ( currentObject != null ) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentObject.getNillableDescriptor(): " + currentObject.getNillableDescriptor()}); //$NON-NLS-1$
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] workingElements: " + currentObject.getChildren()}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentObject.getNillableDescriptor(): " + currentObject.getNillableDescriptor()}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] workingElements: " + currentObject.getChildren()}); //$NON-NLS-1$
}
if ( currentParent != null ) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent.getParent(): " + currentParent.getParent()}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent.getParent(): " + currentParent.getParent()}); //$NON-NLS-1$
} else {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent.getParent(): is NULL "}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"[showState] currentParent.getParent(): is NULL "}); //$NON-NLS-1$
}
}
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/WhileInstruction.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/WhileInstruction.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/WhileInstruction.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,11 +28,11 @@
import java.util.Map;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.util.VariableContext;
@@ -72,7 +72,7 @@
setFirst(context.getVariableContext(), Boolean.TRUE);
}
else {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"WHILE removed finished result set:",resultSetName}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"WHILE removed finished result set:",resultSetName}); //$NON-NLS-1$
//increment the current program counter, so this
//While instruction will not be executed again
@@ -100,7 +100,7 @@
protected void pushProgram(XMLProcessorEnvironment env,
XMLContext context,
List row) throws MetaMatrixComponentException {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"WHILE repeating for result set:",resultSetName,", block program:", blockProgram}); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"WHILE repeating for result set:",resultSetName,", block program:", blockProgram}); //$NON-NLS-1$ //$NON-NLS-2$
context.setVariableValues(resultSetName, row);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLPlan.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLPlan.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLPlan.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -43,6 +43,8 @@
import javax.xml.parsers.SAXParserFactory;
import org.teiid.client.plan.PlanNode;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
@@ -58,8 +60,6 @@
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.BufferManager;
import com.metamatrix.common.buffer.TupleBatch;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.common.types.XMLType;
import com.metamatrix.query.analysis.AnalysisRecord;
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLProcessorEnvironment.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLProcessorEnvironment.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/xml/XMLProcessorEnvironment.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,10 +28,11 @@
import java.util.LinkedList;
import java.util.Set;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.common.buffer.BufferManager;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.query.mapping.xml.ResultSetInfo;
import com.metamatrix.query.processor.ProcessorDataManager;
import com.metamatrix.query.processor.ProcessorPlan;
@@ -70,7 +71,7 @@
}
/**
- * @see ProcessorEnvironment#initialize(XMLPlan)
+ * @see ProcessorEnvironment#start()
*/
public void initialize(CommandContext context, ProcessorDataManager dataMgr, BufferManager bufferMgr) {
this.dataMgr = dataMgr;
@@ -134,8 +135,8 @@
while (this.programStack.size() > 1 &&
programState.programCounter >= programState.program.getProcessorInstructions().size()) {
this.programStack.removeFirst();
- if(LogManager.isMessageToBeRecorded(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, MessageLevel.TRACE)) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"Processor Environment popped program w/ recursion count " + programState.recursionCount, "; " + this.programStack.size(), " programs left."}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if(LogManager.isMessageToBeRecorded(org.teiid.logging.LogConstants.CTX_XML_PLAN, MessageLevel.TRACE)) {
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"Processor Environment popped program w/ recursion count " + programState.recursionCount, "; " + this.programStack.size(), " programs left."}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
programState = this.programStack.getFirst();
}
@@ -159,10 +160,10 @@
} else {
programState.recursionCount = ProgramState.NOT_RECURSIVE + 1;
}
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"Pushed recursive program w/ recursion count " + programState.recursionCount}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"Pushed recursive program w/ recursion count " + programState.recursionCount}); //$NON-NLS-1$
} else {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_XML_PLAN, new Object[]{"Pushed non-recursive program w/ recursion count " + programState.recursionCount}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_XML_PLAN, new Object[]{"Pushed non-recursive program w/ recursion count " + programState.recursionCount}); //$NON-NLS-1$
}
this.programStack.addFirst(programState);
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/resolver/QueryResolver.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/resolver/QueryResolver.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,10 +29,11 @@
import java.util.List;
import java.util.Map;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
import com.metamatrix.api.exception.query.QueryResolverException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.analysis.AnalysisRecord;
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.metadata.TempMetadataAdapter;
@@ -131,7 +132,7 @@
AnalysisRecord analysis, boolean resolveNullLiterals)
throws QueryResolverException, MetaMatrixComponentException {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving command", currentCommand}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving command", currentCommand}); //$NON-NLS-1$
TempMetadataAdapter resolverMetadata = null;
try {
Modified: trunk/engine/src/main/java/com/metamatrix/query/resolver/command/UpdateProcedureResolver.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/resolver/command/UpdateProcedureResolver.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/com/metamatrix/query/resolver/command/UpdateProcedureResolver.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,12 +30,13 @@
import java.util.List;
import java.util.Map;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
import com.metamatrix.api.exception.query.QueryParserException;
import com.metamatrix.api.exception.query.QueryResolverException;
import com.metamatrix.api.exception.query.UnresolvedSymbolDescription;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.QueryPlugin;
import com.metamatrix.query.analysis.AnalysisRecord;
@@ -170,7 +171,7 @@
private void resolveBlock(CreateUpdateProcedureCommand command, Block block, GroupContext externalGroups,
TempMetadataAdapter metadata, boolean isUpdateProcedure, AnalysisRecord analysis)
throws QueryResolverException, QueryMetadataException, MetaMatrixComponentException {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving block", block}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving block", block}); //$NON-NLS-1$
//create a new variable and metadata context for this block so that discovered metadata is not visible else where
TempMetadataStore store = new TempMetadataStore(new HashMap(metadata.getMetadataStore().getData()));
@@ -188,7 +189,7 @@
private void resolveStatement(CreateUpdateProcedureCommand command, Statement statement, GroupContext externalGroups, GroupSymbol variables, TempMetadataAdapter metadata, boolean isUpdateProcedure, AnalysisRecord analysis)
throws QueryResolverException, QueryMetadataException, MetaMatrixComponentException {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving statement", statement}); //$NON-NLS-1$
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_QUERY_RESOLVER, new Object[]{"Resolving statement", statement}); //$NON-NLS-1$
switch(statement.getType()) {
case Statement.TYPE_IF:
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/cache/DQPContextCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/cache/DQPContextCache.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/cache/DQPContextCache.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,12 +23,13 @@
import java.io.Serializable;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.cache.Cache;
import com.metamatrix.cache.CacheConfiguration;
import com.metamatrix.cache.CacheFactory;
import com.metamatrix.cache.CacheConfiguration.Policy;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
public class DQPContextCache implements Serializable{
private static final long serialVersionUID = 6958846566556640186L;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/CapabilitiesConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/CapabilitiesConverter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/CapabilitiesConverter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,7 +25,7 @@
import java.util.Iterator;
import java.util.List;
-import org.teiid.connector.api.ConnectorCapabilities;
+import org.teiid.resource.cci.ConnectorCapabilities;
import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.SourceCapabilities;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,25 +34,24 @@
import javax.naming.InitialContext;
import javax.naming.NamingException;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.basic.WrappedConnection;
import org.teiid.connector.metadata.runtime.Datatype;
import org.teiid.connector.metadata.runtime.MetadataFactory;
import org.teiid.connector.metadata.runtime.MetadataStore;
import org.teiid.dqp.internal.cache.DQPContextCache;
import org.teiid.dqp.internal.datamgr.impl.ConnectorWorkItem.PermitMode;
import org.teiid.dqp.internal.process.AbstractWorkItem;
-import org.teiid.logging.api.CommandLogMessage;
-import org.teiid.logging.api.CommandLogMessage.Event;
+import org.teiid.logging.CommandLogMessage;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.logging.CommandLogMessage.Event;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ExecutionFactory;
+import org.teiid.resource.cci.MetadataProvider;
import com.metamatrix.common.buffer.BlockedException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.util.Assertion;
import com.metamatrix.dqp.DQPPlugin;
import com.metamatrix.dqp.message.AtomicRequestID;
@@ -64,17 +63,15 @@
import com.metamatrix.query.sql.lang.Command;
/**
- * The <code>ConnectorManager</code> manages a {@link org.teiid.connector.basic.BasicConnector Connector}
+ * The <code>ConnectorManager</code> manages a {@link org.teiid.resource.adapter.BasicExecutionFactory Connector}
* and its associated workers' state.
*/
public class ConnectorManager {
public static final int DEFAULT_MAX_THREADS = 20;
- private String connectorName;
+ private String translatorName;
+ private String connectionName;
- // stateful connector supplied to the cm; does not do the lookup
- private Connector statefulConnector;
-
//services acquired in start
private BufferService bufferService;
@@ -84,29 +81,32 @@
private SourceCapabilities cachedCapabilities;
private int currentConnections;
- private int maxConnections;
+ private int maxConnections = DEFAULT_MAX_THREADS;
private LinkedList<ConnectorWorkItem> queuedRequests = new LinkedList<ConnectorWorkItem>();
private volatile boolean stopped;
- public ConnectorManager(String name) {
- this(name, DEFAULT_MAX_THREADS);
+
+ public ConnectorManager(String translatorName, String connectionName) {
+ this.translatorName = translatorName;
+ this.connectionName = connectionName;
}
-
- public ConnectorManager(String name, int maxThreads) {
- this(name, null, maxThreads);
- }
- public ConnectorManager(String name, Connector connector, int maxThreads) {
- if (name == null) {
- throw new IllegalArgumentException("Connector name can not be null"); //$NON-NLS-1$
+ public String getStausMessage() {
+ StringBuilder sb = new StringBuilder();
+ ExecutionFactory ef = getExecutionFactory();
+ if(ef != null) {
+ if (ef.isSourceRequired()) {
+ Object conn = getConnectionFactory();
+ if (conn == null) {
+ sb.append(DQPPlugin.Util.getString("datasource_not_found", this.connectionName)); //$NON-NLS-1$
+ }
+ }
}
- if (maxThreads <= 0) {
- maxThreads = DEFAULT_MAX_THREADS;
+ else {
+ sb.append(DQPPlugin.Util.getString("translator_not_found", this.translatorName)); //$NON-NLS-1$
}
- this.maxConnections = maxThreads;
- this.connectorName = name;
- this.statefulConnector = connector;
+ return sb.toString();
}
public synchronized void acquireConnectionLock(ConnectorWorkItem item) throws BlockedException {
@@ -123,25 +123,14 @@
throw BlockedException.INSTANCE;
}
}
+
- public String getName() {
- return this.connectorName;
- }
-
public MetadataStore getMetadata(String modelName, Map<String, Datatype> datatypes, Properties importProperties) throws ConnectorException {
-
MetadataFactory factory = new MetadataFactory(modelName, datatypes, importProperties);
-
- WrappedConnection conn = null;
- try {
- checkStatus();
- conn = (WrappedConnection)getConnector().getConnection();
- conn.getConnectorMetadata(factory);
- } finally {
- if (conn != null) {
- conn.close();
- }
- }
+ ExecutionFactory executionFactory = getExecutionFactory();
+ if (executionFactory instanceof MetadataProvider) {
+ ((MetadataProvider)executionFactory).getConnectorMetadata(factory, getConnectionFactory());
+ }
return factory.getMetadataStore();
}
@@ -149,31 +138,14 @@
if (cachedCapabilities != null) {
return cachedCapabilities;
}
- Connection conn = null;
- try {
- checkStatus();
- Connector connector = getConnector();
- ConnectorCapabilities caps = connector.getCapabilities();
- boolean global = true;
- if (caps == null) {
- conn = connector.getConnection();
- caps = conn.getCapabilities();
- global = false;
- }
-
- BasicSourceCapabilities resultCaps = CapabilitiesConverter.convertCapabilities(caps, getName(), connector.getConnectorEnvironment().isXaCapable());
- if (global) {
- resultCaps.setScope(Scope.SCOPE_GLOBAL);
- cachedCapabilities = resultCaps;
- } else {
- resultCaps.setScope(Scope.SCOPE_PER_USER);
- }
- return resultCaps;
- } finally {
- if ( conn != null ) {
- conn.close();
- }
- }
+
+ checkStatus();
+ ExecutionFactory connector = getExecutionFactory();
+ ConnectorCapabilities caps = connector.getCapabilities();
+ BasicSourceCapabilities resultCaps = CapabilitiesConverter.convertCapabilities(caps, this.translatorName, connector.isXaCapable());
+ resultCaps.setScope(Scope.SCOPE_GLOBAL);
+ cachedCapabilities = resultCaps;
+ return resultCaps;
}
public ConnectorWork executeRequest(AtomicRequestMessage message, AbstractWorkItem awi) throws ConnectorException {
@@ -223,7 +195,7 @@
* initialize this <code>ConnectorManager</code>.
*/
public void start() {
- LogManager.logDetail(LogConstants.CTX_CONNECTOR, DQPPlugin.Util.getString("ConnectorManagerImpl.Initializing_connector", connectorName)); //$NON-NLS-1$
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, DQPPlugin.Util.getString("ConnectorManagerImpl.Initializing_connector", translatorName)); //$NON-NLS-1$
}
/**
@@ -263,31 +235,43 @@
CommandLogMessage message = null;
if (cmdStatus == Event.NEW) {
- message = new CommandLogMessage(System.currentTimeMillis(), qr.getRequestID().toString(), id.getNodeID(), transactionID, modelName, connectorName, qr.getWorkContext().getSessionId(), principal, sqlStr, context);
+ message = new CommandLogMessage(System.currentTimeMillis(), qr.getRequestID().toString(), id.getNodeID(), transactionID, modelName, translatorName, qr.getWorkContext().getSessionId(), principal, sqlStr, context);
}
else {
- message = new CommandLogMessage(System.currentTimeMillis(), qr.getRequestID().toString(), id.getNodeID(), transactionID, modelName, connectorName, qr.getWorkContext().getSessionId(), principal, finalRowCnt, cmdStatus, context);
+ message = new CommandLogMessage(System.currentTimeMillis(), qr.getRequestID().toString(), id.getNodeID(), transactionID, modelName, translatorName, qr.getWorkContext().getSessionId(), principal, finalRowCnt, cmdStatus, context);
}
LogManager.log(MessageLevel.DETAIL, LogConstants.CTX_COMMANDLOGGING, message);
}
/**
- * Get the <code>Connector</code> object managed by this
- * manager.
- * @return the <code>Connector</code>.
+ * Get the <code>Translator</code> object managed by this manager.
+ * @return the <code>ExecutionFactory</code>.
*/
- Connector getConnector() throws ConnectorException {
- try {
- if (this.statefulConnector != null) {
- return this.statefulConnector;
- }
- InitialContext ic = new InitialContext();
- return (Connector)ic.lookup(this.connectorName);
+ protected ExecutionFactory getExecutionFactory() {
+ try {
+ InitialContext ic = new InitialContext();
+ return (ExecutionFactory)ic.lookup(this.translatorName);
} catch (NamingException e) {
- throw new ConnectorException(e, DQPPlugin.Util.getString("ConnectorManager.failed_to_lookup_connector", this.connectorName)); //$NON-NLS-1$
- }
+ }
+ return null;
}
+ /**
+ * Get the ConnectionFactory object required by this manager
+ * @return
+ */
+ protected Object getConnectionFactory() {
+ if (this.connectionName != null) {
+ try {
+ InitialContext ic = new InitialContext();
+ return ic.lookup(this.connectionName);
+ } catch (NamingException e) {
+ }
+ }
+ return null;
+ }
+
+
DQPContextCache getContextCache() {
if (bufferService != null) {
return bufferService.getContextCache();
@@ -297,7 +281,19 @@
private void checkStatus() throws ConnectorException {
if (stopped) {
- throw new ConnectorException(DQPPlugin.Util.getString("ConnectorManager.not_in_valid_state", this.connectorName)); //$NON-NLS-1$
+ throw new ConnectorException(DQPPlugin.Util.getString("ConnectorManager.not_in_valid_state", this.translatorName)); //$NON-NLS-1$
}
}
+
+ public void setMaxConnections(int value) {
+ this.maxConnections = value;
+ }
+
+ public String getTranslatorName() {
+ return this.translatorName;
+ }
+
+ public String getConnectionName() {
+ return this.connectionName;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWork.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWork.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWork.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,7 @@
package org.teiid.dqp.internal.datamgr.impl;
-import org.teiid.connector.api.ConnectorException;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.dqp.message.AtomicResultsMessage;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ConnectorWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,28 +28,26 @@
import java.util.concurrent.atomic.AtomicBoolean;
import org.teiid.adminapi.impl.VDBMetaData;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.Execution;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
import org.teiid.connector.language.Call;
import org.teiid.connector.language.QueryExpression;
import org.teiid.connector.metadata.runtime.RuntimeMetadata;
import org.teiid.dqp.internal.datamgr.language.LanguageBridgeFactory;
import org.teiid.dqp.internal.datamgr.metadata.RuntimeMetadataImpl;
import org.teiid.dqp.internal.process.AbstractWorkItem;
-import org.teiid.logging.api.CommandLogMessage.Event;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.CommandLogMessage.Event;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.Execution;
+import org.teiid.resource.cci.ExecutionFactory;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.UpdateExecution;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.TupleBuffer;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.common.types.TransformationException;
import com.metamatrix.core.util.Assertion;
@@ -74,14 +72,13 @@
private AtomicRequestID id;
private ConnectorManager manager;
private AtomicRequestMessage requestMsg;
- private Connector connector;
+ private ExecutionFactory connector;
private QueryMetadataInterface queryMetadata;
private PermitMode permitMode = PermitMode.NOT_ACQUIRED;
private AbstractWorkItem awi;
/* Created on new request */
- private Connection connection;
- private ConnectorEnvironment connectorEnv;
+ private Object connection;
private ExecutionContextImpl securityContext;
private volatile ResultSetExecution execution;
private ProcedureBatchHandler procedureBatchHandler;
@@ -97,7 +94,7 @@
private AtomicBoolean isCancelled = new AtomicBoolean();
- ConnectorWorkItem(AtomicRequestMessage message, AbstractWorkItem awi, ConnectorManager manager) throws ConnectorException {
+ ConnectorWorkItem(AtomicRequestMessage message, AbstractWorkItem awi, ConnectorManager manager) {
this.id = message.getAtomicRequestID();
this.requestMsg = message;
this.manager = manager;
@@ -115,13 +112,12 @@
this.securityContext.setBatchSize(this.requestMsg.getFetchSize());
this.securityContext.setContextCache(manager.getContextCache());
- this.connector = manager.getConnector();
- this.connectorEnv = connector.getConnectorEnvironment();
+ this.connector = manager.getExecutionFactory();
VDBMetaData vdb = requestMsg.getWorkContext().getVDB();
this.queryMetadata = vdb.getAttachment(QueryMetadataInterface.class);
this.queryMetadata = new TempMetadataAdapter(this.queryMetadata, new TempMetadataStore());
- if (requestMsg.isTransactional() && this.connectorEnv.isXaCapable()) {
+ if (requestMsg.isTransactional() && this.connector.isXaCapable()) {
this.securityContext.setTransactional(true);
}
this.awi = awi;
@@ -188,16 +184,11 @@
LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
} finally {
manager.removeState(this.id);
- if (connection != null) {
- try {
- connection.close();
- } catch (ConnectorException e) {
- LogManager.logWarning(LogConstants.CTX_CONNECTOR, e.getMessage());
- }
- LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
- }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
}
}
+
+
private ConnectorException handleError(Throwable t) {
if (t instanceof DataNotAvailableException) {
@@ -237,7 +228,7 @@
LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.requestMsg.getAtomicRequestID(), "Processing NEW request:", this.requestMsg.getCommand()}); //$NON-NLS-1$
try {
- this.connection = this.connector.getConnection();
+ this.connection = this.manager.getConnectionFactory();
// Translate the command
Command command = this.requestMsg.getCommand();
@@ -258,7 +249,7 @@
RuntimeMetadata rmd = new RuntimeMetadataImpl(queryMetadata);
// Create the execution based on mode
- final Execution exec = connection.createExecution(this.translatedCommand, this.securityContext, rmd);
+ final Execution exec = connector.createExecution(this.translatedCommand, this.securityContext, rmd, this.connection);
if (this.translatedCommand instanceof Call) {
Assertion.isInstanceOf(this.execution, ProcedureExecution.class, "IProcedure Executions are expected to be ProcedureExecutions"); //$NON-NLS-1$
this.execution = (ProcedureExecution)exec;
@@ -338,13 +329,13 @@
correctTypes(row);
rows.add(row);
// Check for max result rows exceeded
- if(this.connectorEnv.getMaxResultRows() > -1 && this.rowCount >= this.connectorEnv.getMaxResultRows()){
- if (this.rowCount == this.connectorEnv.getMaxResultRows() && !this.connectorEnv.isExceptionOnMaxRows()) {
- LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Exceeded max, returning", this.connectorEnv.getMaxResultRows()}); //$NON-NLS-1$
+ if(this.connector.getMaxResultRows() > -1 && this.rowCount >= this.connector.getMaxResultRows()){
+ if (this.rowCount == this.connector.getMaxResultRows() && !this.connector.isExceptionOnMaxRows()) {
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Exceeded max, returning", this.connector.getMaxResultRows()}); //$NON-NLS-1$
this.lastBatch = true;
break;
- } else if (this.rowCount > this.connectorEnv.getMaxResultRows() && this.connectorEnv.isExceptionOnMaxRows()) {
- String msg = DQPPlugin.Util.getString("ConnectorWorker.MaxResultRowsExceed", this.connectorEnv.getMaxResultRows()); //$NON-NLS-1$
+ } else if (this.rowCount > this.connector.getMaxResultRows() && this.connector.isExceptionOnMaxRows()) {
+ String msg = DQPPlugin.Util.getString("ConnectorWorker.MaxResultRowsExceed", this.connector.getMaxResultRows()); //$NON-NLS-1$
throw new ConnectorException(msg);
}
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ExecutionContextImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ExecutionContextImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ExecutionContextImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,10 +30,10 @@
import javax.security.auth.Subject;
-import org.teiid.connector.api.CacheScope;
-import org.teiid.connector.api.ExecutionContext;
import org.teiid.dqp.internal.cache.DQPContextCache;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.resource.cci.CacheScope;
+import org.teiid.resource.cci.ExecutionContext;
import com.metamatrix.cache.Cache;
import com.metamatrix.common.buffer.BufferManager;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ProcedureBatchHandler.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ProcedureBatchHandler.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/ProcedureBatchHandler.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,11 +30,11 @@
import java.util.Collections;
import java.util.List;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ProcedureExecution;
import org.teiid.connector.language.Argument;
import org.teiid.connector.language.Call;
import org.teiid.connector.language.Argument.Direction;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ProcedureExecution;
import com.metamatrix.dqp.DQPPlugin;
@@ -45,7 +45,7 @@
private int resultSetCols = 0;
private List filler;
- public ProcedureBatchHandler(Call proc, ProcedureExecution procExec) throws ConnectorException {
+ public ProcedureBatchHandler(Call proc, ProcedureExecution procExec) {
this.proc = proc;
this.procExec = procExec;
List<Argument> params = proc.getArguments();
Added: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/TranslatorRepository.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/TranslatorRepository.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/TranslatorRepository.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,60 @@
+/*
+ * 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.dqp.internal.datamgr.impl;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.teiid.resource.cci.ExecutionFactory;
+
+
+public class TranslatorRepository implements Serializable{
+
+ private static final long serialVersionUID = -1212280886010974273L;
+ private Map<String, ExecutionFactory> translatorRepo = new ConcurrentHashMap<String, ExecutionFactory>();
+
+ public void addTranslator(String name, ExecutionFactory t) {
+// try {
+// InitialContext ic = new InitialContext();
+// ic.bind(name, t);
+// } catch (NamingException e) {
+// LogManager.logError(LogConstants.CTX_RUNTIME, DQPPlugin.Util.getString("failed_to_bind_translator", name)); //$NON-NLS-1$
+// }
+ this.translatorRepo.put(name, t);
+ }
+
+ public ExecutionFactory getTranslator(String name) {
+ return this.translatorRepo.get(name);
+ }
+
+ public ExecutionFactory removeTranslator(String name) {
+// try {
+// InitialContext ic = new InitialContext();
+// ic.unbind(name);
+// } catch (NamingException e) {
+// LogManager.logError(LogConstants.CTX_RUNTIME, DQPPlugin.Util.getString("failed_to_unbind_translator", name)); //$NON-NLS-1$
+// }
+ return this.translatorRepo.remove(name);
+ }
+}
\ No newline at end of file
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/impl/TranslatorRepository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,7 +27,6 @@
import java.util.List;
import org.teiid.client.metadata.ParameterInfo;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.language.AggregateFunction;
import org.teiid.connector.language.AndOr;
import org.teiid.connector.language.Argument;
@@ -62,6 +61,7 @@
import org.teiid.connector.metadata.runtime.Procedure;
import org.teiid.connector.metadata.runtime.ProcedureParameter;
import org.teiid.dqp.internal.datamgr.metadata.RuntimeMetadataImpl;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/metadata/RuntimeMetadataImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/metadata/RuntimeMetadataImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/metadata/RuntimeMetadataImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,8 +24,8 @@
*/
package org.teiid.dqp.internal.datamgr.metadata;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.metadata.runtime.*;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/AbstractWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/AbstractWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/AbstractWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,9 +26,10 @@
import javax.resource.spi.work.WorkEvent;
import javax.resource.spi.work.WorkListener;
-import com.metamatrix.common.log.LogManager;
+import org.teiid.logging.LogManager;
+
/**
* Represents a task that performs work that may take more than one processing pass to complete.
* During processing the WorkItem may receive events asynchronously through the moreWork method.
@@ -118,12 +119,12 @@
if (!ignoreDone) {
throw new IllegalStateException("More work is not valid once DONE"); //$NON-NLS-1$
}
- LogManager.logDetail(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[] {this, "ignoring more work, since the work item is done"}); //$NON-NLS-1$
+ LogManager.logDetail(org.teiid.logging.LogConstants.CTX_DQP, new Object[] {this, "ignoring more work, since the work item is done"}); //$NON-NLS-1$
}
}
private void logTrace(String msg) {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[] {this, msg, this.threadState});
+ LogManager.logTrace(org.teiid.logging.LogConstants.CTX_DQP, new Object[] {this, msg, this.threadState});
}
protected abstract void process();
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedFinder.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedFinder.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedFinder.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,9 +27,9 @@
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.core.CoreConstants;
@@ -72,9 +72,9 @@
ModelMetaData model = vdb.getModel(modelName);
for (String sourceName:model.getSourceNames()) {
try {
- ConnectorManager mgr = this.connectorRepo.getConnectorManager(model.getSourceJndiName(sourceName));
+ ConnectorManager mgr = this.connectorRepo.getConnectorManager(sourceName);
if (mgr == null) {
- throw new ConnectorException(DQPPlugin.Util.getString("CachedFinder.no_connector_found", model.getSourceJndiName(sourceName), modelName, sourceName)); //$NON-NLS-1$
+ throw new ConnectorException(DQPPlugin.Util.getString("CachedFinder.no_connector_found", sourceName, modelName, sourceName)); //$NON-NLS-1$
}
caps = mgr.getCapabilities();
break;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/CodeTableCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/CodeTableCache.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/CodeTableCache.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,9 +29,10 @@
import java.util.Map;
import java.util.Set;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.util.HashCodeUtil;
import com.metamatrix.dqp.DQPPlugin;
import com.metamatrix.query.util.CommandContext;
@@ -234,7 +235,7 @@
// Clear the cacheKeyDone
this.rowCount = 0;
// Log status
- LogManager.logInfo(com.metamatrix.common.log.LogConstants.CTX_DQP, DQPPlugin.Util.getString("CodeTableCache.Cleared_code_tables", removedTables, removedRecords)); //$NON-NLS-1$
+ LogManager.logInfo(org.teiid.logging.LogConstants.CTX_DQP, DQPPlugin.Util.getString("CodeTableCache.Cleared_code_tables", removedTables, removedRecords)); //$NON-NLS-1$
}
/**
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -57,15 +57,15 @@
import org.teiid.client.xa.XidImpl;
import org.teiid.dqp.internal.cache.DQPContextCache;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
-import org.teiid.logging.api.CommandLogMessage;
-import org.teiid.logging.api.CommandLogMessage.Event;
+import org.teiid.logging.CommandLogMessage;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.logging.CommandLogMessage.Event;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BufferManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.types.Streamable;
import com.metamatrix.core.MetaMatrixRuntimeException;
import com.metamatrix.core.util.Assertion;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,7 +34,6 @@
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.client.RequestMessage;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.language.SQLReservedWords;
import org.teiid.connector.metadata.runtime.AbstractMetadataRecord;
import org.teiid.connector.metadata.runtime.Column;
@@ -51,6 +50,7 @@
import org.teiid.dqp.internal.process.CodeTableCache.CacheKey;
import org.teiid.metadata.CompositeMetadataStore;
import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
@@ -339,7 +339,7 @@
// this should not happen, but it did occur when setting up the SystemAdmin models
throw new MetaMatrixComponentException(DQPPlugin.Util.getString("DataTierManager.could_not_obtain_connector_binding", new Object[]{modelName, workItem.getDqpWorkContext().getVdbName(), workItem.getDqpWorkContext().getVdbVersion() })); //$NON-NLS-1$
}
- connectorBindingId = model.getSourceJndiName(bindings.get(0));
+ connectorBindingId = bindings.get(0);
Assertion.isNotNull(connectorBindingId, "could not obtain connector id"); //$NON-NLS-1$
}
aqr.setConnectorName(connectorBindingId);
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,8 +26,8 @@
import java.util.List;
import org.teiid.client.SourceWarning;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.dqp.internal.datamgr.impl.ConnectorWork;
+import org.teiid.resource.ConnectorException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/LobWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,9 +30,9 @@
import org.teiid.client.lob.LobChunk;
import org.teiid.client.util.ResultsReceiver;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.BlobType;
import com.metamatrix.common.types.ClobType;
import com.metamatrix.common.types.Streamable;
@@ -75,7 +75,7 @@
chunk = stream.getNextChunk();
shouldClose = chunk.isLast();
} catch (MetaMatrixComponentException e) {
- LogManager.logWarning(com.metamatrix.common.log.LogConstants.CTX_DQP, e, DQPPlugin.Util.getString("ProcessWorker.LobError")); //$NON-NLS-1$
+ LogManager.logWarning(org.teiid.logging.LogConstants.CTX_DQP, e, DQPPlugin.Util.getString("ProcessWorker.LobError")); //$NON-NLS-1$
ex = e;
} catch (IOException e) {
ex = e;
@@ -102,7 +102,7 @@
stream.close();
}
} catch (IOException e) {
- LogManager.logWarning(com.metamatrix.common.log.LogConstants.CTX_DQP, e, DQPPlugin.Util.getString("ProcessWorker.LobError")); //$NON-NLS-1$
+ LogManager.logWarning(org.teiid.logging.LogConstants.CTX_DQP, e, DQPPlugin.Util.getString("ProcessWorker.LobError")); //$NON-NLS-1$
}
parent.removeLobStream(streamRequestId);
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,6 +28,8 @@
import java.util.List;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
@@ -36,7 +38,6 @@
import com.metamatrix.api.exception.query.QueryPlannerException;
import com.metamatrix.api.exception.query.QueryResolverException;
import com.metamatrix.api.exception.query.QueryValidatorException;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.QueryPlugin;
import com.metamatrix.query.eval.Evaluator;
@@ -133,7 +134,7 @@
if (prepPlan == null) {
//if prepared plan does not exist, create one
prepPlan = new PreparedPlan();
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[] { "Query does not exist in cache: ", sqlQuery}); //$NON-NLS-1$
+ LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Query does not exist in cache: ", sqlQuery}); //$NON-NLS-1$
}
ProcessorPlan cachedPlan = prepPlan.getPlan();
@@ -148,7 +149,7 @@
this.prepPlanCache.put(id, this.context.isSessionFunctionEvaluated(), prepPlan);
}
} else {
- LogManager.logTrace(com.metamatrix.common.log.LogConstants.CTX_DQP, new Object[] { "Query exist in cache: ", sqlQuery }); //$NON-NLS-1$
+ LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Query exist in cache: ", sqlQuery }); //$NON-NLS-1$
processPlan = cachedPlan.clone();
//already in cache. obtain the values from cache
analysisRecord = prepPlan.getAnalysisRecord();
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -37,6 +37,9 @@
import org.teiid.dqp.internal.process.multisource.MultiSourceMetadataWrapper;
import org.teiid.dqp.internal.process.multisource.MultiSourcePlanToProcessConverter;
import org.teiid.dqp.internal.process.validator.AuthorizationValidationVisitor;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
@@ -46,9 +49,6 @@
import com.metamatrix.api.exception.query.QueryResolverException;
import com.metamatrix.api.exception.query.QueryValidatorException;
import com.metamatrix.common.buffer.BufferManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.core.id.IDGenerator;
import com.metamatrix.core.id.IntegerIDFactory;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -38,9 +38,12 @@
import org.teiid.client.metadata.ParameterInfo;
import org.teiid.client.util.ResultsReceiver;
import org.teiid.client.xa.XATransactionException;
-import org.teiid.connector.api.DataNotAvailableException;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
-import org.teiid.logging.api.CommandLogMessage.Event;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
+import org.teiid.logging.CommandLogMessage.Event;
+import org.teiid.resource.cci.DataNotAvailableException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixException;
@@ -48,9 +51,6 @@
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.TupleBuffer;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.core.MetaMatrixCoreException;
import com.metamatrix.dqp.DQPPlugin;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/StatsCapturingWorkManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/StatsCapturingWorkManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/StatsCapturingWorkManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -43,10 +43,10 @@
import javax.resource.spi.work.WorkRejectedException;
import org.teiid.adminapi.impl.WorkerPoolStatisticsMetadata;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.util.NamedThreadFactory;
import com.metamatrix.query.QueryPlugin;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -94,7 +94,7 @@
// Create a new cloned version of the access node and set it's model name to be the bindingUUID
AccessNode instanceNode = (AccessNode) accessNode.clone();
instanceNode.setID(getID());
- instanceNode.setConnectorBindingId(model.getSourceJndiName(sourceName));
+ instanceNode.setConnectorBindingId(sourceName);
// Modify the command to pull the instance column and evaluate the criteria
Command command = (Command)instanceNode.getCommand().clone();
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/validator/AuthorizationValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/validator/AuthorizationValidationVisitor.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/validator/AuthorizationValidationVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -39,14 +39,14 @@
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.internal.process.multisource.MultiSourceElement;
-import org.teiid.logging.api.AuditMessage;
+import org.teiid.logging.AuditMessage;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.api.exception.query.QueryMetadataException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.dqp.DQPPlugin;
import com.metamatrix.query.function.FunctionLibrary;
import com.metamatrix.query.metadata.TempMetadataID;
Modified: trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/main/resources/com/metamatrix/dqp/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -515,4 +515,10 @@
TransformationMetadata.Unable_to_determine_fullname_for_element__1=Unable to determine fullname for element
CachedRequestWorkItem.not_available=Cache result is no longer available.
-CachedFinder.no_connector_found=No connector with jndi-name {0} found for Model {1} with source name {2}
\ No newline at end of file
+CachedFinder.no_connector_found=No connector with jndi-name {0} found for Model {1} with source name {2}
+failed_to_get_connection= Failed to get connection for translator {0}
+failed_to_close_connection=Failed to close the connection for translator {0}
+translator_not_found=Translator {0} not accessible.
+datasource_not_found=Data Source {0} not accessible.
+failed_to_bind_translator=Failed to bind the translator {0} on the jndi tree
+failed_to_unbind_translator=Failed to un-bind the translator {0} from the jndi tree.
\ No newline at end of file
Deleted: trunk/engine/src/test/java/com/metamatrix/common/log/TestLogManager.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/common/log/TestLogManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/common/log/TestLogManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,161 +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 com.metamatrix.common.log;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-
-/**
- * This test case tests the LogManager.
- */
-public class TestLogManager extends TestCase {
-
- String context = "SomeContext"; //$NON-NLS-1$
-
- /**
- * Constructor for TestLogManager.
- * @param name
- */
- public TestLogManager(String name) {
- super(name);
- }
-
- @Override
- protected void setUp() throws Exception {
- ListLogger logger = new ListLogger();
- logger.setLogLevel(context, MessageLevel.DETAIL);
- LogManager.logListener = logger;
- }
-
- // =========================================================================
- // T E S T C A S E S
- // =========================================================================
-
- /*
- * Test for boolean isMessageToBeRecorded(String, int)
- */
- public void testIsMessageToBeRecordedString() {
- assertTrue(LogManager.isMessageToBeRecorded(context, MessageLevel.CRITICAL) );
-
- ListLogger cfg = (ListLogger)LogManager.logListener;
- cfg.setLogLevel(context, MessageLevel.NONE);
- assertFalse(LogManager.isMessageToBeRecorded(context, MessageLevel.CRITICAL) );
- }
-
- /**
- * Test that all msgs logged are equal and output in same order.
- */
- public void testLogMessage() throws Exception {
- ListLogger cfg = (ListLogger)LogManager.logListener;
- cfg.setLogLevel(context, MessageLevel.INFO );
-
- List<String> sentMsgList = new ArrayList<String>();
- sentMsgList.add("A message 1"); //$NON-NLS-1$
- sentMsgList.add("A message 2"); //$NON-NLS-1$
- sentMsgList.add("A message 3"); //$NON-NLS-1$
- sentMsgList.add("A message 4"); //$NON-NLS-1$
- sentMsgList.add("A message 5"); //$NON-NLS-1$
- sentMsgList.add("A message 6"); //$NON-NLS-1$
-
- for (Iterator iter = sentMsgList.iterator(); iter.hasNext();) {
- String msg = (String) iter.next();
- LogManager.logInfo(context, msg);
- }
-
- List recevedMsgList = cfg.getLoggedMessages();
- assertEquals(sentMsgList.size(), recevedMsgList.size());
- assertEquals(sentMsgList, recevedMsgList);
- }
-
- /**
- *
- * A log listener that saves messages (IStatus)s in a
- * List for later comparison.
- */
- class ListLogger implements LogListener {
- private List<String> messages = new ArrayList<String>();
- private Map<String, Integer> contextMap = new HashMap<String, Integer>();
- private int defaultLevel;
-
- public ListLogger() {
- }
-
- /* (non-Javadoc)
- * @see com.metamatrix.core.log.LogListener#logMessage(org.eclipse.core.runtime.IStatus, long, java.lang.String, java.lang.String)
- */
- public void log(int level, String context, Object msg){
- this.messages.add(msg.toString());
- }
-
- public void log(int level, String context, Throwable t, Object msg) {
- this.messages.add(msg.toString());
- }
-
- /* (non-Javadoc)
- * @see com.metamatrix.core.log.LogListener#shutdown()
- */
- public void shutdown() {
- messages.clear();
- messages = null;
-
- }
-
- public int size() {
- return this.messages.size();
- }
-
- public List getLoggedMessages() {
- return this.messages;
- }
-
- public Set<String> getContexts() {
- return this.contextMap.keySet();
- }
-
- public int getLogLevel(String context) {
- Integer level = this.contextMap.get(context);
- if (level != null) {
- return level;
- }
- return defaultLevel;
- }
-
- public void setLogLevel(String context, int logLevel) {
- this.contextMap.put(context, logLevel);
- }
-
- @Override
- public boolean isEnabled(String context, int msgLevel) {
- int level = getLogLevel(context);
- return level >= msgLevel;
- }
- }
-
-}
Modified: trunk/engine/src/test/java/com/metamatrix/dqp/service/AutoGenDataService.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/dqp/service/AutoGenDataService.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/dqp/service/AutoGenDataService.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,12 +28,12 @@
import java.util.Iterator;
import java.util.List;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
import org.teiid.dqp.internal.datamgr.impl.ConnectorWork;
import org.teiid.dqp.internal.datamgr.impl.ConnectorWorkItem;
import org.teiid.dqp.internal.process.AbstractWorkItem;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.dqp.message.AtomicRequestMessage;
@@ -55,7 +55,7 @@
public int dataNotAvailable = -1;
public AutoGenDataService() {
- super("FakeConnector");
+ super("FakeConnector","FakeConnector"); //$NON-NLS-1$ //$NON-NLS-2$
caps = new BasicSourceCapabilities();
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/function/TestFunctionTree.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/function/TestFunctionTree.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/function/TestFunctionTree.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,8 +31,8 @@
import junit.framework.TestCase;
import org.mockito.Mockito;
+import org.teiid.logging.LogManager;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.function.metadata.FunctionCategoryConstants;
import com.metamatrix.query.function.metadata.FunctionMethod;
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinOptimization.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinOptimization.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinOptimization.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,7 +28,7 @@
import java.util.List;
import org.junit.Test;
-import org.teiid.connector.api.SourceSystemFunctions;
+import org.teiid.resource.cci.SourceSystemFunctions;
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinPushdownRestrictions.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinPushdownRestrictions.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestJoinPushdownRestrictions.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,7 +23,7 @@
package com.metamatrix.query.optimizer;
import org.junit.Test;
-import org.teiid.connector.api.ConnectorCapabilities.SupportedJoinCriteria;
+import org.teiid.resource.cci.ConnectorCapabilities.SupportedJoinCriteria;
import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestSubqueryPushdown.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestSubqueryPushdown.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,7 +25,7 @@
import static com.metamatrix.query.optimizer.TestOptimizer.*;
import org.junit.Test;
-import org.teiid.connector.api.SourceSystemFunctions;
+import org.teiid.resource.cci.SourceSystemFunctions;
import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,12 +29,13 @@
import java.util.List;
import java.util.Map;
+import org.teiid.logging.LogManager;
+
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.CriteriaEvaluationException;
import com.metamatrix.api.exception.query.QueryResolverException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.TupleSource;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.query.eval.Evaluator;
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.metadata.TempMetadataID;
Modified: trunk/engine/src/test/java/com/metamatrix/query/sql/visitor/TestExpressionMappingVisitor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/sql/visitor/TestExpressionMappingVisitor.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/sql/visitor/TestExpressionMappingVisitor.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,8 +31,8 @@
import java.util.Map;
import org.junit.Test;
-import org.teiid.connector.api.SourceSystemFunctions;
import org.teiid.connector.language.SQLReservedWords;
+import org.teiid.resource.cci.SourceSystemFunctions;
import com.metamatrix.query.sql.LanguageObject;
import com.metamatrix.query.sql.lang.CompareCriteria;
Modified: trunk/engine/src/test/java/com/metamatrix/query/unittest/FakeMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/unittest/FakeMetadataFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/com/metamatrix/query/unittest/FakeMetadataFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -162,7 +162,7 @@
}
model.setVisible(true);
model.setSupportsMultiSourceBindings(false);
- model.addSourceMapping(name, null);
+ model.addSourceMapping(name, name, null);
return model;
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeConnector.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -27,25 +27,21 @@
import junit.framework.Assert;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.Execution;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.basic.BasicConnector;
-import org.teiid.connector.basic.BasicConnectorCapabilities;
-import org.teiid.connector.basic.BasicExecution;
import org.teiid.connector.language.Command;
import org.teiid.connector.language.QueryExpression;
import org.teiid.connector.metadata.runtime.RuntimeMetadata;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.Execution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.UpdateExecution;
-
-public class FakeConnector extends BasicConnector {
+public class FakeConnector extends BasicExecutionFactory {
private static final int RESULT_SIZE = 5;
private boolean executeBlocks;
@@ -58,8 +54,6 @@
private int connectionCount;
private int executionCount;
- private ConnectorEnvironment env;
-
public int getConnectionCount() {
return connectionCount;
}
@@ -68,33 +62,25 @@
return executionCount;
}
- public ConnectorEnvironment getConnectorEnvironment() {
- return this.env;
+ @Override
+ public Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ executionCount++;
+ return new FakeBlockingExecution(executionContext);
}
+ public ConnectorCapabilities getCapabilities() {
+ return new BasicConnectorCapabilities();
+ }
- public void setConnectorEnvironment(ConnectorEnvironment env) {
- this.env = env;
- }
-
- @Override
- public Connection getConnection() throws ConnectorException {
+ public Object getConnection() {
return new FakeConnection();
}
- private class FakeConnection extends BasicConnection {
-
+ private class FakeConnection {
public FakeConnection() {
connectionCount++;
}
public boolean released = false;
- public Execution createExecution(Command command, ExecutionContext executionContext, RuntimeMetadata metadata) throws ConnectorException {
- executionCount++;
- return new FakeBlockingExecution(executionContext);
- }
- public ConnectorCapabilities getCapabilities() {
- return new BasicConnectorCapabilities();
- }
public void close() {
Assert.assertFalse("The connection should not be released more than once", released); //$NON-NLS-1$
released = true;
@@ -192,9 +178,4 @@
public void setClassloader(ClassLoader classloader) {
this.classloader = classloader;
}
-
- @Override
- public ConnectorCapabilities getCapabilities() {
- return null;
- }
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeExecutionContextImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeExecutionContextImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeExecutionContextImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,7 +24,7 @@
import java.util.concurrent.atomic.AtomicInteger;
-import org.teiid.connector.api.ExecutionContext;
+import org.teiid.resource.cci.ExecutionContext;
/**
*/
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeProcedureExecution.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeProcedureExecution.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/FakeProcedureExecution.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,10 +26,10 @@
import java.util.Arrays;
import java.util.List;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.basic.BasicExecution;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicExecution;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.ProcedureExecution;
final class FakeProcedureExecution extends BasicExecution implements ProcedureExecution {
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorManager.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorManager.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorManager.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,9 +29,8 @@
import junit.framework.TestCase;
import org.mockito.Mockito;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorEnvironment;
import org.teiid.dqp.internal.process.AbstractWorkItem;
+import org.teiid.resource.cci.ExecutionFactory;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.dqp.message.AtomicRequestID;
@@ -45,14 +44,17 @@
private AtomicRequestMessage request;
private ConnectorManager csm;
- static ConnectorManager getConnectorManager(ConnectorEnvironment env) throws Exception {
+ static ConnectorManager getConnectorManager() throws Exception {
final FakeConnector c = new FakeConnector();
- c.setConnectorEnvironment(env);
- ConnectorManager cm = new ConnectorManager("FakeConnector", 1) { //$NON-NLS-1$
- Connector getConnector() {
+ ConnectorManager cm = new ConnectorManager("FakeConnector","FakeConnector") { //$NON-NLS-1$ //$NON-NLS-2$
+ protected ExecutionFactory getExecutionFactory() {
return c;
}
+ protected Object getConnectionFactory(){
+ return c.getConnection();
+ }
};
+ cm.setMaxConnections(1);
cm.start();
return cm;
}
@@ -68,7 +70,7 @@
protected void setUp() throws Exception {
super.setUp();
request = TestConnectorWorkItem.createNewAtomicRequestMessage(1, 1);
- csm = getConnectorManager(Mockito.mock(ConnectorEnvironment.class));
+ csm = getConnectorManager();
}
void helpAssureOneState() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorWorkItem.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestConnectorWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,7 +22,8 @@
package org.teiid.dqp.internal.datamgr.impl;
-import static junit.framework.Assert.*;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.fail;
import java.util.Arrays;
import java.util.List;
@@ -33,13 +34,12 @@
import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.client.RequestMessage;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ProcedureExecution;
import org.teiid.connector.language.Call;
import org.teiid.dqp.internal.datamgr.language.LanguageBridgeFactory;
import org.teiid.dqp.internal.process.AbstractWorkItem;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ProcedureExecution;
import com.metamatrix.dqp.message.AtomicRequestMessage;
import com.metamatrix.dqp.message.AtomicResultsMessage;
@@ -118,7 +118,7 @@
AtomicRequestMessage arm = createNewAtomicRequestMessage(1, 1);
arm.setCommand(command);
ConnectorWorkItem synchConnectorWorkItem = new ConnectorWorkItem(arm, Mockito.mock(AbstractWorkItem.class),
- TestConnectorManager.getConnectorManager(Mockito.mock(ConnectorEnvironment.class)));
+ TestConnectorManager.getConnectorManager());
return synchConnectorWorkItem.execute();
}
@@ -136,9 +136,9 @@
* 3. command must NOT be a SELECT
* 4. Then, set isImmutable to TRUE, we should SUCCEED
*/
- ConnectorEnvironment env = Mockito.mock(ConnectorEnvironment.class);
- Mockito.stub(env.isImmutable()).toReturn(true);
- ConnectorManager cm = TestConnectorManager.getConnectorManager(env);
+ ConnectorManager cm = TestConnectorManager.getConnectorManager();
+ ((FakeConnector)cm.getExecutionFactory()).setImmutable(true);
+
// command must not be a SELECT
Command command = helpGetCommand("update bqt1.smalla set stringkey = 1 where stringkey = 2", EXAMPLE_BQT); //$NON-NLS-1$
@@ -164,9 +164,9 @@
* 3. command must NOT be a SELECT
* 4. Then, set isImmutable to FALSE, and we should FAIL
*/
- ConnectorEnvironment env = Mockito.mock(ConnectorEnvironment.class);
- Mockito.stub(env.isImmutable()).toReturn(false);
- ConnectorManager cm = TestConnectorManager.getConnectorManager(env);
+ ConnectorManager cm = TestConnectorManager.getConnectorManager();
+ ((FakeConnector)cm.getExecutionFactory()).setImmutable(false);
+
// command must not be a SELECT
Command command = helpGetCommand("update bqt1.smalla set stringkey = 1 where stringkey = 2", EXAMPLE_BQT); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestTypeFacilityImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestTypeFacilityImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/impl/TestTypeFacilityImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,7 +24,7 @@
import java.sql.Clob;
-import org.teiid.connector.basic.TypeFacilityImpl;
+import org.teiid.resource.cci.TypeFacilityImpl;
import junit.framework.TestCase;
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -101,7 +101,7 @@
ModelMetaData m = vdb.getModel(model);
int x = m.getSourceNames().size();
for(int i=x; i<sourceCount; i++, sourceID++) {
- m.addSourceMapping("" + sourceID, null);
+ m.addSourceMapping("" + sourceID, "translator", null); //$NON-NLS-1$ //$NON-NLS-2$
}
}
Modified: trunk/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,9 +22,6 @@
package org.teiid.adminapi.jboss;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
@@ -37,8 +34,6 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
@@ -62,43 +57,32 @@
import org.teiid.adminapi.AdminException;
import org.teiid.adminapi.AdminObject;
import org.teiid.adminapi.AdminProcessingException;
-import org.teiid.adminapi.ConnectionFactory;
-import org.teiid.adminapi.Model;
import org.teiid.adminapi.PropertyDefinition;
import org.teiid.adminapi.Request;
import org.teiid.adminapi.Session;
import org.teiid.adminapi.TeiidAdmin;
import org.teiid.adminapi.Transaction;
+import org.teiid.adminapi.Translator;
import org.teiid.adminapi.VDB;
import org.teiid.adminapi.WorkerPoolStatistics;
-import org.teiid.adminapi.impl.ConnectionFactoryMetaData;
-import org.teiid.adminapi.impl.DataPolicyMetadata;
-import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.PropertyDefinitionMetadata;
import org.teiid.adminapi.impl.RequestMetadata;
import org.teiid.adminapi.impl.SessionMetadata;
import org.teiid.adminapi.impl.TransactionMetadata;
+import org.teiid.adminapi.impl.TranslatorMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.WorkerPoolStatisticsMetadata;
-import org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData;
import org.teiid.jboss.IntegrationPlugin;
import org.teiid.jboss.deployers.RuntimeEngineDeployer;
public class Admin extends TeiidAdmin {
- private static final String CONNECTOR_PREFIX = "connector-"; //$NON-NLS-1$
- private static final String RAR = ".rar"; //$NON-NLS-1$
+ private static final String TRANSLATOR_PREFIX = "translator-"; //$NON-NLS-1$
private static final ProfileKey DEFAULT_PROFILE_KEY = new ProfileKey(ProfileKey.DEFAULT);
private static final long serialVersionUID = 7081309086056911304L;
private static ComponentType VDBTYPE = new ComponentType("teiid", "vdb");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType DQPTYPE = new ComponentType("teiid", "dqp");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType CONNECTION_FACTORY_TYPE = new ComponentType("teiid", "connection-factory");//$NON-NLS-1$ //$NON-NLS-2$
+ private static ComponentType DQPTYPE = new ComponentType("teiid", "dqp");//$NON-NLS-1$ //$NON-NLS-2$
private static String DQPNAME = RuntimeEngineDeployer.class.getName();
- private static ComponentType NOTXTYPE = new ComponentType("ConnectionFactory", "NoTx");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType TXTYPE = new ComponentType("ConnectionFactory", "Tx");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType DS_LOCAL_TX = new ComponentType("DataSource", "LocalTx");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType DS_XA_TX = new ComponentType("DataSource", "XA");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType DS_NO_TX = new ComponentType("DataSource", "NoTx");//$NON-NLS-1$ //$NON-NLS-2$
- private static ComponentType[] DS_TYPES = {DS_XA_TX,DS_LOCAL_TX,TXTYPE,DS_NO_TX,NOTXTYPE};
+ private static ComponentType TRANSLATOR_TYPE = new ComponentType("teiid", "translator");//$NON-NLS-1$ //$NON-NLS-2$
private ManagementView view;
@@ -158,12 +142,12 @@
// }
@Override
- public Collection<ConnectionFactory> getConnectionFactories() throws AdminException {
- ArrayList<ConnectionFactory> factories = new ArrayList<ConnectionFactory>();
+ public Collection<Translator> getTranslators() throws AdminException {
+ ArrayList<Translator> factories = new ArrayList<Translator>();
try {
- Set<ManagedComponent> mcSet = getView().getComponentsForType(CONNECTION_FACTORY_TYPE);
+ Set<ManagedComponent> mcSet = getView().getComponentsForType(TRANSLATOR_TYPE);
for (ManagedComponent mc:mcSet) {
- factories.add(AdminObjectBuilder.buildAO(mc, ConnectionFactoryMetaData.class));
+ factories.add(AdminObjectBuilder.buildAO(mc, TranslatorMetaData.class));
}
} catch (Exception e) {
throw new AdminComponentException(e);
@@ -172,11 +156,11 @@
}
@Override
- public ConnectionFactory getConnectionFactory(String deployedName) throws AdminException {
+ public Translator getTranslator(String deployedName) throws AdminException {
try {
- ManagedComponent mc = getConnectionFactoryComponent(deployedName);
+ ManagedComponent mc = getView().getComponent(deployedName, TRANSLATOR_TYPE);
if (mc != null) {
- return AdminObjectBuilder.buildAO(mc, ConnectionFactoryMetaData.class);
+ return AdminObjectBuilder.buildAO(mc, TranslatorMetaData.class);
}
return null;
} catch(Exception e) {
@@ -184,19 +168,6 @@
}
}
- private ManagedComponent getConnectionFactoryComponent(String deployedName)
- throws Exception {
- if (deployedName.startsWith("java:")) { //$NON-NLS-1$
- deployedName = deployedName.substring(5);
- }
-
- if (!deployedName.startsWith("teiid-cf/")) { //$NON-NLS-1$
- deployedName = "teiid-cf/"+deployedName; //$NON-NLS-1$
- }
- ManagedComponent mc = view.getComponent(deployedName, CONNECTION_FACTORY_TYPE);
- return mc;
- }
-
private InputStream exportDeployment(String url) throws AdminComponentException {
try {
URL contentURL = new URL(url);
@@ -208,90 +179,59 @@
}
}
- private ManagedComponent getManagedConnectionFactoryComponent(String deployedName) throws AdminProcessingException {
+ @Override
+ public Translator addTranslator(String deploymentName, String typeName, Properties properties) throws AdminException {
try {
- if (deployedName.startsWith("java:")) { //$NON-NLS-1$
- deployedName = deployedName.substring(5);
+ ManagedComponent mc = getView().getComponent(deploymentName, TRANSLATOR_TYPE);
+ if (mc != null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("translator_exists",deploymentName)); //$NON-NLS-1$;
}
- for (ComponentType type:DS_TYPES) {
- ManagedComponent mc = view.getComponent(deployedName, type);
- if (mc != null) {
- return mc;
+
+ DeploymentTemplateInfo info = getView().getTemplate(typeName);
+ if(info == null) {
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("translator_template_not_found", typeName)); //$NON-NLS-1$
+ }
+
+ // template properties specific to the template
+ Map<String, ManagedProperty> propertyMap = info.getProperties();
+
+ // walk through the supplied properties and assign properly to template
+ for (String key:properties.stringPropertyNames()) {
+ ManagedProperty mp = propertyMap.get(key);
+ if (mp != null) {
+ String value = properties.getProperty(key);
+ if (!ManagedUtil.sameValue(mp.getDefaultValue(), value)){
+ mp.setValue(SimpleValueSupport.wrap(value));
+ }
}
}
+ getView().applyTemplate(deploymentName, info);
+ } catch (NoSuchDeploymentException e) {
+ throw new AdminComponentException(e.getMessage(), e);
} catch(Exception e) {
- throw new AdminProcessingException(e.getMessage(), e);
- }
- return null;
- }
-
-// private ConnectionFactory buildConnectionFactory(ManagedComponent mc) {
-//
-// ConnectionFactoryMetaData connector = new ConnectionFactoryMetaData();
-// connector.setName(mc.getName());
-// connector.setComponentType(mc.getType());
-// connector.setJNDIName(ManagedUtil.getSimpleValue(mc, "jndi-name", String.class)); //$NON-NLS-1$
-// connector.setRARFileName(ManagedUtil.getSimpleValue(mc, "rar-name", String.class)); //$NON-NLS-1$
-//
-// connector.addProperty("deployer-name", mc.getDeployment().getName());//$NON-NLS-1$
-//
-// for (String key:mc.getProperties().keySet()) {
-// ManagedProperty property = mc.getProperty(key);
-// MetaValue value = property.getValue();
-//
-// //TODO: All properties need to be added
-// if (value != null) {
-// if(value.getMetaType().isSimple()) {
-// connector.addProperty(key, ManagedUtil.stringValue(value));
-// }
-// else if (key.equals("config-property")) { //$NON-NLS-1$
-// MapCompositeValueSupport v1 = (MapCompositeValueSupport)value;
-// MapCompositeMetaType metaType = v1.getMetaType();
-// for (String configProperty:metaType.keySet()) {
-// if (!configProperty.endsWith(".type")) { //$NON-NLS-1$
-// connector.addProperty(configProperty, ManagedUtil.stringValue(v1.get(configProperty)));
-// }
-// }
-// }
-// else {
-// //log.info(key+" property is not added to connector properties");
-// }
-// }
-// }
-// return connector;
-// }
-
-
-
- @Override
- public ConnectionFactory addConnectionFactory(String deploymentName, String typeName, Properties properties) throws AdminException {
- if (getManagedConnectionFactoryComponent(deploymentName) != null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("connector_binding_exists",deploymentName)); //$NON-NLS-1$;
- }
- addConnectionfactory(deploymentName, typeName, properties);
- return getConnectionFactory(deploymentName);
+ throw new AdminComponentException(e.getMessage(), e);
+ }
+ return getTranslator(deploymentName);
}
@Override
- public void setConnectionFactoryProperty(String deployedName, String propertyName, String propertyValue) throws AdminException{
+ public void setTranslatorProperty(String deployedName, String propertyName, String propertyValue) throws AdminException{
try {
ManagementView localView = getView();
- ManagedComponent mc = getManagedConnectionFactoryComponent(deployedName);
+ ManagedComponent mc = localView.getComponent(deployedName, TRANSLATOR_TYPE);
if (mc == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("connector_binding_exists",deployedName)); //$NON-NLS-1$;
+ throw new AdminProcessingException(IntegrationPlugin.Util.getString("translator_does_not_exist",deployedName)); //$NON-NLS-1$;
}
+
if (mc.getProperty(propertyName) != null) {
mc.getProperty(propertyName).setValue(SimpleValueSupport.wrap(propertyValue));
}
else {
- // since this is not in the regular properties list; must be teiid specific property
- // handle this by template properties
- ConnectionFactory cf = getConnectionFactory(deployedName);
- DeploymentTemplateInfo template = localView.getTemplate(cf.getTemplateName());
- if (template instanceof ExtendedPropertyInfo) {
- ExtendedPropertyInfo extendedTemplate = (ExtendedPropertyInfo)template;
- extendedTemplate.updateProperty(propertyName, propertyValue, mc);
- }
+ Map<String, String> configProps = new HashMap<String, String>();
+ configProps.put(propertyName, propertyValue);
+ configProps.put(propertyValue+".type", "java.lang.String"); //$NON-NLS-1$ //$NON-NLS-2$
+ MetaValue metaValue = ManagedUtil.compositeValueMap(configProps);
+ mc.getProperty("translator-property").setValue(metaValue); //$NON-NLS-1$
}
localView.updateComponent(mc);
@@ -302,71 +242,23 @@
}
@Override
- public void deleteConnectionFactory(String deployedName) throws AdminException {
- ManagedComponent mc = getManagedConnectionFactoryComponent(deployedName);
- if (mc != null) {
- ManagedUtil.removeArchive(getDeploymentManager(),mc.getDeployment().getName());
- }
- }
-
- @Override
- public void startConnectionFactory(String deployedName) throws AdminException {
+ public void deleteTranslator(String deployedName) throws AdminException {
try {
- String deploymentName = getDeploymentName(deployedName);
- ManagedUtil.execute(getDeploymentManager().start(deploymentName), IntegrationPlugin.Util.getString("failed_to_start_connector", deployedName)); //$NON-NLS-1$
+ ManagedComponent mc = getView().getComponent(deployedName, TRANSLATOR_TYPE);
+ if (mc != null) {
+ ManagedUtil.removeArchive(getDeploymentManager(),mc.getDeployment().getName());
+ }
} catch (Exception e) {
- ManagedUtil.handleException(e);
+ throw new AdminComponentException(e);
}
}
-
- @Override
- public void stopConnectionFactory(String deployedName) throws AdminException {
- try {
- String deploymentName = getDeploymentName(deployedName);
- ManagedUtil.execute(getDeploymentManager().stop(deploymentName), IntegrationPlugin.Util.getString("failed_to_stop_connector", deployedName)); //$NON-NLS-1$
- } catch (Exception e) {
- ManagedUtil.handleException(e);
- }
- }
-
- private String getDeploymentName(String deployedName) throws AdminProcessingException {
- ManagedComponent mc = getManagedConnectionFactoryComponent(deployedName);
- if (mc == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("failed_to_find_connector", deployedName)); //$NON-NLS-1$
- }
- String deploymentName = mc.getDeployment().getName();
- if (deploymentName == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("failed_to_find_connector")); //$NON-NLS-1$
- }
- return deploymentName;
- }
@Override
- public Collection<ConnectionFactory> getConnectionFactoriesInVDB(String vdbName, int vdbVersion) throws AdminException {
- HashMap<String, ConnectionFactory> bindingMap = new HashMap<String, ConnectionFactory>();
- VDBMetaData vdb = (VDBMetaData) getVDB(vdbName, vdbVersion);
- if (vdb != null) {
- for (Model model:vdb.getModels()) {
- if (model.isSource()) {
- for (String sourceName : model.getSourceNames()) {
- ConnectionFactory binding = getConnectionFactory(((ModelMetaData)model).getSourceJndiName(sourceName));
- if (binding != null) {
- bindingMap.put(sourceName, binding);
- }
- }
- }
- }
- }
- return new ArrayList(bindingMap.values());
- }
-
-
- @Override
- public Set<String> getConnectorTemplateNames() throws AdminException{
+ public Set<String> getTranslatorTemplateNames() throws AdminException{
Set<String> names = getView().getTemplateNames();
HashSet<String> matched = new HashSet<String>();
for(String name:names) {
- if (name.startsWith(CONNECTOR_PREFIX)) {
+ if (name.startsWith(TRANSLATOR_PREFIX)) {
matched.add(name);
}
}
@@ -409,7 +301,7 @@
public VDB getVDB(String vdbName, int vdbVersion) throws AdminException{
ManagedComponent mc = getVDBManagedComponent(vdbName, vdbVersion);
if (mc != null) {
- return buildVDB(mc);
+ return AdminObjectBuilder.buildAO(mc, VDBMetaData.class);
}
return null;
}
@@ -436,129 +328,14 @@
Set<VDB> vdbs = new HashSet<VDB>();
Set<ManagedComponent> vdbComponents = getView().getComponentsForType(VDBTYPE);
for (ManagedComponent mc: vdbComponents) {
- vdbs.add(buildVDB(mc));
+ vdbs.add(AdminObjectBuilder.buildAO(mc, VDBMetaData.class));
}
return vdbs;
} catch (Exception e) {
throw new AdminComponentException(e.getMessage(), e);
}
}
-
- private VDBMetaData buildVDB(ManagedComponent mc) {
- VDBMetaData vdb = new VDBMetaData();
- vdb.setName(ManagedUtil.getSimpleValue(mc, "name", String.class));//$NON-NLS-1$
- vdb.setDescription(ManagedUtil.getSimpleValue(mc, "description", String.class));//$NON-NLS-1$
- String status = ManagedUtil.getSimpleValue(mc, "status", String.class);//$NON-NLS-1$
- if (status != null) {
- vdb.setStatus(VDB.Status.valueOf(status));
- }
- vdb.setVersion(ManagedUtil.getSimpleValue(mc, "version", Integer.class));//$NON-NLS-1$
- vdb.setUrl(mc.getDeployment().getName());
- ManagedProperty prop = mc.getProperty("JAXBProperties"); //$NON-NLS-1$
- List<ManagedObject> properties = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(prop.getValue());
- for (ManagedObject managedProperty:properties) {
- vdb.addProperty(ManagedUtil.getSimpleValue(managedProperty, "name", String.class), ManagedUtil.getSimpleValue(managedProperty, "value", String.class)); //$NON-NLS-1$ //$NON-NLS-2$
- }
- // models
- ManagedProperty mp = mc.getProperty("models");//$NON-NLS-1$
- List<ManagedObject> models = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(mp.getValue());
- for(ManagedObject mo:models) {
- vdb.addModel(buildModel(mo));
- }
-
- // SecurityRoleMappings
- mp = mc.getProperty("dataPolicies");//$NON-NLS-1$
- List<ManagedObject> policies = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(mp.getValue());
- if (policies != null && !policies.isEmpty()) {
- for(ManagedObject mo:policies) {
- vdb.addDataPolicy(buildDataPolicy(mo));
- }
- }
- return vdb;
- }
-
- private DataPolicyMetadata buildDataPolicy(ManagedObject managedPolicy) {
- DataPolicyMetadata policy = new DataPolicyMetadata();
- policy.setName(ManagedUtil.getSimpleValue(managedPolicy, "name", String.class));//$NON-NLS-1$
- policy.setDescription(ManagedUtil.getSimpleValue(managedPolicy, "description", String.class));//$NON-NLS-1$
-
- ManagedProperty mappedRoleNames = managedPolicy.getProperty("mappedRoleNames");//$NON-NLS-1$
- CollectionValueSupport roleCollection = (CollectionValueSupport)mappedRoleNames.getValue();
- if (roleCollection != null) {
- MetaValue[] roleNames = roleCollection.getElements();
- for (MetaValue mv:roleNames) {
- policy.addMappedRoleName((String)((SimpleValueSupport)mv).getValue());
- }
- }
-
- ManagedProperty permissions = managedPolicy.getProperty("permissions");//$NON-NLS-1$
- if (permissions != null) {
- List<ManagedObject> permissionCollection = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(permissions.getValue());
- if (permissionCollection != null) {
- for (ManagedObject mo:permissionCollection) {
- PermissionMetaData permission = new PermissionMetaData();
-
- permission.setResourceName(ManagedUtil.getSimpleValue(mo, "resourceName", String.class));//$NON-NLS-1$
-
- if (ManagedUtil.getSimpleValue(mo, "allowCreate", Boolean.class) != null) { //$NON-NLS-1$
- permission.setAllowCreate(ManagedUtil.getSimpleValue(mo, "allowCreate", Boolean.class)); //$NON-NLS-1$
- }
-
- if (ManagedUtil.getSimpleValue(mo, "allowRead", Boolean.class) != null) { //$NON-NLS-1$
- permission.setAllowRead(ManagedUtil.getSimpleValue(mo, "allowRead", Boolean.class)); //$NON-NLS-1$
- }
-
- if (ManagedUtil.getSimpleValue(mo, "allowUpdate", Boolean.class) != null) { //$NON-NLS-1$
- permission.setAllowUpdate(ManagedUtil.getSimpleValue(mo, "allowUpdate", Boolean.class)); //$NON-NLS-1$
- }
-
- if (ManagedUtil.getSimpleValue(mo, "allowDelete", Boolean.class) != null) { //$NON-NLS-1$
- permission.setAllowDelete(ManagedUtil.getSimpleValue(mo, "allowDelete", Boolean.class)); //$NON-NLS-1$
- }
-
- policy.addPermission(permission);
- }
- }
- }
-
- return policy;
- }
-
- private ModelMetaData buildModel(ManagedObject managedModel) {
- ModelMetaData model = new ModelMetaData();
- model.setName(ManagedUtil.getSimpleValue(managedModel, "name", String.class));//$NON-NLS-1$
- model.setVisible(ManagedUtil.getSimpleValue(managedModel, "visible", Boolean.class));//$NON-NLS-1$
- model.setModelType(ManagedUtil.getSimpleValue(managedModel, "modelType", String.class));//$NON-NLS-1$
-
- ManagedProperty prop = managedModel.getProperty("JAXBProperties"); //$NON-NLS-1$
- List<ManagedObject> properties = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(prop.getValue());
- for (ManagedObject managedProperty:properties) {
- model.addProperty(ManagedUtil.getSimpleValue(managedProperty, "name", String.class), ManagedUtil.getSimpleValue(managedProperty, "value", String.class)); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- ManagedProperty sourceMappings = managedModel.getProperty("sourceMappings");//$NON-NLS-1$
- if (sourceMappings != null){
- List<ManagedObject> mappings = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(sourceMappings.getValue());
- for (ManagedObject mo:mappings) {
- String name = ManagedUtil.getSimpleValue(mo, "name", String.class);//$NON-NLS-1$
- String jndiName = ManagedUtil.getSimpleValue(mo, "jndiName", String.class);//$NON-NLS-1$
- model.addSourceMapping(name, jndiName);
- }
- }
-
- ManagedProperty validationErrors = managedModel.getProperty("errors");//$NON-NLS-1$
- if (validationErrors != null) {
- List<ManagedObject> errors = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(validationErrors.getValue());
- if (errors != null) {
- for (ManagedObject mo:errors) {
- model.addError(ManagedUtil.getSimpleValue(mo, "severity", String.class), ManagedUtil.getSimpleValue(mo, "value", String.class));//$NON-NLS-1$ //$NON-NLS-2$
- }
- }
- }
- return model;
- }
-
@Override
public Collection<Session> getSessions() throws AdminException {
try {
@@ -627,62 +404,7 @@
}
}
- private String getRarDeployerName(String rarName) throws AdminException{
- try {
- Set<String> rarDeployments = getView().getDeploymentNamesForType("rar");//$NON-NLS-1$
- for (String name: rarDeployments) {
- if (name.endsWith(rarName+"/")) { //$NON-NLS-1$
- return name;
- }
- }
- return null;
- } catch (Exception e) {
- throw new AdminComponentException(e.getMessage(), e);
- }
- }
-
@Override
- public void addConnector(String connectorName, InputStream contents) throws AdminException{
- if (!connectorName.startsWith(CONNECTOR_PREFIX) || !connectorName.endsWith(RAR)) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("bad_connector_type_name")); //$NON-NLS-1$
- }
-
- String deployerName = getRarDeployerName(connectorName);
- if (deployerName != null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("connector_type_exists", connectorName)); //$NON-NLS-1$
- }
-
- ManagedUtil.deployArchive(getDeploymentManager(), connectorName, contents, false);
-
- //also need to add a template for the properties
- try {
- String connectorNameWithoutExt = connectorName.substring(0, connectorName.length()-4);
- File jarFile = Admin.createConnectorTypeTemplate(connectorNameWithoutExt);
- ManagedUtil.deployArchive(getDeploymentManager(), connectorNameWithoutExt+"-template.jar", jarFile.toURI().toURL(), false);//$NON-NLS-1$
- jarFile.delete();
- } catch (IOException e) {
- deleteConnector(connectorName);
- }
- }
-
- @Override
- public void deleteConnector(String connectorName) throws AdminException {
- if (!connectorName.startsWith(CONNECTOR_PREFIX) || !connectorName.endsWith(RAR)) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("bad_connector_type_name")); //$NON-NLS-1$
- }
-
- String deployerName = getRarDeployerName(connectorName);
- if (deployerName == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("connector_not_found", connectorName)); //$NON-NLS-1$
- }
-
- //also need to delete template for the properties
- String connectorNameWithoutExt = connectorName.substring(0, connectorName.length()-4);
- ManagedUtil.removeArchive(getDeploymentManager(), connectorNameWithoutExt+"-template.jar");//$NON-NLS-1$
- ManagedUtil.removeArchive(getDeploymentManager(), deployerName);
- }
-
- @Override
public Collection<String> getCacheTypes() throws AdminException {
try {
Collection<String> requestList = new ArrayList<String>();
@@ -747,7 +469,7 @@
@Override
- public Collection<PropertyDefinition> getConnectorTemplatePropertyDefinitions(String templateName) throws AdminException {
+ public Collection<PropertyDefinition> getTranslatorTemplatePropertyDefinitions(String templateName) throws AdminException {
try {
DeploymentTemplateInfo info = getView().getTemplate(templateName);
if(info == null) {
@@ -814,87 +536,8 @@
return false;
}
- private void addConnectionfactory(String deploymentName, String typeName, Properties properties) throws AdminException {
- try {
- DeploymentTemplateInfo info = getView().getTemplate(typeName);
- if(info == null) {
- throw new AdminProcessingException(IntegrationPlugin.Util.getString("connector_type_not_found", typeName)); //$NON-NLS-1$
- }
-
-// Map<String, String> configProps = new HashMap<String, String>();
-
- // template properties specific to the template
- Map<String, ManagedProperty> propertyMap = info.getProperties();
-
- // walk through the supplied properties and assign properly to either template
- // of config-properties.
- for (String key:properties.stringPropertyNames()) {
- ManagedProperty mp = propertyMap.get(key);
- if (mp != null) {
- String value = properties.getProperty(key);
- if (!ManagedUtil.sameValue(mp.getDefaultValue(), value)){
- mp.setValue(SimpleValueSupport.wrap(value));
- }
- }
-// else {
-// configProps.put(key, properties.getProperty(key));
-// configProps.put(key+".type", "java.lang.String");//$NON-NLS-1$ //$NON-NLS-2$
-// }
- }
-
-// if (configProps.size() > 0) {
-// MetaValue metaValue = ManagedUtil.compositeValueMap(configProps);
-// info.getProperties().get("config-property").setValue(metaValue);//$NON-NLS-1$
-// }
-
- getView().applyTemplate(deploymentName, info);
-
- } catch (NoSuchDeploymentException e) {
- throw new AdminComponentException(e.getMessage(), e);
- } catch(Exception e) {
- throw new AdminComponentException(e.getMessage(), e);
- }
- }
-
- private static final String connectorTemplate =
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+ //$NON-NLS-1$
- "<deployment xmlns=\"urn:jboss:bean-deployer:2.0\">\n" + //$NON-NLS-1$
- "<!-- This is Teiid connector type template - DO NOT DELETE -->\n"+ //$NON-NLS-1$
- "<bean name=\"${name}\" class=\"org.teiid.templates.connector.ConnectorDeploymentTemplate\">\n" + //$NON-NLS-1$
- " <property name=\"info\"><inject bean=\"${name}-templateinfo\"/></property>\n" + //$NON-NLS-1$
- " <property name=\"targetTemplate\"><inject bean=\"NoTxConnectionFactoryTemplate\"/></property>\n" + //$NON-NLS-1$
- "</bean>\n" + //$NON-NLS-1$
- "<bean name=\"${name}-templateinfo\" class=\"org.teiid.templates.connector.ConnectorTemplateInfo\">\n" + //$NON-NLS-1$
- " <constructor factoryMethod=\"createTemplateInfo\">\n" + //$NON-NLS-1$
- " <factory bean=\"DSDeploymentTemplateInfoFactory\"/>\n" + //$NON-NLS-1$
- " <parameter class=\"java.lang.Class\">org.teiid.templates.connector.ConnectorTemplateInfo</parameter>\n" + //$NON-NLS-1$
- " <parameter class=\"java.lang.Class\">org.jboss.resource.metadata.mcf.NoTxConnectionFactoryDeploymentMetaData</parameter>\n" + //$NON-NLS-1$
- " <parameter class=\"java.lang.String\">${name}</parameter>\n" + //$NON-NLS-1$
- " <parameter class=\"java.lang.String\">${name}</parameter>\n"+ //$NON-NLS-1$
- " </constructor>\n" + //$NON-NLS-1$
- " <property name=\"rarName\">${name}.rar</property>" + //$NON-NLS-1$
- "</bean>\n"+ //$NON-NLS-1$
- "</deployment>"; //$NON-NLS-1$
-
- private static File createConnectorTypeTemplate(String name) throws IOException {
- String content = connectorTemplate.replace("${name}", name);//$NON-NLS-1$
-
- File jarFile = File.createTempFile(name, ".jar");//$NON-NLS-1$
- JarOutputStream jo = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(jarFile)));
-
- JarEntry je = new JarEntry("META-INF/jboss-beans.xml");//$NON-NLS-1$
- jo.putNextEntry(je);
-
- jo.write(content.getBytes());
-
- jo.close();
- return jarFile;
- }
-
-
@Override
- public void assignConnectionFactoryToModel(String vdbName, int vdbVersion, String modelName, String sourceName, String jndiName) throws AdminException {
-
+ public void assignToModel(String vdbName, int vdbVersion, String modelName, String sourceName, String translatorName, String dsName) throws AdminException {
ManagedComponent mc = getVDBManagedComponent(vdbName, vdbVersion);
if (mc == null) {
throw new AdminProcessingException(IntegrationPlugin.Util.getString("vdb_not_found", vdbName, vdbVersion)); //$NON-NLS-1$
@@ -922,11 +565,19 @@
for (ManagedObject mo:mappings) {
String sName = ManagedUtil.getSimpleValue(mo, "name", String.class);//$NON-NLS-1$
if (sName.equals(sourceName)) {
- ManagedProperty jndiProperty = mo.getProperty("jndiName"); //$NON-NLS-1$
+
+ ManagedProperty translatorProperty = mo.getProperty("translatorName"); //$NON-NLS-1$
+ if (translatorProperty == null) {
+ translatorProperty = new WritethroughManagedPropertyImpl(mo, new DefaultFieldsImpl("translatorName")); //$NON-NLS-1$
+ }
+ translatorProperty.setValue(ManagedUtil.wrap(SimpleMetaType.STRING, dsName));
+
+ // set the jndi name for the ds.
+ ManagedProperty jndiProperty = mo.getProperty("connectionJndiName"); //$NON-NLS-1$
if (jndiProperty == null) {
- jndiProperty = new WritethroughManagedPropertyImpl(mo, new DefaultFieldsImpl("jndiName")); //$NON-NLS-1$
+ jndiProperty = new WritethroughManagedPropertyImpl(mo, new DefaultFieldsImpl("connectionJndiName")); //$NON-NLS-1$
}
- jndiProperty.setValue(ManagedUtil.wrap(SimpleMetaType.STRING, jndiName));
+ jndiProperty.setValue(ManagedUtil.wrap(SimpleMetaType.STRING, dsName));
}
}
} else {
Deleted: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,195 +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.jboss.deployers;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.resource.ResourceException;
-
-import org.jboss.deployers.spi.DeploymentException;
-import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
-import org.jboss.deployers.spi.deployer.managed.ManagedObjectCreator;
-import org.jboss.deployers.structure.spi.DeploymentUnit;
-import org.jboss.managed.api.ManagedObject;
-import org.jboss.managed.api.factory.ManagedObjectFactory;
-import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentMetaData;
-import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryPropertyMetaData;
-import org.teiid.adminapi.ConnectionFactory;
-import org.teiid.adminapi.impl.ConnectionFactoryMetaData;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.basic.BasicManagedConnectionFactory;
-import org.teiid.deployers.VDBStatusChecker;
-import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
-import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
-import org.teiid.jboss.IntegrationPlugin;
-
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.util.PropertiesUtils;
-import com.metamatrix.core.MetaMatrixCoreException;
-import com.metamatrix.core.util.ReflectionHelper;
-
-/**
- * If the data source's "-ds.xml" file contains couple of extra Teiid Connection Factory properties, this deployer
- * creates a stateful "Connector" and creates the "ConnectorManager" using the "Connector" created. In this case the
- * "Connector" is not the JCA component. No lookup done for the "Connector". This way Teiid can combine the creation of
- * data source and connection factory in one step.
- */
-public class AutoConnectionFactoryDeployer extends AbstractSimpleRealDeployer<AutoConnectionFactoryDeploymentGroup> implements ManagedObjectCreator {
-
- private ConnectorManagerRepository connectorManagerRepository;
- private VDBStatusChecker vdbChecker;
- private ManagedObjectFactory mof;
-
- public AutoConnectionFactoryDeployer() {
- super(AutoConnectionFactoryDeploymentGroup.class);
- setRelativeOrder(3000);
- }
-
- @Override
- public void deploy(DeploymentUnit unit, AutoConnectionFactoryDeploymentGroup group) throws DeploymentException {
- List<ManagedConnectionFactoryDeploymentMetaData> deployments = group.getDeployments();
-
- ConnectionFactoryMetadataGroup cfGroup = new ConnectionFactoryMetadataGroup();
-
- for (ManagedConnectionFactoryDeploymentMetaData data : deployments) {
- String connectorName = "java:"+data.getJndiName(); //$NON-NLS-1$
- ConnectorManager cm = null;
-
- // check if a Teiid connection factory needs to be created for this data source.
- List<ManagedConnectionFactoryPropertyMetaData> props = data.getManagedConnectionFactoryProperties();
-
- String cfClass = getPropertyValue("ConnectionFactoryClass", props); //$NON-NLS-1$
- if (cfClass != null) {
- Properties teiidProps = convertToProperties(props);
-
- // This indicates that a Teiid Connection factory
- Connector connector = buildTeiidConnector(cfClass, teiidProps, connectorName);
- cm = new ConnectorManager(connectorName, connector, data.getMaxSize());
-
- cm.start();
-
- // Add the references to the mgr as loaded.
- this.connectorManagerRepository.addConnectorManager(connectorName, cm);
- cfGroup.addConnectionFactory(ConnectionFactoryDeployer.buildCF(data));
-
- this.vdbChecker.connectorAdded(connectorName);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("connector_started", connectorName)); //$NON-NLS-1$
- }
- }
-
- if (!cfGroup.getConnectionFactories().isEmpty()) {
- unit.addAttachment(ConnectionFactoryMetadataGroup.class, cfGroup);
- }
- }
-
- private String getPropertyValue(String name, List<ManagedConnectionFactoryPropertyMetaData> props) {
- for (ManagedConnectionFactoryPropertyMetaData prop:props) {
- if (prop.getName().equals(name)) {
- return prop.getValue();
- }
- }
- return null;
- }
-
- private Properties convertToProperties(List<ManagedConnectionFactoryPropertyMetaData> props) {
- Properties convertedProps = new Properties();
- for (ManagedConnectionFactoryPropertyMetaData prop:props) {
- convertedProps.setProperty(prop.getName(), prop.getValue());
- }
- return convertedProps;
- }
-
- private Connector buildTeiidConnector(String cfClass, Properties props, String sourceJndiName) throws DeploymentException {
- BasicManagedConnectionFactory cf;
- try {
- Object o = ReflectionHelper.create(cfClass, null, Thread.currentThread().getContextClassLoader());
- if(!(o instanceof ConnectorEnvironment)) {
- throw new DeploymentException(IntegrationPlugin.Util.getString("invalid_class", cfClass));//$NON-NLS-1$
- }
- cf = (BasicManagedConnectionFactory)o;
-
- PropertiesUtils.setBeanProperties(cf, props, null);
- cf.setSourceJNDIName(sourceJndiName);
-
- return (Connector)cf.createConnectionFactory();
-
- } catch (MetaMatrixCoreException e) {
- throw new DeploymentException(e);
- } catch (ResourceException e) {
- throw new DeploymentException(e);
- }
- }
-
- public void setConnectorManagerRepository(ConnectorManagerRepository repo) {
- this.connectorManagerRepository = repo;
- }
-
- /*
- * undeploy covered by the other deployer already.
- @Override
- public void undeploy(DeploymentUnit unit, AutoConnectionFactoryDeploymentGroup group) {
- super.undeploy(unit, group);
- List<ManagedConnectionFactoryDeploymentMetaData> deployments = group.getDeployments();
-
- for (ManagedConnectionFactoryDeploymentMetaData data : deployments) {
- String connectorName = "java:"+data.getJndiName(); //$NON-NLS-1$
- if (this.connectorManagerRepository != null) {
- ConnectorManager cm = this.connectorManagerRepository.removeConnectorManager(connectorName);
- if (cm != null) {
- cm.stop();
- this.vdbChecker.connectorRemoved(connectorName);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("connector_stopped", connectorName)); //$NON-NLS-1$
- }
- }
- }
- }
- */
-
- @Override
- public void build(DeploymentUnit unit, Set<String> attachmentNames, Map<String, ManagedObject> managedObjects)
- throws DeploymentException {
-
- ConnectionFactoryMetadataGroup group = unit.getAttachment(ConnectionFactoryMetadataGroup.class);
- if (group != null) {
- for (ConnectionFactoryMetaData data : group.getConnectionFactories()) {
- ManagedObject mo = this.mof.initManagedObject(data, ConnectionFactory.class, data.getName(), data.getName());
- if (mo == null) {
- throw new DeploymentException("could not create managed object"); //$NON-NLS-1$
- }
- managedObjects.put(mo.getName(), mo);
- }
- }
- }
-
- public void setVDBStatusChecker(VDBStatusChecker vdbChecker) {
- this.vdbChecker = vdbChecker;
- }
-
- public void setManagedObjectFactory(ManagedObjectFactory mof) {
- this.mof = mof;
- }
-}
Deleted: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeploymentGroup.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeploymentGroup.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryDeploymentGroup.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,51 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This 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 software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.teiid.jboss.deployers;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentMetaData;
-
-
- at XmlAccessorType(XmlAccessType.NONE)
- at XmlRootElement
-public class AutoConnectionFactoryDeploymentGroup implements Serializable {
- private static final long serialVersionUID = -7650097438654698297L;
-
- @XmlElements({@XmlElement(name="local-tx-datasource", type=ManagedConnectionFactoryDeploymentMetaData.class),
- @XmlElement(name="no-tx-datasource", type=ManagedConnectionFactoryDeploymentMetaData.class),
- @XmlElement(name="xa-datasource", type=ManagedConnectionFactoryDeploymentMetaData.class)})
- List<ManagedConnectionFactoryDeploymentMetaData> deployments = new ArrayList<ManagedConnectionFactoryDeploymentMetaData>();
-
- public List<ManagedConnectionFactoryDeploymentMetaData> getDeployments() {
- return Collections.unmodifiableList(deployments);
- }
-}
Deleted: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryParserDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryParserDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/AutoConnectionFactoryParserDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,69 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This 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 software 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 software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.teiid.jboss.deployers;
-
-import java.io.InputStream;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.sax.SAXSource;
-
-import org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer;
-import org.jboss.deployers.vfs.spi.structure.VFSDeploymentUnit;
-import org.jboss.util.xml.JBossEntityResolver;
-import org.jboss.virtual.VirtualFile;
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-
-public class AutoConnectionFactoryParserDeployer extends AbstractVFSParsingDeployer<AutoConnectionFactoryDeploymentGroup> {
-
- public AutoConnectionFactoryParserDeployer() {
- super(AutoConnectionFactoryDeploymentGroup.class);
- setIncludeDeploymentFile(true);
- setSuffix("-ds.xml"); //$NON-NLS-1$
- }
-
- @Override
- protected AutoConnectionFactoryDeploymentGroup parse(VFSDeploymentUnit unit, VirtualFile file, AutoConnectionFactoryDeploymentGroup root) throws Exception {
- JAXBContext context = JAXBContext.newInstance(new Class[] {AutoConnectionFactoryDeploymentGroup.class});
- Unmarshaller um = context.createUnmarshaller();
- InputStream is = file.openStream();
-
- try{
- InputSource input = new InputSource(is);
- input.setSystemId(file.toURI().toString());
- XMLReader reader = XMLReaderFactory.createXMLReader();
- reader.setEntityResolver(new JBossEntityResolver());
- SAXSource source = new SAXSource(reader, input);
- JAXBElement<AutoConnectionFactoryDeploymentGroup> elem = um.unmarshal(source, AutoConnectionFactoryDeploymentGroup.class);
- AutoConnectionFactoryDeploymentGroup deployment = elem.getValue();
- return deployment;
- }
- finally {
- if (is != null)
- is.close();
- }
- }
-}
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,44 +22,22 @@
package org.teiid.jboss.deployers;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
import org.jboss.deployers.spi.DeploymentException;
import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
-import org.jboss.deployers.spi.deployer.managed.ManagedObjectCreator;
import org.jboss.deployers.structure.spi.DeploymentUnit;
-import org.jboss.managed.api.ManagedObject;
-import org.jboss.managed.api.ManagedProperty;
-import org.jboss.managed.api.factory.ManagedObjectFactory;
-import org.jboss.metatype.api.types.MetaType;
-import org.jboss.metatype.api.values.CollectionValue;
-import org.jboss.metatype.api.values.GenericValue;
-import org.jboss.metatype.api.values.MapCompositeValueSupport;
-import org.jboss.metatype.api.values.MetaValue;
import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup;
import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentMetaData;
-import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryPropertyMetaData;
-import org.teiid.adminapi.ConnectionFactory;
-import org.teiid.adminapi.impl.ConnectionFactoryMetaData;
-import org.teiid.adminapi.jboss.ManagedUtil;
-import org.teiid.connector.api.Connector;
import org.teiid.deployers.VDBStatusChecker;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
-import org.teiid.jboss.IntegrationPlugin;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-
/**
- * This is a deployer that looks for the teiid connection factories deployed with their own "-ds.xml"
- * file, then this class creates a ConnectorManager for it. So, the access to the "Connector" is through look-up
- * in jndi tree for Connector Manager. Connector is JCA component.
+ * This deployer listens to the data source load and unload events and manages the connectionManager status based
+ * on these events.
*/
-public class ConnectionFactoryDeployer extends AbstractSimpleRealDeployer<ManagedConnectionFactoryDeploymentGroup> implements ManagedObjectCreator {
+public class ConnectionFactoryDeployer extends AbstractSimpleRealDeployer<ManagedConnectionFactoryDeploymentGroup> {
- private ManagedObjectFactory mof;
private ConnectorManagerRepository connectorManagerRepository;
private VDBStatusChecker vdbChecker;
@@ -72,135 +50,33 @@
public void deploy(DeploymentUnit unit, ManagedConnectionFactoryDeploymentGroup group) throws DeploymentException {
List<ManagedConnectionFactoryDeploymentMetaData> deployments = group.getDeployments();
- ConnectionFactoryMetadataGroup cfGroup = new ConnectionFactoryMetadataGroup();
-
for (ManagedConnectionFactoryDeploymentMetaData data : deployments) {
- String connectorDefinition = data.getConnectionDefinition();
- String connectorName = "java:"+data.getJndiName(); //$NON-NLS-1$
-
- if (connectorDefinition.equals(Connector.class.getName())) {
- ConnectorManager cm = new ConnectorManager(connectorName, data.getMaxSize());
- // start the connector manager
- cm.start();
-
- // Add the references to the mgr as loaded.
- this.connectorManagerRepository.addConnectorManager(connectorName, cm);
- cfGroup.addConnectionFactory(buildCF(data));
-
- this.vdbChecker.connectorAdded(connectorName);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("connector_started", connectorName)); //$NON-NLS-1$
- }
+ this.vdbChecker.dataSourceAdded(data.getJndiName());
+
+ // set the number of available connections on the cm
+ for (ConnectorManager cm:this.connectorManagerRepository.getConnectorManagers()) {
+ if (cm.getConnectionName().equals(data.getJndiName())) {
+ cm.setMaxConnections(data.getMaxSize());
+ }
+ }
}
-
- if (!cfGroup.getConnectionFactories().isEmpty()) {
- unit.addAttachment(ConnectionFactoryMetadataGroup.class, cfGroup);
- }
}
- public void setConnectorManagerRepository(ConnectorManagerRepository repo) {
- this.connectorManagerRepository = repo;
- }
-
@Override
public void undeploy(DeploymentUnit unit, ManagedConnectionFactoryDeploymentGroup group) {
super.undeploy(unit, group);
List<ManagedConnectionFactoryDeploymentMetaData> deployments = group.getDeployments();
for (ManagedConnectionFactoryDeploymentMetaData data : deployments) {
- String connectorDefinition = data.getConnectionDefinition();
- if (connectorDefinition.equals(Connector.class.getName())) {
- String connectorName = "java:"+data.getJndiName(); //$NON-NLS-1$
- if (this.connectorManagerRepository != null) {
- ConnectorManager cm = this.connectorManagerRepository.removeConnectorManager(connectorName);
- if (cm != null) {
- cm.stop();
- this.vdbChecker.connectorRemoved(connectorName);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.getString("connector_stopped", connectorName)); //$NON-NLS-1$
- }
- }
- }
+ this.vdbChecker.dataSourceRemoved(data.getJndiName());
}
}
- @Override
- public void build(DeploymentUnit unit, Set<String> outputs,Map<String, ManagedObject> managedObjects) throws DeploymentException {
- ConnectionFactoryMetadataGroup group = unit.getAttachment(ConnectionFactoryMetadataGroup.class);
-
- ManagedObject mcfdgMO = managedObjects.get(ManagedConnectionFactoryDeploymentGroup.class.getName());
- if (mcfdgMO != null) {
- ManagedProperty deployments = mcfdgMO.getProperty("deployments"); //$NON-NLS-1$
- if (deployments.getMetaType().isCollection()) {
- if (deployments.getValue() != null) {
- MetaValue[] elements = ((CollectionValue)deployments.getValue()).getElements();
- for (MetaValue element:elements) {
- ManagedObject managed = (ManagedObject) ((GenericValue)element).getValue();
-
- ConnectionFactoryMetaData data = group.getConnectionFactory("teiid-cf/"+managed.getName()); //$NON-NLS-1$
- populateConnectionFactory(data, managed);
- if (data != null) {
- ManagedObject mo = this.mof.initManagedObject(data, ConnectionFactory.class, data.getName(), data.getName());
- if (mo == null) {
- throw new DeploymentException("could not create managed object"); //$NON-NLS-1$
- }
- managedObjects.put(mo.getName(), mo);
- }
- }
- }
- }
- }
+ public void setConnectorManagerRepository(ConnectorManagerRepository repo) {
+ this.connectorManagerRepository = repo;
}
-
-
- public void setManagedObjectFactory(ManagedObjectFactory mof) {
- this.mof = mof;
+ public void setVDBStatusChecker(VDBStatusChecker checker) {
+ this.vdbChecker = checker;
}
-
- public void setVDBStatusChecker(VDBStatusChecker vdbChecker) {
- this.vdbChecker = vdbChecker;
- }
-
- static ConnectionFactoryMetaData buildCF(ManagedConnectionFactoryDeploymentMetaData data) {
- ConnectionFactoryMetaData c = new ConnectionFactoryMetaData();
- // The name is prefixed here because, the Managed objects map overwrites this MO, with the main
- // -ds.xml based MO, since they have same names.
- c.setName("teiid-cf/"+data.getJndiName()); //$NON-NLS-1$
- c.setRARFileName(data.getRarName());
- c.setJNDIName("java:"+data.getJndiName()); //$NON-NLS-1$
-
- List<ManagedConnectionFactoryPropertyMetaData> props = data.getManagedConnectionFactoryProperties();
- for (ManagedConnectionFactoryPropertyMetaData p:props) {
- c.addProperty(p.getName(), p.getValue());
- }
- return c;
- }
-
- private void populateConnectionFactory(ConnectionFactoryMetaData data, ManagedObject managed) {
- Map<String, ManagedProperty> props = managed.getProperties();
-
- for (String key:props.keySet()) {
- ManagedProperty mp = props.get(key);
-
- MetaValue value = mp.getValue();
- if (value != null) {
- MetaType type = value.getMetaType();
- if (type.isSimple()) {
- data.addProperty(mp.getName(), ManagedUtil.stringValue(value));
- }
- else if (type.isComposite()) {
- if (value instanceof MapCompositeValueSupport) {
- MapCompositeValueSupport map = (MapCompositeValueSupport)value;
- if (key.equals("config-property") || key.equals("connection-properties") || key.equals("xa-datasource-properties")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- for (String subKey:map.getMetaType().keySet()) {
- MetaValue subValue = map.get(subKey);
- if (subValue.getMetaType().isSimple()) {
- data.addProperty(subKey, ManagedUtil.stringValue(subValue));
- }
- }
- }
- }
- }
- }
- }
- }
}
Deleted: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryMetadataGroup.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryMetadataGroup.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/ConnectionFactoryMetadataGroup.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,49 +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.jboss.deployers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.teiid.adminapi.impl.ConnectionFactoryMetaData;
-
-public class ConnectionFactoryMetadataGroup {
- private List<ConnectionFactoryMetaData> mgrs = new ArrayList<ConnectionFactoryMetaData>();
-
- public void addConnectionFactory(ConnectionFactoryMetaData cm) {
- this.mgrs.add(cm);
- }
-
- public List<ConnectionFactoryMetaData> getConnectionFactories(){
- return this.mgrs;
- }
-
- public ConnectionFactoryMetaData getConnectionFactory(String name) {
- for(ConnectionFactoryMetaData cf: this.mgrs) {
- if (cf.getName().equals(name)) {
- return cf;
- }
- }
- return null;
- }
-}
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -60,6 +60,9 @@
import org.teiid.dqp.internal.transaction.TransactionServerImpl;
import org.teiid.jboss.IntegrationPlugin;
import org.teiid.logging.Log4jListener;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.security.SecurityHelper;
import org.teiid.transport.ClientServiceRegistry;
import org.teiid.transport.ClientServiceRegistryImpl;
@@ -69,9 +72,6 @@
import com.metamatrix.api.exception.ComponentNotFoundException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.core.MetaMatrixRuntimeException;
import com.metamatrix.dqp.service.BufferService;
import com.metamatrix.dqp.service.SessionService;
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/VDBMetaDataInstanceClassFactory.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/VDBMetaDataInstanceClassFactory.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/deployers/VDBMetaDataInstanceClassFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -63,8 +63,9 @@
List<ManagedObject> mappings = (List<ManagedObject>)MetaValueFactory.getInstance().unwrap(sourceMappings.getValue());
for (ManagedObject mo:mappings) {
String name = ManagedUtil.getSimpleValue(mo, "name", String.class);//$NON-NLS-1$
- String jndiName = ManagedUtil.getSimpleValue(mo, "jndiName", String.class);//$NON-NLS-1$
- model.addSourceMapping(name, jndiName);
+ String jndiName = ManagedUtil.getSimpleValue(mo, "connectionJndiName", String.class);//$NON-NLS-1$
+ String translatorName = ManagedUtil.getSimpleValue(mo, "translatorName", String.class);//$NON-NLS-1$
+ model.addSourceMapping(name, translatorName, jndiName);
}
}
}
Modified: trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorDeploymentTemplate.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorDeploymentTemplate.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorDeploymentTemplate.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,6 +25,8 @@
import java.util.List;
import java.util.Map;
+import javax.resource.cci.ConnectionFactory;
+
import org.jboss.deployers.spi.management.DeploymentTemplate;
import org.jboss.managed.api.DeploymentTemplateInfo;
import org.jboss.managed.api.ManagedProperty;
@@ -34,7 +36,6 @@
import org.jboss.virtual.VirtualFile;
import org.teiid.adminapi.AdminComponentException;
import org.teiid.adminapi.jboss.ManagedUtil;
-import org.teiid.connector.api.Connector;
import org.teiid.jboss.IntegrationPlugin;
/**
@@ -72,7 +73,7 @@
DeploymentTemplateInfo targetInfo = this.targetTemplate.getInfo();
// override these properties always.
- targetInfo.getProperties().get("connection-definition").setValue(SimpleValueSupport.wrap(Connector.class.getName()));//$NON-NLS-1$
+ targetInfo.getProperties().get("connection-definition").setValue(SimpleValueSupport.wrap(ConnectionFactory.class.getName()));//$NON-NLS-1$
targetInfo.getProperties().get("rar-name").setValue(SimpleValueSupport.wrap(((ConnectorTemplateInfo)getInfo()).getRarName()));//$NON-NLS-1$
Modified: trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorTemplateInfo.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorTemplateInfo.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ConnectorTemplateInfo.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,23 +24,21 @@
import java.util.List;
import java.util.Map;
-import org.jboss.managed.api.Fields;
+import javax.resource.cci.ConnectionFactory;
+
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.managed.plugins.BasicDeploymentTemplateInfo;
-import org.jboss.managed.plugins.DefaultFieldsImpl;
-import org.jboss.managed.plugins.ManagedPropertyImpl;
import org.jboss.metatype.api.types.SimpleMetaType;
import org.jboss.metatype.api.values.MapCompositeValueSupport;
import org.jboss.metatype.api.values.SimpleValueSupport;
import org.teiid.adminapi.jboss.ExtendedPropertyInfo;
-import org.teiid.connector.api.Connector;
+import org.teiid.deployers.ManagedPropertyUtil;
/**
* This class some magic in it. First off all through the configuration it extends the
* NoTxConnectionFactoryTemplate. Then using the JMX adds the properties defined inside a connector
- * RAR file's ra.xml dynamically the above template. The RAR file name is supplied in the "description"
- * field of the configuration. Also, it uses the NoTxConnectionFactoryTemplate "applyTemplate" to write
+ * RAR file's ra.xml dynamically the above template. Also, it uses the NoTxConnectionFactoryTemplate "applyTemplate" to write
* the custom properties that have been added thru JMX as "config-property" in the eventual "-ds.xml" file.
*/
public class ConnectorTemplateInfo extends BasicDeploymentTemplateInfo implements ExtendedPropertyInfo {
@@ -48,7 +46,6 @@
private static final long serialVersionUID = 9066758787789280783L;
private String rarName;
static final String TEMPLATE_NAME = "template-name"; //$NON-NLS-1$
- private static final String TEIID_PROPERTY = "teiid-property"; //$NON-NLS-1$
public ConnectorTemplateInfo(String name, String description, Map<String, ManagedProperty> properties) {
@@ -67,7 +64,7 @@
copy.populate();
ManagedProperty mp = copy.getProperties().get("connection-definition");//$NON-NLS-1$
- mp.setValue(SimpleValueSupport.wrap(Connector.class.getName()));
+ mp.setValue(SimpleValueSupport.wrap(ConnectionFactory.class.getName()));
mp = copy.getProperties().get("rar-name");//$NON-NLS-1$
mp.setValue(SimpleValueSupport.wrap(getRarName()));
@@ -91,28 +88,9 @@
}
static ManagedProperty buildTemplateProperty(String name) {
- ManagedProperty mp = buildProperty(TEMPLATE_NAME, SimpleMetaType.STRING, "Template Name", "The Name of the Teiid Connector Template", true, name);//$NON-NLS-1$ //$NON-NLS-2$
- mp.setField(Fields.READ_ONLY, SimpleValueSupport.wrap(true));
- return mp;
+ return ManagedPropertyUtil.createProperty(TEMPLATE_NAME, SimpleMetaType.STRING, "Template Name", "The Name of the Teiid Connector Template", true, true, name);//$NON-NLS-1$ //$NON-NLS-2$
}
-
- static ManagedProperty buildProperty(String name, SimpleMetaType type, String displayName, String description, boolean mandatory, String value) {
- DefaultFieldsImpl fields = new DefaultFieldsImpl(name);
- fields.setDescription(description);
- fields.setField(Fields.MAPPED_NAME,displayName);
- fields.setMetaType(type);
- fields.setField(Fields.MANDATORY, SimpleValueSupport.wrap(mandatory));
- fields.setField(TEIID_PROPERTY, SimpleValueSupport.wrap(true));
- if (value != null) {
- fields.setField(Fields.DEFAULT_VALUE, SimpleValueSupport.wrap(value));
- }
- return new ManagedPropertyImpl(fields);
- }
- static void markAsTeiidProperty(ManagedProperty mp) {
- mp.setField(TEIID_PROPERTY, SimpleValueSupport.wrap(true));
- }
-
@Override
public void updateProperty(String name, String value, ManagedComponent main) {
List<String> connectorNames = RaXmlPropertyConverter.getPropertyNames(getRarName());
Deleted: trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ExtendedPropertyMetadata.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ExtendedPropertyMetadata.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ExtendedPropertyMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,148 +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.templates.connector;
-
-import java.util.ArrayList;
-
-import com.metamatrix.core.MetaMatrixRuntimeException;
-
-public class ExtendedPropertyMetadata {
- private String displayName;
- private String description;
- private boolean advanced;
- private boolean masked;
- private boolean editable = true;
- private boolean required;
- private ArrayList<String> allowed;
-
-
- public ExtendedPropertyMetadata(String encodedData) {
- encodedData = encodedData.trim();
-
- // if not begins with { then treat as if just a simple description field.
- if (!encodedData.startsWith("{")) {
- this.displayName = encodedData;
- return;
- }
-
- if (!encodedData.endsWith("}")) {
- throw new MetaMatrixRuntimeException("The description field = "+encodedData+" does not end with \"}\"");
- }
- encodedData = encodedData.substring(1, encodedData.length()-1);
-
- int index = 0;
- int start = -1;
- boolean inQuotes = false;
- int inQuotesStart = -1;
- boolean inArray = false;
-
- String propertyName = null;
- ArrayList<String> values = new ArrayList<String>();
- for (char c:encodedData.toCharArray()) {
- if (c == '$' && start == -1) {
- start = index;
- }
- else if (c == '"') {
- inQuotes = !inQuotes;
- if (inQuotes && inQuotesStart == -1) {
- inQuotesStart = index;
- }
- else if (!inQuotes && inQuotesStart != -1) {
- if (inQuotesStart+1 != index) {
- values.add(encodedData.substring(inQuotesStart+1, index));
- }
- else {
- values.add("");
- }
- inQuotesStart = -1;
- }
- }
- else if (c == '[') {
- inArray = true;
- }
- else if (c == ']') {
- inArray = false;
- }
- else if (c == ':' && !inQuotes && !inArray && start != -1) {
- propertyName = encodedData.substring(start, index);
- }
- else if (c == ',' && !inQuotes && !inArray && start != -1) {
- addProperty(propertyName, values);
- propertyName = null;
- values = new ArrayList<String>();
- start = -1;
- }
- index++;
- }
- // add last property
- addProperty(propertyName, values);
- }
-
- private void addProperty(String name, ArrayList<String> values) {
- if (name.equals("$display")) {
- this.displayName = values.get(0);
- }
- else if (name.equals("$description")) {
- this.description = values.get(0);
- }
- else if (name.equals("$advanced")) {
- this.advanced = Boolean.parseBoolean(values.get(0));
- }
- else if (name.equals("$masked")) {
- this.masked = Boolean.parseBoolean(values.get(0));
- }
- else if (name.equals("$editable")) {
- this.editable = Boolean.parseBoolean(values.get(0));
- }
- else if (name.equals("$allowed")) {
- this.allowed = new ArrayList<String>(values);
- }
- else if (name.equals("$required")) {
- this.required = Boolean.parseBoolean(values.get(0));
- }
- }
-
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public String getDisplayName() {
- return displayName;
- }
- public boolean isAdvanced() {
- return advanced;
- }
- public boolean isMasked() {
- return masked;
- }
- public boolean isEditable() {
- return editable;
- }
- public boolean isRequired() {
- return required;
- }
- public ArrayList<String> getAllowed() {
- return allowed;
- }
-}
Modified: trunk/jboss-integration/src/main/java/org/teiid/templates/connector/RaXmlPropertyConverter.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/templates/connector/RaXmlPropertyConverter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/templates/connector/RaXmlPropertyConverter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -23,7 +23,6 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
import java.util.List;
import javax.management.AttributeNotFoundException;
@@ -40,14 +39,14 @@
import org.jboss.managed.plugins.DefaultFieldsImpl;
import org.jboss.managed.plugins.ManagedPropertyImpl;
import org.jboss.metatype.api.types.SimpleMetaType;
-import org.jboss.metatype.api.values.MetaValue;
-import org.jboss.metatype.api.values.SimpleValueSupport;
import org.jboss.resource.metadata.ConfigPropertyMetaData;
import org.jboss.resource.metadata.ConnectionDefinitionMetaData;
import org.jboss.resource.metadata.ConnectorMetaData;
import org.jboss.resource.metadata.DescriptionMetaData;
import org.teiid.adminapi.jboss.ManagedUtil;
-import org.teiid.connector.api.Connector;
+import org.teiid.deployers.ExtendedPropertyMetadata;
+import org.teiid.deployers.ManagedPropertyUtil;
+import org.teiid.resource.cci.ExecutionFactory;
public class RaXmlPropertyConverter {
@@ -80,7 +79,7 @@
MBeanServer server = MBeanServerFactory.findMBeanServer(null).get(0);
ObjectName on = new ObjectName("jboss.jca:service=RARDeployment,name='"+rarName+"'");//$NON-NLS-1$ //$NON-NLS-2$
ConnectorMetaData obj = (ConnectorMetaData)server.getAttribute(on, "MetaData");//$NON-NLS-1$
- ConnectionDefinitionMetaData metadata = obj.getConnectionDefinition(Connector.class.getName());
+ ConnectionDefinitionMetaData metadata = obj.getConnectionDefinition(ExecutionFactory.class.getName());
return metadata.getProperties();
} catch (MalformedObjectNameException e) {
//ignore
@@ -97,41 +96,21 @@
}
private static ManagedProperty createConnectorProperty(ConfigPropertyMetaData metadata) {
- SimpleMetaType metaType = SimpleMetaType.resolve(metadata.getType());
- DefaultFieldsImpl fields = new DefaultFieldsImpl(metadata.getName());
DescriptionMetaData descMetadata = metadata.getDescription();
String description = descMetadata.getDescription();
if (description != null) {
- ExtendedPropertyMetadata extended = new ExtendedPropertyMetadata(description);
- if (extended.getDescription() != null) {
- fields.setDescription(description);
- }
-
- if (extended.getDisplayName() != null) {
- fields.setField(Fields.MAPPED_NAME, extended.getDisplayName());
- }
-
- if (extended.getAllowed() != null) {
- HashSet<MetaValue> values = new HashSet<MetaValue>();
- for (String value:extended.getAllowed()) {
- values.add(ManagedUtil.wrap(SimpleMetaType.STRING, value));
- }
- fields.setField(Fields.LEGAL_VALUES, values);
- }
- fields.setField(Fields.MANDATORY, ManagedUtil.wrap(SimpleMetaType.BOOLEAN_PRIMITIVE, String.valueOf(extended.isRequired())));
- fields.setField(Fields.READ_ONLY, ManagedUtil.wrap(SimpleMetaType.BOOLEAN_PRIMITIVE, String.valueOf(!extended.isEditable())));
- fields.setField("advanced", ManagedUtil.wrap(SimpleMetaType.BOOLEAN_PRIMITIVE, String.valueOf(extended.isAdvanced())));//$NON-NLS-1$
- fields.setField("masked", ManagedUtil.wrap(SimpleMetaType.BOOLEAN_PRIMITIVE, String.valueOf(extended.isMasked())));//$NON-NLS-1$
- fields.setField("teiid-property", SimpleValueSupport.wrap(true)); //$NON-NLS-1$
+ ExtendedPropertyMetadata extended = new ExtendedPropertyMetadata(metadata.getName(), metadata.getType(), description, metadata.getValue());
+ return ManagedPropertyUtil.convert(extended);
}
+ DefaultFieldsImpl fields = new DefaultFieldsImpl(metadata.getName());
+ SimpleMetaType metaType = SimpleMetaType.resolve(metadata.getType());
fields.setMetaType(metaType);
if (metadata.getValue() != null && metadata.getValue().trim().length() > 0) {
fields.setField(Fields.DEFAULT_VALUE, ManagedUtil.wrap(metaType, metadata.getValue()));
}
- ManagedPropertyImpl dsTypeMP = new ManagedPropertyImpl(fields);
- return dsTypeMP;
+ return new ManagedPropertyImpl(fields);
}
}
Modified: trunk/jboss-integration/src/main/java/org/teiid/templates/connector/XaJdbcConnectorTemplateInfo.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/templates/connector/XaJdbcConnectorTemplateInfo.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/java/org/teiid/templates/connector/XaJdbcConnectorTemplateInfo.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -37,6 +37,7 @@
import org.jboss.resource.deployers.management.DsDataSourceTemplateInfo;
import org.teiid.adminapi.jboss.ExtendedPropertyInfo;
import org.teiid.adminapi.jboss.ManagedUtil;
+import org.teiid.deployers.ManagedPropertyUtil;
/**
* This template is specific to XA data source combined with Teiid's JDBC connector.
@@ -89,12 +90,12 @@
addProperty(ConnectorTemplateInfo.buildTemplateProperty(getName()));
- ConnectorTemplateInfo.markAsTeiidProperty(this.getProperties().get("user-name")); //$NON-NLS-1$
- ConnectorTemplateInfo.markAsTeiidProperty(this.getProperties().get("password"));//$NON-NLS-1$
- addProperty(ConnectorTemplateInfo.buildProperty(DATABASE_NAME, SimpleMetaType.STRING,"Database Name","Database Name", false, null));//$NON-NLS-1$ //$NON-NLS-2$
- addProperty(ConnectorTemplateInfo.buildProperty(PORT_NUMBER, SimpleMetaType.INTEGER,"Database Port", "Database Port",false, null));//$NON-NLS-1$ //$NON-NLS-2$
- addProperty(ConnectorTemplateInfo.buildProperty(SERVER_NAME, SimpleMetaType.STRING,"Database Server Name", "Database Server Name", false, null));//$NON-NLS-1$ //$NON-NLS-2$
- addProperty(ConnectorTemplateInfo.buildProperty(ADDITIONAL_DS_PROPS, SimpleMetaType.STRING,"Addtional Data Source Properties", "Addtional Data source properties. (comma separated name value pairs)", false, null));//$NON-NLS-1$ //$NON-NLS-2$
+ ManagedPropertyUtil.markAsTeiidProperty(this.getProperties().get("user-name")); //$NON-NLS-1$
+ ManagedPropertyUtil.markAsTeiidProperty(this.getProperties().get("password"));//$NON-NLS-1$
+ addProperty(ManagedPropertyUtil.createProperty(DATABASE_NAME, SimpleMetaType.STRING,"Database Name","Database Name", false, false, null));//$NON-NLS-1$ //$NON-NLS-2$
+ addProperty(ManagedPropertyUtil.createProperty(PORT_NUMBER, SimpleMetaType.INTEGER,"Database Port", "Database Port",false, false, null));//$NON-NLS-1$ //$NON-NLS-2$
+ addProperty(ManagedPropertyUtil.createProperty(SERVER_NAME, SimpleMetaType.STRING,"Database Server Name", "Database Server Name", false, false, null));//$NON-NLS-1$ //$NON-NLS-2$
+ addProperty(ManagedPropertyUtil.createProperty(ADDITIONAL_DS_PROPS, SimpleMetaType.STRING,"Addtional Data Source Properties", "Addtional Data source properties. (comma separated name value pairs)", false, false, null));//$NON-NLS-1$ //$NON-NLS-2$
}
static ManagedPropertyImpl buildConfigProperty() {
Modified: trunk/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
===================================================================
--- trunk/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,23 +25,16 @@
socket_enabled={0} {1}
engine_stopped=Teiid Engine stopped {0}
admin_connection_closed=Teiid admin connection is already closed.
-connector_binding_exists=Connection factory with name "{0}" already exists.
-failed_to_find_connector=Failed to find connector {0}. Can not start!
-failed_to_start_connector=Failed to start Connection factory = {0}
-failed_to_stop_connector=Failed to start Connection factory = {0}
+translator_exists=Translator with name {0} already exists in the configuration
+translator_does_not_exist=Translator with name {0} does not exist in the configuration
bad_vdb_extension=The extension of the file name must be either ".vdb" for designer vdb or "xxx-vdb.xml" for dynamic VDBs
-bad_connector_type_name=Teiid connector names must start with \"connector-\" and end with ".rar" extension.
-connector_type_exists=Connector with name:"{0}" already exists!
-connector_type_not_found=Connector template "{0}" not found in the configuration.
+translator_template_not_found=Template with name {0} not found for creating a translator
vdb_not_found=VDB with name "{0}" version "{1}" not found in configuration
model_not_found=Model name "{0}" not found in the VDB with name "{1}" version "{2}"
policy_not_found=Policy name "{0}" not found in the VDB with name "{1}" version "{2}"
connectionfactory_not_found=Connection factory {0} not found in the configuration.
datasource_not_found=Datasource {0} not found in the configuration.
-connector_not_found=Connector {0} not found in the configuration.
sourcename_not_found=No source name {0} found in the model: {1}.{2}.{3}
-connector_started= Teiid connector {0} started
-connector_stopped=Teiid connector {0} stopped
no_operation=No operation found with given name = {0}
failed_to_remove=Failed to remove the deployment
Deleted: trunk/jboss-integration/src/test/java/org/teiid/templates/connector/TestExtendedPropertyMetadata.java
===================================================================
--- trunk/jboss-integration/src/test/java/org/teiid/templates/connector/TestExtendedPropertyMetadata.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/jboss-integration/src/test/java/org/teiid/templates/connector/TestExtendedPropertyMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,94 +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.templates.connector;
-
-import java.util.ArrayList;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-
-public class TestExtendedPropertyMetadata {
-
- @Test
- public void testDefault() {
- ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("some-name");
-
- Assert.assertEquals("some-name", metadata.getDisplayName());
- Assert.assertEquals(null, metadata.getDescription());
- Assert.assertEquals(false, metadata.isAdvanced());
- Assert.assertEquals(false, metadata.isRequired());
- Assert.assertEquals(false, metadata.isMasked());
- Assert.assertEquals(true , metadata.isEditable());
- }
-
- @Test
- public void testFormatted() {
- ArrayList<String> allowed = new ArrayList<String>();
- allowed.add("get");
- allowed.add("post");
-
- ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("{$display:\"Is Immutable\",$description:\"True if the source never changes.\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}");
-
- Assert.assertEquals("Is Immutable", metadata.getDisplayName());
- Assert.assertEquals("True if the source never changes.", metadata.getDescription());
- Assert.assertEquals(true, metadata.isAdvanced());
- Assert.assertEquals(true, metadata.isRequired());
- Assert.assertEquals(false, metadata.isMasked());
- Assert.assertEquals(true , metadata.isEditable());
- Assert.assertEquals(allowed , metadata.getAllowed());
- }
-
- @Test
- public void testFormattedExtraCommasAndColons() {
- ArrayList<String> allowed = new ArrayList<String>();
- allowed.add("get");
- allowed.add("post");
-
- ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("{$display:\"Is Immu:table\",$description:\"True if the, source never changes.\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}");
-
- Assert.assertEquals("Is Immu:table", metadata.getDisplayName());
- Assert.assertEquals("True if the, source never changes.", metadata.getDescription());
- Assert.assertEquals(true, metadata.isAdvanced());
- Assert.assertEquals(true, metadata.isRequired());
- Assert.assertEquals(false, metadata.isMasked());
- Assert.assertEquals(true , metadata.isEditable());
- Assert.assertEquals(allowed , metadata.getAllowed());
- }
-
- @Test
- public void testBlankProperties() {
- ArrayList<String> allowed = new ArrayList<String>();
- allowed.add("get");
- allowed.add("post");
-
- ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("{$display:\"Is Immutable\",$description:\"\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}");
-
- Assert.assertEquals("Is Immutable", metadata.getDisplayName());
- Assert.assertEquals("", metadata.getDescription());
- Assert.assertEquals(true, metadata.isAdvanced());
- Assert.assertEquals(true, metadata.isRequired());
- Assert.assertEquals(false, metadata.isMasked());
- Assert.assertEquals(true , metadata.isEditable());
- Assert.assertEquals(allowed , metadata.getAllowed());
- }
-}
Modified: trunk/metadata/src/test/java/com/metamatrix/cdk/api/ConnectorHost.java
===================================================================
--- trunk/metadata/src/test/java/com/metamatrix/cdk/api/ConnectorHost.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/metadata/src/test/java/com/metamatrix/cdk/api/ConnectorHost.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -22,23 +22,23 @@
package com.metamatrix.cdk.api;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.Connector;
-import org.teiid.connector.api.ConnectorEnvironment;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.DataNotAvailableException;
-import org.teiid.connector.api.Execution;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.api.UpdateExecution;
import org.teiid.connector.language.BatchedUpdates;
import org.teiid.connector.language.Command;
import org.teiid.connector.metadata.runtime.RuntimeMetadata;
import org.teiid.metadata.index.VDBMetadataFactory;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.DataNotAvailableException;
+import org.teiid.resource.cci.Execution;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ExecutionFactory;
+import org.teiid.resource.cci.ResultSetExecution;
+import org.teiid.resource.cci.UpdateExecution;
/**
* A simple test environment to execute commands on a connector.
@@ -47,63 +47,71 @@
*/
public class ConnectorHost {
- private Connector connector;
+ private ExecutionFactory connector;
private TranslationUtility util;
private ExecutionContext executionContext;
- public ConnectorHost(Connector connector, ConnectorEnvironment connectorEnvironment, String vdbFileName) throws ConnectorException {
- initialize(connector, connectorEnvironment, new TranslationUtility(VDBMetadataFactory.getVDBMetadata(vdbFileName)));
+ public ConnectorHost(ExecutionFactory connector, String vdbFileName) throws ConnectorException {
+ initialize(connector, new TranslationUtility(VDBMetadataFactory.getVDBMetadata(vdbFileName)));
}
- public ConnectorHost(Connector connector, ConnectorEnvironment connectorEnvironment, TranslationUtility util) throws ConnectorException{
- initialize(connector, connectorEnvironment, util);
+ public ConnectorHost(ExecutionFactory connector, TranslationUtility util) throws ConnectorException{
+ initialize(connector, util);
}
- private void initialize(Connector connector, final ConnectorEnvironment env, TranslationUtility util) throws ConnectorException {
+ private void initialize(ExecutionFactory connector, TranslationUtility util) throws ConnectorException {
this.connector = connector;
this.util = util;
- this.connector.initialize(env);
+ this.connector.start();
}
public void setExecutionContext(ExecutionContext context) {
this.executionContext = context;
}
- public List executeCommand(String query) throws ConnectorException {
+ public List executeCommand(String query, Object connection) throws ConnectorException {
- Connection connection = null;
try {
- connection = getConnection();
Command command = getCommand(query);
RuntimeMetadata runtimeMetadata = getRuntimeMetadata();
return executeCommand(connection, command, runtimeMetadata);
} finally {
if (connection != null) {
- connection.close();
+ close(connection);
}
}
}
- public List executeCommand(Command command) throws ConnectorException {
-
- Connection connection = null;
+ public List executeCommand(Command command, Object connection) throws ConnectorException {
try {
- connection = getConnection();
RuntimeMetadata runtimeMetadata = getRuntimeMetadata();
-
return executeCommand(connection, command, runtimeMetadata);
} finally {
if (connection != null) {
- connection.close();
+ close(connection);
}
}
}
- private List executeCommand(Connection connection, Command command, RuntimeMetadata runtimeMetadata)
+ private void close(Object connection) {
+ try {
+ Method m = connection.getClass().getMethod("close"); //$NON-NLS-1$
+ if (m != null) {
+ m.invoke(connection);
+ }
+ } catch (SecurityException e) {
+ } catch (IllegalArgumentException e) {
+ } catch (NoSuchMethodException e) {
+ } catch (IllegalAccessException e) {
+ } catch (InvocationTargetException e) {
+ }
+ }
+
+ private List executeCommand(Object connection, Command command, RuntimeMetadata runtimeMetadata)
throws ConnectorException {
- Execution exec = connection.createExecution(command, this.executionContext, runtimeMetadata);
+ Execution exec = connector.createExecution(command, this.executionContext, runtimeMetadata, connection);
exec.execute();
List results = readResultsFromExecution(exec);
exec.close();
@@ -111,11 +119,8 @@
return results;
}
- public int[] executeBatchedUpdates(String[] updates) throws ConnectorException {
-
- Connection connection = null;
+ public int[] executeBatchedUpdates(String[] updates, Object connection) throws ConnectorException {
try {
- connection = getConnection();
RuntimeMetadata runtimeMetadata = getRuntimeMetadata();
Command[] commands = new Command[updates.length];
for (int i = 0; i < updates.length; i++) {
@@ -125,12 +130,12 @@
return executeBatchedUpdates(connection, commands, runtimeMetadata);
} finally {
if (connection != null) {
- connection.close();
+ close(connection);
}
}
}
- public int[] executeBatchedUpdates(Connection connection, Command[] commands, RuntimeMetadata runtimeMetadata) throws ConnectorException {
+ public int[] executeBatchedUpdates(Object connection, Command[] commands, RuntimeMetadata runtimeMetadata) throws ConnectorException {
List<List> result = executeCommand(connection, new BatchedUpdates(Arrays.asList(commands)), runtimeMetadata);
int[] counts = new int[result.size()];
for (int i = 0; i < counts.length; i++) {
@@ -175,10 +180,4 @@
public Command getCommand(String query) {
return util.parseCommand(query);
}
-
- private Connection getConnection() throws ConnectorException {
- Connection connection = connector.getConnection();
- return connection;
- }
-
}
Deleted: trunk/metadata/src/test/java/com/metamatrix/cdk/api/SysLogger.java
===================================================================
--- trunk/metadata/src/test/java/com/metamatrix/cdk/api/SysLogger.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/metadata/src/test/java/com/metamatrix/cdk/api/SysLogger.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -1,150 +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 com.metamatrix.cdk.api;
-
-import java.util.Date;
-
-import org.teiid.connector.api.ConnectorLogger;
-
-
-/**
- * ConnectorLogger that prints output to System.out.
- */
-public class SysLogger implements ConnectorLogger {
-
- public static final int OFF = 0;
- public static final int ERROR = 1;
- public static final int WARNING = 2;
- public static final int INFO = 3;
- public static final int DETAIL = 4;
- public static final int TRACE = 5;
-
- private int logLevel = INFO;
-
- public SysLogger() {
-
- }
-
- public SysLogger(boolean shouldLog) {
- if (shouldLog) {
- this.logLevel = TRACE;
- } else {
- this.logLevel = OFF;
- }
- }
-
- protected void log(int level, String message, Throwable error) {
- if (level <= this.logLevel) {
- System.out.println(getCurrentTimestampString() + " " + message); //$NON-NLS-1$
- if(error != null) {
- error.printStackTrace(System.out);
- }
- }
- }
-
- public int getLevel() {
- return this.logLevel;
- }
-
- public void setLevel(int level) {
- this.logLevel = level;
- }
-
- protected Date getCurrentTimestamp() {
- return new Date();
- }
-
- protected String getCurrentTimestampString() {
- return getCurrentTimestamp().toString();
- }
-
- public void logError(String message) {
- log(ERROR, message, null);
- }
-
- public void logError(String message, Throwable error) {
- log(ERROR, message, error);
- }
-
- public void logWarning(String message) {
- log(WARNING, message, null);
- }
-
- public void logInfo(String message) {
- log(INFO, message, null);
- }
-
- public void logDetail(String message) {
- log(DETAIL, message, null);
- }
-
- public void logTrace(String message) {
- log(TRACE, message, null);
- }
-
- @Override
- public boolean isDetailEnabled() {
- return DETAIL <= this.logLevel;
- }
-
- @Override
- public boolean isErrorEnabled() {
- return ERROR <= this.logLevel;
- }
-
- @Override
- public boolean isInfoEnabled() {
- return INFO <= this.logLevel;
- }
-
- @Override
- public boolean isTraceEnabled() {
- return TRACE <= this.logLevel;
- }
-
- @Override
- public boolean isWarningEnabled() {
- return WARNING <= this.logLevel;
- }
-
- @Override
- public void logDetail(String message, Throwable error) {
- log(DETAIL, message, error);
- }
-
- @Override
- public void logInfo(String message, Throwable error) {
- log(INFO, message, error);
- }
-
- @Override
- public void logTrace(String message, Throwable error) {
- log(TRACE, message, error);
- }
-
- @Override
- public void logWarning(String message, Throwable error) {
- log(WARNING, message, error);
- }
-
-}
Modified: trunk/runtime/pom.xml
===================================================================
--- trunk/runtime/pom.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -88,5 +88,10 @@
<artifactId>jboss-deployers-vfs</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.jboss.integration</groupId>
+ <artifactId>jboss-profileservice-spi</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
Modified: trunk/runtime/src/main/java/org/teiid/deployers/DynamicVDBDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/DynamicVDBDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/deployers/DynamicVDBDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -29,9 +29,9 @@
import org.teiid.adminapi.Model;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.CoreConstants;
public class DynamicVDBDeployer extends AbstractVFSParsingDeployer<VDBMetaData> {
@@ -54,7 +54,7 @@
system.setName(CoreConstants.SYSTEM_MODEL);
system.setVisible(true);
system.setModelType(Model.Type.PHYSICAL);
- system.addSourceMapping(CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL);
+ system.addSourceMapping(CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL);
system.setSupportsMultiSourceBindings(false);
vdb.addModel(system);
Copied: trunk/runtime/src/main/java/org/teiid/deployers/ExtendedPropertyMetadata.java (from rev 2076, trunk/jboss-integration/src/main/java/org/teiid/templates/connector/ExtendedPropertyMetadata.java)
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/ExtendedPropertyMetadata.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/deployers/ExtendedPropertyMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,167 @@
+/*
+ * 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.deployers;
+
+import java.util.ArrayList;
+
+import com.metamatrix.core.MetaMatrixRuntimeException;
+
+/**
+ * This is used with ra.xml properties file to extend the metadata on the properties.
+ */
+public class ExtendedPropertyMetadata {
+ private String displayName;
+ private String description;
+ private boolean advanced;
+ private boolean masked;
+ private boolean editable = true;
+ private boolean required;
+ private ArrayList<String> allowed;
+ private String name;
+ private String type;
+ private String defaultValue;
+
+
+ public ExtendedPropertyMetadata(String name, String type, String encodedData, String defaultValue) {
+ this.name = name;
+ this.type = type;
+ this.defaultValue = defaultValue;
+
+ encodedData = encodedData.trim();
+
+ // if not begins with { then treat as if just a simple description field.
+ if (!encodedData.startsWith("{")) { //$NON-NLS-1$
+ this.displayName = encodedData;
+ return;
+ }
+
+ if (!encodedData.endsWith("}")) { //$NON-NLS-1$
+ throw new MetaMatrixRuntimeException("The description field = "+encodedData+" does not end with \"}\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ encodedData = encodedData.substring(1, encodedData.length()-1);
+
+ int index = 0;
+ int start = -1;
+ boolean inQuotes = false;
+ int inQuotesStart = -1;
+ boolean inArray = false;
+
+ String propertyName = null;
+ ArrayList<String> values = new ArrayList<String>();
+ for (char c:encodedData.toCharArray()) {
+ if (c == '$' && start == -1) {
+ start = index;
+ }
+ else if (c == '"') {
+ inQuotes = !inQuotes;
+ if (inQuotes && inQuotesStart == -1) {
+ inQuotesStart = index;
+ }
+ else if (!inQuotes && inQuotesStart != -1) {
+ if (inQuotesStart+1 != index) {
+ values.add(encodedData.substring(inQuotesStart+1, index));
+ }
+ else {
+ values.add(""); //$NON-NLS-1$
+ }
+ inQuotesStart = -1;
+ }
+ }
+ else if (c == '[') {
+ inArray = true;
+ }
+ else if (c == ']') {
+ inArray = false;
+ }
+ else if (c == ':' && !inQuotes && !inArray && start != -1) {
+ propertyName = encodedData.substring(start, index);
+ }
+ else if (c == ',' && !inQuotes && !inArray && start != -1) {
+ addProperty(propertyName, values);
+ propertyName = null;
+ values = new ArrayList<String>();
+ start = -1;
+ }
+ index++;
+ }
+ // add last property
+ addProperty(propertyName, values);
+ }
+
+ private void addProperty(String name, ArrayList<String> values) {
+ if (name.equals("$display")) { //$NON-NLS-1$
+ this.displayName = values.get(0);
+ }
+ else if (name.equals("$description")) { //$NON-NLS-1$
+ this.description = values.get(0);
+ }
+ else if (name.equals("$advanced")) { //$NON-NLS-1$
+ this.advanced = Boolean.parseBoolean(values.get(0));
+ }
+ else if (name.equals("$masked")) { //$NON-NLS-1$
+ this.masked = Boolean.parseBoolean(values.get(0));
+ }
+ else if (name.equals("$editable")) { //$NON-NLS-1$
+ this.editable = Boolean.parseBoolean(values.get(0));
+ }
+ else if (name.equals("$allowed")) { //$NON-NLS-1$
+ this.allowed = new ArrayList<String>(values);
+ }
+ else if (name.equals("$required")) { //$NON-NLS-1$
+ this.required = Boolean.parseBoolean(values.get(0));
+ }
+ }
+
+ public String name() {
+ return this.name;
+ }
+ public String description() {
+ return description;
+ }
+ public String display() {
+ return displayName;
+ }
+ public boolean advanced() {
+ return advanced;
+ }
+ public boolean masked() {
+ return masked;
+ }
+ public boolean readOnly() {
+ return editable;
+ }
+ public boolean required() {
+ return required;
+ }
+ public String[] allowed() {
+ if (allowed != null) {
+ return allowed.toArray(new String[allowed.size()]);
+ }
+ return new String[] {};
+ }
+ public String type() {
+ return this.type;
+ }
+ public String defaultValue() {
+ return this.defaultValue;
+ }
+}
Added: trunk/runtime/src/main/java/org/teiid/deployers/ManagedPropertyUtil.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/ManagedPropertyUtil.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/deployers/ManagedPropertyUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,89 @@
+/*
+ * 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.deployers;
+
+import java.util.HashSet;
+
+import org.jboss.managed.api.Fields;
+import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.plugins.DefaultFieldsImpl;
+import org.jboss.managed.plugins.ManagedPropertyImpl;
+import org.jboss.metatype.api.types.SimpleMetaType;
+import org.jboss.metatype.api.values.MetaValue;
+import org.jboss.metatype.api.values.SimpleValueSupport;
+import org.teiid.resource.cci.TranslatorProperty;
+
+public class ManagedPropertyUtil {
+ private static final String TEIID_PROPERTY = "teiid-property"; //$NON-NLS-1$
+
+ public static ManagedProperty convert(TranslatorProperty prop) {
+ return createProperty(prop.name(), SimpleMetaType.resolve(prop.type().getName()),
+ prop.display(), prop.description(), prop.required(), prop.readOnly(), prop.defaultValue(),
+ prop.advanced(), prop.masked(), prop.allowed());
+ }
+
+ public static ManagedProperty convert(ExtendedPropertyMetadata prop) {
+ return createProperty(prop.name(), SimpleMetaType.resolve(prop.type()),
+ prop.display(), prop.description(), prop.required(), prop.readOnly(), prop.defaultValue(),
+ prop.advanced(), prop.masked(), prop.allowed());
+ }
+
+ public static ManagedProperty createProperty(String name,
+ SimpleMetaType type, String displayName, String description,
+ boolean mandatory, boolean readOnly, String defaultValue) {
+
+ DefaultFieldsImpl fields = new DefaultFieldsImpl(name);
+ fields.setDescription(description);
+ fields.setField(Fields.MAPPED_NAME,displayName);
+ fields.setMetaType(type);
+ fields.setField(Fields.MANDATORY, SimpleValueSupport.wrap(mandatory));
+ fields.setField(Fields.READ_ONLY, SimpleValueSupport.wrap(readOnly));
+ fields.setField(TEIID_PROPERTY, SimpleValueSupport.wrap(true));
+
+ if (defaultValue != null) {
+ fields.setField(Fields.DEFAULT_VALUE, SimpleValueSupport.wrap(defaultValue));
+ }
+ return new ManagedPropertyImpl(fields);
+ }
+
+ public static ManagedProperty createProperty(String name,
+ SimpleMetaType type, String displayName, String description,
+ boolean mandatory, boolean readOnly, String defaultValue, boolean advanced,
+ boolean masked, String[] allowed) {
+
+ ManagedProperty mp = createProperty(name, type, displayName, description, mandatory, readOnly, defaultValue);
+ mp.setField("advanced", SimpleValueSupport.wrap(advanced));//$NON-NLS-1$
+ mp.setField("masked", SimpleValueSupport.wrap(masked));//$NON-NLS-1$
+ if (allowed != null) {
+ HashSet<MetaValue> values = new HashSet<MetaValue>();
+ for (String value:allowed) {
+ values.add(SimpleValueSupport.wrap(value));
+ }
+ mp.setField(Fields.LEGAL_VALUES, values);
+ }
+ return mp;
+ }
+
+ public static void markAsTeiidProperty(ManagedProperty mp) {
+ mp.setField(TEIID_PROPERTY, SimpleValueSupport.wrap(true));
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/deployers/ManagedPropertyUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,10 +30,10 @@
import org.jboss.deployers.vfs.spi.structure.VFSDeploymentUnit;
import org.jboss.logging.Logger;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.runtime.RuntimePlugin;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.util.FileUtils;
public class ObjectSerializer {
Added: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/TranslatorDeployer.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/deployers/TranslatorDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,151 @@
+/*
+ * 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.deployers;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import javax.resource.ResourceException;
+
+import org.jboss.deployers.spi.DeploymentException;
+import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.managed.api.annotation.ManagementProperty;
+import org.teiid.adminapi.impl.TranslatorMetaData;
+import org.teiid.dqp.internal.datamgr.impl.TranslatorRepository;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.resource.cci.ExecutionFactory;
+import org.teiid.resource.cci.TranslatorProperty;
+import org.teiid.runtime.RuntimePlugin;
+
+import com.metamatrix.core.MetaMatrixCoreException;
+import com.metamatrix.core.util.ReflectionHelper;
+
+/**
+ * Deployer for the Translator
+ */
+public class TranslatorDeployer extends AbstractSimpleRealDeployer<TranslatorMetaData> {
+
+ private TranslatorRepository translatorRepository;
+ private VDBStatusChecker vdbChecker;
+
+ public TranslatorDeployer() {
+ super(TranslatorMetaData.class);
+ }
+
+ @Override
+ public void deploy(DeploymentUnit unit, TranslatorMetaData data) throws DeploymentException {
+
+ String translatorName = data.getName();
+
+ String executionFactoryClass = data.getExecutionFactoryClass();
+ if (executionFactoryClass != null) {
+ ExecutionFactory connector = buildTranslator(executionFactoryClass, data);
+ this.translatorRepository.addTranslator(translatorName, connector);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("translator_started", translatorName)); //$NON-NLS-1$
+ this.vdbChecker.translatorAdded(translatorName);
+ }
+ }
+
+ @Override
+ public void undeploy(DeploymentUnit unit, TranslatorMetaData data) {
+ super.undeploy(unit, data);
+
+ String translatorName = data.getName();
+
+ if (this.translatorRepository != null) {
+ this.translatorRepository.removeTranslator(translatorName);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("translator_stopped", translatorName)); //$NON-NLS-1$
+ this.vdbChecker.translatorRemoved(translatorName);
+ }
+ }
+
+ ExecutionFactory buildTranslator(String executionFactoryClass, TranslatorMetaData data) throws DeploymentException {
+ ExecutionFactory executionFactory;
+ try {
+ Object o = ReflectionHelper.create(executionFactoryClass, null, Thread.currentThread().getContextClassLoader());
+ if(!(o instanceof ExecutionFactory)) {
+ throw new DeploymentException(RuntimePlugin.Util.getString("invalid_class", executionFactoryClass));//$NON-NLS-1$
+ }
+
+ executionFactory = (ExecutionFactory)o;
+ injectProperties(executionFactory, data);
+ executionFactory.start();
+ return executionFactory;
+
+ } catch (MetaMatrixCoreException e) {
+ throw new DeploymentException(e);
+ } catch (ResourceException e) {
+ throw new DeploymentException(e);
+ } catch (InvocationTargetException e) {
+ throw new DeploymentException(e);
+ } catch (IllegalAccessException e) {
+ throw new DeploymentException(e);
+ } catch (NoSuchMethodException e) {
+ throw new DeploymentException(e);
+ }
+ }
+
+ private void injectProperties(ExecutionFactory ef, final TranslatorMetaData data) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, DeploymentException{
+ Map<Method, TranslatorProperty> props = TranslatorPropertyUtil.getTranslatorProperties(ef.getClass());
+
+ for (Method method:props.keySet()) {
+ TranslatorProperty tp = props.get(method);
+ Object value = data.getPropertyValue(tp.name());
+ if (value == null) {
+ Method[] sourceMethods = data.getClass().getMethods();
+ for (Method sm:sourceMethods) {
+ ManagementProperty mp = sm.getAnnotation(ManagementProperty.class);
+ if (mp != null && mp.name().equals(tp.name())) {
+ value = sm.invoke(data);
+ break;
+ }
+ }
+ }
+
+ if (value != null) {
+ String setter = method.getName();
+ if (method.getName().startsWith("get")) { //$NON-NLS-1$
+ setter = "set"+method.getName().substring(3);//$NON-NLS-1$
+ }
+ else if (method.getName().startsWith("is")) { //$NON-NLS-1$
+ setter = "set"+method.getName().substring(2); //$NON-NLS-1$
+ }
+ Method setterMethod = ef.getClass().getMethod(setter, method.getReturnType());
+ if (setterMethod == null) {
+ throw new DeploymentException(RuntimePlugin.Util.getString("no_set_method", setter, tp.name())); //$NON-NLS-1$
+ }
+ setterMethod.invoke(ef, value);
+ }
+ }
+ }
+
+ public void setTranslatorRepository(TranslatorRepository repo) {
+ this.translatorRepository = repo;
+ }
+
+ public void setVDBStatusChecker(VDBStatusChecker checker) {
+ this.vdbChecker = checker;
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorDeployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorParserDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/TranslatorParserDeployer.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/deployers/TranslatorParserDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This 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 software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.teiid.deployers;
+
+import java.io.InputStream;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.sax.SAXSource;
+
+import org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer;
+import org.jboss.deployers.vfs.spi.structure.VFSDeploymentUnit;
+import org.jboss.util.xml.JBossEntityResolver;
+import org.jboss.virtual.VirtualFile;
+import org.teiid.adminapi.impl.TranslatorMetaData;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+
+public class TranslatorParserDeployer extends AbstractVFSParsingDeployer<TranslatorMetaData> {
+ public static final String TRANSLATOR_SUFFIX = "-translator.xml"; //$NON-NLS-1$
+
+ public TranslatorParserDeployer() {
+ super(TranslatorMetaData.class);
+ setIncludeDeploymentFile(true);
+ setSuffix(TRANSLATOR_SUFFIX);
+ }
+
+ @Override
+ protected TranslatorMetaData parse(VFSDeploymentUnit unit, VirtualFile file, TranslatorMetaData root) throws Exception {
+ JAXBContext context = JAXBContext.newInstance(new Class[] {TranslatorMetaData.class});
+ Unmarshaller um = context.createUnmarshaller();
+ InputStream is = file.openStream();
+
+ try{
+ InputSource input = new InputSource(is);
+ input.setSystemId(file.toURI().toString());
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setEntityResolver(new JBossEntityResolver());
+ SAXSource source = new SAXSource(reader, input);
+ JAXBElement<TranslatorMetaData> elem = um.unmarshal(source, TranslatorMetaData.class);
+ TranslatorMetaData deployment = elem.getValue();
+ deployment.setName(file.getName().substring(0, (file.getName().length()-TRANSLATOR_SUFFIX.length())));
+ return deployment;
+ }
+ finally {
+ if (is != null)
+ is.close();
+ }
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorParserDeployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorPropertyUtil.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/TranslatorPropertyUtil.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/deployers/TranslatorPropertyUtil.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,56 @@
+/*
+ * 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.deployers;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.teiid.resource.cci.TranslatorProperty;
+
+public class TranslatorPropertyUtil {
+
+ public static Map<Method, TranslatorProperty> getTranslatorProperties(Class<?> attachmentClass) {
+ Map<Method, TranslatorProperty> props = new HashMap<Method, TranslatorProperty>();
+ buildTranslatorProperties(attachmentClass, props);
+ return props;
+ }
+
+ private static void buildTranslatorProperties(Class<?> attachmentClass, Map<Method, TranslatorProperty> props){
+ Method[] methods = attachmentClass.getMethods();
+ for (Method m:methods) {
+ TranslatorProperty tp = m.getAnnotation(TranslatorProperty.class);
+ if (tp != null) {
+ props.put(m, tp);
+ }
+ }
+ // Now look at the base interfaces
+ Class[] baseInterfaces = attachmentClass.getInterfaces();
+ for (Class clazz:baseInterfaces) {
+ buildTranslatorProperties(clazz, props);
+ }
+ Class superClass = attachmentClass.getSuperclass();
+ if (superClass != null) {
+ buildTranslatorProperties(superClass, props);
+ }
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorPropertyUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -26,9 +26,6 @@
import java.util.LinkedHashMap;
import java.util.List;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
import org.jboss.deployers.spi.DeploymentException;
import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
import org.jboss.deployers.structure.spi.DeploymentUnit;
@@ -38,23 +35,26 @@
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.SourceMappingMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.metadata.runtime.MetadataStore;
import org.teiid.dqp.internal.cache.DQPContextCache;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
+import org.teiid.dqp.internal.datamgr.impl.TranslatorRepository;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.metadata.TransformationMetadata.Resource;
import org.teiid.metadata.index.IndexMetadataFactory;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.cci.ExecutionFactory;
import org.teiid.runtime.RuntimePlugin;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.CoreConstants;
import com.metamatrix.core.util.FileUtils;
public class VDBDeployer extends AbstractSimpleRealDeployer<VDBMetaData> {
private VDBRepository vdbRepository;
private ConnectorManagerRepository connectorManagerRepository;
+ private TranslatorRepository translatorRepository;
private DQPContextCache contextCache;
private ObjectSerializer serializer;
@@ -62,6 +62,7 @@
super(VDBMetaData.class);
setInput(VDBMetaData.class);
setOutput(VDBMetaData.class);
+ setRelativeOrder(3001); // after the data sources
}
@Override
@@ -83,6 +84,9 @@
// get the metadata store of the VDB (this is build in parse stage)
MetadataStoreGroup store = unit.getAttachment(MetadataStoreGroup.class);
+ // add required connector managers; if they are not already there
+ createConnectorManagers(deployment);
+
// if store is null and vdb dynamic vdb then try to get the metadata
if (store == null && deployment.isDynamic()) {
MetadataStoreGroup dynamicStore = new MetadataStoreGroup();
@@ -138,6 +142,24 @@
LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("vdb_deployed",deployment, valid?"active":"inactive")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
+ private void createConnectorManagers(VDBMetaData deployment) {
+ for (Model model:deployment.getModels()) {
+ if (model.getName().equals(CoreConstants.SYSTEM_MODEL)){
+ continue;
+ }
+ for (String source:model.getSourceNames()) {
+ if (this.connectorManagerRepository.getConnectorManager(source) == null) {
+ ConnectorManager cm = new ConnectorManager(model.getSourceTranslatorName(source), model.getSourceConnectionJndiName(source)) {
+ protected ExecutionFactory getExecutionFactory() {
+ return VDBDeployer.this.translatorRepository.getTranslator(getTranslatorName());
+ }
+ };
+ this.connectorManagerRepository.addConnectorManager(source, cm);
+ }
+ }
+ }
+ }
+
private boolean validateSources(VDBMetaData deployment) {
boolean valid = true;
for(Model m:deployment.getModels()) {
@@ -147,14 +169,12 @@
if (mapping.getName().equals(CoreConstants.SYSTEM_MODEL)) {
continue;
}
- try {
- InitialContext ic = new InitialContext();
- ic.lookup(mapping.getJndiName());
- } catch (NamingException e) {
+ ConnectorManager cm = this.connectorManagerRepository.getConnectorManager(mapping.getName());
+ String msg = cm.getStausMessage();
+ if (msg != null && msg.length() > 0) {
valid = false;
- String msg = RuntimePlugin.Util.getString("jndi_not_found", deployment.getName(), deployment.getVersion(), mapping.getJndiName(),mapping.getName()); //$NON-NLS-1$
- model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
+ model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), cm.getStausMessage());
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, cm.getStausMessage());
}
}
}
@@ -169,6 +189,19 @@
public void undeploy(DeploymentUnit unit, VDBMetaData deployment) {
super.undeploy(unit, deployment);
+ // there is chance that two different VDBs using the same source name, and their
+ // connector manager is removed. should we prefix vdb name??
+ for (Model model:deployment.getModels()) {
+ if (model.getName().equals(CoreConstants.SYSTEM_MODEL)){
+ continue;
+ }
+ for (String source:model.getSourceNames()) {
+ if (this.connectorManagerRepository.getConnectorManager(source) != null) {
+ this.connectorManagerRepository.removeConnectorManager(source);
+ }
+ }
+ }
+
if (this.vdbRepository != null) {
this.vdbRepository.removeVDB(deployment.getName(), deployment.getVersion());
}
@@ -232,7 +265,7 @@
Exception exception = null;
for (String sourceName: model.getSourceNames()) {
- ConnectorManager cm = this.connectorManagerRepository.getConnectorManager(model.getSourceJndiName(sourceName));
+ ConnectorManager cm = this.connectorManagerRepository.getConnectorManager(sourceName);
if (cm == null) {
continue;
}
@@ -258,4 +291,8 @@
private File buildCachedFileName(VFSDeploymentUnit unit, VDBMetaData vdb, String modelName) {
return this.serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()+"_"+modelName); //$NON-NLS-1$ //$NON-NLS-2$
}
+
+ public void setTranslatorRepository(TranslatorRepository repo) {
+ this.translatorRepository = repo;
+ }
}
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -44,13 +44,13 @@
import org.teiid.adminapi.Model;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.metadata.index.IndexConstants;
import org.teiid.metadata.index.IndexMetadataFactory;
import org.teiid.runtime.RuntimePlugin;
import org.xml.sax.SAXException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.CoreConstants;
import com.metamatrix.core.vdb.VdbConstants;
@@ -171,7 +171,7 @@
system.setName(CoreConstants.SYSTEM_MODEL);
system.setVisible(true);
system.setModelType(Model.Type.PHYSICAL);
- system.addSourceMapping(CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL);
+ system.addSourceMapping(CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL, CoreConstants.SYSTEM_MODEL);
system.setSupportsMultiSourceBindings(false);
vdb.addModel(system);
@@ -198,7 +198,7 @@
}
ManagedObject mo = this.mof.initManagedObject(m, ModelMetaData.class, m.getName(),m.getName());
if (mo == null) {
- throw new DeploymentException("could not create managed object");
+ throw new DeploymentException("could not create managed object"); //$NON-NLS-1$
}
managedObjects.put(mo.getName(), mo);
}
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -21,22 +21,46 @@
*/
package org.teiid.deployers;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
import org.teiid.adminapi.Model;
import org.teiid.adminapi.VDB;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
+import org.teiid.dqp.internal.datamgr.impl.ConnectorManager;
+import org.teiid.dqp.internal.datamgr.impl.ConnectorManagerRepository;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.runtime.RuntimePlugin;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
public class VDBStatusChecker {
private VDBRepository vdbRepository;
+ private ConnectorManagerRepository connectorManagerRepository;
- public void connectorAdded(String connectorName) {
+ public void translatorAdded(String translatorName) {
+ resourceAdded(translatorName, true);
+ }
+
+ public void translatorRemoved(String translatorName) {
+ resourceremoved(translatorName, true);
+ }
+
+ public void dataSourceAdded(String dataSourceName) {
+ resourceAdded(dataSourceName, false);
+ }
+
+ public void dataSourceRemoved(String dataSourceName) {
+ resourceremoved(dataSourceName, false);
+ }
+
+ public void setVDBRepository(VDBRepository repo) {
+ this.vdbRepository = repo;
+ }
+
+ public void setConnectorManagerRepository(ConnectorManagerRepository repo) {
+ this.connectorManagerRepository = repo;
+ }
+
+ public void resourceAdded(String resourceName, boolean translator) {
for (VDBMetaData vdb:this.vdbRepository.getVDBs()) {
if (vdb.getStatus() == VDB.Status.ACTIVE || vdb.isPreview()) {
continue;
@@ -48,27 +72,15 @@
continue;
}
- boolean inUse = false;
- for (String sourceName:model.getSourceNames()) {
- if (connectorName.equals(model.getSourceJndiName(sourceName))) {
- inUse = true;
- }
- }
-
- if (inUse) {
+ String sourceName = getSourceName(resourceName, model, translator);
+ if (sourceName != null) {
+ ConnectorManager cm = this.connectorManagerRepository.getConnectorManager(sourceName);
model.clearErrors();
- for (String sourceName:model.getSourceNames()) {
- if (!connectorName.equals(model.getSourceJndiName(sourceName))) {
- try {
- InitialContext ic = new InitialContext();
- ic.lookup(model.getSourceJndiName(sourceName));
- } catch (NamingException e) {
- String msg = RuntimePlugin.Util.getString("jndi_not_found", vdb.getName(), vdb.getVersion(), model.getSourceJndiName(sourceName), sourceName); //$NON-NLS-1$
- model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
- }
- }
- }
+ String status = cm.getStausMessage();
+ if (status != null && status.length() > 0) {
+ model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), status);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, status);
+ }
}
}
@@ -85,31 +97,45 @@
vdb.setStatus(VDB.Status.ACTIVE);
LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("vdb_activated",vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
}
-
}
}
-
- public void connectorRemoved(String connectorName) {
+
+ public void resourceremoved(String resourceName, boolean translator) {
for (VDBMetaData vdb:this.vdbRepository.getVDBs()) {
if (vdb.isPreview()) {
continue;
}
+
for (Model m:vdb.getModels()) {
ModelMetaData model = (ModelMetaData)m;
- for (String sourceName:model.getSourceNames()) {
- if (connectorName.equals(model.getSourceJndiName(sourceName))) {
- vdb.setStatus(VDB.Status.INACTIVE);
- String msg = RuntimePlugin.Util.getString("jndi_not_found", vdb.getName(), vdb.getVersion(), model.getSourceJndiName(sourceName), sourceName); //$NON-NLS-1$
- model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("vdb_inactivated",vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
+
+ String sourceName = getSourceName(resourceName, model, translator);
+ if (sourceName != null) {
+ vdb.setStatus(VDB.Status.INACTIVE);
+ String msg = null;
+ if (translator) {
+ msg = RuntimePlugin.Util.getString("translator_not_found", vdb.getName(), vdb.getVersion(), model.getSourceTranslatorName(sourceName)); //$NON-NLS-1$
}
+ else {
+ msg = RuntimePlugin.Util.getString("datasource_not_found", vdb.getName(), vdb.getVersion(), model.getSourceTranslatorName(sourceName)); //$NON-NLS-1$
+ }
+ model.addError(ModelMetaData.ValidationError.Severity.ERROR.name(), msg);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("vdb_inactivated",vdb.getName(), vdb.getVersion())); //$NON-NLS-1$
}
+ }
+ }
+ }
+
+ private String getSourceName(String translatorName, ModelMetaData model, boolean translator) {
+ for (String sourceName:model.getSourceNames()) {
+ if (translator && translatorName.equals(model.getSourceTranslatorName(sourceName))) {
+ return sourceName;
}
+ else if (translatorName.equals(model.getSourceConnectionJndiName(sourceName))) {
+ return sourceName;
+ }
}
- }
-
- public void setVDBRepository(VDBRepository repo) {
- this.vdbRepository = repo;
- }
+ return null;
+ }
}
Modified: trunk/runtime/src/main/java/org/teiid/logging/CommonsLogManagerAdapter.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/logging/CommonsLogManagerAdapter.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/logging/CommonsLogManagerAdapter.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -24,8 +24,6 @@
import org.apache.commons.logging.Log;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
/**
* This class is bridge for hooking LogManager into systems that use apache commons logging. In the Teiid
Modified: trunk/runtime/src/main/java/org/teiid/logging/Log4jListener.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/logging/Log4jListener.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/logging/Log4jListener.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,8 +25,6 @@
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
-import com.metamatrix.common.log.LogListener;
-import com.metamatrix.common.log.MessageLevel;
/**
* Log4J Listener
Modified: trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/services/SessionServiceImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -47,14 +47,14 @@
import org.teiid.deployers.VDBRepository;
import org.teiid.deployers.VirtualDatabaseException;
import org.teiid.dqp.internal.process.DQPCore;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.net.ServerConnection;
import org.teiid.net.TeiidURL;
import org.teiid.runtime.RuntimePlugin;
import org.teiid.security.Credentials;
import org.teiid.security.SecurityHelper;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.util.ArgCheck;
import com.metamatrix.dqp.service.SessionService;
import com.metamatrix.dqp.service.SessionServiceException;
Modified: trunk/runtime/src/main/java/org/teiid/services/TeiidLoginContext.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/TeiidLoginContext.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/services/TeiidLoginContext.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -38,12 +38,12 @@
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.runtime.RuntimePlugin;
import org.teiid.security.Credentials;
import org.teiid.security.SecurityHelper;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
/**
* This class serves as the primary implementation of the
Added: trunk/runtime/src/main/java/org/teiid/templates/TranslatorDeploymentTemplate.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/templates/TranslatorDeploymentTemplate.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/templates/TranslatorDeploymentTemplate.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,110 @@
+/*
+ * 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.templates;
+
+import java.io.File;
+import java.io.FileWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+
+import org.jboss.deployers.spi.management.DeploymentTemplate;
+import org.jboss.managed.api.DeploymentTemplateInfo;
+import org.jboss.managed.api.ManagedObject;
+import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.api.factory.ManagedObjectFactory;
+import org.jboss.virtual.VFS;
+import org.jboss.virtual.VirtualFile;
+import org.teiid.adminapi.impl.TranslatorMetaData;
+import org.teiid.deployers.TranslatorParserDeployer;
+
+/**
+ * Translator template writer and deployer
+ */
+public class TranslatorDeploymentTemplate implements DeploymentTemplate {
+
+ private DeploymentTemplateInfo info;
+ private ManagedObjectFactory mof;
+
+ public String getDeploymentName(String deploymentBaseName) {
+ if (deploymentBaseName == null)
+ throw new IllegalArgumentException("Null base name.");//$NON-NLS-1$
+
+ if(deploymentBaseName.endsWith(TranslatorParserDeployer.TRANSLATOR_SUFFIX) == false)
+ deploymentBaseName = deploymentBaseName + TranslatorParserDeployer.TRANSLATOR_SUFFIX;
+
+ return deploymentBaseName;
+ }
+
+ public VirtualFile applyTemplate(DeploymentTemplateInfo sourceInfo) throws Exception {
+ File dsXml = File.createTempFile(getClass().getSimpleName(),TranslatorParserDeployer.TRANSLATOR_SUFFIX);
+ writeTemplate(dsXml, sourceInfo);
+ return VFS.getRoot(dsXml.toURI());
+ }
+
+ private void writeTemplate(File dsXml, DeploymentTemplateInfo values) throws Exception {
+
+ // The management framework, will update the attachment the managed property value changes.
+ // that way the translator is configured.
+ TranslatorMetaData translator = new TranslatorMetaData();
+ this.mof.setInstanceClassFactory(TranslatorMetaData.class, new TranslatorMetadataICF(this.mof));
+ ManagedObject mo = mof.initManagedObject(translator, "teiid", "translator"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ for (ManagedProperty mp : values.getProperties().values()) {
+ ManagedProperty dsProp = mo.getProperty(mp.getName());
+ if (dsProp != null) {
+ if (mp.getValue() != null) {
+ dsProp.setValue(mp.getValue());
+ }
+ }
+ }
+
+ // Now use JAXB and write the file.
+ Class[] classes = { TranslatorMetaData.class };
+ JAXBContext context = JAXBContext.newInstance(classes);
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,new Boolean(true));
+
+ FileWriter fw = null;
+ try {
+ fw = new FileWriter(dsXml);
+ marshaller.marshal(translator, fw);
+ } finally {
+ if (fw != null) {
+ fw.close();
+ }
+ }
+ }
+
+ @Override
+ public DeploymentTemplateInfo getInfo() {
+ return info;
+ }
+
+ public void setInfo(DeploymentTemplateInfo info) {
+ this.info = info;
+ }
+
+ public void setManagedObjectFactory(ManagedObjectFactory mof) {
+ this.mof = mof;
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/templates/TranslatorDeploymentTemplate.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/runtime/src/main/java/org/teiid/templates/TranslatorMetadataICF.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/templates/TranslatorMetadataICF.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/templates/TranslatorMetadataICF.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,128 @@
+/*
+ * 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.templates;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.beans.info.spi.BeanInfo;
+import org.jboss.beans.info.spi.PropertyInfo;
+import org.jboss.managed.api.Fields;
+import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.api.factory.ManagedObjectFactory;
+import org.jboss.managed.plugins.factory.AbstractInstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
+import org.jboss.metatype.api.types.SimpleMetaType;
+import org.jboss.metatype.api.values.MapCompositeValueSupport;
+import org.jboss.metatype.api.values.MetaValue;
+import org.jboss.metatype.api.values.SimpleValueSupport;
+import org.teiid.adminapi.impl.PropertyMetadata;
+import org.teiid.adminapi.impl.TranslatorMetaData;
+
+public class TranslatorMetadataICF extends AbstractInstanceClassFactory<TranslatorMetaData> {
+
+ public TranslatorMetadataICF() {
+ super();
+ }
+
+ public TranslatorMetadataICF(ManagedObjectFactory mof) {
+ super(mof);
+ }
+
+ @Override
+ public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property, MetaData metaData, TranslatorMetaData attachment) {
+ // Get the property name
+ String propertyName = property.getMappedName();
+ if (propertyName == null)
+ propertyName = property.getName();
+
+ // Get the property info
+ PropertyInfo propertyInfo = property.getField(Fields.PROPERTY_INFO, PropertyInfo.class);
+ if (propertyInfo == null)
+ propertyInfo = beanInfo.getProperty(propertyName);
+
+ // Check if the property is readable
+ if (propertyInfo != null && propertyInfo.isReadable() == false)
+ return null;
+
+ MetaValue value = null;
+ if ("translator-property".equals(property.getName())) { //$NON-NLS-1$
+ MapCompositeValueSupport mapValue = new MapCompositeValueSupport(SimpleMetaType.STRING);
+ List<PropertyMetadata> list = attachment.getJAXBProperties();
+ if (list != null) {
+ for (PropertyMetadata prop : list) {
+ String name = prop.getName();
+ MetaValue svalue = SimpleValueSupport.wrap(prop.getValue());
+ mapValue.put(name, svalue);
+// MetaValue stype = SimpleValueSupport.wrap(prop.getType());
+// mapValue.put(name + ".type", stype);
+ }
+ }
+ value = mapValue;
+ } else {
+ value = super.getValue(beanInfo, property, metaData, attachment);
+ }
+ return value;
+ }
+
+ @Override
+ protected Object unwrapValue(BeanInfo beanInfo, ManagedProperty property, MetaValue value) {
+ Object unwrapValue = null;
+ if ("translator-property".equals(property.getName())) { //$NON-NLS-1$
+
+ if ((value instanceof MapCompositeValueSupport) == false) {
+ return super.unwrapValue(beanInfo, property, value);
+ }
+
+ MapCompositeValueSupport mapValue = (MapCompositeValueSupport) value;
+
+ List<PropertyMetadata> list = new ArrayList<PropertyMetadata>();
+ for (String name : mapValue.getMetaType().keySet()) {
+// // Ignore the type we've added before
+// if (name.endsWith(".type"))
+// continue;
+
+ PropertyMetadata prop = new PropertyMetadata();
+ prop.setName(name);
+ String svalue = (String) getMetaValueFactory().unwrap(mapValue.get(name));
+ prop.setValue(svalue);
+
+// String nameType = name + ".type";
+// MetaValue typeValue = mapValue.get(nameType);
+// if (typeValue != null) {
+// String type = (String) getMetaValueFactory().unwrap(typeValue);
+// prop.setType(type);
+// }
+ list.add(prop);
+ }
+ unwrapValue = list;
+ } else {
+ unwrapValue = super.unwrapValue(beanInfo, property, value);
+ }
+ return unwrapValue;
+ }
+
+ @Override
+ public Class<TranslatorMetaData> getType() {
+ return TranslatorMetaData.class;
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/templates/TranslatorMetadataICF.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfo.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfo.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfo.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,68 @@
+/*
+ * 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.templates;
+
+import java.util.Map;
+
+import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.plugins.BasicDeploymentTemplateInfo;
+import org.jboss.metatype.api.types.SimpleMetaType;
+import org.teiid.deployers.ManagedPropertyUtil;
+import org.teiid.resource.cci.TranslatorProperty;
+
+/**
+ * This class defines the template for all the translator classes. Each Translator's class
+ * defines its properties through {@link TranslatorProperty} annotation. This class need to
+ * present them as template properties that can be managed.
+ */
+public class TranslatorTemplateInfo extends BasicDeploymentTemplateInfo {
+
+ private static final long serialVersionUID = 9066758787789280783L;
+ static final String TEMPLATE_NAME = "template-name"; //$NON-NLS-1$
+
+
+ public TranslatorTemplateInfo(String name, String description, Map<String, ManagedProperty> properties) {
+ super(name, description, properties);
+ }
+
+ public void start() {
+ populate();
+ }
+
+ @Override
+ public TranslatorTemplateInfo copy() {
+ TranslatorTemplateInfo copy = new TranslatorTemplateInfo(getName(), getDescription(), getProperties());
+ super.copy(copy);
+ copy.populate();
+
+ return copy;
+ }
+
+ private void populate() {
+ addProperty(buildTemplateProperty(getName()));
+ }
+
+ static ManagedProperty buildTemplateProperty(String name) {
+ return ManagedPropertyUtil.createProperty(TEMPLATE_NAME,SimpleMetaType.STRING,
+ "Template Name", "The Name of the Teiid Connector Template", true, true, name);//$NON-NLS-1$ //$NON-NLS-2$
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfo.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfoFactory.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfoFactory.java (rev 0)
+++ trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfoFactory.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,67 @@
+/*
+ * 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.templates;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jboss.managed.api.DeploymentTemplateInfo;
+import org.jboss.managed.api.ManagedProperty;
+import org.teiid.deployers.ManagedPropertyUtil;
+import org.teiid.deployers.TranslatorPropertyUtil;
+import org.teiid.resource.cci.TranslatorProperty;
+
+public class TranslatorTemplateInfoFactory {
+
+ /**
+ * Create a DeploymentTemplateInfo by scanning the metadata attachment class
+ * for ManagementProperty annotations.
+ *
+ * @param infoClass - the DeploymentTemplateInfo implementation to use. Must have a ctor with sig (String,String,Map).
+ * @param attachmentClass - the metadata class to scan for ManagementProperty annotations
+ * @param name - the template name
+ * @param description - the template description
+ * @return the DeploymentTemplateInfo instance
+ * @throws Exception on failure to create the DeploymentTemplateInfo
+ */
+ public DeploymentTemplateInfo createTemplateInfo(Class<? extends DeploymentTemplateInfo> infoClass, Class<?> attachmentClass, String name, String description) throws Exception {
+
+ Map<Method, TranslatorProperty> props = TranslatorPropertyUtil.getTranslatorProperties(attachmentClass);
+
+ Map<String, ManagedProperty> infoProps = new HashMap<String, ManagedProperty>();
+
+ Collection<TranslatorProperty> propertyInfos = props.values();
+ if (propertyInfos != null && !propertyInfos.isEmpty()) {
+ for (TranslatorProperty propertyInfo : propertyInfos) {
+ ManagedProperty mp = ManagedPropertyUtil.convert(propertyInfo);
+ infoProps.put(mp.getName(), mp);
+ }
+ }
+ Class<?>[] parameterTypes = { String.class, String.class, Map.class };
+ Constructor<? extends DeploymentTemplateInfo> ctor = infoClass.getConstructor(parameterTypes);
+ DeploymentTemplateInfo info = ctor.newInstance(name, description,infoProps);
+ return info;
+ }
+}
Property changes on: trunk/runtime/src/main/java/org/teiid/templates/TranslatorTemplateInfoFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/runtime/src/main/java/org/teiid/transport/LogonImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/LogonImpl.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/transport/LogonImpl.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,13 +34,13 @@
import org.teiid.client.security.SessionToken;
import org.teiid.client.util.ResultsFuture;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.net.TeiidURL;
import org.teiid.security.Credentials;
import com.metamatrix.api.exception.ComponentNotFoundException;
import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.core.CoreConstants;
import com.metamatrix.dqp.service.SessionService;
import com.metamatrix.dqp.service.SessionServiceException;
Modified: trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/transport/SSLAwareChannelHandler.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -51,12 +51,12 @@
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.handler.ssl.SslHandler;
import org.jboss.netty.handler.stream.ChunkedWriteHandler;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.net.NetPlugin;
import org.teiid.net.socket.ObjectChannel;
import com.metamatrix.common.buffer.StorageManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
/**
* Main class for creating Netty Nio Channels
Modified: trunk/runtime/src/main/java/org/teiid/transport/ServerWorkItem.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/ServerWorkItem.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/transport/ServerWorkItem.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -34,6 +34,8 @@
import org.teiid.adminapi.AdminProcessingException;
import org.teiid.client.util.ResultsFuture;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.net.socket.Message;
import org.teiid.net.socket.ServiceInvocationStruct;
import org.teiid.runtime.RuntimePlugin;
@@ -41,8 +43,6 @@
import com.metamatrix.api.exception.ExceptionHolder;
import com.metamatrix.api.exception.MetaMatrixProcessingException;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
import com.metamatrix.common.util.crypto.CryptoException;
import com.metamatrix.core.MetaMatrixRuntimeException;
Modified: trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -28,15 +28,15 @@
import org.teiid.client.security.ILogon;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.net.CommunicationException;
import org.teiid.net.NetPlugin;
import org.teiid.net.socket.Handshake;
import org.teiid.net.socket.Message;
import org.teiid.net.socket.ObjectChannel;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.util.crypto.CryptoException;
import com.metamatrix.common.util.crypto.Cryptor;
import com.metamatrix.common.util.crypto.DhKeyGenerator;
Modified: trunk/runtime/src/main/java/org/teiid/transport/SocketListener.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/SocketListener.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/java/org/teiid/transport/SocketListener.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -30,14 +30,14 @@
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.net.socket.ObjectChannel;
import org.teiid.runtime.RuntimePlugin;
import org.teiid.transport.ChannelListener.ChannelListenerFactory;
import com.metamatrix.common.buffer.StorageManager;
-import com.metamatrix.common.log.LogConstants;
-import com.metamatrix.common.log.LogManager;
-import com.metamatrix.common.log.MessageLevel;
import com.metamatrix.common.util.ApplicationInfo;
import com.metamatrix.core.util.NamedThreadFactory;
Modified: trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties
===================================================================
--- trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties 2010-05-07 16:24:50 UTC (rev 2103)
@@ -283,7 +283,6 @@
vdb_delete_failed=Failed to delete the cached metadata files due to:
vdb_deployed=VDB "{0}" deployed in {1} state.
vdb_undeployed=VDB "{0}" undeployed.
-jndi_not_found=For {0}.{1} VDB, JNDI resource "{2}" not found for Source Name "{3}"
system_vdb_load_error=System.vdb needs to be loaded before any other VDBs.
fail_to_deploy="{0}" Can not be deployed because model "{1}" is not fully configured.
failed_to_retrive_metadata="{0}" Can not be deployed because model "{1}" can not retrieve metadata.
@@ -295,6 +294,12 @@
invalid_udf_file=No "path" information found to load the FUNCTION model {0}; FUNCTION model must have path information.
failed_matadata_load=Failed to load metadata for VDB {0}.{1}
vdb_not_found=VDB {0}.{1} not found deployed.
-jndi_not_found=For {0}.{1} VDB, JNDI resource "{2}" not found for Source Name "{3}"
+translator_not_found=For {0}.{1} VDB, Translator "{2}" not found.
+datasource_not_found=For {0}.{1} VDB, Data Source "{2}" not found.
vdb_activated={0}.{1} status has been changed to active
-vdb_inactivated={0}.{1} status has been changed to inactive. Check the connector mappings!
+vdb_inactivated={0}.{1} status has been changed to inactive. Check the required translators and data sources!
+translator_started=Teiid translator "{0}" has started.
+invalid_class={0} invalid type of class specified. Must be of type org.teiid.connector.api.Connector
+class_not_found=Class {0} not found.
+translator_stopped=Teiid translator "{0}" stopped
+no_set_method=No {0} method found for translator property {1}
\ No newline at end of file
Copied: trunk/runtime/src/test/java/org/teiid/deployers/TestExtendedPropertyMetadata.java (from rev 2076, trunk/jboss-integration/src/test/java/org/teiid/templates/connector/TestExtendedPropertyMetadata.java)
===================================================================
--- trunk/runtime/src/test/java/org/teiid/deployers/TestExtendedPropertyMetadata.java (rev 0)
+++ trunk/runtime/src/test/java/org/teiid/deployers/TestExtendedPropertyMetadata.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,97 @@
+/*
+ * 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.deployers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.teiid.deployers.ExtendedPropertyMetadata;
+
+ at SuppressWarnings("nls")
+public class TestExtendedPropertyMetadata {
+
+ @Test
+ public void testDefault() {
+ ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("x", "java.lang.String", "some-name", null);
+
+ Assert.assertEquals("some-name", metadata.display());
+ Assert.assertEquals(null, metadata.description());
+ Assert.assertEquals(false, metadata.advanced());
+ Assert.assertEquals(false, metadata.required());
+ Assert.assertEquals(false, metadata.masked());
+ Assert.assertEquals(true , metadata.readOnly());
+ }
+
+ @Test
+ public void testFormatted() {
+ ArrayList<String> allowed = new ArrayList<String>();
+ allowed.add("get");
+ allowed.add("post");
+
+ ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("x", "java.lang.String", "{$display:\"Is Immutable\",$description:\"True if the source never changes.\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}", null);
+
+ Assert.assertEquals("Is Immutable", metadata.display());
+ Assert.assertEquals("True if the source never changes.", metadata.description());
+ Assert.assertEquals(true, metadata.advanced());
+ Assert.assertEquals(true, metadata.required());
+ Assert.assertEquals(false, metadata.masked());
+ Assert.assertEquals(true , metadata.readOnly());
+ Assert.assertEquals(allowed , Arrays.asList(metadata.allowed()));
+ }
+
+ @Test
+ public void testFormattedExtraCommasAndColons() {
+ ArrayList<String> allowed = new ArrayList<String>();
+ allowed.add("get");
+ allowed.add("post");
+
+ ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("x", "java.lang.String","{$display:\"Is Immu:table\",$description:\"True if the, source never changes.\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}", null);
+
+ Assert.assertEquals("Is Immu:table", metadata.display());
+ Assert.assertEquals("True if the, source never changes.", metadata.description());
+ Assert.assertEquals(true, metadata.advanced());
+ Assert.assertEquals(true, metadata.required());
+ Assert.assertEquals(false, metadata.masked());
+ Assert.assertEquals(true , metadata.readOnly());
+ Assert.assertEquals(allowed , Arrays.asList(metadata.allowed()));
+ }
+
+ @Test
+ public void testBlankProperties() {
+ ArrayList<String> allowed = new ArrayList<String>();
+ allowed.add("get");
+ allowed.add("post");
+
+ ExtendedPropertyMetadata metadata = new ExtendedPropertyMetadata("x", "java.lang.String","{$display:\"Is Immutable\",$description:\"\",$allowed:[\"get\",\"post\"], $required:\"true\",$advanced:\"true\"}", null);
+
+ Assert.assertEquals("Is Immutable", metadata.display());
+ Assert.assertEquals("", metadata.description());
+ Assert.assertEquals(true, metadata.advanced());
+ Assert.assertEquals(true, metadata.required());
+ Assert.assertEquals(false, metadata.masked());
+ Assert.assertEquals(true , metadata.readOnly());
+ Assert.assertEquals(allowed , Arrays.asList(metadata.allowed()));
+ }
+}
Added: trunk/runtime/src/test/java/org/teiid/deployers/TestTranslatorDeployer.java
===================================================================
--- trunk/runtime/src/test/java/org/teiid/deployers/TestTranslatorDeployer.java (rev 0)
+++ trunk/runtime/src/test/java/org/teiid/deployers/TestTranslatorDeployer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -0,0 +1,60 @@
+/*
+ * 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.deployers;
+
+import org.junit.Test;
+import org.teiid.adminapi.impl.TranslatorMetaData;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.TranslatorProperty;
+import static org.junit.Assert.*;
+
+ at SuppressWarnings("nls")
+public class TestTranslatorDeployer {
+
+ @Test
+ public void testBuildExecutionFactory() throws Exception {
+ TranslatorMetaData tm = new TranslatorMetaData();
+
+ tm.setCapabilitiesClass("capabilities");
+ tm.setXaCapable(true);
+ tm.addProperty("my-property", "correctly-assigned");
+
+ TranslatorDeployer td = new TranslatorDeployer();
+ MyTranslator my = (MyTranslator)td.buildTranslator(MyTranslator.class.getName(), tm);
+
+ assertEquals("capabilities", my.getCapabilitiesClass());
+ assertEquals("correctly-assigned", my.getMyProperty());
+ }
+
+ public static class MyTranslator extends BasicExecutionFactory {
+ String mine;
+
+ @TranslatorProperty(name="my-property")
+ public String getMyProperty() {
+ return mine;
+ }
+
+ public void setMyProperty(String value) {
+ this.mine = value;
+ }
+ }
+}
Property changes on: trunk/runtime/src/test/java/org/teiid/deployers/TestTranslatorDeployer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/MockConnector.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/MockConnector.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/common/src/test/java/org/teiid/connector/metadata/runtime/MockConnector.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -5,15 +5,6 @@
import junit.framework.TestCase;
import org.mockito.Mockito;
-import org.teiid.connector.api.Connection;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.api.ExecutionContext;
-import org.teiid.connector.api.ProcedureExecution;
-import org.teiid.connector.api.ResultSetExecution;
-import org.teiid.connector.basic.BasicConnection;
-import org.teiid.connector.basic.BasicConnector;
-import org.teiid.connector.basic.BasicConnectorCapabilities;
import org.teiid.connector.language.Call;
import org.teiid.connector.language.ColumnReference;
import org.teiid.connector.language.DerivedColumn;
@@ -21,112 +12,108 @@
import org.teiid.connector.language.QueryExpression;
import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
import org.teiid.connector.metadata.runtime.Column.SearchType;
+import org.teiid.resource.ConnectorException;
+import org.teiid.resource.adapter.BasicConnectorCapabilities;
+import org.teiid.resource.adapter.BasicExecutionFactory;
+import org.teiid.resource.cci.ConnectorCapabilities;
+import org.teiid.resource.cci.ExecutionContext;
+import org.teiid.resource.cci.ProcedureExecution;
+import org.teiid.resource.cci.ResultSetExecution;
-public class MockConnector extends BasicConnector {
+public class MockConnector extends BasicExecutionFactory {
@Override
public ConnectorCapabilities getCapabilities() {
return new BasicConnectorCapabilities();
}
+
@Override
- public Connection getConnection() throws ConnectorException {
- return new BasicConnection() {
- @Override
- public void close() {
-
- }
-
- @Override
- public ProcedureExecution createProcedureExecution(
- Call procedure, ExecutionContext executionContext,
- RuntimeMetadata metadata) throws ConnectorException {
- Properties props = new Properties();
- props.setProperty("customBehaviour", "SkipExecute");//$NON-NLS-1$ //$NON-NLS-2$
-
- AbstractMetadataRecord metaObject = procedure.getMetadataObject();
-
- TestCase.assertEquals("AnyModel.ProcedureB",procedure.getProcedureName()); //$NON-NLS-1$
- TestCase.assertEquals("PROC", metaObject.getNameInSource()); //$NON-NLS-1$
- TestCase.assertEquals(props, metaObject.getProperties());
- ProcedureExecution exec = Mockito.mock(ProcedureExecution.class);
- Mockito.stub(exec.next()).toReturn(null);
- return exec;
- }
-
- @Override
- public ResultSetExecution createResultSetExecution(
- QueryExpression query, ExecutionContext executionContext,
- RuntimeMetadata metadata) throws ConnectorException {
- Properties groupProps = new Properties();
- groupProps.setProperty("customName", "CustomTableA");//$NON-NLS-1$ //$NON-NLS-2$
- NamedTable group = (NamedTable)query.getProjectedQuery().getFrom().get(0);
- AbstractMetadataRecord groupMD = group.getMetadataObject();
- TestCase.assertEquals(groupProps, groupMD.getProperties());
-
-
- DerivedColumn symbl = query.getProjectedQuery().getDerivedColumns().get(0);
- ColumnReference element = (ColumnReference)symbl.getExpression();
- Column elementMD = element.getMetadataObject();
-
- Properties elementProps = new Properties();
- elementProps.setProperty("customPosition", "11");//$NON-NLS-1$ //$NON-NLS-2$
-
- TestCase.assertEquals(0, elementMD.getLength());
- TestCase.assertEquals("Foo", elementMD.getDefaultValue()); //$NON-NLS-1$
- TestCase.assertEquals("TrimNulls", elementMD.getFormat()); //$NON-NLS-1$
- TestCase.assertEquals(String.class, elementMD.getJavaType());
- TestCase.assertEquals(null, elementMD.getMaximumValue());
- TestCase.assertEquals(null, elementMD.getMinimumValue());
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#anySimpleType", elementMD.getBaseTypeID()); //$NON-NLS-1$
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#string", elementMD.getPrimitiveTypeID()); //$NON-NLS-1$
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#string", elementMD.getDatatypeID()); //$NON-NLS-1$
- TestCase.assertEquals("COLUMN1", elementMD.getNameInSource()); //$NON-NLS-1$
- TestCase.assertEquals("STR", elementMD.getNativeType()); //$NON-NLS-1$
- TestCase.assertEquals(NullType.Nullable, elementMD.getNullType());
- TestCase.assertEquals(0, elementMD.getPosition());
- TestCase.assertEquals(0, elementMD.getPrecision());
- TestCase.assertEquals(0, elementMD.getScale());
- TestCase.assertEquals(SearchType.Searchable, elementMD.getSearchType());
- TestCase.assertEquals(false, elementMD.isAutoIncremented());
- TestCase.assertEquals(true, elementMD.isCaseSensitive());
- TestCase.assertEquals(elementProps, elementMD.getProperties());
-
-
- DerivedColumn symbl2 = query.getProjectedQuery().getDerivedColumns().get(1);
- ColumnReference element2 = (ColumnReference)symbl2.getExpression();
- Column elementMD2 = element2.getMetadataObject();
-
- Properties elementProps2 = new Properties();
- elementProps2.setProperty("customPosition", "12");//$NON-NLS-1$ //$NON-NLS-2$
-
- TestCase.assertEquals(10, elementMD2.getLength());
- TestCase.assertEquals("23", elementMD2.getDefaultValue()); //$NON-NLS-1$
- TestCase.assertEquals("YesFormat", elementMD2.getFormat()); //$NON-NLS-1$
- TestCase.assertEquals(Integer.class, elementMD2.getJavaType());
- TestCase.assertEquals("1", elementMD2.getMaximumValue()); //$NON-NLS-1$
- TestCase.assertEquals("100", elementMD2.getMinimumValue()); //$NON-NLS-1$
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#long", elementMD2.getBaseTypeID()); //$NON-NLS-1$
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#decimal", elementMD2.getPrimitiveTypeID()); //$NON-NLS-1$
- TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#int", elementMD2.getDatatypeID()); //$NON-NLS-1$
- TestCase.assertEquals("COLUMN2", elementMD2.getNameInSource()); //$NON-NLS-1$
- TestCase.assertEquals("INT", elementMD2.getNativeType()); //$NON-NLS-1$
- TestCase.assertEquals(NullType.No_Nulls, elementMD2.getNullType());
- TestCase.assertEquals(1, elementMD2.getPosition());
- TestCase.assertEquals(0, elementMD2.getPrecision());
- TestCase.assertEquals(10, elementMD2.getScale());
- TestCase.assertEquals(SearchType.Searchable, elementMD2.getSearchType());
- TestCase.assertEquals(true, elementMD2.isAutoIncremented());
- TestCase.assertEquals(false, elementMD2.isCaseSensitive());
-
- TestCase.assertEquals(elementProps2, elementMD2.getProperties());
- ResultSetExecution exec = Mockito.mock(ResultSetExecution.class);
- Mockito.stub(exec.next()).toReturn(null);
- return exec;
- }
-
- };
+ public ProcedureExecution createProcedureExecution(
+ Call procedure, ExecutionContext executionContext,
+ RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ Properties props = new Properties();
+ props.setProperty("customBehaviour", "SkipExecute");//$NON-NLS-1$ //$NON-NLS-2$
+
+ AbstractMetadataRecord metaObject = procedure.getMetadataObject();
+
+ TestCase.assertEquals("AnyModel.ProcedureB",procedure.getProcedureName()); //$NON-NLS-1$
+ TestCase.assertEquals("PROC", metaObject.getNameInSource()); //$NON-NLS-1$
+ TestCase.assertEquals(props, metaObject.getProperties());
+ ProcedureExecution exec = Mockito.mock(ProcedureExecution.class);
+ Mockito.stub(exec.next()).toReturn(null);
+ return exec;
}
+
+ @Override
+ public ResultSetExecution createResultSetExecution(
+ QueryExpression query, ExecutionContext executionContext,
+ RuntimeMetadata metadata, Object connection) throws ConnectorException {
+ Properties groupProps = new Properties();
+ groupProps.setProperty("customName", "CustomTableA");//$NON-NLS-1$ //$NON-NLS-2$
+ NamedTable group = (NamedTable)query.getProjectedQuery().getFrom().get(0);
+ AbstractMetadataRecord groupMD = group.getMetadataObject();
+ TestCase.assertEquals(groupProps, groupMD.getProperties());
+
+
+ DerivedColumn symbl = query.getProjectedQuery().getDerivedColumns().get(0);
+ ColumnReference element = (ColumnReference)symbl.getExpression();
+ Column elementMD = element.getMetadataObject();
+ Properties elementProps = new Properties();
+ elementProps.setProperty("customPosition", "11");//$NON-NLS-1$ //$NON-NLS-2$
+
+ TestCase.assertEquals(0, elementMD.getLength());
+ TestCase.assertEquals("Foo", elementMD.getDefaultValue()); //$NON-NLS-1$
+ TestCase.assertEquals("TrimNulls", elementMD.getFormat()); //$NON-NLS-1$
+ TestCase.assertEquals(String.class, elementMD.getJavaType());
+ TestCase.assertEquals(null, elementMD.getMaximumValue());
+ TestCase.assertEquals(null, elementMD.getMinimumValue());
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#anySimpleType", elementMD.getBaseTypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#string", elementMD.getPrimitiveTypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#string", elementMD.getDatatypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("COLUMN1", elementMD.getNameInSource()); //$NON-NLS-1$
+ TestCase.assertEquals("STR", elementMD.getNativeType()); //$NON-NLS-1$
+ TestCase.assertEquals(NullType.Nullable, elementMD.getNullType());
+ TestCase.assertEquals(0, elementMD.getPosition());
+ TestCase.assertEquals(0, elementMD.getPrecision());
+ TestCase.assertEquals(0, elementMD.getScale());
+ TestCase.assertEquals(SearchType.Searchable, elementMD.getSearchType());
+ TestCase.assertEquals(false, elementMD.isAutoIncremented());
+ TestCase.assertEquals(true, elementMD.isCaseSensitive());
+ TestCase.assertEquals(elementProps, elementMD.getProperties());
+
+
+ DerivedColumn symbl2 = query.getProjectedQuery().getDerivedColumns().get(1);
+ ColumnReference element2 = (ColumnReference)symbl2.getExpression();
+ Column elementMD2 = element2.getMetadataObject();
+
+ Properties elementProps2 = new Properties();
+ elementProps2.setProperty("customPosition", "12");//$NON-NLS-1$ //$NON-NLS-2$
+
+ TestCase.assertEquals(10, elementMD2.getLength());
+ TestCase.assertEquals("23", elementMD2.getDefaultValue()); //$NON-NLS-1$
+ TestCase.assertEquals("YesFormat", elementMD2.getFormat()); //$NON-NLS-1$
+ TestCase.assertEquals(Integer.class, elementMD2.getJavaType());
+ TestCase.assertEquals("1", elementMD2.getMaximumValue()); //$NON-NLS-1$
+ TestCase.assertEquals("100", elementMD2.getMinimumValue()); //$NON-NLS-1$
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#long", elementMD2.getBaseTypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#decimal", elementMD2.getPrimitiveTypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("http://www.w3.org/2001/XMLSchema#int", elementMD2.getDatatypeID()); //$NON-NLS-1$
+ TestCase.assertEquals("COLUMN2", elementMD2.getNameInSource()); //$NON-NLS-1$
+ TestCase.assertEquals("INT", elementMD2.getNativeType()); //$NON-NLS-1$
+ TestCase.assertEquals(NullType.No_Nulls, elementMD2.getNullType());
+ TestCase.assertEquals(1, elementMD2.getPosition());
+ TestCase.assertEquals(0, elementMD2.getPrecision());
+ TestCase.assertEquals(10, elementMD2.getScale());
+ TestCase.assertEquals(SearchType.Searchable, elementMD2.getSearchType());
+ TestCase.assertEquals(true, elementMD2.isAutoIncremented());
+ TestCase.assertEquals(false, elementMD2.isCaseSensitive());
+
+ TestCase.assertEquals(elementProps2, elementMD2.getProperties());
+ ResultSetExecution exec = Mockito.mock(ResultSetExecution.class);
+ Mockito.stub(exec.next()).toReturn(null);
+ return exec;
+ }
}
Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -25,9 +25,9 @@
import java.util.Arrays;
import java.util.List;
-import org.teiid.connector.jdbc.oracle.OracleCapabilities;
-import org.teiid.connector.jdbc.sqlserver.SQLServerCapabilities;
import org.teiid.dqp.internal.datamgr.impl.CapabilitiesConverter;
+import org.teiid.translator.jdbc.oracle.OracleCapabilities;
+import org.teiid.translator.jdbc.sqlserver.SQLServerCapabilities;
import com.metamatrix.core.util.UnitTestUtil;
import com.metamatrix.query.metadata.QueryMetadataInterface;
Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -31,8 +31,8 @@
import org.mockito.Mockito;
import org.teiid.adminapi.impl.VDBMetaData;
-import org.teiid.connector.api.SourceSystemFunctions;
import org.teiid.metadata.TransformationMetadata;
+import org.teiid.resource.cci.SourceSystemFunctions;
import com.metamatrix.core.util.ObjectConverterUtil;
import com.metamatrix.core.util.UnitTestUtil;
Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -32,7 +32,6 @@
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.client.DQP;
import org.teiid.client.security.ILogon;
-import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.metadata.runtime.MetadataStore;
import org.teiid.connector.metadata.runtime.Schema;
import org.teiid.deployers.MetadataStoreGroup;
@@ -44,6 +43,7 @@
import org.teiid.dqp.internal.process.DQPCore;
import org.teiid.metadata.index.IndexMetadataFactory;
import org.teiid.metadata.index.VDBMetadataFactory;
+import org.teiid.resource.ConnectorException;
import org.teiid.services.SessionServiceImpl;
import org.teiid.transport.ClientServiceRegistry;
import org.teiid.transport.ClientServiceRegistryImpl;
@@ -75,7 +75,7 @@
this.dqp.setTransactionService(new FakeTransactionService());
ConnectorManagerRepository cmr = Mockito.mock(ConnectorManagerRepository.class);
- Mockito.stub(cmr.getConnectorManager("jndi:source")).toReturn(new ConnectorManager("x") {
+ Mockito.stub(cmr.getConnectorManager("source")).toReturn(new ConnectorManager("x", "x") {
@Override
public SourceCapabilities getCapabilities()
throws ConnectorException {
@@ -104,14 +104,14 @@
ModelMetaData model = new ModelMetaData();
model.setName(schema.getName());
vdbMetaData.addModel(model);
- model.addSourceMapping("source", "jndi:source");
+ model.addSourceMapping("source", "translator", "jndi:source");
}
for (Schema schema : metadata.getSchemas().values()) {
ModelMetaData model = new ModelMetaData();
model.setName(schema.getName());
vdbMetaData.addModel(model);
- model.addSourceMapping("source", "jndi:source");
+ model.addSourceMapping("source", "translator", "jndi:source");
}
try {
Modified: trunk/test-integration/db/src/test/java/org/teiid/adminapi/jboss/TestConnectorBindings.java
===================================================================
--- trunk/test-integration/db/src/test/java/org/teiid/adminapi/jboss/TestConnectorBindings.java 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/db/src/test/java/org/teiid/adminapi/jboss/TestConnectorBindings.java 2010-05-07 16:24:50 UTC (rev 2103)
@@ -16,7 +16,6 @@
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
-import java.util.Properties;
import java.util.Set;
import org.junit.After;
@@ -26,8 +25,6 @@
import org.teiid.adminapi.Admin;
import org.teiid.adminapi.AdminException;
import org.teiid.adminapi.AdminFactory;
-import org.teiid.adminapi.ConnectionFactory;
-import org.teiid.adminapi.ConnectionPoolStatistics;
import org.teiid.adminapi.DataPolicy;
import org.teiid.adminapi.Model;
import org.teiid.adminapi.PropertyDefinition;
@@ -35,11 +32,11 @@
import org.teiid.adminapi.Session;
import org.teiid.adminapi.Transaction;
import org.teiid.adminapi.VDB;
-import org.teiid.adminapi.WorkerPoolStatistics;
import com.metamatrix.core.util.ObjectConverterUtil;
import com.metamatrix.core.util.UnitTestUtil;
+ at SuppressWarnings("nls")
public class TestConnectorBindings extends BaseConnection {
static ServerDatasourceConnection ds;
static Admin admin;
@@ -69,89 +66,7 @@
}
admin.close();
}
-
- @Test public void testLoopbackConnectorBinding() throws Exception {
- ConnectionFactory binding = admin.getConnectionFactory("loopy"); //$NON-NLS-1$
-
- if (binding != null) {
- admin.deleteConnectionFactory("loopy"); //$NON-NLS-1$
- }
-
- Properties p = new Properties();
- p.setProperty("jndi-name", "loopy"); //$NON-NLS-1$ //$NON-NLS-2$
- p.setProperty("CapabilitiesClass", "org.teiid.connector.jdbc.loopback.LoopbackCapabilities"); //$NON-NLS-1$ //$NON-NLS-2$
-
- ConnectionFactory cf = admin.addConnectionFactory("loopy","connector-loopback-7.0.0-SNAPSHOT", p); //$NON-NLS-1$ //$NON-NLS-2$
- System.out.println(cf.getProperties());
-
-// admin.setConnectionFactoryProperty("loopy", "CapabilitiesClass", "org.teiid.connector.BasicCapabilities");
-// cf = admin.getConnectionFactory("loopy");
-// System.out.println(cf.getProperties());
- }
- @Test public void testLoopbackUpdate() throws Exception {
- ConnectionFactory cf = admin.getConnectionFactory("loopy"); //$NON-NLS-1$
- System.out.println(cf.getProperties());
-
- admin.setConnectionFactoryProperty("loopy", "CapabilitiesClass", "org.teiid.connector.LoopyCapabilities");
- cf = admin.getConnectionFactory("loopy");
- System.out.println(cf.getProperties());
- }
-
- @Test public void testGetConnectorFactories() throws Exception {
- Collection<ConnectionFactory> cfs = admin.getConnectionFactories();
- for(ConnectionFactory cf:cfs) {
- System.out.println(cf.getName());
- }
- ConnectionFactory cf = admin.getConnectionFactory("products-cf"); //$NON-NLS-1$
- System.out.println(cf.getName());
- }
-
- @Test public void testDSConnectorBinding() throws Exception {
- ConnectionFactory binding = admin.getConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
-
- if (binding != null) {
- admin.deleteConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
- }
-
- Properties p = new Properties();
- p.setProperty("jndi-name", "test-mysql-cb"); //$NON-NLS-1$ //$NON-NLS-2$
- p.setProperty("CapabilitiesClass", "org.teiid.connector.jdbc.mysql.MySQL5Capabilities"); //$NON-NLS-1$ //$NON-NLS-2$
- p.setProperty("XaCapable", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-
- p.setProperty("DatabaseName", "txntest");
- p.setProperty("PortNumber", "3306");
- p.setProperty("ServerName", "localhost");
- p.setProperty("addtional-ds-properties", "foo=bar, t= x");
- p.setProperty("user-name", "rareddy");
- p.setProperty("password", "mm");
- p.setProperty("xa-datasource-class", "com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
-
- admin.addConnectionFactory("test-mysql-cb","connector-jdbc-xa-7.0.0-SNAPSHOT", p); //$NON-NLS-1$ //$NON-NLS-2$
-
- binding = admin.getConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
-
- assertNotNull(binding);
-
- assertEquals("org.teiid.connector.jdbc.mysql.MySQL5Capabilities", binding.getPropertyValue("CapabilitiesClass")); //$NON-NLS-1$ //$NON-NLS-2$
-
- admin.stopConnectionFactory("test-mysql-cb");
-
- admin.startConnectionFactory("test-mysql-cb");
-
- admin.setConnectionFactoryProperty("test-mysql-cb", "XaCapable", "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
- binding = admin.getConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
-
- assertEquals("false", binding.getPropertyValue("XaCapable")); //$NON-NLS-1$ //$NON-NLS-2$
-
- //admin.deleteConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
-
- //binding = admin.getConnectionFactory("test-mysql-cb"); //$NON-NLS-1$
-
- //assertNull(binding);
- }
-
@Test public void testVDBDeploy() throws Exception {
VDB vdb = admin.getVDB("TransactionsRevisited", 1); //$NON-NLS-1$
@@ -166,9 +81,6 @@
Set<VDB> vdbs = admin.getVDBs();
assertTrue(vdbs.size() >= 1);
- Collection<ConnectionFactory> bindings = admin.getConnectionFactoriesInVDB("TransactionsRevisited",1); //$NON-NLS-1$
- assertEquals(2, bindings.size());
-
admin.deleteVDB("TransactionsRevisited", 1); //$NON-NLS-1$
assertNull(admin.getVDB("TransactionsRevisited", 1)); //$NON-NLS-1$
@@ -290,7 +202,7 @@
@Test
public void testConnectorTypeProperties() throws Exception {
- Collection<PropertyDefinition> defs = admin.getConnectorTemplatePropertyDefinitions("connector-jdbc-xa-7.0.0-SNAPSHOT"); //$NON-NLS-1$
+ Collection<PropertyDefinition> defs = admin.getTranslatorTemplatePropertyDefinitions("connector-jdbc-xa-7.0.0-SNAPSHOT"); //$NON-NLS-1$
for (PropertyDefinition pd:defs) {
System.out.println(pd.getName()+":"+pd.getPropertyTypeClassName());
if (pd.getName().equals("ExtensionTranslationClassName")) { //$NON-NLS-1$
@@ -318,7 +230,7 @@
@Test
public void testConnectorTypes() throws Exception {
- Set<String> defs = admin.getConnectorTemplateNames();
+ Set<String> defs = admin.getTranslatorTemplateNames();
// assertTrue(defs.contains("connector-salesforce-7.0.0-SNAPSHOT")); //$NON-NLS-1$
// assertTrue(defs.contains("connector-jdbc-7.0.0-SNAPSHOT")); //$NON-NLS-1$
// assertTrue(defs.contains("connector-text-7.0.0-SNAPSHOT")); //$NON-NLS-1$
@@ -327,25 +239,7 @@
System.out.println(defs);
}
-
@Test
- public void testConnectorAddDelete() throws Exception{
- File f = new File(UnitTestUtil.getTestDataPath()+"/connector-loopback.rar"); //$NON-NLS-1$
- FileInputStream fis = new FileInputStream(f);
- admin.addConnector("connector-loopy.rar", fis); //$NON-NLS-1$
- fis.close();
-
- Set<String> names = admin.getConnectorTemplateNames();
- System.out.println(names);
- assertTrue(names.contains("connector-loopy")); //$NON-NLS-1$
-
- admin.deleteConnector("connector-loopy.rar"); //$NON-NLS-1$
-
- names = admin.getConnectorTemplateNames();
- //assertTrue(!names.contains("connector-loopy")); //$NON-NLS-1$
- }
-
- @Test
public void testExportVDB() throws Exception{
File f = new File(UnitTestUtil.getTestScratchPath()+"/TransactionsRevisited.vdb"); //$NON-NLS-1$
@@ -361,7 +255,7 @@
}
@Test public void testAssignConnectorBinding() throws Exception {
- admin.assignConnectionFactoryToModel("TransactionsRevisited", 1, "pm1", "mysql", "jndi:FOO"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ admin.assignToModel("TransactionsRevisited", 1, "pm1", "mysql", "mysql", "jndi:FOO"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
boolean checked = false;
VDB vdb = admin.getVDB("TransactionsRevisited", 1); //$NON-NLS-1$
@@ -371,7 +265,7 @@
List<String> sources = model.getSourceNames();
for (String source:sources) {
if (source.equals("mysql")) { //$NON-NLS-1$
- assertEquals("jndi:FOO", model.getSourceJndiName(source)); //$NON-NLS-1$
+ assertEquals("jndi:FOO", model.getSourceConnectionJndiName(source)); //$NON-NLS-1$
checked = true;
}
}
Modified: trunk/test-integration/pom.xml
===================================================================
--- trunk/test-integration/pom.xml 2010-05-07 13:30:14 UTC (rev 2102)
+++ trunk/test-integration/pom.xml 2010-05-07 16:24:50 UTC (rev 2103)
@@ -41,9 +41,8 @@
</dependency>
<dependency>
<groupId>org.jboss.teiid.connectors</groupId>
- <artifactId>connector-jdbc</artifactId>
+ <artifactId>translator-jdbc</artifactId>
<version>${project.version}</version>
- <classifier>lib</classifier>
</dependency>
<dependency>
<groupId>org.jboss.teiid</groupId>
More information about the teiid-commits
mailing list