Skip to content

Instantly share code, notes, and snippets.

@indrekj
Created December 27, 2013 12:01
Show Gist options
  • Select an option

  • Save indrekj/8146146 to your computer and use it in GitHub Desktop.

Select an option

Save indrekj/8146146 to your computer and use it in GitHub Desktop.
import java.util.ArrayList;
import java.util.List;
public class HandlerChain<IN, OUT> {
private List<Handler<?, ?>> handlers = new ArrayList<Handler<?, ?>>();
private HandlerChain() {
}
private static <IN, OUT> HandlerChain<IN, OUT> create() {
return new HandlerChain<IN, OUT>();
}
public static <IN, OUT> HandlerChain<IN, OUT> create(Handler<IN, OUT> h) {
HandlerChain<IN, OUT> hc = create();
hc.handlers.add(h);
return hc;
}
private static <IN, T, OUT> HandlerChain<IN, OUT> create(HandlerChain<IN, T> hc, Handler<T, OUT> h) {
HandlerChain<IN, OUT> result = new HandlerChain<IN, OUT>();
result.handlers.addAll(hc.handlers);
result.handlers.add(h);
return result;
}
public <T> HandlerChain<IN, T> add(Handler<OUT, T> h) {
return create(this, h);
}
public OUT process(IN in) {
Object o = in;
for (Handler<?, ?> h : handlers) {
o = handle(h, o);
}
return cast(o);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private Object handle(Handler h, Object in) {
return h.handle(in);
}
@SuppressWarnings("unchecked")
private <T> T cast(Object o) {
return (T) o;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment