package sk.stuba.fiit.perconik.core.debug;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import com.google.common.collect.Multimap;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.core.Listeners;
import sk.stuba.fiit.perconik.core.Resource;
import sk.stuba.fiit.perconik.core.debug.runtime.DebugConsole;
import sk.stuba.fiit.perconik.utilities.MoreStrings;
import sk.stuba.fiit.perconik.utilities.SmartStringBuilder;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newTreeSet;
public final class DebugListeners {
private DebugListeners() {}
public static String toString(final Class<? extends Listener> type) {
return type.getName();
}
public static String toString(final Listener listener) {
return MoreStrings.toStringFallback(listener);
}
public static void printRegistered() {
printRegistered(Listener.class);
}
public static void printRegistered(final Class<? extends Listener> type) {
printRegistered(type, Debug.getDefaultConsole());
}
public static void printRegistered(final Class<? extends Listener> type, final DebugConsole console) {
console.put(dumpRegistered(type));
}
public static void printRegistrations() {
printRegisterations(Debug.getDefaultConsole());
}
public static void printRegisterations(final DebugConsole console) {
console.put(dumpRegistrations());
}
static String dumpRegistered(final Class<? extends Listener> type) {
SmartStringBuilder builder = new SmartStringBuilder();
builder.appendln("Registered listeners:").tab();
List<? extends Listener> listeners = newArrayList(Listeners.registered(type));
if (!listeners.isEmpty()) {
Collections.sort(listeners, MoreStrings.toStringComparator());
for (Listener listener: listeners) {
builder.appendln(toString(listener));
}
} else {
builder.appendln("none");
}
return builder.toString();
}
static String dumpRegistrations() {
SmartStringBuilder builder = new SmartStringBuilder();
builder.appendln("Registered resource to listeners map:").tab();
Multimap<Resource<?>, Listener> map = Listeners.registrations();
SortedSet<Resource<?>> resources = newTreeSet(MoreStrings.toStringComparator());
resources.addAll(map.keySet());
if (!map.isEmpty()) {
for (Resource<?> resource: resources) {
builder.appendln(DebugResources.toString(resource)).tab();
List<Listener> listeners = newArrayList(map.get(resource));
if (!listeners.isEmpty()) {
Collections.sort(listeners, MoreStrings.toStringComparator());
for (Listener listener: listeners) {
builder.appendln(toString(listener));
}
} else {
builder.appendln("none");
}
builder.untab();
}
} else {
builder.appendln("none");
}
return builder.toString();
}
}