package com.codecademy.eventhub.storage;
import com.google.common.cache.Cache;
import com.codecademy.eventhub.model.Event;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
public class CachedEventStorage extends DelegateEventStorage {
private final Cache<Long, Event> eventCache;
public CachedEventStorage(EventStorage eventStorage, Cache<Long, Event> eventCache) {
super(eventStorage);
this.eventCache = eventCache;
}
@Override
public Event getEvent(final long eventId) {
try {
return eventCache.get(eventId, new Callable<Event>() {
@Override
public Event call() {
return CachedEventStorage.super.getEvent(eventId);
}
});
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
@Override
public String getVarz(int indentation) {
String indent = new String(new char[indentation]).replace('\0', ' ');
return String.format(
"%s\n\n" +
indent + this.getClass().getName() + "\n" +
indent + "==================\n" +
indent + "eventCache: %s",
super.getVarz(indentation), eventCache.stats().toString());
}
}