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);
+    }
+
+}