diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-02-28 22:16:38 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-02-28 22:16:38 +0100 |
| commit | 3b84568a8c300c6993928c5e8dfe5d038f94ce10 (patch) | |
| tree | d87ac3442462a15321fc3f6a49c3ff913d2d1b4a /main/src | |
| parent | 2f8702fb5f2529a05ab239b480fbfd9afc0bed27 (diff) | |
| parent | 8df3d95d50180e8130342684afadb5d8d95616ac (diff) | |
| download | cgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.zip cgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.tar.gz cgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.tar.bz2 | |
Merge branch 'release' into upstream
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/Geocache.java | 54 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Waypoint.java | 62 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/Geopoint.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/GeopointParser.java | 8 |
4 files changed, 74 insertions, 54 deletions
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index bac4600..79b4425 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -57,7 +57,6 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; @@ -1371,58 +1370,11 @@ public class Geocache implements ICache, IWaypoint { * Detect coordinates in the personal note and convert them to user defined waypoints. Works by rule of thumb. */ public void parseWaypointsFromNote() { - try { - if (StringUtils.isBlank(getPersonalNote())) { - return; - } - final Pattern coordPattern = Pattern.compile("\\b[nNsS]{1}\\s*\\d"); // begin of coordinates - int count = 1; - String note = getPersonalNote(); - MatcherWrapper matcher = new MatcherWrapper(coordPattern, note); - while (matcher.find()) { - try { - final Geopoint point = new Geopoint(note.substring(matcher.start())); - // Coords must have non zero latitude and longitude, at least one part shall have fractional degrees, - // and there must exist no waypoint with the same coordinates already. - if (point.getLatitudeE6() != 0 && point.getLongitudeE6() != 0 && - ((point.getLatitudeE6() % 1000) != 0 || (point.getLongitudeE6() % 1000) != 0) && - !hasIdenticalWaypoint(point)) { - final String name = CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " " + count; - final String potentialWaypointType = note.substring(Math.max(0, matcher.start() - 15)); - final Waypoint waypoint = new Waypoint(name, parseWaypointType(potentialWaypointType), false); - waypoint.setCoords(point); - addOrChangeWaypoint(waypoint, false); - count++; - } - } catch (final Geopoint.ParseException e) { - // ignore - } - - note = note.substring(matcher.start() + 1); - matcher = new MatcherWrapper(coordPattern, note); - } - } catch (final Exception e) { - Log.e("Geocache.parseWaypointsFromNote", e); - } - } - - /** - * Detect waypoint types in the personal note text. It works by rule of thumb only. - */ - private static WaypointType parseWaypointType(final String input) { - final String lowerInput = StringUtils.substring(input, 0, 20).toLowerCase(Locale.getDefault()); - for (final WaypointType wpType : WaypointType.values()) { - if (lowerInput.contains(wpType.getL10n().toLowerCase(Locale.getDefault()))) { - return wpType; - } - if (lowerInput.contains(wpType.id)) { - return wpType; - } - if (lowerInput.contains(wpType.name().toLowerCase(Locale.US))) { - return wpType; + for (final Waypoint waypoint : Waypoint.parseWaypointsFromNote(StringUtils.defaultString(getPersonalNote()))) { + if (!hasIdenticalWaypoint(waypoint.getCoords())) { + addOrChangeWaypoint(waypoint, false); } } - return WaypointType.WAYPOINT; } private boolean hasIdenticalWaypoint(final Geopoint point) { diff --git a/main/src/cgeo/geocaching/Waypoint.java b/main/src/cgeo/geocaching/Waypoint.java index 47977bc..efedff5 100644 --- a/main/src/cgeo/geocaching/Waypoint.java +++ b/main/src/cgeo/geocaching/Waypoint.java @@ -3,14 +3,19 @@ package cgeo.geocaching; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.utils.MatcherWrapper; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; +import java.util.Collection; import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.regex.Pattern; public class Waypoint implements IWaypoint { @@ -285,4 +290,61 @@ public class Waypoint implements IWaypoint { return gpxId; } + + /** + * Detect coordinates in the personal note and convert them to user defined waypoints. Works by rule of thumb. + * + * @param initialNote Note content + * @return a collection of found waypoints + */ + public static Collection<Waypoint> parseWaypointsFromNote(@NonNull final String initialNote) { + final List<Waypoint> waypoints = new LinkedList<Waypoint>(); + final Pattern COORDPATTERN = Pattern.compile("\\b[nNsS]{1}\\s*\\d"); // begin of coordinates + + String note = initialNote; + MatcherWrapper matcher = new MatcherWrapper(COORDPATTERN, note); + int count = 1; + while (matcher.find()) { + try { + final Geopoint point = new Geopoint(note.substring(matcher.start())); + // Coords must have non zero latitude and longitude and at least one part shall have fractional degrees. + if (point.getLatitudeE6() != 0 && point.getLongitudeE6() != 0 && + ((point.getLatitudeE6() % 1000) != 0 || (point.getLongitudeE6() % 1000) != 0)) { + final String name = CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " " + count; + final String potentialWaypointType = note.substring(Math.max(0, matcher.start() - 15)); + final Waypoint waypoint = new Waypoint(name, parseWaypointType(potentialWaypointType), false); + waypoint.setCoords(point); + waypoints.add(waypoint); + count++; + } + } catch (final Geopoint.ParseException e) { + // ignore + } + + note = note.substring(matcher.start() + 1); + matcher = new MatcherWrapper(COORDPATTERN, note); + } + return waypoints; + } + + /** + * Detect waypoint types in the personal note text. It works by rule of thumb only. + */ + private static WaypointType parseWaypointType(final String input) { + final String lowerInput = StringUtils.substring(input, 0, 20).toLowerCase(Locale.getDefault()); + for (final WaypointType wpType : WaypointType.values()) { + if (lowerInput.contains(wpType.getL10n().toLowerCase(Locale.getDefault()))) { + return wpType; + } + if (lowerInput.contains(wpType.id)) { + return wpType; + } + if (lowerInput.contains(wpType.name().toLowerCase(Locale.US))) { + return wpType; + } + } + return WaypointType.WAYPOINT; + } + + } diff --git a/main/src/cgeo/geocaching/geopoint/Geopoint.java b/main/src/cgeo/geocaching/geopoint/Geopoint.java index e91a93d..8fe75ef 100644 --- a/main/src/cgeo/geocaching/geopoint/Geopoint.java +++ b/main/src/cgeo/geocaching/geopoint/Geopoint.java @@ -55,8 +55,8 @@ public final class Geopoint implements ICoordinates, Parcelable { */ public Geopoint(final String text) { final Geopoint parsed = GeopointParser.parse(text); - this.latitude = parsed.latitude; - this.longitude = parsed.longitude; + latitude = parsed.latitude; + longitude = parsed.longitude; } /** diff --git a/main/src/cgeo/geocaching/geopoint/GeopointParser.java b/main/src/cgeo/geocaching/geopoint/GeopointParser.java index 120e02e..2809598 100644 --- a/main/src/cgeo/geocaching/geopoint/GeopointParser.java +++ b/main/src/cgeo/geocaching/geopoint/GeopointParser.java @@ -57,7 +57,6 @@ class GeopointParser { */ public static Geopoint parse(final String text) { final ResultWrapper latitudeWrapper = parseHelper(text, LatLon.LAT); - final double lat = latitudeWrapper.result; // cut away the latitude part when parsing the longitude final ResultWrapper longitudeWrapper = parseHelper(text.substring(latitudeWrapper.matcherPos + latitudeWrapper.matcherLength), LatLon.LON); @@ -65,7 +64,14 @@ class GeopointParser { throw new Geopoint.ParseException("Distance between latitude and longitude text is to large.", LatLon.LON); } + final double lat = latitudeWrapper.result; final double lon = longitudeWrapper.result; + if (lat > 90 || lat < -90) { + throw new Geopoint.ParseException(text, LatLon.LAT); + } + if (lon > 180 || lon < -180) { + throw new Geopoint.ParseException(text, LatLon.LON); + } return new Geopoint(lat, lon); } |
