/*
* ARX: Powerful Data Anonymization
* Copyright 2014 - 2015 Karol Babioch, Fabian Prasser, Florian Kohlmayer
*
* 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.
*/
package org.deidentifier.arx.io;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.NoSuchElementException;
/**
* Configuration describing a JDBC source.
*
* @author Karol Babioch
* @author Fabian Prasser
*/
public class ImportConfigurationJDBC extends ImportConfiguration {
/**
* Connection to be used.
*
* @see {@link #setConnection(Connection)}
* @see {@link #getConnection()}
*/
private Connection connection;
/**
* Name of table to be used.
*
* @see {@link #setTable(String)}
* @see {@link #getTable()}
*/
private String table;
/**
* Determines whether we need to manage the JDBC connection.
*/
private final boolean manageConnection;
/**
* Creates a new instance of this object.
*
* @param connection {@link #setConnection(Connection)}
* @param table {@link #setTable(String)}
*/
public ImportConfigurationJDBC(Connection connection, String table) {
this.connection = connection;
this.table = table;
this.manageConnection = false;
}
/**
* Creates a new instance of this object.
*
* @param url
* @param table {@link #setTable(String)}
* @throws SQLException
*/
public ImportConfigurationJDBC(String url, String table) throws SQLException {
this.connection = DriverManager.getConnection(url);
this.table = table;
this.manageConnection = true;
}
/**
* Creates a new instance of this object.
*
* @param url
* @param user
* @param password
* @param table {@link #setTable(String)}
* @throws SQLException
*/
public ImportConfigurationJDBC(String url, String user, String password, String table) throws SQLException {
this.connection = DriverManager.getConnection(url, user, password);
this.table = table;
this.manageConnection = true;
}
/**
* Adds a single column to import from
*
* This makes sure that only {@link ImportColumnJDBC} can be added,
* otherwise an {@link IllegalArgumentException} will be thrown.
*
* @param column
* A single column to import from, {@link ImportColumnJDBC}
*/
@Override
public void addColumn(ImportColumn column) {
if (!(column instanceof ImportColumnJDBC)) {
throw new IllegalArgumentException("");
}
if (((ImportColumnJDBC) column).getIndex() == -1) {
int index = getIndexForColumn(((ImportColumnJDBC) column).getName());
((ImportColumnJDBC) column).setIndex(index);
}
for (ImportColumn c : columns) {
if (((ImportColumnJDBC) column).getIndex() == ((ImportColumnJDBC) c).getIndex()) {
throw new IllegalArgumentException("Column for this index already assigned");
}
if (column.getAliasName() != null && c.getAliasName() != null &&
c.getAliasName().equals(column.getAliasName())) {
throw new IllegalArgumentException("Column names need to be unique");
}
}
this.columns.add(column);
}
/**
* Closes any underlying JDBC connection that may have either been created by ARX or passed during construction.
*/
public void close() {
try {
this.connection.close();
} catch (Exception e) {
// Ignore
}
}
/**
*
*
* @param aliasName
* @return
* @throws NoSuchElementException
*/
private int getIndexForColumn(String aliasName) throws NoSuchElementException {
ResultSet rs = null;
int index = -1;
try {
rs = connection.getMetaData().getColumns(null,
null,
table,
null);
int i = 0;
while (rs.next()) {
if (rs.getString("COLUMN_NAME").equals(aliasName)) {
index = i;
}
i++;
}
} catch (SQLException e) {
/* Catch silently */
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
/* Ignore silently */
}
}
if (index != -1) {
return index;
}
throw new NoSuchElementException("Index for column '" + aliasName +
"' couldn't be found");
}
/**
* @return {@link #connection}
*/
protected Connection getConnection() {
return this.connection;
}
/**
* @return {@link #table}
*/
protected String getTable() {
return this.table;
}
/**
* Returns whether we need to close the connection
* @return
*/
protected boolean isManageConnection() {
return this.manageConnection;
}
}