package org.rhq.plugins.database; import static org.rhq.core.domain.measurement.AvailabilityType.DOWN; import static org.rhq.core.domain.measurement.AvailabilityType.UP; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException; import org.rhq.core.pluginapi.inventory.ResourceComponent; import org.rhq.core.pluginapi.inventory.ResourceContext; /** * Tests using the H2Database. */ public class H2Database implements DatabaseComponent<ResourceComponent<?>>, ConnectionPoolingSupport { private static final Log LOG = LogFactory.getLog(H2Database.class); static final String DRIVER_CLASS_PROPERTY = "driverClass"; static final String URL_PROPERTY = "url"; static final String USERNAME_PROPERTY = "username"; static final String PASSWORD_PROPERTY = "password"; protected ResourceContext resourceContext; @Deprecated private Connection connection; private H2PooledConnectionProvider pooledConnectionProvider; public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception { this.resourceContext = resourceContext; buildSharedConnectionIfNeeded(); pooledConnectionProvider = new H2PooledConnectionProvider(resourceContext.getPluginConfiguration()); } public void stop() { resourceContext = null; DatabasePluginUtil.safeClose(connection); connection = null; pooledConnectionProvider.close(); pooledConnectionProvider = null; } @Override public boolean supportsConnectionPooling() { return true; } @Override public PooledConnectionProvider getPooledConnectionProvider() { return pooledConnectionProvider; } public AvailabilityType getAvailability() { Connection jdbcConnection = null; try { jdbcConnection = getPooledConnectionProvider().getPooledConnection(); return jdbcConnection.isValid(1) ? UP : DOWN; } catch (SQLException e) { return DOWN; } finally { DatabasePluginUtil.safeClose(jdbcConnection); } } public Connection getConnection() { buildSharedConnectionIfNeeded(); return connection; } private void buildSharedConnectionIfNeeded() { try { if ((connection == null) || connection.isClosed()) { connection = buildConnection(resourceContext.getPluginConfiguration()); } } catch (SQLException e) { if (LOG.isDebugEnabled()) { LOG.debug("Could not build shared connection", e); } } } public void removeConnection() { DatabasePluginUtil.safeClose(this.connection); this.connection = null; } static Connection buildConnection(Configuration pluginConfig) throws SQLException { String driverClass = pluginConfig.getSimpleValue(DRIVER_CLASS_PROPERTY, "org.h2.Driver"); try { Class.forName(driverClass); } catch (ClassNotFoundException e) { throw new InvalidPluginConfigurationException("Specified JDBC driver class (" + driverClass + ") not found."); } String url = pluginConfig.getSimpleValue(URL_PROPERTY, "jdbc:h2:test"); String username = pluginConfig.getSimpleValue(USERNAME_PROPERTY, "sa"); String password = pluginConfig.getSimpleValue(PASSWORD_PROPERTY, ""); if (LOG.isDebugEnabled()) { LOG.debug("Attempting JDBC connection to [" + url + "]"); } return DriverManager.getConnection(url, username, password); } }