package at.ac.tuwien.iter.modules;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.InjectService;
import org.apache.tapestry5.ioc.annotations.ServiceId;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.services.SymbolProvider;
import org.apache.tapestry5.ioc.services.TypeCoercer;
import org.gambi.tapestry5.cli.annotations.CLIOption;
import org.slf4j.Logger;
import at.ac.tuwien.iter.loadgenerators.ConstantLoadGenerator;
import at.ac.tuwien.iter.loadgenerators.SawToothLoadGenerator;
import at.ac.tuwien.iter.loadgenerators.SinusLoadGenerator;
import at.ac.tuwien.iter.loadgenerators.SquareLoadGenerator;
import at.ac.tuwien.iter.loadgenerators.TriangleLoadGenerator;
import at.ac.tuwien.iter.services.LoadGenerator;
import at.ac.tuwien.iter.services.LoadGeneratorSource;
import at.ac.tuwien.iter.services.impl.RuntimeSymbolProvider;
import at.ac.tuwien.iter.services.impl.loadgenerators.InputSampler;
import at.ac.tuwien.iter.services.impl.loadgenerators.LatinHypercubeInputSampler;
import at.ac.tuwien.iter.services.impl.loadgenerators.LoadGeneratorSourceImpl;
import at.ac.tuwien.iter.services.impl.loadgenerators.RandomInputSampler;
import at.ac.tuwien.iter.utils.IterSymbolsNames;
/**
* The load generator module contains the tapestry-ioc managed classes that
* define the bindings to the trace generator web service
*
* This module is a SubModule of {@link IterModule}
*
* @author alessiogambi
*
*/
public class LoadGeneratorModule {
public static final String DURATION_IN_SEC = "at.ac.tuwien.iter.experiment.duration";
public static void contributeFactoryDefaults(
MappedConfiguration<String, Object> configuration) {
configuration.add(LoadGeneratorModule.DURATION_IN_SEC, "300");
}
/**
* Load generator need some user configurations. We specify them as
* contributions to the CLIParser that is the service that interprets the
* command line, validates the input, and offers the input values to the
* other objects managed by tapestry-ioc
*
* We define an option (-l, --load-generator-name) to let the user specify
* her preference about the service to create.
*
* @param configuration
*
* @category UserContribution CLIParser
*/
public void contributeCLIParser(
Configuration<org.gambi.tapestry5.cli.data.CLIOption> configuration) {
org.gambi.tapestry5.cli.data.CLIOption loadGeneratorName = new org.gambi.tapestry5.cli.data.CLIOption(
"l", "load-generator-name", 1, false,
"Symbolic name of the load generator.");
// This can be a plain symbol as well;
loadGeneratorName.setDefaultValue("sine-lhs");
configuration.add(loadGeneratorName);
}
/**
* Build the LoadGeneratorSource service that contains and instantiate the
* LoadGenerator classes
*
* @param logger
* @param configurations
* @return
*
* @category Build LoadGeneratorSource
*/
public static LoadGeneratorSource build(Logger logger,
Map<String, LoadGenerator> configurations) {
return new LoadGeneratorSourceImpl(logger, configurations);
}
/*
* TODO Not sure this is ok !
*/
public void contributeSymbolSource(
@InjectService("LoadGeneratorSymbolProvider") SymbolProvider symbolProvider,
OrderedConfiguration<SymbolProvider> configuration) {
configuration.add("LoadGeneratorRuntimeValues", symbolProvider);
}
/*
* TODO Not sure this is ok !
*/
public RuntimeSymbolProvider buildLoadGeneratorSymbolProvider() {
RuntimeSymbolProvider loadGeneratorRuntimeValues = new RuntimeSymbolProvider() {
Map<String, String> symbols = new HashMap<String, String>();
public String valueForSymbol(String symbolName) {
return symbols.get(symbolName);
}
public void addSymbols(Map<String, String> arg0) {
symbols.putAll(arg0);
}
};
return loadGeneratorRuntimeValues;
}
@ServiceId("CommandLineLoadGenerator")
public LoadGenerator buildCLILoadGenerator(
/*
* TODO Not sure this is ok !
*/
@InjectService("LoadGeneratorSymbolProvider") RuntimeSymbolProvider symbolProvider,
LoadGeneratorSource loadGeneratorSource,
@CLIOption(longName = "load-generator-name") String loadGeneratorId) {
LoadGenerator loadGenerator = loadGeneratorSource
.getLoadGenerator(loadGeneratorId);
Map<String, String> loadGeneratorSymbols = new HashMap<String, String>();
loadGeneratorSymbols.put(IterSymbolsNames.LB,
Arrays.toString(loadGenerator.getLowerBounds()));
loadGeneratorSymbols.put(IterSymbolsNames.UB,
Arrays.toString(loadGenerator.getUpperBounds()));
symbolProvider.addSymbols(loadGeneratorSymbols);
return loadGenerator;
}
public LoadGenerator buildRandomSinusLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SinusLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(SinusLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(SinusLoadGenerator.FREQUENCY_LB) double frequencyLB,
@Symbol(SinusLoadGenerator.FREQUENCY_UB) double frequencyUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration
) {
InputSampler randomSampler = new RandomInputSampler();
return new SinusLoadGenerator(logger, "RandomSinusLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, amplitudeLB, amplitudeUB, frequencyLB,
frequencyUB, nBins, randomSampler, duration);
}
public LoadGenerator buildLHSSinusLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
// I do not like this approach... This is dependend on the Input
// args ...Options
// So make it dependent on them !!
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SinusLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(SinusLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(SinusLoadGenerator.FREQUENCY_LB) double frequencyLB,
@Symbol(SinusLoadGenerator.FREQUENCY_UB) double frequencyUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler lhsSampler = new LatinHypercubeInputSampler();
return new SinusLoadGenerator(logger, "LHSSinusLoadGenerator", coercer,
traceGeneratorWebService, jmeterClientsURL, manifestURL,
amplitudeLB, amplitudeUB, frequencyLB, frequencyUB, nBins,
lhsSampler, duration);
}
public LoadGenerator buildRandomTriangleLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(TriangleLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(TriangleLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(TriangleLoadGenerator.PERIOD_LB) double periodLB,
@Symbol(TriangleLoadGenerator.PERIOD_UB) double periodUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler randomSampler = new RandomInputSampler();
return new TriangleLoadGenerator(logger, "RandomTriangleLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, amplitudeLB, amplitudeUB, periodLB, periodUB,
nBins, randomSampler, duration);
}
public LoadGenerator buildLHSTriangleLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(TriangleLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(TriangleLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(TriangleLoadGenerator.PERIOD_LB) double periodLB,
@Symbol(TriangleLoadGenerator.PERIOD_UB) double periodUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler lhsSampler = new LatinHypercubeInputSampler();
return new TriangleLoadGenerator(logger, "LHSTriangleLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, amplitudeLB, amplitudeUB, periodLB, periodUB,
nBins, lhsSampler, duration);
}
public LoadGenerator buildRandomSawToothLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SawToothLoadGenerator.STEP_LB) double stepLB,
@Symbol(SawToothLoadGenerator.STEP_UB) double stepUB,
@Symbol(SawToothLoadGenerator.PERIOD_LB) double periodLB,
@Symbol(SawToothLoadGenerator.PERIOD_UB) double periodUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler randomSampler = new RandomInputSampler();
return new SawToothLoadGenerator(logger, "RandomSawToothLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, stepLB, stepUB, periodLB, periodUB, nBins,
randomSampler, duration);
}
public LoadGenerator buildLHSSawToothLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SawToothLoadGenerator.STEP_LB) double stepLB,
@Symbol(SawToothLoadGenerator.STEP_UB) double stepUB,
@Symbol(SawToothLoadGenerator.PERIOD_LB) double periodLB,
@Symbol(SawToothLoadGenerator.PERIOD_UB) double periodUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler lhsSampler = new LatinHypercubeInputSampler();
return new SawToothLoadGenerator(logger, "LHSSawToothLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, stepLB, stepUB, periodLB, periodUB, nBins,
lhsSampler, duration);
}
public LoadGenerator buildRandomSquareLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SquareLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(SquareLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(SquareLoadGenerator.FREQUENCY_LB) double frequencyLB,
@Symbol(SquareLoadGenerator.FREQUENCY_UB) double frequencyUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler randomSampler = new RandomInputSampler();
return new SquareLoadGenerator(logger, "RandomSquareLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, amplitudeLB, amplitudeUB, frequencyLB,
frequencyUB, nBins, randomSampler, duration);
}
public LoadGenerator buildLHSSquareLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(SquareLoadGenerator.AMPLITUDE_LB) double amplitudeLB,
@Symbol(SquareLoadGenerator.AMPLITUDE_UB) double amplitudeUB,
@Symbol(SquareLoadGenerator.FREQUENCY_LB) double frequencyLB,
@Symbol(SquareLoadGenerator.FREQUENCY_UB) double frequencyUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler lhsSampler = new LatinHypercubeInputSampler();
return new SquareLoadGenerator(logger, "LHSSquareLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, amplitudeLB, amplitudeUB, frequencyLB,
frequencyUB, nBins, lhsSampler, duration);
}
public LoadGenerator buildRandomConstantLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(ConstantLoadGenerator.INTENSITY_LB) double intensityLB,
@Symbol(ConstantLoadGenerator.INTENSITY_UB) double intensityUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler randomSampler = new RandomInputSampler();
return new ConstantLoadGenerator(logger, "RandomConstantLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, intensityLB, intensityUB, nBins, randomSampler,
duration);
}
public LoadGenerator buildLHSConstantLoadGenerator(
Logger logger,
TypeCoercer coercer,
@Symbol(IterSymbolsNames.TRACEGENERATOR_URL) String traceGeneratorWebService,
@CLIOption(longName = "jmeter-clients-URL") String jmeterClientsURL,
@CLIOption(longName = "service-manifest-URL") String manifestURL,
@Symbol(IterSymbolsNames.N_BINS) int nBins,
@Symbol(ConstantLoadGenerator.INTENSITY_LB) double intensityLB,
@Symbol(ConstantLoadGenerator.INTENSITY_UB) double intensityUB,
@Symbol(LoadGeneratorModule.DURATION_IN_SEC) int duration) {
InputSampler lhsSampler = new LatinHypercubeInputSampler();
return new ConstantLoadGenerator(logger, "LHSConstantLoadGenerator",
coercer, traceGeneratorWebService, jmeterClientsURL,
manifestURL, intensityLB, intensityUB, nBins, lhsSampler,
duration);
}
@Contribute(LoadGeneratorSource.class)
public static void addLoadGenerators(
TypeCoercer coercer,
@InjectService("RandomSinusLoadGenerator") LoadGenerator randomSine,
@InjectService("LHSSinusLoadGenerator") LoadGenerator lhsSine,
@InjectService("RandomTriangleLoadGenerator") LoadGenerator randomTriangle,
@InjectService("LHSTriangleLoadGenerator") LoadGenerator lhsTriangle,
@InjectService("RandomSawToothLoadGenerator") LoadGenerator randomSawTooth,
@InjectService("LHSSawToothLoadGenerator") LoadGenerator lhsSawTooth,
@InjectService("RandomSquareLoadGenerator") LoadGenerator randomSquare,
@InjectService("LHSSquareLoadGenerator") LoadGenerator lhsSquare,
@InjectService("RandomConstantLoadGenerator") LoadGenerator randomConstant,
@InjectService("LHSConstantLoadGenerator") LoadGenerator lhsConstant,
MappedConfiguration<String, LoadGenerator> configuration) {
configuration.add("sine", randomSine);
configuration.add("sine-rand", randomSine);
configuration.add("sine-lhs", lhsSine);
configuration.add("triangle", randomTriangle);
configuration.add("triangle-rand", randomTriangle);
configuration.add("triangle-lhs", lhsTriangle);
configuration.add("sawtooth", randomSawTooth);
configuration.add("sawtooth-rand", randomSawTooth);
configuration.add("sawtooth-lhs", lhsSawTooth);
configuration.add("square", randomSquare);
configuration.add("square-rand", randomSquare);
configuration.add("square-lhs", lhsSquare);
configuration.add("constant", randomConstant);
configuration.add("constant-rand", randomConstant);
configuration.add("constant-lhs", lhsConstant);
}
}