From e62f9c1727fafe36bc684ac0d8264d3c7ef300aa Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 14 Apr 2014 15:48:58 +0000 Subject: [PATCH] Modified the RuntimeConfig#getJDBCURL() method. The method now first tries to lookup an JNDI datasource identified by 'java:/comp/env/jdbc/ccm-ds '. Then the method determines the URL from this datasource. Attention: This will only work if the JDBC-URL provided for the datasource is complete (the URL must contain username and password for the connection). If the datasource can't be aquired, the value from the runtime.properties files is used. git-svn-id: https://svn.libreccm.org/ccm/trunk@2611 8810af33-2d31-482b-a856-94f89814c4df --- .../com/arsdigita/runtime/RuntimeConfig.java | 107 ++++++++++++------ 1 file changed, 70 insertions(+), 37 deletions(-) diff --git a/ccm-core/src/com/arsdigita/runtime/RuntimeConfig.java b/ccm-core/src/com/arsdigita/runtime/RuntimeConfig.java index cdb2723e5..3bfb8a268 100755 --- a/ccm-core/src/com/arsdigita/runtime/RuntimeConfig.java +++ b/ccm-core/src/com/arsdigita/runtime/RuntimeConfig.java @@ -22,11 +22,18 @@ import com.arsdigita.util.jdbc.JDBCURLParameter; import com.arsdigita.util.parameter.BooleanParameter; import com.arsdigita.util.parameter.IntegerParameter; import com.arsdigita.util.parameter.Parameter; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.sql.DataSource; import org.apache.log4j.Logger; /** - * A configuration record for configuration of the runtime environment itself. - * (Which database to use, database user and password, etc) + * A configuration record for configuration of the runtime environment itself. (Which database to + * use, database user and password, etc) * * @author Justin Ross <jross@redhat.com> * @version $Id: RuntimeConfig.java 1393 2006-11-28 09:12:32Z sskracic $ @@ -38,8 +45,7 @@ public final class RuntimeConfig extends AbstractConfig { private static RuntimeConfig s_config; /** - * Returns the singleton configuration record for the runtime - * environment. + * Returns the singleton configuration record for the runtime environment. * * @return The RuntimeConfig record; it cannot be null */ @@ -69,31 +75,26 @@ public final class RuntimeConfig extends AbstractConfig { * */ public RuntimeConfig() { - // pboy: According to the comment for the getConfig() method a singleton - // pattern is to be used. Therefore the constructor must be changed to - // private! - // private RuntimeConfig() { + // pboy: According to the comment for the getConfig() method a singleton + // pattern is to be used. Therefore the constructor must be changed to + // private! + // private RuntimeConfig() { m_url = new JDBCURLParameter("waf.runtime.jdbc_url"); - m_poolSize = new IntegerParameter - ("waf.runtime.jdbc_pool_size", Parameter.OPTIONAL, - new Integer(10)); - m_pingInterval = new IntegerParameter - ("waf.runtime.jdbc_ping_interval", Parameter.OPTIONAL, - new Integer(30000)); - m_queryCacheSize = new IntegerParameter - ("waf.runtime.query_cache_size", Parameter.OPTIONAL, - new Integer(2000)); - m_threadTagging = new BooleanParameter - ("waf.runtime.thread_tagging", - Parameter.REQUIRED, - Boolean.TRUE); - m_resultSetWindowSize = new IntegerParameter - ("waf.runtime.jdbc_resultset_windowsize", Parameter.REQUIRED, - new Integer(1)); - m_runBackgroundTasks = new BooleanParameter - ("waf.runtime.run_background_tasks", - Parameter.REQUIRED, - Boolean.TRUE); + m_poolSize = new IntegerParameter("waf.runtime.jdbc_pool_size", Parameter.OPTIONAL, + new Integer(10)); + m_pingInterval = new IntegerParameter("waf.runtime.jdbc_ping_interval", Parameter.OPTIONAL, + new Integer(30000)); + m_queryCacheSize = new IntegerParameter("waf.runtime.query_cache_size", Parameter.OPTIONAL, + new Integer(2000)); + m_threadTagging = new BooleanParameter("waf.runtime.thread_tagging", + Parameter.REQUIRED, + Boolean.TRUE); + m_resultSetWindowSize = new IntegerParameter("waf.runtime.jdbc_resultset_windowsize", + Parameter.REQUIRED, + new Integer(1)); + m_runBackgroundTasks = new BooleanParameter("waf.runtime.run_background_tasks", + Parameter.REQUIRED, + Boolean.TRUE); register(m_url); register(m_poolSize); @@ -112,16 +113,46 @@ public final class RuntimeConfig extends AbstractConfig { * @return A String JDBC URL; it cannot be null */ public final String getJDBCURL() { - return (String) get(m_url); + + //Try to get URL from JNDI + final String url = getJDBCURLfromJNDI(); + + if (url == null) { + //No JNDI datasource configured, use old behaviour + return (String) get(m_url); + } else { + //Return URL acquired via JNDI + return url; + } + } + + private String getJDBCURLfromJNDI() { + final Connection connection; + try { + final Context initialContext = new InitialContext(); + final DataSource dataSource = (DataSource) initialContext.lookup( + "java:/comp/env/jdbc/ccm-ds"); + connection = dataSource.getConnection(); + final DatabaseMetaData metaData = connection.getMetaData(); + final String url = metaData.getURL(); + connection.close(); + return url; + } catch (NamingException ex) { + s_log.warn("Failed to find JNDI datasource 'java:/comp/env/jdbc/ccm-ds'. " + + "Falling back to configuration via properties file."); + return null; + } catch (SQLException ex) { + s_log.warn("Failed to to determine JDBC URL from JNDI datasource 'java:/comp/env/jdbc/ccm-ds'. " + + "Falling back to configuration via properties file."); + return null; + } } /** * Returns the maximum size to be used for the connection pool. * - * @return An integer limit on the number of JDBC connections - * allowed open at once. + * @return An integer limit on the number of JDBC connections allowed open at once. */ - public final int getJDBCPoolSize() { return ((Integer) get(m_poolSize)).intValue(); } @@ -131,7 +162,7 @@ public final class RuntimeConfig extends AbstractConfig { } /** - * Returns the size of in-memory window of a fetched result set. + * Returns the size of in-memory window of a fetched result set. * * @return 0 if all fetched rows are kept in memory (beware!) */ @@ -144,9 +175,11 @@ public final class RuntimeConfig extends AbstractConfig { } public final boolean isThreadTaggingEnabled() { - return ((Boolean)get(m_threadTagging)).booleanValue(); + return ((Boolean) get(m_threadTagging)).booleanValue(); } - public final boolean runBackGroundTasks() { - return ((Boolean)get(m_runBackgroundTasks)).booleanValue(); - } + + public final boolean runBackGroundTasks() { + return ((Boolean) get(m_runBackgroundTasks)).booleanValue(); + } + }