Author: mszefler Date: Fri Feb 16 09:43:00 2007 New Revision: 508519 URL: http://svn.apache.org/viewvc?view=rev&rev=508519 Log: Moved common configuration, database setup fromAXIS2/JBI into this module.
Added: incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConfigException.java incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Messages.java Added: incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java?view=auto&rev=508519 ============================================================================== --- incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java (added) +++ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java Fri Feb 16 09:43:00 2007 @@ -0,0 +1,222 @@ +/* + * 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.config; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Configuration object used for configuring the intergration layer. The propereties are those likely to be common to all layers. + * + * @author mszefler + */ +public class OdeConfigProperties { + + private static final long serialVersionUID = 1L; + + private static final Log __log = LogFactory.getLog(OdeConfigProperties.class); + + private static final String PROP_DB_MODE = "db.mode"; + + private static final String PROP_DB_EXTERNAL_DS = "db.ext.dataSource"; + + private static final String PROP_DB_EMBEDDED_NAME = "db.emb.name"; + + private static final String PROP_DB_INTERNAL_URL = "db.int.jdbcurl"; + + private static final String PROP_DB_INTERNAL_DRIVER = "db.int.driver"; + + private static final String PROP_DB_LOGGING = "db.logging"; + + private static final String PROP_DB_DAO = "db.dao"; + + private static final String PROP_TX_FACTORY_CLASS = "tx.factory.class"; + + private static final String PROP_POOL_MAX = "db.pool.max"; + + private static final String PROP_POOL_MIN = "db.pool.min"; + + private static final String PROP_CONNECTOR_PORT = "jca.port"; + + private static final String PROP_CONNECTOR_NAME = "jca.name"; + + private static final String PROP_WORKING_DIR = "working.dir"; + + private static final String PROP_REPLICATE_EMPTYNS = "message.replicate.emptyns"; + + private static final String PROP_EVENT_LISTENERS = "event.listeners"; + + private static final String PROP_PROCESS_DEHYDRATION = "process.dehydration"; + + private File _cfgFile; + + private String _prefix; + + private Properties _props; + + /** + * Possible database modes. + */ + public enum DatabaseMode { + /** External data-source (managed by app server) */ + EXTERNAL, + + /** Internal data-source (managed by us--Minerva) */ + INTERNAL, + + /** Embedded database (managed by us--Minerva) */ + EMBEDDED + } + + public enum DaoType { + JPA, HIBERNATE + } + + public OdeConfigProperties(File cfgFile, String prefix) { + _cfgFile = cfgFile; + _prefix = prefix; + _props = new Properties(); + } + + public File getFile() { + return _cfgFile; + } + + public void load() throws IOException { + if (_cfgFile.exists()) { + __log.debug("config file exists: " + _cfgFile); + FileInputStream fis = null; + try { + fis = new FileInputStream(_cfgFile); + _props.load(fis); + } finally { + if (fis != null) + try { + fis.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } else { + __log.debug("config file does not exists: " + _cfgFile); + throw new FileNotFoundException("" + _cfgFile); + } + } + + /** + * Should the internal database be used, or are the datasources provided? + * + * @return db mode + */ + public DatabaseMode getDbMode() { + return DatabaseMode.valueOf(getProperty(OdeConfigProperties.PROP_DB_MODE, DatabaseMode.EMBEDDED.toString()).trim() + .toUpperCase()); + } + + public String getDbDataSource() { + return getProperty(OdeConfigProperties.PROP_DB_EXTERNAL_DS, "java:comp/env/jdbc/ode-ds"); + } + + public String getDbEmbeddedName() { + return getProperty(OdeConfigProperties.PROP_DB_EMBEDDED_NAME, "data"); + } + + public String getDbIntenralJdbcUrl() { + return getProperty(OdeConfigProperties.PROP_DB_INTERNAL_URL, "jdbc:derby://localhost/ode"); + } + + /** + * JDBC driver class (for use in INTERNAL mode). + * + * @return + */ + public String getDbInternalJdbcDriverClass() { + return getProperty(OdeConfigProperties.PROP_DB_INTERNAL_DRIVER, "org.apache.derby.jdbc.ClientDriver"); + } + + public int getPoolMaxSize() { + return Integer.valueOf(getProperty(OdeConfigProperties.PROP_POOL_MAX, "10")); + } + + public int getPoolMinSize() { + return Integer.valueOf(getProperty(OdeConfigProperties.PROP_POOL_MIN, "1")); + } + + public int getConnectorPort() { + return Integer.valueOf(getProperty(OdeConfigProperties.PROP_CONNECTOR_PORT, "2099")); + } + + public String getConnectorName() { + return getProperty(OdeConfigProperties.PROP_CONNECTOR_NAME, "ode"); + } + + public String getWorkingDir() { + return getProperty(OdeConfigProperties.PROP_WORKING_DIR); + } + + public String getTxFactoryClass() { + return getProperty(OdeConfigProperties.PROP_TX_FACTORY_CLASS, "org.apache.ode.axis2.util.JotmFactory"); + } + + public boolean isReplicateEmptyNS() { + return Boolean.valueOf(getProperty(OdeConfigProperties.PROP_REPLICATE_EMPTYNS, "true")); + } + + public String getEventListeners() { + return getProperty(PROP_EVENT_LISTENERS); + } + + public boolean isDehydrationEnabled() { + return Boolean.valueOf(getProperty(OdeConfigProperties.PROP_PROCESS_DEHYDRATION, "false")); + } + + public boolean isDbLoggingEnabled() { + return Boolean.valueOf(getProperty(OdeConfigProperties.PROP_DB_LOGGING, "false")); + } + + public DaoType getDbDaoImpl() { + try { + String persistenceType = System.getProperty("ode.persistence"); + if (persistenceType != null) { + return DaoType.valueOf(persistenceType.toUpperCase()); + } + } catch (Throwable t) { + __log.debug("error reading system property override for DAO type.", t); + // fall through, and use the default mechanism + } + + return DaoType.valueOf(_props.getProperty(PROP_DB_DAO, DaoType.JPA.toString())); + } + + protected String getProperty(String pname) { + return _props.getProperty(_prefix + pname); + } + + protected String getProperty(String key, String dflt) { + return _props.getProperty(_prefix + key, dflt); + } + +} Added: incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java?view=auto&rev=508519 ============================================================================== --- incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java (added) +++ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Database.java Fri Feb 16 09:43:00 2007 @@ -0,0 +1,221 @@ +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.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.derby.jdbc.EmbeddedDriver; +import org.apache.ode.il.config.OdeConfigProperties; +import org.apache.ode.utils.LoggingDataSourceWrapper; +import org.opentools.minerva.MinervaPool; + +/** + * Does the dirty work of setting up / obtaining a DataSource based on the configuration in the [EMAIL PROTECTED] OdeConfigProperties} object. + * + * @author mszefler + * + */ +public class Database { + private static final Log __log = LogFactory.getLog(Database.class); + + private static final Log __logSql = LogFactory.getLog("org.apache.ode.sql"); + + private static final Messages __msgs = Messages.getMessages(Messages.class); + + private OdeConfigProperties _odeConfig; + + private boolean _started; + + private MinervaPool _minervaPool; + + private TransactionManager _txm; + + private DataSource _datasource; + + private File _workRoot; + + private boolean _needDerbyShutdown; + + private String _derbyUrl; + + public Database(OdeConfigProperties props) { + if (props == null) + throw new NullPointerException("Must provide a configuration."); + + _odeConfig = props; + } + + public void setWorkRoot(File workRoot) { + _workRoot = workRoot; + } + + public void setTransactionManager(TransactionManager txm) { + _txm = txm; + } + + public synchronized void start() throws DatabaseConfigException { + if (_started) + return; + + _needDerbyShutdown = false; + _datasource = null; + _minervaPool = null; + + initDataSource(); + _started = true; + } + + public synchronized void shutdown() { + if (!_started) + return; + + if (_minervaPool != null) + try { + __log.debug("shutting down minerva pool."); + _minervaPool.stop(); + _minervaPool = null; + } catch (Throwable t) { + __log.debug("Exception in minervaPool.stop()"); + } finally { + _minervaPool = 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; + } + + public DataSource getDataSource() { + return __logSql.isDebugEnabled() ? new LoggingDataSourceWrapper(_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()); + + } + + private void initInternalDb(String url, String driverClass) throws DatabaseConfigException { + + __log.debug("Creating Minerva DataSource/Pool for " + url + " with driver " + driverClass); + + _minervaPool = new MinervaPool(); + _minervaPool.setTransactionManager(_txm); + _minervaPool.getConnectionFactory().setConnectionURL(url); + _minervaPool.getConnectionFactory().setUserName("sa"); + _minervaPool.getConnectionFactory().setDriver(driverClass); + + _minervaPool.getPoolParams().maxSize = _odeConfig.getPoolMaxSize(); + _minervaPool.getPoolParams().minSize = _odeConfig.getPoolMinSize(); + _minervaPool.getPoolParams().blocking = false; + _minervaPool.setType(MinervaPool.PoolType.MANAGED); + + try { + _minervaPool.start(); + } catch (Exception ex) { + String errmsg = __msgs.msgOdeDbPoolStartupFailed(url); + __log.error(errmsg, ex); + throw new DatabaseConfigException(errmsg, ex); + } + + _datasource = _minervaPool.createDataSource(); + + } + + /** + * Initialize embedded (DERBY) database. + */ + private void initEmbeddedDb() throws DatabaseConfigException { + + String db; + switch (_odeConfig.getDbDaoImpl()) { + case HIBERNATE: + db = "hibdb"; + break; + case JPA: + db = "jpadb"; + break; + default: + String errmsg = __msgs.msgUnrecoginizedDaoType(_odeConfig.getDbDaoImpl()); + __log.error(errmsg); + throw new DatabaseConfigException(errmsg, null); + } + + String url = "jdbc:derby:" + _workRoot + "/" + db + "/" + _odeConfig.getDbEmbeddedName(); + __log.info("Using Embedded Derby: " + url); + _derbyUrl = url; + initInternalDb(url, org.apache.derby.jdbc.EmbeddedDriver.class.getName()); + + } + + @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); + } + } + +} Added: incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConfigException.java URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConfigException.java?view=auto&rev=508519 ============================================================================== --- incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConfigException.java (added) +++ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/DatabaseConfigException.java Fri Feb 16 09:43:00 2007 @@ -0,0 +1,11 @@ +package org.apache.ode.il.dbutil; + +public class DatabaseConfigException extends Exception { + + private static final long serialVersionUID = 1L; + + public DatabaseConfigException(String msg, Exception ex) { + super(msg,ex); + } + +} Added: incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Messages.java URL: http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Messages.java?view=auto&rev=508519 ============================================================================== --- incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Messages.java (added) +++ incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il/dbutil/Messages.java Fri Feb 16 09:43:00 2007 @@ -0,0 +1,48 @@ +package org.apache.ode.il.dbutil; + +import java.io.File; + +import org.apache.ode.il.config.OdeConfigProperties.DaoType; +import org.apache.ode.utils.msg.MessageBundle; + +public class Messages extends MessageBundle { + + public String msgOdeInitHibernatePropertiesNotFound(File expected) { + return format("Hibernate configuration file \"{0}\" not found, defaults will be used.", expected); + } + + public String msgOdeUsingExternalDb(String dbDataSource) { + return format("ODE using external DataSource \"{0}\".", dbDataSource); + } + + public Object msgOdeUsingInternalDb(String dbIntenralJdbcUrl, String dbInternalJdbcDriverClass) { + return format("ODE using internal database \"{0}\" with driver {1}.", dbIntenralJdbcUrl, dbInternalJdbcDriverClass); + + } + + public String msgOdeInitExternalDbFailed(String dbDataSource) { + return format("Failed to resolved external DataSource at \"{0}\".", dbDataSource); + } + + public String msgOdeInitDAOErrorReadingProperties(File propfile) { + return format("Error reading DAO properties file \"{0}\".", propfile); + } + + public String msgOdeDbPoolStartupFailed(String url) { + return format("Error starting Minerva connection pool for \"{0}\".", url); + } + + public String msgOdeUsingDAOImpl(String className) { + return format("Using DAO Connection Factory class {0}.", className); + } + + public String msgDAOInstantiationFailed(String className) { + return format("Error instantiating DAO Connection Factory class {0}.", className); + + } + + public String msgUnrecoginizedDaoType(DaoType dbDaoImpl) { + return format("Unsupported/Unrecoginized DAO type {0}. ", dbDaoImpl); + } + +}