package cz.senslog.analyzer.analysis; import cz.senslog.analyzer.analysis.module.FilterHandler; import cz.senslog.analyzer.analysis.module.HandlersModule; import cz.senslog.analyzer.analysis.module.ThresholdHandler; import cz.senslog.analyzer.core.EventBusModule; import cz.senslog.analyzer.core.api.BlockingHandler; import cz.senslog.analyzer.core.EventBus; import cz.senslog.analyzer.core.api.HandlerInvoker; import cz.senslog.analyzer.domain.DoubleStatistics; import cz.senslog.analyzer.domain.Observation; import cz.senslog.analyzer.persistence.repository.StatisticsRepository; import dagger.Module; import dagger.Provides; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.inject.Named; import java.util.List; import static cz.senslog.analyzer.core.api.HandlerInvoker.cancelInvoker; @Module(includes = { HandlersModule.class, EventBusModule.class }) public class AnalyzerModule { private static final Logger logger = LogManager.getLogger(AnalyzerModule.class); @Provides @Named("statisticsAnalyzer") Analyzer provideSimpleAnalyzer ( @Named("sensorFilterHandler") FilterHandler sensorFilterHandler, @Named("sensorThresholdHandler") ThresholdHandler sensorThresholdHandler, @Named("aggregationCollectorHandler") BlockingHandler aggregateCollectorHandler, @Named("groupThresholdHandler") ThresholdHandler groupThresholdHandler, EventBus eventBus ) { // filter & group mapping ===>> check sensor value ====>> aggregate by groups ====>> check group statistics HandlerInvoker groupThreshold = HandlerInvoker.create() .handler(groupThresholdHandler).nextHandlerInvoker(cancelInvoker()) .eventBus(eventBus).build(); HandlerInvoker aggregateCollector = HandlerInvoker.create() .blockingHandler(aggregateCollectorHandler, eventBus::save) .nextHandlerInvoker(groupThreshold) .eventBus(eventBus).build(); HandlerInvoker sensorThreshold = HandlerInvoker.create() .handler(sensorThresholdHandler).nextHandlerInvoker(aggregateCollector) .eventBus(eventBus).build(); HandlerInvoker sensorFilter = HandlerInvoker.create() .handler(sensorFilterHandler).nextHandlerInvoker(sensorThreshold) .eventBus(eventBus).build(); return new ObservationAnalyzer(sensorFilter); } }