Repository: tinkerpop Updated Branches: refs/heads/tp32 34d9e584a -> 11cc96973
Moved class/serializer registrations for gryo to GryoVersion. This way, the Builder doesn't have to be responsible for constructing that stuff and it doesn't need to be subclassed. As a result the version of gryo can just be passed to the Builder which can then grab the registrations from that. CTR Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/11cc9697 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/11cc9697 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/11cc9697 Branch: refs/heads/tp32 Commit: 11cc9697359bb22be60d219f2ae9adc8e569fb87 Parents: 34d9e58 Author: Stephen Mallette <[email protected]> Authored: Wed Dec 21 11:51:34 2016 -0500 Committer: Stephen Mallette <[email protected]> Committed: Wed Dec 21 11:51:34 2016 -0500 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 2 +- .../gremlin/structure/io/gryo/GryoMapper.java | 424 +------------------ .../gremlin/structure/io/gryo/GryoTypeReg.java | 140 ++++++ .../gremlin/structure/io/gryo/GryoVersion.java | 302 ++++++++++++- 4 files changed, 462 insertions(+), 406 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/11cc9697/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 6fd7255..33ce26e 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,7 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* Added `GryoVersion` for future flexibility when introducing a new verison of Gryo. +* Added `GryoVersion` for future flexibility when introducing a new verison of Gryo and moved serializer registrations to it. * Lessened the severity of Gremlin Server logging when it encounters two or more serializers addressing the same mime type. * Bumped to Netty 4.0.42.final. * Added `ByteBuffer`, `InetAddress`, `Timestamp` to the list of Gryo supported classes. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/11cc9697/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java index cece932..c42a4fc 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java @@ -18,125 +18,25 @@ */ package org.apache.tinkerpop.gremlin.structure.io.gryo; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.apache.tinkerpop.gremlin.process.computer.GraphFilter; -import org.apache.tinkerpop.gremlin.process.computer.MapReduce; -import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory; -import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; -import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; -import org.apache.tinkerpop.gremlin.process.traversal.Contains; -import org.apache.tinkerpop.gremlin.process.traversal.Operator; -import org.apache.tinkerpop.gremlin.process.traversal.Order; -import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.Path; -import org.apache.tinkerpop.gremlin.process.traversal.Pop; -import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; -import org.apache.tinkerpop.gremlin.process.traversal.Scope; -import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; -import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser; -import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; -import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; -import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics; -import org.apache.tinkerpop.gremlin.process.traversal.util.ImmutableMetrics; -import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics; -import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation; -import org.apache.tinkerpop.gremlin.structure.Column; -import org.apache.tinkerpop.gremlin.structure.Direction; -import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.Property; -import org.apache.tinkerpop.gremlin.structure.T; -import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.io.IoRegistry; import org.apache.tinkerpop.gremlin.structure.io.Mapper; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; -import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedSerializerAdapter; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty; -import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph; -import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphSerializer; -import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier; -import org.apache.tinkerpop.gremlin.util.function.Lambda; import org.apache.tinkerpop.shaded.kryo.ClassResolver; import org.apache.tinkerpop.shaded.kryo.Kryo; -import org.apache.tinkerpop.shaded.kryo.KryoSerializable; import org.apache.tinkerpop.shaded.kryo.Serializer; -import org.apache.tinkerpop.shaded.kryo.serializers.JavaSerializer; import org.apache.tinkerpop.shaded.kryo.util.DefaultStreamFactory; import org.apache.tinkerpop.shaded.kryo.util.MapReferenceResolver; import org.javatuples.Pair; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.InetAddress; -import java.net.URI; -import java.nio.ByteBuffer; -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; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Currency; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.TimeZone; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -177,9 +77,11 @@ public final class GryoMapper implements Mapper<Kryo> { private final boolean registrationRequired; private final boolean referenceTracking; private final Supplier<ClassResolver> classResolver; + private final GryoVersion version; private GryoMapper(final Builder builder) { this.typeRegistrations = builder.typeRegistrations; + this.version = builder.version; validate(); this.registrationRequired = builder.registrationRequired; @@ -198,6 +100,10 @@ public final class GryoMapper implements Mapper<Kryo> { return kryo; } + public GryoVersion getVersion() { + return version; + } + public List<Class> getRegisteredClasses() { return this.typeRegistrations.stream().map(TypeRegistration::getTargetClass).collect(Collectors.toList()); } @@ -207,11 +113,7 @@ public final class GryoMapper implements Mapper<Kryo> { } public static Builder build() { - return build(GryoVersion.V1_0); - } - - public static Builder build(final GryoVersion version) { - return new BuilderV1d0(); + return new Builder(); } private void validate() { @@ -229,185 +131,18 @@ public final class GryoMapper implements Mapper<Kryo> { throw new IllegalStateException("There are duplicate kryo identifiers in use: " + duplicates); } - public final static class BuilderV1d0 extends Builder { - @Override - public List<TypeRegistration<?>> initTypeRegistrations() { - return new ArrayList<TypeRegistration<?>>() {{ - add(GryoTypeReg.of(byte[].class, 25)); - add(GryoTypeReg.of(char[].class, 26)); - add(GryoTypeReg.of(short[].class, 27)); - add(GryoTypeReg.of(int[].class, 28)); - add(GryoTypeReg.of(long[].class, 29)); - add(GryoTypeReg.of(float[].class, 30)); - add(GryoTypeReg.of(double[].class, 31)); - add(GryoTypeReg.of(String[].class, 32)); - add(GryoTypeReg.of(Object[].class, 33)); - add(GryoTypeReg.of(ArrayList.class, 10)); - add(GryoTypeReg.of(ARRAYS_AS_LIST, 134, new UtilSerializers.ArraysAsListSerializer())); - add(GryoTypeReg.of(BigInteger.class, 34)); - add(GryoTypeReg.of(BigDecimal.class, 35)); - add(GryoTypeReg.of(Calendar.class, 39)); - add(GryoTypeReg.of(Class.class, 41, new UtilSerializers.ClassSerializer())); - add(GryoTypeReg.of(Collection.class, 37)); - add(GryoTypeReg.of(Collections.EMPTY_LIST.getClass(), 51)); - add(GryoTypeReg.of(Collections.EMPTY_MAP.getClass(), 52)); - add(GryoTypeReg.of(Collections.EMPTY_SET.getClass(), 53)); - add(GryoTypeReg.of(Collections.singleton(null).getClass(), 54)); - add(GryoTypeReg.of(Collections.singletonList(null).getClass(), 24)); - add(GryoTypeReg.of(Collections.singletonMap(null, null).getClass(), 23)); - add(GryoTypeReg.of(Contains.class, 49)); - add(GryoTypeReg.of(Currency.class, 40)); - add(GryoTypeReg.of(Date.class, 38)); - add(GryoTypeReg.of(Direction.class, 12)); - add(GryoTypeReg.of(DetachedEdge.class, 21)); - add(GryoTypeReg.of(DetachedVertexProperty.class, 20)); - add(GryoTypeReg.of(DetachedProperty.class, 18)); - add(GryoTypeReg.of(DetachedVertex.class, 19)); - add(GryoTypeReg.of(DetachedPath.class, 60)); - // skip 14 - add(GryoTypeReg.of(EnumSet.class, 46)); - add(GryoTypeReg.of(HashMap.class, 11)); - add(GryoTypeReg.of(HashMap.Entry.class, 16)); - add(GryoTypeReg.of(HASH_MAP_NODE, 92)); - add(GryoTypeReg.of(KryoSerializable.class, 36)); - add(GryoTypeReg.of(LinkedHashMap.class, 47)); - add(GryoTypeReg.of(LinkedHashSet.class, 71)); - add(GryoTypeReg.of(LinkedList.class, 116)); - add(GryoTypeReg.of(LINKED_HASH_MAP_ENTRY_CLASS, 15)); - add(GryoTypeReg.of(Locale.class, 22)); - add(GryoTypeReg.of(StringBuffer.class, 43)); - add(GryoTypeReg.of(StringBuilder.class, 44)); - add(GryoTypeReg.of(T.class, 48)); - add(GryoTypeReg.of(TimeZone.class, 42)); - add(GryoTypeReg.of(TreeMap.class, 45)); - add(GryoTypeReg.of(TreeSet.class, 50)); - add(GryoTypeReg.of(UUID.class, 17, new UtilSerializers.UUIDSerializer())); - add(GryoTypeReg.of(URI.class, 72, new UtilSerializers.URISerializer())); - add(GryoTypeReg.of(VertexTerminator.class, 13)); - add(GryoTypeReg.of(AbstractMap.SimpleEntry.class, 120)); - add(GryoTypeReg.of(AbstractMap.SimpleImmutableEntry.class, 121)); - add(GryoTypeReg.of(java.sql.Timestamp.class, 161)); - add(GryoTypeReg.of(InetAddress.class, 162, new UtilSerializers.InetAddressSerializer())); - add(GryoTypeReg.of(ByteBuffer.class, 163, new UtilSerializers.ByteBufferSerializer())); // ***LAST ID*** - - add(GryoTypeReg.of(ReferenceEdge.class, 81)); - add(GryoTypeReg.of(ReferenceVertexProperty.class, 82)); - add(GryoTypeReg.of(ReferenceProperty.class, 83)); - add(GryoTypeReg.of(ReferenceVertex.class, 84)); - add(GryoTypeReg.of(ReferencePath.class, 85)); - - add(GryoTypeReg.of(StarGraph.class, 86, new StarGraphSerializer(Direction.BOTH, new GraphFilter()))); - - add(GryoTypeReg.of(Edge.class, 65, new GryoSerializers.EdgeSerializer())); - add(GryoTypeReg.of(Vertex.class, 66, new GryoSerializers.VertexSerializer())); - add(GryoTypeReg.of(Property.class, 67, new GryoSerializers.PropertySerializer())); - add(GryoTypeReg.of(VertexProperty.class, 68, new GryoSerializers.VertexPropertySerializer())); - add(GryoTypeReg.of(Path.class, 59, new GryoSerializers.PathSerializer())); - // skip 55 - add(GryoTypeReg.of(B_O_Traverser.class, 75)); - add(GryoTypeReg.of(O_Traverser.class, 76)); - add(GryoTypeReg.of(B_LP_O_P_S_SE_SL_Traverser.class, 77)); - add(GryoTypeReg.of(B_O_S_SE_SL_Traverser.class, 78)); - add(GryoTypeReg.of(B_LP_O_S_SE_SL_Traverser.class, 87)); - add(GryoTypeReg.of(O_OB_S_SE_SL_Traverser.class, 89)); - add(GryoTypeReg.of(LP_O_OB_S_SE_SL_Traverser.class, 90)); - add(GryoTypeReg.of(LP_O_OB_P_S_SE_SL_Traverser.class, 91)); - add(GryoTypeReg.of(DefaultRemoteTraverser.class, 123, new GryoSerializers.DefaultRemoteTraverserSerializer())); - - add(GryoTypeReg.of(Bytecode.class, 122, new GryoSerializers.BytecodeSerializer())); - add(GryoTypeReg.of(P.class, 124, new GryoSerializers.PSerializer())); - add(GryoTypeReg.of(Lambda.class, 125, new GryoSerializers.LambdaSerializer())); - add(GryoTypeReg.of(Bytecode.Binding.class, 126, new GryoSerializers.BindingSerializer())); - add(GryoTypeReg.of(Order.class, 127)); - add(GryoTypeReg.of(Scope.class, 128)); - add(GryoTypeReg.of(AndP.class, 129, new GryoSerializers.AndPSerializer())); - add(GryoTypeReg.of(OrP.class, 130, new GryoSerializers.OrPSerializer())); - add(GryoTypeReg.of(VertexProperty.Cardinality.class, 131)); - add(GryoTypeReg.of(Column.class, 132)); - add(GryoTypeReg.of(Pop.class, 133)); - add(GryoTypeReg.of(SackFunctions.Barrier.class, 135)); - add(GryoTypeReg.of(TraversalOptionParent.Pick.class, 137)); - add(GryoTypeReg.of(HashSetSupplier.class, 136, new UtilSerializers.HashSetSupplierSerializer())); - - add(GryoTypeReg.of(TraverserSet.class, 58)); - add(GryoTypeReg.of(Tree.class, 61)); - add(GryoTypeReg.of(HashSet.class, 62)); - add(GryoTypeReg.of(BulkSet.class, 64)); - add(GryoTypeReg.of(MutableMetrics.class, 69)); - add(GryoTypeReg.of(ImmutableMetrics.class, 115)); - add(GryoTypeReg.of(DefaultTraversalMetrics.class, 70)); - add(GryoTypeReg.of(MapMemory.class, 73)); - add(GryoTypeReg.of(MapReduce.NullObject.class, 74)); - add(GryoTypeReg.of(AtomicLong.class, 79)); - add(GryoTypeReg.of(Pair.class, 88, new UtilSerializers.PairSerializer())); - add(GryoTypeReg.of(TraversalExplanation.class, 106, new JavaSerializer())); - - add(GryoTypeReg.of(Duration.class, 93, new JavaTimeSerializers.DurationSerializer())); - add(GryoTypeReg.of(Instant.class, 94, new JavaTimeSerializers.InstantSerializer())); - add(GryoTypeReg.of(LocalDate.class, 95, new JavaTimeSerializers.LocalDateSerializer())); - add(GryoTypeReg.of(LocalDateTime.class, 96, new JavaTimeSerializers.LocalDateTimeSerializer())); - add(GryoTypeReg.of(LocalTime.class, 97, new JavaTimeSerializers.LocalTimeSerializer())); - add(GryoTypeReg.of(MonthDay.class, 98, new JavaTimeSerializers.MonthDaySerializer())); - add(GryoTypeReg.of(OffsetDateTime.class, 99, new JavaTimeSerializers.OffsetDateTimeSerializer())); - add(GryoTypeReg.of(OffsetTime.class, 100, new JavaTimeSerializers.OffsetTimeSerializer())); - add(GryoTypeReg.of(Period.class, 101, new JavaTimeSerializers.PeriodSerializer())); - add(GryoTypeReg.of(Year.class, 102, new JavaTimeSerializers.YearSerializer())); - add(GryoTypeReg.of(YearMonth.class, 103, new JavaTimeSerializers.YearMonthSerializer())); - add(GryoTypeReg.of(ZonedDateTime.class, 104, new JavaTimeSerializers.ZonedDateTimeSerializer())); - add(GryoTypeReg.of(ZoneOffset.class, 105, new JavaTimeSerializers.ZoneOffsetSerializer())); - - add(GryoTypeReg.of(Operator.class, 107)); - add(GryoTypeReg.of(FoldStep.FoldBiOperator.class, 108)); - add(GryoTypeReg.of(GroupCountStep.GroupCountBiOperator.class, 109)); - add(GryoTypeReg.of(GroupStep.GroupBiOperator.class, 117, new JavaSerializer())); // because they contain traversals - add(GryoTypeReg.of(MeanGlobalStep.MeanGlobalBiOperator.class, 110)); - add(GryoTypeReg.of(MeanGlobalStep.MeanNumber.class, 111)); - add(GryoTypeReg.of(TreeStep.TreeBiOperator.class, 112)); - add(GryoTypeReg.of(GroupStepV3d0.GroupBiOperatorV3d0.class, 113)); - add(GryoTypeReg.of(RangeGlobalStep.RangeBiOperator.class, 114)); - add(GryoTypeReg.of(OrderGlobalStep.OrderBiOperator.class, 118, new JavaSerializer())); // because they contain traversals - add(GryoTypeReg.of(ProfileStep.ProfileBiOperator.class, 119)); - }}; - } - } - /** * A builder to construct a {@link GryoMapper} instance. */ - public abstract static class Builder implements Mapper.Builder<Builder> { + public static class Builder implements Mapper.Builder<Builder> { - /** - * Map with one entry that is used so that it is possible to get the class of LinkedHashMap.Entry. - */ - protected static final LinkedHashMap m = new LinkedHashMap() {{ - put("junk", "dummy"); - }}; - - protected static final Class ARRAYS_AS_LIST = Arrays.asList("dummy").getClass(); - - protected static final Class LINKED_HASH_MAP_ENTRY_CLASS = m.entrySet().iterator().next().getClass(); - - /** - * The {@code HashMap$Node} class comes into serialization play when a {@code Map.entrySet()} is - * serialized. - */ - protected static final Class HASH_MAP_NODE; - - static { - // have to instantiate this via reflection because it is a private inner class of HashMap - final String className = HashMap.class.getName() + "$Node"; - try { - HASH_MAP_NODE = Class.forName(className); - } catch (Exception ex) { - throw new RuntimeException("Could not access " + className, ex); - } - } + private GryoVersion version = GryoVersion.V1_0; /** * Note that the following are pre-registered boolean, Boolean, byte, Byte, char, Character, double, Double, * int, Integer, float, Float, long, Long, short, Short, String, void. */ - private final List<TypeRegistration<?>> typeRegistrations; + private List<TypeRegistration<?>> typeRegistrations = version.cloneRegistrations(); private final List<IoRegistry> registries = new ArrayList<>(); @@ -420,26 +155,7 @@ public final class GryoMapper implements Mapper<Kryo> { private boolean referenceTracking = true; private Supplier<ClassResolver> classResolver = GryoClassResolver::new; - private Builder() { - this.typeRegistrations = initTypeRegistrations(); - - // Validate the default registrations - // For justification of these default registration rules, see TinkerPopKryoRegistrator - for (TypeRegistration<?> tr : typeRegistrations) { - if (tr.hasSerializer() /* no serializer is acceptable */ && - null == tr.getSerializerShim() /* a shim serializer is acceptable */ && - !(tr.getShadedSerializer() instanceof JavaSerializer) /* shaded JavaSerializer is acceptable */) { - // everything else is invalid - final String msg = String.format("The default GryoMapper type registration %s is invalid. " + - "It must supply either an implementation of %s or %s, but supplies neither. " + - "This is probably a bug in GryoMapper's default serialization class registrations.", tr, - SerializerShim.class.getCanonicalName(), JavaSerializer.class.getCanonicalName()); - throw new IllegalStateException(msg); - } - } - } - - public abstract List<TypeRegistration<?>> initTypeRegistrations(); + private Builder() { } /** * {@inheritDoc} @@ -452,6 +168,16 @@ public final class GryoMapper implements Mapper<Kryo> { } /** + * The version of Gryo to use in the mapper. Defaults to 1.0. Calls to this method will reset values specified + * to {@link #addCustom(Class, Function)} and related overloads. + */ + public Builder version(final GryoVersion version) { + this.version = version; + this.typeRegistrations = version.cloneRegistrations(); + return this; + } + + /** * Provides a custom Kryo {@code ClassResolver} to be supplied to a {@code Kryo} instance. If this value is * not supplied then it will default to the {@link GryoClassResolver}. To ensure compatibility with Gryo it * is highly recommended that objects passed to this method extend that class. @@ -578,112 +304,4 @@ public final class GryoMapper implements Mapper<Kryo> { typeRegistrations.add(newRegistrationBuilder.apply(registrationId)); } } - - private static class GryoTypeReg<T> implements TypeRegistration<T> { - - private final Class<T> clazz; - private final Serializer<T> shadedSerializer; - private final SerializerShim<T> serializerShim; - private final Function<Kryo, Serializer> functionOfShadedKryo; - private final int id; - - private GryoTypeReg(final Class<T> clazz, - final Serializer<T> shadedSerializer, - final SerializerShim<T> serializerShim, - final Function<Kryo, Serializer> functionOfShadedKryo, - final int id) { - this.clazz = clazz; - this.shadedSerializer = shadedSerializer; - this.serializerShim = serializerShim; - this.functionOfShadedKryo = functionOfShadedKryo; - this.id = id; - - int serializerCount = 0; - if (null != this.shadedSerializer) - serializerCount++; - if (null != this.serializerShim) - serializerCount++; - if (null != this.functionOfShadedKryo) - serializerCount++; - - if (1 < serializerCount) { - final String msg = String.format( - "GryoTypeReg accepts at most one kind of serializer, but multiple " + - "serializers were supplied for class %s (id %s). " + - "Shaded serializer: %s. Shim serializer: %s. Shaded serializer function: %s.", - this.clazz.getCanonicalName(), id, - this.shadedSerializer, this.serializerShim, this.functionOfShadedKryo); - throw new IllegalArgumentException(msg); - } - } - - private static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id) { - return new GryoTypeReg<>(clazz, null, null, null, id); - } - - private static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id, final Serializer<T> shadedSerializer) { - return new GryoTypeReg<>(clazz, shadedSerializer, null, null, id); - } - - private static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id, final SerializerShim<T> serializerShim) { - return new GryoTypeReg<>(clazz, null, serializerShim, null, id); - } - - private static <T> GryoTypeReg<T> of(final Class clazz, final int id, final Function<Kryo, Serializer> fct) { - return new GryoTypeReg<>(clazz, null, null, fct, id); - } - - @Override - public Serializer<T> getShadedSerializer() { - return shadedSerializer; - } - - @Override - public SerializerShim<T> getSerializerShim() { - return serializerShim; - } - - @Override - public Function<Kryo, Serializer> getFunctionOfShadedKryo() { - return functionOfShadedKryo; - } - - @Override - public Class<T> getTargetClass() { - return clazz; - } - - @Override - public int getId() { - return id; - } - - @Override - public Kryo registerWith(final Kryo kryo) { - if (null != functionOfShadedKryo) - kryo.register(clazz, functionOfShadedKryo.apply(kryo), id); - else if (null != shadedSerializer) - kryo.register(clazz, shadedSerializer, id); - else if (null != serializerShim) - kryo.register(clazz, new ShadedSerializerAdapter<>(serializerShim), id); - else { - kryo.register(clazz, kryo.getDefaultSerializer(clazz), id); - // Suprisingly, the preceding call is not equivalent to - // kryo.register(clazz, id); - } - - return kryo; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("targetClass", clazz) - .append("id", id) - .append("shadedSerializer", shadedSerializer) - .append("serializerShim", serializerShim) - .append("functionOfShadedKryo", functionOfShadedKryo) - .toString(); - } - } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/11cc9697/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoTypeReg.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoTypeReg.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoTypeReg.java new file mode 100644 index 0000000..dd6dbdf --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoTypeReg.java @@ -0,0 +1,140 @@ +/* + * 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.gryo; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedSerializerAdapter; +import org.apache.tinkerpop.shaded.kryo.Kryo; +import org.apache.tinkerpop.shaded.kryo.Serializer; + +import java.util.function.Function; + +/** + * @author Stephen Mallette (http://stephen.genoprime.com) + */ +final class GryoTypeReg<T> implements TypeRegistration<T> { + + private final Class<T> clazz; + private final Serializer<T> shadedSerializer; + private final SerializerShim<T> serializerShim; + private final Function<Kryo, Serializer> functionOfShadedKryo; + private final int id; + + private GryoTypeReg(final Class<T> clazz, + final Serializer<T> shadedSerializer, + final SerializerShim<T> serializerShim, + final Function<Kryo, Serializer> functionOfShadedKryo, + final int id) { + if (null == clazz) throw new IllegalArgumentException("clazz cannot be null"); + + this.clazz = clazz; + this.shadedSerializer = shadedSerializer; + this.serializerShim = serializerShim; + this.functionOfShadedKryo = functionOfShadedKryo; + this.id = id; + + int serializerCount = 0; + if (null != this.shadedSerializer) + serializerCount++; + if (null != this.serializerShim) + serializerCount++; + if (null != this.functionOfShadedKryo) + serializerCount++; + + if (1 < serializerCount) { + final String msg = String.format( + "GryoTypeReg accepts at most one kind of serializer, but multiple " + + "serializers were supplied for class %s (id %s). " + + "Shaded serializer: %s. Shim serializer: %s. Shaded serializer function: %s.", + this.clazz.getCanonicalName(), id, + this.shadedSerializer, this.serializerShim, this.functionOfShadedKryo); + throw new IllegalArgumentException(msg); + } + } + + static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id) { + return new GryoTypeReg<>(clazz, null, null, null, id); + } + + static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id, final Serializer<T> shadedSerializer) { + return new GryoTypeReg<>(clazz, shadedSerializer, null, null, id); + } + + static <T> GryoTypeReg<T> of(final Class<T> clazz, final int id, final SerializerShim<T> serializerShim) { + return new GryoTypeReg<>(clazz, null, serializerShim, null, id); + } + + static <T> GryoTypeReg<T> of(final Class clazz, final int id, final Function<Kryo, Serializer> fct) { + return new GryoTypeReg<>(clazz, null, null, fct, id); + } + + @Override + public Serializer<T> getShadedSerializer() { + return shadedSerializer; + } + + @Override + public SerializerShim<T> getSerializerShim() { + return serializerShim; + } + + @Override + public Function<Kryo, Serializer> getFunctionOfShadedKryo() { + return functionOfShadedKryo; + } + + @Override + public Class<T> getTargetClass() { + return clazz; + } + + @Override + public int getId() { + return id; + } + + @Override + public Kryo registerWith(final Kryo kryo) { + if (null != functionOfShadedKryo) + kryo.register(clazz, functionOfShadedKryo.apply(kryo), id); + else if (null != shadedSerializer) + kryo.register(clazz, shadedSerializer, id); + else if (null != serializerShim) + kryo.register(clazz, new ShadedSerializerAdapter<>(serializerShim), id); + else { + kryo.register(clazz, kryo.getDefaultSerializer(clazz), id); + // Suprisingly, the preceding call is not equivalent to + // kryo.register(clazz, id); + } + + return kryo; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("targetClass", clazz) + .append("id", id) + .append("shadedSerializer", shadedSerializer) + .append("serializerShim", serializerShim) + .append("functionOfShadedKryo", functionOfShadedKryo) + .toString(); + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/11cc9697/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java index 5a52290..0d380b1 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoVersion.java @@ -18,19 +18,317 @@ */ package org.apache.tinkerpop.gremlin.structure.io.gryo; +import org.apache.tinkerpop.gremlin.process.computer.GraphFilter; +import org.apache.tinkerpop.gremlin.process.computer.MapReduce; +import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory; +import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser; +import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; +import org.apache.tinkerpop.gremlin.process.traversal.Contains; +import org.apache.tinkerpop.gremlin.process.traversal.Operator; +import org.apache.tinkerpop.gremlin.process.traversal.Order; +import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.Path; +import org.apache.tinkerpop.gremlin.process.traversal.Pop; +import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions; +import org.apache.tinkerpop.gremlin.process.traversal.Scope; +import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; +import org.apache.tinkerpop.gremlin.process.traversal.util.AndP; +import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics; +import org.apache.tinkerpop.gremlin.process.traversal.util.ImmutableMetrics; +import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics; +import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation; +import org.apache.tinkerpop.gremlin.structure.Column; +import org.apache.tinkerpop.gremlin.structure.Direction; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.Property; +import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph; +import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphSerializer; +import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier; +import org.apache.tinkerpop.gremlin.util.function.Lambda; +import org.apache.tinkerpop.shaded.kryo.KryoSerializable; +import org.apache.tinkerpop.shaded.kryo.serializers.JavaSerializer; +import org.javatuples.Pair; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.URI; +import java.nio.ByteBuffer; +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; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Currency; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; + /** * @author Stephen Mallette (http://stephen.genoprime.com) */ public enum GryoVersion { - V1_0("1.0"); + V1_0("1.0", initV1d0Registrations()); private final String versionNumber; + private final List<TypeRegistration<?>> registrations; - GryoVersion(final String versionNumber) { + GryoVersion(final String versionNumber, final List<TypeRegistration<?>> registrations) { + // Validate the default registrations + // For justification of these default registration rules, see TinkerPopKryoRegistrator + for (TypeRegistration<?> tr : registrations) { + if (tr.hasSerializer() /* no serializer is acceptable */ && + null == tr.getSerializerShim() /* a shim serializer is acceptable */ && + !(tr.getShadedSerializer() instanceof JavaSerializer) /* shaded JavaSerializer is acceptable */) { + // everything else is invalid + final String msg = String.format("The default GryoMapper type registration %s is invalid. " + + "It must supply either an implementation of %s or %s, but supplies neither. " + + "This is probably a bug in GryoMapper's default serialization class registrations.", tr, + SerializerShim.class.getCanonicalName(), JavaSerializer.class.getCanonicalName()); + throw new IllegalStateException(msg); + } + } this.versionNumber = versionNumber; + this.registrations = registrations; + } + + public List<TypeRegistration<?>> cloneRegistrations() { + return new ArrayList<>(registrations); + } + + public List<TypeRegistration<?>> getRegistrations() { + return Collections.unmodifiableList(registrations); } public String getVersion() { return versionNumber; } + + public static List<TypeRegistration<?>> initV1d0Registrations() { + return new ArrayList<TypeRegistration<?>>() {{ + add(GryoTypeReg.of(byte[].class, 25)); + add(GryoTypeReg.of(char[].class, 26)); + add(GryoTypeReg.of(short[].class, 27)); + add(GryoTypeReg.of(int[].class, 28)); + add(GryoTypeReg.of(long[].class, 29)); + add(GryoTypeReg.of(float[].class, 30)); + add(GryoTypeReg.of(double[].class, 31)); + add(GryoTypeReg.of(String[].class, 32)); + add(GryoTypeReg.of(Object[].class, 33)); + add(GryoTypeReg.of(ArrayList.class, 10)); + add(GryoTypeReg.of(Types.ARRAYS_AS_LIST, 134, new UtilSerializers.ArraysAsListSerializer())); + add(GryoTypeReg.of(BigInteger.class, 34)); + add(GryoTypeReg.of(BigDecimal.class, 35)); + add(GryoTypeReg.of(Calendar.class, 39)); + add(GryoTypeReg.of(Class.class, 41, new UtilSerializers.ClassSerializer())); + add(GryoTypeReg.of(Collection.class, 37)); + add(GryoTypeReg.of(Collections.EMPTY_LIST.getClass(), 51)); + add(GryoTypeReg.of(Collections.EMPTY_MAP.getClass(), 52)); + add(GryoTypeReg.of(Collections.EMPTY_SET.getClass(), 53)); + add(GryoTypeReg.of(Collections.singleton(null).getClass(), 54)); + add(GryoTypeReg.of(Collections.singletonList(null).getClass(), 24)); + add(GryoTypeReg.of(Collections.singletonMap(null, null).getClass(), 23)); + add(GryoTypeReg.of(Contains.class, 49)); + add(GryoTypeReg.of(Currency.class, 40)); + add(GryoTypeReg.of(Date.class, 38)); + add(GryoTypeReg.of(Direction.class, 12)); + add(GryoTypeReg.of(DetachedEdge.class, 21)); + add(GryoTypeReg.of(DetachedVertexProperty.class, 20)); + add(GryoTypeReg.of(DetachedProperty.class, 18)); + add(GryoTypeReg.of(DetachedVertex.class, 19)); + add(GryoTypeReg.of(DetachedPath.class, 60)); + // skip 14 + add(GryoTypeReg.of(EnumSet.class, 46)); + add(GryoTypeReg.of(HashMap.class, 11)); + add(GryoTypeReg.of(HashMap.Entry.class, 16)); + add(GryoTypeReg.of(Types.HASH_MAP_NODE, 92)); + add(GryoTypeReg.of(KryoSerializable.class, 36)); + add(GryoTypeReg.of(LinkedHashMap.class, 47)); + add(GryoTypeReg.of(LinkedHashSet.class, 71)); + add(GryoTypeReg.of(LinkedList.class, 116)); + add(GryoTypeReg.of(Types.LINKED_HASH_MAP_ENTRY_CLASS, 15)); + add(GryoTypeReg.of(Locale.class, 22)); + add(GryoTypeReg.of(StringBuffer.class, 43)); + add(GryoTypeReg.of(StringBuilder.class, 44)); + add(GryoTypeReg.of(T.class, 48)); + add(GryoTypeReg.of(TimeZone.class, 42)); + add(GryoTypeReg.of(TreeMap.class, 45)); + add(GryoTypeReg.of(TreeSet.class, 50)); + add(GryoTypeReg.of(UUID.class, 17, new UtilSerializers.UUIDSerializer())); + add(GryoTypeReg.of(URI.class, 72, new UtilSerializers.URISerializer())); + add(GryoTypeReg.of(VertexTerminator.class, 13)); + add(GryoTypeReg.of(AbstractMap.SimpleEntry.class, 120)); + add(GryoTypeReg.of(AbstractMap.SimpleImmutableEntry.class, 121)); + add(GryoTypeReg.of(java.sql.Timestamp.class, 161)); + add(GryoTypeReg.of(InetAddress.class, 162, new UtilSerializers.InetAddressSerializer())); + add(GryoTypeReg.of(ByteBuffer.class, 163, new UtilSerializers.ByteBufferSerializer())); // ***LAST ID*** + + add(GryoTypeReg.of(ReferenceEdge.class, 81)); + add(GryoTypeReg.of(ReferenceVertexProperty.class, 82)); + add(GryoTypeReg.of(ReferenceProperty.class, 83)); + add(GryoTypeReg.of(ReferenceVertex.class, 84)); + add(GryoTypeReg.of(ReferencePath.class, 85)); + + add(GryoTypeReg.of(StarGraph.class, 86, new StarGraphSerializer(Direction.BOTH, new GraphFilter()))); + + add(GryoTypeReg.of(Edge.class, 65, new GryoSerializers.EdgeSerializer())); + add(GryoTypeReg.of(Vertex.class, 66, new GryoSerializers.VertexSerializer())); + add(GryoTypeReg.of(Property.class, 67, new GryoSerializers.PropertySerializer())); + add(GryoTypeReg.of(VertexProperty.class, 68, new GryoSerializers.VertexPropertySerializer())); + add(GryoTypeReg.of(Path.class, 59, new GryoSerializers.PathSerializer())); + // skip 55 + add(GryoTypeReg.of(B_O_Traverser.class, 75)); + add(GryoTypeReg.of(O_Traverser.class, 76)); + add(GryoTypeReg.of(B_LP_O_P_S_SE_SL_Traverser.class, 77)); + add(GryoTypeReg.of(B_O_S_SE_SL_Traverser.class, 78)); + add(GryoTypeReg.of(B_LP_O_S_SE_SL_Traverser.class, 87)); + add(GryoTypeReg.of(O_OB_S_SE_SL_Traverser.class, 89)); + add(GryoTypeReg.of(LP_O_OB_S_SE_SL_Traverser.class, 90)); + add(GryoTypeReg.of(LP_O_OB_P_S_SE_SL_Traverser.class, 91)); + add(GryoTypeReg.of(DefaultRemoteTraverser.class, 123, new GryoSerializers.DefaultRemoteTraverserSerializer())); + + add(GryoTypeReg.of(Bytecode.class, 122, new GryoSerializers.BytecodeSerializer())); + add(GryoTypeReg.of(P.class, 124, new GryoSerializers.PSerializer())); + add(GryoTypeReg.of(Lambda.class, 125, new GryoSerializers.LambdaSerializer())); + add(GryoTypeReg.of(Bytecode.Binding.class, 126, new GryoSerializers.BindingSerializer())); + add(GryoTypeReg.of(Order.class, 127)); + add(GryoTypeReg.of(Scope.class, 128)); + add(GryoTypeReg.of(AndP.class, 129, new GryoSerializers.AndPSerializer())); + add(GryoTypeReg.of(OrP.class, 130, new GryoSerializers.OrPSerializer())); + add(GryoTypeReg.of(VertexProperty.Cardinality.class, 131)); + add(GryoTypeReg.of(Column.class, 132)); + add(GryoTypeReg.of(Pop.class, 133)); + add(GryoTypeReg.of(SackFunctions.Barrier.class, 135)); + add(GryoTypeReg.of(TraversalOptionParent.Pick.class, 137)); + add(GryoTypeReg.of(HashSetSupplier.class, 136, new UtilSerializers.HashSetSupplierSerializer())); + + add(GryoTypeReg.of(TraverserSet.class, 58)); + add(GryoTypeReg.of(Tree.class, 61)); + add(GryoTypeReg.of(HashSet.class, 62)); + add(GryoTypeReg.of(BulkSet.class, 64)); + add(GryoTypeReg.of(MutableMetrics.class, 69)); + add(GryoTypeReg.of(ImmutableMetrics.class, 115)); + add(GryoTypeReg.of(DefaultTraversalMetrics.class, 70)); + add(GryoTypeReg.of(MapMemory.class, 73)); + add(GryoTypeReg.of(MapReduce.NullObject.class, 74)); + add(GryoTypeReg.of(AtomicLong.class, 79)); + add(GryoTypeReg.of(Pair.class, 88, new UtilSerializers.PairSerializer())); + add(GryoTypeReg.of(TraversalExplanation.class, 106, new JavaSerializer())); + + add(GryoTypeReg.of(Duration.class, 93, new JavaTimeSerializers.DurationSerializer())); + add(GryoTypeReg.of(Instant.class, 94, new JavaTimeSerializers.InstantSerializer())); + add(GryoTypeReg.of(LocalDate.class, 95, new JavaTimeSerializers.LocalDateSerializer())); + add(GryoTypeReg.of(LocalDateTime.class, 96, new JavaTimeSerializers.LocalDateTimeSerializer())); + add(GryoTypeReg.of(LocalTime.class, 97, new JavaTimeSerializers.LocalTimeSerializer())); + add(GryoTypeReg.of(MonthDay.class, 98, new JavaTimeSerializers.MonthDaySerializer())); + add(GryoTypeReg.of(OffsetDateTime.class, 99, new JavaTimeSerializers.OffsetDateTimeSerializer())); + add(GryoTypeReg.of(OffsetTime.class, 100, new JavaTimeSerializers.OffsetTimeSerializer())); + add(GryoTypeReg.of(Period.class, 101, new JavaTimeSerializers.PeriodSerializer())); + add(GryoTypeReg.of(Year.class, 102, new JavaTimeSerializers.YearSerializer())); + add(GryoTypeReg.of(YearMonth.class, 103, new JavaTimeSerializers.YearMonthSerializer())); + add(GryoTypeReg.of(ZonedDateTime.class, 104, new JavaTimeSerializers.ZonedDateTimeSerializer())); + add(GryoTypeReg.of(ZoneOffset.class, 105, new JavaTimeSerializers.ZoneOffsetSerializer())); + + add(GryoTypeReg.of(Operator.class, 107)); + add(GryoTypeReg.of(FoldStep.FoldBiOperator.class, 108)); + add(GryoTypeReg.of(GroupCountStep.GroupCountBiOperator.class, 109)); + add(GryoTypeReg.of(GroupStep.GroupBiOperator.class, 117, new JavaSerializer())); // because they contain traversals + add(GryoTypeReg.of(MeanGlobalStep.MeanGlobalBiOperator.class, 110)); + add(GryoTypeReg.of(MeanGlobalStep.MeanNumber.class, 111)); + add(GryoTypeReg.of(TreeStep.TreeBiOperator.class, 112)); + add(GryoTypeReg.of(GroupStepV3d0.GroupBiOperatorV3d0.class, 113)); + add(GryoTypeReg.of(RangeGlobalStep.RangeBiOperator.class, 114)); + add(GryoTypeReg.of(OrderGlobalStep.OrderBiOperator.class, 118, new JavaSerializer())); // because they contain traversals + add(GryoTypeReg.of(ProfileStep.ProfileBiOperator.class, 119)); + }}; + } + + private static final class Types { + /** + * Map with one entry that is used so that it is possible to get the class of LinkedHashMap.Entry. + */ + private static final LinkedHashMap m = new LinkedHashMap() {{ + put("junk", "dummy"); + }}; + + private static final Class ARRAYS_AS_LIST = Arrays.asList("dummy").getClass(); + + private static final Class LINKED_HASH_MAP_ENTRY_CLASS = m.entrySet().iterator().next().getClass(); + + /** + * The {@code HashMap$Node} class comes into serialization play when a {@code Map.entrySet()} is + * serialized. + */ + private static final Class HASH_MAP_NODE; + + static { + // have to instantiate this via reflection because it is a private inner class of HashMap + final String className = HashMap.class.getName() + "$Node"; + try { + HASH_MAP_NODE = Class.forName(className); + } catch (Exception ex) { + throw new RuntimeException("Could not access " + className, ex); + } + } + } }
