package org.springframework.roo.addon.jdbc.polling.internal; import java.sql.Driver; import java.sql.DriverManager; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.springframework.roo.addon.jdbc.polling.JdbcDriverProvider; import org.springframework.roo.support.osgi.BundleFindingUtils; /** * Basic implementation of {@link JdbcDriverProvider} that provides common JDBC * drivers. To be returned by this provider, it is necessary the JDBC driver has * been declared as an optional import within the JDBC add-on's OSGi bundle * manifest. * * @author Alan Stewart * @author Ben Alex * @since 1.1 */ @Component @Service public class CommonJdbcDriverProvider implements JdbcDriverProvider { private BundleContext bundleContext; protected void activate(final ComponentContext context) { bundleContext = context.getBundleContext(); } protected void deactivate(final ComponentContext context) { bundleContext = null; } public Driver loadDriver(final String driverClassName) throws RuntimeException { // Try a search final Class<?> clazz = BundleFindingUtils.findFirstBundleWithType(bundleContext, driverClassName); if (clazz == null) { // Let's give up given it doesn't seem to be loadable return null; } if (!Driver.class.isAssignableFrom(clazz)) { // That's weird, it doesn't seem to be a driver return null; } // Time to create it and register etc try { final Driver result = (Driver) clazz.newInstance(); DriverManager.registerDriver(result); return result; } catch (final Exception e) { throw new IllegalStateException("Unable to load JDBC driver '" + driverClassName + "'", e); } } }