From 2d9773fa90cba4bafff3bd71b9b7d3baaaff4766 Mon Sep 17 00:00:00 2001 From: Bananeweizen Date: Tue, 15 Nov 2011 19:46:46 +0100 Subject: refactor GCVote ratings, move into own package --- main/src/cgeo/geocaching/GCVote.java | 188 --------------------- main/src/cgeo/geocaching/VisitCacheActivity.java | 1 + main/src/cgeo/geocaching/cgBase.java | 24 +-- main/src/cgeo/geocaching/cgRating.java | 7 - main/src/cgeo/geocaching/cgeopopup.java | 10 +- main/src/cgeo/geocaching/gcvote/GCVote.java | 195 ++++++++++++++++++++++ main/src/cgeo/geocaching/gcvote/GCVoteRating.java | 25 +++ 7 files changed, 240 insertions(+), 210 deletions(-) delete mode 100644 main/src/cgeo/geocaching/GCVote.java delete mode 100644 main/src/cgeo/geocaching/cgRating.java create mode 100644 main/src/cgeo/geocaching/gcvote/GCVote.java create mode 100644 main/src/cgeo/geocaching/gcvote/GCVoteRating.java (limited to 'main/src') diff --git a/main/src/cgeo/geocaching/GCVote.java b/main/src/cgeo/geocaching/GCVote.java deleted file mode 100644 index f136aa9..0000000 --- a/main/src/cgeo/geocaching/GCVote.java +++ /dev/null @@ -1,188 +0,0 @@ -package cgeo.geocaching; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; - -import android.util.Log; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class GCVote { - private static final Pattern patternLogIn = Pattern.compile("loggedIn='([^']+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternGuid = Pattern.compile("cacheId='([^']+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternRating = Pattern.compile("voteAvg='([0-9.]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVotes = Pattern.compile("voteCnt='([0-9]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVote = Pattern.compile("voteUser='([0-9.]+)'", Pattern.CASE_INSENSITIVE); - private static final Pattern patternVoteElement = Pattern.compile("]+)>", Pattern.CASE_INSENSITIVE); - - public static cgRating getRating(String guid, String geocode) { - List guids = null; - List geocodes = null; - - if (StringUtils.isNotBlank(guid)) { - guids = new ArrayList(); - guids.add(guid); - } else if (StringUtils.isNotBlank(geocode)) { - geocodes = new ArrayList(); - geocodes.add(geocode); - } else { - return null; - } - - final Map ratings = getRating(guids, geocodes); - if (ratings != null) { - for (Entry entry : ratings.entrySet()) { - return entry.getValue(); - } - } - - return null; - } - - public static Map getRating(List guids, List geocodes) { - if (guids == null && geocodes == null) { - return null; - } - - final Map ratings = new HashMap(); - - try { - final Parameters params = new Parameters(); - if (Settings.isLogin()) { - final ImmutablePair login = Settings.getGCvoteLogin(); - if (login != null) { - params.put("userName", login.left, "password", login.right); - } - } - if (CollectionUtils.isNotEmpty(guids)) { - params.put("cacheIds", StringUtils.join(guids.toArray(), ',')); - } else { - params.put("waypoints", StringUtils.join(geocodes.toArray(), ',')); - } - params.put("version", "cgeo"); - final String votes = cgBase.getResponseData(cgBase.request("http://gcvote.com/getVotes.php", params, false, false, false)); - if (votes == null) { - return null; - } - - String voteData = null; - final Matcher matcherVoteElement = patternVoteElement.matcher(votes); - while (matcherVoteElement.find()) { - if (matcherVoteElement.groupCount() > 0) { - voteData = matcherVoteElement.group(1); - } - - if (voteData == null) { - continue; - } - - String guid = null; - cgRating rating = new cgRating(); - boolean loggedIn = false; - - try { - final Matcher matcherGuid = patternGuid.matcher(voteData); - if (matcherGuid.find()) { - if (matcherGuid.groupCount() > 0) { - guid = matcherGuid.group(1); - } - } - } catch (Exception e) { - Log.w(Settings.tag, "cgBase.getRating: Failed to parse guid"); - } - - try { - final Matcher matcherLoggedIn = patternLogIn.matcher(votes); - if (matcherLoggedIn.find()) { - if (matcherLoggedIn.groupCount() > 0) { - if (matcherLoggedIn.group(1).equalsIgnoreCase("true")) { - loggedIn = true; - } - } - } - } catch (Exception e) { - Log.w(Settings.tag, "cgBase.getRating: Failed to parse loggedIn"); - } - - try { - final Matcher matcherRating = patternRating.matcher(voteData); - if (matcherRating.find()) { - if (matcherRating.groupCount() > 0) { - rating.rating = Float.parseFloat(matcherRating.group(1)); - } - } - } catch (Exception e) { - Log.w(Settings.tag, "cgBase.getRating: Failed to parse rating"); - } - - try { - final Matcher matcherVotes = patternVotes.matcher(voteData); - if (matcherVotes.find()) { - if (matcherVotes.groupCount() > 0) { - rating.votes = Integer.parseInt(matcherVotes.group(1)); - } - } - } catch (Exception e) { - Log.w(Settings.tag, "cgBase.getRating: Failed to parse vote count"); - } - - if (loggedIn) { - try { - final Matcher matcherVote = patternVote.matcher(voteData); - if (matcherVote.find()) { - if (matcherVote.groupCount() > 0) { - rating.myVote = Float.parseFloat(matcherVote.group(1)); - } - } - } catch (Exception e) { - Log.w(Settings.tag, "cgBase.getRating: Failed to parse user's vote"); - } - } - - if (StringUtils.isNotBlank(guid)) { - ratings.put(guid, rating); - } - } - } catch (Exception e) { - Log.e(Settings.tag, "cgBase.getRating: " + e.toString()); - } - - return ratings; - } - - public static boolean setRating(cgCache cache, double vote) { - if (!cache.supportsGCVote()) { - return false; - } - String guid = cache.getGuid(); - if (StringUtils.isBlank(guid)) { - return false; - } - if (vote <= 0.0 || vote > 5.0) { - return false; - } - - final ImmutablePair login = Settings.getGCvoteLogin(); - if (login == null) { - return false; - } - - final Parameters params = new Parameters( - "userName", login.left, - "password", login.right, - "cacheId", guid, - "voteUser", String.format("%.1f", vote).replace(',', '.'), - "version", "cgeo"); - - final String result = cgBase.getResponseData(cgBase.request("http://gcvote.com/setVote.php", params, false, false, false)); - - return result.trim().equalsIgnoreCase("ok"); - } -} diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java index 022209f..c93eb1f 100644 --- a/main/src/cgeo/geocaching/VisitCacheActivity.java +++ b/main/src/cgeo/geocaching/VisitCacheActivity.java @@ -3,6 +3,7 @@ package cgeo.geocaching; import cgeo.geocaching.LogTemplateProvider.LogTemplate; import cgeo.geocaching.enumerations.LogTypeTrackable; import cgeo.geocaching.enumerations.StatusCode; +import cgeo.geocaching.gcvote.GCVote; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java index 8470f2a..5e41083 100644 --- a/main/src/cgeo/geocaching/cgBase.java +++ b/main/src/cgeo/geocaching/cgBase.java @@ -9,6 +9,8 @@ import cgeo.geocaching.enumerations.LogTypeTrackable; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.files.LocParser; +import cgeo.geocaching.gcvote.GCVote; +import cgeo.geocaching.gcvote.GCVoteRating; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter.Format; @@ -903,17 +905,17 @@ public class cgBase { Log.i(Settings.tag, "Trying to get ratings for " + cids.size() + " caches"); try { - final Map ratings = GCVote.getRating(guids, null); + final Map ratings = GCVote.getRating(guids, null); if (MapUtils.isNotEmpty(ratings)) { // save found cache coordinates - for (cgCache oneCache : caches.cacheList) { - if (ratings.containsKey(oneCache.getGuid())) { - cgRating thisRating = ratings.get(oneCache.getGuid()); + for (cgCache cache : caches.cacheList) { + if (ratings.containsKey(cache.getGuid())) { + GCVoteRating rating = ratings.get(cache.getGuid()); - oneCache.setRating(thisRating.rating); - oneCache.setVotes(thisRating.votes); - oneCache.setMyVote(thisRating.myVote); + cache.setRating(rating.getRating()); + cache.setVotes(rating.getVotes()); + cache.setMyVote(rating.getMyVote()); } } } @@ -1476,11 +1478,11 @@ public class cgBase { return; } sendLoadProgressDetail(handler, R.string.cache_dialog_loading_details_status_gcvote); - final cgRating rating = GCVote.getRating(cache.getGuid(), cache.getGeocode()); + final GCVoteRating rating = GCVote.getRating(cache.getGuid(), cache.getGeocode()); if (rating != null) { - cache.setRating(rating.rating); - cache.setVotes(rating.votes); - cache.setMyVote(rating.myVote); + cache.setRating(rating.getRating()); + cache.setVotes(rating.getVotes()); + cache.setMyVote(rating.getMyVote()); } } } diff --git a/main/src/cgeo/geocaching/cgRating.java b/main/src/cgeo/geocaching/cgRating.java deleted file mode 100644 index f0c7a76..0000000 --- a/main/src/cgeo/geocaching/cgRating.java +++ /dev/null @@ -1,7 +0,0 @@ -package cgeo.geocaching; - -public class cgRating { - public Float rating = null; - public Integer votes = null; - public Float myVote = null; -} diff --git a/main/src/cgeo/geocaching/cgeopopup.java b/main/src/cgeo/geocaching/cgeopopup.java index 1f270a7..e8d4d19 100644 --- a/main/src/cgeo/geocaching/cgeopopup.java +++ b/main/src/cgeo/geocaching/cgeopopup.java @@ -3,6 +3,8 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.gcvote.GCVote; +import cgeo.geocaching.gcvote.GCVoteRating; import cgeo.geocaching.utils.CancellableHandler; import org.apache.commons.lang3.StringUtils; @@ -367,17 +369,17 @@ public class cgeopopup extends AbstractActivity { @Override public void run() { - cgRating rating = GCVote.getRating(cache.getGuid(), geocode); + GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode); Message msg = new Message(); Bundle bundle = new Bundle(); - if (rating == null || rating.rating == null) { + if (rating == null) { return; } - bundle.putFloat("rating", rating.rating); - bundle.putInt("votes", rating.votes); + bundle.putFloat("rating", rating.getRating()); + bundle.putInt("votes", rating.getVotes()); msg.setData(bundle); ratingHandler.sendMessage(msg); diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java new file mode 100644 index 0000000..7dec3f9 --- /dev/null +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -0,0 +1,195 @@ +package cgeo.geocaching.gcvote; + +import cgeo.geocaching.Parameters; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgBase; +import cgeo.geocaching.cgCache; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; + +import android.util.Log; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class GCVote { + private static final Pattern patternLogIn = Pattern.compile("loggedIn='([^']+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern patternGuid = Pattern.compile("cacheId='([^']+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern patternRating = Pattern.compile("voteAvg='([0-9.]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern patternVotes = Pattern.compile("voteCnt='([0-9]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern patternVote = Pattern.compile("voteUser='([0-9.]+)'", Pattern.CASE_INSENSITIVE); + private static final Pattern patternVoteElement = Pattern.compile("]+)>", Pattern.CASE_INSENSITIVE); + + public static GCVoteRating getRating(String guid, String geocode) { + List guids = null; + List geocodes = null; + + if (StringUtils.isNotBlank(guid)) { + guids = new ArrayList(); + guids.add(guid); + } else if (StringUtils.isNotBlank(geocode)) { + geocodes = new ArrayList(); + geocodes.add(geocode); + } else { + return null; + } + + final Map ratings = getRating(guids, geocodes); + if (ratings != null) { + for (Entry entry : ratings.entrySet()) { + return entry.getValue(); + } + } + + return null; + } + + public static Map getRating(List guids, List geocodes) { + if (guids == null && geocodes == null) { + return null; + } + + final Map ratings = new HashMap(); + + try { + final Parameters params = new Parameters(); + if (Settings.isLogin()) { + final ImmutablePair login = Settings.getGCvoteLogin(); + if (login != null) { + params.put("userName", login.left, "password", login.right); + } + } + if (CollectionUtils.isNotEmpty(guids)) { + params.put("cacheIds", StringUtils.join(guids.toArray(), ',')); + } else { + params.put("waypoints", StringUtils.join(geocodes.toArray(), ',')); + } + params.put("version", "cgeo"); + final String page = cgBase.getResponseData(cgBase.request("http://gcvote.com/getVotes.php", params, false, false, false)); + if (page == null) { + return null; + } + + String voteData = null; + final Matcher matcherVoteElement = patternVoteElement.matcher(page); + while (matcherVoteElement.find()) { + voteData = matcherVoteElement.group(1); + if (voteData == null) { + continue; + } + + String guid = null; + try { + final Matcher matcherGuid = patternGuid.matcher(voteData); + if (matcherGuid.find()) { + if (matcherGuid.groupCount() > 0) { + guid = matcherGuid.group(1); + } + } + } catch (Exception e) { + Log.w(Settings.tag, "cgBase.getRating: Failed to parse guid"); + } + if (guid == null) { + continue; + } + + boolean loggedIn = false; + try { + final Matcher matcherLoggedIn = patternLogIn.matcher(page); + if (matcherLoggedIn.find()) { + if (matcherLoggedIn.groupCount() > 0) { + if (matcherLoggedIn.group(1).equalsIgnoreCase("true")) { + loggedIn = true; + } + } + } + } catch (Exception e) { + Log.w(Settings.tag, "cgBase.getRating: Failed to parse loggedIn"); + } + + float rating = 0; + try { + final Matcher matcherRating = patternRating.matcher(voteData); + if (matcherRating.find()) { + rating = Float.parseFloat(matcherRating.group(1)); + } + } catch (Exception e) { + Log.w(Settings.tag, "cgBase.getRating: Failed to parse rating"); + } + if (rating <= 0) { + continue; + } + + int votes = -1; + try { + final Matcher matcherVotes = patternVotes.matcher(voteData); + if (matcherVotes.find()) { + votes = Integer.parseInt(matcherVotes.group(1)); + } + } catch (Exception e) { + Log.w(Settings.tag, "cgBase.getRating: Failed to parse vote count"); + } + if (votes < 0) { + continue; + } + + Float myVote = null; + if (loggedIn) { + try { + final Matcher matcherVote = patternVote.matcher(voteData); + if (matcherVote.find()) { + myVote = Float.parseFloat(matcherVote.group(1)); + } + } catch (Exception e) { + Log.w(Settings.tag, "cgBase.getRating: Failed to parse user's vote"); + } + } + + if (StringUtils.isNotBlank(guid)) { + GCVoteRating gcvoteRating = new GCVoteRating(rating, votes, myVote); + ratings.put(guid, gcvoteRating); + } + } + } catch (Exception e) { + Log.e(Settings.tag, "cgBase.getRating: " + e.toString()); + } + + return ratings; + } + + public static boolean setRating(cgCache cache, double vote) { + if (!cache.supportsGCVote()) { + return false; + } + String guid = cache.getGuid(); + if (StringUtils.isBlank(guid)) { + return false; + } + if (vote <= 0.0 || vote > 5.0) { + return false; + } + + final ImmutablePair login = Settings.getGCvoteLogin(); + if (login == null) { + return false; + } + + final Parameters params = new Parameters( + "userName", login.left, + "password", login.right, + "cacheId", guid, + "voteUser", String.format("%.1f", vote).replace(',', '.'), + "version", "cgeo"); + + final String result = cgBase.getResponseData(cgBase.request("http://gcvote.com/setVote.php", params, false, false, false)); + + return result.trim().equalsIgnoreCase("ok"); + } +} diff --git a/main/src/cgeo/geocaching/gcvote/GCVoteRating.java b/main/src/cgeo/geocaching/gcvote/GCVoteRating.java new file mode 100644 index 0000000..ce70e10 --- /dev/null +++ b/main/src/cgeo/geocaching/gcvote/GCVoteRating.java @@ -0,0 +1,25 @@ +package cgeo.geocaching.gcvote; + +public final class GCVoteRating { + private final float rating; + private final int votes; + private final Float myVote; + + public GCVoteRating(float rating, int votes, Float myVote) { + this.rating = rating; + this.votes = votes; + this.myVote = myVote; + } + + public float getRating() { + return rating; + } + + public int getVotes() { + return votes; + } + + public Float getMyVote() { + return myVote; + } +} -- cgit v1.1