package sk.stuba.fiit.perconik.core.resources;
import java.util.Collection;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.core.Resource;
import sk.stuba.fiit.perconik.core.annotations.Unsupported;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
class StandardResource<L extends Listener> extends AbstractResource<L> {
final Pool<L> pool;
StandardResource(final Pool<L> pool) {
super(pool.toString().replaceFirst("Pool\\z", "Resource"));
this.pool = pool;
}
static final <L extends Listener> Resource<L> newInstance(final Pool<L> pool, final boolean unsupported) {
return unsupported ? new UnsupportedResource<>(pool) : new StandardResource<>(pool);
}
public final void register(final L listener) {
this.pool.add(listener);
}
public final void unregister(final L listener) {
this.pool.remove(listener);
}
public final <U extends Listener> Collection<U> registered(final Class<U> type) {
Collection<L> listeners = this.pool.toCollection();
Collection<U> filtered = newArrayListWithCapacity(listeners.size());
for (L listener: listeners) {
if (type.isInstance(listener)) {
filtered.add(type.cast(listener));
}
}
return filtered;
}
public final boolean registered(final Listener listener) {
return this.pool.contains(listener);
}
}
@Unsupported
class UnsupportedResource<L extends Listener> extends StandardResource<L> {
UnsupportedResource(final Pool<L> pool) {
super(pool);
}
}