package dials;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedActor;
import dials.messages.*;
import dials.model.FeatureModel;
import dials.model.FilterModel;
import java.util.Set;
public class DialsFacilitator extends UntypedActor {
private ActorRef requester;
private boolean finalized;
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof ContextualMessage && !((ContextualMessage) message).isAbandoned()) {
if (message instanceof FeatureStateRequestMessage) {
handleFeatureStateRequestMessage((FeatureStateRequestMessage) message);
} else if (message instanceof FilterRetrievalResultMessage) {
handleFilterRetrievalResultMessage((FilterRetrievalResultMessage) message);
} else if (message instanceof FilterDispatchResultMessage) {
handleFilterDispatchResultMessage((FilterDispatchResultMessage) message);
} else if (message instanceof AbandonMessage) {
abandon((ContextualMessage) message);
}
}
}
private void handleFeatureStateRequestMessage(FeatureStateRequestMessage message) {
requester = sender();
FeatureModel feature = message.getConfiguration().getRepository().getFeature(message.getExecutionContext().getFeatureName());
Set<FilterModel> filters = feature.getFilters();
if (filters == null || filters.isEmpty()) {
respondToSystem(true, message);
}
context().actorOf(Props.create(FilterRetriever.class)).tell(
new FilterRetrievalRequestMessage(message), self()
);
}
private void handleFilterRetrievalResultMessage(FilterRetrievalResultMessage message) {
if (message.getFilters().size() == 0) {
respondToSystem(true, message);
return;
}
context().actorOf(Props.create(FilterDispatcher.class, message.getConfiguration().isFailFastEnabled()))
.tell(new FilterDispatchRequestMessage(message), self());
}
private void handleFilterDispatchResultMessage(FilterDispatchResultMessage message) {
respondToSystem(message.getResult(), message);
}
private void abandon(ContextualMessage message) {
message.registerAbandonment();
respondToSystem(false, message);
}
private void respondToSystem(boolean state, ContextualMessage message) {
finalizeExecution(state, message);
requester.tell(new FeatureStateResultMessage(state), self());
}
private void finalizeExecution(boolean state, ContextualMessage message) {
if (!finalized) {
message.getExecutionContext().addExecutionStep("Feature State Request Complete")
.addExecutionStep("Final Result - " + (state ? "Success" : "Failed"));
message.getExecutionContext().setExecuted(state);
message.registerFeatureAttempt(message.getExecutionContext().getFeatureName(), state);
context().system().actorSelection("/user/ExecutionRegistry").tell(new ContextualMessage(message), self());
finalized = true;
}
}
}