package org.javers.repository.mongo; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.Optional; import org.javers.core.metamodel.object.CdoSnapshot; import org.javers.core.metamodel.object.GlobalId; import java.util.function.Function; /** * @author bartosz.walacik */ class LatestSnapshotCache { private final Cache<GlobalId, Optional<CdoSnapshot>> cache; private final Function<GlobalId, Optional<CdoSnapshot>> source; private final boolean disabled; LatestSnapshotCache(int size, Function<GlobalId, Optional<CdoSnapshot>> source) { cache = CacheBuilder.newBuilder() .maximumSize(size) .build(); this.source = source; this.disabled = size == 0; } Optional<CdoSnapshot> getLatest(GlobalId globalId) { if (disabled) { return source.apply(globalId); } Optional<CdoSnapshot> fromCache = cache.getIfPresent(globalId); if (fromCache != null) { return fromCache; } Optional<CdoSnapshot> fromDb = source.apply(globalId); cache.put(globalId, fromDb); return fromDb; } void put(CdoSnapshot cdoSnapshot) { if (disabled) { return; } cache.put(cdoSnapshot.getGlobalId(), Optional.of(cdoSnapshot)); } }