package io.ebeaninternal.util; import io.ebeaninternal.util.SortByClause.Property; public final class SortByClauseParser { private final String rawSortBy; public static SortByClause parse(String rawSortByClause) { return new SortByClauseParser(rawSortByClause).parse(); } private SortByClauseParser(String rawSortByClause) { this.rawSortBy = rawSortByClause.trim(); } private SortByClause parse() { SortByClause sortBy = new SortByClause(); String[] sections = rawSortBy.split(","); for (String section : sections) { Property p = parseSection(section.trim()); if (p == null) { break; } else { sortBy.add(p); } } return sortBy; } private Property parseSection(String section) { if (section.isEmpty()) { return null; } String[] words = section.split(" "); if (words.length < 1 || words.length > 3) { throw new RuntimeException("Expecting 1 to 3 words in [" + section + "] but got [" + words.length + "]"); } Boolean nullsHigh = null; boolean ascending = true; String propName = words[0]; if (words.length > 1) { if (words[1].startsWith("nulls")) { nullsHigh = isNullsHigh(words[1]); } else { ascending = isAscending(words[1]); } } if (words.length > 2) { if (words[2].startsWith("nulls")) { nullsHigh = isNullsHigh(words[2]); } else { ascending = isAscending(words[2]); } } return new Property(propName, ascending, nullsHigh); } private Boolean isNullsHigh(String word) { if (SortByClause.NULLSHIGH.equalsIgnoreCase(word)) { return Boolean.TRUE; } if (SortByClause.NULLSLOW.equalsIgnoreCase(word)) { return Boolean.FALSE; } String m = "Expecting nullsHigh or nullsLow but got [" + word + "] in [" + rawSortBy + "]"; throw new RuntimeException(m); } private boolean isAscending(String word) { if (SortByClause.ASC.equalsIgnoreCase(word)) { return true; } if (SortByClause.DESC.equalsIgnoreCase(word)) { return false; } String m = "Expect ASC or DESC but got [" + word + "] in [" + rawSortBy + "]"; throw new RuntimeException(m); } }