You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ms...@apache.org on 2007/02/16 18:43:01 UTC
svn commit: r508519 - in
/incubator/ode/trunk/bpel-epr/src/main/java/org/apache/ode/il: ./ config/
config/OdeConfigProperties.java dbutil/ dbutil/Database.java
dbutil/DatabaseConfigException.java dbutil/Messages.java
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 {@link 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);
+ }
+
+}