package dials.filter; import akka.actor.UntypedActor; import dials.dial.Dialable; import dials.messages.*; public abstract class FeatureFilter extends UntypedActor { private boolean abandoned; @Override public void onReceive(Object message) throws Exception { if (message instanceof ContextualMessage && !((ContextualMessage) message).isAbandoned()) { if (message instanceof FilterRequestMessage) { FilterRequestMessage requestMessage = (FilterRequestMessage) message; if (!abandoned) { boolean passedFilter = filter(); requestMessage.getExecutionContext() .addExecutionStep((passedFilter ? "Passed Filter" : "Failed Filter") + " - " + getClass().getSimpleName()); sender().tell(new FilterResultMessage(passedFilter, requestMessage), self()); } } else if (message instanceof StaticDataFilterApplicationMessage) { if (this instanceof StaticDataFilter) { ((StaticDataFilter) this).applyStaticData((DataFilterApplicationMessage) message); } } else if (message instanceof DynamicDataFilterApplicationMessage) { if (this instanceof DynamicDataFilter) { ((DynamicDataFilter) this).applyDynamicData((DataFilterApplicationMessage) message); } } else if (message instanceof DialableFilterApplicationMessage) { if (this instanceof Dialable && !abandoned) { ((Dialable) this).dial((ContextualMessage) message, ((DialableFilterApplicationMessage) message).getFilterName()); } } } } protected void recordSuccessfulDataApply(ContextualMessage message, String dataName) { message.getExecutionContext().addExecutionStep("Filter " + getClass().getSimpleName() + " Successfully Applied Data - " + dataName); } protected void recordUnsuccessfulDataApply(ContextualMessage message, String dataName, boolean abandon, String errorMessage) { message.getExecutionContext().addExecutionStep(errorMessage); message.getExecutionContext().addExecutionStep("Filter " + getClass().getSimpleName() + " Failed To Apply Data - " + dataName); if (abandon) { abandon(message); } } protected void abandon(ContextualMessage message) { context().actorSelection("../../").tell(new AbandonMessage(message), self()); abandoned = true; } public abstract boolean filter(); //For testing purposes. public boolean getAbandoned() { return abandoned; } }