package sk.stuba.fiit.perconik.core.services.listeners;
import java.util.Set;
import javax.annotation.Nullable;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.core.services.listeners.ListenerProvider.Builder;
import static java.util.Arrays.asList;
import static com.google.common.collect.Sets.newHashSet;
/**
* Static utility methods pertaining to {@link ListenerProvider} instances.
* Also see this class's counterparts {@link ListenerServices}
* and {@link ListenerManagers}.
*
* @author Pavol Zbell
* @since 1.0
*/
public final class ListenerProviders {
// TODO add javadocs
private ListenerProviders() {}
public static ListenerProvider superListenerProvider() {
return SuperListenerProvider.getInstance();
}
public static Builder builder() {
return StandardListenerProvider.builder();
}
public static Builder builder(@Nullable final ListenerProvider parent) {
Builder builder = builder();
if (parent != null) {
builder.parent(parent);
}
return builder;
}
public static ListenerClassesSupplier supplier(final ListenerProvider provider) {
return new ListenerClassesSupplier() {
public Set<Class<? extends Listener>> get() {
return provider.classes();
}
};
}
public static ListenerClassesSupplier merge(final ListenerClassesSupplier ... suppliers) {
return merge(asList(suppliers));
}
public static ListenerClassesSupplier merge(final Iterable<ListenerClassesSupplier> suppliers) {
return new ListenerClassesSupplier() {
public Set<Class<? extends Listener>> get() {
Set<Class<? extends Listener>> classes = newHashSet();
for (ListenerClassesSupplier supplier: suppliers) {
classes.addAll(supplier.get());
}
return classes;
}
};
}
}