http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessHibTest.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessHibTest.java b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessHibTest.java index 420a9d8..42e061d 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessHibTest.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessHibTest.java @@ -24,7 +24,7 @@ import org.apache.ode.bpel.dao.ProcessInstanceDAO; public class CleanSuccessHibTest extends CleanSuccessTest { @Override public String getODEConfigDir() { - return HIB_DERBY_CONF_DIR; + return HIB_H2_CONF_DIR; } @Override
http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessTest.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessTest.java b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessTest.java index 1079053..d0b1752 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessTest.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanSuccessTest.java @@ -90,13 +90,13 @@ public class CleanSuccessTest extends CleanTestBase { } public String getODEConfigDir() { - return JPA_DERBY_CONF_DIR; + return JPA_H2_CONF_DIR; } - + protected ProcessInstanceDAO getInstance() { return JpaDaoConnectionFactoryImpl.getInstance(); } - + @Override protected int getLargeDataCount(int echoCount) throws Exception { return echoCount; http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanTestBase.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanTestBase.java b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanTestBase.java index 5841538..ee377af 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanTestBase.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/CleanTestBase.java @@ -56,8 +56,9 @@ public abstract class CleanTestBase extends Axis2TestBase implements ODEConfigDi //ignore } } - EmbeddedGeronimoFactory factory = new EmbeddedGeronimoFactory(); - txm = factory.getTransactionManager(); + txm = server.getODEServer().getTransactionManager(); +/* EmbeddedGeronimoFactory factory = new EmbeddedGeronimoFactory(); + txm = factory.getTransactionManager();*/ Database db = getDatabase(); db.setTransactionManager(txm); db.start(); @@ -88,7 +89,7 @@ public abstract class CleanTestBase extends Axis2TestBase implements ODEConfigDi File configFile = new File(odeConfigDir); ODEConfigProperties odeProps = new ODEConfigProperties(configFile); odeProps.load(); - Database db = new Database(odeProps); + Database db = Database.create(odeProps); String webappPath = getClass().getClassLoader().getResource("webapp").getFile(); db.setWorkRoot(new File(webappPath, "/WEB-INF")); http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/ProcessCronCleanupTest.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/ProcessCronCleanupTest.java b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/ProcessCronCleanupTest.java index ddb5ec8..af73f85 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/ProcessCronCleanupTest.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/ProcessCronCleanupTest.java @@ -23,7 +23,7 @@ import org.apache.ode.bpel.dao.ProcessInstanceDAO; import org.testng.annotations.Test; public class ProcessCronCleanupTest extends CleanTestBase { -// @Test(dataProvider="configs") + //@Test(dataProvider="configs") public void _testCleanAll() throws Exception { go("TestProcessCronCleanup", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } @@ -46,9 +46,9 @@ public class ProcessCronCleanupTest extends CleanTestBase { } public String getODEConfigDir() { - return HIB_DERBY_CONF_DIR; + return HIB_H2_CONF_DIR; } - + protected ProcessInstanceDAO getInstance() { return HibDaoConnectionFactoryImpl.getInstance(); } http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/SystemCronCleanupTest.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/SystemCronCleanupTest.java b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/SystemCronCleanupTest.java index 2b80a63..c647485 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/SystemCronCleanupTest.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/instancecleanup/SystemCronCleanupTest.java @@ -73,7 +73,7 @@ public class SystemCronCleanupTest extends CleanTestBase { } public String getODEConfigDir() { - return HIB_DERBY_CONF_DIR; + return HIB_H2_CONF_DIR; } protected ProcessInstanceDAO getInstance() { http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java b/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java index 3daad20..f1d6ca5 100644 --- a/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java +++ b/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java @@ -270,6 +270,6 @@ public class InstanceManagementTest extends Axis2TestBase implements ODEConfigDi } public String getODEConfigDir() { - return HIB_DERBY_CONF_DIR; + return HIB_H2_CONF_DIR; } } http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/webapp/WEB-INF/conf.hib-derby/ode-axis2.properties ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/webapp/WEB-INF/conf.hib-derby/ode-axis2.properties b/axis2-war/src/test/webapp/WEB-INF/conf.hib-derby/ode-axis2.properties index 6e8afcf..c5a3e2f 100644 --- a/axis2-war/src/test/webapp/WEB-INF/conf.hib-derby/ode-axis2.properties +++ b/axis2-war/src/test/webapp/WEB-INF/conf.hib-derby/ode-axis2.properties @@ -16,8 +16,10 @@ # ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.HibDaoConnectionFactoryImpl -ode-axis2.db.emb.name=hibdb ode-axis2.db.mode=EMBEDDED +ode-axis2.db.emb.type=DERBY +ode-axis2.db.emb.name=derby-hibdb ode-axis2.cluster.localRoute.targets=http://doesntexist:8080/ode/processes/ ode-axis2.cluster.localRoute.base=http://localhost:8888/ode/processes/ ode-axis2.event.listeners=org.apache.ode.bpel.common.evt.DebugBpelEventListener +ode-axis2.acquireTransactionLocks=true \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/webapp/WEB-INF/conf.hib-h2/ode-axis2.properties ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/webapp/WEB-INF/conf.hib-h2/ode-axis2.properties b/axis2-war/src/test/webapp/WEB-INF/conf.hib-h2/ode-axis2.properties index c081fb7..c83f242 100644 --- a/axis2-war/src/test/webapp/WEB-INF/conf.hib-h2/ode-axis2.properties +++ b/axis2-war/src/test/webapp/WEB-INF/conf.hib-h2/ode-axis2.properties @@ -16,11 +16,14 @@ # ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.HibDaoConnectionFactoryImpl -ode-axis2.db.mode=INTERNAL -ode-axis2.db.int.jdbcurl=jdbc:h2:file:axis2-war/target/test/classes/webapp/WEB-INF/h2-hibdb/ode-hib-h2;DB_CLOSE_ON_EXIT=false;user=sa;TRACE_LEVEL_FILE=3 -ode-axis2.db.int.driver=org.h2.Driver +#ode-axis2.db.mode=INTERNAL +#ode-axis2.db.int.jdbcurl=jdbc:h2:file:axis2-war/target/test/classes/webapp/WEB-INF/h2-hibdb/ode-hib-h2;DB_CLOSE_ON_EXIT=false;user=sa;TRACE_LEVEL_FILE=3 +#ode-axis2.db.int.driver=org.h2.Driver +ode-axis2.db.mode=EMBEDDED +ode-axis2.db.emb.type=H2 +ode-axis2.db.emb.name=h2-hibdb/ode-hib-h2 + ode-axis2.cluster.localRoute.targets=http://doesntexist:8080/ode/processes/ ode-axis2.cluster.localRoute.base=http://localhost:8888/ode/processes/ ode-axis2.event.listeners=org.apache.ode.bpel.common.evt.DebugBpelEventListener -ode.acquireTransactionLocks=true -hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file +ode-axis2.acquireTransactionLocks=true \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/webapp/WEB-INF/conf.jpa-derby/ode-axis2.properties ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/webapp/WEB-INF/conf.jpa-derby/ode-axis2.properties b/axis2-war/src/test/webapp/WEB-INF/conf.jpa-derby/ode-axis2.properties index f8b7e93..01e78bf 100644 --- a/axis2-war/src/test/webapp/WEB-INF/conf.jpa-derby/ode-axis2.properties +++ b/axis2-war/src/test/webapp/WEB-INF/conf.jpa-derby/ode-axis2.properties @@ -15,4 +15,7 @@ # limitations under the License. # -ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.JpaDaoConnectionFactoryImpl \ No newline at end of file +ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.JpaDaoConnectionFactoryImpl +ode-axis2.db.mode=EMBEDDED +ode-axis2.db.emb.type=DERBY +ode-axis2.db.emb.name=derby-jpadb \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/webapp/WEB-INF/conf.jpa-h2/ode-axis2.properties ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/webapp/WEB-INF/conf.jpa-h2/ode-axis2.properties b/axis2-war/src/test/webapp/WEB-INF/conf.jpa-h2/ode-axis2.properties index dbb191d..c186678 100644 --- a/axis2-war/src/test/webapp/WEB-INF/conf.jpa-h2/ode-axis2.properties +++ b/axis2-war/src/test/webapp/WEB-INF/conf.jpa-h2/ode-axis2.properties @@ -16,6 +16,6 @@ # ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.JpaDaoConnectionFactoryImpl -ode-axis2.db.mode=INTERNAL -ode-axis2.db.int.jdbcurl=jdbc:h2:file:axis2-war/target/test/classes/webapp/WEB-INF/h2-jpadb/ode-jpa-h2;DB_CLOSE_ON_EXIT=false;user=sa;TRACE_LEVEL_FILE=3 -ode-axis2.db.int.driver=org.h2.Driver +ode-axis2.db.mode=EMBEDDED +ode-axis2.db.emb.type=H2 +ode-axis2.db.emb.name=h2-jpadb/ode-jpa-h2 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2-war/src/test/webapp/WEB-INF/conf/ode-axis2.properties ---------------------------------------------------------------------- diff --git a/axis2-war/src/test/webapp/WEB-INF/conf/ode-axis2.properties b/axis2-war/src/test/webapp/WEB-INF/conf/ode-axis2.properties index c081fb7..ae0efaa 100644 --- a/axis2-war/src/test/webapp/WEB-INF/conf/ode-axis2.properties +++ b/axis2-war/src/test/webapp/WEB-INF/conf/ode-axis2.properties @@ -16,11 +16,10 @@ # ode-axis2.dao.factory=org.apache.ode.axis2.instancecleanup.HibDaoConnectionFactoryImpl -ode-axis2.db.mode=INTERNAL -ode-axis2.db.int.jdbcurl=jdbc:h2:file:axis2-war/target/test/classes/webapp/WEB-INF/h2-hibdb/ode-hib-h2;DB_CLOSE_ON_EXIT=false;user=sa;TRACE_LEVEL_FILE=3 -ode-axis2.db.int.driver=org.h2.Driver +ode-axis2.db.emb.type=H2 +ode-axis2.db.emb.name=h2-hibdb/ode-hib-h2 ode-axis2.cluster.localRoute.targets=http://doesntexist:8080/ode/processes/ ode-axis2.cluster.localRoute.base=http://localhost:8888/ode/processes/ ode-axis2.event.listeners=org.apache.ode.bpel.common.evt.DebugBpelEventListener -ode.acquireTransactionLocks=true -hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file +#hibernate.dialect=org.hibernate.dialect.H2Dialect +ode.acquireTransactionLocks=true \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java ---------------------------------------------------------------------- diff --git a/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java b/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java index 9020353..839babc 100644 --- a/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java +++ b/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java @@ -130,7 +130,9 @@ public class ODEServer { protected MultiThreadedHttpConnectionManager httpConnectionManager; protected IdleConnectionTimeoutThread idleConnectionTimeoutThread; - + + public Runnable txMgrCreatedCallback; + public void init(ServletConfig config, ConfigurationContext configContext) throws ServletException { init(config.getServletContext().getRealPath("/WEB-INF"), configContext); } @@ -172,6 +174,9 @@ public class ODEServer { __log.debug("Initializing transaction manager"); initTxMgr(); + if (txMgrCreatedCallback != null) { + txMgrCreatedCallback.run(); + } __log.debug("Creating data source."); initDataSource(); __log.debug("Starting DAO."); @@ -261,7 +266,7 @@ public class ODEServer { } private void initDataSource() throws ServletException { - _db = new Database(_odeConfig); + _db = Database.create(_odeConfig); _db.setTransactionManager(_txMgr); _db.setWorkRoot(_workRoot); @@ -419,6 +424,10 @@ public class ODEServer { } } + public TransactionManager getTransactionManager() { + return _txMgr; + } + private void initConnector() throws ServletException { int port = _odeConfig.getConnectorPort(); if (port == 0) { http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java b/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java index 328a211..6f16f7d 100644 --- a/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java +++ b/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java @@ -46,6 +46,10 @@ public class OdeConfigProperties { public static final String PROP_DB_EMBEDDED_NAME = "db.emb.name"; + public static final String PROP_DB_EMBEDDED_TYPE = "db.emb.type"; + + public static final String PROP_DB_EMBEDDED_CREATE = "db.emb.create"; + public static final String PROP_DB_INTERNAL_URL = "db.int.jdbcurl"; public static final String PROP_DB_INTERNAL_DRIVER = "db.int.driver"; @@ -73,7 +77,7 @@ public class OdeConfigProperties { public static final String PROP_WORKING_DIR = "working.dir"; public static final String PROP_DEPLOY_DIR = "deploy.dir"; - + public static final String PROP_EVENT_LISTENERS = "event.listeners"; public static final String PROP_MEX_INTERCEPTORS = "mex.interceptors"; @@ -83,23 +87,23 @@ public class OdeConfigProperties { public static final String PROP_PROCESS_DEHYDRATION = "process.dehydration"; public static final String PROP_PROCESS_DEHYDRATION_MAXIMUM_AGE = "process.dehydration.maximum.age"; - + public static final String PROP_PROCESS_DEHYDRATION_MAXIMUM_COUNT = "process.dehydration.maximum.count"; - + public static final String PROP_PROCESS_HYDRATION_LAZY = "process.hydration.lazy"; - + public static final String PROP_PROCESS_HYDRATION_LAZY_MINIMUM_SIZE = "process.hydration.lazy.minimum.size"; - + public static final String PROP_PROCESS_HYDRATION_THROTTLED_MAXIMUM_COUNT = "process.hydration.throttled.maximum.count"; - + public static final String PROP_PROCESS_HYDRATION_THROTTLED_MAXIMUM_SIZE = "process.hydration.throttled.maximum.size"; - + public static final String PROP_PROCESS_INSTANCE_THROTTLED_MAXIMUM_COUNT = "process.instance.throttled.maximum.count"; - + public static final String PROP_DAOCF = "dao.factory"; - + public static final String PROP_MIGRATION_TRANSACTION_TIMEOUT = "migration.transaction.timeout"; - + public static final String DEFAULT_TX_FACTORY_CLASS_NAME = "org.apache.ode.il.EmbeddedGeronimoFactory"; private File _cfgFile; @@ -112,6 +116,10 @@ public class OdeConfigProperties { private static String __dbEmbName = "derby-jpadb"; private static String __daoCfClass = "org.apache.ode.dao.jpa.BPELDAOConnectionFactoryImpl"; + public static String DEFAULT_DB_EMB_NAME = "ode-db"; + public static String DEFAULT_DB_EMB_TYPE = "h2"; + public static String DEFAULT_DAOCF_CLASS = "org.apache.ode.dao.jpa.openjpa.BpelDAOConnectionFactoryImpl"; + static { String odep = System.getProperty("ode.persistence"); if (odep != null && @@ -136,6 +144,16 @@ public class OdeConfigProperties { EMBEDDED } + /** + * Possible database implementation. + */ + public enum EmbeddedDbType { + + DERBY, + + H2 + } + public OdeConfigProperties(File cfgFile, String prefix) { _cfgFile = cfgFile; _prefix = prefix; @@ -188,6 +206,14 @@ public class OdeConfigProperties { } + public EmbeddedDbType getDbEmbeddedType() { + return EmbeddedDbType.valueOf(getProperty(OdeConfigProperties.PROP_DB_EMBEDDED_TYPE, DEFAULT_DB_EMB_TYPE).trim().toUpperCase()); + } + + public boolean isDbEmbeddedCreate() { + return Boolean.valueOf(getProperty(OdeConfigProperties.PROP_DB_EMBEDDED_CREATE, "true")); + } + public DatabaseMode getDbMode() { return DatabaseMode.valueOf(getProperty(OdeConfigProperties.PROP_DB_MODE, DatabaseMode.EMBEDDED.toString()).trim() .toUpperCase()); http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java index 80a0a00..226382b 100644 --- a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java @@ -19,65 +19,54 @@ package org.apache.ode.il.dbutil; import java.io.File; -import java.sql.SQLException; -import java.util.Properties; -import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.TransactionManager; -import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.derby.jdbc.EmbeddedDriver; -import org.apache.geronimo.connector.outbound.GenericConnectionManager; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport; -import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; -import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTrackingCoordinator; -import org.apache.geronimo.transaction.manager.RecoverableTransactionManager; import org.apache.ode.bpel.dao.BpelDAOConnectionFactoryJDBC; import org.apache.ode.il.config.OdeConfigProperties; import org.apache.ode.utils.LoggingInterceptor; -import org.tranql.connector.jdbc.JDBCDriverMCF; /** * Does the dirty work of setting up / obtaining a DataSource based on the configuration in the {@link OdeConfigProperties} object. * */ -public class Database { - private static final Log __log = LogFactory.getLog(Database.class); +public abstract class Database { + protected static final Log __log = LogFactory.getLog(Database.class); - private static final Log __logSql = LogFactory.getLog("org.apache.ode.sql"); + protected static final Log __logSql = LogFactory.getLog("org.apache.ode.sql"); - private static final Messages __msgs = Messages.getMessages(Messages.class); + protected static final Messages __msgs = Messages.getMessages(Messages.class); - private static final int CONNECTION_MAX_WAIT_MILLIS = 30000; + protected OdeConfigProperties _odeConfig; - private static final int CONNECTION_MAX_IDLE_MINUTES = 5; + protected boolean _started; - private OdeConfigProperties _odeConfig; + protected TransactionManager _txm; - private boolean _started; + protected DataSource _datasource; - private GenericConnectionManager _connectionManager; + protected File _workRoot; - private TransactionManager _txm; - - private DataSource _datasource; - - private File _workRoot; - - private boolean _needDerbyShutdown; - - private String _derbyUrl; - - public Database(OdeConfigProperties props) { + public static Database create(OdeConfigProperties props) { if (props == null) throw new NullPointerException("Must provide a configuration."); + switch (props.getDbMode()) { + case EMBEDDED: + switch (props.getDbEmbeddedType()) { + case DERBY: return new DerbyEmbeddedDB(props); + case H2: return new H2EmbeddedDB(props); + } + case EXTERNAL: return new ExternalDB(props); + case INTERNAL: return new InternalDB(props); + default: throw new IllegalStateException(); + } + } + + public Database(OdeConfigProperties props) { _odeConfig = props; } @@ -93,9 +82,7 @@ public class Database { if (_started) return; - _needDerbyShutdown = false; _datasource = null; - _connectionManager = null; initDataSource(); _started = true; @@ -105,32 +92,6 @@ public class Database { if (!_started) return; - if (_connectionManager != null) - try { - __log.debug("Stopping connection manager"); - _connectionManager.doStop(); - } catch (Throwable t) { - __log.warn("Exception while stopping connection manager: " + t.getMessage()); - } finally { - _connectionManager = null; - } - - if (_needDerbyShutdown) { - __log.debug("shutting down derby."); - EmbeddedDriver driver = new EmbeddedDriver(); - try { - driver.connect(_derbyUrl + ";shutdown=true", new Properties()); - } catch (SQLException ex) { - // Shutdown will always return an exeption! - if (ex.getErrorCode() != 45000) - __log.error("Error shutting down Derby: " + ex.getErrorCode(), ex); - - } catch (Throwable ex) { - __log.debug("Error shutting down Derby.", ex); - } - } - - _needDerbyShutdown = false; _datasource = null; _started = false; } @@ -140,137 +101,7 @@ public class Database { return __logSql.isDebugEnabled() ? LoggingInterceptor.createLoggingDS(_datasource, __logSql) : _datasource; } - private void initDataSource() throws DatabaseConfigException { - switch (_odeConfig.getDbMode()) { - case EXTERNAL: - initExternalDb(); - break; - case EMBEDDED: - initEmbeddedDb(); - break; - case INTERNAL: - initInternalDb(); - break; - default: - break; - } - } - - private void initExternalDb() throws DatabaseConfigException { - try { - _datasource = (DataSource) lookupInJndi(_odeConfig.getDbDataSource()); - __log.info(__msgs.msgOdeUsingExternalDb(_odeConfig.getDbDataSource())); - } catch (Exception ex) { - String msg = __msgs.msgOdeInitExternalDbFailed(_odeConfig.getDbDataSource()); - __log.error(msg, ex); - throw new DatabaseConfigException(msg, ex); - } - } - - private void initInternalDb() throws DatabaseConfigException { - __log.info(__msgs.msgOdeUsingInternalDb(_odeConfig.getDbIntenralJdbcUrl(), _odeConfig.getDbInternalJdbcDriverClass())); - initInternalDb(_odeConfig.getDbIntenralJdbcUrl(), _odeConfig.getDbInternalJdbcDriverClass(), - _odeConfig.getDbInternalUserName(), _odeConfig.getDbInternalPassword()); - } - - private void initInternalDb(String url, String driverClass, String username,String password) throws DatabaseConfigException { - - __log.debug("Creating connection pool for " + url + " with driver " + driverClass); - if (!(_txm instanceof RecoverableTransactionManager)) { - throw new RuntimeException("TransactionManager is not recoverable."); - } - - TransactionSupport transactionSupport = LocalTransactions.INSTANCE; - ConnectionTracker connectionTracker = new ConnectionTrackingCoordinator(); - - PoolingSupport poolingSupport = new SinglePool( - _odeConfig.getPoolMaxSize(), - _odeConfig.getPoolMinSize(), - CONNECTION_MAX_WAIT_MILLIS, - CONNECTION_MAX_IDLE_MINUTES, - true, // match one - false, // match all - false); // select one assume match - - _connectionManager = new GenericConnectionManager( - transactionSupport, - poolingSupport, - null, - connectionTracker, - (RecoverableTransactionManager) _txm, - getClass().getName(), - getClass().getClassLoader()); - - - try { - javax.resource.spi.ManagedConnectionFactory mcf = null; - String mcfClass = _odeConfig.getDbInternalMCFClass(); - if (mcfClass != null) { - Properties dbInternalMCFProps = _odeConfig.getDbInternalMCFProperties(); - if (__log.isDebugEnabled()) { - __log.debug("Using internal DB MCF " + mcfClass + " " + dbInternalMCFProps); - } - mcf = (javax.resource.spi.ManagedConnectionFactory) Class.forName(mcfClass).newInstance(); - BeanUtils.copyProperties(mcf, dbInternalMCFProps); - } else { - if (__log.isDebugEnabled()) { - __log.debug("Using internal DB JDBCDriverMCF"); - } - JDBCDriverMCF mcf2 = new JDBCDriverMCF(); - mcf = mcf2; - mcf2.setDriver(driverClass); - mcf2.setConnectionURL(url); - if (username != null) { - mcf2.setUserName(username); - } - if (password != null) { - mcf2.setPassword(password); - } - } - _connectionManager.doStart(); - _datasource = (DataSource) mcf.createConnectionFactory(_connectionManager); - } catch (Exception ex) { - String errmsg = __msgs.msgOdeDbPoolStartupFailed(url); - __log.error(errmsg, ex); - throw new DatabaseConfigException(errmsg, ex); - } - } - - /** - * Initialize embedded (DERBY) database. - */ - private void initEmbeddedDb() throws DatabaseConfigException { - - String db = _odeConfig.getDbEmbeddedName(); - - String url = "jdbc:derby:" + _workRoot + "/" + db ; - __log.info("Using Embedded Derby: " + url); - _derbyUrl = url; - initInternalDb(url, org.apache.derby.jdbc.EmbeddedDriver.class.getName(),"sa",null); - _needDerbyShutdown = true; - } - - @SuppressWarnings("unchecked") - private <T> T lookupInJndi(String objName) throws Exception { - ClassLoader old = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); - try { - InitialContext ctx = null; - try { - ctx = new InitialContext(); - return (T) ctx.lookup(objName); - } finally { - if (ctx != null) - try { - ctx.close(); - } catch (Exception ex1) { - __log.error("Error closing JNDI connection.", ex1); - } - } - } finally { - Thread.currentThread().setContextClassLoader(old); - } - } + protected abstract void initDataSource() throws DatabaseConfigException; public BpelDAOConnectionFactoryJDBC createDaoCF() throws DatabaseConfigException { String pClassName = _odeConfig.getDAOConnectionFactory(); @@ -293,4 +124,4 @@ public class Database { return cf; } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConnectionManager.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConnectionManager.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConnectionManager.java new file mode 100644 index 0000000..2ef9732 --- /dev/null +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConnectionManager.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.ode.il.dbutil; + + +import javax.sql.DataSource; +import javax.transaction.TransactionManager; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.geronimo.connector.outbound.GenericConnectionManager; +import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions; +import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport; +import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool; +import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport; +import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; +import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTrackingCoordinator; +import org.apache.geronimo.transaction.manager.RecoverableTransactionManager; +import org.apache.ode.il.config.OdeConfigProperties; +import org.tranql.connector.jdbc.JDBCDriverMCF; + +public class DatabaseConnectionManager { + + private static final long serialVersionUID = 1L; + private static final Log __log = LogFactory.getLog(DatabaseConnectionManager.class); + private static final Messages __msgs = Messages.getMessages(Messages.class); + private static final int CONNECTION_MAX_WAIT_MILLIS = 30000; + private static final int CONNECTION_MAX_IDLE_MINUTES = 5; + private GenericConnectionManager _connectionManager; + private TransactionManager _txm = null; + private String _url = null; + private OdeConfigProperties _odeConfig = null; + private DataSource _dataSource = null; + + public DatabaseConnectionManager(TransactionManager txm, OdeConfigProperties odeConfig) { + _txm = txm; + _odeConfig = odeConfig; + } + + public void init(String url, String driverClass, String username, String password) throws DatabaseConfigException { + __log.debug("Creating connection pool for " + url + " with driver " + driverClass); + + if (!(_txm instanceof RecoverableTransactionManager)) { + throw new RuntimeException("TransactionManager is not recoverable."); + } + + _url = url; + TransactionSupport transactionSupport = LocalTransactions.INSTANCE; + ConnectionTracker connectionTracker = new ConnectionTrackingCoordinator(); + + PoolingSupport poolingSupport = new SinglePool( + _odeConfig.getPoolMaxSize(), + _odeConfig.getPoolMinSize(), + CONNECTION_MAX_WAIT_MILLIS, + CONNECTION_MAX_IDLE_MINUTES, + true, // match one + false, // match all + false); // select one assume match + + _connectionManager = new GenericConnectionManager( + transactionSupport, + poolingSupport, + null, + connectionTracker, + (RecoverableTransactionManager) _txm, + getClass().getName(), + getClass().getClassLoader()); + + JDBCDriverMCF mcf = new JDBCDriverMCF(); + try { + mcf.setDriver(driverClass); + mcf.setConnectionURL(url); + if (username != null) { + mcf.setUserName(username); + } + if (password != null) { + mcf.setPassword(password); + } + _connectionManager.doStart(); + _dataSource = (DataSource) mcf.createConnectionFactory(_connectionManager); + } catch (Exception ex) { + String errmsg = __msgs.msgOdeDbPoolStartupFailed(url); + __log.error(errmsg, ex); + throw new DatabaseConfigException(errmsg, ex); + } + } + + public void shutdown() throws DatabaseConfigException { + try { + _connectionManager.doStop(); + } catch (Exception ex) { + String errmsg = __msgs.msgOdeDbPoolStartupFailed(_url); + __log.error(errmsg, ex); + throw new DatabaseConfigException(errmsg, ex); + } + } + + public DataSource getDataSource() { + return _dataSource; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DerbyEmbeddedDB.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DerbyEmbeddedDB.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DerbyEmbeddedDB.java new file mode 100644 index 0000000..52d367a --- /dev/null +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DerbyEmbeddedDB.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ode.il.dbutil; + +import java.io.File; +import java.sql.DriverManager; +import java.sql.SQLException; + +import org.apache.derby.impl.io.VFMemoryStorageFactory; +import org.apache.derby.jdbc.EmbeddedDataSource; +import org.apache.ode.il.config.OdeConfigProperties; + +public class DerbyEmbeddedDB extends InternalDB { + + private String _dbUrl = null; + private String _dbName = null; + + public DerbyEmbeddedDB(OdeConfigProperties props) { + super(props); + } + + /** + * Initialize embedded (DERBY) database. + */ + @Override + protected void initDataSource() throws DatabaseConfigException { + _dbName = _odeConfig.getDbEmbeddedName(); + if (_workRoot == null) { + _dbUrl = "jdbc:derby:memory:" + _dbName + ";create=true"; + try { + DriverManager.getConnection(_dbUrl).close(); + } catch (SQLException se) { + __log.error(se); + } + EmbeddedDataSource dds = new EmbeddedDataSource(); + dds.setDatabaseName("memory:" + _dbName); + dds.setUser("sa"); + dds.setCreateDatabase("true"); + _datasource = dds; + } else { + _dbUrl = "jdbc:derby:" + _workRoot + File.separator + _dbName; + if (_odeConfig.isDbEmbeddedCreate()) { + _dbUrl += ";create=true"; + } + String clazz = org.apache.derby.jdbc.EmbeddedDriver.class.getName(); + _connectionManager = new DatabaseConnectionManager(_txm, _odeConfig); + try { + _connectionManager.init(_dbUrl, clazz, "sa", null); + } catch (DatabaseConfigException ex) { + __log.error("Unable to initialize connection pool", ex); + } + _datasource = _connectionManager.getDataSource(); + __log.debug("Using Embedded Database: " + _dbUrl); + } + } + + public void shutdownDB() { + if (_connectionManager != null) { + try { + _connectionManager.shutdown(); + } catch (DatabaseConfigException ex) { + __log.error("unable to shutdown connection pool", ex); + } + } + try { + DriverManager.getConnection(_dbUrl + ";shutdown=true").close(); + } catch (SQLException ex) { + // Shutdown will always return an exeption! + if (ex.getErrorCode() != 45000) { + __log.error("Error shutting down Derby: " + ex.getErrorCode(), ex); + } + } catch (Throwable ex) { + __log.debug("Error shutting down Derby.", ex); + } + if (_workRoot == null) { + try { + //Don't worry about File IO, this is only virtual + VFMemoryStorageFactory.purgeDatabase(new File(_dbName).getCanonicalPath()); + } catch (Exception e) { + __log.debug("Error shutting down Derby.", e); + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/ExternalDB.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/ExternalDB.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/ExternalDB.java new file mode 100644 index 0000000..0fa8dd3 --- /dev/null +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/ExternalDB.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ode.il.dbutil; + +import javax.naming.InitialContext; +import javax.sql.DataSource; + +import org.apache.ode.il.config.OdeConfigProperties; + +public class ExternalDB extends Database { + + public ExternalDB(OdeConfigProperties props) { + super(props); + } + + @Override + protected void initDataSource() throws DatabaseConfigException { + try { + _datasource = (DataSource) lookupInJndi(_odeConfig.getDbDataSource()); + __log.info(__msgs.msgOdeUsingExternalDb(_odeConfig.getDbDataSource())); + } catch (Exception ex) { + String msg = __msgs.msgOdeInitExternalDbFailed(_odeConfig.getDbDataSource()); + __log.error(msg, ex); + throw new DatabaseConfigException(msg, ex); + } + } + + @SuppressWarnings("unchecked") + private <T> T lookupInJndi(String objName) throws Exception { + ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + InitialContext ctx = null; + try { + ctx = new InitialContext(); + return (T) ctx.lookup(objName); + } finally { + if (ctx != null) + try { + ctx.close(); + } catch (Exception ex1) { + __log.error("Error closing JNDI connection.", ex1); + } + } + } finally { + Thread.currentThread().setContextClassLoader(old); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/H2EmbeddedDB.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/H2EmbeddedDB.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/H2EmbeddedDB.java new file mode 100644 index 0000000..6e08b62 --- /dev/null +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/H2EmbeddedDB.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ode.il.dbutil; + +import java.io.File; +import java.sql.Connection; + +import org.apache.ode.il.config.OdeConfigProperties; +import org.h2.jdbcx.JdbcDataSource; + +public class H2EmbeddedDB extends InternalDB { + + private String _dbUrl = null; + private String _dbName = null; + + public H2EmbeddedDB(OdeConfigProperties props) { + super(props); + } + + /** + * Initialize embedded (DERBY) database. + */ + @Override + protected void initDataSource() throws DatabaseConfigException { + String db = _odeConfig.getDbEmbeddedName(); + if (_workRoot == null) { + _dbUrl = "jdbc:h2:mem:" + db + ";DB_CLOSE_DELAY=-1"; + JdbcDataSource hds = new JdbcDataSource(); + hds.setURL(_dbUrl); + hds.setUser("sa"); + _datasource = hds; + } else { + _dbUrl = "jdbc:h2:" + _workRoot + File.separator + db +";DB_CLOSE_ON_EXIT=FALSE"; + if (!_odeConfig.isDbEmbeddedCreate()) { + _dbUrl += ";IFEXISTS=TRUE"; + } + String clazz = org.h2.Driver.class.getName(); + _connectionManager = new DatabaseConnectionManager(_txm, _odeConfig); + try { + _connectionManager.init(_dbUrl, clazz, "sa", null); + } catch (DatabaseConfigException ex) { + __log.error("Unable to initialize connection pool", ex); + } + _datasource = _connectionManager.getDataSource(); + } + __log.debug("Using Embedded Database: " + _dbUrl); + } + + public void shutdownDB() { + if (_connectionManager != null) { + try { + _connectionManager.shutdown(); + } catch (DatabaseConfigException ex) { + __log.error("unable to shutdown connection pool", ex); + } + } + try { + Connection conn = getDataSource().getConnection(); + conn.createStatement().execute("SHUTDOWN"); + } catch (Throwable ex) { + __log.debug("Error shutting down H2.", ex); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-epr/src/main/java/org/apache/ode/il/dbutil/InternalDB.java ---------------------------------------------------------------------- diff --git a/bpel-epr/src/main/java/org/apache/ode/il/dbutil/InternalDB.java b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/InternalDB.java new file mode 100644 index 0000000..3c8deaf --- /dev/null +++ b/bpel-epr/src/main/java/org/apache/ode/il/dbutil/InternalDB.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ode.il.dbutil; + +import org.apache.ode.il.config.OdeConfigProperties; + +public class InternalDB extends Database { + protected static final int CONNECTION_MAX_WAIT_MILLIS = 30000; + protected static final int CONNECTION_MAX_IDLE_MINUTES = 5; + + protected DatabaseConnectionManager _connectionManager; + + public InternalDB(OdeConfigProperties props) { + super(props); + } + + @Override + public synchronized void start() throws DatabaseConfigException { + if (_started) + return; + + _datasource = null; + _connectionManager = null; + + initDataSource(); + _started = true; + } + + @Override + public synchronized void shutdown() { + if (!_started) + return; + + if (_connectionManager != null) { + try { + __log.debug("Stopping connection manager"); + _connectionManager.shutdown(); + } catch (Throwable t) { + __log.warn("Exception while stopping connection manager: " + t.getMessage()); + } finally { + _connectionManager = null; + } + } + + shutdownDB(); + + _datasource = null; + _started = false; + } + + protected void shutdownDB() {} + + protected void initDataSource() throws DatabaseConfigException { + __log.info(__msgs.msgOdeUsingInternalDb(_odeConfig.getDbIntenralJdbcUrl(), _odeConfig.getDbInternalJdbcDriverClass())); + initInternalDb(_odeConfig.getDbIntenralJdbcUrl(), _odeConfig.getDbInternalJdbcDriverClass(), + _odeConfig.getDbInternalUserName(), _odeConfig.getDbInternalPassword()); + } + + protected void initInternalDb(String url, String driverClass, String username,String password) throws DatabaseConfigException { + _connectionManager = new DatabaseConnectionManager(_txm,_odeConfig); + _connectionManager.init(url, driverClass, username, password); + _datasource = _connectionManager.getDataSource(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/cron/CronSchedulerTest.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/cron/CronSchedulerTest.java b/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/cron/CronSchedulerTest.java index b848a9f..dfa5407 100644 --- a/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/cron/CronSchedulerTest.java +++ b/bpel-runtime/src/test/java/org/apache/ode/bpel/engine/cron/CronSchedulerTest.java @@ -45,13 +45,13 @@ public class CronSchedulerTest extends TestCase { private CronScheduler cronScheduler; private ExecutorService execService; - static { + /* static { BasicConfigurator.configure(); LogManager.getRootLogger().setLevel(Level.DEBUG); LogManager.getLogger(RuntimeDataCleanupRunnable.class).setLevel(Level.DEBUG); LogManager.getLogger(BpelDAOConnectionImpl.class).setLevel(Level.DEBUG); LogManager.getLogger("org.apache.ode").setLevel(Level.DEBUG); - } + }*/ protected void setUp() throws Exception { contexts = new Contexts(); http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java b/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java index aa6195a..572512b 100644 --- a/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java +++ b/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java @@ -18,15 +18,23 @@ */ package org.apache.ode.bpel.runtime; +import java.io.File; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import javax.sql.DataSource; +import javax.transaction.TransactionManager; +import javax.wsdl.PortType; +import javax.xml.namespace.QName; -import org.apache.geronimo.connector.outbound.GenericConnectionManager; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.LocalTransactions; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool; -import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport; -import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; -import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTrackingCoordinator; -import org.apache.geronimo.transaction.manager.RecoverableTransactionManager; import org.apache.ode.bpel.dao.BpelDAOConnectionFactory; import org.apache.ode.bpel.engine.BpelServerImpl; import org.apache.ode.bpel.iapi.BindingContext; @@ -48,27 +56,9 @@ import org.apache.ode.il.dbutil.Database; import org.apache.ode.store.ProcessStoreImpl; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.GUID; -import org.tranql.connector.derby.EmbeddedLocalMCF; import org.w3c.dom.Document; import org.w3c.dom.Element; -import javax.resource.spi.ConnectionManager; -import javax.sql.DataSource; -import javax.transaction.TransactionManager; -import javax.wsdl.PortType; -import javax.xml.namespace.QName; -import java.io.File; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Collections; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - class MockBpelServer { @@ -83,13 +73,14 @@ class MockBpelServer { MessageExchangeContext _mexContext; BindingContext _bindContext; HashMap<String, QName> _activated = new HashMap<String, QName>(); - - HashMap<String,EndpointReference> _endpoints = new HashMap<String,EndpointReference>(); + @SuppressWarnings("unchecked") + HashMap _endpoints = new HashMap(); public MockBpelServer() { try { _server = new BpelServerImpl(); createTransactionManager(); + org.springframework.mock.jndi.SimpleNamingContextBuilder.emptyActivatedContextBuilder().bind("java:comp/UserTransaction", _txManager); createDataSource(); createScheduler(); createDAOConnection(); @@ -111,6 +102,7 @@ class MockBpelServer { _server.start(); } catch (Exception except) { System.err.println(except.getMessage()); + except.printStackTrace(System.err); throw new RuntimeException(except); } } @@ -167,6 +159,7 @@ class MockBpelServer { _server.stop(); _scheduler.stop(); _scheduler.shutdown(); + _database.shutdown(); } protected TransactionManager createTransactionManager() throws Exception { @@ -177,45 +170,14 @@ class MockBpelServer { } protected DataSource createDataSource() throws Exception { - TransactionSupport transactionSupport = LocalTransactions.INSTANCE; - ConnectionTracker connectionTracker = new ConnectionTrackingCoordinator(); - - PoolingSupport poolingSupport = new SinglePool( - 10, - 0, - 1000, - 1, - true, - false, - false); - - ConnectionManager connectionManager = new GenericConnectionManager( - transactionSupport, - poolingSupport, - null, - connectionTracker, - (RecoverableTransactionManager) _txManager, - getClass().getName(), - getClass().getClassLoader()); - - - EmbeddedLocalMCF mcf = new org.tranql.connector.derby.EmbeddedLocalMCF(); - mcf.setCreateDatabase(true); - mcf.setDatabaseName("target/testdb"); - mcf.setUserName("sa"); - mcf.setPassword(""); - _dataSource = (DataSource) mcf.createConnectionFactory(connectionManager); - return _dataSource; - - -// d = org.tranql.connector.jdbc.JDBCDriverMCF(); -// EmbeddedXADataSource ds = new EmbeddedXADataSource(); -// ds.setCreateDatabase("create"); -// ds.setDatabaseName("target/testdb"); -// ds.setUser("sa"); -// ds.setPassword(""); -// _dataSource = ds; -// return _dataSource; + Properties props = new Properties(); + props.setProperty(OdeConfigProperties.PROP_DAOCF, System.getProperty(OdeConfigProperties.PROP_DAOCF, OdeConfigProperties.DEFAULT_DAOCF_CLASS)); + OdeConfigProperties odeProps = new OdeConfigProperties(props,""); + _database = Database.create(odeProps); + _database.setTransactionManager(_txManager); + _database.start(); + _dataSource = _database.getDataSource(); + return _dataSource; } protected Scheduler createScheduler() throws Exception { @@ -235,7 +197,7 @@ class MockBpelServer { if (_dataSource == null) throw new RuntimeException("No data source"); -// +// // BpelDAOConnectionFactoryJDBC daoCF = new BPELDAOConnectionFactoryImpl(); // daoCF.setDataSource(_dataSource); // daoCF.setTransactionManager(_txManager); @@ -367,9 +329,9 @@ class MockBpelServer { public <T> T execTransaction(Callable<T> transaction) throws Exception, ContextException { return _scheduler.execTransaction(transaction, 0); } - + public <T> T execTransaction(Callable<T> transaction, int timeout) throws Exception, ContextException { - return _scheduler.execTransaction(transaction, timeout); + return _scheduler.execTransaction(transaction, timeout); } public void beginTransaction() throws Exception { @@ -399,7 +361,6 @@ class MockBpelServer { public void start() { _scheduler.start(); } public void stop() { _scheduler.stop(); } public void shutdown() { _scheduler.shutdown(); } - public void acquireTransactionLocks() { _scheduler.acquireTransactionLocks(); } public void registerSynchronizer(Synchronizer synch) throws ContextException { _scheduler.registerSynchronizer(synch); @@ -413,8 +374,14 @@ class MockBpelServer { public void setPolledRunnableProcesser(JobProcessor delegatedRunnableProcessor) { } - public boolean amICoordinator() { - return true; - } + public boolean amICoordinator() { + return true; + } + + + public void acquireTransactionLocks() { + // TODO Auto-generated method stub + + } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java index a0cbc22..156a727 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java +++ b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java @@ -109,6 +109,7 @@ public class ProcessStoreImpl implements ProcessStore { } public ProcessStoreImpl(EndpointReferenceContext eprContext, DataSource ds, String persistenceType, OdeConfigProperties props, boolean createDatamodel) { + __log.debug("ds:"+ds+" persistenceType:"+persistenceType+" createDatamodel:"+createDatamodel); this.eprContext = eprContext; this.generateProcessEventsAll = props.getProperty("generateProcessEvents", "all").equals("all"); if (ds != null) { http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-store/src/main/java/org/apache/ode/store/hib/DbConfStoreConnectionFactory.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/hib/DbConfStoreConnectionFactory.java b/bpel-store/src/main/java/org/apache/ode/store/hib/DbConfStoreConnectionFactory.java index 624f5ee..2c39f1b 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/hib/DbConfStoreConnectionFactory.java +++ b/bpel-store/src/main/java/org/apache/ode/store/hib/DbConfStoreConnectionFactory.java @@ -19,9 +19,7 @@ package org.apache.ode.store.hib; import java.sql.Connection; -import java.sql.DatabaseMetaData; import java.sql.SQLException; -import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; @@ -31,7 +29,6 @@ import javax.transaction.TransactionManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.ode.bpel.iapi.BpelEngineException; import org.apache.ode.daohib.HibernateTransactionManagerLookup; import org.apache.ode.daohib.SessionManager; import org.apache.ode.store.ConfStoreConnectionFactory; @@ -44,70 +41,39 @@ import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.connection.ConnectionProvider; -import org.hibernate.dialect.Dialect; -import org.hibernate.dialect.DialectFactory; public class DbConfStoreConnectionFactory implements ConfStoreConnectionFactory { private static final Log __log = LogFactory.getLog(DbConfStoreConnectionFactory.class); private static final Messages __msgs = MessageBundle.getMessages(Messages.class); - private static final String DEFAULT_HIBERNATE_DIALECT = "org.hibernate.dialect.DerbyDialect"; - - private static final HashMap<String, DialectFactory.VersionInsensitiveMapper> HIBERNATE_DIALECTS = new HashMap<String, DialectFactory.VersionInsensitiveMapper>(); - private static final String _guid = new GUID().toString(); private static final Map<String, DataSource> _dataSources = new ConcurrentHashMap<String, DataSource>(); - static { - // Hibernate has a nice table that resolves the dialect from the database - // product name, - // but doesn't include all the drivers. So this is supplementary, and some - // day in the - // future they'll add more drivers and we can get rid of this. - // Drivers already recognized by Hibernate: - // HSQL Database Engine - // DB2/NT - // MySQL - // PostgreSQL - // Microsoft SQL Server Database, Microsoft SQL Server - // Sybase SQL Server - // Informix Dynamic Server - // Oracle 8 and Oracle >8 - HIBERNATE_DIALECTS.put("Apache Derby", new DialectFactory.VersionInsensitiveMapper(DEFAULT_HIBERNATE_DIALECT)); - HIBERNATE_DIALECTS.put("H2", new DialectFactory.VersionInsensitiveMapper("org.hibernate.dialect.H2Dialect")); - } - private TransactionManager _txMgr; + private final DataSource _ds; + final SessionFactory _sessionFactory; public DbConfStoreConnectionFactory(DataSource ds, Properties initialProps, boolean createDatamodel, String txFactoryClassName) { + _ds = ds; + // Don't want to pollute original properties Properties properties = new Properties(); for (Object prop : initialProps.keySet()) { properties.put(prop, initialProps.get(prop)); } - __log.debug("using data source: " + ds); - _dataSources.put(_guid, ds); - - if (properties.get(Environment.DIALECT) == null) { - try { - properties.put(Environment.DIALECT, guessDialect(ds)); - } catch (Exception ex) { - String errmsg = __msgs.msgOdeInitHibernateDialectDetectFailed(); - __log.error(errmsg, ex); - throw new BpelEngineException(errmsg, ex); - } - } + __log.debug("using data source: " + _ds); + _dataSources.put(_guid, _ds); if (createDatamodel) { properties.put(Environment.HBM2DDL_AUTO, "create-drop"); } - + // Note that we don't allow the following properties to be overriden by the client. if (properties.containsKey(Environment.CONNECTION_PROVIDER)) __log.warn("Ignoring user-specified Hibernate property: " + Environment.CONNECTION_PROVIDER); @@ -134,76 +100,42 @@ public class DbConfStoreConnectionFactory implements ConfStoreConnectionFactory return new ConfStoreConnectionHib(_sessionFactory.getCurrentSession()); } - private void initTxMgr(String txFactoryClassName) { - __log.info("ProcessStore initializing transaction manager using " + txFactoryClassName); - try { - Class<?> txFactClass = getClass().getClassLoader().loadClass(txFactoryClassName); - Object txFact = txFactClass.newInstance(); - _txMgr = (TransactionManager) txFactClass.getMethod("getTransactionManager", (Class[]) null).invoke(txFact); - } catch (Exception e) { - __log.fatal("Couldn't initialize a transaction manager with factory: " + txFactoryClassName, e); - throw new RuntimeException("Couldn't initialize a transaction manager with factory: " + txFactoryClassName, e); - } - } - - private String guessDialect(DataSource dataSource) throws Exception { - - String dialect = null; - // Open a connection and use that connection to figure out database - // product name/version number in order to decide which Hibernate - // dialect to use. - Connection conn = dataSource.getConnection(); + @SuppressWarnings("unchecked") + private void initTxMgr(String txFactoryClassName) { + __log.info("ProcessStore initializing transaction manager using " + txFactoryClassName); try { - DatabaseMetaData metaData = conn.getMetaData(); - if (metaData != null) { - String dbProductName = metaData.getDatabaseProductName(); - int dbMajorVer = metaData.getDatabaseMajorVersion(); - __log.info("Using database " + dbProductName + " major version " + dbMajorVer); - DialectFactory.DatabaseDialectMapper mapper = HIBERNATE_DIALECTS.get(dbProductName); - if (mapper != null) { - dialect = mapper.getDialectClass(dbMajorVer); - } else { - Dialect hbDialect = DialectFactory.determineDialect(dbProductName, dbMajorVer); - if (hbDialect != null) - dialect = hbDialect.getClass().getName(); - } - } - } finally { - conn.close(); + Class<?> txFactClass = getClass().getClassLoader().loadClass(txFactoryClassName); + Object txFact = txFactClass.newInstance(); + _txMgr = (TransactionManager) txFactClass.getMethod("getTransactionManager", (Class[]) null).invoke(txFact); + } catch (Exception e) { + __log.fatal("Couldn't initialize a transaction manager with factory: " + txFactoryClassName, e); + throw new RuntimeException("Couldn't initialize a transaction manager with factory: " + txFactoryClassName, e); } + } - if (dialect == null) { - __log.info("Cannot determine hibernate dialect for this database: using the default one."); - dialect = DEFAULT_HIBERNATE_DIALECT; + public void beginTransaction() { + try { + _txMgr.begin(); + } catch (Exception e) { + throw new RuntimeException(e); } + } - return dialect; - + public void commitTransaction() { + try { + _txMgr.commit(); + } catch (Exception e) { + throw new RuntimeException(e); + } } - public void beginTransaction() { - try { - _txMgr.begin(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void commitTransaction() { - try { - _txMgr.commit(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void rollbackTransaction() { - try { - _txMgr.rollback(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } + public void rollbackTransaction() { + try { + _txMgr.rollback(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } static Configuration getDefaultConfiguration() throws MappingException { return new Configuration().addClass(ProcessConfDaoImpl.class).addClass(DeploymentUnitDaoImpl.class) @@ -217,7 +149,7 @@ public class DbConfStoreConnectionFactory implements ConfStoreConnectionFactory } public void configure(Properties props) throws HibernateException { - _guid = props.getProperty(SessionManager.PROP_GUID); + _guid = props.getProperty(SessionManager.PROP_GUID); } public Connection getConnection() throws SQLException { @@ -236,4 +168,4 @@ public class DbConfStoreConnectionFactory implements ConfStoreConnectionFactory } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ode/blob/28085edc/bpel-store/src/test/java/org/apache/ode/store/hib/DaoTest.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/test/java/org/apache/ode/store/hib/DaoTest.java b/bpel-store/src/test/java/org/apache/ode/store/hib/DaoTest.java index 5dfe899..92a13ca 100644 --- a/bpel-store/src/test/java/org/apache/ode/store/hib/DaoTest.java +++ b/bpel-store/src/test/java/org/apache/ode/store/hib/DaoTest.java @@ -18,32 +18,56 @@ */ package org.apache.ode.store.hib; +import java.util.Properties; + +import javax.sql.DataSource; +import javax.transaction.TransactionManager; +import javax.xml.namespace.QName; + import junit.framework.TestCase; +import org.apache.ode.bpel.dao.BpelDAOConnection; +import org.apache.ode.il.EmbeddedGeronimoFactory; import org.apache.ode.il.config.OdeConfigProperties; +import org.apache.ode.il.dbutil.Database; +import org.apache.ode.il.dbutil.DatabaseConfigException; import org.apache.ode.store.ConfStoreConnection; import org.apache.ode.store.ConfStoreConnectionFactory; import org.apache.ode.store.DeploymentUnitDAO; import org.apache.ode.store.ProcessConfDAO; -import org.apache.ode.utils.GUID; -import org.h2.jdbcx.JdbcDataSource; -import java.util.Properties; -import javax.xml.namespace.QName; public class DaoTest extends TestCase { - JdbcDataSource h2; - + protected BpelDAOConnection daoConn; + protected TransactionManager txm; + private DataSource ds; + private Database db; ConfStoreConnectionFactory cf; + protected DataSource getDataSource() throws DatabaseConfigException { + if (ds == null) { + Properties props = new Properties(); + props.setProperty(OdeConfigProperties.PROP_DAOCF, System.getProperty(OdeConfigProperties.PROP_DAOCF, OdeConfigProperties.DEFAULT_DAOCF_CLASS)); + OdeConfigProperties odeProps = new OdeConfigProperties(props,""); + db = Database.create(odeProps); + db.setTransactionManager(txm); + db.start(); + this.ds = db.getDataSource(); + } + return ds; + } + public void setUp() throws Exception { - h2 = new JdbcDataSource(); - h2.setURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); - h2.setUser("sa"); - cf = new DbConfStoreConnectionFactory(h2, new Properties(), true, OdeConfigProperties.DEFAULT_TX_FACTORY_CLASS_NAME); + EmbeddedGeronimoFactory factory = new EmbeddedGeronimoFactory(); + txm = factory.getTransactionManager(); + ds = getDataSource(); + org.springframework.mock.jndi.SimpleNamingContextBuilder.emptyActivatedContextBuilder().bind("java:comp/UserTransaction", txm); + txm.begin(); + + cf = new DbConfStoreConnectionFactory(ds, new Properties(), true, OdeConfigProperties.DEFAULT_TX_FACTORY_CLASS_NAME); } public void tearDown() throws Exception { - h2.getConnection().createStatement().execute("SHUTDOWN"); + db.shutdown(); } public void testEmpty() { @@ -99,7 +123,7 @@ public class DaoTest extends TestCase { cf.commitTransaction(); } } - + public void testGetDeploymentUnits() { cf.beginTransaction(); ConfStoreConnection conn = cf.getConnection(); @@ -124,7 +148,7 @@ public class DaoTest extends TestCase { cf.commitTransaction(); } } - + public void testCreateProcess() { QName foobar = new QName("foo","bar"); cf.beginTransaction(); @@ -139,7 +163,7 @@ public class DaoTest extends TestCase { } finally { cf.commitTransaction(); } - + cf.beginTransaction(); conn = cf.getConnection(); try { @@ -147,14 +171,14 @@ public class DaoTest extends TestCase { ProcessConfDAO p = du.getProcess(foobar); assertNotNull(p); assertNotNull(du.getProcesses()); - + assertEquals(foobar,p.getPID()); assertEquals(foobar,p.getType()); } finally { cf.commitTransaction(); } } - + public void testProcessProperties() { QName foobar = new QName("foo","bar"); cf.beginTransaction(); @@ -166,7 +190,7 @@ public class DaoTest extends TestCase { } finally { cf.commitTransaction(); } - + cf.beginTransaction(); conn = cf.getConnection(); try { @@ -179,5 +203,5 @@ public class DaoTest extends TestCase { } finally { cf.commitTransaction(); } - } + } } \ No newline at end of file
