package dials; import akka.actor.ActorRef; import akka.actor.UntypedActor; import dials.messages.*; public class FilterDispatcher extends UntypedActor { private int filterCount; private int responseCount; private boolean failFast; private boolean failed; private boolean resultSent; public FilterDispatcher(boolean failFast) { filterCount = 0; responseCount = 0; this.failFast = failFast; } @Override public void onReceive(Object message) throws Exception { if (message instanceof ContextualMessage && !((ContextualMessage) message).isAbandoned()) { if (message instanceof FilterDispatchRequestMessage) { handleFilterDispatchRequestMessage((FilterDispatchRequestMessage) message); } else if (message instanceof FilterResultMessage) { handleFilterResultMessage((FilterResultMessage) message); } } } private void handleFilterDispatchRequestMessage(FilterDispatchRequestMessage message) { filterCount = message.getFilters().size(); for (ActorRef filter : message.getFilters()) { filter.tell(new FilterRequestMessage(message), self()); } } private void handleFilterResultMessage(FilterResultMessage message) { failed |= !message.getResult(); if (!resultSent) { if (failed && failFast) { message.getExecutionContext().addExecutionStep("Filter Dispatcher Failed Fast"); sendResult(new FilterDispatchResultMessage(false, message)); } else { if (++responseCount == filterCount) { sendResult(new FilterDispatchResultMessage(!failed, message)); } } } } private void sendResult(FilterDispatchResultMessage message) { if (!resultSent) { context().actorSelection("..").tell(message, self()); resultSent = true; } } }