diff options
| -rw-r--r-- | main/src/cgeo/geocaching/files/GPXParser.java | 156 | ||||
| -rw-r--r-- | tests/res/raw/gc3t1xg_gsak.gpx | 2 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/files/GPXParserTest.java | 20 |
3 files changed, 105 insertions, 73 deletions
diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java index 8c7a853..f5380be 100644 --- a/main/src/cgeo/geocaching/files/GPXParser.java +++ b/main/src/cgeo/geocaching/files/GPXParser.java @@ -500,73 +500,9 @@ public abstract class GPXParser extends FileParser { // for GPX 1.1 from extensions node final Element cacheParent = getCacheParent(waypoint); - // GSAK extensions - for (final String gsakNamespace : GSAK_NS) { - final Element gsak = cacheParent.getChild(gsakNamespace, "wptExtension"); - gsak.getChild(gsakNamespace, "Watch").setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(String watchList) { - cache.setOnWatchlist(Boolean.valueOf(watchList.trim())); - } - }); - - gsak.getChild(gsakNamespace, "UserData").setEndTextElementListener(new UserDataListener(1)); - - for (int i = 2; i <= 4; i++) { - gsak.getChild(gsakNamespace, "User" + i).setEndTextElementListener(new UserDataListener(i)); - } - - gsak.getChild(gsakNamespace, "Parent").setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(String body) { - parentCacheCode = body; - } - }); + registerGsakExtensions(cacheParent); - gsak.getChild(gsakNamespace, "FavPoints").setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(String favoritePoints) { - try { - cache.setFavoritePoints(Integer.parseInt(favoritePoints)); - } - catch (final NumberFormatException e) { - Log.w("Failed to parse favorite points", e); - } - } - }); - - gsak.getChild(gsakNamespace, "GcNote").setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(final String personalNote) { - cache.setPersonalNote(StringUtils.trim(personalNote)); - } - }); - } - - // c:geo extensions - final Element cgeoVisited = cacheParent.getChild(CGEO_NS, "visited"); - - cgeoVisited.setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(String visited) { - wptVisited = Boolean.valueOf(visited.trim()); - } - }); - - final Element cgeoUserDefined = cacheParent.getChild(CGEO_NS, "userdefined"); - - cgeoUserDefined.setEndTextElementListener(new EndTextElementListener() { - - @Override - public void end(String userDefined) { - wptUserDefined = Boolean.valueOf(userDefined.trim()); - } - }); + registerCgeoExtensions(cacheParent); // 3 different versions of the GC schema for (final String nsGC : GROUNDSPEAK_NAMESPACE) { @@ -878,6 +814,94 @@ public abstract class GPXParser extends FileParser { } /** + * Add listeners for GSAK extensions + * + * @param cacheParent + */ + private void registerGsakExtensions(final Element cacheParent) { + for (final String gsakNamespace : GSAK_NS) { + final Element gsak = cacheParent.getChild(gsakNamespace, "wptExtension"); + gsak.getChild(gsakNamespace, "Watch").setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(String watchList) { + cache.setOnWatchlist(Boolean.valueOf(watchList.trim())); + } + }); + + gsak.getChild(gsakNamespace, "UserData").setEndTextElementListener(new UserDataListener(1)); + + for (int i = 2; i <= 4; i++) { + gsak.getChild(gsakNamespace, "User" + i).setEndTextElementListener(new UserDataListener(i)); + } + + gsak.getChild(gsakNamespace, "Parent").setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(String body) { + parentCacheCode = body; + } + }); + + gsak.getChild(gsakNamespace, "FavPoints").setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(String favoritePoints) { + try { + cache.setFavoritePoints(Integer.parseInt(favoritePoints)); + } + catch (final NumberFormatException e) { + Log.w("Failed to parse favorite points", e); + } + } + }); + + gsak.getChild(gsakNamespace, "GcNote").setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(final String personalNote) { + cache.setPersonalNote(StringUtils.trim(personalNote)); + } + }); + + gsak.getChild(gsakNamespace, "IsPremium").setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(final String premium) { + cache.setPremiumMembersOnly(Boolean.parseBoolean(premium)); + } + }); + } + } + + /** + * Add listeners for c:geo extensions + * + * @param cacheParent + */ + private void registerCgeoExtensions(final Element cacheParent) { + final Element cgeoVisited = cacheParent.getChild(CGEO_NS, "visited"); + + cgeoVisited.setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(String visited) { + wptVisited = Boolean.valueOf(visited.trim()); + } + }); + + final Element cgeoUserDefined = cacheParent.getChild(CGEO_NS, "userdefined"); + + cgeoUserDefined.setEndTextElementListener(new EndTextElementListener() { + + @Override + public void end(String userDefined) { + wptUserDefined = Boolean.valueOf(userDefined.trim()); + } + }); + } + + /** * Overwrite this method in a GPX parser sub class to modify the {@link Geocache}, after it has been fully parsed * from the GPX file and before it gets stored. * diff --git a/tests/res/raw/gc3t1xg_gsak.gpx b/tests/res/raw/gc3t1xg_gsak.gpx index 3c09a97..ebb5ca5 100644 --- a/tests/res/raw/gc3t1xg_gsak.gpx +++ b/tests/res/raw/gc3t1xg_gsak.gpx @@ -34,7 +34,7 @@ xmlns="http://www.topografix.com/GPX/1/0"> <gsak:LastGpxDate>2014-01-26</gsak:LastGpxDate> <gsak:Code>GC3T1XG</gsak:Code> <gsak:Resolution></gsak:Resolution> - <gsak:IsPremium>false</gsak:IsPremium> + <gsak:IsPremium>true</gsak:IsPremium> <gsak:FavPoints>258</gsak:FavPoints> <gsak:GcNote>Personal Note Test</gsak:GcNote> <gsak:Guid>d09416d5-dba9-4347-86a6-12f7b5ef2fff</gsak:Guid> diff --git a/tests/src/cgeo/geocaching/files/GPXParserTest.java b/tests/src/cgeo/geocaching/files/GPXParserTest.java index d8c49c3..9297819 100644 --- a/tests/src/cgeo/geocaching/files/GPXParserTest.java +++ b/tests/src/cgeo/geocaching/files/GPXParserTest.java @@ -325,19 +325,27 @@ public class GPXParserTest extends AbstractResourceInstrumentationTestCase { assertEquals("Wasserleitung", cache.getHint()); } - public void testGsakFavPoints() throws IOException, ParserException { - final List<Geocache> caches = readGPX10(R.raw.gc3t1xg_gsak); + private Geocache getFirstCache(int gpxResourceId) throws IOException, ParserException { + final List<Geocache> caches = readGPX10(gpxResourceId); + assertNotNull(caches); assertEquals(1, caches.size()); final Geocache cache = caches.get(0); + return cache; + } + + public void testGsakFavPoints() throws IOException, ParserException { + final Geocache cache = getFirstCache(R.raw.gc3t1xg_gsak); assertEquals(258, cache.getFavoritePoints()); } public void testGsakPersonalNote() throws IOException, ParserException { - final List<Geocache> caches = readGPX10(R.raw.gc3t1xg_gsak); - assertNotNull(caches); - assertEquals(1, caches.size()); - final Geocache cache = caches.get(0); + final Geocache cache = getFirstCache(R.raw.gc3t1xg_gsak); assertEquals("Personal Note Test", cache.getPersonalNote()); } + public void testGsakPremium() throws IOException, ParserException { + final Geocache cache = getFirstCache(R.raw.gc3t1xg_gsak); + assertTrue(cache.isPremiumMembersOnly()); + } + } |
