/**
 * 
 */
package org.apache.continuum.store.jpa;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import org.apache.continuum.store.api.Store;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;

/**
 * Base class for concrete {@link Store} implementations that provides service methods for Entity retrievals.
 * 
 * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
 * @version $Id$
 * @since 1.2
 */
public abstract class StoreSupport extends JpaDaoSupport
{

    /**
     * Prepares and executes a query using the 'where' criteria, a start index and a given range of results to return.
     * 
     * @param queryString
     * @param whereParams
     * @param startIndex
     * @param range
     * @return
     * @throws DataAccessException
     */
    protected List find( final String queryString, final Map<String, Object> whereParams, final int startIndex,
                         final int range ) throws DataAccessException
    {
        return getJpaTemplate().executeFind( new JpaCallback()
        {
            public Object doInJpa( EntityManager em ) throws PersistenceException
            {
                Query query = em.createQuery( queryString );
                if ( whereParams != null )
                {
                    for ( Iterator it = whereParams.entrySet().iterator(); it.hasNext(); )
                    {
                        Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
                        query.setParameter( entry.getKey(), entry.getValue() );
                    }
                }
                if ( startIndex > 0 )
                {
                    query.setFirstResult( startIndex );
                }
                if ( range > 0 )
                {
                    query.setMaxResults( range );
                }
                return query.getResultList();
            }
        } );
    }

}
