/*******************************************************************************
* Copyright (c) 2014 BestSolution.at and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package at.bestsolution.persistence.java.c3p0;
import java.beans.PropertyVetoException;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import at.bestsolution.persistence.java.JDBCConfiguration;
import at.bestsolution.persistence.java.JDBCConnectionProvider;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0ConnectionProvider implements JDBCConnectionProvider {
private Map<String,ComboPooledDataSource> cpds = new HashMap<String, ComboPooledDataSource>();
private List<JDBCConfiguration> configurationList = new ArrayList<JDBCConfiguration>();
private Map<String, C3P0BlobCreator> blobCreators = new HashMap<String, C3P0BlobCreator>();
public void registerJDBCConfiguration(JDBCConfiguration configuration) {
synchronized (configurationList) {
this.configurationList.add(configuration);
}
}
public void unregisterJDBCConfiguration(JDBCConfiguration configuration) {
synchronized (configurationList) {
this.configurationList.remove(configuration);
}
}
public void registerBlobCreator(C3P0BlobCreator creator) {
synchronized (blobCreators) {
blobCreators.put(creator.getDatabaseType(), creator);
}
}
private JDBCConfiguration getConfiguration(String configurationId) throws SQLException {
synchronized (configurationList) {
for( JDBCConfiguration c : configurationList ) {
if( c.getId().equals(configurationId) ) {
return c;
}
}
}
throw new SQLException("Unknown database configuration '"+configurationId+"'");
}
@Override
public Blob createTempBlob(String configurationId, Connection connection) throws SQLException {
C3P0BlobCreator c;
synchronized (blobCreators) {
c = blobCreators.get(getConfiguration(configurationId).getDatabaseType());
}
if( c != null ) {
return c.createBlob(connection);
}
return connection.createBlob();
}
@Override
public Clob createTempClob(String configurationId, Connection connection) throws SQLException {
C3P0BlobCreator c;
synchronized (blobCreators) {
c = blobCreators.get(getConfiguration(configurationId).getDatabaseType());
}
if( c != null ) {
return c.createClob(connection);
}
return connection.createClob();
}
@Override
public void releaseTempBlob(String configurationId, Connection connection, Blob blob)
throws SQLException {
C3P0BlobCreator c;
synchronized (blobCreators) {
c = blobCreators.get(getConfiguration(configurationId).getDatabaseType());
}
if( c != null ) {
c.releaseBlob(connection, blob);
} else {
blob.free();
}
}
@Override
public void releaseTempClob(String configurationId, Connection connection, Clob clob)
throws SQLException {
C3P0BlobCreator c;
synchronized (blobCreators) {
c = blobCreators.get(getConfiguration(configurationId).getDatabaseType());
}
if( c != null ) {
c.releaseClob(connection, clob);
} else {
clob.free();
}
}
private synchronized ComboPooledDataSource initPool(String configurationId) throws SQLException {
ComboPooledDataSource cpds = this.cpds.get(configurationId);
if( cpds != null ) {
return cpds;
}
cpds = new ComboPooledDataSource();
JDBCConfiguration configuration = getConfiguration(configurationId);
try {
cpds.setDriverClass( configuration.getJDBCDriver().getName() );
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpds.setJdbcUrl( configuration.getConnectionURL() );
cpds.setUser(configuration.getUsername());
cpds.setPassword(configuration.getPassword());
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
this.cpds.put(configurationId, cpds);
return cpds;
}
@Override
public String getDatabaseType(String configurationId) {
try {
return getConfiguration(configurationId).getDatabaseType();
} catch (SQLException e) {
throw new IllegalArgumentException("There's no configuration with the ID '"+configurationId+"'");
}
}
@Override
public Connection checkoutConnection(String configurationId) {
try {
return initPool(configurationId).getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public void returnConnection(String configurationId, Connection connection) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}