net.databinder.models.hib.CriteriaSorter.java Source code

Java tutorial

Introduction

Here is the source code for net.databinder.models.hib.CriteriaSorter.java

Source

package net.databinder.models.hib;

/*
 * Databinder: a simple bridge from Wicket to Hibernate
 * Copyright (C) 2006  Nathan Hamblen nathan@technically.us
    
 * This library 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 2.1 of the License, or (at your option) any later version.
 * 
 * This library 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 this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

import java.io.Serializable;

import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortStateLocator;
import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.hibernate.Criteria;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Order;

/**
 * <h1>CriteriaSorter</h1>
 * <i>Copyright (C) 2008 The Scripps Research Institute</i>
 * <p>A Criteria based sorter suitable for adding to a HibernateProvider</p> 
 *  * <pre>
 * // a default sort by name, ascending and case insensitive: 
 * CriteriaSorter sorter = new CriteriaSorter("name",true,false); 
 * IDataProvider provider = new DatabinderProvider(objectClass, criteriaBuilder, sorter);
 * </pre>
 * 
 * @author Mark Southern (southern at scripps dot edu)
 * @deprecated Use a subclass or OrderedCriteriaBuilder instead. It avoids problems with duplicate Aliases.
 */
@Deprecated
public class CriteriaSorter implements ISortStateLocator, CriteriaBuilder, Serializable {

    private SingleSortState sortState;

    private String defaultProperty = null;

    boolean asc, cased;

    public CriteriaSorter() {
        this(null, true, true);
    }

    public CriteriaSorter(String defaultProperty) {
        this(defaultProperty, true, true);
    }

    public CriteriaSorter(String defaultProperty, boolean asc) {
        this(defaultProperty, asc, true);
    }

    /**
     * @param defaultProperty - property for a default sort before any is set
     * @param asc - sort ascending/descending
     * @param cased - sort cased/case insensitive
     */
    public CriteriaSorter(String defaultProperty, boolean asc, boolean cased) {
        sortState = new SingleSortState();
        this.defaultProperty = defaultProperty;
        this.asc = asc;
        this.cased = cased;
    }

    public void build(Criteria criteria) {
        SortParam sort = sortState.getSort();
        String property;
        if (sort != null && sort.getProperty() != null) {
            property = sort.getProperty();
            asc = sort.isAscending();
        } else {
            property = defaultProperty;
        }
        if (property != null) {
            if (property.contains(".")) {
                // for 'dot' properties we need to add aliases
                // e.g. for the property 'orderbook.order.item.name' we need to add an aliases for 'order' and 'order.item'
                String path[] = property.split("\\.");
                for (int ii = 0; ii < path.length - 1; ii++) {
                    StringBuffer sb = new StringBuffer();
                    for (int jj = 0; jj <= ii; jj++) {
                        if (sb.length() > 0)
                            sb.append(".");
                        sb.append(path[jj]);
                    }
                    criteria.createAlias(sb.toString(), path[ii], CriteriaSpecification.LEFT_JOIN);
                }
                // when we have a 'dot' property we want to sort by the sub tables field
                // e.g. for the property 'orderbook.order.item.name' we need to sort by 'item.name'
                if (path.length > 1)
                    property = String.format("%s.%s", path[path.length - 2], path[path.length - 1]);
                else
                    property = path[path.length - 1];
            }
            Order order = asc ? Order.asc(property) : Order.desc(property);
            order = cased ? order : order.ignoreCase();
            criteria.addOrder(order);
        }
    }

    public ISortState getSortState() {
        return sortState;
    }

    public void setSortState(ISortState state) {
        sortState = (SingleSortState) state;
    }
}