package de.invesdwin.util.collections.loadingcache.internal;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Function;
import javax.annotation.concurrent.ThreadSafe;
import de.invesdwin.util.collections.loadingcache.ILoadingCache;
import de.invesdwin.util.collections.loadingcache.guava.AGuavaLoadingCacheMap;
import de.invesdwin.util.collections.loadingcache.guava.GuavaLoadingCacheMapConfig;
@ThreadSafe
public class GuavaLoadingCache<K, V> implements ILoadingCache<K, V> {
private final AGuavaLoadingCacheMap<K, V> delegate = new AGuavaLoadingCacheMap<K, V>() {
@Override
protected V loadValue(final K key) {
return loadValue.apply(key);
}
@Override
protected GuavaLoadingCacheMapConfig getConfig() {
return GuavaLoadingCache.this.getConfig();
}
};
private final Function<K, V> loadValue;
private final Integer maximumSize;
public GuavaLoadingCache(final Function<K, V> loadValue, final Integer maximumSize) {
this.loadValue = loadValue;
this.maximumSize = maximumSize;
}
protected GuavaLoadingCacheMapConfig getConfig() {
return new GuavaLoadingCacheMapConfig().withMaximumSize(maximumSize);
}
@Override
public V get(final K key) {
return delegate.get(key);
}
@Override
public void clear() {
delegate.clear();
}
@Override
public boolean containsKey(final K key) {
return delegate.containsKey(key);
}
@Override
public void remove(final K key) {
delegate.remove(key);
}
@Override
public void put(final K key, final V value) {
delegate.put(key, value);
}
@Override
public Set<Entry<K, V>> entrySet() {
return delegate.entrySet();
}
@Override
public int size() {
return delegate.size();
}
@Override
public Set<K> keySet() {
return delegate.keySet();
}
@Override
public Collection<V> values() {
return delegate.values();
}
@Override
public Map<K, V> asMap() {
return Collections.unmodifiableMap(delegate);
}
@Override
public boolean isEmpty() {
return delegate.isEmpty();
}
}