package simulator;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/**
* This aim of this class is to store all the configuration options passed to
* the program to steer its functionality.
* As a general contract of this class, all fields, that store a path name to a
* folder will always be terminated with {@link File#separator} string.
*
* @author Stanislaw Szczepanowski
*
*/
public class ConfigurationOptions {
/*
* =============================================================================================
* Constants describing the contents of the resource bundle file
* =============================================================================================
*/
/** The path to the resource description file */
public static final String RESOURCE_DESC_MODIFIER = "resdesc";
/** The create scenario mode of the simulation */
public static final String CREATE_SCENARIO_MODIFIER = "createscenario";
/** The path to the file with the tasks description */
public static final String CREATE_SCENARIO_TASK_DESC = CREATE_SCENARIO_MODIFIER
+ ".tasksdesc";
/** The path to the output folder for generated tasks */
public static final String CREATE_SCENARIO_OUTPUT_FOLDER = CREATE_SCENARIO_MODIFIER
+ ".outputfolder";
/** The name of the workload file */
public static final String CREATE_SCENARIO_WORKLOAD_FILE = CREATE_SCENARIO_MODIFIER
+ ".workloadfilename";
/**
* Shall the files in the output directory be overwritten, if the folder is
* not empty
*/
public static final String CREATE_SCENARIO_OVERWRITE_FILES_MODIFIER = CREATE_SCENARIO_MODIFIER
+ ".overwrite_files";
/** The read scenario mode of the simulation */
public static final String READ_SCENARIO_MODIFIER = "readscenario";
/** The input folder with generated tasks */
public static final String READ_SCENARIO_INPUT_FOLDER = READ_SCENARIO_MODIFIER
+ ".inputfolder";
/** The name of the workload file */
public static final String READ_SCENARIO_WORKLOAD_FILE = READ_SCENARIO_MODIFIER
+ ".workloadfilename";
/** The default name of a workload file */
public static final String DEFAULT_WORKLOAD_FILE_NAME = "workload.swf";
public static final String CREATE_XML_SUPPLEMENT_FILES = "createXMLSupplement";
public static final String CREATEDIAGRAMS = "creatediagrams";
public static final String CREATEDIAGRAMS_GANTT = CREATEDIAGRAMS +".gantt";
public static final String CREATEDIAGRAMS_TASKS = CREATEDIAGRAMS + ".tasks";
public static final String CREATEDIAGRAMS_TASKSWAITINGTIME = CREATEDIAGRAMS + ".taskswaitingtime";
public static final String CREATEDIAGRAMS_UTILIZATION = CREATEDIAGRAMS + ".resutilization";
public static final String CREATEDIAGRAMS_ENERGYUSAGE = CREATEDIAGRAMS + ".respowerusage";
public static final String CREATEDIAGRAMS_AIRFLOW = CREATEDIAGRAMS + ".resairflow";
public static final String CREATEDIAGRAMS_RESOURCES_SCALE = CREATEDIAGRAMS_UTILIZATION + ".scale";
public static final String CREATESTATISTICS = "createstatistics";
public static final String ACCUMULATED_RESOURCES_STATISTICS = CREATESTATISTICS + ".accumulatedresources";
public static final String EXTENDED_TASKS_STATISTICS = CREATESTATISTICS + ".extendedtasks";
public static final String JOBS_STATISTICS = CREATESTATISTICS + ".jobs";
public static final String SIMULATION_STATISTICS = CREATESTATISTICS + ".simulation";
/**
* The main output folders base name
*/
public static final String STATS_OUTPUT_SUBFOLDER_NAME = "stats.outputfolder";
public static final String USER_DN = "user.dn";
public static final String EXPERIMENT_ID = "experiment.id";
public static final String NUMBER_OF_SIMULATIONS = "numberofsimulations";
/**
* Suffix for create scenario output folder
*/
public String statsOutputSubfolderNameCreate = null;
/**
* Suffix for read scenario output folder
*/
public String statsOutputSubfolderNameRerad = null;
/* =============================================================================================== */
/**
* the xml file name with resource description (according to the
* HostParamSchema.xsd), e.g. simulator/schemas/ResourceDescription.xml
*/
public String resdescFileName = null;
/**
* a xml file name (according to the simulator.schemas.WorkloadSchema.xsd)
* with the description of jobs and tasks to be generated
*/
public String workloadDescFileName = null;
/**
* the path to the folder, to which the generated xml job descriptions are
* to be stored
*/
public String outputFolder = null;
/**
* the name of the .swf simulator.workload file into which the
* simulator.workload is to be written (it will be stored in the
* outputFolder folder)
*/
public String outputWorkloadFileName = DEFAULT_WORKLOAD_FILE_NAME;
/**
* the path to the folder where previously generated xml jobs descriptions
* are stored
*/
public String inputFolder = null;
public String inputTar = null;
/**
* the name of the .swf simulator.workload file in the inputFolder folder
*/
public String inputWorkloadFileName = DEFAULT_WORKLOAD_FILE_NAME;
/**
* Shows the mode of the simulator: true if it is the create scenario, false
* if it is the read scenario mode
*/
public boolean createScenario = false;
public boolean createXMLSupplement = false;
/**
* true if the outputFolder is not empty and shall be overwritten, false
* otherwise
*/
public boolean overwriteFiles = false;
/**
* The number of simulation runs that is to be performed. Default value is 1
.
*/
public int numberOfSimulations = 1; //default value
public boolean creatediagrams_gantt = false;
public boolean creatediagrams_tasks = false;
public boolean creatediagrams_taskswaitingtime = false;
public boolean creatediagrams_resutilization = false;
public boolean creatediagrams_respowerusage = false;
public boolean creatediagrams_resairflow = false;
public double creatediagrams_resources_scale = 1;
public boolean createjobsstatistics = true;
public boolean createsimulationstatistics = true;
public String [] resForEnergyChart;
public String [] resForAirFlowChart;
public String [] resForUtilizationChart;
/**
* An empty constructor.
*/
protected ConfigurationOptions() {
}
/**
* A static method used to read a resource bundle file and set all the
* fields in this class according to the contents of the file
*
* @param resBundleFileName
* the path to the resource bundle file that stores the
* configuration
* @return a ConfigurationOptions object with information set according to
* the properties file, null
if any exception occurs
*/
public static ConfigurationOptions getConfiguration(String resBundleFileName) {
ConfigurationOptions co = new ConfigurationOptions();
File resBundleFile = new File(resBundleFileName);
ResourceBundle bundle = null;
try {
bundle = new PropertyResourceBundle(new FileInputStream(resBundleFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
co.resdescFileName = bundle.getString(RESOURCE_DESC_MODIFIER);
try {
co.workloadDescFileName = bundle.getString(CREATE_SCENARIO_TASK_DESC);
co.outputFolder = getSeparatorTerminatedPath(bundle
.getString(CREATE_SCENARIO_OUTPUT_FOLDER));
File f = new File(co.outputFolder);
String parent = f.getParent();
// output folder will have the same parent as the task description
// file
if (parent == null) {
f = new File(co.workloadDescFileName);
parent = f.getParent();
co.outputFolder = new File(parent, co.outputFolder)
.getAbsolutePath();
co.outputFolder = getSeparatorTerminatedPath(co.outputFolder);
}
co.outputWorkloadFileName = bundle
.getString(CREATE_SCENARIO_WORKLOAD_FILE);
co.overwriteFiles = Boolean.valueOf(
bundle.getString(CREATE_SCENARIO_OVERWRITE_FILES_MODIFIER))
.booleanValue();
co.createScenario = true; // success
} catch (MissingResourceException e) {
co.createScenario = false; // do not create scenario
}
if (co.createScenario == false) {
// read scenario
try {
co.inputFolder = getSeparatorTerminatedPath(bundle
.getString(READ_SCENARIO_INPUT_FOLDER));
} catch (MissingResourceException e) {
co.inputFolder = null;
}
try {
co.inputWorkloadFileName = bundle
.getString(READ_SCENARIO_WORKLOAD_FILE);
} catch (MissingResourceException e){
co.inputWorkloadFileName = null;
}
}
try {
if(Boolean.parseBoolean(
bundle.getString(CREATE_XML_SUPPLEMENT_FILES)))
co.createXMLSupplement = true;
else
co.createXMLSupplement = false;
} catch (MissingResourceException e){
co.createXMLSupplement = false;
}
// create diagrams
boolean createDiagrams = true;
try {
createDiagrams = Boolean.valueOf(
bundle.getString(CREATEDIAGRAMS)).booleanValue();
} catch(MissingResourceException e){
createDiagrams = false;
}
try {
co.creatediagrams_gantt = Boolean.valueOf(
bundle.getString(CREATEDIAGRAMS_GANTT)).booleanValue();
} catch(MissingResourceException e){
co.creatediagrams_gantt = createDiagrams;
}
try {
co.resForUtilizationChart = bundle.getString(CREATEDIAGRAMS_UTILIZATION).split(";");
if(co.resForUtilizationChart.length > 0){
co.creatediagrams_resutilization = true;
}
} catch(MissingResourceException e){
co.creatediagrams_resutilization = createDiagrams;
}
try {
co.creatediagrams_resources_scale = Double.valueOf(
bundle.getString(CREATEDIAGRAMS_RESOURCES_SCALE)).doubleValue();
} catch(MissingResourceException e){
co.creatediagrams_resources_scale = -1;
}
try {
co.resForEnergyChart = bundle.getString(CREATEDIAGRAMS_ENERGYUSAGE).split(";");
if(co.resForEnergyChart.length > 0){
co.creatediagrams_respowerusage = true;
}
} catch(MissingResourceException e){
co.creatediagrams_respowerusage = createDiagrams;
}
try {
co.resForAirFlowChart = bundle.getString(CREATEDIAGRAMS_AIRFLOW).split(";");
if(co.resForAirFlowChart.length > 0){
co.creatediagrams_resairflow = true;
}
} catch(MissingResourceException e){
co.creatediagrams_resairflow = createDiagrams;
}
try {
co.creatediagrams_tasks = Boolean.valueOf(
bundle.getString(CREATEDIAGRAMS_TASKS)).booleanValue();
} catch(MissingResourceException e){
co.creatediagrams_tasks = createDiagrams;
}
try {
co.creatediagrams_taskswaitingtime = Boolean.valueOf(
bundle.getString(CREATEDIAGRAMS_TASKSWAITINGTIME)).booleanValue();
} catch(MissingResourceException e){
co.creatediagrams_taskswaitingtime = createDiagrams;
}
try {
co.statsOutputSubfolderNameCreate = bundle.getString(STATS_OUTPUT_SUBFOLDER_NAME);
co.statsOutputSubfolderNameRerad = co.statsOutputSubfolderNameCreate;
} catch(MissingResourceException e){
co.statsOutputSubfolderNameCreate = "stats_create";
co.statsOutputSubfolderNameRerad = "stats_read";
}
try {
co.createjobsstatistics = Boolean.valueOf(
bundle.getString(JOBS_STATISTICS)).booleanValue();
} catch(MissingResourceException e){
co.createjobsstatistics = true;
}
try {
co.createsimulationstatistics = Boolean.valueOf(
bundle.getString(SIMULATION_STATISTICS)).booleanValue();
} catch(MissingResourceException e){
co.createsimulationstatistics = true;
}
try {
co.numberOfSimulations = Integer.valueOf(bundle.getString(NUMBER_OF_SIMULATIONS)).intValue();
} catch(MissingResourceException e){
co.numberOfSimulations = 1;
}
return co;
}
public static String getSeparatorTerminatedPath(String path) {
if (path.endsWith(File.separator))
return new String(path);
else {
StringBuilder result = new StringBuilder(path.length()
+ File.separator.length());
result.append(path);
result.append(File.separator);
return result.toString();
}
}
public void setNumberOfSimulations(int numberOfSimulations) {
this.numberOfSimulations = numberOfSimulations;
}
public int getNumberOfSimulations() {
return numberOfSimulations;
}
public void setWorkloadDescFileName(String workloadDescFileName) {
this.workloadDescFileName = workloadDescFileName;
}
public String getWorkloadDescFileName() {
return workloadDescFileName;
}
}