Kryo shim refactoring and documentation
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/218d7909 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/218d7909 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/218d7909 Branch: refs/heads/tp31 Commit: 218d7909b9c35a4488102f53c444c92be737972c Parents: ef52869 Author: Dan LaRocque <dal...@hopcount.org> Authored: Fri Jun 3 07:41:50 2016 -0400 Committer: Dan LaRocque <dal...@hopcount.org> Committed: Fri Jun 3 07:41:50 2016 -0400 ---------------------------------------------------------------------- .../gremlin/structure/io/gryo/GryoMapper.java | 29 +-- .../structure/io/gryo/TypeRegistration.java | 2 +- .../structure/io/gryo/URISerializer.java | 8 +- .../structure/io/gryo/UUIDSerializer.java | 12 +- .../structure/io/gryo/kryoshim/InputShim.java | 38 ++++ .../structure/io/gryo/kryoshim/KryoShim.java | 41 ++++ .../io/gryo/kryoshim/KryoShimService.java | 83 ++++++++ .../io/gryo/kryoshim/KryoShimServiceLoader.java | 199 +++++++++++++++++++ .../structure/io/gryo/kryoshim/OutputShim.java | 40 ++++ .../io/gryo/kryoshim/SerializerShim.java | 36 ++++ .../io/gryo/kryoshim/package-info.java | 55 +++++ .../kryoshim/shaded/ShadedInputAdapter.java | 66 ++++++ .../gryo/kryoshim/shaded/ShadedKryoAdapter.java | 67 +++++++ .../kryoshim/shaded/ShadedOutputAdapter.java | 72 +++++++ .../shaded/ShadedSerializerAdapter.java | 54 +++++ .../io/gryo/kryoshim/shaded/package-info.java | 25 +++ .../structure/io/kryoshim/InputShim.java | 37 ---- .../gremlin/structure/io/kryoshim/KryoShim.java | 40 ---- .../structure/io/kryoshim/KryoShimService.java | 83 -------- .../io/kryoshim/KryoShimServiceLoader.java | 137 ------------- .../structure/io/kryoshim/OutputShim.java | 41 ---- .../structure/io/kryoshim/SerializerShim.java | 35 ---- .../structure/io/kryoshim/package-info.java | 54 ----- .../io/kryoshim/shaded/ShadedInputAdapter.java | 66 ------ .../io/kryoshim/shaded/ShadedKryoAdapter.java | 67 ------- .../io/kryoshim/shaded/ShadedOutputAdapter.java | 72 ------- .../shaded/ShadedSerializerAdapter.java | 54 ----- .../io/kryoshim/shaded/package-info.java | 25 --- .../util/star/StarGraphGryoSerializer.java | 9 +- .../util/star/StarGraphSerializer.java | 18 +- .../structure/io/HadoopPoolShimService.java | 2 +- .../hadoop/structure/io/ObjectWritable.java | 4 +- .../hadoop/structure/io/VertexWritable.java | 3 +- ...n.structure.io.gryo.kryoshim.KryoShimService | 1 + ...remlin.structure.io.kryoshim.KryoShimService | 1 - .../structure/io/TinkerPopKryoRegistrator.java | 121 +++++++++++ .../io/gryo/ObjectWritableSerializer.java | 12 +- .../io/gryo/VertexWritableSerializer.java | 12 +- .../kryoshim/unshaded/UnshadedInputAdapter.java | 78 ++++++++ .../kryoshim/unshaded/UnshadedKryoAdapter.java | 74 +++++++ .../unshaded/UnshadedKryoShimService.java | 115 +++++++++++ .../unshaded/UnshadedOutputAdapter.java | 83 ++++++++ .../unshaded/UnshadedSerializerAdapter.java | 57 ++++++ 43 files changed, 1368 insertions(+), 760 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/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 5bc71da..851b03c 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 @@ -57,8 +57,8 @@ 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.kryoshim.SerializerShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded.ShadedSerializerAdapter; +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; @@ -70,8 +70,6 @@ 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.StarGraphGryoSerializer; -import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphSerializer; import org.apache.tinkerpop.shaded.kryo.ClassResolver; import org.apache.tinkerpop.shaded.kryo.Kryo; @@ -115,7 +113,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.TreeMap; @@ -406,7 +403,7 @@ public final class GryoMapper implements Mapper<Kryo> { public Builder addCustom(final Class... custom) { if (custom != null && custom.length > 0) { for (Class c : custom) { - addOrOverrideRegistration(GryoTypeReg.of(c, currentSerializationId.getAndIncrement())); + addOrOverrideRegistration(c, id -> GryoTypeReg.of(c, id)); } } return this; @@ -417,7 +414,7 @@ public final class GryoMapper implements Mapper<Kryo> { * a class that is already registered will override that registration. */ public Builder addCustom(final Class clazz, final Serializer serializer) { - addOrOverrideRegistration(GryoTypeReg.of(clazz, currentSerializationId.getAndIncrement(), serializer)); + addOrOverrideRegistration(clazz, id -> GryoTypeReg.of(clazz, id, serializer)); return this; } @@ -425,7 +422,7 @@ public final class GryoMapper implements Mapper<Kryo> { * Register custom class to serialize with a custom serialization shim. */ public Builder addCustom(final Class clazz, final SerializerShim serializer) { - addOrOverrideRegistration(GryoTypeReg.of(clazz, currentSerializationId.getAndIncrement(), serializer)); + addOrOverrideRegistration(clazz, id -> GryoTypeReg.of(clazz, id, serializer)); return this; } @@ -434,7 +431,7 @@ public final class GryoMapper implements Mapper<Kryo> { * that calling this method for a class that is already registered will override that registration. */ public Builder addCustom(final Class clazz, final Function<Kryo, Serializer> functionOfKryo) { - addOrOverrideRegistration(GryoTypeReg.of(clazz, currentSerializationId.getAndIncrement(), functionOfKryo)); + addOrOverrideRegistration(clazz, id -> GryoTypeReg.of(clazz, id, functionOfKryo)); return this; } @@ -490,16 +487,24 @@ public final class GryoMapper implements Mapper<Kryo> { return new GryoMapper(this); } - private <T> void addOrOverrideRegistration(TypeRegistration<T> newRegistration) { + private <T> void addOrOverrideRegistration(Class<?> clazz, Function<Integer, TypeRegistration<T>> newRegistrationBuilder) { Iterator<TypeRegistration<?>> iter = typeRegistrations.iterator(); + Integer registrationId = null; while (iter.hasNext()) { TypeRegistration<?> existingRegistration = iter.next(); - if (existingRegistration.getTargetClass().equals(newRegistration.getTargetClass())) { + if (existingRegistration.getTargetClass().equals(clazz)) { + // when overridding a registration, use the old id + registrationId = existingRegistration.getId(); + // remove the old registration (we install its override below) iter.remove(); break; } } - typeRegistrations.add(newRegistration); + if (null == registrationId) { + // when not overridding a registration, get an id from the counter + registrationId = currentSerializationId.getAndIncrement(); + } + typeRegistrations.add(newRegistrationBuilder.apply(registrationId)); } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/TypeRegistration.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/TypeRegistration.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/TypeRegistration.java index 5ca3f31..ef105ce 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/TypeRegistration.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/TypeRegistration.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.gremlin.structure.io.gryo; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.SerializerShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; import org.apache.tinkerpop.shaded.kryo.Kryo; import org.apache.tinkerpop.shaded.kryo.Serializer; http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/URISerializer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/URISerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/URISerializer.java index de08061..a65bcea 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/URISerializer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/URISerializer.java @@ -18,10 +18,10 @@ */ package org.apache.tinkerpop.gremlin.structure.io.gryo; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.InputShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.KryoShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.OutputShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.SerializerShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; import java.net.URI; http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/UUIDSerializer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/UUIDSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/UUIDSerializer.java index b86ddc2..d1d59d3 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/UUIDSerializer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/UUIDSerializer.java @@ -18,14 +18,10 @@ */ package org.apache.tinkerpop.gremlin.structure.io.gryo; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.InputShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.KryoShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.OutputShim; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.SerializerShim; -import org.apache.tinkerpop.shaded.kryo.Kryo; -import org.apache.tinkerpop.shaded.kryo.Serializer; -import org.apache.tinkerpop.shaded.kryo.io.Input; -import org.apache.tinkerpop.shaded.kryo.io.Output; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; import java.util.UUID; http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/InputShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/InputShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/InputShim.java new file mode 100644 index 0000000..23bec16 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/InputShim.java @@ -0,0 +1,38 @@ +/* + * 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.kryoshim; + +/** + * A minimal {@link org.apache.tinkerpop.shaded.kryo.io.Input}-like abstraction. + * See that class for method documentation. + */ +public interface InputShim { + + byte readByte(); + + byte[] readBytes(int size); + + String readString(); + + long readLong(); + + int readInt(); + + double readDouble(); +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShim.java new file mode 100644 index 0000000..a0f3f87 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShim.java @@ -0,0 +1,41 @@ +/* + * 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.kryoshim; + +/** + * A minimal {@link org.apache.tinkerpop.shaded.kryo.Kryo}-like abstraction. + * See that class for method documentation. + * + * @param <I> this interface's complementary InputShim + * @param <O> this interface's complementary OutputShim + */ +public interface KryoShim<I extends InputShim, O extends OutputShim> { + + <T> T readObject(I input, Class<T> type); + + Object readClassAndObject(I input); + + void writeObject(O output, Object object); + + void writeClassAndObject(O output, Object object); + + <T> T readObjectOrNull(I input, Class<T> type); + + void writeObjectOrNull(O output, Object object, Class type); +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimService.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimService.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimService.java new file mode 100644 index 0000000..959605c --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimService.java @@ -0,0 +1,83 @@ +/* + * 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.kryoshim; + +import java.io.InputStream; +import java.io.OutputStream; + +/** + * This interface exists to decouple HadoopPools from TinkerPop's shaded Kryo. + * <p> + * VertexWritable and ObjectWritable formerly implemented Serializable by + * resorting to statically-pooled shaded Kryo instances maintained by the HadoopPools class. + * This is awkward because those shaded Kryo instances require class registration by default. + * <p> + * Consider what happens with custom property datatypes reachable from the reference graph rooted at an ObjectWritable + * or VertexWritable instance. It is not enough for these property classes to merely implement + * Serializable, though one think that from skimming ObjectWritable/VertexWritable. Those classes + * must also register with TinkerPop's internal, shaded Kryo instances as maintained by HadoopPools, + * or else configure those instances to accept unregistered classes. + * Otherwise, TinkerPop's shaded Kryo will refuse to serialize those properties (even though + * they implement Serializable, and even though the user might think they are only using + * Java's standard Serialization mechanism!). + * <p> + * By hiding the mechanics of serialization behind this interface instead of hardcoding it in + * HadoopPools, the user can decide how to implement serialization for ObjectWritable/VertexWritable + * (and whatever other classes in TinkerPop decide to implement Serializable but then delegate + * all of the implementation details, like ObjectWritable/VertexWritable do now). + */ +public interface KryoShimService { + + /** + * Deserializes an object from an input stream. + * + * @param source the stream from which to read an object's serialized form + * @return the first deserialized object available from {@code source} + */ + Object readClassAndObject(InputStream source); + + /** + * Serializes an object to an output stream. This may flush the output stream. + * + * @param o the object to serialize + * @param sink the stream into which the serialized object is written + */ + void writeClassAndObject(Object o, OutputStream sink); + + /** + * Returns this service's relative priority number. Unless explicitly overridden through a + * system property ({@link KryoShimServiceLoader#SHIM_CLASS_SYSTEM_PROPERTY}), + * the service implementation with the numerically highest priority will be used + * and all others ignored. In other words, the highest priority wins (in the absence of a + * system property override). + * <p> + * TinkerPop's current default implementation uses priority value zero. + * <p> + * Third-party implementations of this interface should (but are not technically required) + * to use a priority value with absolute value greater than 100. + * <p> + * The implementation currently breaks priority ties by lexicographical comparison of + * fully-qualified package-and-classname, but this tie-breaking behavior should be + * considered undefined and subject to future change. Ties are ignored if the service + * is explicitly set through the system property mentioned above. + * + * @return this implementation's priority value + */ + int getPriority(); +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimServiceLoader.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimServiceLoader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimServiceLoader.java new file mode 100644 index 0000000..9ccf2de --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/KryoShimServiceLoader.java @@ -0,0 +1,199 @@ +/* + * 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.kryoshim; + +import org.apache.tinkerpop.shaded.kryo.io.Input; +import org.apache.tinkerpop.shaded.kryo.io.Output; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.ServiceLoader; + +/** + * Loads the highest-priority or user-selected {@link KryoShimService}. + */ +public class KryoShimServiceLoader { + + private static volatile KryoShimService CACHED_SHIM_SERVICE; + + private static final Logger log = LoggerFactory.getLogger(KryoShimServiceLoader.class); + + /** + * Set this system property to the fully-qualified name of a {@link KryoShimService} + * package-and-classname to force it into service. Setting this property causes the + * priority-selection mechanism ({@link KryoShimService#getPriority()}) to be ignored. + */ + public static final String SHIM_CLASS_SYSTEM_PROPERTY = "tinkerpop.kryo.shim"; + + /** + * Return a reference to the shim service. This method may return a cached shim service + * unless {@code forceReload} is true. Calls to this method need not be externally + * synchonized. + * + * @param forceReload if false, this method may use its internal service cache; if true, + * this method must ignore cache, and it must invoke {@link ServiceLoader#reload()} + * before selecting a new service to return + * @return the shim service + */ + public static KryoShimService load(boolean forceReload) { + + if (null != CACHED_SHIM_SERVICE && !forceReload) { + return CACHED_SHIM_SERVICE; + } + + ArrayList<KryoShimService> services = new ArrayList<>(); + + ServiceLoader<KryoShimService> sl = ServiceLoader.load(KryoShimService.class); + + KryoShimService result = null; + + synchronized (KryoShimServiceLoader.class) { + if (forceReload) { + sl.reload(); + } + + for (KryoShimService kss : sl) { + services.add(kss); + } + } + + String shimClass = System.getProperty(SHIM_CLASS_SYSTEM_PROPERTY); + + if (null != shimClass) { + for (KryoShimService kss : services) { + if (kss.getClass().getCanonicalName().equals(shimClass)) { + log.info("Set {} provider to {} ({}) from system property {}={}", + KryoShimService.class.getSimpleName(), kss, kss.getClass(), + SHIM_CLASS_SYSTEM_PROPERTY, shimClass); + result = kss; + } + } + } else { + Collections.sort(services, KryoShimServiceComparator.INSTANCE); + + for (KryoShimService kss : services) { + log.debug("Found Kryo shim service class {} (priority {})", kss.getClass(), kss.getPriority()); + } + + if (0 != services.size()) { + result = services.get(services.size() - 1); + } + } + + + if (null == result) { + throw new IllegalStateException("Unable to load KryoShimService"); + } + + log.info("Set {} provider to {} ({}) because its priority value ({}) is the highest available", + KryoShimService.class.getSimpleName(), result, result.getClass(), result.getPriority()); + + return CACHED_SHIM_SERVICE = result; + } + + /** + * Equivalent to {@link #load(boolean)} with the parameter {@code true}. + * + * @return the (possibly cached) shim service + */ + public static KryoShimService load() { + return load(false); + } + + /** + * A loose abstraction of {@link org.apache.tinkerpop.shaded.kryo.Kryo#writeClassAndObject(Output, Object)}, + * where the {@code output} parameter is an internally-created {@link ByteArrayOutputStream}. Returns + * the byte array underlying that stream. + * + * @param o an object for which the instance and class are serialized + * @return the serialized form + */ + public static byte[] writeClassAndObjectToBytes(Object o) { + KryoShimService shimService = load(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + shimService.writeClassAndObject(o, baos); + + return baos.toByteArray(); + } + + /** + * A loose abstraction of {@link org.apache.tinkerpop.shaded.kryo.Kryo#readClassAndObject(Input)}, + * where the {@code input} parameter is {@code source}. Returns the deserialized object. + * + * @param source an input stream containing data for a serialized object class and instance + * @param <T> the type to which the deserialized object is cast as it is returned + * @return the deserialized object + */ + public static <T> T readClassAndObject(InputStream source) { + KryoShimService shimService = load(); + + return (T)shimService.readClassAndObject(source); + } + + /** + * Selects the service with greatest {@link KryoShimService#getPriority()} + * (not absolute value). + * + * Breaks ties with lexicographical comparison of classnames where the + * name that sorts last is considered to have highest priority. Ideally + * nothing should rely on that tiebreaking behavior, but it beats random + * selection in case a user ever gets into that situation by accident and + * tries to figure out what's going on. + */ + private enum KryoShimServiceComparator implements Comparator<KryoShimService> { + INSTANCE; + + @Override + public int compare(KryoShimService a, KryoShimService b) { + int ap = a.getPriority(); + int bp = b.getPriority(); + + if (ap < bp) { + return -1; + } else if (bp < ap) { + return 1; + } else { + int result = a.getClass().getCanonicalName().compareTo(b.getClass().getCanonicalName()); + + if (0 == result) { + log.warn("Found two {} implementations with the same canonical classname: {}. " + + "This may indicate a problem with the classpath/classloader such as " + + "duplicate or conflicting copies of the file " + + "META-INF/services/org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShimService.", + a.getClass().getCanonicalName()); + } else { + String winner = 0 < result ? a.getClass().getCanonicalName() : b.getClass().getCanonicalName(); + log.warn("{} implementations {} and {} are tied with priority value {}. " + + "Preferring {} to the other because it has a lexicographically greater classname. " + + "Consider setting the system property \"{}\" instead of relying on priority tie-breaking.", + KryoShimService.class.getSimpleName(), a, b, ap, winner, SHIM_CLASS_SYSTEM_PROPERTY); + } + + return result; + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/OutputShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/OutputShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/OutputShim.java new file mode 100644 index 0000000..e4ca3d5 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/OutputShim.java @@ -0,0 +1,40 @@ +/* + * 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.kryoshim; + +/** + * A minimal {@link org.apache.tinkerpop.shaded.kryo.io.Output}-like abstraction. + * See that class for method documentation. + */ +public interface OutputShim { + + void writeByte(byte b); + + void writeBytes(byte[] array, int offset, int count); + + void writeString(String s); + + void writeLong(long l); + + void writeInt(int i); + + void writeDouble(double d); + + void flush(); +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/SerializerShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/SerializerShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/SerializerShim.java new file mode 100644 index 0000000..191cdd8 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/SerializerShim.java @@ -0,0 +1,36 @@ +/* + * 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.kryoshim; + +/** + * A minimal {@link org.apache.tinkerpop.shaded.kryo.Serializer}-like abstraction. + * See that class for method documentation. + * + * @param <T> the class this serializer reads/writes from/to bytes. + */ +public interface SerializerShim<T> { + + <O extends OutputShim> void write(KryoShim<?, O> kryo, O output, T starGraph); + + <I extends InputShim> T read(KryoShim<I, ?> kryo, I input, Class<T> clazz); + + default boolean isImmutable() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/package-info.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/package-info.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/package-info.java new file mode 100644 index 0000000..70675da --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/package-info.java @@ -0,0 +1,55 @@ +/* + * 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. + */ +/** + * Abstracts a minimal subset of Kryo types and methods. + * <p> + * Kryo is often shaded. For instance, TinkerPop's Gryo + * serializer relies on a shaded Kryo package. + * TinkerPop serializers written against a particular shaded + * Kryo package (or an unshaded Kryo package) are compatible + * only with that package. In contrast, TinkerPop serializers written + * against this abstraction can be used with any shaded or + * unshaded Kryo package, so long as the signatures and behavior + * of the methods in this package remain stable. + * <p> + * To show how this is useful, consider + * {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraphSerializer}. + * This class has logic unique to TinkerPop that performs + * efficient and forward-compatible serialization of + * {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraph} + * instances. It takes advantage of package-level visibility + * and the fact that it shares a package with its target, + * so it would be challenging to cleanly and naturally replicate + * (i.e. without package spoofing or runtime visibility overrides). + * By implementing + * {@link org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim} + * instead of, say, Gryo's shaded + * {@link org.apache.tinkerpop.shaded.kryo.Serializer}, + * such a serializer can be used with anybody's Kryo package, + * regardless of whether + * that package is shaded or not. This lets third-parties reuse + * TinkerPop's efficient, internals-aware StarGraph serializer on + * their own serialization platform (and without altering + * TinkerPop's bytecode, let alone its source). + * <p> + * The number of types and methods in this + * package is deliberately small to reduce the likelihood of a + * new Kryo release introducing an incompatible change. + */ +package org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedInputAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedInputAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedInputAdapter.java new file mode 100644 index 0000000..d11c1c4 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedInputAdapter.java @@ -0,0 +1,66 @@ +/* + * 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.kryoshim.shaded; + +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim; +import org.apache.tinkerpop.shaded.kryo.io.Input; + +public class ShadedInputAdapter implements InputShim { + + private final Input shadedInput; + + public ShadedInputAdapter(Input shadedInput) { + this.shadedInput = shadedInput; + } + + Input getShadedInput() { + return shadedInput; + } + + @Override + public byte readByte() + { + return shadedInput.readByte(); + } + + @Override + public byte[] readBytes(int size) { + return shadedInput.readBytes(size); + } + + @Override + public String readString() { + return shadedInput.readString(); + } + + @Override + public long readLong() { + return shadedInput.readLong(); + } + + @Override + public int readInt() { + return shadedInput.readInt(); + } + + @Override + public double readDouble() { + return shadedInput.readDouble(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedKryoAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedKryoAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedKryoAdapter.java new file mode 100644 index 0000000..4283298 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedKryoAdapter.java @@ -0,0 +1,67 @@ +/* + * 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.kryoshim.shaded; + +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim; +import org.apache.tinkerpop.shaded.kryo.Kryo; + +public class ShadedKryoAdapter implements KryoShim<ShadedInputAdapter, ShadedOutputAdapter> { + + private final Kryo shadedKryo; + + public ShadedKryoAdapter(Kryo shadedKryo) { + this.shadedKryo = shadedKryo; + } + + @Override + public <T> T readObject(ShadedInputAdapter input, Class<T> type) + { + return shadedKryo.readObject(input.getShadedInput(), type); + } + + @Override + public Object readClassAndObject(ShadedInputAdapter input) + { + return shadedKryo.readClassAndObject(input.getShadedInput()); + } + + @Override + public void writeObject(ShadedOutputAdapter output, Object object) + { + shadedKryo.writeObject(output.getShadedOutput(), object); + } + + @Override + public void writeClassAndObject(ShadedOutputAdapter output, Object object) + { + shadedKryo.writeClassAndObject(output.getShadedOutput(), object); + } + + @Override + public <T> T readObjectOrNull(ShadedInputAdapter input, Class<T> type) + { + return shadedKryo.readObjectOrNull(input.getShadedInput(), type); + } + + @Override + public void writeObjectOrNull(ShadedOutputAdapter output, Object object, Class type) + { + shadedKryo.writeObjectOrNull(output.getShadedOutput(), object, type); + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedOutputAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedOutputAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedOutputAdapter.java new file mode 100644 index 0000000..7547466 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedOutputAdapter.java @@ -0,0 +1,72 @@ +/* + * 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.kryoshim.shaded; + +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim; +import org.apache.tinkerpop.shaded.kryo.io.Output; + +public class ShadedOutputAdapter implements OutputShim { + + private final Output shadedOutput; + + public ShadedOutputAdapter(Output shadedOutput) { + this.shadedOutput = shadedOutput; + } + + @Override + public void writeByte(byte b) + { + shadedOutput.writeByte(b); + } + + @Override + public void writeBytes(byte[] array, int offset, int count) { + shadedOutput.writeBytes(array, offset, count); + } + + @Override + public void writeString(String s) { + shadedOutput.writeString(s); + } + + @Override + public void writeLong(long l) { + shadedOutput.writeLong(l); + } + + @Override + public void writeInt(int i) { + shadedOutput.writeInt(i); + } + + @Override + public void writeDouble(double d) { + shadedOutput.writeDouble(d); + } + + @Override + public void flush() { + shadedOutput.flush(); + } + + Output getShadedOutput() + { + return shadedOutput; + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedSerializerAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedSerializerAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedSerializerAdapter.java new file mode 100644 index 0000000..4ce27b1 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/ShadedSerializerAdapter.java @@ -0,0 +1,54 @@ +/* + * 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.kryoshim.shaded; + +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; +import org.apache.tinkerpop.shaded.kryo.Kryo; +import org.apache.tinkerpop.shaded.kryo.Serializer; +import org.apache.tinkerpop.shaded.kryo.io.Input; +import org.apache.tinkerpop.shaded.kryo.io.Output; + +public class ShadedSerializerAdapter<T> extends Serializer<T> { + + SerializerShim<T> serializer; + + public ShadedSerializerAdapter(SerializerShim<T> serializer) { + this.serializer = serializer; + setImmutable(this.serializer.isImmutable()); + } + + @Override + public void write(Kryo kryo, Output output, T t) { + /* These adapters could be cached pretty efficiently in instance fields if it were guaranteed that this + * class was never subject to concurrent use. That's true of Kryo instances, but it is not clear that + * it is true of Serializer instances. + */ + ShadedKryoAdapter shadedKryoAdapter = new ShadedKryoAdapter(kryo); + ShadedOutputAdapter shadedOutputAdapter = new ShadedOutputAdapter(output); + serializer.write(shadedKryoAdapter, shadedOutputAdapter, t); + } + + @Override + public T read(Kryo kryo, Input input, Class<T> aClass) { + // Same caching opportunity as in write(...) + ShadedKryoAdapter shadedKryoAdapter = new ShadedKryoAdapter(kryo); + ShadedInputAdapter shadedInputAdapter = new ShadedInputAdapter(input); + return serializer.read(shadedKryoAdapter, shadedInputAdapter, aClass); + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/package-info.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/package-info.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/package-info.java new file mode 100644 index 0000000..d91a3f1 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/kryoshim/shaded/package-info.java @@ -0,0 +1,25 @@ +/* + * 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. + */ + +/** + * Implementations of the interfaces in + * {@link org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim} + * using TinkerPop's shaded copy of Kryo. + */ +package org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/InputShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/InputShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/InputShim.java deleted file mode 100644 index 6d00884..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/InputShim.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -/** - * A minimal {@link org.apache.tinkerpop.shaded.kryo.io.Input}-like abstraction. - */ -public interface InputShim { - - byte readByte(); - - byte[] readBytes(int size); - - String readString(); - - long readLong(); - - int readInt(); - - double readDouble(); -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShim.java deleted file mode 100644 index e2a95e6..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShim.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -/** - * A minimal {@link org.apache.tinkerpop.shaded.kryo.Kryo}-like abstraction. - * - * @param <I> this interface's complementary InputShim - * @param <O> this interface's complementary OutputShim - */ -public interface KryoShim<I extends InputShim, O extends OutputShim> { - - <T> T readObject(I input, Class<T> type); - - Object readClassAndObject(I input); - - void writeObject(O output, Object object); - - void writeClassAndObject(O output, Object object); - - <T> T readObjectOrNull(I input, Class<T> type); - - void writeObjectOrNull(O output, Object object, Class type); -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimService.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimService.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimService.java deleted file mode 100644 index 024d40c..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimService.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -import java.io.InputStream; -import java.io.OutputStream; - -/** - * This interface exists to decouple HadoopPools from TinkerPop's shaded Kryo. - * <p> - * VertexWritable and ObjectWritable formerly implemented Serializable by - * resorting to statically-pooled shaded Kryo instances maintained by the HadoopPools class. - * This is awkward because those shaded Kryo instances require class registration by default. - * <p> - * Consider what happens with custom property datatypes reachable from the reference graph rooted at an ObjectWritable - * or VertexWritable instance. It is not enough for these property classes to merely implement - * Serializable, though one think that from skimming ObjectWritable/VertexWritable. Those classes - * must also register with TinkerPop's internal, shaded Kryo instances as maintained by HadoopPools, - * or else configure those instances to accept unregistered classes. - * Otherwise, TinkerPop's shaded Kryo will refuse to serialize those properties (even though - * they implement Serializable, and even though the user might think they are only using - * Java's standard Serialization mechanism!). - * <p> - * By hiding the mechanics of serialization behind this interface instead of hardcoding it in - * HadoopPools, the user can decide how to implement serialization for ObjectWritable/VertexWritable - * (and whatever other classes in TinkerPop decide to implement Serializable but then delegate - * all of the implementation details, like ObjectWritable/VertexWritable do now). - */ -public interface KryoShimService { - - /** - * Deserializes an object from an input stream. - * - * @param source the stream from which to read an object's serialized form - * @return the first deserialized object available from {@code source} - */ - Object readClassAndObject(InputStream source); - - /** - * Serializes an object to an output stream. This may flush the output stream. - * - * @param o the object to serialize - * @param sink the stream into which the serialized object is written - */ - void writeClassAndObject(Object o, OutputStream sink); - - /** - * Returns this service's relative priority number. Unless explicitly overridden through a - * system property ({@link KryoShimServiceLoader#SHIM_CLASS_SYSTEM_PROPERTY}), - * the service implementation with the numerically highest priority will be used - * and all others ignored. In other words, the highest priority wins (in the absence of a - * system property override). - * <p> - * TinkerPop's current default implementation uses priority value zero. - * <p> - * Third-party implementations of this interface should (but are not technically required) - * to use a priority value with absolute value greater than 100. - * <p> - * The implementation currently breaks priority ties by lexicographical comparison of - * fully-qualified package-and-classname, but this tie-breaking behavior should be - * considered undefined and subject to future change. Ties are ignored if the service - * is explicitly set through the system property mentioned above. - * - * @return this implementation's priority value - */ - int getPriority(); -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimServiceLoader.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimServiceLoader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimServiceLoader.java deleted file mode 100644 index 1d5413d..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/KryoShimServiceLoader.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.ServiceLoader; - -public class KryoShimServiceLoader { - - private static volatile KryoShimService CACHED_SHIM_SERVICE; - - private static final Logger log = LoggerFactory.getLogger(KryoShimServiceLoader.class); - - /** - * Set this system property to the fully-qualified name of a {@link KryoShimService} - * package-and-classname to force it into service. Setting this property causes the - * priority-selection mechanism ({@link KryoShimService#getPriority()}) to be ignored. - */ - public static final String SHIM_CLASS_SYSTEM_PROPERTY = "tinkerpop.kryo.shim"; - - public static KryoShimService load(boolean forceReload) { - - if (null != CACHED_SHIM_SERVICE && !forceReload) { - return CACHED_SHIM_SERVICE; - } - - ArrayList<KryoShimService> services = new ArrayList<>(); - - ServiceLoader<KryoShimService> sl = ServiceLoader.load(KryoShimService.class); - - KryoShimService result = null; - - synchronized (KryoShimServiceLoader.class) { - if (forceReload) { - sl.reload(); - } - - for (KryoShimService kss : sl) { - services.add(kss); - } - } - - String shimClass = System.getProperty(SHIM_CLASS_SYSTEM_PROPERTY); - - if (null != shimClass) { - for (KryoShimService kss : services) { - if (kss.getClass().getCanonicalName().equals(shimClass)) { - log.info("Set {} provider to {} ({}) from system property {}={}", - KryoShimService.class.getSimpleName(), kss, kss.getClass(), - SHIM_CLASS_SYSTEM_PROPERTY, shimClass); - result = kss; - } - } - } else { - Collections.sort(services, KryoShimServiceComparator.INSTANCE); - - for (KryoShimService kss : services) { - log.debug("Found Kryo shim service class {} (priority {})", kss.getClass(), kss.getPriority()); - } - - if (0 != services.size()) { - result = services.get(services.size() - 1); - } - } - - - if (null == result) { - throw new IllegalStateException("Unable to load KryoShimService"); - } - - log.info("Set {} provider to {} ({}) because its priority value ({}) is the highest available", - KryoShimService.class.getSimpleName(), result, result.getClass(), result.getPriority()); - - return CACHED_SHIM_SERVICE = result; - } - - public static KryoShimService load() { - return load(false); - } - - public static byte[] writeClassAndObjectToBytes(Object o) { - KryoShimService shimService = load(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - shimService.writeClassAndObject(o, baos); - - return baos.toByteArray(); - } - - public static <T> T readClassAndObject(InputStream source) { - KryoShimService shimService = load(); - - return (T)shimService.readClassAndObject(source); - } - - private enum KryoShimServiceComparator implements Comparator<KryoShimService> { - INSTANCE; - - @Override - public int compare(KryoShimService a, KryoShimService b) { - int ap = a.getPriority(); - int bp = b.getPriority(); - - if (ap < bp) { - return -1; - } else if (bp < ap) { - return 1; - } else { - return a.getClass().getCanonicalName().compareTo(b.getClass().getCanonicalName()); - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/OutputShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/OutputShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/OutputShim.java deleted file mode 100644 index 4468434..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/OutputShim.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -import java.io.IOException; - -/** - * A minimal {@link org.apache.tinkerpop.shaded.kryo.io.Output}-like abstraction. - */ -public interface OutputShim { - - void writeByte(byte b); - - void writeBytes(byte[] array, int offset, int count); - - void writeString(String s); - - void writeLong(long l); - - void writeInt(int i); - - void writeDouble(double d); - - void flush(); -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/SerializerShim.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/SerializerShim.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/SerializerShim.java deleted file mode 100644 index 686350d..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/SerializerShim.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; - -/** - * A minimal {@link org.apache.tinkerpop.shaded.kryo.Serializer}-like abstraction. - * - * @param <T> the class this serializer reads/writes from/to bytes. - */ -public interface SerializerShim<T> { - - <O extends OutputShim> void write(KryoShim<?, O> kryo, O output, T starGraph); - - <I extends InputShim> T read(KryoShim<I, ?> kryo, I input, Class<T> clazz); - - default boolean isImmutable() { - return false; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/package-info.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/package-info.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/package-info.java deleted file mode 100644 index 436f117..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/package-info.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/** - * Abstracts a minimal subset of Kryo types and methods. - * <p> - * Kryo is often shaded. For instance, TinkerPop's Gryo - * serializer relies on a shaded Kryo package. - * TinkerPop serializers written against a particular shaded - * Kryo package (or the unshaded Kryo package) are compatible - * only with that package. In contrast, TinkerPop serializers written - * against this abstraction can be used with any shaded or - * unshaded Kryo package, so long as the signatures and behavior - * of the methods in this package remain stable. - * <p> - * To show how this is useful, consider - * {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraphSerializer}. - * This class has logic unique to TinkerPop that performs - * efficient and forward-compatible serialization of - * {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraph} - * instances. It takes advantage of package-level visibility - * and the fact that it shares a package with its target, - * so it would be challenging to cleanly and naturally replicate - * (i.e. without package spoofing or runtime visibility overrides). - * By implementing - * {@link org.apache.tinkerpop.gremlin.structure.io.kryoshim.SerializerShim} - * instead of, say, Gryo's shaded - * {@link org.apache.tinkerpop.shaded.kryo.Serializer}, - * it can be used with anybody's Kryo package, regardless of whether - * that package is shaded or not. This lets third-parties reuse - * TinkerPop's efficient, internals-aware StarGraph serializer on - * their own serialization platform (and without altering - * TinkerPop's bytecode, let alone its source). - * <p> - * The number of types and methods in this - * package is deliberately small to reduce the likelihood of a - * new Kryo release introducing an incompatible change. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedInputAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedInputAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedInputAdapter.java deleted file mode 100644 index 2872326..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedInputAdapter.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded; - -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.InputShim; -import org.apache.tinkerpop.shaded.kryo.io.Input; - -public class ShadedInputAdapter implements InputShim { - - private final Input shadedInput; - - public ShadedInputAdapter(Input shadedInput) { - this.shadedInput = shadedInput; - } - - Input getShadedInput() { - return shadedInput; - } - - @Override - public byte readByte() - { - return shadedInput.readByte(); - } - - @Override - public byte[] readBytes(int size) { - return shadedInput.readBytes(size); - } - - @Override - public String readString() { - return shadedInput.readString(); - } - - @Override - public long readLong() { - return shadedInput.readLong(); - } - - @Override - public int readInt() { - return shadedInput.readInt(); - } - - @Override - public double readDouble() { - return shadedInput.readDouble(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedKryoAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedKryoAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedKryoAdapter.java deleted file mode 100644 index 0e85f6f..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedKryoAdapter.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded; - -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.KryoShim; -import org.apache.tinkerpop.shaded.kryo.Kryo; - -public class ShadedKryoAdapter implements KryoShim<ShadedInputAdapter, ShadedOutputAdapter> { - - private final Kryo shadedKryo; - - public ShadedKryoAdapter(Kryo shadedKryo) { - this.shadedKryo = shadedKryo; - } - - @Override - public <T> T readObject(ShadedInputAdapter input, Class<T> type) - { - return shadedKryo.readObject(input.getShadedInput(), type); - } - - @Override - public Object readClassAndObject(ShadedInputAdapter input) - { - return shadedKryo.readClassAndObject(input.getShadedInput()); - } - - @Override - public void writeObject(ShadedOutputAdapter output, Object object) - { - shadedKryo.writeObject(output.getShadedOutput(), object); - } - - @Override - public void writeClassAndObject(ShadedOutputAdapter output, Object object) - { - shadedKryo.writeClassAndObject(output.getShadedOutput(), object); - } - - @Override - public <T> T readObjectOrNull(ShadedInputAdapter input, Class<T> type) - { - return shadedKryo.readObjectOrNull(input.getShadedInput(), type); - } - - @Override - public void writeObjectOrNull(ShadedOutputAdapter output, Object object, Class type) - { - shadedKryo.writeObjectOrNull(output.getShadedOutput(), object, type); - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedOutputAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedOutputAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedOutputAdapter.java deleted file mode 100644 index 5ca0ecb..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedOutputAdapter.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded; - -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.OutputShim; -import org.apache.tinkerpop.shaded.kryo.io.Output; - -public class ShadedOutputAdapter implements OutputShim { - - private final Output shadedOutput; - - public ShadedOutputAdapter(Output shadedOutput) { - this.shadedOutput = shadedOutput; - } - - @Override - public void writeByte(byte b) - { - shadedOutput.writeByte(b); - } - - @Override - public void writeBytes(byte[] array, int offset, int count) { - shadedOutput.writeBytes(array, offset, count); - } - - @Override - public void writeString(String s) { - shadedOutput.writeString(s); - } - - @Override - public void writeLong(long l) { - shadedOutput.writeLong(l); - } - - @Override - public void writeInt(int i) { - shadedOutput.writeInt(i); - } - - @Override - public void writeDouble(double d) { - shadedOutput.writeDouble(d); - } - - @Override - public void flush() { - shadedOutput.flush(); - } - - Output getShadedOutput() - { - return shadedOutput; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedSerializerAdapter.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedSerializerAdapter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedSerializerAdapter.java deleted file mode 100644 index ebfd0fb..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/ShadedSerializerAdapter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded; - -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.SerializerShim; -import org.apache.tinkerpop.shaded.kryo.Kryo; -import org.apache.tinkerpop.shaded.kryo.Serializer; -import org.apache.tinkerpop.shaded.kryo.io.Input; -import org.apache.tinkerpop.shaded.kryo.io.Output; - -public class ShadedSerializerAdapter<T> extends Serializer<T> { - - SerializerShim<T> serializer; - - public ShadedSerializerAdapter(SerializerShim<T> serializer) { - this.serializer = serializer; - setImmutable(this.serializer.isImmutable()); - } - - @Override - public void write(Kryo kryo, Output output, T t) { - /* These adapters could be cached pretty efficiently in instance fields if it were guaranteed that this - * class was never subject to concurrent use. That's true of Kryo instances, but it is not clear that - * it is true of Serializer instances. - */ - ShadedKryoAdapter shadedKryoAdapter = new ShadedKryoAdapter(kryo); - ShadedOutputAdapter shadedOutputAdapter = new ShadedOutputAdapter(output); - serializer.write(shadedKryoAdapter, shadedOutputAdapter, t); - } - - @Override - public T read(Kryo kryo, Input input, Class<T> aClass) { - // Same caching opportunity as in write(...) - ShadedKryoAdapter shadedKryoAdapter = new ShadedKryoAdapter(kryo); - ShadedInputAdapter shadedInputAdapter = new ShadedInputAdapter(input); - return serializer.read(shadedKryoAdapter, shadedInputAdapter, aClass); - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/package-info.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/package-info.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/package-info.java deleted file mode 100644 index ea70003..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/kryoshim/shaded/package-info.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Implementations of the interfaces in - * {@link org.apache.tinkerpop.gremlin.structure.io.kryoshim} - * using TinkerPop's shaded copy of Kryo. - */ -package org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/218d7909/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraphGryoSerializer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraphGryoSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraphGryoSerializer.java index 2acd770..b2379ce 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraphGryoSerializer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/star/StarGraphGryoSerializer.java @@ -23,14 +23,11 @@ import java.util.Map; import org.apache.tinkerpop.gremlin.process.computer.GraphFilter; import org.apache.tinkerpop.gremlin.structure.Direction; -import org.apache.tinkerpop.gremlin.structure.io.kryoshim.shaded.ShadedSerializerAdapter; +import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.shaded.ShadedSerializerAdapter; /** - * Kryo serializer for {@link StarGraph}. Implements an internal versioning capability for backward compatibility. - * The single byte at the front of the serialization stream denotes the version. That version can be used to choose - * the correct deserialization mechanism. The limitation is that this versioning won't help with backward - * compatibility for custom serializers from providers. Providers should be encouraged to write their serializers - * with backward compatibility in mind. + * A wrapper for {@link StarGraphSerializer} that makes it compatible with TinkerPop's + * shaded Kryo. * * @author Marko A. Rodriguez (http://markorodriguez.com) * @author Stephen Mallette (http://stephen.genoprime.com)