diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-09-03 15:18:54 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-09-03 15:26:35 +0200 |
| commit | c05dbd6fdf811a640b593b7dc0f6b894c9675120 (patch) | |
| tree | 212706b3ce4d08b5203a0fcbe4723b8b46252080 | |
| parent | 5891518ed2f0c0190bbe5719589ea70168b73ed2 (diff) | |
| download | cgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.zip cgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.tar.gz cgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.tar.bz2 | |
Parse GCVote as a stream
| -rw-r--r-- | main/src/cgeo/geocaching/gcvote/GCVote.java | 13 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/gcvote/GCVoteTest.java | 23 |
2 files changed, 26 insertions, 10 deletions
diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java index b3fdbf0..6c645e6 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVote.java +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -11,13 +11,14 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.io.Charsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; -import java.io.StringReader; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -84,18 +85,18 @@ public final class GCVote { } else { params.put("waypoints", StringUtils.join(geocodes, ',')); } - final String page = Network.getResponseData(Network.getRequest("http://gcvote.com/getVotes.php", params)); - if (page == null) { + final InputStream response = Network.getResponseStream(Network.getRequest("http://gcvote.com/getVotes.php", params)); + if (response == null) { return Collections.emptyMap(); } - return getRatingsFromXMLResponse(page, requestByGuids); + return getRatingsFromXMLResponse(response, requestByGuids); } - static Map<String, GCVoteRating> getRatingsFromXMLResponse(@NonNull final String page, final boolean requestByGuids) { + static Map<String, GCVoteRating> getRatingsFromXMLResponse(@NonNull final InputStream response, final boolean requestByGuids) { try { final XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); final XmlPullParser xpp = factory.newPullParser(); - xpp.setInput(new StringReader(page)); + xpp.setInput(response, Charsets.UTF_8.name()); boolean loggedIn = false; final Map<String, GCVoteRating> ratings = new HashMap<>(); int eventType = xpp.getEventType(); diff --git a/tests/src/cgeo/geocaching/gcvote/GCVoteTest.java b/tests/src/cgeo/geocaching/gcvote/GCVoteTest.java index 209810c..243fc99 100644 --- a/tests/src/cgeo/geocaching/gcvote/GCVoteTest.java +++ b/tests/src/cgeo/geocaching/gcvote/GCVoteTest.java @@ -10,6 +10,9 @@ import cgeo.geocaching.utils.MatcherWrapper; import org.apache.commons.lang3.StringUtils; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -18,22 +21,34 @@ import java.util.regex.Pattern; public class GCVoteTest extends AbstractResourceInstrumentationTestCase { private String response; + private InputStream responseStream; @Override protected void setUp() throws Exception { super.setUp(); response = getFileContent(R.raw.gcvote); + responseStream = new ByteArrayInputStream(response.getBytes()); + responseStream.mark(response.getBytes().length + 1); + } + + private InputStream responseStream() { + try { + responseStream.reset(); + } catch (final IOException ignored) { + // Cannot happen + } + return responseStream; } public void testGetRatingsByGeocode() { - final Map<String, GCVoteRating> ratings = GCVote.getRatingsFromXMLResponse(response, false); + final Map<String, GCVoteRating> ratings = GCVote.getRatingsFromXMLResponse(responseStream(), false); assertThat(ratings).hasSize(10); assertThat(ratings).containsKey("GCKF13"); assertThat(ratings.get("GC1WEVZ")).isEqualToComparingFieldByField(new GCVoteRating(3.75f, 2, 0)); } public void testGetRatingsByGuid() { - final Map<String, GCVoteRating> ratings = GCVote.getRatingsFromXMLResponse(response, true); + final Map<String, GCVoteRating> ratings = GCVote.getRatingsFromXMLResponse(responseStream(), true); assertThat(ratings).hasSize(10); assertThat(ratings).containsKey("a02894bb-4a08-4c09-a73c-25939894ba15"); assertThat(ratings.get("5520c33b-3941-45ca-9056-ea655dbaadf7")).isEqualToComparingFieldByField(new GCVoteRating(3.75f, 2, 0)); @@ -47,7 +62,7 @@ public class GCVoteTest extends AbstractResourceInstrumentationTestCase { public void testCompareResults() { for (int i = 0; i < 2; i++) { final boolean requestByGuids = i == 0; - final Map<String, GCVoteRating> xmlRatings = GCVote.getRatingsFromXMLResponse(response, requestByGuids); + final Map<String, GCVoteRating> xmlRatings = GCVote.getRatingsFromXMLResponse(responseStream(), requestByGuids); final Map<String, GCVoteRating> regexRatings = getRatingsRegex(response, requestByGuids); assertThat(xmlRatings.keySet()).containsExactlyElementsOf(regexRatings.keySet()); for (final Entry<String, GCVoteRating> entry: xmlRatings.entrySet()) { @@ -59,7 +74,7 @@ public class GCVoteTest extends AbstractResourceInstrumentationTestCase { private void benchmarkXML(final int occurrences) { final long start = System.currentTimeMillis(); for (int i = 0; i < occurrences; i++) { - GCVote.getRatingsFromXMLResponse(response, false); + GCVote.getRatingsFromXMLResponse(responseStream(), false); } Log.d("XML GCVote parsing (current) in ms (" + occurrences + " times): " + (System.currentTimeMillis() - start)); } |
