package com.squareup.otto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import info.nightscout.androidaps.events.Event; /** Logs events has they're being posted to and dispatched from the event bus. * * A summary of references between sender and event and event and receiver is printed * after 10s (after startup) and then again every 60s. * */ public class LoggingBus extends Bus { private static Logger log = LoggerFactory.getLogger(LoggingBus.class); private static long everyMinute = System.currentTimeMillis() + 10 * 1000; private Map> event2Receiver = new HashMap<>(); public LoggingBus(ThreadEnforcer enforcer) { super(enforcer); } @Override public void post(Object event) { if (event instanceof DeadEvent) { log.debug("Event has no receiver: " + ((DeadEvent) event).event + ", source: " + ((DeadEvent) event).source); return; } if (!(event instanceof Event)) { log.error("Posted event not an event class: " + event.getClass()); } log.debug("<<< " + event); try { StackTraceElement caller = new Throwable().getStackTrace()[1]; String className = caller.getClassName(); className = className.substring(className.lastIndexOf(".") + 1); log.debug(" source: " + className + "." + caller.getMethodName() + ":" + caller.getLineNumber()); } catch (RuntimeException e) { log.debug(" source: "); } super.post(event); } @Override protected void dispatch(Object event, EventHandler wrapper) { try { log.debug(">>> " + event); Field methodField = wrapper.getClass().getDeclaredField("method"); methodField.setAccessible(true); Method targcetMethod = (Method) methodField.get(wrapper); String className = targcetMethod.getDeclaringClass().getSimpleName(); String methodName = targcetMethod.getName(); String receiverMethod = className + "." + methodName; log.debug(" receiver: " + receiverMethod); String key = event.getClass().getSimpleName(); if (!event2Receiver.containsKey(key)) event2Receiver.put(key, new HashSet()); event2Receiver.get(key).add(receiverMethod); } catch (ReflectiveOperationException e) { log.debug(" receiver: "); } if (everyMinute < System.currentTimeMillis()) { log.debug("***************** The story so far ****************"); for (Map.Entry> stringSetEntry : event2Receiver.entrySet()) { log.debug(" " + stringSetEntry.getKey()); for (String s : stringSetEntry.getValue()) { log.debug(" -> " + s); } } log.debug("***************************************************"); everyMinute = System.currentTimeMillis() + 60 * 1000; } super.dispatch(event, wrapper); } }