/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.model; import org.candlepin.util.ElementTransformer; import org.hibernate.Session; import org.hibernate.criterion.Order; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import javax.persistence.LockModeType; /** * The EmptyCandlepinQuery class represents a CandlepinQuery that is not backed by an actual * criteria, and, thus, has no values. This can be used in cases where input validation or state * checks determine the query can't be run, but still provide consistent output to the caller. * * @param <T> * The entity type to be returned by this criteria's result output methods */ public class EmptyCandlepinQuery<T> implements CandlepinQuery<T> { /** * Empty version of the ResultIterator class */ private static final ResultIterator EMPTY_RESULT_ITERATOR = new ResultIterator() { @Override public boolean hasNext() { return false; } @Override public Object next() { throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void close() { // Intentionally left empty } }; /** * Creates a new EmptyCandlepinQuery instance. */ public EmptyCandlepinQuery() { // Intentionally left empty } /** * Returns a reference to this CandlepinQuery instance. * * @param session * * @return * this query instance */ @Override public CandlepinQuery useSession(Session session) { return this; } /** * Returns a reference to this CandlepinQuery instance. * * @param offset * * @return * this query instance */ @Override public CandlepinQuery<T> setFirstResult(int offset) { return this; } /** * Returns a reference to this CandlepinQuery instance. * * @param limit * * @return * this query instance */ @Override public CandlepinQuery<T> setMaxResults(int limit) { return this; } /** * Returns a reference to this CandlepinQuery instance. * * @param order * * @return * this query instance */ @Override public CandlepinQuery<T> addOrder(Order order) { return this; } /** * Returns a reference to this CandlepinQuery instance. * * @param lockMode * * @return * this query instance */ @Override public CandlepinQuery<T> setLockMode(LockModeType lockMode) { return this; } /** * Returns a reference to this CandlepinQuery instance. * * @param transformer * * @return * this query instance */ @Override public <O> CandlepinQuery<O> transform(ElementTransformer<T, O> transformer) { return (CandlepinQuery<O>) this; } /** * Returns an empty list. * * @return * an empty list */ @Override public List<T> list() { return Collections.<T>emptyList(); } /** * Immediately returns zero without invoking any of the given processor's methods. * * @return * zero */ @Override public int forEach(ResultProcessor<T> processor) { return 0; } /** * Immediately returns zero without invoking any of the given processor's methods. * * @param column * * @return * zero */ @Override public int forEach(int column, ResultProcessor<T> processor) { return 0; } /** * Immediately returns zero without invoking any of the given processor's methods. * * @param column * @param evict * * @return * zero */ @Override public int forEach(int column, boolean evict, ResultProcessor<T> processor) { return 0; } /** * Immediately returns zero without invoking any of the given processor's methods. * * @return * zero */ @Override public int forEachRow(ResultProcessor<Object[]> processor) { return 0; } /** * Always returns an iterator with no elements. * * @return * a ResultIterator containing no elements */ @Override public ResultIterator<T> iterate() { return (ResultIterator<T>) EMPTY_RESULT_ITERATOR; } /** * Always returns an iterator with no elements. * * @return * a ResultIterator containing no elements */ @Override public ResultIterator<T> iterator() { return (ResultIterator<T>) EMPTY_RESULT_ITERATOR; } /** * Always returns an iterator with no elements. * * @param column * * @return * a ResultIterator containing no elements */ public ResultIterator<T> iterate(int column) { return (ResultIterator<T>) EMPTY_RESULT_ITERATOR; } /** * Always returns an iterator with no elements. * * @param column * @param evict * * @return * a ResultIterator containing no elements */ @Override public ResultIterator<T> iterate(int column, boolean evict) { return (ResultIterator<T>) EMPTY_RESULT_ITERATOR; } /** * Always returns an iterator with no elements. * * @return * A ResultIterator containing no elements */ @Override public ResultIterator<Object[]> iterateByRow() { return (ResultIterator<Object[]>) EMPTY_RESULT_ITERATOR; } /** * Always returns null. * * @return * null */ @Override public T uniqueResult() { return null; } /** * Always returns zero. * * @return * zero */ @Override public int getRowCount() { return 0; } }