Author: sseifert Date: Wed Oct 18 12:24:39 2017 New Revision: 1812502 URL: http://svn.apache.org/viewvc?rev=1812502&view=rev Log: SLING-7185 Content Parser: Support for ISO-8601 (patch provided by Jason E Bailey) closes #261
Modified: sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java Modified: sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java?rev=1812502&r1=1812501&r2=1812502&view=diff ============================================================================== --- sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java (original) +++ sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java Wed Oct 18 12:24:39 2017 @@ -30,6 +30,7 @@ import java.util.Set; import javax.json.JsonObject; import org.apache.commons.lang3.StringUtils; +import org.apache.jackrabbit.util.ISO8601; import org.apache.sling.jcr.contentparser.ParseException; import org.apache.sling.jcr.contentparser.ParserOptions; @@ -67,16 +68,21 @@ class ParserHelper { public Calendar tryParseCalendar(String value) { if (options.isDetectCalendarValues() && !StringUtils.isBlank(value)) { - synchronized (calendarFormat) { - try { + // 1st try: parse with ISO-8601 format first + Calendar calendar = ISO8601.parse(value); + if (calendar != null) { + return calendar; + } + // 2nd try: parse with ECMA date format which is used by Sling GET servlet + calendar = Calendar.getInstance(); + try { + synchronized (calendarFormat) { Date date = calendarFormat.parse(value); - Calendar calendar = Calendar.getInstance(); calendar.setTime(date); - return calendar; - } - catch (java.text.ParseException ex) { - // ignore } + return calendar; + } catch (java.text.ParseException ex) { + // ignore } } return null; Modified: sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java?rev=1812502&r1=1812501&r2=1812502&view=diff ============================================================================== --- sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java (original) +++ sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java Wed Oct 18 12:24:39 2017 @@ -107,6 +107,28 @@ public class JsonContentParserTest { assertEquals(11, calendar.get(Calendar.MINUTE)); assertEquals(24, calendar.get(Calendar.SECOND)); } + + @Test + public void testIso8601Calendar() throws Exception { + ContentParser underTest = ContentParserFactory.create(ContentType.JSON, + new ParserOptions().detectCalendarValues(true)); + ContentElement content = parse(underTest, file); + + Map<String, Object> props = content.getChild("jcr:content").getProperties(); + + Calendar calendar = (Calendar) props.get("dateISO8601String"); + assertNotNull(calendar); + + calendar.setTimeZone(TimeZone.getTimeZone("GMT+2")); + + assertEquals(2014, calendar.get(Calendar.YEAR)); + assertEquals(4, calendar.get(Calendar.MONTH) + 1); + assertEquals(22, calendar.get(Calendar.DAY_OF_MONTH)); + + assertEquals(15, calendar.get(Calendar.HOUR_OF_DAY)); + assertEquals(11, calendar.get(Calendar.MINUTE)); + assertEquals(24, calendar.get(Calendar.SECOND)); + } @Test public void testUTF8Chars() throws Exception {