/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.configuration.global;
import org.infinispan.Version;
import org.infinispan.marshall.AdvancedExternalizer;
import org.infinispan.marshall.Marshaller;
import org.infinispan.marshall.VersionAwareMarshaller;
import org.jboss.marshalling.ClassResolver;
import java.util.HashMap;
import java.util.Map;
/**
* Configures serialization and marshalling settings.
*/
public class SerializationConfigurationBuilder extends AbstractGlobalConfigurationBuilder<SerializationConfiguration> {
private Marshaller marshaller = new VersionAwareMarshaller();
private short marshallVersion = Short.valueOf(Version.MAJOR_MINOR.replace(".", ""));
private Map<Integer, AdvancedExternalizer<?>> advancedExternalizers = new HashMap<Integer, AdvancedExternalizer<?>>();
private ClassResolver classResolver;
SerializationConfigurationBuilder(GlobalConfigurationBuilder globalConfig) {
super(globalConfig);
}
/**
* Set the marshaller instance that will marshall and unmarshall cache entries.
*
* @param marshaller
*/
public SerializationConfigurationBuilder marshaller(Marshaller marshaller) {
this.marshaller = marshaller;
return this;
}
/**
* Largest allowable version to use when marshalling internal state. Set this to the lowest version cache instance in
* your cluster to ensure compatibility of communications. However, setting this too low will mean you lose out on
* the benefit of improvements in newer versions of the marshaller.
*
* @param marshallVersion
*/
public SerializationConfigurationBuilder version(short marshallVersion) {
this.marshallVersion = marshallVersion;
return this;
}
/**
* Largest allowable version to use when marshalling internal state. Set this to the lowest version cache instance in
* your cluster to ensure compatibility of communications. However, setting this too low will mean you lose out on
* the benefit of improvements in newer versions of the marshaller.
*
* @param marshallVersion
*/
public SerializationConfigurationBuilder version(String marshallVersion) {
this.marshallVersion = Version.getVersionShort(marshallVersion);
return this;
}
/**
* Helper method that allows for quick registration of an {@link org.infinispan.marshall.AdvancedExternalizer}
* implementation alongside its corresponding identifier. Remember that the identifier needs to a be positive number,
* including 0, and cannot clash with other identifiers in the system.
*
* @param id
* @param advancedExternalizer
*/
public <T> SerializationConfigurationBuilder addAdvancedExternalizer(int id, AdvancedExternalizer<T> advancedExternalizer) {
advancedExternalizers.put(id, advancedExternalizer);
return this;
}
/**
* Helper method that allows for quick registration of an {@link org.infinispan.marshall.AdvancedExternalizer}
* implementation alongside its corresponding identifier. Remember that the identifier needs to a be positive number,
* including 0, and cannot clash with other identifiers in the system.
*
* @param advancedExternalizer
*/
public <T> SerializationConfigurationBuilder addAdvancedExternalizer(AdvancedExternalizer<T> advancedExternalizer) {
this.addAdvancedExternalizer(advancedExternalizer.getId(), advancedExternalizer);
return this;
}
/**
* Helper method that allows for quick registration of {@link org.infinispan.marshall.AdvancedExternalizer}
* implementations.
*
* @param advancedExternalizers
*/
public <T> SerializationConfigurationBuilder addAdvancedExternalizer(AdvancedExternalizer<T>... advancedExternalizers) {
for (AdvancedExternalizer<T> advancedExternalizer : advancedExternalizers) {
this.addAdvancedExternalizer(advancedExternalizer);
}
return this;
}
/**
* Class resolver to use when unmarshallig objects.
*
* @param classResolver
*/
public SerializationConfigurationBuilder classResolver(ClassResolver classResolver) {
this.classResolver = classResolver;
return this;
}
@Override
protected void validate() {
// No-op, no validation required
}
@Override
SerializationConfiguration create() {
return new SerializationConfiguration(
marshaller, marshallVersion, advancedExternalizers, classResolver);
}
@Override
SerializationConfigurationBuilder read(SerializationConfiguration template) {
this.advancedExternalizers = template.advancedExternalizers();
this.marshaller = template.marshaller();
this.marshallVersion = template.version();
return this;
}
@Override
public String toString() {
return "SerializationConfigurationBuilder{" +
"advancedExternalizers=" + advancedExternalizers +
", marshaller=" + marshaller +
", marshallVersion=" + marshallVersion +
", classResolver=" + classResolver +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SerializationConfigurationBuilder that = (SerializationConfigurationBuilder) o;
if (marshallVersion != that.marshallVersion) return false;
if (advancedExternalizers != null ? !advancedExternalizers.equals(that.advancedExternalizers) : that.advancedExternalizers != null)
return false;
if (marshaller != null ? !marshaller.equals(that.marshaller) : that.marshaller != null)
return false;
if (classResolver != null ? !classResolver.equals(that.classResolver) : that.classResolver != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = marshaller != null ? marshaller.hashCode() : 0;
result = 31 * result + (int) marshallVersion;
result = 31 * result + (advancedExternalizers != null ? advancedExternalizers.hashCode() : 0);
result = 31 * result + (classResolver != null ? classResolver.hashCode() : 0);
return result;
}
}