package edu.uw.zookeeper.common; import net.engio.mbassy.bus.BusRuntime; import net.engio.mbassy.bus.common.PubSubSupport; import org.apache.logging.log4j.Logger; import com.google.common.collect.ImmutableList; public class LoggingPublisher<T> implements PubSubSupport<T>, Reference<PubSubSupport<T>> { public static <T>LoggingPublisher<T> create( Logger logger, PubSubSupport<T> delegate, Object...params) { return new LoggingPublisher<T>(logger, delegate, params); } private final Logger logger; private final PubSubSupport<T> delegate; private final Object[] params; public LoggingPublisher(Logger logger, PubSubSupport<T> delegate, Object...params) { this.logger = logger; this.delegate = delegate; this.params = params; } public Logger getLogger() { return logger; } public ImmutableList<Object> getParams() { return ImmutableList.copyOf(params); } @Override public PubSubSupport<T> get() { return delegate; } @Override public void subscribe(Object listener) { delegate.subscribe(listener); } @Override public boolean unsubscribe(Object listener) { return delegate.unsubscribe(listener); } @Override public void publish(T event) { if (logger.isTraceEnabled()) { int nparams = this.params.length + 1; Object[] params = new Object[nparams]; params[0] = event; for (int i=1; i<nparams; ++i) { params[i] = this.params[i-1]; } logger.entry(params); } delegate.publish(event); if (logger.isTraceEnabled()) { logger.exit(); } } @Override public BusRuntime getRuntime() { return delegate.getRuntime(); } @Override public String toString() { return delegate.toString(); } }