/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.server.preference.family;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* Metadata d'une table.
*/
public class TableMetaData {
private final String name;
private final List<ColumnMetaData> columnMetaDatas;
protected TableMetaData(String name, List<ColumnMetaData> columnMetaDatas) {
this.name = name;
this.columnMetaDatas = columnMetaDatas;
}
/**
* Fournit les m�ta-donn�es li�es � la table 'tableName' sans les colonnes d'anomalie.
*
* @return TableMetaData
*/
public static TableMetaData create(String tableName, Connection connection) throws SQLException {
Statement statement = connection.createStatement();
List<ColumnMetaData> columnMetaData = new ArrayList<ColumnMetaData>();
try {
ResultSet resultSet =
statement.executeQuery("select * from " + tableName + " where 1 = 2");
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
String colName = resultSetMetaData.getColumnName(i);
int colType = resultSetMetaData.getColumnType(i);
if (!"ANOMALY".equals(colName) && !"ANOMALY_LOG".equals(colName)) {
columnMetaData.add(new ColumnMetaData(colName, colType));
}
}
}
finally {
statement.close();
}
return new TableMetaData(tableName, columnMetaData);
}
public String getName() {
return name;
}
public String[] getColumnNames() {
List<String> names = new ArrayList<String>();
for (ColumnMetaData columnMetaData1 : columnMetaDatas) {
names.add(columnMetaData1.getColumnName());
}
return names.toArray(new String[columnMetaDatas.size()]);
}
public int getColumnType(String columnName) {
for (ColumnMetaData columnMetaData : columnMetaDatas) {
if (columnName.equals(columnMetaData.getColumnName())) {
return columnMetaData.getColumnType();
}
}
throw new IllegalArgumentException("La colonne '" + columnName
+ "' n'appartient pas � la table '" + getName() + "'");
}
/**
* Supprime les colonnes absentes de la liste des colonnes utilisees (param�tre 'usedColumns').
*
* @param usedColumns - Liste des colonnes utilis�es.
*/
public void removeUnusedColumns(List usedColumns) {
List<ColumnMetaData> columnsToRemove = new ArrayList<ColumnMetaData>();
for (ColumnMetaData columnMetaData : columnMetaDatas) {
if (usedColumns == null
|| !usedColumns.contains(columnMetaData.getColumnName())) {
columnsToRemove.add(columnMetaData);
}
}
columnMetaDatas.removeAll(columnsToRemove);
}
}