This is an automated email from the ASF dual-hosted git repository. kenhuuu pushed a commit to branch v4-graphson-trim in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 02ae647474580e19e034e2c2bc2ea61879484be7 Author: Ken Hu <[email protected]> AuthorDate: Tue Oct 29 15:12:17 2024 -0700 Remove unsupported types in GraphSONv4 from core. --- .../structure/io/graphson/GraphSONModule.java | 127 +-------- .../io/graphson/GraphSONSerializersV4.java | 161 ----------- .../structure/io/graphson/GraphSONXModuleV4.java | 34 --- .../io/graphson/JavaTimeSerializersV4.java | 198 -------------- .../io/graphson/TraversalSerializersV4.java | 297 --------------------- .../graphson/GraphSONMapperEmbeddedTypeTest.java | 50 +++- .../GraphSONMapperPartialEmbeddedTypeTest.java | 9 +- .../structure/io/graphson/GraphSONMapperTest.java | 27 ++ .../server/GremlinServerHttpIntegrateTest.java | 6 +- 9 files changed, 74 insertions(+), 835 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java index 175114d149..c18f3b05c5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java @@ -158,70 +158,15 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { put(Set.class, "Set"); // TinkerPop Graph objects - put(Lambda.class, "Lambda"); put(Vertex.class, "Vertex"); put(Edge.class, "Edge"); put(Property.class, "Property"); put(Path.class, "Path"); put(VertexProperty.class, "VertexProperty"); - put(Metrics.class, "Metrics"); - put(TraversalMetrics.class, "TraversalMetrics"); - put(TraversalExplanation.class, "TraversalExplanation"); put(Tree.class, "Tree"); - put(AndP.class, "P"); - put(OrP.class, "P"); - put(P.class, "P"); - put(TextP.class, "TextP"); Stream.of( - VertexProperty.Cardinality.class, - Column.class, Direction.class, - DT.class, - Merge.class, - Operator.class, - Order.class, - Pop.class, - SackFunctions.Barrier.class, - Pick.class, - Scope.class, T.class).forEach(e -> put(e, e.getSimpleName())); - Arrays.asList( - ConnectiveStrategy.class, - ElementIdStrategy.class, - EventStrategy.class, - HaltedTraverserStrategy.class, - PartitionStrategy.class, - SubgraphStrategy.class, - SeedStrategy.class, - LazyBarrierStrategy.class, - MatchAlgorithmStrategy.class, - AdjacentToIncidentStrategy.class, - ByModulatorOptimizationStrategy.class, - ProductiveByStrategy.class, - CountStrategy.class, - FilterRankingStrategy.class, - IdentityRemovalStrategy.class, - IncidentToAdjacentStrategy.class, - InlineFilterStrategy.class, - MatchPredicateStrategy.class, - OrderLimitStrategy.class, - OptionsStrategy.class, - PathProcessorStrategy.class, - PathRetractionStrategy.class, - RepeatUnrollStrategy.class, - ComputerVerificationStrategy.class, - LambdaRestrictionStrategy.class, - ReadOnlyStrategy.class, - StandardVerificationStrategy.class, - EarlyLimitStrategy.class, - EdgeLabelVerificationStrategy.class, - ReservedKeysVerificationStrategy.class, - // - GraphFilterStrategy.class, - VertexProgramStrategy.class - ).forEach(strategy -> put(strategy, strategy.getSimpleName())); - - GraphSONModule.tryLoadSparqlStrategy().ifPresent(s -> put(s, s.getSimpleName())); }}); /** @@ -237,9 +182,6 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { addSerializer(Vertex.class, new GraphSONSerializersV4.VertexJacksonSerializer(normalize, typeInfo)); addSerializer(VertexProperty.class, new GraphSONSerializersV4.VertexPropertyJacksonSerializer(normalize, true)); addSerializer(Property.class, new GraphSONSerializersV4.PropertyJacksonSerializer()); - addSerializer(Metrics.class, new GraphSONSerializersV4.MetricsJacksonSerializer()); - addSerializer(TraversalMetrics.class, new GraphSONSerializersV4.TraversalMetricsJacksonSerializer()); - addSerializer(TraversalExplanation.class, new GraphSONSerializersV4.TraversalExplanationJacksonSerializer()); addSerializer(Path.class, new GraphSONSerializersV4.PathJacksonSerializer()); addSerializer(DirectionalStarGraph.class, new StarGraphGraphSONSerializerV4(normalize)); addSerializer(Tree.class, new GraphSONSerializersV4.TreeJacksonSerializer()); @@ -258,22 +200,9 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { // traversal addSerializer(BulkSet.class, new TraversalSerializersV4.BulkSetJacksonSerializer()); - addSerializer(Traversal.class, new TraversalSerializersV4.TraversalJacksonSerializer()); - Stream.of(VertexProperty.Cardinality.class, - Column.class, + Stream.of( Direction.class, - DT.class, - Merge.class, - Operator.class, - Order.class, - Pop.class, - SackFunctions.Barrier.class, - Scope.class, - Pick.class, T.class).forEach(e -> addSerializer(e, new TraversalSerializersV4.EnumJacksonSerializer())); - addSerializer(P.class, new TraversalSerializersV4.PJacksonSerializer()); - addSerializer(Lambda.class, new TraversalSerializersV4.LambdaJacksonSerializer()); - addSerializer(TraversalStrategy.class, new TraversalSerializersV4.TraversalStrategyJacksonSerializer()); /////////////////////// DESERIALIZERS //////////////////////////// @@ -282,10 +211,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { addDeserializer(Edge.class, new GraphSONSerializersV4.EdgeJacksonDeserializer()); addDeserializer(Property.class, new GraphSONSerializersV4.PropertyJacksonDeserializer()); addDeserializer(Path.class, new GraphSONSerializersV4.PathJacksonDeserializer()); - addDeserializer(TraversalExplanation.class, new GraphSONSerializersV4.TraversalExplanationJacksonDeserializer()); addDeserializer(VertexProperty.class, new GraphSONSerializersV4.VertexPropertyJacksonDeserializer()); - addDeserializer(Metrics.class, new GraphSONSerializersV4.MetricsJacksonDeserializer()); - addDeserializer(TraversalMetrics.class, new GraphSONSerializersV4.TraversalMetricsJacksonDeserializer()); addDeserializer(Tree.class, new GraphSONSerializersV4.TreeJacksonDeserializer()); // java.util - use the standard jackson serializers for collections when types aren't embedded @@ -300,58 +226,9 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { addDeserializer(Double.class, new GraphSONSerializersV4.DoubleJacksonDeserializer()); // traversal - Stream.of(VertexProperty.Cardinality.values(), - Column.values(), + Stream.of( Direction.values(), - DT.values(), - Merge.values(), - Operator.values(), - Order.values(), - Pop.values(), - SackFunctions.Barrier.values(), - Scope.values(), - Pick.values(), T.values()).flatMap(Stream::of).forEach(e -> addDeserializer(e.getClass(), new TraversalSerializersV4.EnumJacksonDeserializer(e.getDeclaringClass()))); - addDeserializer(P.class, new TraversalSerializersV4.PJacksonDeserializer()); - addDeserializer(TextP.class, new TraversalSerializersV4.TextPJacksonDeserializer()); - addDeserializer(Lambda.class, new TraversalSerializersV4.LambdaJacksonDeserializer()); - Arrays.asList( - ConnectiveStrategy.class, - ElementIdStrategy.class, - EventStrategy.class, - HaltedTraverserStrategy.class, - PartitionStrategy.class, - SubgraphStrategy.class, - SeedStrategy.class, - LazyBarrierStrategy.class, - MatchAlgorithmStrategy.class, - AdjacentToIncidentStrategy.class, - ByModulatorOptimizationStrategy.class, - ProductiveByStrategy.class, - CountStrategy.class, - FilterRankingStrategy.class, - IdentityRemovalStrategy.class, - IncidentToAdjacentStrategy.class, - InlineFilterStrategy.class, - MatchPredicateStrategy.class, - OrderLimitStrategy.class, - OptionsStrategy.class, - PathProcessorStrategy.class, - PathRetractionStrategy.class, - RepeatUnrollStrategy.class, - ComputerVerificationStrategy.class, - LambdaRestrictionStrategy.class, - ReadOnlyStrategy.class, - StandardVerificationStrategy.class, - EarlyLimitStrategy.class, - EdgeLabelVerificationStrategy.class, - ReservedKeysVerificationStrategy.class, - // - GraphFilterStrategy.class, - VertexProgramStrategy.class - ).forEach(strategy -> addDeserializer(strategy, new TraversalSerializersV4.TraversalStrategyProxyJacksonDeserializer(strategy))); - - GraphSONModule.tryLoadSparqlStrategy().ifPresent(s -> addDeserializer(s, new TraversalSerializersV4.TraversalStrategyProxyJacksonDeserializer(s))); } public static Builder build() { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java index 0c6a06feef..f4625797c5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializersV4.java @@ -326,44 +326,6 @@ class GraphSONSerializersV4 { } } - final static class TraversalExplanationJacksonSerializer extends StdScalarSerializer<TraversalExplanation> { - public TraversalExplanationJacksonSerializer() { - super(TraversalExplanation.class); - } - - @Override - public void serialize(final TraversalExplanation traversalExplanation, final JsonGenerator jsonGenerator, - final SerializerProvider serializerProvider) throws IOException { - final Map<String, Object> m = new HashMap<>(); - m.put(GraphSONTokens.ORIGINAL, getStepsAsList(traversalExplanation.getOriginalTraversal())); - - final List<Pair<TraversalStrategy, Traversal.Admin<?, ?>>> strategyTraversals = traversalExplanation.getStrategyTraversals(); - - final List<Map<String, Object>> intermediates = new ArrayList<>(); - for (final Pair<TraversalStrategy, Traversal.Admin<?, ?>> pair : strategyTraversals) { - final Map<String, Object> intermediate = new HashMap<>(); - intermediate.put(GraphSONTokens.STRATEGY, pair.getValue0().toString()); - intermediate.put(GraphSONTokens.CATEGORY, pair.getValue0().getTraversalCategory().getSimpleName()); - intermediate.put(GraphSONTokens.TRAVERSAL, getStepsAsList(pair.getValue1())); - intermediates.add(intermediate); - } - m.put(GraphSONTokens.INTERMEDIATE, intermediates); - - if (strategyTraversals.isEmpty()) - m.put(GraphSONTokens.FINAL, getStepsAsList(traversalExplanation.getOriginalTraversal())); - else - m.put(GraphSONTokens.FINAL, getStepsAsList(strategyTraversals.get(strategyTraversals.size() - 1).getValue1())); - - jsonGenerator.writeObject(m); - } - - private List<String> getStepsAsList(final Traversal.Admin<?, ?> t) { - final List<String> steps = new ArrayList<>(); - t.getSteps().iterator().forEachRemaining(s -> steps.add(s.toString())); - return steps; - } - } - final static class IntegerGraphSONSerializer extends StdScalarSerializer<Integer> { public IntegerGraphSONSerializer() { super(Integer.class); @@ -388,52 +350,6 @@ class GraphSONSerializersV4 { } } - final static class TraversalMetricsJacksonSerializer extends StdScalarSerializer<TraversalMetrics> { - public TraversalMetricsJacksonSerializer() { - super(TraversalMetrics.class); - } - - @Override - public void serialize(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - // creation of the map enables all the fields to be properly written with their type if required - final Map<String, Object> m = new HashMap<>(); - m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); - final List<Metrics> metrics = new ArrayList<>(); - metrics.addAll(traversalMetrics.getMetrics()); - m.put(GraphSONTokens.METRICS, metrics); - - jsonGenerator.writeObject(m); - } - } - - final static class MetricsJacksonSerializer extends StdScalarSerializer<Metrics> { - public MetricsJacksonSerializer() { - super(Metrics.class); - } - - @Override - public void serialize(final Metrics metrics, final JsonGenerator jsonGenerator, - final SerializerProvider serializerProvider) throws IOException { - final Map<String, Object> m = new HashMap<>(); - m.put(GraphSONTokens.ID, metrics.getId()); - m.put(GraphSONTokens.NAME, metrics.getName()); - m.put(GraphSONTokens.COUNTS, metrics.getCounts()); - m.put(GraphSONTokens.DURATION, metrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); - - if (!metrics.getAnnotations().isEmpty()) { - m.put(GraphSONTokens.ANNOTATIONS, metrics.getAnnotations()); - } - if (!metrics.getNested().isEmpty()) { - final List<Metrics> nested = new ArrayList<>(); - metrics.getNested().forEach(it -> nested.add(it)); - m.put(GraphSONTokens.METRICS, nested); - } - jsonGenerator.writeObject(m); - } - } - - /** * Maps in the JVM can have {@link Object} as a key, but in JSON they must be a {@link String}. */ @@ -651,83 +567,6 @@ class GraphSONSerializersV4 { } } - static class TraversalExplanationJacksonDeserializer extends StdDeserializer<TraversalExplanation> { - public TraversalExplanationJacksonDeserializer() { - super(TraversalExplanation.class); - } - - @Override - public TraversalExplanation deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - final Map<String, Object> explainData = deserializationContext.readValue(jsonParser, Map.class); - final String originalTraversal = explainData.get(GraphSONTokens.ORIGINAL).toString(); - final List<Triplet<String, String, String>> intermediates = new ArrayList<>(); - final List<Map<String,Object>> listMap = (List<Map<String,Object>>) explainData.get(GraphSONTokens.INTERMEDIATE); - for (Map<String,Object> m : listMap) { - intermediates.add(Triplet.with(m.get(GraphSONTokens.STRATEGY).toString(), - m.get(GraphSONTokens.CATEGORY).toString(), - m.get(GraphSONTokens.TRAVERSAL).toString())); - } - - return new ImmutableExplanation(originalTraversal, intermediates); - } - - @Override - public boolean isCachable() { - return true; - } - } - - static class MetricsJacksonDeserializer extends StdDeserializer<Metrics> { - public MetricsJacksonDeserializer() { - super(Metrics.class); - } - - @Override - public Metrics deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - final Map<String, Object> metricsData = deserializationContext.readValue(jsonParser, Map.class); - final MutableMetrics m = new MutableMetrics((String)metricsData.get(GraphSONTokens.ID), (String)metricsData.get(GraphSONTokens.NAME)); - - m.setDuration(Math.round((Double) metricsData.get(GraphSONTokens.DURATION) * 1000000), TimeUnit.NANOSECONDS); - for (Map.Entry<String, Long> count : ((Map<String, Long>)metricsData.getOrDefault(GraphSONTokens.COUNTS, new LinkedHashMap<>(0))).entrySet()) { - m.setCount(count.getKey(), count.getValue()); - } - for (Map.Entry<String, Long> count : ((Map<String, Long>) metricsData.getOrDefault(GraphSONTokens.ANNOTATIONS, new LinkedHashMap<>(0))).entrySet()) { - m.setAnnotation(count.getKey(), count.getValue()); - } - for (MutableMetrics nested : (List<MutableMetrics>)metricsData.getOrDefault(GraphSONTokens.METRICS, new ArrayList<>(0))) { - m.addNested(nested); - } - return m; - } - - @Override - public boolean isCachable() { - return true; - } - } - - static class TraversalMetricsJacksonDeserializer extends StdDeserializer<TraversalMetrics> { - - public TraversalMetricsJacksonDeserializer() { - super(TraversalMetrics.class); - } - - @Override - public TraversalMetrics deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - final Map<String, Object> traversalMetricsData = deserializationContext.readValue(jsonParser, Map.class); - - return new DefaultTraversalMetrics( - Math.round((Double) traversalMetricsData.get(GraphSONTokens.DURATION) * 1000000), - (List<MutableMetrics>) traversalMetricsData.get(GraphSONTokens.METRICS) - ); - } - - @Override - public boolean isCachable() { - return true; - } - } - static class TreeJacksonDeserializer extends StdDeserializer<Tree> { public TreeJacksonDeserializer() { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java index aa7ad5e9ad..dfceb7a9ab 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONXModuleV4.java @@ -54,22 +54,10 @@ public final class GraphSONXModuleV4 extends GraphSONModule { put(BigDecimal.class, "BigDecimal"); put(Byte.class, "Byte"); put(Character.class, "Char"); - put(InetAddress.class, "InetAddress"); // Time serializers/deserializers put(Duration.class, "Duration"); - put(Instant.class, "Instant"); - put(LocalDate.class, "LocalDate"); - put(LocalDateTime.class, "LocalDateTime"); - put(LocalTime.class, "LocalTime"); - put(MonthDay.class, "MonthDay"); put(OffsetDateTime.class, "DateTime"); - put(OffsetTime.class, "OffsetTime"); - put(Period.class, "Period"); - put(Year.class, "Year"); - put(YearMonth.class, "YearMonth"); - put(ZonedDateTime.class, "ZonedDateTime"); - put(ZoneOffset.class, "ZoneOffset"); }}); /** @@ -82,35 +70,13 @@ public final class GraphSONXModuleV4 extends GraphSONModule { // java.time addSerializer(Duration.class, new JavaTimeSerializersV4.DurationJacksonSerializer()); - addSerializer(Instant.class, new JavaTimeSerializersV4.InstantJacksonSerializer()); - addSerializer(LocalDate.class, new JavaTimeSerializersV4.LocalDateJacksonSerializer()); - addSerializer(LocalDateTime.class, new JavaTimeSerializersV4.LocalDateTimeJacksonSerializer()); - addSerializer(LocalTime.class, new JavaTimeSerializersV4.LocalTimeJacksonSerializer()); - addSerializer(MonthDay.class, new JavaTimeSerializersV4.MonthDayJacksonSerializer()); addSerializer(OffsetDateTime.class, new JavaTimeSerializersV4.OffsetDateTimeJacksonSerializer()); - addSerializer(OffsetTime.class, new JavaTimeSerializersV4.OffsetTimeJacksonSerializer()); - addSerializer(Period.class, new JavaTimeSerializersV4.PeriodJacksonSerializer()); - addSerializer(Year.class, new JavaTimeSerializersV4.YearJacksonSerializer()); - addSerializer(YearMonth.class, new JavaTimeSerializersV4.YearMonthJacksonSerializer()); - addSerializer(ZonedDateTime.class, new JavaTimeSerializersV4.ZonedDateTimeJacksonSerializer()); - addSerializer(ZoneOffset.class, new JavaTimeSerializersV4.ZoneOffsetJacksonSerializer()); /////////////////////// DESERIALIZERS //////////////////////////// // java.time addDeserializer(Duration.class, new JavaTimeSerializersV4.DurationJacksonDeserializer()); - addDeserializer(Instant.class, new JavaTimeSerializersV4.InstantJacksonDeserializer()); - addDeserializer(LocalDate.class, new JavaTimeSerializersV4.LocalDateJacksonDeserializer()); - addDeserializer(LocalDateTime.class, new JavaTimeSerializersV4.LocalDateTimeJacksonDeserializer()); - addDeserializer(LocalTime.class, new JavaTimeSerializersV4.LocalTimeJacksonDeserializer()); - addDeserializer(MonthDay.class, new JavaTimeSerializersV4.MonthDayJacksonDeserializer()); addDeserializer(OffsetDateTime.class, new JavaTimeSerializersV4.OffsetDateTimeJacksonDeserializer()); - addDeserializer(OffsetTime.class, new JavaTimeSerializersV4.OffsetTimeJacksonDeserializer()); - addDeserializer(Period.class, new JavaTimeSerializersV4.PeriodJacksonDeserializer()); - addDeserializer(Year.class, new JavaTimeSerializersV4.YearJacksonDeserializer()); - addDeserializer(YearMonth.class, new JavaTimeSerializersV4.YearMonthJacksonDeserializer()); - addDeserializer(ZonedDateTime.class, new JavaTimeSerializersV4.ZonedDateTimeJacksonDeserializer()); - addDeserializer(ZoneOffset.class, new JavaTimeSerializersV4.ZoneOffsetJacksonDeserializer()); } public static GraphSONModuleBuilder build() { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV4.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV4.java index 891aa667d7..1a1633d294 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV4.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/JavaTimeSerializersV4.java @@ -110,96 +110,6 @@ final class JavaTimeSerializersV4 { } } - 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() { @@ -217,112 +127,4 @@ final class JavaTimeSerializersV4 { 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); - } - } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV4.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV4.java index 77a905cc35..1754ee6bd8 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV4.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV4.java @@ -19,37 +19,16 @@ package org.apache.tinkerpop.gremlin.structure.io.graphson; -import org.apache.commons.configuration2.ConfigurationConverter; -import org.apache.commons.configuration2.MapConfiguration; -import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.TextP; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; -import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; -import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; -import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; -import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; -import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator; import org.apache.tinkerpop.shaded.jackson.core.JsonParser; import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException; -import org.apache.tinkerpop.shaded.jackson.core.JsonToken; 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.StdScalarSerializer; -import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer; import java.io.IOException; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -63,26 +42,6 @@ final class TraversalSerializersV4 { // SERIALIZERS // //////////////// - final static class TraversalJacksonSerializer extends StdSerializer<Traversal> { - - public TraversalJacksonSerializer() { - super(Traversal.class); - } - - @Override - public void serialize(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - jsonGenerator.writeObject(traversal.asAdmin().getGremlinLang()); - } - - @Override - public void serializeWithType(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) - throws IOException { - serialize(traversal, jsonGenerator, serializerProvider); - } - - } - static class EnumJacksonSerializer extends StdScalarSerializer<Enum> { public EnumJacksonSerializer() { @@ -97,49 +56,6 @@ final class TraversalSerializersV4 { } - final static class PJacksonSerializer extends StdScalarSerializer<P> { - - public PJacksonSerializer() { - super(P.class); - } - - @Override - public void serialize(final P p, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - jsonGenerator.writeStartObject(); - jsonGenerator.writeStringField(GraphSONTokens.PREDICATE, p.getPredicateName()); - if (p instanceof ConnectiveP) { - jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE); - for (final P<?> predicate : ((ConnectiveP<?>) p).getPredicates()) { - jsonGenerator.writeObject(predicate); - } - jsonGenerator.writeEndArray(); - } else - jsonGenerator.writeObjectField(GraphSONTokens.VALUE, p.getValue()); - - jsonGenerator.writeEndObject(); - } - - } - - final static class LambdaJacksonSerializer extends StdScalarSerializer<Lambda> { - - public LambdaJacksonSerializer() { - super(Lambda.class); - } - - @Override - public void serialize(final Lambda lambda, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - jsonGenerator.writeStartObject(); - jsonGenerator.writeStringField(GraphSONTokens.SCRIPT, lambda.getLambdaScript()); - jsonGenerator.writeStringField(GraphSONTokens.LANGUAGE, lambda.getLambdaLanguage()); - jsonGenerator.writeNumberField(GraphSONTokens.ARGUMENTS, lambda.getLambdaArguments()); - jsonGenerator.writeEndObject(); - } - - } - final static class BulkSetJacksonSerializer extends StdScalarSerializer<BulkSet> { public BulkSetJacksonSerializer() { @@ -157,23 +73,6 @@ final class TraversalSerializersV4 { } } - final static class TraversalStrategyJacksonSerializer extends StdScalarSerializer<TraversalStrategy> { - - public TraversalStrategyJacksonSerializer() { - super(TraversalStrategy.class); - } - - @Override - public void serialize(final TraversalStrategy traversalStrategy, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) - throws IOException { - jsonGenerator.writeStartObject(); - for (final Map.Entry<Object, Object> entry : ConfigurationConverter.getMap(traversalStrategy.getConfiguration()).entrySet()) { - jsonGenerator.writeObjectField((String) entry.getKey(), entry.getValue()); - } - jsonGenerator.writeEndObject(); - } - } - /////////////////// // DESERIALIZERS // ////////////////// @@ -200,200 +99,4 @@ final class TraversalSerializersV4 { return true; } } - - final static class PJacksonDeserializer extends AbstractReflectJacksonDeserializer<P> { - - public PJacksonDeserializer() { - super(P.class); - } - - @Override - public P deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - String predicate = null; - Object value = null; - - while (jsonParser.nextToken() != JsonToken.END_OBJECT) { - if (jsonParser.getCurrentName().equals(GraphSONTokens.PREDICATE)) { - jsonParser.nextToken(); - predicate = jsonParser.getText(); - } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) { - jsonParser.nextToken(); - value = deserializationContext.readValue(jsonParser, Object.class); - } - } - - if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) { - return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value); - } else if (predicate.equals(GraphSONTokens.NOT) && value instanceof P) { - return P.not((P<?>) value); - } else { - try { - if (value instanceof Collection) { - if (predicate.equals("between")) - return P.between(((List) value).get(0), ((List) value).get(1)); - else if (predicate.equals("inside")) - return P.between(((List) value).get(0), ((List) value).get(1)); - else if (predicate.equals("outside")) - return P.outside(((List) value).get(0), ((List) value).get(1)); - else if (predicate.equals("within")) - return P.within((Collection) value); - else if (predicate.equals("without")) - return P.without((Collection) value); - else - return (P) tryFindMethod(P.class, predicate, Collection.class).invoke(null, (Collection) value); - } else { - try { - return (P) tryFindMethod(P.class, predicate, Object.class).invoke(null, value); - } catch (final NoSuchMethodException e) { - return (P) tryFindMethod(P.class, predicate, Object[].class).invoke(null, (Object) new Object[]{value}); - } - } - } catch (final Exception e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - } - - @Override - public boolean isCachable() { - return true; - } - } - - /** - * Deserializers that make reflection calls can use this class as a base and thus cache reflected methods to avoid - * future lookups. - */ - static abstract class AbstractReflectJacksonDeserializer<T> extends StdDeserializer<T> { - private final Map<CacheKey, Method> CACHE = new ConcurrentHashMap<>(); - - public AbstractReflectJacksonDeserializer(final Class<? extends T> clazz) { - super(clazz); - } - - protected Method tryFindMethod(final Class<?> base, final String methodName, final Class<?> parameterType) throws Exception { - return CACHE.computeIfAbsent(new CacheKey(methodName, parameterType), - cacheKey -> { - try { - return base.getMethod(methodName, parameterType); - } catch (Exception e) { - throw new IllegalStateException(e.getMessage(), e); - } - }); - } - - private static class CacheKey { - private final String predicate; - private final Class<?> parameterType; - - public CacheKey(final String predicate, final Class<?> parameterType) { - this.predicate = Objects.requireNonNull(predicate); - this.parameterType = Objects.requireNonNull(parameterType); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - final CacheKey cacheKey = (CacheKey) o; - return predicate.equals(cacheKey.predicate) && - parameterType.equals(cacheKey.parameterType); - } - - @Override - public int hashCode() { - return Objects.hash(predicate, parameterType); - } - } - } - - final static class TextPJacksonDeserializer extends AbstractReflectJacksonDeserializer<TextP> { - - public TextPJacksonDeserializer() { - super(TextP.class); - } - - @Override - public TextP deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - String predicate = null; - String value = null; - - while (jsonParser.nextToken() != JsonToken.END_OBJECT) { - if (jsonParser.getCurrentName().equals(GraphSONTokens.PREDICATE)) { - jsonParser.nextToken(); - predicate = jsonParser.getText(); - } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) { - jsonParser.nextToken(); - value = deserializationContext.readValue(jsonParser, String.class); - } - } - - try { - return (TextP) tryFindMethod(TextP.class, predicate, String.class).invoke(null, value); - } catch (final Exception e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - @Override - public boolean isCachable() { - return true; - } - } - - final static class LambdaJacksonDeserializer extends StdDeserializer<Lambda> { - - public LambdaJacksonDeserializer() { - super(Lambda.class); - } - - @Override - public Lambda deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - String script = null; - String language = null; - int arguments = -1; - - while (jsonParser.nextToken() != JsonToken.END_OBJECT) { - if (jsonParser.getCurrentName().equals(GraphSONTokens.SCRIPT)) { - jsonParser.nextToken(); - script = jsonParser.getText(); - } else if (jsonParser.getCurrentName().equals(GraphSONTokens.LANGUAGE)) { - jsonParser.nextToken(); - language = jsonParser.getText(); - } else if (jsonParser.getCurrentName().equals(GraphSONTokens.ARGUMENTS)) { - jsonParser.nextToken(); - arguments = jsonParser.getIntValue(); - } - } - - if (-1 == arguments || arguments > 2) - return new Lambda.UnknownArgLambda(script, language, arguments); - else if (0 == arguments) - return new Lambda.ZeroArgLambda<>(script, language); - else if (1 == arguments) - return new Lambda.OneArgLambda<>(script, language); - else - return new Lambda.TwoArgLambda<>(script, language); - } - - @Override - public boolean isCachable() { - return true; - } - } - - final static class TraversalStrategyProxyJacksonDeserializer<T extends TraversalStrategy> extends AbstractObjectDeserializer<TraversalStrategyProxy> { - - private final Class<T> clazz; - - public TraversalStrategyProxyJacksonDeserializer(final Class<T> clazz) { - super(TraversalStrategyProxy.class); - this.clazz = clazz; - } - - @Override - public TraversalStrategyProxy<T> createObject(final Map<String, Object> data) { - return new TraversalStrategyProxy<>(this.clazz, new MapConfiguration(data)); - } - } } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java index 872df275e2..b35423c70b 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java @@ -109,7 +109,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleTraversalExplanation() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final TraversalExplanation o = __().out().outV().outE().explain(); final TraversalExplanation deser = serializeDeserialize(mapper, o, TraversalExplanation.class); @@ -195,7 +195,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleBiFunctionLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.biFunction("x,y -> 'test'"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -203,7 +203,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleComparatorLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.comparator("x,y -> x <=> y"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -211,7 +211,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleConsumerLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.consumer("x -> x"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -219,7 +219,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleFunctionLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.function("x -> x"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -227,7 +227,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePredicateLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.predicate("x -> true"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -235,7 +235,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleSupplierLambda() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final Lambda o = (Lambda) Lambda.supplier("'test'"); assertEquals(o, serializeDeserialize(mapper, o, Lambda.class)); @@ -249,30 +249,40 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleInstant() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Instant o = Instant.ofEpochMilli(System.currentTimeMillis()); assertEquals(o, serializeDeserialize(mapper, o, Instant.class)); } @Test public void shouldHandleLocalDate() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalDate o = LocalDate.now(); assertEquals(o, serializeDeserialize(mapper, o, LocalDate.class)); } @Test public void shouldHandleLocalDateTime() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalDateTime o = LocalDateTime.now(); assertEquals(o, serializeDeserialize(mapper, o, LocalDateTime.class)); } @Test public void shouldHandleLocalTime() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalTime o = LocalTime.now(); assertEquals(o, serializeDeserialize(mapper, o, LocalTime.class)); } @Test public void shouldHandleMonthDay() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final MonthDay o = MonthDay.now(); assertEquals(o, serializeDeserialize(mapper, o, MonthDay.class)); } @@ -285,36 +295,48 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandleOffsetTime() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final OffsetTime o = OffsetTime.now(); assertEquals(o, serializeDeserialize(mapper, o, OffsetTime.class)); } @Test public void shouldHandlePeriod() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Period o = Period.ofDays(3); assertEquals(o, serializeDeserialize(mapper, o, Period.class)); } @Test public void shouldHandleYear() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Year o = Year.now(); assertEquals(o, serializeDeserialize(mapper, o, Year.class)); } @Test public void shouldHandleYearMonth() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final YearMonth o = YearMonth.now(); assertEquals(o, serializeDeserialize(mapper, o, YearMonth.class)); } @Test public void shouldHandleZonedDateTime() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final ZonedDateTime o = ZonedDateTime.now(); assertEquals(o, serializeDeserialize(mapper, o, ZonedDateTime.class)); } @Test public void shouldHandleZonedOffset() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final ZoneOffset o = ZonedDateTime.now().getOffset(); assertEquals(o, serializeDeserialize(mapper, o, ZoneOffset.class)); } @@ -365,7 +387,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePMultiValue() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = P.within(1,2,3,null); assertEquals(o, serializeDeserialize(mapper, o, P.class)); @@ -373,7 +395,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePSingleValue() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = P.within(1); assertEquals(o, serializeDeserialize(mapper, o, P.class)); @@ -381,7 +403,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePMultiValueAsList() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = P.within(Arrays.asList(1,2,3,null)); assertEquals(o, serializeDeserialize(mapper, o, P.class)); @@ -389,7 +411,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePMultiValueAsSet() throws Exception { - assumeThat(version, either(startsWith("v3")).or(startsWith("v4"))); + assumeThat(version, startsWith("v3")); final P o = P.within(new HashSet<>(Arrays.asList(1,2,3))); assertEquals(o, serializeDeserialize(mapper, o, P.class)); @@ -397,7 +419,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePBetween() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = P.between(1, 100); assertEquals(o, serializeDeserialize(mapper, o, P.class)); @@ -407,7 +429,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { public void shouldReadPWithJsonArray() throws Exception { // for some reason v3 is forgiving about the naked json array - leaving this here for backward compatibility, // but should be a g:List (i think) - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = P.within(Arrays.asList(1,2,3)); assertEquals(o, mapper.readValue("{\"@type\": \"g:P\", \"@value\": {\"predicate\": \"within\", \"value\": [{\"@type\": \"g:Int32\", \"@value\": 1},{\"@type\": \"g:Int32\", \"@value\": 2},{\"@type\": \"g:Int32\", \"@value\": 3}]}}", Object.class)); @@ -452,7 +474,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest { @Test public void shouldHandlePExt() throws Exception { - assumeThat(version, not(startsWith("v1"))); + assumeThat(version, either(startsWith("v2")).or(startsWith("v3"))); final P o = PExt.mix("bah"); assertEquals(o, serializeDeserialize(mapper, o, P.class)); diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java index 5315c1a9ec..99b45a8685 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java @@ -31,6 +31,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.time.Instant; +import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -145,7 +146,7 @@ public class GraphSONMapperPartialEmbeddedTypeTest extends AbstractGraphSONTest @Test public void shouldFailIfTypeSpecifiedIsNotSameTypeInPayload() { - final ZoneOffset o = ZonedDateTime.now().getOffset(); + final OffsetDateTime o = OffsetDateTime.now(); final ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { mapper.writeValue(stream, o); @@ -155,9 +156,9 @@ public class GraphSONMapperPartialEmbeddedTypeTest extends AbstractGraphSONTest fail("Should have failed decoding the value"); } catch (Exception e) { if (version.startsWith("v4")) { - assertThat(e.getMessage(), containsString("Could not deserialize the JSON value as required. Nested exception: java.lang.InstantiationException: Cannot deserialize the value with the detected type contained in the JSON ('" + GraphSONTokens.GREMLIN_TYPE_NAMESPACE + ":ZoneOffset') to the type specified in parameter to the object mapper (class java.time.Instant). Those types are incompatible.")); + assertThat(e.getMessage(), containsString("Could not deserialize the JSON value as required. Nested exception: java.lang.InstantiationException: Cannot deserialize the value with the detected type contained in the JSON ('" + GraphSONTokens.GREMLIN_TYPE_NAMESPACE + ":DateTime') to the type specified in parameter to the object mapper (class java.time.Instant). Those types are incompatible.")); } else { - assertThat(e.getMessage(), containsString("Could not deserialize the JSON value as required. Nested exception: java.lang.InstantiationException: Cannot deserialize the value with the detected type contained in the JSON ('" + GraphSONTokens.GREMLINX_TYPE_NAMESPACE + ":ZoneOffset') to the type specified in parameter to the object mapper (class java.time.Instant). Those types are incompatible.")); + assertThat(e.getMessage(), containsString("Could not deserialize the JSON value as required. Nested exception: java.lang.InstantiationException: Cannot deserialize the value with the detected type contained in the JSON ('" + GraphSONTokens.GREMLINX_TYPE_NAMESPACE + ":OffsetDateTime') to the type specified in parameter to the object mapper (class java.time.Instant). Those types are incompatible.")); } } } @@ -276,6 +277,8 @@ public class GraphSONMapperPartialEmbeddedTypeTest extends AbstractGraphSONTest @Test public void shouldHandleVariantsOfP() throws Exception { + if (version.startsWith("v4")) return; + final List<P> variantsOfP = Arrays.asList( P.between(1,2), P.eq(1), diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java index 052e95b15b..27ad64a369 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java @@ -53,7 +53,10 @@ import java.util.HashMap; import java.util.HashSet; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.__; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.StringStartsWith.startsWith; import static org.junit.Assert.assertEquals; +import static org.junit.Assume.assumeThat; /** * @author Stephen Mallette (http://stephen.genoprime.com) @@ -172,6 +175,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleTraversalExplanation() throws Exception { + assumeThat(version, not(startsWith("v4"))); + final TraversalExplanation te = __().out().outV().outE().explain(); final String json = mapper.writeValueAsString(te); assertEquals("{\"original\":[\"InjectStep([])\",\"VertexStep(OUT,vertex)\",\"EdgeVertexStep(OUT)\",\"VertexStep(OUT,edge)\"],\"intermediate\":[],\"final\":[\"InjectStep([])\",\"VertexStep(OUT,vertex)\",\"EdgeVertexStep(OUT)\",\"VertexStep(OUT,edge)\"]}", json); @@ -186,6 +191,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleInstant()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Instant o = Instant.ofEpochMilli(System.currentTimeMillis()); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -193,6 +200,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleLocalDate()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalDate o = LocalDate.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -200,6 +209,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleLocalDateTime()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalDateTime o = LocalDateTime.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -207,6 +218,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleLocalTime()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final LocalTime o = LocalTime.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -214,6 +227,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleMonthDay()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final MonthDay o = MonthDay.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -228,6 +243,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleOffsetTime()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final OffsetTime o = OffsetTime.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -235,6 +252,8 @@ public class GraphSONMapperTest { @Test public void shouldHandlePeriod()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Period o = Period.ofDays(3); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -242,6 +261,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleYear()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final Year o = Year.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -249,6 +270,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleYearMonth()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final YearMonth o = YearMonth.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -256,6 +279,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleZonedDateTime()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final ZonedDateTime o = ZonedDateTime.now(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); @@ -263,6 +288,8 @@ public class GraphSONMapperTest { @Test public void shouldHandleZoneOffset()throws Exception { + assumeThat(version, not(startsWith("v4"))); + final ZoneOffset o = ZonedDateTime.now().getOffset(); final String json = mapper.writeValueAsString(o); assertEquals("\"" + o.toString() + "\"", json); diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java index 0ebcc28473..a9a179f4d7 100644 --- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java +++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java @@ -61,7 +61,7 @@ import javax.script.SimpleBindings; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; -import java.time.Instant; +import java.time.OffsetDateTime; import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -478,14 +478,14 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra final CloseableHttpClient httpclient = HttpClients.createDefault(); final HttpPost httppost = new HttpPost(TestClientFactory.createURLString()); httppost.addHeader("Content-Type", "application/json"); - httppost.setEntity(new StringEntity("{\"gremlin\":\"java.time.Instant.MAX\"}", Consts.UTF_8)); + httppost.setEntity(new StringEntity("{\"gremlin\":\"java.time.OffsetDateTime.MAX\"}", Consts.UTF_8)); try (final CloseableHttpResponse response = httpclient.execute(httppost)) { assertEquals(200, response.getStatusLine().getStatusCode()); assertEquals("application/json", response.getEntity().getContentType().getValue()); final String json = EntityUtils.toString(response.getEntity()); final JsonNode node = mapper.readTree(json); - assertEquals(Instant.MAX, Instant.parse(node.get("result").get(TOKEN_DATA).get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asText())); + assertEquals(OffsetDateTime.MAX, OffsetDateTime.parse(node.get("result").get(TOKEN_DATA).get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).asText())); } }
