package org.ei.drishti.scheduler.router;
import org.motechproject.scheduler.domain.MotechEvent;
import org.motechproject.scheduletracking.api.events.constants.EventSubjects;
import org.motechproject.server.event.annotations.MotechListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class AlertRouter {
private List<Route> routes;
private static Logger logger = LoggerFactory.getLogger(AlertRouter.class.toString());
public AlertRouter() {
routes = new ArrayList<>();
}
public Route addRoute(Matcher scheduleMatcher, Matcher milestoneMatcher, Matcher windowMatcher, Action action) {
Route route = new Route(scheduleMatcher, milestoneMatcher, windowMatcher, action);
routes.add(route);
return route;
}
@MotechListener(subjects = {EventSubjects.MILESTONE_ALERT})
public void handle(MotechEvent realEvent) {
logger.info("Handling motech event : " + realEvent);
MilestoneEvent event = new MilestoneEvent(realEvent);
for (Route route : routes) {
if (route.isSatisfiedBy(event.scheduleName(), event.milestoneName(), event.windowName())) {
route.invokeAction(event);
return;
}
}
throw new NoRoutesMatchException(event);
}
}