package at.ac.tuwien.iter.modules;
import java.io.File;
import java.util.List;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ScopeConstants;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.InjectService;
import org.apache.tapestry5.ioc.annotations.Scope;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.services.ChainBuilder;
import org.slf4j.Logger;
import at.ac.tuwien.iter.services.DataCollectionService;
import at.ac.tuwien.iter.services.impl.datacollector.ClientsResultsCollector;
import at.ac.tuwien.iter.services.impl.datacollector.ControllerResultsCollector;
import at.ac.tuwien.iter.services.impl.datacollector.DatabaseManagerService;
import at.ac.tuwien.iter.services.impl.datacollector.ServiceResultsCollector;
import at.ac.tuwien.iter.services.impl.datacollector.TransitionSequenceCollector;
import at.ac.tuwien.iter.utils.DataCollectionSymbolConstants;
/**
* The data collection module the tapestry-ioc managed classes that define the
* data collection framework
*
* This module is a sub-module of {@link IterModule}
*
* @author alessiogambi
*
*/
public class DataCollectionModule {
// TODO Improve testability by moving custom contributions inside a specific
// module
/*
* TODO List: at the moment we repeat several activities in a chain, some of
* them can be optimized by exploting the fact that services are invoked
* with a given order. For example, to store transitions and controller
* results we download the controller db twice, while we could have done it
* only once. Again we can put here the matlab stuff (inside some specific
* contribution) to invoke matlab and store the partial results.
*/
public void contributeApplicationDefaults(
MappedConfiguration<String, String> configuration) {
configuration.add(DataCollectionSymbolConstants.BASE_DIR, (new File(
"datacollection-experiment")).getAbsolutePath());
}
@Scope(ScopeConstants.PERTHREAD)
public static DataCollectionService build(
List<DataCollectionService> commands,
@InjectService("ChainBuilder") ChainBuilder chainBuilder) {
return chainBuilder.build(DataCollectionService.class, commands);
}
@Contribute(DataCollectionService.class)
public static void addDataCollectors(
OrderedConfiguration<DataCollectionService> configuration,
Logger logger, DatabaseManagerService databaseManagerService) {
// We do not care about order constraints for the moment
// USE AUTOBUILD - Note that Now the collector with all its' own logger
// and not the DataCollectionService one
configuration.addInstance("state-transitions",
TransitionSequenceCollector.class);
configuration.add("controller-results", new ControllerResultsCollector(
logger, databaseManagerService));
configuration.add("service-results", new ServiceResultsCollector(
logger, databaseManagerService));
configuration.add("clients-results", new ClientsResultsCollector(
logger, databaseManagerService));
}
public DatabaseManagerService build(Logger logger,
@Symbol(DataCollectionSymbolConstants.BASE_DIR) String _baseDir) {
// TODO Not sure why cannot use the typeCoercion
File baseDir = new File(_baseDir);
if (baseDir.isFile()) {
baseDir = baseDir.getParentFile();
}
return new DatabaseManagerService(logger, baseDir);
}
}