aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-09-03 15:18:54 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-09-03 15:26:35 +0200
commitc05dbd6fdf811a640b593b7dc0f6b894c9675120 (patch)
tree212706b3ce4d08b5203a0fcbe4723b8b46252080
parent5891518ed2f0c0190bbe5719589ea70168b73ed2 (diff)
downloadcgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.zip
cgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.tar.gz
cgeo-c05dbd6fdf811a640b593b7dc0f6b894c9675120.tar.bz2
Parse GCVote as a stream
-rw-r--r--main/src/cgeo/geocaching/gcvote/GCVote.java13
-rw-r--r--tests/src/cgeo/geocaching/gcvote/GCVoteTest.java23
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));
}