diff options
| author | bananeweizen <bananeweizen@gmx.de> | 2011-08-26 18:11:43 +0100 |
|---|---|---|
| committer | bananeweizen <bananeweizen@gmx.de> | 2011-08-26 18:11:43 +0100 |
| commit | 972778987373af34bbcf27bb5c828fe510ebd23c (patch) | |
| tree | b6fb7dae6727bcda1952c7bfc6c934553e02fe53 /src | |
| parent | 191e33126e0bcb7afa58f884c3c4ea6ad6d83a82 (diff) | |
| parent | 51fdc4596b1d9b27782946101663cfc3c399d027 (diff) | |
| download | cgeo-972778987373af34bbcf27bb5c828fe510ebd23c.zip cgeo-972778987373af34bbcf27bb5c828fe510ebd23c.tar.gz cgeo-972778987373af34bbcf27bb5c828fe510ebd23c.tar.bz2 | |
Merge branch 'master' of https://Bananeweizen@github.com/cgeo/c-geo-opensource.git
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgeo/geocaching/cgBase.java | 98 |
1 files changed, 56 insertions, 42 deletions
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java index e143ab7..7f18024 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,11 +81,12 @@ 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); private final static Pattern patternFound = Pattern.compile("<p>[^<]*<a id=\"ctl00_ContentBody_hlFoundItLog\"[^<]*<img src=\".*/images/stockholm/16x16/check\\.gif\"[^>]*>[^<]*</a>[^<]*</p>", Pattern.CASE_INSENSITIVE); + private final static Pattern patternFoundAlternative = Pattern.compile("<div class=\"StatusInformationWidget FavoriteWidget\"", Pattern.CASE_INSENSITIVE); private final static Pattern patternLatLon = Pattern.compile("<span id=\"ctl00_ContentBody_LatLon\"[^>]*>(<b>)?([^<]*)(<\\/b>)?<\\/span>", Pattern.CASE_INSENSITIVE); private final static Pattern patternLocation = Pattern.compile("<span id=\"ctl00_ContentBody_Location\"[^>]*>In ([^<]*)", Pattern.CASE_INSENSITIVE); private final static Pattern patternHint = Pattern.compile("<p>([^<]*<strong>)?\\W*Additional Hints([^<]*<\\/strong>)?[^\\(]*\\(<a[^>]+>Encrypt</a>\\)[^<]*<\\/p>[^<]*<div id=\"div_hint\"[^>]*>(.*)</div>[^<]*<div id=[\\'|\"]dk[\\'|\"]", Pattern.CASE_INSENSITIVE); @@ -116,9 +118,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 +1263,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 +1277,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"); } @@ -1295,14 +1314,17 @@ public class cgBase { } // cache found - try { - final Matcher matcherFound = patternFound.matcher(page); - if (matcherFound.find()) { - if (matcherFound.group() != null && matcherFound.group().length() > 0) { - cache.found = true; - } + try + { + final Matcher matcherFound = patternFound.matcher(page); + final Matcher matcherFoundAlternative = patternFoundAlternative.matcher(page); + + if (matcherFound.find() || matcherFoundAlternative.find()) { + cache.found = true; } - } catch (Exception e) { + } + catch (Exception e) + { // failed to parse found Log.w(cgSettings.tag, "cgeoBase.parseCache: Failed to parse found"); } @@ -1613,7 +1635,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 +1900,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) { |
