package org.radargun.config; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Comntains master's configuration elements. * * @author Mircea Markus <Mircea.Markus@jboss.com> */ public class MasterConfig { private byte[] masterConfigBytes; private byte[] scenarioBytes; private final int port; private final String host; private List<Cluster> clusters = new ArrayList<Cluster>(); private List<Configuration> configurations = new ArrayList<Configuration>(); private Map<String, Configuration.SetupBase> templates = new HashMap<>(); private Scenario scenario; private List<ReporterConfiguration> reporters = new ArrayList<ReporterConfiguration>(); public MasterConfig(int port, String host) { this.port = port; this.host = host; } public void addCluster(Cluster cluster) { clusters.add(cluster); } public void addConfig(Configuration config) { for (Configuration c : configurations) { if (c.name.equals(config.name)) throw new IllegalArgumentException("Cannot have two configurations named " + config.name); } configurations.add(config); } public void addTemplate(String name, String base, Map<String, Definition> propertyDefinitions, Map<String, Definition> vmArgs, Map<String, Definition> envs) { if (templates.put(name, new Configuration.SetupBase(base, vmArgs, propertyDefinitions, envs)) != null) { throw new IllegalArgumentException("The configuration already contains template '" + name + "'"); } } public void setScenario(Scenario scenario) { this.scenario = scenario; } public void addReporter(ReporterConfiguration reporter) { this.reporters.add(reporter); } public int getPort() { return port; } public String getHost() { return host; } public List<Cluster> getClusters() { return Collections.unmodifiableList(clusters); } public int getMaxClusterSize() { int max = 0; for (Cluster c : clusters) { max = Math.max(max, c.getSize()); } return max; } public List<Configuration> getConfigurations() { return Collections.unmodifiableList(configurations); } public Scenario getScenario() { return scenario; } public List<ReporterConfiguration> getReporters() { return Collections.unmodifiableList(reporters); } // this method is used from tests.sh public Set<String> getPlugins() { Set<String> plugins = new HashSet<>(); for (Configuration configuration : configurations) { for (Configuration.Setup setup : configuration.getSetups()) { plugins.add(setup.plugin); } } return plugins; } public void setMasterConfigBytes(byte[] configBytes) { this.masterConfigBytes = configBytes; } public byte[] getMasterConfigBytes() { return masterConfigBytes; } public void setScenarioBytes(byte[] scenarioBytes) { this.scenarioBytes = scenarioBytes; } public byte[] getScenarioBytes() { return scenarioBytes; } public void applyTemplates() { for (int i = 0; i < configurations.size(); i++) { Configuration configuration = configurations.get(i); Configuration newConfiguration = new Configuration(configuration.name); for (Configuration.Setup setup : configuration.getSetups()) { Configuration.Setup newSetup = setup.applyTemplates(templates); newConfiguration.addSetup(newSetup); } configurations.set(i, newConfiguration); } } }