package org.apache.struts.factory.jdbc;

import java.lang.Class;
import java.lang.Throwable;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import org.apache.struts.factory.Factory;
import org.apache.struts.factory.Parameter;
import org.apache.struts.action.Action;
import org.apache.struts.util.Pager;
import org.apache.struts.action.BeanFactoryServlet;

public class JDBCPagerFactory extends JDBCFactory {

        protected int skipParametersCount() {
                return 2;
        }

        protected Object processResult( ResultSet rs, String type, Parameter[] parameters )
                throws Throwable {
                int total = 0;
                Pager pager = null;
                Class clazz = Class.forName( type );
                DataBean db = null;
                ArrayList result = new ArrayList();
                Integer start = (Integer)parameters[1].getValue();
                Integer length = (Integer)parameters[2].getValue();

                for( int i = 0; i < start.intValue() - 1; i++, total++ ) rs.next();
                for( int i = 0; rs.next() && ( i < length.intValue() ); i++, total++ ) {
                        db = (DataBean)clazz.newInstance();
                        db.populateFrom( rs );
                        result.add( db );
                }
                while( rs.next() ) total++;

                pager = new Pager();
                pager.setContainer( result );
                pager.setTotalSize( total );
                pager.setUseCash( true );
                pager.setOffset( ((Integer)parameters[1].getValue() ).intValue() );
                pager.setPageSize( ((Integer)parameters[2].getValue() ).intValue() );

                return pager;
        }

}
