package org.atlasapi.persistence.service;
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.Service;
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 CachingServiceResolver implements ServiceResolver {
private final ServiceResolver delegate;
private final LoadingCache<Long, Optional<Service>> cache =
CacheBuilder.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES)
.build(new CacheLoader<Long, Optional<Service>>() {
@Override
public Optional<Service> load(Long key) throws Exception {
return delegate.serviceFor(key);
}
});
public CachingServiceResolver(ServiceResolver delegate) {
this.delegate = checkNotNull(delegate);
}
@Override
public Optional<Service> serviceFor(long id) {
try {
return cache.get(id);
} catch (ExecutionException e) {
throw new IllegalStateException(e);
}
}
@Override
public Iterable<Service> servicesFor(Alias alias) {
throw new UnsupportedOperationException();
}
}