package org.robotninjas.riemann.pubsub; import com.google.common.base.Optional; import com.google.common.collect.Lists; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.Channel; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; public class RiemannPubSubConnection implements QueryResultListener { private final CopyOnWriteArrayList<QueryResultListener> listeners; private final Executor resultExecutor; private final ClientBootstrap bootstrap; private Optional<Channel> channel = Optional.absent(); public RiemannPubSubConnection(Executor resultExecutor, QueryResultListener listener, ClientBootstrap bootstrap) { this.listeners = Lists.newCopyOnWriteArrayList(); this.resultExecutor = resultExecutor; this.bootstrap = bootstrap; addQueryListener(listener); } public void init(Channel channel) { this.channel = Optional.of(channel); } @Override public void handleResult(final String result) { resultExecutor.execute(new Runnable() { @Override public void run() { for (QueryResultListener listener : listeners) { listener.handleResult(result); } } }); } public void addQueryListener(QueryResultListener listener) { listeners.add(listener); } public void removeQueryListener(QueryResultListener listener) { listeners.remove(listener); } public void close() throws InterruptedException { try { if (channel.isPresent()) { channel.get().close().await(); } } finally { bootstrap.releaseExternalResources(); } } }