package com.apollographql.apollo.cache.normalized.lru; import com.apollographql.apollo.api.internal.Optional; import java.util.concurrent.TimeUnit; /** * Controls how long a {@link com.apollographql.apollo.cache.normalized.Record} will * stay in a {@link LruNormalizedCache}. */ public final class EvictionPolicy { public static final EvictionPolicy NO_EVICTION = EvictionPolicy.builder().build(); private final Optional<Long> maxSizeBytes; private final Optional<Long> maxEntries; private final Optional<Long> expireAfterAccess; private final Optional<TimeUnit> expireAfterAccessTimeUnit; private final Optional<Long> expireAfterWrite; private final Optional<TimeUnit> expireAfterWriteTimeUnit; Optional<Long> maxSizeBytes() { return maxSizeBytes; } Optional<Long> maxEntries() { return maxEntries; } Optional<Long> expireAfterAccess() { return expireAfterAccess; } Optional<TimeUnit> expireAfterAccessTimeUnit() { return expireAfterAccessTimeUnit; } Optional<Long> expireAfterWrite() { return expireAfterWrite; } Optional<TimeUnit> expireAfterWriteTimeUnit() { return expireAfterWriteTimeUnit; } public static EvictionPolicy.Builder builder() { return new EvictionPolicy.Builder(); } public static class Builder { private Builder() { } private Optional<Long> maxSizeBytes = Optional.absent(); private Optional<Long> maxEntries = Optional.absent(); private Optional<Long> expireAfterAccess = Optional.absent(); private Optional<TimeUnit> expireAfterAccessTimeUnit = Optional.absent(); private Optional<Long> expireAfterWrite = Optional.absent(); private Optional<TimeUnit> expireAfterWriteTimeUnit = Optional.absent(); public EvictionPolicy.Builder maxSizeBytes(long maxSizeBytes) { this.maxSizeBytes = Optional.of(maxSizeBytes); return this; } public EvictionPolicy.Builder maxEntries(long maxEntries) { this.maxEntries = Optional.of(maxEntries); return this; } public EvictionPolicy.Builder expireAfterAccess(long time, TimeUnit timeUnit) { this.expireAfterAccess = Optional.of(time); this.expireAfterAccessTimeUnit = Optional.of(timeUnit); return this; } public EvictionPolicy.Builder expireAfterWrite(long time, TimeUnit timeUnit) { this.expireAfterWrite = Optional.of(time); this.expireAfterWriteTimeUnit = Optional.of(timeUnit); return this; } public EvictionPolicy build() { return new EvictionPolicy(maxSizeBytes, maxEntries, expireAfterAccess, expireAfterAccessTimeUnit, expireAfterWrite, expireAfterWriteTimeUnit); } } private EvictionPolicy(Optional<Long> maxSizeBytes, Optional<Long> maxEntries, Optional<Long> expireAfterAccess, Optional<TimeUnit> expireAfterAccessTimeUnit, Optional<Long> expireAfterWrite, Optional<TimeUnit> expireAfterWriteTimeUnit) { this.maxSizeBytes = maxSizeBytes; this.maxEntries = maxEntries; this.expireAfterAccess = expireAfterAccess; this.expireAfterAccessTimeUnit = expireAfterAccessTimeUnit; this.expireAfterWrite = expireAfterWrite; this.expireAfterWriteTimeUnit = expireAfterWriteTimeUnit; } }