package org.infinispan.counter.configuration;
import org.infinispan.commons.configuration.attributes.Attribute;
import org.infinispan.commons.configuration.attributes.AttributeSet;
import org.infinispan.commons.logging.LogFactory;
import org.infinispan.counter.api.Storage;
import org.infinispan.counter.logging.Log;
/**
* Base counter configuration builder.
* <p>
* It allows to configure the counter's name, initial value and the {@link Storage} mode.
*
* @author Pedro Ruivo
* @since 9.0
*/
abstract class AbstractCounterConfigurationBuilder<T extends AbstractCounterConfiguration, S extends AbstractCounterConfigurationBuilder<T, S>>
implements CounterConfigurationBuilder<T, S> {
private static final Log log = LogFactory.getLog(AbstractCounterConfigurationBuilder.class, Log.class);
final AttributeSet attributes;
private final CounterManagerConfigurationBuilder builder;
AbstractCounterConfigurationBuilder(CounterManagerConfigurationBuilder builder, AttributeSet attributes) {
this.builder = builder;
this.attributes = attributes;
}
@Override
public final S name(String name) {
attributes.attribute(AbstractCounterConfiguration.NAME).set(name);
return self();
}
@Override
public final S initialValue(long initialValue) {
attributes.attribute(AbstractCounterConfiguration.INITIAL_VALUE).set(initialValue);
return self();
}
@Override
public final S storage(Storage mode) {
attributes.attribute(AbstractCounterConfiguration.STORAGE).set(mode);
return self();
}
@Override
public void validate() {
attributes.attributes().forEach(Attribute::validate);
if (!builder.isGlobalStateEnabled() &&
attributes.attribute(AbstractCounterConfiguration.STORAGE).get() == Storage.PERSISTENT) {
throw log.invalidPersistentStorageMode();
}
}
public String name() {
return attributes.attribute(AbstractCounterConfiguration.NAME).get();
}
@Override
public StrongCounterConfigurationBuilder addStrongCounter() {
return builder.addStrongCounter();
}
@Override
public WeakCounterConfigurationBuilder addWeakCounter() {
return builder.addWeakCounter();
}
}