package org.hibernate.cfg.reveng.dialect; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import org.hibernate.exception.spi.SQLExceptionConverter; /** * Iterator over a resultset; intended usage only for metadata reading. */ public abstract class ResultSetIterator implements Iterator<Map<String, Object>> { private ResultSet rs; protected boolean current = false; protected boolean endOfRows = false; private SQLExceptionConverter sec; private Statement statement = null; protected ResultSetIterator(ResultSet resultset, SQLExceptionConverter sec) { this(null, resultset, sec); } public ResultSetIterator(Statement stmt, ResultSet resultset, SQLExceptionConverter exceptionConverter) { this.rs = resultset; this.sec = exceptionConverter; this.statement = stmt; } protected SQLExceptionConverter getSQLExceptionConverter() { return sec; } public boolean hasNext() { try { advance(); return !endOfRows; } catch (SQLException e) { handleSQLException( e ); return false; } } public Map<String, Object> next() { try { advance(); if ( endOfRows ) { throw new NoSuchElementException(); } current = false; return convertRow( rs ); } catch (SQLException e) { handleSQLException(e); throw new NoSuchElementException("excpetion occurred " + e); } } abstract protected Throwable handleSQLException(SQLException e); abstract protected Map<String, Object> convertRow(ResultSet rs) throws SQLException; public void remove() { throw new UnsupportedOperationException( "remove() not possible on ResultSet" ); } protected void advance() throws SQLException { if ( !current && !endOfRows ) { if ( rs.next() ) { current = true; endOfRows = false; } else { current = false; endOfRows = true; } } } public void close() { try { rs.close(); if(statement!=null) { statement.close(); } } catch (SQLException e) { handleSQLException(e); } } }