com.ponysdk.hibernate.query.PaginatingCriteria.java Source code

Java tutorial

Introduction

Here is the source code for com.ponysdk.hibernate.query.PaginatingCriteria.java

Source

/*
 * Copyright (c) 2011 PonySDK
 *  Ownersimport java.util.HashMap;
import java.util.List;
import java.util.Map;
    
import com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.PaintContext.CacheMode;
import com.vaadin.terminal.gwt.server.AbstractCommunicationManager.Session;
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.
 */

package com.ponysdk.hibernate.query;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.CacheMode;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.transform.ResultTransformer;

public class PaginatingCriteria<T> implements OrderingCriteria {

    private final Criteria mainCriteria;

    private final Criteria cloneCriteria;

    private Map<String, OrderingCriteria> subCriteriaByAlias = new HashMap<String, OrderingCriteria>();

    public PaginatingCriteria(final Session session, final Class<T> persistentClass) {
        this.mainCriteria = session.createCriteria(persistentClass);
        this.mainCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

        this.cloneCriteria = session.createCriteria(persistentClass);
        this.cloneCriteria.setProjection(Projections.rowCount());
        this.cloneCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    }

    private PaginatingCriteria(final Criteria mainCriteria, final Criteria clonedCriteria,
            final Map<String, OrderingCriteria> subCriteriaByAlias) {
        this.mainCriteria = mainCriteria;
        this.cloneCriteria = clonedCriteria;
        this.subCriteriaByAlias = subCriteriaByAlias;
    }

    @Override
    public String getAlias() {
        return mainCriteria.getAlias();
    }

    @Override
    public OrderingCriteria setProjection(final Projection projection) {
        mainCriteria.setProjection(projection);
        return this;
    }

    @Override
    public OrderingCriteria add(final Criterion criterion) {
        cloneCriteria.add(criterion);
        mainCriteria.add(criterion);
        return this;
    }

    @Override
    public OrderingCriteria addOrder(final Order order) {
        mainCriteria.addOrder(order);
        return this;
    }

    @Override
    public OrderingCriteria setFetchMode(final String associationPath, final FetchMode mode)
            throws HibernateException {
        cloneCriteria.setFetchMode(associationPath, mode);
        mainCriteria.setFetchMode(associationPath, mode);
        return this;
    }

    @Override
    public OrderingCriteria setLockMode(final LockMode lockMode) {
        mainCriteria.setLockMode(lockMode);
        return this;
    }

    @Override
    public OrderingCriteria setLockMode(final String alias, final LockMode lockMode) {
        mainCriteria.setLockMode(alias, lockMode);
        cloneCriteria.setLockMode(alias, lockMode);
        return this;
    }

    @Override
    public OrderingCriteria createAlias(final String associationPath, final String alias)
            throws HibernateException {
        final OrderingCriteria orderingCriteria = subCriteriaByAlias.get(alias);
        if (orderingCriteria != null)
            return orderingCriteria;
        mainCriteria.createAlias(associationPath, alias);
        cloneCriteria.createAlias(associationPath, alias);
        subCriteriaByAlias.put(alias, this);
        return this;
    }

    @Override
    public OrderingCriteria createAlias(final String arg0, final String arg1, final int arg2)
            throws HibernateException {
        final OrderingCriteria orderingCriteria = subCriteriaByAlias.get(arg1);
        if (orderingCriteria != null)
            return orderingCriteria;
        mainCriteria.createAlias(arg0, arg1, arg2);
        cloneCriteria.createAlias(arg0, arg1, arg2);
        subCriteriaByAlias.put(arg1, this);
        return this;
    }

    @Override
    public OrderingCriteria createCriteria(final String associationPath) throws HibernateException {
        return new PaginatingCriteria<T>(mainCriteria.createCriteria(associationPath),
                cloneCriteria.createCriteria(associationPath), subCriteriaByAlias);
    }

    @Override
    public OrderingCriteria createCriteria(final String arg0, final int arg1) throws HibernateException {
        return new PaginatingCriteria<T>(mainCriteria.createCriteria(arg0, arg1),
                cloneCriteria.createCriteria(arg0, arg1), subCriteriaByAlias);
    }

