package com.robonobo.gui.model; import static com.robonobo.common.util.TextUtil.isNonEmpty; import java.util.Comparator; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.robonobo.core.api.model.Stream; /** * Defines default order for streams. Sorted first by artist, then album, then track number, then title, then stream id */ public class StreamComparator implements Comparator<Stream> { protected static Pattern trackNumPat = Pattern.compile("^(\\d+)"); public StreamComparator() { } public int compare(Stream s1, Stream s2) { int result = compareByArtist(s1, s2); if(result != 0) return result; result = compareByAlbum(s1, s2); if(result != 0) return result; result = compareByTrackNum(s1, s2); if(result != 0) return result; result = compareByTitle(s1, s2); if(result != 0) return result; return compareByStreamId(s1, s2); } private static int compareByArtist(Stream s1, Stream s2) { return compareStrings(s1.artist, s2.artist); } private static int compareByAlbum(Stream s1, Stream s2) { return compareStrings(s1.album, s2.album); } private static int compareByTitle(Stream s1, Stream s2) { return compareStrings(s1.title, s2.title); } private static int compareByStreamId(Stream s1, Stream s2) { return compareStrings(s1.streamId, s2.streamId); } private static int compareStrings(String s1, String s2) { if(isNonEmpty(s1)) { if(isNonEmpty(s2)) return s1.compareTo(s2); else return 1; } else { if(isNonEmpty(s2)) return -1; else return 0; } } private static int compareByTrackNum(Stream s1, Stream s2) { return (s1.track - s2.track); } }