diff options
17 files changed, 36 insertions, 76 deletions
diff --git a/main/src/cgeo/geocaching/sorting/AbstractCacheComparator.java b/main/src/cgeo/geocaching/sorting/AbstractCacheComparator.java index a1c04a4..6515ce5 100644 --- a/main/src/cgeo/geocaching/sorting/AbstractCacheComparator.java +++ b/main/src/cgeo/geocaching/sorting/AbstractCacheComparator.java @@ -3,6 +3,7 @@ package cgeo.geocaching.sorting; import cgeo.geocaching.Geocache; import cgeo.geocaching.utils.Log; +import org.apache.commons.lang3.StringUtils; /** * abstract super implementation for all cache comparators @@ -13,25 +14,35 @@ public abstract class AbstractCacheComparator implements CacheComparator { @Override public final int compare(final Geocache cache1, final Geocache cache2) { try { - // first check that we have all necessary data for the comparison - if (!canCompare(cache1, cache2)) { - return 0; + final boolean canCompare1 = canCompare(cache1); + final boolean canCompare2 = canCompare(cache2); + if (!canCompare1) { + return canCompare2 ? 1 : fallbackToGeocode(cache1, cache2); } - return compareCaches(cache1, cache2); - } catch (Exception e) { + return canCompare2 ? compareCaches(cache1, cache2) : -1; + } catch (final Exception e) { Log.e("AbstractCacheComparator.compare", e); + // This may violate the Comparator interface if the exception is not systematic. + return fallbackToGeocode(cache1, cache2); } - return 0; + } + + private static int fallbackToGeocode(final Geocache cache1, final Geocache cache2) { + return StringUtils.defaultString(cache1.getGeocode()).compareToIgnoreCase(StringUtils.defaultString(cache2.getGeocode())); } /** - * Check necessary preconditions (like missing fields) before running the comparison itself + * Check necessary preconditions (like missing fields) before running the comparison itself. + * Caches not filling the conditions will be placed last, sorted by Geocode. * - * @param cache1 - * @param cache2 - * @return + * The default returns <code>true</code> and can be overriden if needed in child classes. + * + * @param cache + * @return <code>true</code> if the cache holds the necessary data to be compared meaningfully */ - protected abstract boolean canCompare(final Geocache cache1, final Geocache cache2); + protected boolean canCompare(final Geocache cache) { + return true; + } /** * Compares two caches. Logging and exception handling is implemented outside this method already. diff --git a/main/src/cgeo/geocaching/sorting/DateComparator.java b/main/src/cgeo/geocaching/sorting/DateComparator.java index 091f6a4..76ee955 100644 --- a/main/src/cgeo/geocaching/sorting/DateComparator.java +++ b/main/src/cgeo/geocaching/sorting/DateComparator.java @@ -12,11 +12,6 @@ import java.util.Date; public class DateComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return true; - } - - @Override protected int compareCaches(Geocache cache1, Geocache cache2) { final Date date1 = cache1.getHiddenDate(); final Date date2 = cache2.getHiddenDate(); diff --git a/main/src/cgeo/geocaching/sorting/DifficultyComparator.java b/main/src/cgeo/geocaching/sorting/DifficultyComparator.java index 73d12fa..459f38d 100644 --- a/main/src/cgeo/geocaching/sorting/DifficultyComparator.java +++ b/main/src/cgeo/geocaching/sorting/DifficultyComparator.java @@ -9,8 +9,8 @@ import cgeo.geocaching.Geocache; public class DifficultyComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return cache1.getDifficulty() != 0.0 && cache2.getDifficulty() != 0.0; + protected boolean canCompare(Geocache cache) { + return cache.getDifficulty() != 0.0; } @Override diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java index 731e356..541ce48 100644 --- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java +++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java @@ -36,11 +36,6 @@ public class DistanceComparator extends AbstractCacheComparator { } @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { calculateAllDistances(); final Float distance1 = cache1.getDistance(); diff --git a/main/src/cgeo/geocaching/sorting/FindsComparator.java b/main/src/cgeo/geocaching/sorting/FindsComparator.java index c889776..7f2ef50 100644 --- a/main/src/cgeo/geocaching/sorting/FindsComparator.java +++ b/main/src/cgeo/geocaching/sorting/FindsComparator.java @@ -5,8 +5,8 @@ import cgeo.geocaching.Geocache; public class FindsComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return cache1.getLogCounts() != null && cache2.getLogCounts() != null; + protected boolean canCompare(Geocache cache) { + return cache.getLogCounts() != null; } @Override diff --git a/main/src/cgeo/geocaching/sorting/GeocodeComparator.java b/main/src/cgeo/geocaching/sorting/GeocodeComparator.java index fff26c6..60c25ad 100644 --- a/main/src/cgeo/geocaching/sorting/GeocodeComparator.java +++ b/main/src/cgeo/geocaching/sorting/GeocodeComparator.java @@ -11,14 +11,13 @@ import org.apache.commons.lang3.StringUtils; public class GeocodeComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return StringUtils.isNotBlank(cache1.getGeocode()) - && StringUtils.isNotBlank(cache2.getGeocode()); + protected boolean canCompare(final Geocache cache) { + // This will fallback to geocode comparisons. + return false; } @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { - final int lengthDiff = cache1.getGeocode().length() - cache2.getGeocode().length(); - return lengthDiff != 0 ? lengthDiff : cache1.getGeocode().compareToIgnoreCase(cache2.getGeocode()); + throw new RuntimeException("should never be called"); } } diff --git a/main/src/cgeo/geocaching/sorting/InventoryComparator.java b/main/src/cgeo/geocaching/sorting/InventoryComparator.java index 73ea2c5..9d19b64 100644 --- a/main/src/cgeo/geocaching/sorting/InventoryComparator.java +++ b/main/src/cgeo/geocaching/sorting/InventoryComparator.java @@ -8,11 +8,6 @@ import cgeo.geocaching.Geocache; public class InventoryComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { return cache2.getInventoryItems() - cache1.getInventoryItems(); } diff --git a/main/src/cgeo/geocaching/sorting/NameComparator.java b/main/src/cgeo/geocaching/sorting/NameComparator.java index b432ad0..2941b1c 100644 --- a/main/src/cgeo/geocaching/sorting/NameComparator.java +++ b/main/src/cgeo/geocaching/sorting/NameComparator.java @@ -11,8 +11,8 @@ import org.apache.commons.lang3.StringUtils; public class NameComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return StringUtils.isNotBlank(cache1.getName()) && StringUtils.isNotBlank(cache2.getName()); + protected boolean canCompare(Geocache cache) { + return StringUtils.isNotBlank(cache.getName()); } @Override diff --git a/main/src/cgeo/geocaching/sorting/PopularityComparator.java b/main/src/cgeo/geocaching/sorting/PopularityComparator.java index e256654..2dbee68 100644 --- a/main/src/cgeo/geocaching/sorting/PopularityComparator.java +++ b/main/src/cgeo/geocaching/sorting/PopularityComparator.java @@ -9,11 +9,6 @@ import cgeo.geocaching.Geocache; public class PopularityComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { return cache2.getFavoritePoints() - cache1.getFavoritePoints(); } diff --git a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java index f438762..1ed8e68 100644 --- a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java +++ b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java @@ -11,11 +11,6 @@ import cgeo.geocaching.Geocache; public class PopularityRatioComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { float ratio1 = 0.0f; diff --git a/main/src/cgeo/geocaching/sorting/RatingComparator.java b/main/src/cgeo/geocaching/sorting/RatingComparator.java index 72cf6c8..6f2c615 100644 --- a/main/src/cgeo/geocaching/sorting/RatingComparator.java +++ b/main/src/cgeo/geocaching/sorting/RatingComparator.java @@ -9,11 +9,6 @@ import cgeo.geocaching.Geocache; public class RatingComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { final float rating1 = cache1.getRating(); final float rating2 = cache2.getRating(); diff --git a/main/src/cgeo/geocaching/sorting/SizeComparator.java b/main/src/cgeo/geocaching/sorting/SizeComparator.java index d128822..c8de586 100644 --- a/main/src/cgeo/geocaching/sorting/SizeComparator.java +++ b/main/src/cgeo/geocaching/sorting/SizeComparator.java @@ -9,8 +9,8 @@ import cgeo.geocaching.Geocache; public class SizeComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return cache1.getSize() != null && cache2.getSize() != null; + protected boolean canCompare(Geocache cache) { + return cache.getSize() != null; } @Override diff --git a/main/src/cgeo/geocaching/sorting/StateComparator.java b/main/src/cgeo/geocaching/sorting/StateComparator.java index b99c3c0..9488bd9 100644 --- a/main/src/cgeo/geocaching/sorting/StateComparator.java +++ b/main/src/cgeo/geocaching/sorting/StateComparator.java @@ -9,11 +9,6 @@ import cgeo.geocaching.Geocache; public class StateComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { return getState(cache1) - getState(cache2); } diff --git a/main/src/cgeo/geocaching/sorting/StorageTimeComparator.java b/main/src/cgeo/geocaching/sorting/StorageTimeComparator.java index 78ba742..b718d3b 100644 --- a/main/src/cgeo/geocaching/sorting/StorageTimeComparator.java +++ b/main/src/cgeo/geocaching/sorting/StorageTimeComparator.java @@ -5,11 +5,6 @@ import cgeo.geocaching.Geocache; public class StorageTimeComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return true; - } - - @Override protected int compareCaches(Geocache cache1, Geocache cache2) { if (cache1.getUpdated() < cache2.getUpdated()) { return -1; diff --git a/main/src/cgeo/geocaching/sorting/TerrainComparator.java b/main/src/cgeo/geocaching/sorting/TerrainComparator.java index be1e9bb..9bbb5f7 100644 --- a/main/src/cgeo/geocaching/sorting/TerrainComparator.java +++ b/main/src/cgeo/geocaching/sorting/TerrainComparator.java @@ -9,8 +9,8 @@ import cgeo.geocaching.Geocache; public class TerrainComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return cache1.getTerrain() != 0.0 && cache2.getTerrain() != 0.0; + protected boolean canCompare(final Geocache cache) { + return cache.getTerrain() != 0.0; } @Override diff --git a/main/src/cgeo/geocaching/sorting/VisitComparator.java b/main/src/cgeo/geocaching/sorting/VisitComparator.java index 27d3170..1589a4c 100644 --- a/main/src/cgeo/geocaching/sorting/VisitComparator.java +++ b/main/src/cgeo/geocaching/sorting/VisitComparator.java @@ -9,11 +9,6 @@ import cgeo.geocaching.Geocache; public class VisitComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(final Geocache cache1, final Geocache cache2) { - return true; - } - - @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { return Long.valueOf(cache2.getVisitedDate()).compareTo(cache1.getVisitedDate()); } diff --git a/main/src/cgeo/geocaching/sorting/VoteComparator.java b/main/src/cgeo/geocaching/sorting/VoteComparator.java index dc0304b..cd4ad7e 100644 --- a/main/src/cgeo/geocaching/sorting/VoteComparator.java +++ b/main/src/cgeo/geocaching/sorting/VoteComparator.java @@ -8,11 +8,6 @@ import cgeo.geocaching.Geocache; public class VoteComparator extends AbstractCacheComparator { @Override - protected boolean canCompare(Geocache cache1, Geocache cache2) { - return true; - } - - @Override protected int compareCaches(Geocache cache1, Geocache cache2) { // if there is no vote available, put that cache at the end of the list return Float.compare(cache2.getMyVote(), cache1.getMyVote()); |
