/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.utils;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Liste de champs SQL.
*
* @author $Author: marcona $
* @version $Revision: 1.4 $
*
* @see SQLField
*/
public class SQLFieldList {
private Map hashTable = new java.util.HashMap();
/**
* Constructor par d�faut.
*/
public SQLFieldList() {}
/**
* Construction d'une liste de champs a partir de la definition de la table.
*
* @param dbTableName Le nom physique de la table.
* @param con La connection.
*
* @exception SQLException Erreur d'access a la base.
*/
public SQLFieldList(String dbTableName, Connection con)
throws SQLException {
this(dbTableName, con, null);
}
/**
* Construction d'une liste de champs a partir de la definition de la table pour un
* catalogue donn�.
*
* @param dbTableName Le nom physique de la table.
* @param con La connection.
* @param catalog Le catalogue de la table.
*
* @exception SQLException Erreur d'access a la base.
*/
public SQLFieldList(String dbTableName, Connection con, String catalog)
throws SQLException {
DatabaseMetaData md = con.getMetaData();
ResultSet rs = md.getColumns(catalog, null, dbTableName, null);
while (rs.next()) {
String dbFieldName = rs.getString(4);
int sqlType = rs.getInt(5);
addField(dbFieldName, sqlType);
}
}
/**
* Fusionne les �l�ments de list dans cette SQLFieldList.
*
* @param list La liste � ajouter
*/
public void addAll(SQLFieldList list) {
hashTable.putAll(list.hashTable);
}
/**
* Ajoute un SQLField de type Bit.
*
* @param dbFieldName nom physique du champs
*/
public void addBitField(String dbFieldName) {
hashTable.put(dbFieldName, new SQLField(Types.BIT, dbFieldName));
}
/**
* Ajoute un SQLField de type specifie.
*
* @param dbFieldName nom physique du champs
* @param sqlType Le type SQL du champs.
*
* @see java.sql.Types
*/
public void addField(String dbFieldName, int sqlType) {
if (sqlType == java.sql.Types.DATE
|| sqlType == java.sql.Types.TIME
|| sqlType == java.sql.Types.TIMESTAMP) {
hashTable.put(dbFieldName, new SQLDateField(sqlType, dbFieldName));
}
else {
hashTable.put(dbFieldName, new SQLField(sqlType, dbFieldName));
}
}
/**
* Ajoute un SQLField de type Float.
*
* @param dbFieldName nom physique du champs
*/
public void addFloatField(String dbFieldName) {
hashTable.put(dbFieldName, new SQLField(Types.FLOAT, dbFieldName));
}
/**
* Ajoute un SQLField de type Integer.
*
* @param dbFieldName nom physique du champs
*/
public void addIntegerField(String dbFieldName) {
hashTable.put(dbFieldName, new SQLField(Types.INTEGER, dbFieldName));
}
/**
* Ajoute un SQLField de type String.
*
* @param dbFieldName nom physique du champs
*/
public void addStringField(String dbFieldName) {
hashTable.put(dbFieldName, new SQLField(Types.VARCHAR, dbFieldName));
}
/**
* Efface toutes les valeurs contenue dans les SQLField.
*/
public void clearValues() {
for (Iterator iter = hashTable.values().iterator(); iter.hasNext();) {
SQLField field = (SQLField)iter.next();
field.setValue(null);
}
}
/**
* Retourne un iterator sur les noms de champs.
*
* @return Description of the Returned Value
*/
public Iterator fieldNames() {
return hashTable.keySet().iterator();
}
/**
* Retourne un ensemble contenant les noms de champs.
*
* @return Description of the Returned Value
*/
public Set fieldNamesSet() {
return hashTable.keySet();
}
/**
* Gets the FieldType attribute of the SQLFieldList object
*
* @param dbFieldName nom physique du champs
*
* @return Le type SQL du champs (tel que definie dans Types)
*
* @see java.sql.Types
*/
public int getFieldType(String dbFieldName) {
return getField(dbFieldName).getSQLType();
}
/**
* Gets the FieldValue attribute of the SQLFieldList object
*
* @param dbFieldName nom physique du champs
*
* @return La valeur du champs
*/
public Object getFieldValue(String dbFieldName) {
return getField(dbFieldName).getValue();
}
/**
* Gets the SortedDBFieldNameList attribute of the SQLFieldList object
*
* @return La liste tri�e des noms physiques de la table courante.
*/
public List getSortedDBFieldNameList() {
List listField = new ArrayList(hashTable.keySet());
Collections.sort(listField);
return listField;
}
/**
* Enleve un SQLField de la liste. Si la colonne n'existe pas, la liste n'est pas
* modifiee.
*
* @param dbFieldName nom physique du champs
*/
public void removeField(String dbFieldName) {
hashTable.remove(dbFieldName);
}
/**
* Sets the FieldValue attribute of the SQLFieldList object
*
* @param dbFieldName nom physique du champs
* @param v La nouvelle valeur du champs.
*/
public void setFieldValue(String dbFieldName, Object v) {
getField(dbFieldName).setValue(v);
}
/**
* Sets the FieldValue attribute of the SQLFieldList object (for Date value).
* Converts a java.util.Date into java.sql.Date .
*
* @param dbFieldName nom physique du champs
* @param d La nouvelle date du champs.
*/
public void setFieldValue(String dbFieldName, java.util.Date d) {
getField(dbFieldName).setValue(d);
}
/**
* Retourne le nombre de champs.
*
* @return Description of the Returned Value
*/
public int size() {
return hashTable.size();
}
/**
* DOCUMENT ME!
*
* @return
*/
public String toString() {
StringBuffer buffer = new StringBuffer("SQLFieldList(");
for (Iterator iter = fieldNames(); iter.hasNext();) {
String obj = (String)iter.next();
buffer.append(obj);
if (iter.hasNext()) {
buffer.append(", ");
}
}
return buffer.append(")").toString();
}
/**
* Retourne un iterator sur les champs (SQLField).
*
* @return Description of the Returned Value
*/
Iterator sqlFields() {
return hashTable.values().iterator();
}
/**
* Retourne le SQLField ayant ce nom physique.
*
* @param dbFieldName nom physique du champs
*
* @return Le SQLField (non null).
*
* @throws java.util.NoSuchElementException TODO
*/
private SQLField getField(String dbFieldName) {
SQLField field = (SQLField)hashTable.get(dbFieldName);
if (field == null) {
throw new java.util.NoSuchElementException(dbFieldName);
}
return field;
}
}