You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streams.apache.org by mf...@apache.org on 2014/04/01 05:31:07 UTC

[1/3] git commit: Added RFC3339 utility

Repository: incubator-streams
Updated Branches:
  refs/heads/springcleaning eb6f46ac9 -> 574e10338


Added RFC3339 utility


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/361fea93
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/361fea93
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/361fea93

Branch: refs/heads/springcleaning
Commit: 361fea93d448393f81585eaf9665a5d1365f13ab
Parents: eb6f46a
Author: mfranklin <mf...@apache.org>
Authored: Mon Mar 31 22:59:53 2014 -0400
Committer: mfranklin <mf...@apache.org>
Committed: Mon Mar 31 22:59:53 2014 -0400

----------------------------------------------------------------------
 .../apache/streams/data/util/RFC3339Utils.java  |  94 ++++++++++++
 .../data/data/util/RFC3339UtilsTest.java        | 147 +++++++++++++++++++
 2 files changed, 241 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/361fea93/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
new file mode 100644
index 0000000..9b8339e
--- /dev/null
+++ b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
@@ -0,0 +1,94 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.streams.data.util;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Parses and formats Joda Time {@link org.joda.time.DateTime} dates to and from RFC3339 compatible Strings
+ */
+public class RFC3339Utils {
+    private static final String BASE = "^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}";
+    private static final String TZ = "[+-][0-9]{2}:?[0-9]{2}$";
+    private static final String SUB_SECOND = "\\.([0-9]*)";
+    private static final String UTC = "Z$";
+
+    private static final Pattern MILLIS = Pattern.compile("^[0-9]*$");
+    private static final Pattern UTC_STANDARD = Pattern.compile(BASE + UTC);
+    private static final Pattern UTC_SUB_SECOND = Pattern.compile(BASE + SUB_SECOND + UTC);
+    private static final Pattern LOCAL_STANDARD = Pattern.compile(BASE + TZ);
+    private static final Pattern LOCAL_SUB_SECOND = Pattern.compile(BASE + SUB_SECOND + TZ);
+
+    private static final String BASE_FMT = "yyyy-MM-dd'T'HH:mm:ss";
+    private static final DateTimeFormatter UTC_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "'Z'").withZoneUTC();
+    private static final DateTimeFormatter LOCAL_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "Z").withZoneUTC();
+
+
+    private RFC3339Utils() {}
+
+    public static DateTime parseUTC(String toParse) {
+        if(MILLIS.matcher(toParse).matches()) {
+            return new DateTime(Long.valueOf(toParse));
+        }
+        if(UTC_STANDARD.matcher(toParse).matches()) {
+            return parseUTC(UTC_STANDARD_FMT, toParse);
+        }
+        Matcher utc = UTC_SUB_SECOND.matcher(toParse);
+        if(utc.matches()) {
+            return parseUTC(getSubSecondFormat(utc.group(1), "'Z'"), toParse);
+        }
+        if(LOCAL_STANDARD.matcher(toParse).matches()) {
+            return parseUTC(LOCAL_STANDARD_FMT, toParse);
+        }
+        Matcher local = LOCAL_SUB_SECOND.matcher(toParse);
+        if(local.matches()) {
+            return parseUTC(getSubSecondFormat(local.group(1), "Z"), toParse);
+        }
+        throw new IllegalArgumentException(String.format("Failed to parse date %s. Ensure format is RFC3339 Compliant", toParse));
+    }
+
+    public static String format(DateTime toFormat) {
+        return UTC_STANDARD_FMT.print(toFormat.getMillis());
+    }
+
+    public static String format(DateTime toFormat, Locale locale) {
+        return LOCAL_STANDARD_FMT.withLocale(locale).print(toFormat.getMillis());
+    }
+
+    private static DateTime parseUTC(DateTimeFormatter formatter, String toParse) {
+        return formatter.parseDateTime(toParse);
+    }
+
+    private static DateTimeFormatter getSubSecondFormat(String sub, String suffix) {
+        StringBuilder pattern = new StringBuilder();
+        pattern.append(BASE_FMT);
+        pattern.append(".");
+        for(int i=0; i<sub.length(); i++) {
+            pattern.append("S");
+        }
+        pattern.append(suffix);
+        return DateTimeFormat.forPattern(pattern.toString()).withZoneUTC();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/361fea93/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java b/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
new file mode 100644
index 0000000..0471d2b
--- /dev/null
+++ b/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
@@ -0,0 +1,147 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.streams.data.data.util;
+
+
+import org.joda.time.DateTime;
+import org.junit.Test;
+
+import static org.apache.streams.data.util.RFC3339Utils.parseUTC;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class RFC3339UtilsTest {
+
+    @Test
+    public void validUTC() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00Z");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(12)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+    }
+
+    @Test
+    public void validUTCSubSecond() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7Z");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(12)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(700)));
+    }
+
+    @Test
+    public void validUTCSubSecondMultiDigit() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7343Z");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(12)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
+    }
+
+    @Test
+    public void validEST() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00-05:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+    }
+
+    @Test
+    public void validESTSubSecond() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7-05:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(700)));
+    }
+
+    @Test
+    public void validESTSubSecondMultiDigit() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7343-05:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
+    }
+
+    @Test
+    public void validESTNoSeparator() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00-0500");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+    }
+
+    @Test
+    public void validESTSubSecondNoSeparator() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7-0500");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(700)));
+    }
+
+    @Test
+    public void validESTSubSecondMultiDigitNoSeparator() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7343-0500");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(17)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
+    }
+
+    @Test
+    public void validCET() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00+01:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(11)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+    }
+
+    @Test
+    public void validCETSubSecond() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7+01:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(11)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(700)));
+    }
+
+    @Test
+    public void validCETSubSecondMultidigit() {
+        DateTime parsed = parseUTC("2014-12-25T12:00:00.7343+01:00");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(11)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
+        System.out.println(parsed.getMillis());
+    }
+}