    @Override
    public OrderingCriteria createCriteria(final String associationPath, final String alias)
            throws HibernateException {
        mainCriteria.createCriteria(associationPath, alias);
        cloneCriteria.createCriteria(associationPath, alias);
        return this;
    }

    @Override
    public OrderingCriteria createCriteria(final String arg0, final String arg1, final int arg2)
            throws HibernateException {

        OrderingCriteria orderingCriteria = subCriteriaByAlias.get(arg1);
        if (orderingCriteria == null) {
            orderingCriteria = new PaginatingCriteria<T>(mainCriteria.createCriteria(arg0, arg1, arg2),
                    cloneCriteria.createCriteria(arg0, arg1, arg2), subCriteriaByAlias);
            subCriteriaByAlias.put(arg1, orderingCriteria);
        }
        return orderingCriteria;
    }

    @Override
    public OrderingCriteria setResultTransformer(final ResultTransformer resultTransformer) {
        mainCriteria.setResultTransformer(resultTransformer);
        cloneCriteria.setResultTransformer(resultTransformer);
        return this;
    }

    @Override
    public OrderingCriteria setMaxResults(final int maxResults) {
        mainCriteria.setMaxResults(maxResults);
        return this;
    }

    @Override
    public OrderingCriteria setFirstResult(final int firstResult) {
        mainCriteria.setFirstResult(firstResult);
        return this;
    }

    @Override
    public OrderingCriteria setFetchSize(final int fetchSize) {
        mainCriteria.setFetchSize(fetchSize);
        return this;
    }

    @Override
    public OrderingCriteria setTimeout(final int timeout) {
        mainCriteria.setTimeout(timeout);
        return this;
    }

    @Override
    public OrderingCriteria setCacheable(final boolean cacheable) {
        mainCriteria.setCacheable(cacheable);
        return this;
    }

    @Override
    public OrderingCriteria setCacheRegion(final String cacheRegion) {
        mainCriteria.setCacheRegion(cacheRegion);
        return this;
    }

    @Override
    public OrderingCriteria setComment(final String comment) {
        cloneCriteria.setComment(comment);
        return this;
    }

    @Override
    public OrderingCriteria setFlushMode(final FlushMode flushMode) {
        mainCriteria.setFlushMode(flushMode);
        return this;
    }

    @Override
    public OrderingCriteria setCacheMode(final CacheMode cacheMode) {
        mainCriteria.setCacheMode(cacheMode);
        return this;
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> list() throws HibernateException {
        mainCriteria.setResultTransformer(DISTINCT_ROOT_ENTITY);
        return mainCriteria.list();
    }

    @Override
    public ScrollableResults scroll() throws HibernateException {
        return mainCriteria.scroll();
    }

    @Override
    public ScrollableResults scroll(final ScrollMode scrollMode) throws HibernateException {
        return mainCriteria.scroll(scrollMode);
    }

    @SuppressWarnings("unchecked")
    @Override
    public T uniqueResult() throws HibernateException {
        mainCriteria.setResultTransformer(DISTINCT_ROOT_ENTITY);
        return (T) mainCriteria.uniqueResult();
    }

    @Override
    public int count() throws HibernateException {
        cloneCriteria.setResultTransformer(DISTINCT_ROOT_ENTITY);
        final Long count = (Long) cloneCriteria.uniqueResult();
        return count == null ? 0 : count.intValue();
    }

    @Override
    public Criteria createAlias(final String arg0, final String arg1, final int arg2, final Criterion arg3)
            throws HibernateException {
        mainCriteria.createAlias(arg0, arg1, arg2, arg3);
        cloneCriteria.createAlias(arg0, arg1, arg2, arg3);
        return this;
    }

    @Override
    public Criteria createCriteria(final String arg0, final String arg1, final int arg2, final Criterion arg3)
            throws HibernateException {
        mainCriteria.createCriteria(arg0, arg1, arg2, arg3);
        cloneCriteria.createCriteria(arg0, arg1, arg2, arg3);
        return this;
    }

    @Override
    public boolean isReadOnly() {
        return mainCriteria.isReadOnly();
    }

    @Override
    public boolean isReadOnlyInitialized() {
        return mainCriteria.isReadOnlyInitialized();
    }

    @Override
    public Criteria setReadOnly(final boolean arg0) {
        return mainCriteria.setReadOnly(arg0);
    }
}