package org.oddjob.sql; import java.sql.ResultSet; import java.sql.SQLException; import org.oddjob.arooa.ArooaSession; import org.oddjob.arooa.reflect.PropertyAccessor; import org.oddjob.beanbus.BusConductor; import org.oddjob.beanbus.BusEvent; import org.oddjob.beanbus.BusListenerAdapter; /** * A {@link SQLResultHandler} that creates beans. * * @author rob * */ abstract public class BeanFactoryResultHandler implements SQLResultHandler { private PropertyAccessor accessor; private volatile boolean stop; public BeanFactoryResultHandler(ArooaSession session) { this.accessor = session.getTools( ).getPropertyAccessor().accessorWithConversions( session.getTools().getArooaConverter()); } @Override public final void handleResultSet(ResultSet resultSet, DatabaseDialect dialect) throws SQLException, ClassNotFoundException { if (accessor == null) { throw new NullPointerException( "No Property Accessor. Was setArooaSession Called?"); } ResultSetBeanFactory beanFactory = new ResultSetBeanFactory( resultSet, accessor, dialect == null ? new BasicGenericDialect() : dialect); for (Object next = beanFactory.next(); !stop && next != null; next = beanFactory.next()) { accept(next); } } @Override public final void handleUpdate(int updateCount, DatabaseDialect dialect) { accept(new UpdateCount(updateCount)); } abstract protected void accept(Object bean); @Override public void setBusConductor(BusConductor busConductor) { busConductor.addBusListener(new BusListenerAdapter() { @Override public void busStopRequested(BusEvent event) { stop = true; } @Override public void busTerminated(BusEvent event) { event.getSource().removeBusListener(this); } }); } }