aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/files/LocParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/files/LocParser.java')
-rw-r--r--main/src/cgeo/geocaching/files/LocParser.java141
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;
+ }
}