package org.springframework.roo.addon.jdbc.polling.internal; import java.sql.Driver; import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; import org.apache.commons.lang3.Validate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferencePolicy; import org.apache.felix.scr.annotations.ReferenceStrategy; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.addon.jdbc.JdbcDriverManager; import org.springframework.roo.addon.jdbc.polling.JdbcDriverProvider; import org.springframework.roo.support.api.AddOnSearch; import org.springframework.roo.support.api.AddOnSearch.SearchType; import org.springframework.roo.support.logging.HandlerUtils; /** * Polls all OSGi-located {@link JdbcDriverProvider} instances and returns the * first JDBC driver provided by an instance. * <p> * Failing the location of a suitable {@link JdbcDriverProvider}, automatically * suggests an add-on which may be able to provide the driver as a console * message. * * @author Alan Stewart * @author Ben Alex * @since 1.1 */ @Component @Service @Reference(name = "jdbcDriverProvider", strategy = ReferenceStrategy.EVENT, policy = ReferencePolicy.DYNAMIC, referenceInterface = JdbcDriverProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE) public class PollingJdbcDriverManager implements JdbcDriverManager { private static final Logger LOGGER = HandlerUtils.getLogger(PollingJdbcDriverManager.class); @Reference private AddOnSearch addOnSearch; private final Set<JdbcDriverProvider> providers = new HashSet<JdbcDriverProvider>(); protected void bindJdbcDriverProvider(final JdbcDriverProvider listener) { synchronized (providers) { providers.add(listener); } } public Driver loadDriver(final String driverClassName, final boolean displayAddOns) throws RuntimeException { Validate.notBlank(driverClassName, "Driver class name required"); synchronized (providers) { for (final JdbcDriverProvider provider : providers) { final Driver driver = provider.loadDriver(driverClassName); if (driver != null) { return driver; } } if (!displayAddOns) { // Caller requested add-on information not be displayed (might // be in a TAB assist section etc) return null; } // No implementation could provide it // Do a silent (console message free) lookup of matches final Integer matches = addOnSearch.searchAddOns(driverClassName, SearchType.JDBCDRIVER); // Render to screen if required if (matches == null) { LOGGER.info("Spring Roo automatic add-on discovery service currently unavailable"); } else if (matches > 0) { LOGGER.info("Located add-on" + (matches == 1 ? "" : "s") + " that may offer this JDBC driver"); } return null; } } protected void unbindJdbcDriverProvider(final JdbcDriverProvider listener) { synchronized (providers) { providers.remove(listener); } } }