Skip to content

Instantly share code, notes, and snippets.

@emil10001
Created May 19, 2014 15:12
Show Gist options
  • Save emil10001/027fa3b3693db7cc10e0 to your computer and use it in GitHub Desktop.
Save emil10001/027fa3b3693db7cc10e0 to your computer and use it in GitHub Desktop.
Witness library for Java.
package com.feigdev.witness;
/**
* Created by ejf3 on 5/10/14.
*/
public interface Reporter {
public void notifyEvent(Object o);
}
package com.feigdev.witness;
import java.util.concurrent.*;
/**
* The witness is what
*/
public class Witness {
private static ConcurrentMap<Class<?>, ConcurrentMap<Reporter, String>> events
= new ConcurrentHashMap<Class<?>, ConcurrentMap<Reporter, String>>();
private static BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
private static ExecutorService executorService = new ThreadPoolExecutor(1, 10, 30, TimeUnit.SECONDS, queue);
public static void register(Class<?> event, Reporter reporter) {
if (null == event || null == reporter)
return;
events.putIfAbsent(event, new ConcurrentHashMap<Reporter, String>());
events.get(event).putIfAbsent(reporter, "");
}
public static void remove(Class<?> event, Reporter reporter) {
if (null == event || null == reporter)
return;
if (!events.containsKey(event))
return;
events.get(event).remove(reporter);
}
public static void notify(final Object event) {
if (null == event)
return;
if (!events.containsKey(event.getClass()))
return;
for (final Reporter m : events.get(event.getClass()).keySet()) {
executorService.execute(new Runnable() {
@Override
public void run() {
m.notifyEvent(event);
}
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment