You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2017/10/18 12:24:39 UTC

svn commit: r1812502 - in /sling/trunk/bundles/jcr/contentparser/src: main/java/org/apache/sling/jcr/contentparser/impl/ParserHelper.java test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTest.java

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 {