/* * Copyright 2010, Andrew M Gibson * * www.andygibson.net * * This file is part of DataValve. * * DataValve is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DataValve is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * * You should have received a copy of the GNU Lesser General Public License * along with DataValve. If not, see <http://www.gnu.org/licenses/>. * */ package org.fluttercode.datavalve.provider; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.List; import org.fluttercode.datavalve.DataProvider; import org.fluttercode.datavalve.Paginator; /** * Abstract class that implements the {@link DataProvider} interface. The fetch * methods from this interface are implemented and in turn call other methods * that can be overriden. * <p/> * This class also introduces the {@link AbstractDataProvider#doPreFetch()} * method that is called before either the results or the result count is * fetched. This lets you prep any state on the provider prior to execution (for * example, setting up restrictions). * <p/> * Subclasses to this class implement the data provider interface for a specific * data access mechanism by overriding the * {@link AbstractDataProvider#doFetchResults(Paginator)} and the * {@link AbstractDataProvider#doFetchResultCount()} methods to return the data * and the total count of available results. * <p/> * Developers using those * * @author Andy Gibson * */ /** * @author Andy Gibson * * @param <T> */ public abstract class AbstractDataProvider<T> implements DataProvider<T>, Serializable { private static final long serialVersionUID = 1L; private Class<?> entityClass; public Class<?> getEntityClass() { if (entityClass == null) { ParameterizedType type = (ParameterizedType) getClass() .getGenericSuperclass(); entityClass = (Class<?>) type.getActualTypeArguments()[0]; } return entityClass; } public Integer fetchResultCount() { doPreFetch(); return doPostFetchResultCount(doFetchResultCount()); } protected Integer doPostFetchResultCount(Integer resultCount) { return resultCount; } public List<T> fetchResults(Paginator paginator) { doPreFetch(); return doPostFetchResults(doFetchResults(paginator), paginator); } /** * Provides a hook to examine the result list prior to returning them back * to the user. By default, this method just returns the list of results * passed in. * * @param results * List of results * @param paginator * paginator that was used to fetch the results * @return the list of results to be sent back to the user. */ protected List<T> doPostFetchResults(List<T> results, Paginator paginator) { return results; } /** * Gives developers in subclasses the opportunity to alter the provider * state prior to querying for data. This is called before the result count * and result list fetches are executed. * <p/> * For example, you could alter parameter values or query restrictions prior * to each fetch.By default, this method does nothing. */ protected void doPreFetch() { } /** * Fetches the results for the provider. Override this method in subclasses * to implement different data providers. To perform additional processing * prior to the fetch, override the * {@link AbstractDataProvider#doPreFetch()} method. * * @param paginator * Pagination info for the results to be returned * @return List of result objects */ protected abstract List<T> doFetchResults(Paginator paginator); /** * Fetches the number of results available. Override this method in * subclasses to implements different provider implementations. To perform * additional processing prior to the fetch override the * {@link AbstractDataProvider#doPreFetch()} method. * * @return The number of results */ protected abstract Integer doFetchResultCount(); }