/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.indexes.serialization.avro.impl;
import org.hibernate.search.indexes.serialization.avro.logging.impl.Log;
import org.hibernate.search.indexes.serialization.spi.Deserializer;
import org.hibernate.search.indexes.serialization.spi.SerializationProvider;
import org.hibernate.search.indexes.serialization.spi.Serializer;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* Avro based implementation of {@code SerializationProvider}.
* <p>
* Parsing code inspired by http://www.infoq.com/articles/ApacheAvro
* from Boris Lublinsky
* <p>
* Before the actual serialized flux, two bytes are reserved:
* <ul>
* <li>majorVersion</li>
* <li>minorVersion</li>
* </ul>
*
* A major version increase implies an incompatible protocol change.
* Messages of a {@code majorVersion > current version} should be refused.
* <p>
* A minor version increase implies a compatible protocol change.
* Messages of a {@code minorVersion > current version} are parsed, but new
* operation will be ignored or rejected.
* <p>
* If message's {@code major version is < current version}, then the
* implementation is strongly encouraged to parse and process them.
* It is mandatory if only message's {@code code minor version is < current version}.
*
* @author Emmanuel Bernard <emmanuel@hibernate.org>
* @author Hardy Ferentschik
*/
public class AvroSerializationProvider implements SerializationProvider {
private static final Log log = LoggerFactory.make( Log.class );
private final KnownProtocols protocols;
public static int getMajorVersion() {
return KnownProtocols.MAJOR_VERSION;
}
public static int getMinorVersion() {
return KnownProtocols.LATEST_MINOR_VERSION;
}
public AvroSerializationProvider() {
log.serializationProtocol( getMajorVersion(), getMinorVersion() );
this.protocols = new KnownProtocols();
}
@Override
public Serializer getSerializer() {
return new AvroSerializer( protocols.getLatestProtocol() );
}
@Override
public Deserializer getDeserializer() {
return new AvroDeserializer( protocols );
}
@Override
public String toString() {
return "Avro SerializationProvider v" + getMajorVersion() + "." + getMinorVersion();
}
}