Author: bpoussin Date: 2013-03-23 00:38:46 +0100 (Sat, 23 Mar 2013) New Revision: 1561 Url: http://nuiton.org/projects/wikitty/repository/revisions/1561 Log: fixes #2620: Support relative date for String date representation Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2013-03-22 11:50:28 UTC (rev 1560) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2013-03-22 23:38:46 UTC (rev 1561) @@ -695,18 +695,38 @@ // try to convert to Date try { String v = String.valueOf(value); - if (DATE_NOW.equalsIgnoreCase(v)) { + if (StringUtils.startsWithIgnoreCase(v, DATE_NOW)) { result = new Date(); - } else if (DATE_TODAY.equalsIgnoreCase(v)) { + v = StringUtils.substringAfter(v, DATE_NOW); + } else if (StringUtils.startsWithIgnoreCase(v, DATE_TODAY)) { result = new Date(); result = DateUtil.setMinTimeOfDay(result); + v = StringUtils.substringAfter(v, DATE_TODAY); } else { - result = parseDate(v); + for (String pattern : DATE_FORMAT_ALLOWED) { + String tmp = StringUtils.substring(v, 0, pattern.length()); + try { + result = DateUtils.parseDate(tmp, pattern); + // parse success + v = StringUtils.substring(v, pattern.length()); + break; + } catch (Exception eee) { + if (log.isDebugEnabled()) { + log.debug(String.format("Can't parse date '%s'", tmp), eee); + } + } + } } + // try to interpret and of date (ex: +3Years) + if (StringUtils.length(v) > 0) { + DateMathParser parser = new DateMathParser(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); + parser.setNow(result); + result = parser.parseMath(v); + } } catch (ParseException eee) { - if (log.isDebugEnabled()) { - log.debug(String.format("Can't parse date '%s'", value), eee); - } + throw new WikittyException(String.format( + "Can't convert value '%s' of type '%s' to Date because math date is wrong", + value, getClass(value)), eee); } if (result == null) { Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2013-03-22 11:50:28 UTC (rev 1560) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2013-03-22 23:38:46 UTC (rev 1561) @@ -51,6 +51,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import org.apache.commons.lang3.time.DateUtils; /** * Test on WikittyUtil class. @@ -68,15 +69,25 @@ @Test public void testToDate() throws Exception { - Date d = new Date(); - System.out.println("Date: " + d); - String ds = WikittyUtil.toString(d); - System.out.println("Date format: " + ds); - Date d2 = WikittyUtil.toDate(ds); - System.out.println("Date parsed: " + d2); - Assert.assertEquals(d, d2); + { + Date d = new Date(); + String ds = WikittyUtil.toString(d); + Date d2 = WikittyUtil.toDate(ds); + Assert.assertEquals(d, d2); + } + { + Date d = WikittyUtil.toDate("20101231"); + Date d3y = WikittyUtil.toDate("20131231"); + Date j1 = WikittyUtil.toDate("20100101"); + Date smd = WikittyUtil.toDate("20100502"); + + + Assert.assertEquals(smd, WikittyUtil.toDate("20101231=????0502")); + Assert.assertEquals(d3y, WikittyUtil.toDate("20101231+3YEARS")); + Assert.assertEquals(j1, WikittyUtil.toDate("20101231/YEAR")); + } } - + @Test public void testFormat() { WikittyGroupImpl group = new WikittyGroupImpl();