package com.schneeloch.bostonbusmap_library.data; import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * A thread-safe pool of objects * * TODO: replace with LoadingCache * @author schneg * * @param <K> * @param <V> */ public abstract class Pool<K, V> { private final List<K> priorities = Lists.newLinkedList(); private final Map<K, V> pool = Maps.newConcurrentMap(); private final int limit; public Pool(int limit) { this.limit = limit; } protected void clearAll() { priorities.clear(); pool.clear(); } protected abstract V create(K key) throws IOException; protected Collection<V> values() { return pool.values(); } public boolean keyInPool(K key) { return pool.containsKey(key); } public V get(K key) throws IOException { if (pool.containsKey(key)) { return pool.get(key); } else { V value = create(key); if (value == null) { return null; } else { if (priorities.size() >= limit) { K firstKey = priorities.get(0); priorities.remove(0); pool.remove(firstKey); } priorities.add(key); pool.put(key, value); return value; } } } }