package org.infinispan.counter.impl.function; import java.util.Optional; import java.util.function.Function; import org.infinispan.commons.api.functional.EntryView; import org.infinispan.counter.impl.entries.CounterKey; import org.infinispan.counter.impl.entries.CounterValue; import org.infinispan.counter.impl.metadata.ConfigurationMetadata; import org.infinispan.counter.logging.Log; import org.infinispan.util.ByteString; /** * A base function to update an existing counter. * * @author Pedro Ruivo * @since 9.0 */ abstract class BaseFunction<K extends CounterKey, R> implements Function<EntryView.ReadWriteEntryView<K, CounterValue>, R> { @Override public final R apply(EntryView.ReadWriteEntryView<K, CounterValue> entryView) { Optional<CounterValue> value = entryView.find(); if (!value.isPresent()) { logCounterNotFound(entryView.key().getCounterName()); return null; } Optional<ConfigurationMetadata> metadata = entryView.findMetaParam(ConfigurationMetadata.class); if (!metadata.isPresent()) { throw getLog().metadataIsMissing(entryView.key().getCounterName()); } return apply(entryView, metadata.get()); } abstract void logCounterNotFound(ByteString counterName); abstract R apply(EntryView.ReadWriteEntryView<K, CounterValue> entryView, ConfigurationMetadata metadata); protected abstract Log getLog(); }