package sk.stuba.fiit.perconik.core.debug.services.listeners; import java.util.Set; import sk.stuba.fiit.perconik.core.Listener; import sk.stuba.fiit.perconik.core.debug.Debug; import sk.stuba.fiit.perconik.core.debug.DebugListeners; import sk.stuba.fiit.perconik.core.debug.DebugNameableProxy; import sk.stuba.fiit.perconik.core.debug.runtime.DebugConsole; import sk.stuba.fiit.perconik.core.services.listeners.ListenerProvider; import static com.google.common.base.Preconditions.checkNotNull; public final class DebugListenerProviderProxy extends DebugNameableProxy implements DebugListenerProvider { private final ListenerProvider provider; private DebugListenerProviderProxy(final ListenerProvider provider, final DebugConsole console) { super(console); this.provider = checkNotNull(provider); } public static DebugListenerProviderProxy wrap(final ListenerProvider provider) { return wrap(provider, Debug.getDefaultConsole()); } public static DebugListenerProviderProxy wrap(final ListenerProvider provider, final DebugConsole console) { if (provider instanceof DebugListenerProviderProxy) { return (DebugListenerProviderProxy) provider; } return new DebugListenerProviderProxy(provider, console); } public static ListenerProvider unwrap(final ListenerProvider provider) { if (provider instanceof DebugListenerProviderProxy) { return ((DebugListenerProviderProxy) provider).delegate(); } return provider; } @Override public ListenerProvider delegate() { return this.provider; } public <L extends Listener> L forClass(final Class<L> type) { this.put("Requesting listener for class %s ... ", DebugListeners.toString(type)); L listener = this.delegate().forClass(type); this.print(listener != null ? "done" : "failed"); return listener; } public Class<? extends Listener> loadClass(final String name) throws ClassNotFoundException { return this.delegate().loadClass(name); } public Set<Class<? extends Listener>> classes() { return this.delegate().classes(); } public ListenerProvider parent() { return this.delegate().parent(); } }