diff options
Diffstat (limited to 'main/src/cgeo/geocaching/files/LocParser.java')
| -rw-r--r-- | main/src/cgeo/geocaching/files/LocParser.java | 141 |
1 files changed, 70 insertions, 71 deletions
diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java index 029d049..b17b203 100644 --- a/main/src/cgeo/geocaching/files/LocParser.java +++ b/main/src/cgeo/geocaching/files/LocParser.java @@ -1,21 +1,17 @@ package cgeo.geocaching.files; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; import cgeo.geocaching.cgCache; -import cgeo.geocaching.cgCoord; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.GeopointParser; import cgeo.geocaching.utils.CancellableHandler; +import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; -import android.util.Log; - import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -30,6 +26,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public final class LocParser extends FileParser { + private static final Pattern patternGeocode = Pattern .compile("name id=\"([^\"]+)\""); private static final Pattern patternLat = Pattern @@ -45,10 +42,21 @@ public final class LocParser extends FileParser { .compile("<container>([^<]+)</container>"); private static final Pattern patternName = Pattern.compile("CDATA\\[([^\\]]+)\\]"); + private static final CacheSize[] SIZES = { + CacheSize.NOT_CHOSEN, // 1 + CacheSize.MICRO, // 2 + CacheSize.REGULAR, // 3 + CacheSize.LARGE, // 4 + CacheSize.VIRTUAL, // 5 + CacheSize.OTHER, // 6 + CacheSize.UNKNOWN, // 7 + CacheSize.SMALL, // 8 + }; + private int listId; public static void parseLoc(final SearchResult searchResult, final String fileContent) { - final Map<String, cgCoord> cidCoords = parseCoordinates(fileContent); + final Map<String, cgCache> cidCoords = parseCoordinates(fileContent); // save found cache coordinates final HashSet<String> contained = new HashSet<String>(); @@ -59,12 +67,12 @@ public final class LocParser extends FileParser { } Set<cgCache> caches = cgeoapplication.getInstance().loadCaches(contained, LoadFlags.LOAD_CACHE_OR_DB); for (cgCache cache : caches) { - cgCoord coord = cidCoords.get(cache.getGeocode()); + cgCache coord = cidCoords.get(cache.getGeocode()); copyCoordToCache(coord, cache); } } - private static void copyCoordToCache(final cgCoord coord, final cgCache cache) { + private static void copyCoordToCache(final cgCache coord, final cgCache cache) { cache.setCoords(coord.getCoords()); cache.setDifficulty(coord.getDifficulty()); cache.setTerrain(coord.getTerrain()); @@ -76,9 +84,8 @@ public final class LocParser extends FileParser { } } - static Map<String, cgCoord> parseCoordinates( - final String fileContent) { - final Map<String, cgCoord> coords = new HashMap<String, cgCoord>(); + static Map<String, cgCache> parseCoordinates(final String fileContent) { + final Map<String, cgCache> coords = new HashMap<String, cgCache>(); if (StringUtils.isBlank(fileContent)) { return coords; } @@ -88,76 +95,25 @@ public final class LocParser extends FileParser { // parse coordinates for (String pointString : points) { - final cgCoord pointCoord = new cgCoord(); - - final Matcher matcherGeocode = patternGeocode.matcher(pointString); - if (matcherGeocode.find()) { - String geocode = matcherGeocode.group(1).trim().toUpperCase(); - pointCoord.setName(geocode); - pointCoord.setGeocode(geocode); - } - final Matcher matcherName = patternName.matcher(pointString); - if (matcherName.find()) { - String name = matcherName.group(1).trim(); - pointCoord.setName(StringUtils.substringBeforeLast(name, " by ").trim()); - // owner = StringUtils.substringAfterLast(" by ").trim(); - } - final Matcher matcherLat = patternLat.matcher(pointString); - final Matcher matcherLon = patternLon.matcher(pointString); - if (matcherLat.find() && matcherLon.find()) { - pointCoord.setCoords(parsePoint(matcherLat.group(1).trim(), matcherLon.group(1).trim())); - } - final Matcher matcherDifficulty = patternDifficulty.matcher(pointString); - if (matcherDifficulty.find()) { - pointCoord.setDifficulty(Float.parseFloat(matcherDifficulty.group(1).trim())); - } - final Matcher matcherTerrain = patternTerrain.matcher(pointString); - if (matcherTerrain.find()) { - pointCoord.setTerrain(Float.parseFloat(matcherTerrain.group(1).trim())); - } - final Matcher matcherContainer = patternContainer.matcher(pointString); - if (matcherContainer.find()) { - final int size = Integer.parseInt(matcherContainer.group(1) - .trim()); - - if (size == 1) { - pointCoord.setSize(CacheSize.NOT_CHOSEN); - } else if (size == 2) { - pointCoord.setSize(CacheSize.MICRO); - } else if (size == 3) { - pointCoord.setSize(CacheSize.REGULAR); - } else if (size == 4) { - pointCoord.setSize(CacheSize.LARGE); - } else if (size == 5) { - pointCoord.setSize(CacheSize.VIRTUAL); - } else if (size == 6) { - pointCoord.setSize(CacheSize.OTHER); - } else if (size == 8) { - pointCoord.setSize(CacheSize.SMALL); - } else { - pointCoord.setSize(CacheSize.UNKNOWN); - } - } - + final cgCache pointCoord = parseCache(pointString); if (StringUtils.isNotBlank(pointCoord.getGeocode())) { coords.put(pointCoord.getGeocode(), pointCoord); } } - Log.i(Settings.tag, - "Coordinates found in .loc file: " + coords.size()); + Log.i("Coordinates found in .loc file: " + coords.size()); return coords; } - private static Geopoint parsePoint(String latitude, String longitude) { + public static Geopoint parsePoint(final String latitude, final String longitude) { // the loc file contains the coordinates as plain floating point values, therefore avoid using the GeopointParser try { return new Geopoint(Double.valueOf(latitude), Double.valueOf(longitude)); } catch (NumberFormatException e) { - Log.e(Settings.tag, "LOC format has changed"); + Log.e("LOC format has changed"); } // fall back to parser, just in case the format changes - return GeopointParser.parse(latitude, longitude); + return new Geopoint(latitude, longitude); } public LocParser(int listId) { @@ -168,10 +124,10 @@ public final class LocParser extends FileParser { public Collection<cgCache> parse(InputStream stream, CancellableHandler progressHandler) throws IOException, ParserException { // TODO: progress reporting happens during reading stream only, not during parsing String streamContent = readStream(stream, progressHandler).toString(); - final Map<String, cgCoord> coords = parseCoordinates(streamContent); + final Map<String, cgCache> coords = parseCoordinates(streamContent); final List<cgCache> caches = new ArrayList<cgCache>(); - for (Entry<String, cgCoord> entry : coords.entrySet()) { - cgCoord coord = entry.getValue(); + for (Entry<String, cgCache> entry : coords.entrySet()) { + cgCache coord = entry.getValue(); if (StringUtils.isBlank(coord.getGeocode()) || StringUtils.isBlank(coord.getName())) { continue; } @@ -185,7 +141,50 @@ public final class LocParser extends FileParser { cache.setListId(listId); cache.setDetailed(true); } - Log.i(Settings.tag, "Caches found in .loc file: " + caches.size()); + Log.i("Caches found in .loc file: " + caches.size()); return caches; } + + public static cgCache parseCache(final String pointString) { + final cgCache cache = new cgCache(); + final Matcher matcherGeocode = patternGeocode.matcher(pointString); + if (matcherGeocode.find()) { + final String geocode = matcherGeocode.group(1).trim().toUpperCase(); + cache.setGeocode(geocode.toUpperCase()); + } + + final Matcher matcherName = patternName.matcher(pointString); + if (matcherName.find()) { + final String name = matcherName.group(1).trim(); + cache.setName(StringUtils.substringBeforeLast(name, " by ").trim()); + } else { + cache.setName(cache.getGeocode()); + } + + final Matcher matcherLat = patternLat.matcher(pointString); + final Matcher matcherLon = patternLon.matcher(pointString); + if (matcherLat.find() && matcherLon.find()) { + cache.setCoords(parsePoint(matcherLat.group(1).trim(), matcherLon.group(1).trim())); + } + + final Matcher matcherDifficulty = patternDifficulty.matcher(pointString); + if (matcherDifficulty.find()) { + cache.setDifficulty(Float.parseFloat(matcherDifficulty.group(1).trim())); + } + + final Matcher matcherTerrain = patternTerrain.matcher(pointString); + if (matcherTerrain.find()) { + cache.setTerrain(Float.parseFloat(matcherTerrain.group(1).trim())); + } + + final Matcher matcherContainer = patternContainer.matcher(pointString); + if (matcherContainer.find()) { + final int size = Integer.parseInt(matcherContainer.group(1).trim()); + if (size >= 1 && size <= 8) { + cache.setSize(SIZES[size - 1]); + } + } + + return cache; + } } |
