aboutsummaryrefslogtreecommitdiffstats
path: root/src/cgeo/geocaching/cgBase.java
diff options
context:
space:
mode:
authorSammysHP <sven@sammyshp.de>2011-08-26 13:31:38 +0200
committerSammysHP <sven@sammyshp.de>2011-08-26 13:31:38 +0200
commit1c93d30a4df918837f81360d43d145dd255dd63f (patch)
tree7e302628e696ae776f8a8418daa385c9a9beb938 /src/cgeo/geocaching/cgBase.java
parenta7df5e432018bcfdbe0fe2925e6e799f33a2aa0b (diff)
downloadcgeo-1c93d30a4df918837f81360d43d145dd255dd63f.zip
cgeo-1c93d30a4df918837f81360d43d145dd255dd63f.tar.gz
cgeo-1c93d30a4df918837f81360d43d145dd255dd63f.tar.bz2
Improve date-parsing. Maybe not the best solution (performance, memory), but it supports 6 out of 7 formats you can choose in gc.com-settings. Closes #294
Diffstat (limited to 'src/cgeo/geocaching/cgBase.java')
-rw-r--r--src/cgeo/geocaching/cgBase.java80
1 files changed, 45 insertions, 35 deletions
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java
index e143ab7..92082a3 100644
--- a/src/cgeo/geocaching/cgBase.java
+++ b/src/cgeo/geocaching/cgBase.java
@@ -23,6 +23,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
@@ -80,7 +81,7 @@ public class cgBase {
private final static Pattern patternTerrain = Pattern.compile("<span id=\"ctl00_ContentBody_Localize6\"[^>]*>[^<]*<img src=\"[^\"]*/images/stars/stars([0-9_]+)\\.gif\" alt=\"[^\"]+\"[^>]*>[^<]*</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private final static Pattern patternOwner = Pattern.compile("<span class=\"minorCacheDetails\">\\W*An?(\\W*Event)?\\W*cache\\W*by[^<]*<a href=\"[^\"]+\">([^<]+)</a>[^<]*</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private final static Pattern patternOwnerReal = Pattern.compile("<a id=\"ctl00_ContentBody_uxFindLinksHiddenByThisUser\" href=\"[^\"]*/seek/nearest\\.aspx\\?u=*([^\"]+)\">[^<]+</a>", Pattern.CASE_INSENSITIVE);
- private final static Pattern patternHidden = Pattern.compile("<span[^>]*>\\W*Hidden[^\\d]*([^<]+)</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
+ private final static Pattern patternHidden = Pattern.compile("<span[^>]*>\\W*Hidden[\\s:]*([^<]+)</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private final static Pattern patternHiddenEvent = Pattern.compile("<span[^>]*>\\W*Event\\W*Date[^:]*:([^<]*)</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
private final static Pattern patternFavourite = Pattern.compile("<a id=\"uxFavContainerLink\"[^>]*>[^<]*<div[^<]*<span class=\"favorite-value\">[^\\d]*([0-9]+)[^\\d^<]*</span>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
@@ -116,9 +117,26 @@ public class cgBase {
public static HashMap<Integer, String> logTypesTrackable = new HashMap<Integer, String>();
public static HashMap<Integer, String> logTypesTrackableAction = new HashMap<Integer, String>();
public static HashMap<Integer, String> errorRetrieve = new HashMap<Integer, String>();
- public final static SimpleDateFormat dateInSlash = new SimpleDateFormat("MM/dd/yyyy");
- public final static SimpleDateFormat dateInDash = new SimpleDateFormat("yyyy-MM-dd");
- public final static SimpleDateFormat dateEvIn = new SimpleDateFormat("dd MMMMM yyyy", Locale.ENGLISH); // 28 March 2009
+ public static final Map<String, SimpleDateFormat> gcCustomDateFormats;
+ static {
+ final String[] formats = new String[] {
+ "MM/dd/yyyy",
+ "yyyy-MM-dd",
+ "yyyy/MM/dd",
+ "dd/MMM/yyyy",
+ "MMM/dd/yyyy",
+ "dd MMM yy"
+ };
+
+ HashMap<String, SimpleDateFormat> map = new HashMap<String, SimpleDateFormat>();
+
+ for (String format : formats)
+ {
+ map.put(format, new SimpleDateFormat(format, Locale.ENGLISH));
+ }
+
+ gcCustomDateFormats = Collections.unmodifiableMap(map);
+ }
public final static SimpleDateFormat dateTbIn1 = new SimpleDateFormat("EEEEE, dd MMMMM yyyy", Locale.ENGLISH); // Saturday, 28 March 2009
public final static SimpleDateFormat dateTbIn2 = new SimpleDateFormat("EEEEE, MMMMM dd, yyyy", Locale.ENGLISH); // Saturday, March 28, 2009
public final static SimpleDateFormat dateSqlIn = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 2010-07-25 14:44:01
@@ -1244,10 +1262,10 @@ public class cgBase {
final Matcher matcherHidden = patternHidden.matcher(tableInside);
if (matcherHidden.find()) {
if (matcherHidden.groupCount() > 0) {
- cache.hidden = parseDate(matcherHidden.group(1));
+ cache.hidden = parseGcCustomDate(matcherHidden.group(1));
}
}
- } catch (Exception e) {
+ } catch (ParseException e) {
// failed to parse cache hidden date
Log.w(cgSettings.tag, "cgeoBase.parseCache: Failed to parse cache hidden date");
}
@@ -1258,10 +1276,10 @@ public class cgBase {
final Matcher matcherHiddenEvent = patternHiddenEvent.matcher(tableInside);
if (matcherHiddenEvent.find()) {
if (matcherHiddenEvent.groupCount() > 0) {
- cache.hidden = parseDate(matcherHiddenEvent.group(1));
+ cache.hidden = parseGcCustomDate(matcherHiddenEvent.group(1));
}
}
- } catch (Exception e) {
+ } catch (ParseException e) {
// failed to parse cache event date
Log.w(cgSettings.tag, "cgeoBase.parseCache: Failed to parse cache event date");
}
@@ -1613,7 +1631,7 @@ public class cgBase {
try
{
- logDone.date = dateInSlash.parse(matcherLog.group(5)).getTime();
+ logDone.date = parseGcCustomDate(matcherLog.group(5)).getTime();
}
catch (ParseException e)
{
@@ -1878,34 +1896,26 @@ public class cgBase {
// And BTW: You cannot even see that effect in the debugger, but must use a separate memory profiler!
}
- private static Date parseDate(String input) {
- if (input == null) {
- return null;
+ private static Date parseGcCustomDate(String input)
+ throws ParseException
+ {
+ if (input == null)
+ {
+ throw new ParseException("Input is null", 0);
}
+
input = input.trim();
- try {
- Date result;
- if (input.indexOf('/') > 0) {
- result = dateInSlash.parse(input);
- if (result != null) {
- return result;
- }
- }
- if (input.indexOf('-') > 0) {
- result = dateInDash.parse(input);
- if (result != null) {
- return result;
- }
- }
- result = dateEvIn.parse(input);
- if (result != null) {
- return result;
- }
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
+
+ for (SimpleDateFormat format : gcCustomDateFormats.values())
+ {
+ try
+ {
+ return format.parse(input);
+ }
+ catch (ParseException e) {}
+ }
+
+ throw new ParseException("No matching pattern", 0);
}
public cgRating getRating(String guid, String geocode) {