package org.dayatang.dsmonitor; import org.dayatang.utils.Assert; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class GeminiWrapperDataSource extends DelegatingDataSource { private Set<ConnectionMonitor> monitors = new HashSet<ConnectionMonitor>(); public GeminiWrapperDataSource(DataSource targetDataSource, Set<ConnectionMonitor> monitors) { super(targetDataSource); setMonitors(monitors); } public Connection getConnection() throws SQLException { return buildConnection(super.getConnection()); } public Connection getConnection(String username, String password) throws SQLException { return buildConnection(super.getConnection(username, password)); } public Set<ConnectionMonitor> getMonitors() { return Collections.unmodifiableSet(monitors); } public final void setMonitors(Set<ConnectionMonitor> monitors) { if (monitors != null) { this.monitors = monitors; } } public void addMonitor(ConnectionMonitor monitor) { Assert.notNull(monitor, "Monitor to add cannot be null!"); monitors.add(monitor); } public void removeMonitor(ConnectionMonitor monitor) { Assert.notNull(monitor, "Monitor to add cannot be null!"); monitors.remove(monitor); } private Connection buildConnection(Connection connection) throws SQLException { if (connection == null) { return null; } return new GeminiConnection(connection, monitors); } }