package com.gzsll.hupu.components.jockeyjs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Composes a group of JockeyHandlers into a single structure, <br>
* When perform is invoked on this handler it will invoke it on all of the handlers.<br>
* They will be invoked in FIFO order, however if any are asynchronous, no guarantees can be made
* for
* execution order.
* <p/>
* To maintain a single callback invariant, this handler will accumulate <br>
* all the "complete" calls from the internal handlers.
* <br><br>
* Once all of the handlers have been called it this handler will signal completion.
*
* @author Paul
*/
public class CompositeJockeyHandler extends JockeyHandler {
/**
* Accumulates all the "completed" calls from the contained Handlers
* Once all the handlers have completed this will signal completion
*
* @author Paul
*/
private class AccumulatingListener implements OnCompletedListener {
private int _size;
private int _accumulated;
private AccumulatingListener() {
this._size = _handlers.size();
this._accumulated = 0;
}
@Override
public void onCompleted() {
++_accumulated;
if (_accumulated >= _size) completed(_listener);
}
}
private OnCompletedListener _listener;
private List<JockeyHandler> _handlers = new ArrayList<JockeyHandler>();
private OnCompletedListener _accumulator;
public CompositeJockeyHandler(JockeyHandler... handlers) {
add(handlers);
}
public void add(JockeyHandler... handler) {
_handlers.addAll(Arrays.asList(handler));
}
public void clear(JockeyHandler handler) {
_handlers.clear();
}
@Override
public void perform(Map<Object, Object> payload, OnCompletedListener listener) {
this._listener = listener;
this._accumulator = new AccumulatingListener();
doPerform(payload);
}
@Override
protected void doPerform(Map<Object, Object> payload) {
for (JockeyHandler handler : _handlers)
handler.perform(payload, this._accumulator);
}
public static JockeyHandler compose(JockeyHandler... handlers) {
return new CompositeJockeyHandler(handlers);
}
}