[2/3] git commit: Added unit tests and fixed bugs

Posted by mf...@apache.org.
Added unit tests and fixed bugs


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/41a04f9c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/41a04f9c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/41a04f9c

Branch: refs/heads/springcleaning
Commit: 41a04f9c1e07ab83fe79a84b78e05a638d34ee03
Parents: 361fea9
Author: mfranklin <mf...@apache.org>
Authored: Mon Mar 31 23:24:51 2014 -0400
Committer: mfranklin <mf...@apache.org>
Committed: Mon Mar 31 23:24:51 2014 -0400

----------------------------------------------------------------------
 .../apache/streams/data/util/RFC3339Utils.java  | 33 +++++++++++++-------
 .../data/data/util/RFC3339UtilsTest.java        | 29 ++++++++++++++++-
 2 files changed, 50 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/41a04f9c/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
index 9b8339e..daf73a6 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
@@ -23,6 +23,7 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import java.util.Locale;
+import java.util.TimeZone;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -43,14 +44,16 @@ public class RFC3339Utils {
 
     private static final String BASE_FMT = "yyyy-MM-dd'T'HH:mm:ss";
     private static final DateTimeFormatter UTC_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "'Z'").withZoneUTC();
+    private static final DateTimeFormatter UTC_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSS'Z'").withZoneUTC();
     private static final DateTimeFormatter LOCAL_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "Z").withZoneUTC();
