/******************************************************************************* * gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/ * Copyright (C) 2014 SVS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package staticContent.evaluation.simulator.conf.service; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.log4j.Level; import org.apache.log4j.Logger; import staticContent.evaluation.simulator.annotations.property.DoubleProp; import staticContent.evaluation.simulator.annotations.property.FloatProp; import staticContent.evaluation.simulator.annotations.property.IntProp; import staticContent.evaluation.simulator.annotations.property.SimProp; import staticContent.evaluation.simulator.gui.customElements.SimConfigPanel; import staticContent.evaluation.simulator.gui.pluginRegistry.DependencyChecker; import staticContent.evaluation.simulator.gui.pluginRegistry.SimPropRegistry; public class SimulationConfigService { private static Logger logger = Logger.getLogger(SimulationConfigService.class); private SimPropRegistry simPropRegistry; public SimulationConfigService(SimPropRegistry simPropRegistry) { this.setSimPropRegistry(simPropRegistry); } public SimPropRegistry getSimPropRegistry() { return this.simPropRegistry; } public void loadConfig(File file) { Properties props = new Properties(); try { props.load(new FileInputStream(file)); } catch (FileNotFoundException e) { JOptionPane.showMessageDialog(null, "File not found."); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Could not read from file."); } catch (IllegalArgumentException e) { JOptionPane.showMessageDialog(null, "Could not read from file."); } // This value is not in range // Properties to vary for (String s : this.simPropRegistry.getPropertiesToVary().keySet()) { logger.log(Level.DEBUG, "Load value for property to vary " + s); try { // fallback to EDFVersion=0 if ( props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("POISSON") && props.getProperty(s).equals("RESOLVE_TIME") ){ this.simPropRegistry.setPropertyToVaryValue(s, "POISSON_RESOLVE_TIME"); logger.log(Level.ERROR, s + " = POISSON_RESOLVE_TIME"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("CONSTANT") && props.getProperty(s).equals("RESOLVE_TIME") ){ this.simPropRegistry.setPropertyToVaryValue(s, "CONSTANT_RESOLVE_TIME"); logger.log(Level.ERROR, s + " = CONSTANT_RESOLVE_TIME"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("PARETO") && props.getProperty(s).equals("RESOLVE_TIME") ){ this.simPropRegistry.setPropertyToVaryValue(s, "PARETO_RESOLVE_TIME"); logger.log(Level.ERROR, s + " = PARETO_RESOLVE_TIME"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("REQUEST_REPLY") && props.getProperty(s).equals("RESOLVE_TIME") ){ this.simPropRegistry.setPropertyToVaryValue(s, "REQUEST_REPLY_RESOLVE_TIME"); logger.log(Level.ERROR, s + " = REQUEST_REPLY_RESOLVE_TIME"); } else if ( props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("POISSON") && props.getProperty(s).equals("REPLY_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "POISSON_REPLY_SIZE"); logger.log(Level.ERROR, s + " = POISSON_REPLY_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("CONSTANT") && props.getProperty(s).equals("REPLY_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "CONSTANT_REPLY_SIZE"); logger.log(Level.ERROR, s + " = CONSTANT_REPLY_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("PARETO") && props.getProperty(s).equals("REPLY_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "PARETO_REPLY_SIZE"); logger.log(Level.ERROR, s + " = PARETO_REPLY_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("REQUEST_REPLY") && props.getProperty(s).equals("REPLY_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "REQUEST_REPLY_REPLY_SIZE"); logger.log(Level.ERROR, s + " = REQUEST_REPLY_REPLY_SIZE"); } else if ( props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("POISSON") && props.getProperty(s).equals("REQUEST_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "POISSON_REQUEST_SIZE"); logger.log(Level.ERROR, s + " = POISSON_REQUEST_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("CONSTANT") && props.getProperty(s).equals("REQUEST_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "CONSTANT_REQUEST_SIZE"); logger.log(Level.ERROR, s + " = CONSTANT_REQUEST_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("PARETO") && props.getProperty(s).equals("REQUEST_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "PARETO_REQUEST_SIZE"); logger.log(Level.ERROR, s + " = PARETO_REQUEST_SIZE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("REQUEST_REPLY") && props.getProperty(s).equals("REQUEST_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "REQUEST_REPLY_REQUEST_SIZE"); logger.log(Level.ERROR, s + " = REQUEST_REPLY_REQUEST_SIZE"); } else if ( props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("POISSON") && props.getProperty(s).equals("AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") ){ this.simPropRegistry.setPropertyToVaryValue(s, "POISSON_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); logger.log(Level.ERROR, s + " = POISSON_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("CONSTANT") && props.getProperty(s).equals("AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") ){ this.simPropRegistry.setPropertyToVaryValue(s, "CONSTANT_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); logger.log(Level.ERROR, s + " = CONSTANT_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("PARETO") && props.getProperty(s).equals("AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") ){ this.simPropRegistry.setPropertyToVaryValue(s, "PARETO_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); logger.log(Level.ERROR, s + " = PARETO_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"); } else if ( props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("POISSON") && props.getProperty(s).equals("NUMBER_OF_CLIENTS_TO_SIMULATE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "POISSON_NUMBER_OF_CLIENTS_TO_SIMULATE"); logger.log(Level.ERROR, s + " = POISSON_NUMBER_OF_CLIENTS_TO_SIMULATE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("CONSTANT") && props.getProperty(s).equals("NUMBER_OF_CLIENTS_TO_SIMULATE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "CONSTANT_NUMBER_OF_CLIENTS_TO_SIMULATE"); logger.log(Level.ERROR, s + " = CONSTANT_NUMBER_OF_CLIENTS_TO_SIMULATE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("PARETO") && props.getProperty(s).equals("NUMBER_OF_CLIENTS_TO_SIMULATE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "PARETO_NUMBER_OF_CLIENTS_TO_SIMULATE"); logger.log(Level.ERROR, s + " = PARETO_NUMBER_OF_CLIENTS_TO_SIMULATE"); } else if (props.getProperty("TYPE_OF_TRAFFIC_GENERATOR").equals("REQUEST_REPLY") && props.getProperty(s).equals("NUMBER_OF_CLIENTS_TO_SIMULATE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "REQUEST_REPLY_NUMBER_OF_CLIENTS_TO_SIMULATE"); logger.log(Level.ERROR, s + " = REQUEST_REPLY_NUMBER_OF_CLIENTS_TO_SIMULATE"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_BASIC") && props.getProperty(s).equals("REQUEST_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAB_REQUEST_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAB_REQUEST_DELAY"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_HEURISTIC") && props.getProperty(s).equals("REQUEST_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAI_REQUEST_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAI_REQUEST_DELAY"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_HEURISTIC_2") && props.getProperty(s).equals("REQUEST_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAII_REQUEST_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAII_REQUEST_DELAY"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_BASIC") && props.getProperty(s).equals("REPLY_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAB_REPLY_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAB_REPLY_DELAY"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_HEURISTIC") && props.getProperty(s).equals("REPLY_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAI_REPLY_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAI_REPLY_DELAY"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("DLPA_HEURISTIC_2") && props.getProperty(s).equals("REPLY_DELAY") ){ this.simPropRegistry.setPropertyToVaryValue(s, "MAX_DLPAII_REPLY_DELAY"); logger.log(Level.ERROR, s + " = MAX_DLPAII_REPLY_DELAY"); }else if (props.getProperty("OUTPUT_STRATEGY").equals("BASIC_BATCH") && props.getProperty(s).equals("BATCH_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "BASIC_BATCH_BATCH_SIZE"); logger.log(Level.ERROR, s + " = BASIC_BATCH_BATCH_SIZE"); } else if (props.getProperty("OUTPUT_STRATEGY").equals("BATCH_WITH_TIMEOUT") && props.getProperty(s).equals("BATCH_SIZE") ){ this.simPropRegistry.setPropertyToVaryValue(s, "BATCH_WITH_TIMEOUT_BATCH_SIZE"); logger.log(Level.ERROR, s + " = BATCH_WITH_TIMEOUT_BATCH_SIZE"); } else { this.simPropRegistry.setPropertyToVaryValue(s, props.getProperty(s)); logger.log(Level.DEBUG, s + " = " + props.getProperty(s)); } // if ( props.getProperty("SECOND_PROPERTY_TO_VARY").equals("") || // props.getProperty("VALUES_FOR_THE_SECOND_PROPERTY_TO_VARY").equals("") // ){ // this.simPropRegistry.setPropertyToVaryValue(s, "FALSE"); // // } } catch (Exception e) { logger.log(Level.ERROR,"Can not read value for " + s); } } // Load simProps for (Entry<String, SimProp> s : this.simPropRegistry.getAllSimProps()) { logger.log(Level.DEBUG, "Load value for " + s.getKey()); try { if (s.getValue().getValueType() == String.class) { s.getValue().setValue((props.get(s.getKey()))); } else if (s.getValue().getValueType() == Integer.class) { if (props.get(s.getKey()).equals("AUTO")) { ((IntProp) s.getValue() ).setAuto(true); } else if (props.get(s.getKey()).equals("UNLIMITED")) { ((IntProp) s.getValue() ).setUnlimited(true); }else{ ((IntProp) s.getValue() ).setAuto(false); ((IntProp) s.getValue() ).setUnlimited(false); s.getValue().setValue(Integer.parseInt((String) props.get(s.getKey()))); } } else if (s.getValue().getValueType() == Float.class) { if (props.get(s.getKey()).equals("AUTO")) { ((FloatProp) s.getValue() ).setAuto(true); } else if (props.get(s.getKey()).equals("UNLIMITED")) { ((FloatProp) s.getValue() ).setUnlimited(true); }else{ ((FloatProp) s.getValue() ).setAuto(false); ((FloatProp) s.getValue() ).setUnlimited(false); s.getValue().setValue(Float.parseFloat((String) props.get(s.getKey()))); } } else if (s.getValue().getValueType() == Double.class) { if (props.get(s.getKey()).equals("AUTO")) { ((DoubleProp) s.getValue() ).setAuto(true); } else if (props.get(s.getKey()).equals("UNLIMITED")) { ((DoubleProp) s.getValue() ).setUnlimited(true); }else{ ((DoubleProp) s.getValue() ).setAuto(false); ((DoubleProp) s.getValue() ).setUnlimited(false); s.getValue().setValue(Double.parseDouble((String) props.get(s.getKey()))); } } else if (s.getValue().getValueType() == Boolean.class) { s.getValue().setValue(Boolean.parseBoolean((String) props.get(s.getKey()))); } //if ( s.getKey().equals("NAME_OF_PLOT_SCRIPT") ){ // s.getValue().setValue("simguiPlotScript.txt"); //} s.getValue().changed(); } catch (NullPointerException e) { // logger.log(Level.ERROR,"Fallback mode:" + s.getValue().getPropertyID()); // Load EDFVersion=0 Files String fallback = "FALLBACK"; if ( s.getKey().equals("PARETO_RESOLVE_TIME") || s.getKey().equals("REQUEST_REPLY_RESOLVE_TIME") || s.getKey().equals("POISSON_RESOLVE_TIME") || s.getKey().equals("CONSTANT_RESOLVE_TIME") ){ fallback = "RESOLVE_TIME"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("POISSON_REPLY_SIZE") || s.getKey().equals("CONSTANT_REPLY_SIZE") || s.getKey().equals("PARETO_REPLY_SIZE") || s.getKey().equals("REQUEST_REPLY_REPLY_SIZE") ){ fallback = "REPLY_SIZE"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("REQUEST_REPLY_REQUEST_SIZE") || s.getKey().equals("POISSON_REQUEST_SIZE") || s.getKey().equals("CONSTANT_REQUEST_SIZE") || s.getKey().equals("PARETO_REQUEST_SIZE") ){ fallback = "REQUEST_SIZE"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("CONSTANT_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") || s.getKey().equals("POISSON_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") || s.getKey().equals("PARETO_AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT") ){ fallback = "AVERAGE_REQUESTS_PER_SECOND_AND_CLIENT"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("POISSON_NUMBER_OF_CLIENTS_TO_SIMULATE") || s.getKey().equals("PARETO_NUMBER_OF_CLIENTS_TO_SIMULATE") || s.getKey().equals("CONSTANT_NUMBER_OF_CLIENTS_TO_SIMULATE") || s.getKey().equals("REQUEST_REPLY_NUMBER_OF_CLIENTS_TO_SIMULATE") ){ fallback = "NUMBER_OF_CLIENTS_TO_SIMULATE"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("MAX_DLPAB_REQUEST_DELAY") || s.getKey().equals("MAX_DLPAI_REQUEST_DELAY") || s.getKey().equals("MAX_DLPAII_REQUEST_DELAY") ){ fallback = "MAX_DLPA_REQUEST_DELAY"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("MAX_DLPAII_REPLY_DELAY") || s.getKey().equals("MAX_DLPAI_REPLY_DELAY") || s.getKey().equals("MAX_DLPAB_REPLY_DELAY") ){ fallback = "MAX_DLPA_REPLY_DELAY"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else if ( s.getKey().equals("BASIC_BATCH_BATCH_SIZE") || s.getKey().equals("BATCH_WITH_TIMEOUT_BATCH_SIZE") ){ fallback = "BATCH_SIZE"; logger.log(Level.DEBUG,"Fallback mode: " + s.getKey() + " --> " + fallback); } else { logger.log(Level.ERROR,"No fallback available for " + s.getKey()); continue; } logger.log(Level.DEBUG, "Load value for " + s.getKey()); try { if (s.getValue().getValueType() == String.class) { s.getValue().setValue((props.get(fallback))); } else if (s.getValue().getValueType() == Integer.class) { if (props.get(fallback).equals("AUTO")) { ((IntProp) s.getValue() ).setAuto(true); } else if (props.get(fallback).equals("UNLIMITED")) { ((IntProp) s.getValue() ).setUnlimited(true); }else{ ((IntProp) s.getValue() ).setAuto(false); ((IntProp) s.getValue() ).setUnlimited(false); System.out.println("[a: +" +props.get(fallback) +" - b:" + s.getValue() +"] s:" +s); // TODO: remove s.getValue().setValue(Integer.parseInt((String) props.get(fallback))); } } else if (s.getValue().getValueType() == Float.class) { if (props.get(fallback).equals("AUTO")) { ((FloatProp) s.getValue() ).setAuto(true); } else if (props.get(fallback).equals("UNLIMITED")) { ((FloatProp) s.getValue() ).setUnlimited(true); }else{ ((FloatProp) s.getValue() ).setAuto(false); ((FloatProp) s.getValue() ).setUnlimited(false); s.getValue().setValue(Float.parseFloat((String) props.get(fallback))); } } else if (s.getValue().getValueType() == Double.class) { if (props.get(fallback).equals("AUTO")) { ((DoubleProp) s.getValue() ).setAuto(true); } else if (props.get(fallback).equals("UNLIMITED")) { ((DoubleProp) s.getValue() ).setUnlimited(true); }else{ ((DoubleProp) s.getValue() ).setAuto(false); ((DoubleProp) s.getValue() ).setUnlimited(false); s.getValue().setValue(Double.parseDouble((String) props.get(fallback))); } } else if (s.getValue().getValueType() == Boolean.class) { s.getValue().setValue(Boolean.parseBoolean((String) props.get(fallback))); } s.getValue().changed(); } catch (NullPointerException ex) { logger.log(Level.ERROR,"Can not read value for fallback " + fallback); } } } SimPropRegistry simPropRegistry = SimPropRegistry.getInstance(); List<String> pluginLevels = simPropRegistry.getPluginLayers(); for (String pluginLevel : pluginLevels) { String configName = SimPropRegistry.getInstance().displayNameToConfigName(pluginLevel); String selectedPlugin = (String) props.getProperty(configName); SimPropRegistry.getInstance().setActivePluginsMapped(configName,selectedPlugin); // Update GUI in order to inform JComboBoxes SimConfigPanel.getInstance().update(); } this.simPropRegistry.setCurrentConfigFile(file.getAbsolutePath()); DependencyChecker.checkAll(this.simPropRegistry); SimConfigPanel.setStatusofSaveButton(!DependencyChecker.errorsInConfig); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { SimConfigPanel.getInstance().foldAccordions(); SimPropRegistry.getInstance().setUnsavedChanges(false); } }); this.simPropRegistry.setUnsavedChanges(false); } public void setSimPropRegistry(SimPropRegistry simPropRegistry) { this.simPropRegistry = simPropRegistry; } public void writeConfig(File outputFile) { PropertiesConfiguration props; try { props = new PropertiesConfiguration("inputOutput/simulator/config/experiment_template.cfg"); props.setProperty("EDF_VERSION", 1); // static part Map<String, String> plugins = this.simPropRegistry.getActivePlugins(true); logger.log(Level.DEBUG, "Active plugins are:"); for (String key : plugins.keySet()) { logger.log(Level.DEBUG, key + " with " + plugins.get(key)); props.setProperty(key, plugins.get(key)); } // Properties to vary for (Entry<String, String> s : this.simPropRegistry.getPropertiesToVary().entrySet()) { logger.log(Level.DEBUG, s.getKey() + "=" + s.getValue().toString()); props.setProperty(s.getKey(), s.getValue()); } // dynamic part for (Entry<String, SimProp> s : this.simPropRegistry.getAllSimProps()) { try { if (s.getValue().getValueType() == Integer.class && ((IntProp)(s.getValue())).getAuto()) { logger.log(Level.DEBUG, s.getKey() + "=AUTO"); props.setProperty(s.getKey(), "AUTO"); }else if (s.getValue().getValueType() == Integer.class && ((IntProp)(s.getValue())).getUnlimited()) { logger.log(Level.DEBUG, s.getKey() + "=UNLIMITED"); props.setProperty(s.getKey(), "UNLIMITED"); }else if (s.getValue().getValueType() == Float.class && ((FloatProp)(s.getValue())).getAuto()) { logger.log(Level.DEBUG, s.getKey() + "=AUTO"); props.setProperty(s.getKey(), "AUTO"); }else if (s.getValue().getValueType() == Float.class && ((FloatProp)(s.getValue())).getUnlimited()) { logger.log(Level.DEBUG, s.getKey() + "=UNLIMITED"); props.setProperty(s.getKey(), "UNLIMITED"); }else if (s.getValue().getValueType() == Double.class && ((DoubleProp)(s.getValue())).getAuto()) { logger.log(Level.DEBUG, s.getKey() + "=AUTO"); props.setProperty(s.getKey(), "AUTO"); }else if (s.getValue().getValueType() == Double.class && ((DoubleProp)(s.getValue())).getUnlimited()) { logger.log(Level.DEBUG, s.getKey() + "=UNLIMITED"); props.setProperty(s.getKey(), "UNLIMITED"); }else{ logger.log(Level.DEBUG, s.getKey() + "=" + s.getValue().getValue().toString()); props.setProperty(s.getKey(), s.getValue().getValue().toString().trim()); } } catch (Exception e) { logger.log(Level.DEBUG, s.getKey() + " has no associated property -> SKIP"); } } props.save(outputFile); } catch (ConfigurationException e) { e.printStackTrace(); } } }