package org.infinispan.counter.impl.metadata;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collections;
import java.util.Set;
import org.infinispan.commons.api.functional.MetaParam;
import org.infinispan.commons.marshall.AdvancedExternalizer;
import org.infinispan.counter.api.CounterConfiguration;
import org.infinispan.counter.impl.externalizers.ExternalizerIds;
/**
* Stores the {@link CounterConfiguration} with the {@link org.infinispan.counter.impl.entries.CounterValue}.
* <p>
* The metadata is static and doesn't change. It is sent when initializing a counter and it is kept locally in all the
* nodes. This avoids transfer information about the counter in every operation (e.g. boundaries/reset).
*
* @author Pedro Ruivo
* @since 9.0
*/
public class ConfigurationMetadata implements MetaParam.Writable<CounterConfiguration> {
public static final AdvancedExternalizer<ConfigurationMetadata> EXTERNALIZER = new Externalizer();
private final CounterConfiguration configuration;
public ConfigurationMetadata(CounterConfiguration configuration) {
this.configuration = configuration;
}
@Override
public CounterConfiguration get() {
return configuration;
}
private static class Externalizer implements AdvancedExternalizer<ConfigurationMetadata> {
@Override
public Set<Class<? extends ConfigurationMetadata>> getTypeClasses() {
return Collections.singleton(ConfigurationMetadata.class);
}
@Override
public Integer getId() {
return ExternalizerIds.COUNTER_METADATA;
}
@Override
public void writeObject(ObjectOutput output, ConfigurationMetadata object) throws IOException {
CounterConfiguration.EXTERNALIZER.writeObject(output, object.configuration);
}
@Override
public ConfigurationMetadata readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new ConfigurationMetadata(CounterConfiguration.EXTERNALIZER.readObject(input));
}
}
}