+    private static final DateTimeFormatter LOCAL_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSSZ").withZoneUTC();
 
 
     private RFC3339Utils() {}
 
     public static DateTime parseUTC(String toParse) {
         if(MILLIS.matcher(toParse).matches()) {
-            return new DateTime(Long.valueOf(toParse));
+            return new DateTime(Long.valueOf(toParse), DateTimeZone.UTC);
         }
         if(UTC_STANDARD.matcher(toParse).matches()) {
             return parseUTC(UTC_STANDARD_FMT, toParse);
@@ -70,11 +73,11 @@ public class RFC3339Utils {
     }
 
     public static String format(DateTime toFormat) {
-        return UTC_STANDARD_FMT.print(toFormat.getMillis());
+        return UTC_SUB_SECOND_FMT.print(toFormat.getMillis());
     }
 
-    public static String format(DateTime toFormat, Locale locale) {
-        return LOCAL_STANDARD_FMT.withLocale(locale).print(toFormat.getMillis());
+    public static String format(DateTime toFormat, TimeZone tz) {
+        return LOCAL_SUB_SECOND_FMT.withZone(DateTimeZone.forTimeZone(tz)).print(toFormat.getMillis());
     }
 
     private static DateTime parseUTC(DateTimeFormatter formatter, String toParse) {
@@ -82,13 +85,21 @@ public class RFC3339Utils {
     }
 
     private static DateTimeFormatter getSubSecondFormat(String sub, String suffix) {
-        StringBuilder pattern = new StringBuilder();
-        pattern.append(BASE_FMT);
-        pattern.append(".");
-        for(int i=0; i<sub.length(); i++) {
-            pattern.append("S");
+        DateTimeFormatter result;
+        //Since RFC3339 allows for any number of sub-second notations, we need to flexibly support more or less than 3
+        //digits; however, if it is exactly 3, just use the standards.
+        if(sub.length() == 3) {
+            result = suffix.equals("Z") ? LOCAL_SUB_SECOND_FMT : UTC_SUB_SECOND_FMT;
+        } else {
+            StringBuilder pattern = new StringBuilder();
+            pattern.append(BASE_FMT);
+            pattern.append(".");
+            for (int i = 0; i < sub.length(); i++) {
+                pattern.append("S");
+            }
+            pattern.append(suffix);
+            result = DateTimeFormat.forPattern(pattern.toString()).withZoneUTC();
         }
-        pattern.append(suffix);
-        return DateTimeFormat.forPattern(pattern.toString()).withZoneUTC();
+        return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/41a04f9c/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java b/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
index 0471d2b..1cf790a 100644
--- a/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
+++ b/streams-pojo/src/test/java/org/apache/streams/data/data/util/RFC3339UtilsTest.java
@@ -19,8 +19,13 @@ package org.apache.streams.data.data.util;
 
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.junit.Test;
 
+import java.util.Locale;
+import java.util.TimeZone;
+
+import static org.apache.streams.data.util.RFC3339Utils.format;
 import static org.apache.streams.data.util.RFC3339Utils.parseUTC;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
@@ -142,6 +147,28 @@ public class RFC3339UtilsTest {
         assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
         assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
         assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
-        System.out.println(parsed.getMillis());
+    }
+
+    @Test
+    public void validLong() {
+        DateTime parsed = parseUTC("1419505200734");
+        assertThat(parsed.minuteOfHour().get(), is(equalTo(0)));
+        assertThat(parsed.hourOfDay().get(), is(equalTo(11)));
+        assertThat(parsed.dayOfMonth().get(), is(equalTo(25)));
+        assertThat(parsed.monthOfYear().get(), is(equalTo(12)));
+        assertThat(parsed.millisOfSecond().get(), is(equalTo(734)));
+    }
+
+    @Test
+    public void validFormatUTC() {
+        DateTime parsed = new DateTime(1419505200734L);
+        assertThat(format(parsed), is(equalTo("2014-12-25T11:00:00.734Z")));
+    }
+
+    @Test
+    public void validFormat() {
+        TimeZone cet = TimeZone.getTimeZone("CET");
+        DateTime parsed = new DateTime(1419505200734L);
+        assertThat(format(parsed, cet), is(equalTo("2014-12-25T12:00:00.734+0100")));
     }
 }


[3/3] git commit: Updated serialization utilities

Posted by mf...@apache.org.
Updated serialization utilities


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/574e1033
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/574e1033
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/574e1033

Branch: refs/heads/springcleaning
Commit: 574e10338c1adde054c411cb12d5efd55eaaf1cb
Parents: 41a04f9
Author: mfranklin <mf...@apache.org>
Authored: Mon Mar 31 23:30:48 2014 -0400
Committer: mfranklin <mf...@apache.org>
Committed: Mon Mar 31 23:30:48 2014 -0400

----------------------------------------------------------------------
 .../apache/streams/data/util/RFC3339Utils.java  |  9 ++++----
 .../jackson/StreamsDateTimeDeserializer.java    | 23 ++------------------
 .../jackson/StreamsDateTimeSerializer.java      |  5 ++---
 .../streams/jackson/StreamsJacksonMapper.java   |  2 --
 .../data/data/util/DateTimeSerDeTest.java       |  2 +-
 5 files changed, 9 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/574e1033/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
index daf73a6..7af16c4 100644
--- a/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
+++ b/streams-pojo/src/main/java/org/apache/streams/data/util/RFC3339Utils.java
@@ -22,7 +22,6 @@ import org.joda.time.DateTimeZone;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
-import java.util.Locale;
 import java.util.TimeZone;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -43,10 +42,10 @@ public class RFC3339Utils {
     private static final Pattern LOCAL_SUB_SECOND = Pattern.compile(BASE + SUB_SECOND + TZ);
 
     private static final String BASE_FMT = "yyyy-MM-dd'T'HH:mm:ss";
-    private static final DateTimeFormatter UTC_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "'Z'").withZoneUTC();
-    private static final DateTimeFormatter UTC_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSS'Z'").withZoneUTC();
-    private static final DateTimeFormatter LOCAL_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "Z").withZoneUTC();
-    private static final DateTimeFormatter LOCAL_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSSZ").withZoneUTC();
+    public static final DateTimeFormatter UTC_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "'Z'").withZoneUTC();
+    public static final DateTimeFormatter UTC_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSS'Z'").withZoneUTC();
+    public static final DateTimeFormatter LOCAL_STANDARD_FMT = DateTimeFormat.forPattern(BASE_FMT + "Z").withZoneUTC();
+    public static final DateTimeFormatter LOCAL_SUB_SECOND_FMT = DateTimeFormat.forPattern(BASE_FMT + ".SSSZ").withZoneUTC();
 
 
     private RFC3339Utils() {}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/574e1033/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
index 34459fd..8d56c53 100644
--- a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
@@ -3,11 +3,10 @@ package org.apache.streams.jackson;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import org.apache.streams.data.util.RFC3339Utils;
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 
 import java.io.IOException;
-import java.util.regex.Pattern;
 
 /**
  * Created by sblackmon on 3/27/14.
@@ -20,24 +19,6 @@ public class StreamsDateTimeDeserializer extends StdDeserializer<DateTime> {
 
     @Override
     public DateTime deserialize(JsonParser jpar, DeserializationContext context) throws IOException {
-        DateTime result = null;
-
-        if( jpar.getCurrentToken().isNumeric() ) {
-            Long numberValue = jpar.getValueAsLong();
-            if (numberValue != 0L) {
-                result = new DateTime(numberValue);
-            }
-        }
-        else {
-            String nodeValue = jpar.getValueAsString();
-            if (nodeValue != null) {
-                result = StreamsJacksonMapper.ACTIVITY_FORMAT.parseDateTime(nodeValue);
-            }
-        }
-
-        if( result == null )
-            throw new IOException(" could not deserialize " + jpar.toString());
-
-        return result;
+        return RFC3339Utils.parseUTC(jpar.getValueAsString());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/574e1033/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
index 08a3caf..4677fce 100644
--- a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import org.apache.streams.data.util.RFC3339Utils;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
@@ -22,8 +23,6 @@ public class StreamsDateTimeSerializer extends StdSerializer<DateTime> {
 
     @Override
     public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
-        long timestamp = value.getMillis();
-        String result = StreamsJacksonMapper.ACTIVITY_FORMAT.print(timestamp);
-        jgen.writeString(result);
+        jgen.writeString(RFC3339Utils.format(value));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/574e1033/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonMapper.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonMapper.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonMapper.java
index 4b0c2d5..275ed7e 100644
--- a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonMapper.java
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonMapper.java
@@ -21,8 +21,6 @@ import java.io.IOException;
  */
 public class StreamsJacksonMapper extends ObjectMapper {
 
-    public static final DateTimeFormatter ACTIVITY_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-
     private static final StreamsJacksonMapper INSTANCE = new StreamsJacksonMapper();
 
     public static StreamsJacksonMapper getInstance(){

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/574e1033/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java b/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java
index 217abd4..fe1a6b6 100644
--- a/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java
+++ b/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java
@@ -48,7 +48,7 @@ public class DateTimeSerDeTest {
     @Test
     public void testActivityStringDeser() {
         String output = "2012-01-17T21:21:46.000Z";
-        long inputMillis = 1326856906000l;
+        long inputMillis = 1326835306000L;
         DateTime input;
         try {
             input = new DateTime(inputMillis);