blob: 4422e1bf6c589f1e8b014f3a40c4105f13e43f7f [file] [log] [blame]
/*
* 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.commons.configuration.Configuration;
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}
*/
public Object readClassAndObject(final 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
*/
public void writeClassAndObject(final Object o, final OutputStream sink);
/**
* Returns this service's relative priority number. Unless explicitly overridden through a
* system property ({@link KryoShimServiceLoader#KRYO_SHIM_SERVICE}),
* 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
*/
public int getPriority();
/**
* Attempt to incorporate the supplied configuration in future read/write calls.
* This method is not guaranteed to have any effect on an instance of this interface
* after {@link #writeClassAndObject(Object, OutputStream)} or {@link #readClassAndObject(InputStream)}
* has been invoked on that particular instance.
*
* @param conf the configuration to apply to this service's internal serializer
*/
public void applyConfiguration(final Configuration conf);
/**
* Release all resources associated with the shim service.
* This is called on a forced reload or when the {@link KryoShimServiceLoader} is closed.
*/
public void close();
}