/* * _____________________________________________________________________________ * * INAF - OATS National Institute for Astrophysics - Astronomical Observatory of * Trieste INAF - IA2 Italian Center for Astronomical Archives * _____________________________________________________________________________ * * Copyright (C) 2016 Istituto Nazionale di Astrofisica * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License Version 3 as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package it.inaf.oats.ia2.tapschemamanager.api; import it.inaf.oats.ia2.tapschemamanager.api.contract.DatabaseType; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import java.io.Serializable; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.postgresql.ds.PGPoolingDataSource; /** * This class is used to silently manage the possibility to have separate data * sources for the TAP_SCHEMA schema and it source schema (the schema from which * it takes the information).
* An API user asks, for example, {@link getSourceDataSource()}, and the * DBWrapper returns the correct DataSource, both if * it is separated from the TAP_SCHEMA DataSource or if they are * the same object. * * @author Sonia Zorba {@literal } */ public class DBWrapper implements Serializable { private static final long serialVersionUID = 1721030677924066695L; // Same credentials private Credentials credentials; // Separated credentials private Credentials sourceCredentials; private Credentials tapSchemaCredentials; private final DataSourcesWrapper dataSources; private DBWrapper() { dataSources = new DataSourcesWrapper(); } /** * Constructor to use if the source schema credentials and the TAP_SCHEMA * credentials are the same. */ public DBWrapper(Credentials credentials) { this(); this.credentials = credentials; } /** * Constructor to use if the source schema credentials are different from * the TAP_SCHEMA credentials. */ public DBWrapper(Credentials sourceCredentials, Credentials tapSchemaCredentials) { this(); this.sourceCredentials = sourceCredentials; this.tapSchemaCredentials = tapSchemaCredentials; } public DataSource getSourceDataSource() { return dataSources.getSourceDataSource(); } public DataSource getTapSchemaDataSource() { return dataSources.getTapSchemaDataSource(); } public Connection getSourceConnection() throws SQLException { return getSourceDataSource().getConnection(); } public Connection getTapSchemaConnection() throws SQLException { return getTapSchemaDataSource().getConnection(); } public Credentials getSourceCredentials() { if (credentials != null) { return credentials; } return sourceCredentials; } public Credentials getTapSchemaCredentials() { if (credentials != null) { return credentials; } return tapSchemaCredentials; } public DatabaseType getSourceDatabaseType() { return getSourceCredentials().getDatabaseType(); } public DatabaseType getTapSchemaDatabaseType() { return getTapSchemaCredentials().getDatabaseType(); } /** * Test both the connection to the TAP_SCHEMA DataSource and * its source DataSource. * * @throws SQLException if it is not possible to connect to the * DataSource. */ public void testConnections() throws SQLException { Connection connection; if (credentials != null) { connection = dataSources.getSourceDataSource().getConnection(); connection.close(); } else { connection = dataSources.getSourceDataSource().getConnection(); connection.close(); connection = dataSources.getTapSchemaDataSource().getConnection(); connection.close(); } } /** * @return true if the TAP_SCHEMA DataSource is different from * its source DataSource, false otherwise. */ public boolean isSeparatedSources() { return dataSources.isSeparatedSources(); } private class DataSourcesWrapper implements Serializable { private static final long serialVersionUID = -7025255003212206748L; private transient DataSource dataSource; private transient DataSource sourceDataSource; private transient DataSource tapSchemaDataSource; public boolean isSeparatedSources() { return dataSource == null; } public DataSource getTapSchemaDataSource() { if (credentials != null) { if (dataSource == null) { dataSource = createDataSource(credentials); } return dataSource; } if (tapSchemaDataSource == null) { tapSchemaDataSource = createDataSource(tapSchemaCredentials); } return tapSchemaDataSource; } public DataSource getSourceDataSource() { if (credentials != null) { if (dataSource == null) { dataSource = createDataSource(credentials); } return dataSource; } if (sourceDataSource == null) { sourceDataSource = createDataSource(sourceCredentials); } return sourceDataSource; } private DataSource createDataSource(Credentials credentials) { if (credentials.getDatabaseType() == DatabaseType.MYSQL) { MysqlDataSource ds = new MysqlDataSource(); ds.setServerName(credentials.getHostname()); ds.setPortNumber(credentials.getPort()); ds.setUser(credentials.getUsername()); ds.setPassword(credentials.getPassword()); return ds; } else if (credentials.getDatabaseType() == DatabaseType.POSTGRES) { PGPoolingDataSource ds = new PGPoolingDataSource(); ds.setServerName(credentials.getHostname()); ds.setPortNumber(credentials.getPort()); ds.setUser(credentials.getUsername()); ds.setPassword(credentials.getPassword()); ds.setDatabaseName("postgres"); return ds; } throw new UnsupportedOperationException(credentials.getDatabaseType() + " not supported yet."); } } }