/*
*
* Copyright c 2005-2009.
*
* Licensed under GNU LESSER General Public License, Version 3.
* http://www.gnu.org/licenses
*
*/
/********************************************************************************
* @author chaostone
*
* MODIFICATION DESCRIPTION
*
* Name Date Description
* ============ ============ ============
* chaostone 2006-8-16 Created
*
********************************************************************************/
package org.beanfuse.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
/**
* 排序
*/
public class Order {
public static final String ORDER_STR = "orderBy";
private String property;
private boolean ascending;
private boolean ignoreCase;
public Order() {
super();
}
public Order(String property, boolean ascending) {
this.property = property;
this.ascending = ascending;
}
public Order(String property) {
if (StringUtils.contains(property, ",")) {
throw new RuntimeException("user parser for multiorder");
}
if (StringUtils.contains(property, " desc")) {
this.ascending = false;
this.property = StringUtils.substringBefore(property, " desc");
} else {
if (StringUtils.contains(property, " asc")) {
this.property = StringUtils.substringBefore(property, " asc");
} else {
this.property = property;
}
this.ascending = true;
}
this.property = this.property.trim();
}
public String getProperty() {
return property;
}
public void setProperty(final String property) {
this.property = property;
}
public boolean isAscending() {
return ascending;
}
public void setAscending(boolean ascending) {
this.ascending = ascending;
}
public Order ignoreCase() {
ignoreCase = true;
return this;
}
public static Order asc(String property) {
return new Order(property, true);
}
public static Order desc(String property) {
return new Order(property, false);
}
public static String toSortString(final List<Order> orders) {
if (null == orders || orders.isEmpty()) {
return "";
}
final StringBuilder buf = new StringBuilder("order by ");
for (final Order order : orders) {
if (order.isAscending()) {
buf.append(order.getProperty()).append(',');
} else {
buf.append(order.getProperty()).append(" desc,");
}
}
return buf.substring(0, buf.length() - 1).toString();
}
public static List parse(final String orderString) {
if (StringUtils.isBlank(orderString)) {
return new ArrayList();
} else {
final List orders = new ArrayList();
final String[] orderStrs = StringUtils.split(orderString, ",");
for (int i = 0; i < orderStrs.length; i++) {
String order = orderStrs[i].trim();
if (StringUtils.isBlank(order)) {
continue;
}
order = order.toLowerCase().trim();
if (order.endsWith(" desc")) {
orders.add(new Order(orderStrs[i].substring(0, order.indexOf(" desc")), false));
} else if (order.endsWith(" asc")) {
orders.add(new Order(orderStrs[i].substring(0, order.indexOf(" asc")), true));
} else {
orders.add(new Order(orderStrs[i], true));
}
}
return orders;
}
}
public String toString() {
if (ignoreCase) {
return "lower(" + getProperty() + ") " + (ascending ? "asc" : "desc");
} else {
return getProperty() + " " + (ascending ? "asc" : "desc");
}
}
}