package prefuse.data.io.sql; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import prefuse.data.Table; /** * SQLDataHandler that allows multiple handlers to be grouped together. This * class supports a map that allows specific data field / column names to * use a custom SQLDataHandler implementation, while maintaining a default * handler for any data fields without an entry in the map. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class CompositeSQLDataHandler implements SQLDataHandler { private SQLDataHandler m_default; private HashMap m_overrides; // ------------------------------------------------------------------------ /** * Create a new CompositeSQLDataHandler. Uses a * {@link DefaultSQLDataHandler} as the default handler. */ public CompositeSQLDataHandler() { this(new DefaultSQLDataHandler()); } /** * Create a new CompositeSQLDataHandler. * @param defaultHandler the default data handler to use */ public CompositeSQLDataHandler(SQLDataHandler defaultHandler) { m_default = defaultHandler; } // ------------------------------------------------------------------------ /** * Add a custom data handler for a given column name. * @param columnName the data field / column name * @param handler the data handler to use for the field */ public void addHandler(String columnName, SQLDataHandler handler) { if ( m_overrides == null ) m_overrides = new HashMap(3); m_overrides.put(columnName, handler); } /** * Remove a custom data handler for a given column name. Subsequent * to this method, the column will use the default handler. * @param columnName the data field / column name * @return true if a handler was successfully removed, false if * no such custom handler was found. */ public boolean removeHandler(String columnName) { if ( m_overrides == null ) return false; else return m_overrides.remove(columnName) != null; } // ------------------------------------------------------------------------ /** * @see prefuse.data.io.sql.SQLDataHandler#process(prefuse.data.Table, int, java.sql.ResultSet, int) */ public void process(Table t, int trow, ResultSet rset, int rcol) throws SQLException { SQLDataHandler handler = m_default; if ( m_overrides != null && m_overrides.size() > 0 ) { ResultSetMetaData metadata = rset.getMetaData(); String name = metadata.getColumnName(rcol); SQLDataHandler h = (SQLDataHandler)m_overrides.get(name); if ( h != null ) handler = h; } handler.process(t, trow, rset, rcol); } /** * @see prefuse.data.io.sql.SQLDataHandler#getDataType(java.lang.String, int) */ public Class getDataType(String columnName, int sqlType) { SQLDataHandler handler = m_default; if ( m_overrides != null && m_overrides.size() > 0 ) { SQLDataHandler h = (SQLDataHandler)m_overrides.get(columnName); if ( h != null ) handler = h; } return handler.getDataType(columnName, sqlType); } } // end of class CompositeSQLDataValueHandler