/*
 * Copyright (c) 2005-2011 Grameen Foundation USA
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * See also http://www.apache.org/licenses/LICENSE-2.0.html for an
 * explanation of the license and how it is applied.
 */

package org.mifos.framework.hibernate.helper;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.ScrollableResults;
import org.mifos.framework.exceptions.HibernateSearchException;

/**
 * This is the class that is returned on a search operation. Search would
 * typically result in a set of search result objects , these search result
 * objects would be obtained through hibernate scroll for pagination in the
 * front end , the associate hibernate session would be held in this object , a
 * call to close from the front end on this interface would result in the
 * hibernate session object getting closed.
 */

public class QueryResultDTOImpl implements QueryResult {

    private ScrollableResults scrollResult = null;

    public QueryInputs queryInputs = null;

    protected DTOBuilder dtoBuilder = null;

    protected boolean buildDTO = false;

    protected int size = 0;

    /**
     * Set the query which will be used for query execution
     *
     */
    @Override
	public void executeQuery(Query query) throws HibernateSearchException {
        if (query == null) {
            throw new HibernateSearchException(HibernateConstants.SEARCH_INPUTNULL);
        }
        try {
            scrollResult = query.scroll();
        } catch (HibernateException h) {
            throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, h);
        }

    }

    /**
     * Set the query inputs which will be used for query execution
     *
     */
    @Override
	public void setQueryInputs(QueryInputs queryInputs) throws HibernateSearchException {
        if (queryInputs == null) {
            throw new HibernateSearchException(HibernateConstants.SEARCH_INPUTNULL);
        }
        if (queryInputs.getBuildDTO()) {
            this.queryInputs = queryInputs;
            dtoBuilder = new DTOBuilder();
            dtoBuilder.setInputs(queryInputs);
            this.buildDTO = queryInputs.getBuildDTO();
        }

    }

    /**
     * Returns the requested set of search result objects based on the
     * pagination at the front end.
     *
     */
    @Override
	public List<Object> get(int position, int noOfObjects) throws HibernateSearchException {
        List<Object> returnList = new ArrayList<Object>();
        try {
            scrollResult.setRowNumber(position);
            returnList = new ArrayList<Object>();
            if (position < size) {
                if (buildDTO) {
                    returnList.add(buildDTO(scrollResult.get()));
                } else {
                    Object[] obj = scrollResult.get();
                    returnList.add(obj[0]);
                }
            }
            for (int i = 0; i < noOfObjects - 1; i++) {
                if (scrollResult.next()) {
                    if (buildDTO) {
                        returnList.add(buildDTO(scrollResult.get()));
                    } else {
                        Object[] obj = scrollResult.get();
                        returnList.add(obj[0]);
                    }
                }
            }
        } catch (Exception e) {
            throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, e);
        }
        return returnList;
    }

    /**
     * Returns the records valid for the query
     *
     */
    @Override
	public int getSize() throws HibernateSearchException {
        int lastRowNumber = 0;
        try {
            scrollResult.last();
            lastRowNumber = scrollResult.getRowNumber();
            scrollResult.first();
        } catch (Exception e) {

            throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, e);
        }
        size = lastRowNumber + 1;
        return size;
    }

    protected Object buildDTO(Object[] dtoData) throws HibernateSearchException {
        return dtoBuilder.buildDTO(dtoData);
    }
}

@@ -964,16 +964,46 @@
 esults;%0A
+import org.hibernate.Session;%0A
 import o
@@ -1732,16 +1732,62 @@
 false;%0A%0A
+    private Session hibernateSession = null;%0A%0A
     prot
@@ -3027,24 +3027,16 @@
 lic List
-%3CObject%3E
  get(int
@@ -3109,24 +3109,16 @@
     List
-%3CObject%3E
  returnL
@@ -3132,32 +3132,24 @@
 ew ArrayList
-%3CObject%3E
 ();%0A        
@@ -3203,16 +3203,16 @@
 ition);%0A
+
         
@@ -3245,16 +3245,8 @@
 List
-%3CObject%3E
 ();%0A

Revert "Eclipse auto-formating cleanup"