package org.dayatang.dsmonitor;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class GeminiConnection extends DelegatingConnection {
private long creationTime;
private StackTraceElement[] stackTraceElements = new StackTraceElement[] {};
private Set<ConnectionMonitor> monitors = new HashSet<ConnectionMonitor>();
public GeminiConnection(Connection targetConnection,
Set<ConnectionMonitor> monitors) throws SQLException {
super(targetConnection);
if (monitors != null) {
this.monitors = new HashSet<ConnectionMonitor>();
}
this.monitors = new HashSet<ConnectionMonitor>(monitors);
this.creationTime = System.currentTimeMillis();
notifyOpen();
}
private void notifyOpen() throws SQLException {
for (ConnectionMonitor monitor : monitors) {
monitor.openConnection(this);
}
}
@Override
public void close() throws SQLException {
notifyClose();
super.close();
}
private void notifyClose() throws SQLException {
for (ConnectionMonitor monitor : monitors) {
monitor.closeConnection(this);
}
}
public long getSurvivalTime() {
return System.currentTimeMillis() - creationTime;
}
public void addMonitor(ConnectionMonitor monitor) {
monitors.add(monitor);
}
public void removeMonitor(ConnectionMonitor monitor) {
monitors.remove(monitor);
}
public long getCreationTime() {
return creationTime;
}
public StackTraceElement[] getStackTraceElements() {
return Arrays.copyOf(stackTraceElements, stackTraceElements.length);
}
public void setStackTraceElements(StackTraceElement[] stackTraceElements) {
this.stackTraceElements = Arrays.copyOf(stackTraceElements, stackTraceElements.length);
}
}