attempting to fix jackson date deserialization
Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/37480ea9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/37480ea9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/37480ea9 Branch: refs/heads/master Commit: 37480ea9d32ed2f79527295070f8e2388ba11192 Parents: 9edf176 Author: sblackmon <[email protected]> Authored: Mon Mar 31 15:32:46 2014 -0500 Committer: sblackmon <[email protected]> Committed: Mon Mar 31 15:32:46 2014 -0500 ---------------------------------------------------------------------- .../jackson/StreamsDateTimeDeserializer.java | 56 +++++++++++----- .../jackson/StreamsDateTimeSerializer.java | 5 +- .../streams/jackson/StreamsJacksonMapper.java | 4 ++ .../data/data/util/DateTimeSerDeTest.java | 70 ++++++++++++++++++++ 4 files changed, 116 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/37480ea9/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 f189aa9..646d948 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 @@ -4,13 +4,14 @@ import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.fasterxml.jackson.datatype.joda.JodaModule; import org.apache.streams.exceptions.ActivityDeserializerException; import org.apache.streams.exceptions.ActivitySerializerException; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; @@ -21,8 +22,6 @@ import java.io.IOException; */ public class StreamsDateTimeDeserializer extends StdDeserializer<DateTime> { - public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime(); - protected StreamsDateTimeDeserializer(Class<DateTime> dateTimeClass) { super(dateTimeClass); } @@ -31,21 +30,46 @@ public class StreamsDateTimeDeserializer extends StdDeserializer<DateTime> { public DateTime deserialize(JsonParser jpar, DeserializationContext context) throws IOException { DateTime result = null; - try { - result = ACTIVITY_FORMAT.parseDateTime(jpar.getText()); - return result; - } catch( Exception e ) {} + ObjectMapper basicMapper = new ObjectMapper(); + basicMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE); + + System.out.println(jpar.getCurrentToken()); + + if( jpar.getCurrentToken().isStructStart() ) { + + System.out.println(jpar.getCurrentToken()); - try { - result = ACTIVITY_FORMAT.parseDateTime(jpar.getValueAsString()); - return result; - } catch( Exception e ) {} + try { + JsonNode node = jpar.readValueAsTree(); + // now what? + return result; + } catch( Exception e ) { + e.printStackTrace(); + } + } else if( jpar.getCurrentToken().isScalarValue() ) { + try { + result = StreamsJacksonMapper.ACTIVITY_FORMAT.parseDateTime(jpar.getText()); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + } else if( jpar.getCurrentToken().isNumeric() ) { + try { + result = new DateTime(jpar.getLongValue()); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + } +// try { +// result = ACTIVITY_FORMAT.parseDateTime(jpar.getValueAsString()); +// return result; +// } catch( Exception e ) { +// e.printStackTrace(); +// } - try { - result = jpar.readValueAs(DateTime.class); - return result; - } catch( Exception e ) {} +// if( result == null ) throw new IOException(" could not deserialize " + jpar.toString()); http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/37480ea9/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 94cf6c3..08a3caf 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 @@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; @@ -15,8 +16,6 @@ import java.io.IOException; */ public class StreamsDateTimeSerializer extends StdSerializer<DateTime> { - public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime(); - protected StreamsDateTimeSerializer(Class<DateTime> dateTimeClass) { super(dateTimeClass); } @@ -24,7 +23,7 @@ public class StreamsDateTimeSerializer extends StdSerializer<DateTime> { @Override public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException { long timestamp = value.getMillis(); - String result = ACTIVITY_FORMAT.print(timestamp); + String result = StreamsJacksonMapper.ACTIVITY_FORMAT.print(timestamp); jgen.writeString(result); } } http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/37480ea9/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 7b1c41e..356f769 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 @@ -10,6 +10,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; import java.io.IOException; @@ -18,6 +20,8 @@ import java.io.IOException; */ public class StreamsJacksonMapper extends ObjectMapper { + public static final DateTimeFormatter ACTIVITY_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); + private static final StreamsJacksonMapper INSTANCE = new StreamsJacksonMapper(); public static StreamsJacksonMapper getInstance(){ http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/37480ea9/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 new file mode 100644 index 0000000..0b45413 --- /dev/null +++ b/streams-pojo/src/test/java/org/apache/streams/data/data/util/DateTimeSerDeTest.java @@ -0,0 +1,70 @@ +package org.apache.streams.data.data.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.streams.jackson.StreamsJacksonMapper; +import org.joda.time.DateTime; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +/** + * Created by sblackmon on 3/31/14. + */ +public class DateTimeSerDeTest { + + private final static Logger LOGGER = LoggerFactory.getLogger(DateTimeSerDeTest.class); + private ObjectMapper mapper = StreamsJacksonMapper.getInstance(); + + @Test + public void testActivityStringSer() { + String input = "2013-09-18T20:52:47Z"; + try { + DateTime output = mapper.readValue(input, DateTime.class); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testJodaJsonDeser() { + String input = "{\"year\":2012,\"era\":1,\"dayOfMonth\":17,\"dayOfWeek\":2,\"dayOfYear\":17,\"weekOfWeekyear\":3,\"weekyear\":2012,\"monthOfYear\":1,\"yearOfEra\":2012,\"yearOfCentury\":12,\"centuryOfEra\":20,\"millisOfSecond\":0,\"millisOfDay\":69706000,\"secondOfMinute\":46,\"secondOfDay\":69706,\"minuteOfHour\":21,\"minuteOfDay\":1161,\"hourOfDay\":19,\"zone\":{\"fixed\":false,\"uncachedZone\":{\"cachable\":true,\"fixed\":false,\"id\":\"America/Los_Angeles\"},\"id\":\"America/Los_Angeles\"},\"millis\":1326856906000,\"chronology\":{\"zone\":{\"fixed\":false,\"uncachedZone\":{\"cachable\":true,\"fixed\":false,\"id\":\"America/Los_Angeles\"},\"id\":\"America/Los_Angeles\"}},\"afterNow\":false,\"beforeNow\":true,\"equalNow\":false}"; + try { + DateTime output = mapper.readValue(input, DateTime.class); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testMillisDeser() { + Long input = 1326856906000l; + try { + DateTime output = mapper.readValue(input.toString(), DateTime.class); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testActivityStringDeser() { + String output = "2013-09-18T20:52:47Z"; + DateTime input = StreamsJacksonMapper.ACTIVITY_FORMAT.parseDateTime(output); + try { + String result = mapper.writeValueAsString(input); + assertEquals(result, output); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + +}
