/*
* #%L
* P6Spy
* %%
* Copyright (C) 2013 P6Spy
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.p6spy.engine.common;
import java.sql.Connection;
import java.sql.Driver;
import java.util.concurrent.atomic.AtomicInteger;
import javax.sql.CommonDataSource;
import javax.sql.PooledConnection;
/**
* @author Quinton McCombs
* @since 09/2013
*/
public class ConnectionInformation implements Loggable {
private static final AtomicInteger counter = new AtomicInteger(0);
private final int connectionId;
private CommonDataSource dataSource;
private Driver driver;
private Connection connection;
private PooledConnection pooledConnection;
private long timeToGetConnectionNs;
private ConnectionInformation() {
this.connectionId = counter.getAndIncrement();
}
/**
* Creates a new {@link ConnectionInformation} instance for a {@link Connection} which has been obtained via a
* {@link Driver}
*
* @param driver the {@link Driver} which created the {@link #connection}
* @param connection the {@link #connection} created by the {@link #driver}
* @param timeToGetConnectionNs the time it took to obtain the connection in nanoseconds
* @return a new {@link ConnectionInformation} instance
*/
public static ConnectionInformation fromDriver(Driver driver, Connection connection, long timeToGetConnectionNs) {
final ConnectionInformation connectionInformation = new ConnectionInformation();
connectionInformation.driver = driver;
connectionInformation.connection = connection;
connectionInformation.timeToGetConnectionNs = timeToGetConnectionNs;
return connectionInformation;
}
/**
* Creates a new {@link ConnectionInformation} instance for a {@link Connection} which has been obtained via a
* {@link CommonDataSource}
*
* @param dataSource the {@link javax.sql.CommonDataSource} which created the {@link #connection}
* @param connection the {@link #connection} created by the {@link #dataSource}
* @param timeToGetConnectionNs the time it took to obtain the connection in nanoseconds
* @return a new {@link ConnectionInformation} instance
*/
public static ConnectionInformation fromDataSource(CommonDataSource dataSource, Connection connection, long timeToGetConnectionNs) {
final ConnectionInformation connectionInformation = new ConnectionInformation();
connectionInformation.dataSource = dataSource;
connectionInformation.connection = connection;
connectionInformation.timeToGetConnectionNs = timeToGetConnectionNs;
return connectionInformation;
}
/**
* Creates a new {@link ConnectionInformation} instance for a {@link Connection} which has been obtained via a
* {@link PooledConnection}
*
* @param pooledConnection the {@link PooledConnection} which created the {@link #connection}
* @param connection the {@link #connection} created by the {@link #pooledConnection}
* @param timeToGetConnectionNs the time it took to obtain the connection in nanoseconds
* @return a new {@link ConnectionInformation} instance
*/
public static ConnectionInformation fromPooledConnection(PooledConnection pooledConnection, Connection connection, long timeToGetConnectionNs) {
final ConnectionInformation connectionInformation = new ConnectionInformation();
connectionInformation.pooledConnection = pooledConnection;
connectionInformation.connection = connection;
connectionInformation.timeToGetConnectionNs = timeToGetConnectionNs;
return connectionInformation;
}
/**
* This method should only be used in test scenarios
*
* @param connection the underlying connection (possibly a mock)
* @return a new {@link ConnectionInformation} instance
*/
public static ConnectionInformation fromTestConnection(Connection connection) {
final ConnectionInformation connectionInformation = new ConnectionInformation();
connectionInformation.connection = connection;
return connectionInformation;
}
public int getConnectionId() {
return connectionId;
}
@Override
public String getSql() {
return "";
}
@Override
public String getSqlWithValues() {
return "";
}
/**
* Returns the {@link #dataSource} which created the {@link #connection}
* or <code>null</code> if it wasn't created via a {@link CommonDataSource}.
*
* @return the {@link #dataSource} which created the {@link #connection}
*/
public CommonDataSource getDataSource() {
return dataSource;
}
/**
* Returns the {@link #driver} which created the {@link #connection}
* or <code>null</code> if it wasn't created via a {@link Driver}.
*
* @return the {@link #driver} which created the {@link #connection}
*/
public Driver getDriver() {
return driver;
}
/**
* Returns a reference to the {@link Connection}
*
* @return a reference to the {@link Connection}
*/
public Connection getConnection() {
return connection;
}
/**
* Returns the {@link #pooledConnection} which created the {@link #connection}
* or <code>null</code> if it wasn't created via a {@link PooledConnection}.
*
* @return the {@link #pooledConnection} which created the {@link #connection}
*/
public PooledConnection getPooledConnection() {
return pooledConnection;
}
/**
* Returns the time it took to obtain the connection in nanoseconds
*
* @return the time it took to obtain the connection in nanoseconds
*/
public long getTimeToGetConnectionNs() {
return timeToGetConnectionNs;
}
/** {@inheritDoc} */
@Override
public ConnectionInformation getConnectionInformation() {
return this;
}
}