package org.limewire.ui.swing.search.model; import java.util.Comparator; public abstract class SimilarResultsGroupingComparator implements Comparator<VisualSearchResult> { @Override public int compare(VisualSearchResult o1, VisualSearchResult o2) { VisualSearchResult parent1 = o1.getSimilarityParent(); VisualSearchResult parent2 = o2.getSimilarityParent(); if (parent1 == o2) { return 1; } if (parent2 == o1) { return -1; } parent1 = parent1 == null ? o1 : parent1; parent2 = parent2 == null ? o2 : parent2; boolean spam1 = o1.isSpam(); boolean spam2 = o2.isSpam(); // spam should go to the bottom of the list int compare = Boolean.valueOf(spam1).compareTo(Boolean.valueOf(spam2)); if(compare == 0) { boolean library1 = o1.getDownloadState() == BasicDownloadState.LIBRARY; boolean library2 = o2.getDownloadState() == BasicDownloadState.LIBRARY; compare = Boolean.valueOf(library1).compareTo(Boolean.valueOf(library2)); } if(compare == 0) { boolean preDownload1 = o1.isPreExistingDownload(); boolean preDownload2 = o2.isPreExistingDownload(); compare = Boolean.valueOf(preDownload1).compareTo(Boolean.valueOf(preDownload2)); } if (compare == 0) { // if both match, try our comparison algorithm compare = doCompare(parent1, parent2); } if (compare == 0 && parent1 != parent2) { // if both still match, and have differant parents, sort by the // parents identity hashcode compare = Integer.valueOf(System.identityHashCode(parent1)).compareTo( Integer.valueOf(System.identityHashCode(parent2))); } return compare; } /** * Secondary comparison as defined by criteria determined in subclasses. * * @param o1 * @param o2 * @return */ protected abstract int doCompare(VisualSearchResult o1, VisualSearchResult o2); }