package dials; import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.UntypedActor; import dials.dial.Dialable; import dials.filter.DynamicDataFilter; import dials.filter.FilterData; import dials.filter.StaticDataFilter; import dials.messages.*; import dials.model.FeatureModel; import dials.model.FilterModel; import dials.model.FilterStaticDataModel; import java.util.Set; public class FilterRetriever extends UntypedActor { @Override public void onReceive(Object message) throws Exception { if (message instanceof ContextualMessage && !((ContextualMessage) message).isAbandoned()) { if (message instanceof FilterRetrievalRequestMessage) { handleFilterRetrievalRequestMessage((FilterRetrievalRequestMessage) message); } } } private void handleFilterRetrievalRequestMessage(FilterRetrievalRequestMessage message) { sender().tell(buildResultMessage(message), self()); } private FilterRetrievalResultMessage buildResultMessage(FilterRetrievalRequestMessage message) { FeatureModel feature = message.getConfiguration().getRepository() .getFeature(message.getExecutionContext().getFeatureName()); Set<FilterModel> filters = feature.getFilters(); FilterRetrievalResultMessage resultMessage = new FilterRetrievalResultMessage(message); for (FilterModel filter : filters) { FilterData staticData = new FilterData(); for (FilterStaticDataModel staticDataModel : filter.getStaticData()) { staticData.addDataObject(staticDataModel.getDataKey(), staticDataModel.getDataValue()); } Class filterClass = getClassForFilter(resultMessage, filter.getFilterName()); if (filterClass != null) { resultMessage.getExecutionContext().addExecutionStep("Detected Filter - " + filterClass.getSimpleName()); configureFilter(message, resultMessage, filter, staticData, filterClass); } else { resultMessage.getExecutionContext().addExecutionStep("Detected Unknown Filter - " + filter.getFilterName()); } } return resultMessage; } private void configureFilter(FilterRetrievalRequestMessage message, FilterRetrievalResultMessage resultMessage, FilterModel filter, FilterData staticData, Class filterClass) { ActorRef filterActor = context().actorOf(Props.create(filterClass)); if (StaticDataFilter.class.isAssignableFrom(filterClass)) { filterActor.tell(new StaticDataFilterApplicationMessage(staticData, resultMessage), self()); } if (DynamicDataFilter.class.isAssignableFrom(filterClass)) { filterActor.tell(new DynamicDataFilterApplicationMessage(message.getDynamicData(), resultMessage), self()); } if (Dialable.class.isAssignableFrom(filterClass)) { if (filter.getDial() != null) { filterActor.tell(new DialableFilterApplicationMessage(message, filter.getFilterName()), self()); } } resultMessage.addFilter(filterActor); } private Class getClassForFilter(ContextualMessage message, String filterName) { return message.getConfiguration().getAvailableFeatureFilters().get(filterName.toLowerCase()); } }