001: package prefuse.data.io.sql;
002:
003: import java.sql.ResultSet;
004: import java.sql.ResultSetMetaData;
005: import java.sql.SQLException;
006: import java.util.HashMap;
007:
008: import prefuse.data.Table;
009:
010: /**
011: * SQLDataHandler that allows multiple handlers to be grouped together. This
012: * class supports a map that allows specific data field / column names to
013: * use a custom SQLDataHandler implementation, while maintaining a default
014: * handler for any data fields without an entry in the map.
015: *
016: * @author <a href="http://jheer.org">jeffrey heer</a>
017: */
018: public class CompositeSQLDataHandler implements SQLDataHandler {
019:
020: private SQLDataHandler m_default;
021: private HashMap m_overrides;
022:
023: // ------------------------------------------------------------------------
024:
025: /**
026: * Create a new CompositeSQLDataHandler. Uses a
027: * {@link DefaultSQLDataHandler} as the default handler.
028: */
029: public CompositeSQLDataHandler() {
030: this (new DefaultSQLDataHandler());
031: }
032:
033: /**
034: * Create a new CompositeSQLDataHandler.
035: * @param defaultHandler the default data handler to use
036: */
037: public CompositeSQLDataHandler(SQLDataHandler defaultHandler) {
038: m_default = defaultHandler;
039: }
040:
041: // ------------------------------------------------------------------------
042:
043: /**
044: * Add a custom data handler for a given column name.
045: * @param columnName the data field / column name
046: * @param handler the data handler to use for the field
047: */
048: public void addHandler(String columnName, SQLDataHandler handler) {
049: if (m_overrides == null)
050: m_overrides = new HashMap(3);
051: m_overrides.put(columnName, handler);
052: }
053:
054: /**
055: * Remove a custom data handler for a given column name. Subsequent
056: * to this method, the column will use the default handler.
057: * @param columnName the data field / column name
058: * @return true if a handler was successfully removed, false if
059: * no such custom handler was found.
060: */
061: public boolean removeHandler(String columnName) {
062: if (m_overrides == null)
063: return false;
064: else
065: return m_overrides.remove(columnName) != null;
066: }
067:
068: // ------------------------------------------------------------------------
069:
070: /**
071: * @see prefuse.data.io.sql.SQLDataHandler#process(prefuse.data.Table, int, java.sql.ResultSet, int)
072: */
073: public void process(Table t, int trow, ResultSet rset, int rcol)
074: throws SQLException {
075: SQLDataHandler handler = m_default;
076: if (m_overrides != null && m_overrides.size() > 0) {
077: ResultSetMetaData metadata = rset.getMetaData();
078: String name = metadata.getColumnName(rcol);
079: SQLDataHandler h = (SQLDataHandler) m_overrides.get(name);
080: if (h != null)
081: handler = h;
082: }
083:
084: handler.process(t, trow, rset, rcol);
085: }
086:
087: /**
088: * @see prefuse.data.io.sql.SQLDataHandler#getDataType(java.lang.String, int)
089: */
090: public Class getDataType(String columnName, int sqlType) {
091: SQLDataHandler handler = m_default;
092: if (m_overrides != null && m_overrides.size() > 0) {
093: SQLDataHandler h = (SQLDataHandler) m_overrides
094: .get(columnName);
095: if (h != null)
096: handler = h;
097: }
098:
099: return handler.getDataType(columnName, sqlType);
100: }
101:
102: } // end of class CompositeSQLDataValueHandler
|