package org.atlasapi.persistence.player; import static com.google.common.base.Preconditions.checkNotNull; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.atlasapi.media.entity.Alias; import org.atlasapi.media.entity.Player; import com.google.common.base.Optional; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class CachingPlayerResolver implements PlayerResolver { private final PlayerResolver delegate; private final LoadingCache<Long, Optional<Player>> cache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .build(new CacheLoader<Long, Optional<Player>>() { @Override public Optional<Player> load(Long key) throws Exception { return delegate.playerFor(key); } }); public CachingPlayerResolver(PlayerResolver delegate) { this.delegate = checkNotNull(delegate); } @Override public Optional<Player> playerFor(long id) { try { return cache.get(id); } catch (ExecutionException e) { throw new IllegalStateException(e); } } @Override public Iterable<Player> playersFor(Alias alias) { throw new UnsupportedOperationException(); } }