http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0554b59b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV1d0.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV1d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV1d0.java new file mode 100644 index 0000000..763c1d9 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV1d0.java @@ -0,0 +1,326 @@ +/* + * 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 + * with the License. You may obtain a copy of the License at + * + * 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.tinkerpop.gremlin.structure.io.graphson; + +import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator; +import org.apache.tinkerpop.shaded.jackson.core.JsonParser; +import org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext; +import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; +import org.apache.tinkerpop.shaded.jackson.databind.deser.std.StdDeserializer; +import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer; +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; + +/** + * GraphSON serializers for classes in {@code java.time.*}. + */ +final class JavaTimeSerializersV1d0 { + + private JavaTimeSerializersV1d0() {} + + /** + * Base class for serializing the {@code java.time.*} to ISO-8061 formats. + */ + static abstract class AbstractJavaTimeSerializer<T> extends StdSerializer<T> { + + public AbstractJavaTimeSerializer(final Class<T> clazz) { + super(clazz); + } + + @Override + public void serialize(final T value, final JsonGenerator gen, + final SerializerProvider serializerProvider) throws IOException { + gen.writeString(value.toString()); + } + + @Override + public void serializeWithType(final T value, final JsonGenerator gen, + final SerializerProvider serializers, final TypeSerializer typeSer) throws IOException { + typeSer.writeTypePrefixForObject(value, gen); + gen.writeStringField(GraphSONTokens.VALUE, value.toString()); + typeSer.writeTypeSuffixForObject(value, gen); + } + } + /** + * Base class for serializing the {@code java.time.*} from ISO-8061 formats. + */ + abstract static class AbstractJavaTimeJacksonDeserializer<T> extends StdDeserializer<T> { + public AbstractJavaTimeJacksonDeserializer(final Class<T> clazz) { + super(clazz); + } + + public abstract T parse(final String val); + + @Override + public T deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException { + if (!jsonParser.getText().equals(GraphSONTokens.VALUE)) + throw new IOException(String.format("Invalid format for %s - expecting '%s' with a text value in ISO-8061 format", _valueClass.getSimpleName(), GraphSONTokens.VALUE)); + + return parse(jsonParser.nextTextValue()); + } + } + + final static class DurationJacksonSerializer extends AbstractJavaTimeSerializer<Duration> { + + public DurationJacksonSerializer() { + super(Duration.class); + } + } + + final static class DurationJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<Duration> { + public DurationJacksonDeserializer() { + super(Duration.class); + } + + @Override + public Duration parse(final String val) { + return Duration.parse(val); + } + } + + final static class InstantJacksonSerializer extends AbstractJavaTimeSerializer<Instant> { + + public InstantJacksonSerializer() { + super(Instant.class); + } + } + + final static class InstantJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<Instant> { + public InstantJacksonDeserializer() { + super(Instant.class); + } + + @Override + public Instant parse(final String val) { + return Instant.parse(val); + } + } + + final static class LocalDateJacksonSerializer extends AbstractJavaTimeSerializer<LocalDate> { + + public LocalDateJacksonSerializer() { + super(LocalDate.class); + } + } + + final static class LocalDateJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<LocalDate> { + public LocalDateJacksonDeserializer() { + super(LocalDate.class); + } + + @Override + public LocalDate parse(final String val) { + return LocalDate.parse(val); + } + } + + final static class LocalDateTimeJacksonSerializer extends AbstractJavaTimeSerializer<LocalDateTime> { + + public LocalDateTimeJacksonSerializer() { + super(LocalDateTime.class); + } + } + + final static class LocalDateTimeJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<LocalDateTime> { + public LocalDateTimeJacksonDeserializer() { + super(LocalDateTime.class); + } + + @Override + public LocalDateTime parse(final String val) { + return LocalDateTime.parse(val); + } + } + + final static class LocalTimeJacksonSerializer extends AbstractJavaTimeSerializer<LocalTime> { + + public LocalTimeJacksonSerializer() { + super(LocalTime.class); + } + } + + final static class LocalTimeJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<LocalTime> { + public LocalTimeJacksonDeserializer() { + super(LocalTime.class); + } + + @Override + public LocalTime parse(final String val) { + return LocalTime.parse(val); + } + } + + final static class MonthDayJacksonSerializer extends AbstractJavaTimeSerializer<MonthDay> { + + public MonthDayJacksonSerializer() { + super(MonthDay.class); + } + } + + final static class MonthDayJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<MonthDay> { + public MonthDayJacksonDeserializer() { + super(MonthDay.class); + } + + @Override + public MonthDay parse(final String val) { + return MonthDay.parse(val); + } + } + + final static class OffsetDateTimeJacksonSerializer extends AbstractJavaTimeSerializer<OffsetDateTime> { + + public OffsetDateTimeJacksonSerializer() { + super(OffsetDateTime.class); + } + } + + final static class OffsetDateTimeJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<OffsetDateTime> { + public OffsetDateTimeJacksonDeserializer() { + super(OffsetDateTime.class); + } + + @Override + public OffsetDateTime parse(final String val) { + return OffsetDateTime.parse(val); + } + } + + final static class OffsetTimeJacksonSerializer extends AbstractJavaTimeSerializer<OffsetTime> { + + public OffsetTimeJacksonSerializer() { + super(OffsetTime.class); + } + } + + final static class OffsetTimeJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<OffsetTime> { + public OffsetTimeJacksonDeserializer() { + super(OffsetTime.class); + } + + @Override + public OffsetTime parse(final String val) { + return OffsetTime.parse(val); + } + } + + final static class PeriodJacksonSerializer extends AbstractJavaTimeSerializer<Period> { + + public PeriodJacksonSerializer() { + super(Period.class); + } + } + + final static class PeriodJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<Period> { + public PeriodJacksonDeserializer() { + super(Period.class); + } + + @Override + public Period parse(final String val) { + return Period.parse(val); + } + } + + final static class YearJacksonSerializer extends AbstractJavaTimeSerializer<Year> { + + public YearJacksonSerializer() { + super(Year.class); + } + } + + final static class YearJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<Year> { + public YearJacksonDeserializer() { + super(Year.class); + } + + @Override + public Year parse(final String val) { + return Year.parse(val); + } + } + + final static class YearMonthJacksonSerializer extends AbstractJavaTimeSerializer<YearMonth> { + + public YearMonthJacksonSerializer() { + super(YearMonth.class); + } + } + + final static class YearMonthJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<YearMonth> { + public YearMonthJacksonDeserializer() { + super(YearMonth.class); + } + + @Override + public YearMonth parse(final String val) { + return YearMonth.parse(val); + } + } + + final static class ZonedDateTimeJacksonSerializer extends AbstractJavaTimeSerializer<ZonedDateTime> { + + public ZonedDateTimeJacksonSerializer() { + super(ZonedDateTime.class); + } + } + + final static class ZonedDateTimeJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<ZonedDateTime> { + public ZonedDateTimeJacksonDeserializer() { + super(ZonedDateTime.class); + } + + @Override + public ZonedDateTime parse(final String val) { + return ZonedDateTime.parse(val); + } + } + + final static class ZoneOffsetJacksonSerializer extends AbstractJavaTimeSerializer<ZoneOffset> { + + public ZoneOffsetJacksonSerializer() { + super(ZoneOffset.class); + } + } + + final static class ZoneOffsetJacksonDeserializer extends AbstractJavaTimeJacksonDeserializer<ZoneOffset> { + public ZoneOffsetJacksonDeserializer() { + super(ZoneOffset.class); + } + + @Override + public ZoneOffset parse(final String val) { + return ZoneOffset.of(val); + } + } +}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0554b59b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializers.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializers.java deleted file mode 100644 index 4f2f5da..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializers.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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 - * with the License. You may obtain a copy of the License at - * - * 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.tinkerpop.gremlin.structure.io.graphson; - -import org.apache.tinkerpop.gremlin.structure.Element; -import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator; -import org.apache.tinkerpop.shaded.jackson.databind.SerializationFeature; -import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; -import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer; -import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * GraphSON serializers for classes in {@code java.util.*}. - */ -final class JavaUtilSerializers { - - private JavaUtilSerializers() {} - - final static class MapEntryJacksonSerializer extends StdSerializer<Map.Entry> { - - public MapEntryJacksonSerializer() { - super(Map.Entry.class); - } - - @Override - public void serialize(final Map.Entry entry, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - ser(entry, jsonGenerator, serializerProvider, null); - } - - @Override - public void serializeWithType(final Map.Entry entry, final JsonGenerator jsonGenerator, - final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { - ser(entry, jsonGenerator, serializerProvider, typeSerializer); - } - - private static void ser(final Map.Entry entry, final JsonGenerator jsonGenerator, - final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { - jsonGenerator.writeStartObject(); - if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, HashMap.class.getName()); - - // this treatment of keys is consistent with the current GraphSONKeySerializer which extends the - // StdKeySerializer - final Object key = entry.getKey(); - final Class cls = key.getClass(); - String k; - if (cls == String.class) - k = (String) key; - else if (Element.class.isAssignableFrom(cls)) - k = ((Element) key).id().toString(); - else if(Date.class.isAssignableFrom(cls)) { - if (serializerProvider.isEnabled(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)) - k = String.valueOf(((Date) key).getTime()); - else - k = serializerProvider.getConfig().getDateFormat().format((Date) key); - } else if(cls == Class.class) - k = ((Class) key).getName(); - else - k = key.toString(); - - serializerProvider.defaultSerializeField(k, entry.getValue(), jsonGenerator); - jsonGenerator.writeEndObject(); - } - } -} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0554b59b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV1d0.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV1d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV1d0.java new file mode 100644 index 0000000..15dd3b9 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaUtilSerializersV1d0.java @@ -0,0 +1,86 @@ +/* + * 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 + * with the License. You may obtain a copy of the License at + * + * 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.tinkerpop.gremlin.structure.io.graphson; + +import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator; +import org.apache.tinkerpop.shaded.jackson.databind.SerializationFeature; +import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; +import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer; +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * GraphSON serializers for classes in {@code java.util.*}. + */ +final class JavaUtilSerializersV1d0 { + + private JavaUtilSerializersV1d0() {} + + final static class MapEntryJacksonSerializer extends StdSerializer<Map.Entry> { + + public MapEntryJacksonSerializer() { + super(Map.Entry.class); + } + + @Override + public void serialize(final Map.Entry entry, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) + throws IOException { + ser(entry, jsonGenerator, serializerProvider, null); + } + + @Override + public void serializeWithType(final Map.Entry entry, final JsonGenerator jsonGenerator, + final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { + ser(entry, jsonGenerator, serializerProvider, typeSerializer); + } + + private static void ser(final Map.Entry entry, final JsonGenerator jsonGenerator, + final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { + jsonGenerator.writeStartObject(); + if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, HashMap.class.getName()); + + // this treatment of keys is consistent with the current GraphSONKeySerializer which extends the + // StdKeySerializer + final Object key = entry.getKey(); + final Class cls = key.getClass(); + String k; + if (cls == String.class) + k = (String) key; + else if (Element.class.isAssignableFrom(cls)) + k = ((Element) key).id().toString(); + else if(Date.class.isAssignableFrom(cls)) { + if (serializerProvider.isEnabled(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)) + k = String.valueOf(((Date) key).getTime()); + else + k = serializerProvider.getConfig().getDateFormat().format((Date) key); + } else if(cls == Class.class) + k = ((Class) key).getName(); + else + k = key.toString(); + + serializerProvider.defaultSerializeField(k, entry.getValue(), jsonGenerator); + jsonGenerator.writeEndObject(); + } + } +}