diff options
| author | SammysHP <sven@sammyshp.de> | 2011-08-26 13:31:38 +0200 |
|---|---|---|
| committer | SammysHP <sven@sammyshp.de> | 2011-08-26 13:31:38 +0200 |
| commit | 1c93d30a4df918837f81360d43d145dd255dd63f (patch) | |
| tree | 7e302628e696ae776f8a8418daa385c9a9beb938 /src/cgeo/geocaching/cgBase.java | |
| parent | a7df5e432018bcfdbe0fe2925e6e799f33a2aa0b (diff) | |
| download | cgeo-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.java | 80 |
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) { |
