/** * */ package net.objectlab.kit.collections; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @author Benoit Xhenseval * */ public class ReadOnlyExpiringHashMap<K, V> extends AbstractReadOnlyExpiringCollection implements ReadOnlyExpiringMap<K, V> { private static final String COLLECTION_IS_IMMUTABLE = "Collection is immutable"; private Map<K, V> delegate = new HashMap<>(); private final MapLoader<K, V> loader; public ReadOnlyExpiringHashMap(final ReadOnlyExpiringHashMapBuilder<K, V> builder) { loader = builder.getLoader(); setId(builder.getId()); setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); setReloadOnExpiry(builder.isReloadOnExpiry()); setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); setReloadWhenExpired(builder.isReloadWhenExpired()); setTimeProvider(builder.getTimeProvider()); start(); } @Override protected void doLoad() { final DefaultMapBuilder<K, V> builder = new DefaultMapBuilder<>(getId()); loader.load(builder); delegate = builder.build(); } @Override public void clear() { throw new UnsupportedOperationException(COLLECTION_IS_IMMUTABLE); } @Override public boolean containsKey(final Object key) { validateOnAccess(); return delegate.containsKey(key); } @Override public boolean containsValue(final Object value) { validateOnAccess(); return delegate.containsValue(value); } @Override public Set<java.util.Map.Entry<K, V>> entrySet() { validateOnAccess(); return delegate.entrySet(); } @Override public V get(final Object key) { validateOnAccess(); return delegate.get(key); } @Override public boolean isEmpty() { validateOnAccess(); return delegate.isEmpty(); } @Override public Set<K> keySet() { validateOnAccess(); return delegate.keySet(); } @Override public V put(final K key, final V value) { throw new UnsupportedOperationException(COLLECTION_IS_IMMUTABLE); } @Override public void putAll(final Map<? extends K, ? extends V> m) { throw new UnsupportedOperationException(COLLECTION_IS_IMMUTABLE); } @Override public V remove(final Object key) { throw new UnsupportedOperationException(COLLECTION_IS_IMMUTABLE); } @Override public int size() { validateOnAccess(); return delegate.size(); } @Override public Collection<V> values() { validateOnAccess(); return delegate.values(); } @Override protected void doClear() { delegate.clear(); } @Override public void reload() { doLoad(); } }