package sk.stuba.fiit.perconik.core.resources;
import java.util.Collection;
import static com.google.common.base.Preconditions.checkNotNull;
final class Pools {
private enum DefaultPoolFactory implements PoolFactory {
INSTANCE;
public <T> Pool<T> create(final Handler<T> handler) {
return Synchronized.pool(GenericPool.builder(handler).identity().hashSet().build());
}
}
private static PoolFactory objectPoolFactory = DefaultPoolFactory.INSTANCE;
private static PoolFactory listenerPoolFactory = DefaultPoolFactory.INSTANCE;
private Pools() {}
private static final class SafePool<T> implements Pool<T> {
private final Pool<T> pool;
private final Class<T> type;
SafePool(final Pool<T> pool, final Class<T> type) {
this.pool = checkNotNull(pool);
this.type = checkNotNull(type);
}
private T check(final T object) {
return this.type.cast(checkNotNull(object));
}
public boolean contains(final Object object) {
return this.pool.contains(object);
}
public void add(final T object) {
this.pool.add(this.check(object));
}
public void remove(final T object) {
this.pool.remove(this.check(object));
}
public Collection<T> toCollection() {
return this.pool.toCollection();
}
@Override
public String toString() {
return this.pool.toString();
}
}
static <T> Pool<T> safe(final Pool<T> pool, final Class<T> type) {
return new SafePool<>(pool, type);
}
static void setObjectPoolFactory(final PoolFactory factory) {
objectPoolFactory = checkNotNull(factory);
}
static void setListenerPoolFactory(final PoolFactory factory) {
listenerPoolFactory = checkNotNull(factory);
}
static PoolFactory getObjectPoolFactory() {
return objectPoolFactory;
}
static PoolFactory getListenerPoolFactory() {
return listenerPoolFactory;
}
}