Author: vhalbert(a)redhat.com
Date: 2009-09-11 15:18:01 -0400 (Fri, 11 Sep 2009)
New Revision: 1325
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTest.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionUtil.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DatasourceMgr.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/TransactionFactory.java
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
trunk/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
trunk/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
trunk/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
trunk/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
Log:
Teiid 773 - organize integration test
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,61 @@
+package org.teiid.test.framework;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+
+public class ConfigPropertyLoader {
+ /**
+ * Specify this property to set a specific configuration to use
+ */
+ public static final String CONFIG_FILE="config";
+
+ /**
+ * The default config file to use when #CONFIG_FILE system property isn't set
+ */
+ private static final String
DEFAULT_CONFIG_FILE_NAME="default-config.properties";
+
+ public static Properties loadConfigurationProperties() {
+ return loadConfiguration();
+ }
+
+ private static Properties loadConfiguration() {
+ String filename = System.getProperty(CONFIG_FILE);
+ if (filename == null) {
+ filename = DEFAULT_CONFIG_FILE_NAME;
+ }
+
+ return loadProperties(filename);
+
+ }
+
+ private static Properties loadProperties(String filename) {
+ Properties props = null;
+ try {
+ InputStream in =
ConnectionStrategyFactory.class.getResourceAsStream("/"+ filename);
+ if (in != null) {
+ props = new Properties();
+ props.load(in);
+ return props;
+ }
+ else {
+ throw new RuntimeException("Failed to load properties from file
'"+filename+ "' configuration file");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading properties from file
'"+filename+ "'" + e.getMessage());
+ }
+ }
+
+ public static void main(String[] args) {
+ Properties props = ConfigPropertyLoader.loadConfigurationProperties();
+ if (props == null || props.isEmpty()) {
+ throw new RuntimeException("Failed to load config properties file");
+
+ }
+ System.out.println("Loaded Config Properties " + props.toString());
+
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/ConfigPropertyLoader.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,11 @@
+package org.teiid.test.framework;
+
+public interface DataSourceSetup {
+
+
+ void setup() throws Exception;
+
+
+ int getDataSourceCnt();
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/DataSourceSetup.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.datasource.DatasourceMgr;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+
+
+
+
+public abstract class TransactionContainer {
+
+ private boolean debug = false;
+
+ protected Properties props;
+ protected ConnectionStrategy connStrategy;
+
+ protected TransactionContainer(ConnectionStrategy strategy){
+ this.connStrategy = strategy;
+ this.props = new Properties();
+ this.props.putAll(this.connStrategy.getEnvironment());
+
+ }
+
+
+ /**
+ * Returns <code>true</code> if the test <b>CANNOT</b> be
run due to not have the right
+ * number of datasources available.
+ *
+ */
+ protected boolean turnOffTest (int numberofDataSources) {
+ boolean rtn = (numberofDataSources >
DatasourceMgr.getInstance().numberOfAvailDataSources());
+ if (rtn) {
+ System.out.println("Required Number of DataSources is " +
numberofDataSources + " but availables sources is " +
DatasourceMgr.getInstance().numberOfAvailDataSources());
+ }
+ return rtn;
+ }
+
+ protected void before(TransactionQueryTest test){}
+
+ protected void after(TransactionQueryTest test) {}
+
+ public void runTransaction(TransactionQueryTest test) {
+
+ if (turnOffTest(test.getNumberRequiredDataSources())) {
+ detail("Transaction test: " + test.getTestName() + " will not be
run");
+ return;
+
+ }
+
+ detail("Start transaction test: " + test.getTestName());
+
+ try {
+ test.setupDataSource();
+
+ debug(" setConnection");
+ test.setConnection(getConnection());
+ test.setExecutionProperties(this.props);
+ debug(" before(test)");
+
+ before(test);
+ debug(" test.before");
+
+ test.before();
+
+ debug(" test.testcase");
+
+ // run the test
+ test.testCase();
+
+ }catch(Throwable e) {
+ if (!test.exceptionExpected()) {
+ e.printStackTrace();
+ }
+ throw new TransactionRuntimeException(e.getMessage());
+ }finally {
+ debug(" test.after");
+
+ test.after();
+ debug(" after(test)");
+
+ after(test);
+ debug(" test.cleanup");
+
+ test.cleanup();
+
+ detail("End transaction test: " + test.getTestName());
+
+ }
+
+ try {
+ detail("Start validation: " + test.getTestName());
+
+ test.validateTestCase();
+
+ detail("End validation: " + test.getTestName());
+
+ }catch(Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+
+ protected Connection getConnection() throws QueryTestFailedException {
+ return this.connStrategy.getConnection();
+ }
+
+ protected XAConnection getXAConnection() throws QueryTestFailedException {
+ return this.connStrategy.getXAConnection();
+ }
+
+
+ public Properties getEnvironmentProperties() {
+ return props;
+ }
+
+ protected void debug(String message) {
+ if (debug) {
+ System.out.println(message);
+ }
+
+ }
+
+ protected void detail(String message) {
+ System.out.println(message);
+ }
+
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionContainer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTest.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTest.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTest.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,131 @@
+package org.teiid.test.framework;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+/**
+ * The TransactionQueryTest interface represents the transaction test framework from
which
+ * the @link TransactionContainer operates.
+ * @author vanhalbert
+ *
+ */
+
+public interface TransactionQueryTest {
+
+ /**
+ * Returns the name of the test so that better tracing of what tests are
running/completing.
+ * @return String is test name
+ */
+ String getTestName();
+
+ /**
+ * Called by the @link TransactionContainer to set the Teiid connection to be used in
the test.
+ * @param conn
+ *
+ * @since
+ */
+ void setConnection(Connection conn);
+
+
+ /**
+ * Returns the connection being used in the test.
+ * @return
+ *
+ * @since
+ */
+ Connection getConnection();
+
+ XAConnection getXAConnection();
+
+
+ /**
+ * Called to set the properties used to initialize prior
+ * to execution.
+ * @param props
+ *
+ * @since
+ */
+ void setExecutionProperties(Properties props) ;
+
+ /**
+ * The test case has to specify how many sources its using so that the correct
+ * data setup is performed.
+ * @return int is the number of datasources in use
+ *
+ * @since
+ */
+
+ int getNumberRequiredDataSources();
+
+ /**
+ * Called by the {@link TransactionContainer} prior to testcase processing so that
+ * the datasource data can be setup for the specific testcase.
+ *
+ *
+ * @since
+ */
+ void setupDataSource();
+
+
+ /**
+ * Override <code>before</code> if there is behavior that needs to be
performed
+ * prior to {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void before();
+
+ /**
+ * Implement testCase(), it is the entry point to the execution of the test.
+ * @throws Exception
+ *
+ * @since
+ */
+ void testCase() throws Exception;
+
+
+ /**
+ * Override <code>after</code> if there is behavior that needs to be
performed
+ * after {@link #testCase()} being called.
+ *
+ *
+ * @since
+ */
+ void after() ;
+
+ /**
+ * Indicates what should be done when a failure occurs in {@link #testCase()}
+ * @return
+ *
+ * @since
+ */
+ boolean rollbackAllways() ;
+
+ boolean exceptionExpected();
+
+ boolean exceptionOccurred();
+
+
+ /**
+ * Called at the end of the test so that the testcase can clean itself up by
+ * releasing any resources, closing any open connections, etc.
+ *
+ *
+ * @since
+ */
+ void cleanup();
+
+ /**
+ * validateTestCase is called after the testcase has been completed. This enables
+ * the validation to be performed as part of the overall testcase.
+ * @throws Exception
+ *
+ * @since
+ */
+ void validateTestCase() throws Exception;
+
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/TransactionQueryTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.datasource.DataSource;
+import org.teiid.test.framework.datasource.DatasourceMgr;
+import org.teiid.adminapi.Admin;
+import org.teiid.adminapi.AdminOptions;
+import org.teiid.adminapi.ConnectorBinding;
+import org.teiid.adminapi.Model;
+import org.teiid.adminapi.VDB;
+import org.teiid.connector.jdbc.JDBCPropertyNames;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+
+
+public abstract class ConnectionStrategy {
+ /**
+ * Connection Type indicates the type of connection (strategy) to use
+ */
+ public static final String CONNECTION_TYPE = "connection-type";
//$NON-NLS-1$
+
+ /**
+ * The connection types that map to connection strategies
+ * ****************************************************************
+ */
+ // used to create the jdb driver
+ public static final String DRIVER_CONNECTION = "driver"; //$NON-NLS-1$
+ // used to create a datasource
+ public static final String DATASOURCE_CONNECTION = "datasource";
//$NON-NLS-1$
+ // used for when embedded is running in an appserver
+ public static final String JNDI_CONNECTION = "jndi"; //$NON-NLS-1$
+ /*
+ * ******************************************************************
+ */
+
+ public static final String DS_USER = "user"; //$NON-NLS-1$
+
+ // need both user variables because Teiid uses 'user' and connectors use
'username'
+ public static final String DS_USERNAME = JDBCPropertyNames.USERNAME; //$NON-NLS-1$
+ public static final String DS_PASSWORD = JDBCPropertyNames.PASSWORD;
//$NON-NLS-1$
+
+ // the driver is only used for making direct connections to the source, the
+ // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE driver class
+ public static final String DS_DRIVER = "driver"; //$NON-NLS-1$
+
+ public static final String DS_URL = JDBCPropertyNames.URL; //$NON-NLS-1$
+ public static final String DS_SERVERNAME = "servername"; //$NON-NLS-1$
+ public static final String DS_SERVERPORT = "portnumber"; //$NON-NLS-1$
+ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$
+ public static final String DS_DATABASENAME = "databasename"; //$NON-NLS-1$
+ public static final String DS_APPLICATION_NAME = "application-name";
//$NON-NLS-1$
+
+ public static final String PROCESS_BATCH = "process-batch"; //$NON-NLS-1$
+ public static final String CONNECTOR_BATCH = "connector-batch";
//$NON-NLS-1$
+ public static final String JNDINAME_USERTXN = "usertxn-jndiname";
//$NON-NLS-1$
+
+
+ public static final String AUTOCOMMIT = "autocommit"; //$NON-NLS-1$
+
+ public static final String EXEC_IN_BATCH = "execute.in.batch";
//$NON-NLS-1$
+
+
+ public ConnectionStrategy(Properties props) throws QueryTestFailedException {
+ this.env = props;
+
+
+ }
+
+ /*
+ * Lifecycle methods for managing the connection
+ */
+
+ /**
+ * Returns a connection
+ * @return Connection
+ */
+ public abstract Connection getConnection() throws QueryTestFailedException;
+
+ public Connection getAdminConnection() throws QueryTestFailedException{
+ return null;
+ }
+
+ private boolean autoCommit;
+ public boolean getAutocommit() {
+ return autoCommit;
+ }
+
+ public abstract void shutdown();
+
+ public XAConnection getXAConnection() throws QueryTestFailedException {
+ return null;
+ }
+
+
+ private Properties env = null;
+
+
+ public Properties getEnvironment() {
+ return env;
+ }
+
+ class CloseInterceptor implements InvocationHandler {
+
+ Connection conn;
+
+ CloseInterceptor(Connection conn) {
+ this.conn = conn;
+ }
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
+ if (method.getName().equals("close")) { //$NON-NLS-1$
+ return null;
+ }
+ try {
+ return method.invoke(this.conn, args);
+ } catch (InvocationTargetException e) {
+ throw e.getTargetException();
+ }
+ }
+ }
+
+
+ void configure() throws QueryTestFailedException {
+
+ String ac = this.env.getProperty(AUTOCOMMIT, "true");
+ this.autoCommit = Boolean.getBoolean(ac);
+
+ com.metamatrix.jdbc.api.Connection c =null;
+ try {
+
+ // the the driver strategy is going to be used to connection directly to the
connector binding
+ // source, then no administration can be done
+ java.sql.Connection conn = getConnection();
+ if ( conn instanceof com.metamatrix.jdbc.api.Connection) {
+ c = (com.metamatrix.jdbc.api.Connection) conn;
+ } else {
+ return;
+ }
+
+ Admin admin = (Admin)c.getAdminAPI();
+
+ boolean update = false;
+ Properties p = new Properties();
+ if (this.env.getProperty(PROCESS_BATCH) != null) {
+ p.setProperty("metamatrix.buffer.processorBatchSize",
this.env.getProperty(PROCESS_BATCH)); //$NON-NLS-1$
+ update = true;
+ }
+
+ if (this.env.getProperty(CONNECTOR_BATCH) != null) {
+ p.setProperty("metamatrix.buffer.connectorBatchSize",
this.env.getProperty(CONNECTOR_BATCH)); //$NON-NLS-1$
+ update = true;
+ }
+
+ // update the system.
+// if (update) {
+// admin.s
+// admin.updateSystemProperties(p);
+// }
+ setupVDBConnectorBindings(admin);
+
+ admin.restart();
+
+ System.out.println("Bouncing the system..(wait 15 seconds)");
//$NON-NLS-1$
+ Thread.sleep(1000*15);
+ // Thread.sleep(1000*60);
+ System.out.println("done."); //$NON-NLS-1$
+
+ } catch (Exception e) {
+ e.printStackTrace();
+
+ throw new TransactionRuntimeException(e);
+ } finally {
+ // need to close and flush the connection after restarting
+ this.shutdown();
+
+ }
+ }
+
+ protected void setupVDBConnectorBindings(Admin api) throws QueryTestFailedException
{
+
+ try {
+
+ Collection<VDB> vdbs = api.getVDBs("*");
+ if (vdbs == null) {
+ throw new QueryTestFailedException("GetVDBS returned no vdbs
available");
+
+ } else if (vdbs.size() != 1) {
+ throw new QueryTestFailedException("GetVDBS returned more than 1 vdb
available");
+ }
+ VDB vdb = (VDB) vdbs.iterator().next();
+ Iterator<Model> modelIt = vdb.getModels().iterator();
+ while (modelIt.hasNext() ) {
+ Model m = modelIt.next();
+
+ if (!m.isPhysical()) continue;
+
+ // get the mapping, if defined
+ String mappedName = this.env.getProperty(m.getName());
+
+ String useName = m.getName();
+ if(mappedName != null) {
+ useName = mappedName;
+ }
+
+ org.teiid.test.framework.datasource.DataSource ds =
DatasourceMgr.getInstance().getDatasource(useName);
+// Properties sourceProps =
DatasourceMgr.getInstance().getDatasourceProperties(useName);
+
+ if (ds != null) {
+
+ AdminOptions ao = new AdminOptions(AdminOptions.OnConflict.OVERWRITE);
+ ao.addOption(AdminOptions.BINDINGS_IGNORE_DECRYPT_ERROR);
+
+ api.addConnectorBinding(ds.getName(), ds.getType(), ds.getProperties(), ao);
+
+ api.assignBindingToModel(ds.getName(), vdb.getName(), vdb.getVDBVersion(),
m.getName());
+
+ } else {
+ throw new QueryTestFailedException("Error: Unable to create binding to
map to model : " + m.getName() + ", the mapped name " + useName + "
had no datasource properties defined");
+ }
+
+ }
+
+// Collection<ConnectorBinding> bindings =
api.getConnectorBindingsInVDB("*");
+//
+// for (Iterator<ConnectorBinding> it=bindings.iterator(); it.hasNext();)
{
+// ConnectorBinding cb = it.next();
+//
+// cb.
+//
+// String mappedName = this.env.getProperty(cb.getName());
+//
+// String useName = cb.getName();
+// if(mappedName != null) {
+// useName = mappedName;
+// }
+//
+// Properties sourceProps =
DatasourceMgr.getInstance().getDatasourceProperties(useName);
+//
+// if (sourceProps != null) {
+// Properties newprops = new Properties(cb.getProperties());
+// newprops.putAll(sourceProps);
+// api.updateProperties(cb.getName(),
"org.teiid.adminapi.ConnectorBinding", newprops);
+//
+// } else {
+// System.err.println("WARNING: ConnectorBinding : " + cb.getName() +
" was not updated, the mapped name " + useName + " had no datasource
properties defined");
+// }
+//
+//
+//
+// }
+ } catch (QueryTestFailedException qt) {
+ throw qt;
+ } catch (Exception t) {
+ throw new QueryTestFailedException(t);
+ }
+
+
+ }
+
+
+ /**
+ * The datasource_identifier must match one of the mappings in the file
+ * at {@see} src/main/resources/datasources/datasource_mapping.txt
+ * @param datasource_identifier
+ * @return
+ *
+ * @since
+ */
+// public XAConnection getXASource(String datasource_identifier) {
+// return null;
+// }
+//
+// public Connection getSource(String datasource_identifier) {
+// return null;
+// }
+
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategy.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+public class ConnectionStrategyFactory {
+
+ /**
+ * Specify this property to set a specific configuration to use
+ */
+ public static final String CONFIG_FILE="config";
+
+ /**
+ * The default config file to use when #CONFIG_FILE system property isn't set
+ */
+ private static final String
DEFAULT_CONFIG_FILE_NAME="default-config.properties";
+
+ private static ConnectionStrategyFactory _instance = null;
+ private ConnectionStrategy strategy = null;
+ private Properties config = null;
+ private static Map<String, ConnectionStrategy> sources = null;
+
+
+
+ private ConnectionStrategyFactory(){
+ }
+
+ public static synchronized ConnectionStrategyFactory getInstance() {
+ if (_instance == null) {
+ _instance = new ConnectionStrategyFactory();
+ Properties p = _instance.loadConfiguration();
+ try {
+ _instance.initialize(p);
+ } catch (QueryTestFailedException e) {
+ // TODO Auto-generated catch block
+ throw new TransactionRuntimeException(e);
+ }
+ }
+ return _instance;
+ }
+
+ private static void init() {
+ if (sources == null) {
+ sources = new HashMap<String, ConnectionStrategy>();
+ }
+ }
+
+
+ public static synchronized void destroyInstance() {
+ if (_instance != null) {
+ _instance.shutdown();
+
+ _instance = null;
+
+
+ }
+ }
+
+ private void shutdown() {
+ Properties p = System.getProperties();
+ p.remove(CONFIG_FILE);
+
+
+ for (Iterator it=sources.keySet().iterator(); it.hasNext(); ){
+
+ ConnectionStrategy cs = sources.get(it.next());
+ try {
+ cs.shutdown();
+ } catch (Exception e) {
+
+ }
+
+ }
+ sources.clear();
+ sources = null;
+
+ strategy.shutdown();
+ strategy = null;
+ config = null;
+
+ }
+
+ public Properties getConfiguration() {
+ return this.config;
+ }
+
+ public ConnectionStrategy getConnectionStrategy() {
+ return this.strategy;
+ }
+
+ private Properties loadConfiguration() {
+ init();
+
+ String filename = System.getProperty(CONFIG_FILE);
+ if (filename == null) {
+ filename = DEFAULT_CONFIG_FILE_NAME;
+ }
+
+ return loadProperties(filename);
+
+ }
+
+ private void initialize(Properties props) throws QueryTestFailedException {
+ this.config = props;
+
+ this.strategy = create(props);
+
+ }
+
+ private ConnectionStrategy create(Properties props) throws QueryTestFailedException
{
+
+ ConnectionStrategy strategy = null;
+
+ String type = props.getProperty(ConnectionStrategy.CONNECTION_TYPE,
ConnectionStrategy.DRIVER_CONNECTION);
+ if (type == null) {
+ throw new RuntimeException("Property " +
ConnectionStrategy.CONNECTION_TYPE + " was specified");
+ }
+
+ if (type.equalsIgnoreCase(ConnectionStrategy.DRIVER_CONNECTION)) {
+ strategy = createDriverStrategy(null, props);
+ System.out.println("Created Driver Strategy");
+ }
+ else if (type.equalsIgnoreCase(ConnectionStrategy.DATASOURCE_CONNECTION)) {
+ strategy = createDataSourceStrategy(null, props);
+ System.out.println("Created DataSource Strategy");
+ }
+ else if (type.equalsIgnoreCase(ConnectionStrategy.JNDI_CONNECTION)) {
+ strategy = createJEEStrategy(null, props);
+ System.out.println("Created JEE Strategy");
+ }
+
+ if (strategy == null) {
+ new TransactionRuntimeException("Invalid property value for " +
ConnectionStrategy.CONNECTION_TYPE + " is " + type );
+ }
+ // call configure here because this is creating the connection to Teiid
+ // direct connections to the datasource use the static call directly to create
strategy and don't need to configure
+ strategy.configure();
+ return strategy;
+ }
+
+ public synchronized static ConnectionStrategy createDriverStrategy(String
identifier, Properties props) throws QueryTestFailedException {
+ if (identifier == null) {
+ return new DriverConnection(props);
+ }
+ init();
+
+ ConnectionStrategy strategy = null;
+ if (sources.containsKey(identifier)) {
+ strategy = sources.get(identifier);
+ } else {
+ strategy = new DriverConnection(props);
+ sources.put(identifier, strategy);
+ }
+
+ return strategy;
+
+ }
+
+ public synchronized static ConnectionStrategy createDataSourceStrategy(String
identifier, Properties props) throws QueryTestFailedException {
+ if (identifier == null) {
+ return new DataSourceConnection(props);
+ }
+ init();
+
+ ConnectionStrategy strategy = null;
+ if (sources.containsKey(identifier)) {
+ strategy = sources.get(identifier);
+ } else {
+ strategy = new DataSourceConnection(props);
+ sources.put(identifier, strategy);
+ }
+
+ return strategy;
+
+ }
+
+ public synchronized static ConnectionStrategy createJEEStrategy(String identifier,
Properties props) throws QueryTestFailedException {
+ if (identifier == null) {
+ return new JEEConnection(props);
+ }
+
+ init();
+ ConnectionStrategy strategy = null;
+ if (sources.containsKey(identifier)) {
+ strategy = sources.get(identifier);
+ } else {
+ strategy = new JEEConnection(props);
+ sources.put(identifier, strategy);
+ }
+
+ return strategy;
+
+ }
+
+ private final Properties loadProperties(String filename) {
+ Properties props = null;
+ try {
+ InputStream in =
ConnectionStrategyFactory.class.getResourceAsStream("/"+filename);
+ if (in != null) {
+ props = new Properties();
+ props.load(in);
+ return props;
+ }
+ else {
+ throw new RuntimeException("Failed to load properties from file
'"+filename+ "' configuration file");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading properties from file
'"+filename+ "'" + e.getMessage());
+ }
+ }
+
+ public static void main(String[] args) {
+ ConnectionStrategyFactory cf = ConnectionStrategyFactory.getInstance();
+
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionStrategyFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionUtil.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionUtil.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionUtil.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,81 @@
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.datasource.DatasourceMgr;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+public class ConnectionUtil {
+ public static final Connection getSource(String identifier)
+ throws QueryTestFailedException {
+ if (identifier != null) {
+ Properties props = ConfigPropertyLoader
+ .loadConfigurationProperties();
+ String mappedName = props.getProperty(identifier);
+
+ if (mappedName == null) {
+ throw new TransactionRuntimeException("Identifier mapping "
+ + identifier
+ + " is not defined in the config properties file");
+ }
+
+ Properties sourceProps;
+ try {
+ sourceProps = DatasourceMgr.getInstance()
+ .getDatasourceProperties(mappedName);
+ } catch (QueryTestFailedException e) {
+ throw new TransactionRuntimeException(e);
+ }
+
+ if (sourceProps == null) {
+ throw new TransactionRuntimeException("Identifier "
+ + identifier + " mapped to " + mappedName
+ + " has no datasource properties");
+ }
+
+ return ConnectionStrategyFactory.createDriverStrategy(identifier,
+ sourceProps).getConnection();
+
+ }
+ throw new RuntimeException("No Connection by name :" + identifier);
//$NON-NLS-1$
+ }
+
+ public static final XAConnection getXASource(String identifier)
+ throws QueryTestFailedException {
+ if (identifier != null) {
+ Properties props = ConfigPropertyLoader
+ .loadConfigurationProperties();
+ String mappedName = props.getProperty(identifier);
+
+ if (mappedName == null) {
+ throw new TransactionRuntimeException("Identifier mapping "
+ + identifier
+ + " is not defined in the config properties file");
+ }
+
+ Properties sourceProps;
+ try {
+ sourceProps = DatasourceMgr.getInstance()
+ .getDatasourceProperties(mappedName);
+ } catch (QueryTestFailedException e) {
+ throw new TransactionRuntimeException(e);
+ }
+
+ if (sourceProps == null) {
+ throw new TransactionRuntimeException("Identifier "
+ + identifier + " mapped to " + mappedName
+ + " has no datasource properties");
+ }
+
+ return ConnectionStrategyFactory.createDataSourceStrategy(
+ identifier, sourceProps).getXAConnection();
+ }
+ throw new RuntimeException("No Connection by name :" + identifier);
//$NON-NLS-1$
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/ConnectionUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+import javax.sql.XADataSource;
+
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.jdbc.BaseDataSource;
+import com.metamatrix.jdbc.EmbeddedDataSource;
+import com.metamatrix.jdbc.MMDataSource;
+
+/**
+*
+*/
+public class DataSourceConnection extends ConnectionStrategy {
+
+ private String driver = null;
+ private String username = null;
+ private String pwd = null;
+ private String applName = null;
+ private String databaseName = null;
+ private String serverName = null;
+ private String portNumber = null;
+
+
+ private XAConnection xaConnection;
+
+ public DataSourceConnection(Properties props) throws QueryTestFailedException {
+ super(props);
+ }
+
+
+
+ public void validate() {
+ databaseName = this.getEnvironment().getProperty(DS_DATABASENAME);
+ if (databaseName == null || databaseName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DATABASENAME +
" was not specified");
+ }
+
+ serverName = this.getEnvironment().getProperty(DS_SERVERNAME);
+ if (serverName == null || serverName.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_SERVERNAME + "
was not specified");
+ }
+
+
+ this.portNumber = this.getEnvironment().getProperty(DS_SERVERPORT);
+
+ this.applName = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
+
+ driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (driver == null || driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER + " was
not specified");
+ }
+
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+
+ }
+
+//
+// public synchronized XAConnection getXAAdminConnection() throws
QueryTestFailedException {
+// if (xaConnection == null) {
+// try {
+// xaConnection = createAdminConnection();
+// } catch (Exception e) {
+// throw new QueryTestFailedException(e);
+// }
+// }
+// return xaConnection;
+// }
+
+
+ public Connection getConnection() throws QueryTestFailedException {
+ try {
+ return getXAConnection().getConnection();
+ } catch (QueryTestFailedException qtf) {
+ throw qtf;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new QueryTestFailedException(e);
+ }
+ }
+
+ public synchronized XAConnection getXAConnection() throws QueryTestFailedException {
+ if (xaConnection == null) {
+ validate();
+ try {
+ xaConnection = createConnection();
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+ return xaConnection;
+ }
+
+ private XAConnection createConnection() throws SQLException, InstantiationException,
IllegalAccessException, ClassNotFoundException {
+ BaseDataSource dataSource =
(BaseDataSource)Class.forName(this.driver).newInstance();
+
+ dataSource.setDatabaseName(this.databaseName);
+ if (this.applName != null) {
+ dataSource.setApplicationName(this.applName);
+ }
+
+ if (dataSource instanceof EmbeddedDataSource) {
+ ((EmbeddedDataSource)dataSource).setBootstrapFile(this.serverName);
+ } else {
+ ((MMDataSource)dataSource).setServerName(this.serverName);
+ ((MMDataSource)dataSource).setPortNumber(Integer.parseInt(this.portNumber));
+ }
+
+ if (this.username != null) {
+ dataSource.setUser(this.username);
+ dataSource.setPassword(this.pwd);
+ }
+
+
+ return ((XADataSource)dataSource).getXAConnection();
+ }
+
+// private XAConnection createAdminConnection() throws SQLException,
InstantiationException, IllegalAccessException, ClassNotFoundException {
+// BaseDataSource dataSource =
(BaseDataSource)Class.forName(this.driver).newInstance();
+//
+// dataSource.setDatabaseName("Admin");
+// if (this.applName != null) {
+// dataSource.setApplicationName(this.applName);
+// }
+//
+// if (dataSource instanceof EmbeddedDataSource) {
+// ((EmbeddedDataSource)dataSource).setBootstrapFile(this.serverName);
+// } else {
+// ((MMDataSource)dataSource).setServerName(this.serverName);
+// ((MMDataSource)dataSource).setPortNumber(Integer.parseInt(this.portNumber));
+// }
+//
+// if (this.username != null) {
+// dataSource.setUser(this.username);
+// dataSource.setPassword(this.pwd);
+// }
+//
+//
+// return ((XADataSource)dataSource).getXAConnection();
+// }
+
+// private static XAConnection getDataSource(String prefix, Properties props) throws
SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
+// // depending upon the DataDirect class hirarchy..
+// DataSource dataSource =
(DataSource)Class.forName(props.getProperty(DS_DRIVER)).newInstance();
+// PropertiesUtils.setBeanProperties(dataSource, props, prefix);
+//
+// return ((XADataSource)dataSource).getXAConnection();
+// }
+
+
+
+ public void shutdown() {
+ try {
+
+
+ if (this.xaConnection != null) {
+ this.xaConnection.close();
+ }
+ } catch (SQLException e) {
+ // ignore..
+ }
+
+ this.xaConnection = null;
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DataSourceConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+
+
+/**
+ * The DriverConnection strategy that can get connections in standalone mode
+ * or embedded mode.
+ */
+public class DriverConnection extends ConnectionStrategy{
+
+ private String url = null;
+ private String driver = null;
+ private String username = null;
+ private String pwd = null;
+
+ private Connection connection;
+
+
+ public DriverConnection(Properties props) throws QueryTestFailedException {
+ super(props);
+ }
+
+ public void validate() {
+
+ String urlProp = this.getEnvironment().getProperty(DS_URL);
+ if (urlProp == null || urlProp.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_URL + " was
not specified");
+ }
+ StringBuffer urlSB = new StringBuffer(urlProp);
+
+ String appl = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
+ if (appl != null) {
+ urlSB.append(";");
+
urlSB.append("ApplicationName").append("=").append(appl);
+ }
+
+ url = urlSB.toString();
+
+ driver = this.getEnvironment().getProperty(DS_DRIVER);
+ if (driver == null || driver.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_DRIVER + "
was not specified");
+ }
+
+ // need both user variables because Teiid uses 'user' and connectors use
'username'
+
+ this.username = this.getEnvironment().getProperty(DS_USER);
+ if (username == null) {
+ this.username = this.getEnvironment().getProperty(DS_USERNAME);
+ }
+ this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
+
+ try {
+ // Load jdbc driver
+ Class.forName(driver);
+ } catch (ClassNotFoundException e) {
+ throw new TransactionRuntimeException(e);
+ }
+
+ }
+
+ public synchronized Connection getConnection() throws QueryTestFailedException {
+ if (this.connection != null) {
+ try {
+ if (!this.connection.isClosed()) {
+ return this.connection;
+ }
+ } catch (SQLException e) {
+
+ }
+
+ }
+
+ validate();
+
+ this.connection = getJDBCConnection(this.driver, this.url, this.username,
this.pwd);
+ return this.connection;
+ }
+
+
+ private Connection getJDBCConnection(String driver, String url, String user, String
passwd) throws QueryTestFailedException {
+
+ System.out.println("Creating Connection: \"" + url +
"\""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Connection conn;
+ try {
+ // Create a connection
+ if (user != null && user.length() > 0) {
+ conn = DriverManager.getConnection(url, user, passwd);
+ } else {
+ conn = DriverManager.getConnection(url);
+ }
+
+
+ } catch (SQLException e) {
+ throw new QueryTestFailedException(e);
+ }
+ return conn;
+
+ }
+
+ public void shutdown() {
+ if (this.connection != null) {
+ try {
+ this.connection.close();
+ } catch (Exception e) {
+ //ignore
+ }
+ }
+
+ this.connection = null;
+
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/DriverConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.connection;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+
+
+/**
+ * JEE (JNDI) Connection Strategy, when the test is run inside an application server.
Make
+ * sure all the jndi names are set correctly in the properties file.
+ */
+public class JEEConnection extends ConnectionStrategy{
+
+ private String jndi_name = null;
+
+
+ public JEEConnection(Properties props) throws QueryTestFailedException {
+ super(props);
+ }
+
+ public Connection getConnection() throws QueryTestFailedException {
+ validate();
+ try {
+ InitialContext ctx = new InitialContext();
+ DataSource source = (DataSource)ctx.lookup(jndi_name);
+
+
+ if (source == null) {
+ String msg = "Unable to find jndi source " +
jndi_name;//$NON-NLS-1$
+
+ QueryTestFailedException mme = new
QueryTestFailedException(msg);//$NON-NLS-1$
+ throw mme;
+ }
+ Connection conn = source.getConnection();
+ return conn;
+ } catch (QueryTestFailedException qtfe) {
+ throw qtfe;
+ } catch (Exception e) {
+ throw new QueryTestFailedException(e);
+ }
+ }
+
+ public void shutdown() {
+ // no connection management here; app server takes care of these..
+ }
+
+ public void validate() {
+ // TODO Auto-generated method stub
+
+ jndi_name = getEnvironment().getProperty(ConnectionStrategy.DS_JNDINAME);
+ if (jndi_name == null || jndi_name.length() == 0) {
+ throw new TransactionRuntimeException("Property " + DS_JNDINAME + "
was not specified");
+ }
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/connection/JEEConnection.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,39 @@
+package org.teiid.test.framework.datasource;
+
+import java.util.Properties;
+
+public class DataSource {
+ public static final String DIRECTORY="dir";
+ public static final String CONNECTOR_TYPE="connectortype";
+
+ private Properties props;
+
+ private String name;
+ private String group;
+
+ public DataSource(String name, String group, Properties properties) {
+ this.name = name;
+ this.group = group;
+ this.props = properties;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return props.getProperty(CONNECTOR_TYPE);
+ }
+
+ public String getProperty(String propName) {
+ return props.getProperty(propName);
+ }
+
+ public Properties getProperties() {
+ return this.props;
+ }
+
+
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DataSource.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DatasourceMgr.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DatasourceMgr.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DatasourceMgr.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.datasource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.sql.XAConnection;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.teiid.test.framework.ConfigPropertyLoader;
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+import org.teiid.test.framework.exception.QueryTestFailedException;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+
+import com.metamatrix.common.xml.XMLReaderWriter;
+import com.metamatrix.common.xml.XMLReaderWriterImpl;
+
+/**
+ * The DatasourceMgr is responsible for loading and managing the datasource
+ * mapping properties file {@see #DATASOURCE_MAPPING_FILE} and the mapped
+ * datasource properties files. The {@link #getDatasourceProperties(String)}
+ * returns the properties defined for that datasourceid, which is mapped in the
+ * mnappings file. This mapping allows the test
+ *
+ * @author vanhalbert
+ *
+ */
+public class DatasourceMgr {
+
+ static final String DIRECTORY = "datasources/";
+ static final String DATASOURCE_MAPPING_FILE = "datasource_mapping.xml";
+
+ private static DatasourceMgr _instance = null;
+
+ private Map<String, Map<String, DataSource>>dstypeMap = new
HashMap<String, Map<String, DataSource>>();
+
+ private Map<String, DataSource> allDatasourcesMap = new HashMap<String,
DataSource>();
+
+ private DatasourceMgr() {
+ }
+
+ public static synchronized DatasourceMgr getInstance() {
+ if (_instance == null) {
+ _instance = new DatasourceMgr();
+ try {
+ _instance.loadDataSourceMappings();
+ } catch (QueryTestFailedException e) {
+ // TODO Auto-generated catch block
+ throw new TransactionRuntimeException(e);
+ } catch (TransactionRuntimeException e) {
+ // TODO Auto-generated catch block
+ throw e;
+ }
+
+ }
+ return _instance;
+ }
+
+ public int numberOfAvailDataSources() {
+ return allDatasourcesMap.size();
+ }
+
+ public org.teiid.test.framework.datasource.DataSource getDatasource(String
datasourceid)
+ throws QueryTestFailedException {
+ DataSource ds = null;
+ if (dstypeMap.containsKey(datasourceid)) {
+
+ Map datasources = dstypeMap.get(datasourceid);
+ ds = (DataSource) datasources.values().iterator().next();
+
+ } else {
+ ds = allDatasourcesMap.get(datasourceid);
+ }
+ if (ds == null) {
+ throw new QueryTestFailedException("DatasourceID " + datasourceid
+ + " is not a defined datasource in the mappings file ");
+
+ }
+ return ds;
+
+ }
+
+ public Properties getDatasourceProperties(String datasourceid)
+ throws QueryTestFailedException {
+ DataSource ds = null;
+ if (dstypeMap.containsKey(datasourceid)) {
+
+ Map datasources = dstypeMap.get(datasourceid);
+ ds = (DataSource)datasources.values().iterator().next();
+
+ } else {
+ ds = allDatasourcesMap.get(datasourceid);
+ }
+ if (ds == null) {
+ throw new QueryTestFailedException("DatasourceID " + datasourceid
+ + " is not a defined datasource in the mappings file ");
+
+ }
+ return ds.getProperties();
+
+ }
+
+ private void loadDataSourceMappings()
+ throws QueryTestFailedException {
+
+ Document doc = null;
+ XMLReaderWriter readerWriter = new XMLReaderWriterImpl();
+
+ try {
+ doc = readerWriter.readDocument(getInputStream());
+ } catch (JDOMException e) {
+ e.printStackTrace();
+ throw new TransactionRuntimeException(e);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new TransactionRuntimeException(e);
+ }
+
+ Element root = doc.getRootElement();
+ List<Element> rootElements = root.getChildren();
+ if (rootElements == null || rootElements.size() == 0) {
+ throw new TransactionRuntimeException("No children defined under root element
" + DSCONFIG);
+ }
+
+ for (Iterator<Element> it = rootElements.iterator(); it.hasNext();) {
+ Element type = it.next();
+// System.out.println("Loading ds transactional type " + type.getName());
+ String typename = type.getAttributeValue(Property.Attributes.NAME);
+
+ List<Element> typeElements = type.getChildren();
+ if (typeElements != null) {
+ Map<String, DataSource> datasources = new HashMap<String,
DataSource>(typeElements.size());
+
+ for (Iterator<Element> typeit = typeElements.iterator(); typeit.hasNext();) {
+ Element e = typeit.next();
+// System.out.println("Loading ds type " + e.getName());
+ addDataSource(e, typename, datasources);
+ }
+ dstypeMap.put(typename, datasources);
+ allDatasourcesMap.putAll(datasources);
+
+ }
+
+
+ }
+
+ if (dstypeMap == null || dstypeMap.isEmpty()) {
+ throw new TransactionRuntimeException(
+ "No Datasources were found in the mappings file");
+ }
+
+ System.out.println("Number of datasource types loaded " + dstypeMap.size());
+ System.out.println("Number of total datasource mappings loaded " +
allDatasourcesMap.size());
+
+
+
+ }
+
+ private static void addDataSource(Element element, String type, Map<String,
DataSource> datasources) {
+ String name = element.getAttributeValue(Property.Attributes.NAME);
+ Properties props = getProperties(element);
+
+ String dir = props.getProperty(DataSource.DIRECTORY);
+ String dsfile = DIRECTORY + dir + "/connection.properties";
+ Properties dsprops = loadProperties(dsfile);
+ if (dsprops != null) {
+ props.putAll(dsprops);
+ DataSource ds = new DataSource(name,
+ type,
+ props);
+ datasources.put(ds.getName(), ds);
+ System.out.println("Loaded datasource " + ds.getName());
+
+ }
+// else {
+// System.out.println("Did not load datasource " + name);
+// }
+
+ }
+
+
+ private static Properties loadProperties(String filename) {
+ Properties props = null;
+
+ try {
+ InputStream in = DatasourceMgr.class.getResourceAsStream("/"
+ + filename);
+ if (in != null) {
+ props = new Properties();
+ props.load(in);
+ return props;
+ }
+ return null;
+ } catch (IOException e) {
+ throw new TransactionRuntimeException("Error loading properties from file
'"
+ + filename + "'" + e.getMessage());
+ }
+ }
+
+ private static Properties getProperties(Element propertiesElement) {
+ Properties props = new Properties();
+
+ List<Element> properties = propertiesElement
+ .getChildren(Property.ELEMENT);
+ Iterator<Element> iterator = properties.iterator();
+ while (iterator.hasNext()) {
+ Element propertyElement = (Element) iterator.next();
+ String propertyName = propertyElement
+ .getAttributeValue(Property.Attributes.NAME);
+ String propertyValue = propertyElement.getText();
+
+ props.setProperty(propertyName, propertyValue);
+
+ }
+ return props;
+ }
+
+ private static InputStream getInputStream() {
+
+ InputStream in = DatasourceMgr.class.getResourceAsStream("/"
+ + DIRECTORY + DATASOURCE_MAPPING_FILE);
+ if (in != null) {
+
+ return in;
+ } else {
+ throw new RuntimeException(
+ "Failed to load datasource mapping file '" + DIRECTORY
+ + DATASOURCE_MAPPING_FILE + "'");
+ }
+
+ }
+
+ static final String DSCONFIG = "datasourceconfig";
+ static final String DATASOURCETYPE = "datasourcetype";
+ static final String DATASOURCE = "datasource";
+
+// static class DS_TYPE {
+//
+// /**
+// * This is the name of the Property Element.
+// */
+// public static final String XA_ELEMENT = "xa"; //$NON-NLS-1$
+// public static final String NONXA_ELEMENT = "nonxa"; //$NON-NLS-1$
+//
+// }
+
+ static class Property {
+
+ /**
+ * This is the name of the Property Element.
+ */
+ public static final String ELEMENT = "property"; //$NON-NLS-1$
+
+ /**
+ * This class defines the Attributes of the Element class that contains
+ * it.
+ */
+ public static class Attributes {
+ public static final String NAME = "name"; //$NON-NLS-1$
+ }
+
+ }
+
+ public static void main(String[] args) {
+ DatasourceMgr mgr = DatasourceMgr.getInstance();
+
+ try {
+ System.out.println("Value for ds_mysql5: "
+ + mgr.getDatasourceProperties("ds_mysql5"));
+ } catch (QueryTestFailedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/datasource/DatasourceMgr.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 2000-2005 MetaMatrix, Inc. All rights reserved.
+ */
+package org.teiid.test.framework.exception;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.metamatrix.core.MetaMatrixRuntimeException;
+import com.metamatrix.core.util.MetaMatrixExceptionUtil;
+
+/**
+ */
+
+ /**
+ * The QueryTestFailedException is thrown during a test.
+ *
+ * This exception which contains a reference to another exception. This
+ * class can be used to maintain a linked list of exceptions. <p>
+ *
+ * Subclasses of this exception typically only need to implement whatever
+ * constructors they need. <p>
+ */
+public class QueryTestFailedException extends Exception
+ implements Serializable{
+
//############################################################################################################################
+ //# Static Methods
#
+ //############################################################################################################################
+
+ /**
+ * @since
+ */
+ private static final long serialVersionUID = -4824998416118801290L;
+
+ /**
+ * Utility method to get the name of a class, without package information.
+ *
+ * @param cls The class to get the name of
+ * @return The name of the class, without package info
+ */
+ public static String getClassShortName( Class<?> cls ) {
+ if ( cls == null ) return ""; //$NON-NLS-1$
+ String className = cls.getName();
+ return className.substring( className.lastIndexOf('.')+1 );
+ }
+
+
//############################################################################################################################
+ //# Variables
#
+ //############################################################################################################################
+
+ /** An error code. */
+ private String code;
+
+ /** Exception chained to this one. */
+ private Throwable child;
+
+ private String msg;
+
+
//############################################################################################################################
+ //# Constructors
#
+ //############################################################################################################################
+
+ /**
+ * Construct a default instance of this class.
+ */
+ public QueryTestFailedException() {
+ }
+
+ /**
+ * Construct an instance with the specified error message. If the message is
actually a key, the actual message will be
+ * retrieved from a resource bundle using the key, the specified parameters will be
substituted for placeholders within the
+ * message, and the code will be set to the key.
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final String message) {
+ setMessage(message, null);
+ }
+
+ /**
+ * Construct an instance with the specified error code and message. If the message
is actually a key, the actual message will
+ * be retrieved from a resource bundle using the key, and the specified parameters
will be substituted for placeholders within
+ * the message.
+ * @param code The error code
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final String code, final String message) {
+ setMessage(message, null);
+ // The following setCode call should be executed after setting the message
+ setCode(code);
+ }
+
+ /**
+ * Construct an instance with a linked exception specified. If the exception is a
MetaMatrixException or a
+ * {@link MetaMatrixRuntimeException}, then the code will be set to the
exception's code.
+ * @param e An exception to chain to this exception
+ */
+ public QueryTestFailedException(final Throwable e) {
+ // This is nasty, but there's no setMessage() routine!
+ this.msg = ( e instanceof java.lang.reflect.InvocationTargetException )
+ ?
((java.lang.reflect.InvocationTargetException)e).getTargetException().getMessage()
+ : (e == null ? null : e.getMessage());
+ setChild( e );
+
+ }
+
+ /**
+ * Construct an instance with the linked exception and error message specified. If
the message is actually a key, the error
+ * message will be retrieved from a resource bundle the key, and code will be set to
that key. Otherwise, if the specified
+ * exception is a MetaMatrixException or a {@link MetaMatrixRuntimeException}, the
code will be set to the exception's code.
+ * @param e The exception to chain to this exception
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final Throwable e, final String message) {
+ setChild( e );
+ // The following setMessage call should be executed after attempting to set the
code from the passed-in exception
+ setMessage(message, null);
+
+ }
+
+
+ /**
+ * Construct an instance with the linked exception, error code, and error message
specified. If the message is actually a
+ * key, the error message will be retrieved from a resource bundle using the key.
+ * @param e The exception to chain to this exception
+ * @param code The error code
+ * @param message The error message or a resource bundle key
+ */
+ public QueryTestFailedException(final Throwable e, final String code, final String
message) {
+ setChild(e);
+ setMessage(message, null);
+ // The following setCode call should be executed after setting the message
+ setCode(code);
+ }
+
+
//############################################################################################################################
+ //# Methods
#
+ //############################################################################################################################
+
+ /**
+ * Get the exception which is linked to this exception.
+ *
+ * @return The linked exception
+ */
+ public Throwable getChild() {
+ return this.child;
+ }
+
+ /**
+ * Get the error code.
+ *
+ * @return The error code
+ */
+ public String getCode() {
+ return this.code;
+ }
+
+ /**
+ * Returns the error message, formatted for output. <P>
+ *
+ * The default formatting provided by this method is to prepend the
+ * error message with the level and the name of the class, and to
+ * append the error code on the end if a non-zero code is defined. <P>
+ *
+ * This method provides a hook for subclasses to override the default
+ * formatting of any one exception.
+ *
+ * @param except The exception to print
+ * @param level The depth of the exception in the chain of exceptions
+ * @return A formatted string for the exception
+ */
+ public String getFormattedMessage(final Throwable throwable, final int level) {
+
+ return ((level != 0) ? ("\n" + level + " ") : "" )
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ + "[" + getClassShortName(throwable.getClass()) + "]"
//$NON-NLS-1$ //$NON-NLS-2$
+ + ((code != null) ? (' ' + code + ": ") : "")
//$NON-NLS-1$//$NON-NLS-2$
+ + (throwable.getMessage() == null ? "" :
throwable.getMessage()); //$NON-NLS-1$
+ }
+
+ /**
+ * Get the full error message, including any message(s) from child
+ * exceptions. Messages of any exceptions chained to this exception are
+ * prepended with their "level" in the chain.
+ *
+ * @return The full error message
+ *
+ * @see #getFormattedMessage
+ */
+ public String getFullMessage() {
+ return MetaMatrixExceptionUtil.getLinkedMessages(this, 0 );
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Throwable#getMessage()
+ */
+ public String getMessage() {
+ return this.msg;
+ }
+
+ /**
+ * Set the exception which is linked to this exception. <P>
+ *
+ * For the special case of an InvocationTargetException, which is
+ * a wrapped exception provided in the <CODE>java.lang.reflect</CODE>
+ * package, the child is set to the wrapped exception, and the message,
+ * if not yet defined, is set to the message of the wrapped exception.
+ *
+ * @param child The linked exception
+ */
+ public void setChild( Throwable child ) {
+ // Special processing in case this is already a wrapped exception
+ if ( child instanceof java.lang.reflect.InvocationTargetException ) {
+ this.child =
((java.lang.reflect.InvocationTargetException)child).getTargetException();
+ } else {
+ this.child = child;
+ }
+ }
+
+ /**
+ * Set the error code.
+ *
+ * @param code The error code
+ */
+ public void setCode( String code ) {
+ this.code = code;
+ }
+
+ /**
+ * Sets the exception message to the specified text. If the message is actually a
resource bundle key, the actual message
+ * will be retrieved using that key, the specified parameters will be substituted
for placeholders within the message, and the
+ * code will be set to the key.
+ * @param message The message text or a resource bundle message key.
+ * @param parameters The list of parameters to substitute for placeholders in the
retrieved message.
+ * @since 3.1
+ */
+ private void setMessage(final String message, final List parameters) {
+ if (message == null) {
+ this.msg = message;
+ } else {
+ final String msg = message;
+// final String msg = TextManager.INSTANCE.getText(message, parameters);
+ final int len = msg.length();
+ if (msg.startsWith("<") && len >= 2) {
//$NON-NLS-1$
+ this.msg = msg.substring(1, len - 1);
+ } else {
+ this.msg = msg;
+ setCode(message);
+ }
+ }
+ }
+
+ /**
+ * Returns a string representation of this class.
+ *
+ * @return String representation of instance
+ */
+ public String toString() {
+ return getFullMessage();
+ }
+
+ // =========================================================================
+ // T E S T M E T H O D S
+ // =========================================================================
+
+ /**
+ * Test program for this class.
+ *
+ * @args The command line arguments
+ */
+
+ /*
+ public static void main( String[] args ) {
+ class TestAppException extends MetaMatrixException {
+ public TestAppException( Throwable e ) {
+ super( e );
+ }
+ public TestAppException( Throwable e, String message ) {
+ super( e, message );
+ }
+ } // END INNER CLASS
+
+ System.out.println( "\n2 MetaMatrixExceptions and 1 Exception..." );
+ try {
+ throw new MetaMatrixException(
+ new MetaMatrixException(
+ new Exception( "Non-chained exception" ),
+ "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 MetaMatrixExceptions..." );
+ try {
+ throw new MetaMatrixException(
+ new MetaMatrixException( 1001, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 MetaMatrixExceptions (1 a subclass)..." );
+ try {
+ throw new TestAppException(
+ new MetaMatrixException( 1001, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n2 exceptions (1 MetaMatrixException, 1
null)..." );
+ try {
+ throw new TestAppException(
+ new MetaMatrixException( null, "Nested Error" ),
+ "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n1 MetaMatrixException..." );
+ try {
+ throw new MetaMatrixException( 1002, "My App Error" );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n5 MetaMatrixExceptions..." );
+ try {
+ MetaMatrixException root = new MetaMatrixException( 50, "Root" );
+ MetaMatrixException cur = root;
+ MetaMatrixException next;
+ for ( int i = 1; i <= 5; i++ ) {
+ next = new MetaMatrixException( 50+i, "Nested exception " + i
);
+ cur.setChild( next );
+ cur = next;
+ }
+ throw root;
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+
+ System.out.println( "\n1 MetaMatrixException
(InvocationTargetException)..." );
+ try {
+ throw new TestAppException(
+ new java.lang.reflect.InvocationTargetException(
+ new java.lang.IllegalArgumentException( "You can't do
that!" ) ) );
+ } catch ( MetaMatrixException e ) {
+ System.out.println( "Message is \n" + e.getMessage() );
+ System.out.println( "Full message is \n" + e.getFullMessage() );
+ }
+ }
+ */
+ } // END CLASS
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/QueryTestFailedException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,23 @@
+package org.teiid.test.framework.exception;
+
+/**
+ * The TransactionRuntimeException is thrown outside of running a test.
+ * When this is thrown, the testing process should stop.
+ *
+ *
+ * @author vanhalbert
+ *
+ */
+public class TransactionRuntimeException extends RuntimeException{
+ /**
+ * @since
+ */
+ private static final long serialVersionUID = 1L;
+
+ public TransactionRuntimeException(Exception e){
+ super(e);
+ }
+ public TransactionRuntimeException(String msg){
+ super(msg);
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/exception/TransactionRuntimeException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import javax.naming.InitialContext;
+import javax.transaction.UserTransaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTest;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+
+
+
+
+public class JNDITransaction extends TransactionContainer {
+ UserTransaction userTxn = null;
+
+ public JNDITransaction(ConnectionStrategy strategy) {
+ super(strategy);
+ }
+
+ protected void before(TransactionQueryTest test) {
+ if (this.props.getProperty(ConnectionStrategy.JNDINAME_USERTXN) == null) {
+ throw new TransactionRuntimeException("No JNDI name found for the User
Transaction to look up in application server");
+ }
+
+ try {
+
+ // begin the transaction
+ InitialContext ctx = new InitialContext();
+ this.userTxn =
(UserTransaction)ctx.lookup(this.props.getProperty(ConnectionStrategy.JNDINAME_USERTXN));
+ this.userTxn.begin();
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ protected void after(TransactionQueryTest test) {
+ try {
+ if (this.userTxn != null) {
+ if (test.rollbackAllways()|| test.exceptionOccurred()) {
+ this.userTxn.rollback();
+ }
+ else {
+ this.userTxn.commit();
+ }
+ this.userTxn = null;
+ }
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/JNDITransaction.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import java.sql.SQLException;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTest;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+
+
+
+/**
+ * A transaction which is user controlled.
+ */
+public class LocalTransaction extends TransactionContainer {
+
+ public LocalTransaction(ConnectionStrategy strategy) {
+ super(strategy);
+
+// this.props.setProperty(ConnectionStrategy.TXN_AUTO_WRAP,
ConnectionStrategy.AUTO_WRAP_OFF);
+ }
+
+ protected void before(TransactionQueryTest test) {
+ try {
+ test.getConnection().setAutoCommit(this.connStrategy.getAutocommit());
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void after(TransactionQueryTest test) {
+ try {
+ if (test.rollbackAllways()|| test.exceptionOccurred()) {
+ test.getConnection().rollback();
+
+ }
+ else {
+ test.getConnection().commit();
+ }
+ } catch (SQLException e) {
+ throw new TransactionRuntimeException(e);
+ } finally {
+ try {
+ test.getConnection().setAutoCommit(true);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/LocalTransaction.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/TransactionFactory.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/TransactionFactory.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/TransactionFactory.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+
+
+
+public class TransactionFactory {
+
+ public static final String LOCAL_TRANSACTION = "local"; //$NON-NLS-1$
+ public static final String XATRANSACTION = "xa"; //$NON-NLS-1$
+ public static final String JNDI_TRANSACTION = "jndi"; //$NON-NLS-1$
+// public static final String OFFWRAP_TRANSACTION = "offwrap"; //$NON-NLS-1$
+// public static final String ONWRAP_TRANSACTION = "onwrap"; //$NON-NLS-1$
+
+
+
+ /**
+ * Transaction Type indicates the type of transaction container to use
+ */
+ public static final String TRANSACTION_TYPE = "transaction-type";
//$NON-NLS-1$
+// public static final String AUTOCOMMIT = "autocommit"; //$NON-NLS-1$
+
+
+ private TransactionFactory(){}
+
+
+ public static TransactionContainer create() {
+ TransactionContainer transacton = null;
+
+ ConnectionStrategy connstrategy =
ConnectionStrategyFactory.getInstance().getConnectionStrategy();
+
+
+ String type = connstrategy.getEnvironment().getProperty(TRANSACTION_TYPE,
LOCAL_TRANSACTION);
+ if (type == null) {
+ throw new RuntimeException("Property " + TRANSACTION_TYPE + " was
specified");
+ }
+
+ if (type.equalsIgnoreCase(LOCAL_TRANSACTION)) {
+ transacton = new LocalTransaction(connstrategy);
+ }
+ else if (type.equalsIgnoreCase(XATRANSACTION)) {
+ transacton = new XATransaction(connstrategy);
+ }
+ else if (type.equalsIgnoreCase(JNDI_TRANSACTION)) {
+ transacton = new JNDITransaction(connstrategy);
+
+ } else {
+ new TransactionRuntimeException("Invalid property value of " + type +
" for " + TRANSACTION_TYPE );
+ }
+
+ return transacton;
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/TransactionFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
===================================================================
---
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2000-2007 MetaMatrix, Inc.
+ * All rights reserved.
+ */
+package org.teiid.test.framework.transaction;
+
+import java.util.Random;
+
+import javax.transaction.xa.XAResource;
+
+import org.teiid.test.framework.TransactionContainer;
+import org.teiid.test.framework.TransactionQueryTest;
+import org.teiid.test.framework.exception.TransactionRuntimeException;
+import org.teiid.test.framework.connection.ConnectionStrategy;
+
+import com.metamatrix.common.xa.MMXid;
+
+public class XATransaction extends TransactionContainer {
+ private static Random RANDOM = new Random();
+ private MMXid xid;
+
+ public XATransaction(ConnectionStrategy strategy) {
+ super(strategy);
+ }
+
+ protected void before(TransactionQueryTest test) {
+ try {
+ xid = createXid();
+ XAResource xaResource = getXAConnection().getXAResource();
+ xaResource.setTransactionTimeout(120);
+ xaResource.start(xid, XAResource.TMNOFLAGS);
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+
+ public static MMXid createXid() {
+ byte[] gid = new byte[10];
+ byte[] bid = new byte[10];
+ RANDOM.nextBytes(gid);
+ RANDOM.nextBytes(bid);
+ return new MMXid(0, gid, bid);
+ }
+
+ protected void after(TransactionQueryTest test) {
+ boolean delistSuccessful = false;
+ boolean commit = false;
+ try {
+ XAResource xaResource = getXAConnection().getXAResource();
+
+ xaResource.end(xid, XAResource.TMSUCCESS);
+
+ if (!test.exceptionExpected() && xaResource.prepare(xid) ==
XAResource.XA_OK) {
+ commit = true;
+ }
+ delistSuccessful = true;
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ } finally {
+ try {
+ if (!delistSuccessful || test.rollbackAllways()||
test.exceptionOccurred()) {
+ getXAConnection().getXAResource().rollback(xid);
+ }
+ else if (commit) {
+ getXAConnection().getXAResource().commit(xid, true);
+ }
+ } catch (Exception e) {
+ throw new TransactionRuntimeException(e);
+ }
+ }
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/framework/transaction/XATransaction.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
(rev 0)
+++ trunk/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,534 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.test.util;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * This class contains a set of static utility methods for checking method arguments.
+ * It contains many of the common checks that are done, such as checking that an
+ * Object is non-null, checking the range of a value, etc. All of these methods
+ * throw {@link #java.lang.IllegalArgumentException}.
+ */
+public class ArgCheck {
+
+ /**
+ * Can't construct - utility class
+ */
+ private ArgCheck() {
+ }
+
+ /**
+ * Check that the boolean condition is true; throw an
+ * IllegalArgumentException if not.
+ * @param condition The boolean condition to check
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException if condition is false
+ */
+ public static final void isTrue(boolean condition, String message){
+ if(!condition) {
+ throw new IllegalArgumentException(message);
+ }
+ }
+
+ // ########################## int METHODS ###################################
+
+ /**
+ * Check that the value is non-negative (>=0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is negative (<0)
+ */
+ public static final void isNonNegative(int value) {
+ isNonNegative(value,null);
+ }
+
+ /**
+ * Check that the value is non-negative (>=0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is negative (<0)
+ */
+ public static final void isNonNegative(int value, String message) {
+ if(value < 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNonNegativeInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is non-positive (<=0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is positive (>0)
+ */
+ public static final void isNonPositive(int value) {
+ isNonPositive(value,null);
+ }
+
+ /**
+ * Check that the value is non-positive (<=0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is positive (>0)
+ */
+ public static final void isNonPositive(int value, String message) {
+ if(value > 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNonPositiveInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is negative (<0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is non-negative (>=0)
+ */
+ public static final void isNegative(int value) {
+ isNegative(value,null);
+ }
+
+ /**
+ * Check that the value is negative (<0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is non-negative (>=0)
+ */
+ public static final void isNegative(int value, String message) {
+ if(value >= 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNegativeInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is positive (>0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is non-positive (<=0)
+ */
+ public static final void isPositive(int value) {
+ isPositive(value,null);
+ }
+
+ /**
+ * Check that the value is positive (>0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is non-positive (<=0)
+ */
+ public static final void isPositive(int value, String message) {
+ if(value <= 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isPositiveInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ // ########################## long METHODS ###################################
+
+ /**
+ * Check that the value is non-negative (>=0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is negative (<0)
+ */
+ public static final void isNonNegative(long value) {
+ isNonNegative(value,null);
+ }
+
+ /**
+ * Check that the value is non-negative (>=0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is negative (<0)
+ */
+ public static final void isNonNegative(long value, String message) {
+ if(value < 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNonNegativeInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is non-positive (<=0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is positive (>0)
+ */
+ public static final void isNonPositive(long value) {
+ isNonPositive(value,null);
+ }
+
+ /**
+ * Check that the value is non-positive (<=0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is positive (>0)
+ */
+ public static final void isNonPositive(long value, String message) {
+ if(value > 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNonPositiveInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is negative (<0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is non-negative (>=0)
+ */
+ public static final void isNegative(long value) {
+ isNegative(value,null);
+ }
+
+ /**
+ * Check that the value is negative (<0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is non-negative (>=0)
+ */
+ public static final void isNegative(long value, String message) {
+ if(value >= 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNegativeInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the value is positive (>0).
+ * @param value Value
+ * @throws IllegalArgumentException If value is non-positive (<=0)
+ */
+ public static final void isPositive(long value) {
+ isPositive(value,null);
+ }
+
+ /**
+ * Check that the value is positive (>0).
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is non-positive (<=0)
+ */
+ public static final void isPositive(long value, String message) {
+ if(value <= 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isPositiveInt"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ // ########################## String METHODS ###################################
+
+ /**
+ * Check that the string is non-null and has length > 0
+ * @param value Value
+ * @throws IllegalArgumentException If value is null or length == 0
+ */
+ public static final void isNotZeroLength(String value) {
+ isNotZeroLength(value,null);
+ }
+
+ /**
+ * Check that the string is non-null and has length > 0
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is null or length == 0
+ */
+ public static final void isNotZeroLength(String value, String message) {
+ isNotNull(value);
+ if(value.length() <= 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isStringNonZeroLength"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ // ########################## Object METHODS ###################################
+
+ /**
+ * Check that the object is non-null
+ * @param value Value
+ * @throws IllegalArgumentException If value is null
+ */
+ public static final void isNotNull(Object value) {
+ isNotNull(value,null);
+ }
+
+ /**
+ * Check that the object is non-null
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is null
+ */
+ public static final void isNotNull(Object value, String message) {
+ if(value == null) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNonNull"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the object is null
+ * @param value Value
+ * @throws IllegalArgumentException If value is non-null
+ */
+ public static final void isNull(Object value) {
+ isNull(value,null);
+ }
+
+ /**
+ * Check that the object is null
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is non-null
+ */
+ public static final void isNull(Object value, String message) {
+ if(value != null) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isNull"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the object is an instance of the specified Class
+ * @param theClass Class
+ * @param value Value
+ * @throws IllegalArgumentException If value is null
+ */
+ public static final void isInstanceOf(Class theClass, Object value) {
+ isInstanceOf(theClass,value,null);
+ }
+
+ /**
+ * Check that the object is an instance of the specified Class
+ * @param theClass Class
+ * @param value Value
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If value is null
+ */
+ public static final void isInstanceOf(Class theClass, Object value, String message) {
+ isNotNull(value);
+ if( ! theClass.isInstance(value) ) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isInstanceOf "; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ // ########################## COLLECTION METHODS ###################################
+
+ /**
+ * Check that the collection is not empty
+ * @param collection Collection
+ * @throws IllegalArgumentException If collection is null or empty
+ */
+ public static final void isNotEmpty(Collection collection) {
+ isNotEmpty(collection,null);
+ }
+
+ /**
+ * Check that the collection is not empty
+ * @param collection Collection
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If collection is null or empty
+ */
+ public static final void isNotEmpty(Collection collection, String message) {
+ isNotNull(collection);
+ if(collection.isEmpty()) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isCollectionNotEmpty"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the map is not empty
+ * @param map Map
+ * @throws IllegalArgumentException If map is null or empty
+ */
+ public static final void isNotEmpty(Map map) {
+ isNotEmpty(map,null);
+ }
+
+ /**
+ * Check that the map is not empty
+ * @param map Map
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If map is null or empty
+ */
+ public static final void isNotEmpty(Map map, String message) {
+ isNotNull(map);
+ if(map.isEmpty()) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isMapNotEmpty"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the array is not empty
+ * @param array Array
+ * @throws IllegalArgumentException If array is null or empty
+ * @since 3.1
+ */
+ public static final void isNotEmpty(Object[] array) {
+ isNotEmpty(array,null);
+ }
+
+ /**
+ * Check that the array is not empty
+ * @param array Array
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If array is null or empty
+ * @since 3.1
+ */
+ public static final void isNotEmpty(Object[] array, String message) {
+ isNotNull(array);
+ if(array.length == 0) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.isArrayNotEmpty"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the string is not empty
+ * @param string String
+ * @throws IllegalArgumentException If string is null or empty
+ * @since 3.1
+ */
+ public static final void isNotEmpty(String string) {
+ isNotZeroLength(string,null);
+ }
+
+ /**
+ * Check that the string is not empty
+ * @param string String
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If string is null or empty
+ * @since 3.1
+ */
+ public static final void isNotEmpty(String string, String message) {
+ isNotZeroLength(string,message);
+ }
+
+ /**
+ * Asserts that the specified first object is not the same as (==) the specified
second object.
+ * @param firstObject The first object to assert as not the same as the second
object.
+ * @param firstName The name that will be used within the exception message for
the first object, should an exception be
+ * thrown; if null and <code>firstObject</code> is
not null, <code>firstObject.toString()</code> will be
+ * used.
+ * @param secondObject The second object to assert as not the same as the first
object.
+ * @param secondName The name that will be used within the exception message for
the second object, should an exception be
+ * thrown; if null and <code>secondObject</code> is
not null, <code>secondObject.toString()</code> will
+ * be used.
+ * @throws IllegalArgumentException If the specified objects are the same.
+ * @since 3.1
+ */
+ public static void isNotSame(final Object firstObject, String firstName, final Object
secondObject, String secondName) {
+ if (firstObject == secondObject) {
+ if (firstName == null && firstObject != null) {
+ firstName = firstObject.toString();
+ }
+ if (secondName == null && secondObject != null) {
+ secondName = secondObject.toString();
+ }
+ throw new IllegalArgumentException("ArgCheck.isNotSame");
//$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Check that the collection contains the value
+ * @param collection Collection to check
+ * @param value Value to check for, may be null
+ * @throws IllegalArgumentException If collection is null or doesn't contain
value
+ */
+ public static final void contains(Collection collection, Object value) {
+ contains(collection, value, null);
+ }
+
+ /**
+ * Check that the collection contains the value
+ * @param collection Collection to check
+ * @param value Value to check for, may be null
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If collection is null or doesn't contain
value
+ */
+ public static final void contains(Collection collection, Object value, String
message) {
+ isNotNull(collection);
+ if(! collection.contains(value)) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.contains"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ /**
+ * Check that the map contains the key
+ * @param map Map to check
+ * @param key Key to check for, may be null
+ * @throws IllegalArgumentException If map is null or doesn't contain key
+ */
+ public static final void containsKey(Map map, Object key) {
+ containsKey(map, key, null);
+ }
+
+ /**
+ * Check that the map contains the key
+ * @param map Map to check
+ * @param key Key to check for, may be null
+ * @param message Exception message if check fails
+ * @throws IllegalArgumentException If map is null or doesn't contain key
+ */
+ public static final void containsKey(Map map, Object key, String message) {
+ isNotNull(map);
+ if(! map.containsKey(key)) {
+ final String msg = message != null ?
+ message :
+ "ArgCheck.containsKey"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/util/ArgCheck.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
(rev 0)
+++
trunk/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -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.test.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.CRC32;
+import java.util.zip.Checksum;
+
+/**
+ * This utility class provides mechanisms for computing the checksum.
+ */
+public class ChecksumUtil {
+
+ protected static final int BUFFER_SIZE = 1024;
+
+ /**
+ * Compute and return the checksum (using the default CRC-32 algorithm)
+ * of the contents on the specified stream.
+ * This method closes the stream upon completion.
+ * @param stream the stream containing the contents for which
+ * the checksum is to be computed; may not be null
+ * @return the Checksum for the contents
+ * @throws AssertionError if <code>stream</code> is null
+ * @throws IOException if there is an error reading the stream
+ */
+ public static Checksum computeChecksum( InputStream stream ) throws IOException {
+ Checksum checksum = new CRC32();
+ computeChecksum(stream,checksum);
+ return checksum;
+ }
+
+ /**
+ * Compute the checksum of the contents on the specified stream
+ * using the supplied Checksum algorithm, and modify that
+ * Checksum instance with the checksum value.
+ * This method closes the stream upon completion.
+ * @param stream the stream containing the contents for which
+ * the checksum is to be computed; may not be null
+ * @param algorithm the checksum algorithm to be used.
+ * @return the number of bytes from <code>stream</code>
+ * that were processed
+ * @throws AssertionError if <code>stream</code> or
+ * <code>algorithm</code> is null
+ * @throws IOException if there is an error reading the stream
+ */
+ public static long computeChecksum( InputStream stream, Checksum algorithm ) throws
IOException {
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int n = 0;
+ long sizeInBytes = 0;
+
+ // Compute the checksum ...
+ IOException ioe = null;
+ try {
+ while ((n = stream.read(buffer)) > -1){
+ algorithm.update(buffer, 0, n);
+ sizeInBytes += n;
+ }
+ } catch ( IOException e ) {
+ ioe = e;
+ } finally {
+ try {
+ stream.close();
+ } catch ( IOException e ) {
+ //Throw this only if there was no IOException from processing above
+ if ( ioe == null ) {
+ ioe = e;
+ }
+ }
+ }
+ if ( ioe != null ) {
+ throw ioe;
+ }
+ return sizeInBytes;
+ }
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/util/ChecksumUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
(rev 0)
+++ trunk/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,871 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.test.util;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public final class FileUtils {
+
+ public interface Constants {
+ char CURRENT_FOLDER_SYMBOL_CHAR = '.';
+ char DRIVE_SEPARATOR_CHAR = ':';
+ char FILE_EXTENSION_SEPARATOR_CHAR = '.';
+ char FILE_NAME_WILDCARD_CHAR = '*';
+
+ String CURRENT_FOLDER_SYMBOL = String.valueOf(CURRENT_FOLDER_SYMBOL_CHAR);
+ String DRIVE_SEPARATOR = String.valueOf(DRIVE_SEPARATOR_CHAR);
+ String FILE_EXTENSION_SEPARATOR = String.valueOf(FILE_EXTENSION_SEPARATOR_CHAR);
+ String FILE_NAME_WILDCARD = String.valueOf(FILE_NAME_WILDCARD_CHAR);
+ String PARENT_FOLDER_SYMBOL = ".."; //$NON-NLS-1$
+ }
+
+ public static final char SEPARATOR = '/';
+
+ public static int DEFAULT_BUFFER_SIZE = 2048;
+ public static String TEMP_DIRECTORY;
+ public static String LINE_SEPARATOR = System.getProperty("line.separator");
//$NON-NLS-1$
+ public static char[] LINE_SEPARATOR_CHARS = LINE_SEPARATOR.toCharArray();
+
+ public final static String JAVA_IO_TEMP_DIR="java.io.tmpdir";//$NON-NLS-1$
+ public final static char[] SUFFIX_class = ".class".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_CLASS = ".CLASS".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_java = ".java".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_JAVA = ".JAVA".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_jar = ".jar".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_JAR = ".JAR".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_zip = ".zip".toCharArray();
//$NON-NLS-1$
+ public final static char[] SUFFIX_ZIP = ".ZIP".toCharArray();
//$NON-NLS-1$
+
+
+ private static final String TEMP_FILE = "delete.me"; //$NON-NLS-1$
+ private static final String TEMP_FILE_RENAMED = "delete.me.old";
//$NON-NLS-1$
+
+
+
+ static {
+ String tempDirPath = System.getProperty(JAVA_IO_TEMP_DIR);
+ TEMP_DIRECTORY = (tempDirPath.endsWith(File.separator) ? tempDirPath :
tempDirPath + File.separator);
+ }
+
+ private FileUtils() {}
+
+ /**<p>
+ * Convert the specified file name to end with the specified extension if it
doesn't already end with an extension.
+ * </p>
+ * @param name
+ * The file name.
+ * @param extension
+ * The extension to append to the file name.
+ * @return The file name with an extension.
+ * @since 4.0
+ */
+ public static String toFileNameWithExtension(final String name,
+ final String extension) {
+ return toFileNameWithExtension(name, extension, false);
+ }
+
+ /**<p>
+ * Convert the specified file name to end with the specified extension if it
doesn't already end with an extension. If force
+ * is true, the specified extension will be appended to the name if the name
doesn't end with that particular extension.
+ * </p>
+ * @param name
+ * The file name.
+ * @param extension
+ * The extension to append to the file name.
+ * @param force
+ * Indicates whether to force the specified extension as the extension
of the file name.
+ * @return The file name with an extension.
+ * @since 4.0
+ */
+ public static String toFileNameWithExtension(final String name,
+ final String extension,
+ final boolean force) {
+ if (name == null) {
+ final String msg =
"FileUtils.The_name_of_the_file_may_not_be_null"; //$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ if (extension == null) {
+ final String msg = "FileUtils.The_file_extension_may_not_be_null";
//$NON-NLS-1$
+ throw new IllegalArgumentException(msg);
+ }
+ if (name.endsWith(extension)) {
+ return name;
+ }
+ if (!force && name.indexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR)
>= 0) {
+ return name;
+ }
+ final int nameLen = name.length() - 1;
+ final int extLen = extension.length();
+ final boolean nameEndsWithExtChr = (nameLen >= 0 &&
name.charAt(nameLen) == Constants.FILE_EXTENSION_SEPARATOR_CHAR);
+ final boolean extBeginsWithExtChr = (extLen > 0 &&
extension.charAt(0) == Constants.FILE_EXTENSION_SEPARATOR_CHAR);
+ if (nameEndsWithExtChr && extBeginsWithExtChr) {
+ return name.substring(0, nameLen) + extension;
+ }
+ if (!nameEndsWithExtChr && !extBeginsWithExtChr) {
+ return name + Constants.FILE_EXTENSION_SEPARATOR + extension;
+ }
+ return name + extension;
+ }
+
+ /**
+ * Determine whether the specified name is valid for a file or folder on the current
file system.
+ * @param newName the new name to be checked
+ * @return true if the name is null or contains no invalid characters for a folder or
file, or false otherwise
+ */
+ public static boolean isFilenameValid( String newName ) {
+ return true; //TODO: just catch an exception when the file is accessed or created
+ }
+
+ /**
+ * Copy a file. Overwrites the destination file if it exists.
+ * @param fromFileName
+ * @param toFileName
+ * @throws Exception
+ * @since 4.3
+ */
+ public static void copy(String fromFileName, String toFileName) throws IOException {
+ copy(fromFileName, toFileName, true);
+ }
+
+ /**
+ * Copy a file
+ * @param fromFileName
+ * @param toFileName
+ * @param overwrite whether to overwrite the destination file if it exists.
+ * @throws MetaMatrixCoreException
+ * @since 4.3
+ */
+ public static void copy(String fromFileName, String toFileName, boolean overwrite)
throws IOException {
+ File toFile = new File(toFileName);
+
+ if (toFile.exists()) {
+ if (overwrite) {
+ toFile.delete();
+ } else {
+ final String msg = "FileUtils.File_already_exists " +
toFileName; //$NON-NLS-1$
+ throw new IOException(msg);
+ }
+ }
+
+ File fromFile = new File(fromFileName);
+ if (!fromFile.exists()) {
+ throw new FileNotFoundException("FileUtils.File_does_not_exist " +
fromFileName); //$NON-NLS-1$
+ }
+
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(fromFile);
+ write(fis, toFileName);
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ }
+
+ /**
+ * Copy recursively the contents of <code>sourceDirectory</code> to
+ * the <code>targetDirectory</code>. Note that
<code>sourceDirectory</code>
+ * will <b>NOT</b> be copied. If
<code>targetDirectory</code> does not exist, it will be created.
+ * @param sourceDirectory The source directory to copy
+ * @param targetDirectory The target directory to copy to
+ * @throws Exception If the source directory does not exist.
+ * @since 4.3
+ */
+ public static void copyDirectoryContentsRecursively(File sourceDirectory, File
targetDirectory) throws Exception {
+ copyRecursively(sourceDirectory, targetDirectory, false);
+ }
+
+ /**
+ * Copy file from orginating directory to the destination directory.
+ *
+ * @param orginDirectory
+ * @param destDirectory
+ * @param fileName
+ * @throws Exception
+ * @since 4.4
+ */
+ public static void copyFile(String orginDirectory,
+ String destDirectory,
+ String fileName) throws Exception {
+
+ copyFile(orginDirectory, fileName, destDirectory, fileName);
+ }
+
+ /**
+ * Copy file from orginating directory to the destination directory.
+ *
+ * @param orginDirectory
+ * @param orginFileName
+ * @param destDirectory
+ * @param destFileName
+ * @throws Exception
+ * @since 4.4
+ */
+ public static void copyFile(String orginDirectory,
+ String orginFileName,
+ String destDirectory,
+ String destFileName) throws Exception {
+
+ FileUtils.copy(orginDirectory + File.separator + orginFileName, destDirectory +
File.separator + destFileName);
+ }
+
+ /**
+ * Copy recursively the <code>sourceDirectory</code> and all its contents
+ * to the <code>targetDirectory</code>. If
<code>targetDirectory</code>
+ * does not exist, it will be created.
+ * @param sourceDirectory The source directory to copy
+ * @param targetDirectory The target directory to copy to
+ * @throws Exception If the source directory does not exist.
+ * @since 4.3
+ */
+ public static void copyDirectoriesRecursively(File sourceDirectory, File
targetDirectory) throws Exception {
+ copyRecursively(sourceDirectory, targetDirectory, true);
+ }
+
+ /**
+ * Copy recursively from the <code>sourceDirectory</code> all its
contents
+ * to the <code>targetDirectory</code>. if
+ * <code>includeSourceRoot<code> == <code>true</code>, copy
<code>sourceDirectory</code>
+ * itself, else only copy <code>sourceDirectory</code>'s contents.
+ * If <code>targetDirectory</code> does not exist, it will be created.
+ * @param sourceDirectory
+ * @param targetDirectory
+ * @throws FileNotFoundException
+ * @throws Exception
+ * @since 4.3
+ */
+ private static void copyRecursively(File sourceDirectory,
+ File targetDirectory,
+ boolean includeSourceRoot) throws
FileNotFoundException,
+ Exception {
+ if (!sourceDirectory.exists()) {
+ throw new FileNotFoundException("FileUtils.File_does_not_exist " +
sourceDirectory); //$NON-NLS-1$
+ }
+
+ if (!sourceDirectory.isDirectory()) {
+ throw new FileNotFoundException("FileUtils.Not_a_directory " +
sourceDirectory); //$NON-NLS-1$
+ }
+
+ File targetDir = new File(targetDirectory.getAbsolutePath() + File.separatorChar
+ sourceDirectory.getName());
+ if (includeSourceRoot) {
+ // copy source directory
+ targetDir.mkdir();
+ } else {
+ // copy only source directory contents
+ targetDir = new File(targetDirectory.getAbsolutePath() +
File.separatorChar);
+ }
+ File[] sourceFiles = sourceDirectory.listFiles();
+ for (int i = 0; i < sourceFiles.length; i++) {
+ File srcFile = sourceFiles[i];
+ if (srcFile.isDirectory()) {
+ File childTargetDir = new File(targetDir.getAbsolutePath());
+ copyRecursively(srcFile, childTargetDir, true);
+ } else {
+ copy(srcFile.getAbsolutePath(), targetDir.getAbsolutePath() +
File.separatorChar + srcFile.getName());
+ }
+ }
+ }
+
+ /**
+ * Write an InputStream to a file.
+ */
+ public static void write(InputStream is, String fileName) throws IOException {
+ File f = new File(fileName);
+ write(is,f);
+ }
+
+ /**
+ * Write an InputStream to a file.
+ */
+ public static void write(InputStream is, File f) throws IOException {
+ write(is, f, DEFAULT_BUFFER_SIZE);
+ }
+
+ /**
+ * Write an InputStream to a file.
+ */
+ public static void write(InputStream is, File f, int bufferSize) throws IOException {
+ f.delete();
+ final File parentDir = f.getParentFile();
+ if (parentDir !=null) {
+ parentDir.mkdirs();
+ }
+
+ FileOutputStream fio = null;
+ BufferedOutputStream bos = null;
+ try {
+ fio = new FileOutputStream(f);
+ bos = new BufferedOutputStream(fio);
+ if (bufferSize > 0) {
+ byte[] buff = new byte[bufferSize];
+ int bytesRead;
+
+ // Simple read/write loop.
+ while(-1 != (bytesRead = is.read(buff, 0, buff.length))) {
+ bos.write(buff, 0, bytesRead);
+ }
+ }
+ bos.flush();
+ } finally {
+ if (bos != null) {
+ bos.close();
+ }
+ if (fio != null) {
+ fio.close();
+ }
+ }
+ }
+
+
+ /**
+ * Write an File to an OutputStream
+ * Note: this will not close the outputStream;
+ */
+ public static void write(File f, OutputStream outputStream) throws IOException {
+ write(f, outputStream, DEFAULT_BUFFER_SIZE);
+ }
+
+ /**
+ * Write an File to an OutputStream
+ * Note: this will not close the outputStream;
+ */
+ public static void write(File f, OutputStream outputStream, int bufferSize)
throws IOException {
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(f);
+ write(fis, outputStream, bufferSize);
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ }
+
+ /**
+ * Write the given input stream to outputstream
+ * Note: this will not close in/out streams
+ */
+ public static void write(InputStream fis, OutputStream outputStream, int
bufferSize) throws IOException {
+ byte[] buff = new byte[bufferSize];
+ int bytesRead;
+
+ // Simple read/write loop.
+ while(-1 != (bytesRead = fis.read(buff, 0, buff.length))) {
+ outputStream.write(buff, 0, bytesRead);
+ }
+ outputStream.flush();
+ }
+
+ /**
+ * Write a byte array to a file.
+ */
+ public static void write(byte[] data, String fileName) throws IOException {
+ ByteArrayInputStream bais = null;
+ InputStream is = null;
+ try {
+ bais = new ByteArrayInputStream(data);
+ is = new BufferedInputStream(bais);
+
+ write(is, fileName);
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (bais != null) {
+ bais.close();
+ }
+ }
+ }
+
+ /**
+ * Write a byte array to a file.
+ */
+ public static void write(byte[] data, File file) throws IOException {
+ ByteArrayInputStream bais = null;
+ InputStream is = null;
+ try {
+ bais = new ByteArrayInputStream(data);
+ is = new BufferedInputStream(bais);
+
+ write(is, file);
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (bais != null) {
+ bais.close();
+ }
+ }
+ }
+
+ /**
+ * Returns a <code>File</code> array that will contain all the files that
+ * exist in the specified directory or any nested directories
+ * @return File[] of files in the directory
+ */
+ public static File[] findAllFilesInDirectoryRecursively(final String dir) {
+
+ // Recursively navigate through the contents of this directory
+ // gathering up all the files
+ List allFiles = new ArrayList();
+ File directory = new File(dir);
+ addFilesInDirectoryRecursively(directory, allFiles);
+
+ return (File[])allFiles.toArray(new File[allFiles.size()]);
+
+ }
+
+ private static void addFilesInDirectoryRecursively(final File directory, final List
allFiles) {
+ File[] files = directory.listFiles();
+ if (files != null) {
+ for (int i=0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isDirectory()) {
+ addFilesInDirectoryRecursively(file, allFiles);
+ } else {
+ allFiles.add(file);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a <code>File</code> array that will contain all the files that
exist in the directory
+ *
+ * @return File[] of files in the directory
+ */
+ public static File[] findAllFilesInDirectory(String dir) {
+
+ // Find all files in the specified directory
+ File modelsDirFile = new File(dir);
+ FileFilter fileFilter = new FileFilter() {
+
+ public boolean accept(File file) {
+ if (file.isDirectory()) {
+ return false;
+ }
+
+ String fileName = file.getName();
+
+ if (fileName == null || fileName.length() == 0) {
+ return false;
+ }
+
+ return true;
+
+ }
+ };
+
+ File[] modelFiles = modelsDirFile.listFiles(fileFilter);
+
+ return modelFiles;
+
+ }
+
+ /**
+ * Returns a <code>File</code> array that will contain all the files
that
+ * exist in the directory that have the specified extension.
+ * @return File[] of files having a certain extension
+ */
+ public static File[] findAllFilesInDirectoryHavingExtension(String dir, final
String extension) {
+
+ // Find all files in that directory that end in XML and attempt to
+ // load them into the runtime metadata database.
+ File modelsDirFile = new File(dir);
+ FileFilter fileFilter = new FileFilter() {
+ public boolean accept(File file) {
+ if(file.isDirectory()) {
+ return false;
+ }
+
+
+ String fileName = file.getName();
+
+ if (fileName==null || fileName.length()==0) {
+ return false;
+ }
+
+ return (fileName.endsWith(extension));
+ // here we check to see if the file is an .xml file...
+// int index = fileName.lastIndexOf("."); //$NON-NLS-1$
+//
+// if (index<0 || index==fileName.length()) {
+// return false;
+// }
+//
+// if (fileName.substring(index,
fileName.length()).equalsIgnoreCase(extension)) {
+// return true;
+// }
+// return false;
+ }
+ };
+
+ File[] modelFiles = modelsDirFile.listFiles(fileFilter);
+
+ return modelFiles;
+
+ }
+
+ /**
+ * @param string
+ * @return
+ */
+ public static String getFilenameWithoutExtension( final String filename ) {
+ if ( filename == null || filename.length() == 0 ) {
+ return filename;
+ }
+ final int extensionIndex =
filename.lastIndexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR);
+ if ( extensionIndex == -1 ) {
+ return filename; // not found
+ }
+ if ( extensionIndex == 0 ) {
+ return ""; //$NON-NLS-1$
+ }
+ return filename.substring(0,extensionIndex);
+ }
+
+ public static String getBaseFileNameWithoutExtension(String path) {
+ return StringUtil.getFirstToken(StringUtil.getLastToken(path, "/"),
"."); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Obtains the file extension of the specified <code>File</code>. The
extension is considered to be all the
+ * characters after the last occurrence of {@link
Constants#FILE_EXTENSION_SEPARATOR_CHAR} in the pathname
+ * of the input.
+ * @param theFile the file whose extension is being requested
+ * @return the extension or <code>null</code> if not found
+ * @since 4.2
+ */
+ public static String getExtension(File theFile) {
+ return getExtension(theFile.getPath());
+ }
+
+ /**
+ * Obtains the file extension of the specified file name. The extension is considered
to be all the
+ * characters after the last occurrence of {@link
Constants#FILE_EXTENSION_SEPARATOR_CHAR}.
+ * @param theFileName the file whose extension is being requested
+ * @return the extension or <code>null</code> if not found
+ * @since 4.2
+ */
+ public static String getExtension(String theFileName) {
+ String result = null;
+ final int index =
theFileName.lastIndexOf(Constants.FILE_EXTENSION_SEPARATOR_CHAR);
+
+ // make sure extension char is found and is not the last char in the path
+ if ((index != -1) && ((index + 1) != theFileName.length())) {
+ result = theFileName.substring(index + 1);
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns true iff str.toLowerCase().endsWith(".jar") ||
str.toLowerCase().endsWith(".zip")
+ * implementation is not creating extra strings.
+ */
+ public final static boolean isArchiveFileName(String name) {
+ int nameLength = name == null ? 0 : name.length();
+ int suffixLength = SUFFIX_JAR.length;
+ if (nameLength < suffixLength) return false;
+
+ // try to match as JAR file
+ for (int i = 0; i < suffixLength; i++) {
+ char c = name.charAt(nameLength - i - 1);
+ int suffixIndex = suffixLength - i - 1;
+ if (c != SUFFIX_jar[suffixIndex] && c != SUFFIX_JAR[suffixIndex]) {
+
+ // try to match as ZIP file
+ suffixLength = SUFFIX_ZIP.length;
+ if (nameLength < suffixLength) return false;
+ for (int j = 0; j < suffixLength; j++) {
+ c = name.charAt(nameLength - j - 1);
+ suffixIndex = suffixLength - j - 1;
+ if (c != SUFFIX_zip[suffixIndex] && c !=
SUFFIX_ZIP[suffixIndex]) return false;
+ }
+ return true;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns true iff str.toLowerCase().endsWith(".class")
+ * implementation is not creating extra strings.
+ */
+ public final static boolean isClassFileName(String name) {
+ int nameLength = name == null ? 0 : name.length();
+ int suffixLength = SUFFIX_CLASS.length;
+ if (nameLength < suffixLength) return false;
+
+ for (int i = 0; i < suffixLength; i++) {
+ char c = name.charAt(nameLength - i - 1);
+ int suffixIndex = suffixLength - i - 1;
+ if (c != SUFFIX_class[suffixIndex] && c != SUFFIX_CLASS[suffixIndex])
return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns true iff str.toLowerCase().endsWith(".java")
+ * implementation is not creating extra strings.
+ */
+ public final static boolean isJavaFileName(String name) {
+ int nameLength = name == null ? 0 : name.length();
+ int suffixLength = SUFFIX_JAVA.length;
+ if (nameLength < suffixLength) return false;
+
+ for (int i = 0; i < suffixLength; i++) {
+ char c = name.charAt(nameLength - i - 1);
+ int suffixIndex = suffixLength - i - 1;
+ if (c != SUFFIX_java[suffixIndex] && c != SUFFIX_JAVA[suffixIndex])
return false;
+ }
+ return true;
+ }
+
+
+ public static File convertByteArrayToFile(final byte[] contents, final String
parentDirectoryPath, final String fileName) {
+ if (contents != null) {
+ FileOutputStream os = null;
+ try {
+ final File temp = new File(parentDirectoryPath,fileName);
+ os = new FileOutputStream(temp);
+ os.write(contents);
+ return temp;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e1) {
+ // do nothing
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static void removeDirectoryAndChildren(File directory) {
+ removeChildrenRecursively(directory);
+ if(!directory.delete()) {
+ directory.deleteOnExit();
+ }
+ }
+
+ public static void removeChildrenRecursively(File directory) {
+ File[] files = directory.listFiles();
+ if(files != null) {
+ for(int i=0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isDirectory()) {
+ removeDirectoryAndChildren(file);
+ } else {
+ if(!file.delete()) {
+ file.deleteOnExit();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Builds a file directory path from a physical location and a location that needs
+ * to be appended to the physical. This is used so that the correct File.separator
+ * is used and that no additional separator is added when not needed.
+ * @param physicalDirectory
+ * @param appendLocation
+ * @return
+ * @since 4.3
+ */
+ public static String buildDirectoryPath(String[] paths) {
+// String physicalDirectory, String appendLocation) {
+
+ if (paths == null || paths.length == 0) {
+ return ""; //$NON-NLS-1$
+ }
+ if (paths.length == 1) {
+ return (paths[0]!=null?paths[0]:"");//$NON-NLS-1$
+ }
+ int l = paths.length;
+ StringBuffer sb = new StringBuffer();
+ for (int cur=0;cur<l; cur++) {
+ int next = cur+1;
+
+ String value = paths[cur]!=null?paths[cur]:"";//$NON-NLS-1$
+ if (value.equals("")) {//$NON-NLS-1$
+ continue;
+ }
+ sb.append(value);
+
+ if (next < l) {
+ String nextValue =
paths[next]!=null?paths[next]:"";//$NON-NLS-1$
+ if (value.endsWith(File.separator)) {
+
+ } else if (!nextValue.startsWith(File.separator)) {
+ sb.append(File.separator);
+ }
+
+ }
+ }
+
+ return sb.toString();
+ }
+
+ /**
+ * Compute checksum for the given file.
+ * @param f The file for which checksum needs to be computed
+ * @return The checksum
+ * @since 4.3
+ */
+ public static long getCheckSum(final File f) throws Exception {
+ ArgCheck.isNotNull(f);
+ FileInputStream is = null;
+ try {
+ is = new FileInputStream(f);
+ return ChecksumUtil.computeChecksum(is).getValue();
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException err1) {
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Test whether it's possible to read and write files in the specified directory.
+ * @param dirPath Name of the directory to test
+ * @throws MetaMatrixException
+ * @since 4.3
+ */
+ public static void testDirectoryPermissions(String dirPath) throws Exception {
+
+ //try to create a file
+ File tmpFile = new File(dirPath + File.separatorChar + TEMP_FILE);
+ boolean success = false;
+ try {
+ success = tmpFile.createNewFile();
+ } catch (IOException e) {
+ }
+ if (!success) {
+ final String msg = "FileUtils.Unable_to_create_file_in " + dirPath;
//$NON-NLS-1$
+ throw new Exception(msg);
+ }
+
+
+ //test if file can be written to
+ if (!tmpFile.canWrite()) {
+ final String msg = "FileUtils.Unable_to_write_file_in " + dirPath;
//$NON-NLS-1$
+ throw new Exception(msg);
+ }
+
+ //test if file can be read
+ if (!tmpFile.canRead()) {
+ final String msg = "FileUtils.Unable_to_read_file_in " + dirPath;
//$NON-NLS-1$
+ throw new Exception(msg);
+ }
+
+ //test if file can be renamed
+ File newFile = new File(dirPath + File.separatorChar + TEMP_FILE_RENAMED);
+ success = false;
+ try {
+ success = tmpFile.renameTo(newFile);
+ } catch (Exception e) {
+ }
+ if (!success) {
+ final String msg = "FileUtils.Unable_to_rename_file_in " + dirPath;
//$NON-NLS-1$
+ throw new Exception(msg);
+ }
+
+ //test if file can be deleted
+ success = false;
+ try {
+ success = newFile.delete();
+ } catch (Exception e) {
+ }
+ if (!success) {
+ final String msg = "FileUtils.Unable_to_delete_file_in " + dirPath;
//$NON-NLS-1$
+ throw new Exception(msg);
+ }
+ }
+
+ /**
+ * Rename a file.
+ * @param oldFilePath
+ * @param newFilePath
+ * @param overwrite If true, overwrite the old file if it exists. If false, throw an
exception if the old file exists.
+ * @throws MetaMatrixCoreException
+ * @since 4.3
+ */
+ public static void rename(String oldFilePath, String newFilePath, boolean overwrite)
throws IOException {
+ File oldFile = new File(oldFilePath);
+ File newFile = new File(newFilePath);
+
+ if (newFile.exists()) {
+ if (overwrite) {
+ newFile.delete();
+ } else {
+ final String msg = "FileUtils.File_already_exists " +
newFilePath; //$NON-NLS-1$
+ throw new IOException(msg);
+ }
+ }
+
+ boolean renamed = oldFile.renameTo(newFile);
+
+ //Sometimes file.renameTo will silently fail, for example attempting to rename
from different UNIX partitions.
+ //Try to copy instead.
+ if (!renamed) {
+ copy(oldFilePath, newFilePath);
+ oldFile.delete();
+ }
+ }
+
+
+
+
+
+ public static void remove(String filePath) throws IOException {
+ File file = new File(filePath);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+}
\ No newline at end of file
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/util/FileUtils.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
(rev 0)
+++ trunk/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,14 @@
+package org.teiid.test.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.teiid.test.framework.connection.ConnectionStrategyFactory;
+
+public class PropUtils {
+
+
+
+
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/util/PropUtils.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
===================================================================
--- trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
(rev 0)
+++ trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java 2009-09-11
19:18:01 UTC (rev 1325)
@@ -0,0 +1,906 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * All rights reserved.
+ * This code is made available under the terms of the Eclipse Public
+ * License, version 1.0.
+ */
+
+package org.teiid.test.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
+
+/**
+ * This is a common place to put String utility methods.
+ */
+public final class StringUtil {
+
+ public interface Constants {
+ char CARRIAGE_RETURN_CHAR = '\r';
+ char LINE_FEED_CHAR = '\n';
+ char NEW_LINE_CHAR = LINE_FEED_CHAR;
+ char SPACE_CHAR = ' ';
+ char DOT_CHAR = '.';
+ char TAB_CHAR = '\t';
+
+ String CARRIAGE_RETURN = String.valueOf(CARRIAGE_RETURN_CHAR);
+ String EMPTY_STRING = ""; //$NON-NLS-1$
+ String DBL_SPACE = " "; //$NON-NLS-1$
+ String LINE_FEED = String.valueOf(LINE_FEED_CHAR);
+ String NEW_LINE = String.valueOf(NEW_LINE_CHAR);
+ String SPACE = String.valueOf(SPACE_CHAR);
+ String DOT = String.valueOf(DOT_CHAR);
+ String TAB = String.valueOf(TAB_CHAR);
+
+ String[] EMPTY_STRING_ARRAY = new String[0];
+
+ // all patterns below copied from Eclipse's PatternConstructor class.
+ final Pattern PATTERN_BACK_SLASH = Pattern.compile("\\\\");
//$NON-NLS-1$
+ final Pattern PATTERN_QUESTION = Pattern.compile("\\?"); //$NON-NLS-1$
+ final Pattern PATTERN_STAR = Pattern.compile("\\*"); //$NON-NLS-1$
+ }
+
+ /**
+ * The String "'"
+ */
+ public static final String SINGLE_QUOTE = "'"; //$NON-NLS-1$
+
+ /**
+ * The name of the System property that specifies the string that should be used to
separate
+ * lines. This property is a standard environment property that is usually set
automatically.
+ */
+ public static final String LINE_SEPARATOR_PROPERTY_NAME = "line.separator";
//$NON-NLS-1$
+
+ /**
+ * The String that should be used to separate lines; defaults to
+ * {@link #NEW_LINE}
+ */
+ public static final String LINE_SEPARATOR =
System.getProperty(LINE_SEPARATOR_PROPERTY_NAME, Constants.NEW_LINE);
+
+ public static final Comparator CASE_INSENSITIVE_ORDER =
String.CASE_INSENSITIVE_ORDER;
+
+ public static final Comparator CASE_SENSITIVE_ORDER = new Comparator() {
+ /**
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ * @since 4.2
+ */
+ public int compare(Object o1, Object o2) {
+ if ( o1 == o2 ) {
+ return 0;
+ }
+ return ((String)o1).compareTo((String)o2);
+ }
+ };
+
+ public static String getLineSeparator() {
+ return LINE_SEPARATOR;
+ }
+
+ /**
+ * Utility to return a string enclosed in ''.
+ * Creation date: (12/2/99 12:05:10 PM)
+ */
+ public static String enclosedInSingleQuotes(String aString) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(SINGLE_QUOTE);
+ sb.append(aString);
+ sb.append(SINGLE_QUOTE);
+ return sb.toString();
+ }
+
+ public static String removeChars(final String value, final char[] chars) {
+ final StringBuffer result = new StringBuffer();
+ if (value != null && chars != null && chars.length > 0) {
+ final String removeChars = String.valueOf(chars);
+ for (int i = 0; i < value.length(); i++) {
+ final String character = value.substring(i, i + 1);
+ if (removeChars.indexOf(character) == -1) {
+ result.append(character);
+ }
+ }
+ } else {
+ result.append(value);
+ }
+ return result.toString();
+ }
+
+ /**
+ * Join string pieces and separate with a delimiter. Similar to the perl function of
+ * the same name. If strings or delimiter are null, null is returned. Otherwise, at
+ * least an empty string will be returned.
+ * @see #split
+ *
+ * @param strings String pieces to join
+ * @param delimiter Delimiter to put between string pieces
+ * @return One merged string
+ */
+ public static String join(List strings, String delimiter) {
+ if(strings == null || delimiter == null) {
+ return null;
+ }
+
+ StringBuffer str = new StringBuffer();
+
+ // This is the standard problem of not putting a delimiter after the last
+ // string piece but still handling the special cases. A typical way is to check every
+ // iteration if it is the last one and skip the delimiter - this is avoided by
+ // looping up to the last one, then appending just the last one.
+
+ // First we loop through all but the last one (if there are at least 2) and
+ // put the piece and a delimiter after it. An iterator is used to walk the list.
+ int most = strings.size()-1;
+ if(strings.size() > 1) {
+ Iterator iter = strings.iterator();
+ for(int i=0; i<most; i++) {
+ str.append(iter.next());
+ str.append(delimiter);
+ }
+ }
+
+ // If there is at least one element, put the last one on with no delimiter after.
+ if(strings.size() > 0) {
+ str.append(strings.get(most));
+ }
+
+ return str.toString();
+ }
+
+ /**
+ * Return a stringified version of the array.
+ * @param array the array
+ * @param delim the delimiter to use between array components
+ * @return the string form of the array
+ */
+ public static String toString( final Object[] array, final String delim ) {
+ if ( array == null ) {
+ return ""; //$NON-NLS-1$
+ }
+ if ( array.length == 0 ) {
+ return "[]"; //$NON-NLS-1$
+ }
+ final StringBuffer sb = new StringBuffer();
+ sb.append('[');
+ for (int i = 0; i < array.length; ++i) {
+ if ( i != 0 ) {
+ sb.append(delim);
+ }
+ sb.append(array[i]);
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+
+ /**
+ * Return a stringified version of the array, using a ',' as a delimiter
+ * @param array the array
+ * @return the string form of the array
+ * @see #toString(Object[], String)
+ */
+ public static String toString( final Object[] array ) {
+ return toString(array,","); //$NON-NLS-1$
+ }
+
+ /**
+ * Split a string into pieces based on delimiters. Similar to the perl function of
+ * the same name. The delimiters are not included in the returned strings.
+ * @see #join
+ *
+ * @param str Full string
+ * @param splitter Characters to split on
+ * @return List of String pieces from full string
+ */
+ public static List split(String str, String splitter) {
+ StringTokenizer tokens = new StringTokenizer(str, splitter);
+ ArrayList l = new ArrayList(tokens.countTokens());
+ while(tokens.hasMoreTokens()) {
+ l.add(tokens.nextToken());
+ }
+ return l;
+ }
+
+ /**
+ * Break a string into pieces based on matching the full delimiter string in the
text.
+ * The delimiter is not included in the returned strings.
+ * @param target The text to break up.
+ * @param delimiter The sub-string which is used to break the target.
+ * @return List of String from the target.
+ */
+ public static List splitOnEntireString(String target, String delimiter) {
+ ArrayList result = new ArrayList();
+ if (delimiter.length() > 0) {
+ int index = 0;
+ int indexOfNextMatch = target.indexOf(delimiter);
+ while (indexOfNextMatch > -1) {
+ result.add(target.substring(index, indexOfNextMatch));
+ index = indexOfNextMatch + delimiter.length();
+ indexOfNextMatch = target.indexOf(delimiter, index);
+ }
+ if (index <= target.length()) {
+ result.add(target.substring(index));
+ }
+ } else {
+ result.add(target);
+ }
+ return result;
+ }
+
+ /**
+ * Split a string into pieces based on delimiters preserving spaces in
+ * quoted substring as on element in the returned list. The delimiters are
+ * not included in the returned strings.
+ * @see #join
+ *
+ * @param str Full string
+ * @param splitter Characters to split on
+ * @return List of String pieces from full string
+ */
+ public static List splitPreservingQuotedSubstring(String str, String splitter) {
+ ArrayList l = new ArrayList();
+ StringTokenizer tokens = new StringTokenizer(str, splitter);
+ StringBuffer token = new StringBuffer();
+ while(tokens.hasMoreTokens()) {
+ token.setLength(0);
+ token.append(tokens.nextToken());
+ if ( token.charAt(0) == '"' ) {
+ token.deleteCharAt(0);
+ while ( tokens.hasMoreTokens() ) {
+ token.append(Constants.SPACE + tokens.nextToken());
+ if ( token.charAt(token.length() -1) == '"' ) {
+ token.deleteCharAt(token.length() - 1);
+ break;
+ }
+ }
+ }
+ l.add(token.toString().trim());
+ }
+ return l;
+ }
+
+ /*
+ * Replace a single occurrence of the search string with the replace string
+ * in the source string. If any of the strings is null or the search string
+ * is zero length, the source string is returned.
+ * @param source the source string whose contents will be altered
+ * @param search the string to search for in source
+ * @param replace the string to substitute for search if present
+ * @return source string with the *first* occurrence of the search string
+ * replaced with the replace string
+ */
+ public static String replace(String source, String search, String replace) {
+ if (source != null && search != null && search.length() > 0
&& replace != null) {
+ int start = source.indexOf(search);
+ if (start > -1) {
+ return new StringBuffer(source).replace(start, start + search.length(),
replace).toString();
+ }
+ }
+ return source;
+ }
+
+ /*
+ * Replace all occurrences of the search string with the replace string
+ * in the source string. If any of the strings is null or the search string
+ * is zero length, the source string is returned.
+ * @param source the source string whose contents will be altered
+ * @param search the string to search for in source
+ * @param replace the string to substitute for search if present
+ * @return source string with *all* occurrences of the search string
+ * replaced with the replace string
+ */
+ public static String replaceAll(String source, String search, String replace) {
+ if (source != null && search != null && search.length() > 0
&& replace != null) {
+ int start = source.indexOf(search);
+ if (start > -1) {
+ StringBuffer newString = new StringBuffer(source);
+ replaceAll(newString, search, replace);
+ return newString.toString();
+ }
+ }
+ return source;
+ }
+
+ public static void replaceAll(StringBuffer source, String search, String replace) {
+ if (source != null && search != null && search.length() > 0
&& replace != null) {
+ int start = source.toString().indexOf(search);
+ while (start > -1) {
+ int end = start + search.length();
+ source.replace(start, end, replace);
+ start = source.toString().indexOf(search, start + replace.length());
+ }
+ }
+ }
+
+ /**
+ * Simple static method to tuncate Strings to given length.
+ * @param in the string that may need tuncating.
+ * @param len the lenght that the string should be truncated to.
+ * @return a new String containing chars with length <= len or
<code>null</code>
+ * if input String is <code>null</code>.
+ */
+ public static String truncString(String in, int len) {
+ String out = in;
+ if ( in != null && len > 0 && in.length() > len ) {
+ out = in.substring(0, len);
+ }
+ return out;
+ }
+
+ /**
+ * Simple utility method to wrap a string by inserting line separators creating
+ * multiple lines each with length no greater than the user specified maximum.
+ * The method parses the given string into tokens using a space delimiter then
+ * reassembling the tokens into the resulting string while inserting separators
+ * when required. If the number of characters in a single token is greater
+ * than the specified maximum, the token will not be split but instead the
+ * maximum will be exceeded.
+ * @param str the string that may need tuncating.
+ * @param maxCharPerLine the max number of characters per line
+ * @return a new String containing line separators or the original string
+ * if its length was less than the maximum.
+ */
+ public static String wrap(String str, int maxCharPerLine) {
+ int strLength = str.length();
+ if (strLength > maxCharPerLine) {
+ StringBuffer sb = new
StringBuffer(str.length()+(strLength/maxCharPerLine)+1);
+ strLength = 0;
+ List tokens = StringUtil.split(str,Constants.SPACE);
+ Iterator itr = tokens.iterator();
+ while (itr.hasNext()) {
+ String token = (String) itr.next();
+ if ( strLength+token.length() > maxCharPerLine ) {
+// sb.append(getLineSeparator());
+ sb.append(Constants.NEW_LINE);
+ strLength = 0;
+ }
+ sb.append(token);
+ sb.append(Constants.SPACE);
+ strLength += token.length()+1;
+ }
+ return sb.toString();
+ }
+ return str;
+ }
+
+ /**
+ * Return the tokens in a string in a list. This is particularly
+ * helpful if the tokens need to be processed in reverse order. In that case,
+ * a list iterator can be acquired from the list for reverse order traversal.
+ *
+ * @param str String to be tokenized
+ * @param delimiter Characters which are delimit tokens
+ * @return List of string tokens contained in the tokenized string
+ */
+ public static List getTokens(String str, String delimiter) {
+ ArrayList l = new ArrayList();
+ StringTokenizer tokens = new StringTokenizer(str, delimiter);
+ while(tokens.hasMoreTokens()) {
+ l.add(tokens.nextToken());
+ }
+ return l;
+ }
+
+ /**
+ * Return the number of tokens in a string that are seperated by the delimiter.
+ *
+ * @param str String to be tokenized
+ * @param delimiter Characters which are delimit tokens
+ * @return Number of tokens seperated by the delimiter
+ */
+ public static int getTokenCount(String str, String delimiter) {
+ StringTokenizer tokens = new StringTokenizer(str, delimiter);
+ return tokens.countTokens();
+ }
+
+ /**
+ * Return the number of occurrences of token string that occurs in input string.
+ * Note: token is case sensitive.
+ *
+ * @param input
+ * @param token
+ * @return int
+ */
+ public static int occurrences(String input, String token) {
+ int num = 0;
+ int index = input.indexOf(token);
+ while (index >= 0) {
+ num++;
+ index = input.indexOf(token, index+1);
+ }
+ return num;
+ }
+
+ /**
+ * Return the last token in the string.
+ *
+ * @param str String to be tokenized
+ * @param delimiter Characters which are delimit tokens
+ * @return the last token contained in the tokenized string
+ */
+ public static String getLastToken(String str, String delimiter) {
+ if (str == null) {
+ return Constants.EMPTY_STRING;
+ }
+ int beginIndex = 0;
+ if (str.lastIndexOf(delimiter) > 0) {
+ beginIndex = str.lastIndexOf(delimiter)+1;
+ }
+ return str.substring(beginIndex,str.length());
+ }
+
+
+ /**
+ * Return the first token in the string.
+ *
+ * @param str String to be tokenized
+ * @param delimiter Characters which are delimit tokens
+ * @return the first token contained in the tokenized string
+ */
+ public static String getFirstToken(String str, String delimiter) {
+ if (str == null) {
+ return Constants.EMPTY_STRING;
+ }
+ int endIndex = str.indexOf(delimiter);
+ if (endIndex < 0) {
+ endIndex = str.length();
+ }
+ return str.substring(0,endIndex);
+ }
+
+
+ public static String computePluralForm(String str) {
+ return computePluralForm(str, Constants.EMPTY_STRING);
+ }
+
+ public static String computePluralForm(String str, String defaultValue ) {
+ if ( str == null || str.length() == 0 ) {
+ return defaultValue;
+ }
+ String result = str;
+ if ( result.endsWith("es") ) { //$NON-NLS-1$
+ // do nothing
+ } else if ( result.endsWith("ss") || //$NON-NLS-1$
+ result.endsWith("x") || //$NON-NLS-1$
+ result.endsWith("ch") || //$NON-NLS-1$
+ result.endsWith("sh") ) { //$NON-NLS-1$
+ result = result + "es"; //$NON-NLS-1$
+ } else if ( result.endsWith("y") && ! ( //$NON-NLS-1$
+ result.endsWith("ay") || //$NON-NLS-1$
+ result.endsWith("ey") || //$NON-NLS-1$
+ result.endsWith("iy") || //$NON-NLS-1$
+ result.endsWith("oy") || //$NON-NLS-1$
+ result.endsWith("uy") || //$NON-NLS-1$
+ result.equalsIgnoreCase("any") ) ) { //$NON-NLS-1$
+ result = result.substring(0, result.length()-1) + "ies";
//$NON-NLS-1$
+ } else {
+ result += "s"; //$NON-NLS-1$
+ }
+ return result;
+ }
+
+ public static String getStackTrace( final Throwable t ) {
+ final ByteArrayOutputStream bas = new ByteArrayOutputStream();
+ final PrintWriter pw = new PrintWriter(bas);
+ t.printStackTrace(pw);
+ pw.close();
+ return bas.toString();
+ }
+
+ /**
+ * Returns whether the specified text represents a boolean value, i.e., whether it
equals "true" or "false"
+ * (case-insensitive).
+ * @since 4.0
+ */
+ public static boolean isBoolean(final String text) {
+ return (Boolean.TRUE.toString().equalsIgnoreCase(text) ||
Boolean.FALSE.toString().equalsIgnoreCase(text));
+ }
+
+ /**<p>
+ * Returns whether the specified text is either empty or null.
+ * </p>
+ * @param text The text to check; may be null;
+ * @return True if the specified text is either empty or null.
+ * @since 4.0
+ */
+ public static boolean isEmpty(final String text) {
+ return (text == null || text.length() == 0);
+ }
+
+ /**
+ * Returns the index within this string of the first occurrence of the
+ * specified substring. The integer returned is the smallest value
+ * <i>k</i> such that:
+ * <blockquote><pre>
+ * this.startsWith(str, <i>k</i>)
+ * </pre></blockquote>
+ * is <code>true</code>.
+ *
+ * @param text any string.
+ * @param str any string.
+ * @return if the str argument occurs as a substring within text,
+ * then the index of the first character of the first
+ * such substring is returned; if it does not occur as a
+ * substring, <code>-1</code> is returned. If the text or
+ * str argument is null or empty then <code>-1</code> is
returned.
+ */
+ public static int indexOfIgnoreCase(final String text, final String str) {
+ if (isEmpty(text)) {
+ return -1;
+ }
+ if (isEmpty(str)) {
+ return -1;
+ }
+ final String lowerText = text.toLowerCase();
+ final String lowerStr = str.toLowerCase();
+ return lowerText.indexOf(lowerStr);
+ }
+
+ /**
+ * Tests if the string starts with the specified prefix.
+ *
+ * @param text the string to test.
+ * @param prefix the prefix.
+ * @return <code>true</code> if the character sequence represented by
the
+ * argument is a prefix of the character sequence represented by
+ * this string; <code>false</code> otherwise.
+ * Note also that <code>true</code> will be returned if the
+ * prefix is an empty string or is equal to the text
+ * <code>String</code> object as determined by the
+ * {@link #equals(Object)} method. If the text or
+ * prefix argument is null <code>false</code> is returned.
+ * @since JDK1. 0
+ */
+ public static boolean startsWithIgnoreCase(final String text, final String prefix) {
+ if (isEmpty(text)) {
+ return false;
+ }
+ if (prefix == null) {
+ return false;
+ }
+ int textLength = text.length();
+ int prefixLength = prefix.length();
+ if (prefixLength == 0) {
+ return true;
+ }
+ if (prefixLength > textLength) {
+ return false;
+ }
+ char[] chArray = prefix.toCharArray();
+ for (int i = 0; i != chArray.length; ++i) {
+ char ch1 = chArray[i];
+ char ch2 = text.charAt(i);
+ if (ch1 == ch2 || Character.toLowerCase(ch1) == Character.toLowerCase(ch2))
{
+ // continue
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests if the string ends with the specified suffix.
+ *
+ * @param text the string to test.
+ * @param suffix the suffix.
+ * @return <code>true</code> if the character sequence represented by
the
+ * argument is a suffix of the character sequence represented by
+ * this object; <code>false</code> otherwise. Note that the
+ * result will be <code>true</code> if the suffix is the
+ * empty string or is equal to this <code>String</code> object
+ * as determined by the {@link #equals(Object)} method. If the text or
+ * suffix argument is null <code>false</code> is returned.
+ */
+ public static boolean endsWithIgnoreCase(final String text, final String suffix) {
+ if (isEmpty(text)) {
+ return false;
+ }
+ if (suffix == null) {
+ return false;
+ }
+ int textLength = text.length();
+ int suffixLength = suffix.length();
+ if (suffixLength == 0) {
+ return true;
+ }
+ if (suffixLength > textLength) {
+ return false;
+ }
+ int offset = textLength - suffixLength;
+ char[] chArray = suffix.toCharArray();
+ for (int i = 0; i != chArray.length; ++i) {
+ char ch1 = chArray[i];
+ char ch2 = text.charAt(offset + i);
+ if (ch1 == ch2 || Character.toLowerCase(ch1) == Character.toLowerCase(ch2))
{
+ // continue
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Determine if the string passed in has all digits as its contents
+ * @param str
+ * @return true if digits; false otherwise
+ */
+ public static boolean isDigits(String str) {
+ for(int i=0; i<str.length(); i++) {
+ if(!StringUtil.isDigit(str.charAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
//============================================================================================================================
+ // Constructors
+
+ /**<p>
+ * Prevents instantiation.
+ * </p>
+ * @since 4.0
+ */
+ private StringUtil() {
+ }
+
+ /*
+ * Converts user string to regular expres '*' and '?' to regEx
variables.
+ * copied from eclipse's PatternConstructor
+ */
+ static String asRegEx(String pattern) {
+ // Replace \ with \\, * with .* and ? with .
+ // Quote remaining characters
+ String result1 = Constants.PATTERN_BACK_SLASH.matcher(pattern).replaceAll(
+ "\\\\E\\\\\\\\\\\\Q"); //$NON-NLS-1$
+ String result2 = Constants.PATTERN_STAR.matcher(result1).replaceAll(
+ "\\\\E.*\\\\Q"); //$NON-NLS-1$
+ String result3 = Constants.PATTERN_QUESTION.matcher(result2).replaceAll(
+ "\\\\E.\\\\Q"); //$NON-NLS-1$
+ return "\\Q" + result3 + "\\E"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Creates a regular expression pattern from the pattern string (which is
+ * our old 'StringMatcher' format). Copied from Eclipse's
PatternConstructor class.
+ *
+ * @param pattern
+ * The search pattern
+ * @param isCaseSensitive
+ * Set to <code>true</code> to create a case insensitve
pattern
+ * @return The created pattern
+ */
+ public static Pattern createPattern(String pattern, boolean isCaseSensitive) {
+ if (isCaseSensitive)
+ return Pattern.compile(asRegEx(pattern));
+ return Pattern.compile(asRegEx(pattern), Pattern.CASE_INSENSITIVE
+ | Pattern.UNICODE_CASE);
+ }
+
+ /**
+ * Removes extraneous whitespace from a string. By it's nature, it will be
trimmed also.
+ * @param raw
+ * @return
+ * @since 5.0
+ */
+ public static String collapseWhitespace(String raw) {
+ StringBuffer rv = new StringBuffer(raw.length());
+
+ StringTokenizer izer = new StringTokenizer(raw, " "); //$NON-NLS-1$
+ while (izer.hasMoreTokens()) {
+ String tok = izer.nextToken();
+ // Added one last check here so we don't append a "space" on
the end of the string
+ rv.append(tok);
+ if( izer.hasMoreTokens() ) {
+ rv.append(' ');
+ }
+ } // endwhile
+
+ return rv.toString();
+ }
+
+ /**
+ * If input == null OR input.length() < desiredLength, pad to desiredLength with
spaces.
+ * If input.length() > desiredLength, chop at desiredLength.
+ * @param input Input text
+ * @param desiredLength Desired length
+ * @return
+ * @since 5.0
+ */
+ public static String toFixedLength(String input, int desiredLength) {
+ if(input == null) {
+ input = ""; //$NON-NLS-1$
+ }
+
+ if(input.length() == desiredLength) {
+ return input;
+ }
+
+ if(input.length() < desiredLength) {
+ StringBuffer str = new StringBuffer(input);
+ int needSpaces = desiredLength - input.length();
+ for(int i=0; i<needSpaces; i++) {
+ str.append(' ');
+ }
+ return str.toString();
+ }
+
+ // Else too long - chop
+ return input.substring(0, desiredLength);
+ }
+
+
+ public static boolean isLetter(char c) {
+ return isBasicLatinLetter(c) || Character.isLetter(c);
+ }
+ public static boolean isDigit(char c) {
+ return isBasicLatinDigit(c) || Character.isDigit(c);
+ }
+ public static boolean isLetterOrDigit(char c) {
+ return isBasicLatinLetter(c) || isBasicLatinDigit(c) ||
Character.isLetterOrDigit(c);
+ }
+
+ public static String toUpperCase(String str) {
+ String newStr = convertBasicLatinToUpper(str);
+ if (newStr == null) {
+ return str.toUpperCase();
+ }
+ return newStr;
+ }
+
+ public static String toLowerCase(String str) {
+ String newStr = convertBasicLatinToLower(str);
+ if (newStr == null) {
+ return str.toLowerCase();
+ }
+ return newStr;
+ }
+
+ /**
+ * Create a valid filename from the given String.
+ *
+ * @param str The String to convert to a valid filename.
+ * @param defaultName The default name to use if only special characters exist.
+ * @return String A valid filename.
+ */
+ public static String createFileName(String str) {
+
+ /** Replace some special chars */
+ str = str.replaceAll(" \\| ", "_"); //$NON-NLS-1$
//$NON-NLS-2$
+ str = str.replaceAll(">", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ str = str.replaceAll(": ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ str = str.replaceAll(" ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ str = str.replaceAll("\\?", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ str = str.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ /** If filename only contains of special chars */
+ if (str.matches("[_]+")) //$NON-NLS-1$
+ str = "file"; //$NON-NLS-1$
+
+ return str;
+ }
+
+
+ /**
+ * Make the first letter uppercase
+ * @param str
+ * @return The string with the first letter being changed to uppercase
+ * @since 5.5
+ */
+ public static String firstLetterUppercase(String str) {
+ if(str == null || str.length() == 0) {
+ return null;
+ }
+ if(str.length() == 1) {
+ return str.toUpperCase();
+ }
+ return str.substring(0, 1).toUpperCase() + str.substring(1);
+ }
+
+ private static String convertBasicLatinToUpper(String str) {
+ char[] chars = str.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ if (isBasicLatinLowerCase(chars[i])) {
+ chars[i] = (char)('A' + (chars[i] - 'a'));
+ } else if (!isBasicLatinChar(chars[i])) {
+ return null;
+ }
+ }
+ return new String(chars);
+ }
+
+ private static String convertBasicLatinToLower(String str) {
+ char[] chars = str.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ if (isBasicLatinUpperCase(chars[i])) {
+ chars[i] = (char)('a' + (chars[i] - 'A'));
+ } else if (!isBasicLatinChar(chars[i])) {
+ return null;
+ }
+ }
+ return new String(chars);
+ }
+
+ private static boolean isBasicLatinUpperCase(char c) {
+ return c >= 'A' && c <= 'Z';
+ }
+ private static boolean isBasicLatinLowerCase(char c) {
+ return c >= 'a' && c <= 'z';
+ }
+ private static boolean isBasicLatinLetter(char c) {
+ return (c >= 'a' && c <= 'z') || (c >=
'A' && c <= 'Z');
+ }
+ private static boolean isBasicLatinDigit(char c) {
+ return c >= '0' && c <= '9';
+ }
+ private static boolean isBasicLatinChar(char c) {
+ return c <= '\u007F';
+ }
+
+ /**
+ * Convert the given value to specified type.
+ * @param value
+ * @param type
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T valueOf(String value, Class type){
+
+ if(type == String.class) {
+ return (T) value;
+ }
+ else if(type == Boolean.class || type == Boolean.TYPE) {
+ return (T) Boolean.valueOf(value);
+ }
+ else if (type == Integer.class || type == Integer.TYPE) {
+ return (T) Integer.decode(value);
+ }
+ else if (type == Float.class || type == Float.TYPE) {
+ return (T) Float.valueOf(value);
+ }
+ else if (type == Double.class || type == Double.TYPE) {
+ return (T) Double.valueOf(value);
+ }
+ else if (type == Long.class || type == Long.TYPE) {
+ return (T) Long.decode(value);
+ }
+ else if (type == Short.class || type == Short.TYPE) {
+ return (T) Short.decode(value);
+ }
+ else if (type.isAssignableFrom(List.class)) {
+ return (T)new ArrayList<String>(Arrays.asList(value.split(",")));
//$NON-NLS-1$
+ }
+ else if (type == Void.class) {
+ return null;
+ }
+ else if (type.isEnum()) {
+ return (T)Enum.valueOf(type, value);
+ }
+
+ else if (type.isAssignableFrom(Map.class)) {
+ List<String> l = Arrays.asList(value.split(",")); //$NON-NLS-1$
+ Map m = new HashMap<String, String>();
+ for(String key: l) {
+ int index = key.indexOf('=');
+ if (index != -1) {
+ m.put(key.substring(0, index), key.substring(index+1));
+ }
+ }
+ return (T)m;
+ }
+
+ throw new IllegalArgumentException("Conversion from String to "+
type.getName() + " is not supported"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+}
Property changes on:
trunk/test-integration/db/src/main/java/org/teiid/test/util/StringUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain