package me.test.first.spring.rs.http; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.util.Assert; public class SortBy implements Serializable { public static class Item implements Serializable { private static final long serialVersionUID = 1L; private static final Pattern p = Pattern.compile("\\s*[\\+-]?\\s*(\\S+)\\s*"); private String attribute; private boolean descending = false; public Item(String attribute, boolean descending) { this.attribute = attribute; this.descending = descending; } public static Item valueOf(String value) { Assert.notNull(value); Matcher matcher = p.matcher(value); Assert.isTrue(matcher.matches(), "Invalid sort item string"); boolean descending = value.trim().startsWith("-"); String attribute = matcher.group(1); return new Item(attribute, descending); } public String getAttribute() { return attribute; } public boolean isDescending() { return descending; } @Override public String toString() { String str = "+"; if (this.descending) { str = "-"; } return str + this.attribute; } } private static final long serialVersionUID = 1L; private final List<Item> items = new ArrayList<Item>(); public SortBy() { super(); } public SortBy(List<Item> items) { super(); this.items.addAll(items); } public static SortBy valueOf(String value) { Assert.notNull(value); String[] sortCols = value.split(","); List<Item> items = new ArrayList<Item>(); for (String sortCol : sortCols) { items.add(Item.valueOf(sortCol)); } return new SortBy(items); } @Override public String toString() { StringBuilder buf = new StringBuilder(); for (Item item : this.items) { buf.append(item.toString()); buf.append(","); } if (buf.length() > 1) { buf.setLength(buf.length() - 1); } return buf.toString(); } public List<Item> getItems() { return this.items; } public static void main(String[] args) { System.out.println(SortBy.valueOf(" +aa, -bb , + cc ").toString()); } }