/*******************************************************************************
* 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.framework.launcher;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import staticContent.framework.config.MatchingMechanism;
import staticContent.framework.config.Paths;
import staticContent.framework.config.Settings;
public class CommandLineParameters {
public boolean useGui = true;
public boolean useSimGui = false;
public String configFile = null;
public boolean userHasProvidedACustomConfigFile = false;
public ToolName gMixTool = null; // the "Launcher" to be started (see framework.core.launcher)
public String overwriteParameters = null; // list of parameters (key-value-pairs) to overwrite the normal or global config
public String[] passthroughParameters = null; // tool-specific parameters
private boolean settingsObjectCreated = false;
private Settings settings;
public String[] origArgs;
public CommandLineParameters(String[] args) {
init(args, null, null);
}
public CommandLineParameters(String[] args, ToolName gMixTool) {
init(args, gMixTool, null);
}
public CommandLineParameters(String[] args, String config) {
init(args, null, config);
}
public CommandLineParameters(String[] args, ToolName gMixTool, String config) {
init(args, gMixTool, config);
}
private void init(String[] args, ToolName gMixTool, String config) {
this.origArgs = args;
if (gMixTool != null)
this.gMixTool = gMixTool;
Vector<String> parameters = new Vector<String>(Arrays.asList(args));
Vector<String> unknownParameters = new Vector<String>();
for(String par: parameters) {
String senPar;
if (par.startsWith("-"))
senPar = (""+par).replaceFirst("-", "");
else
senPar = par;
if (senPar.equalsIgnoreCase("nogui") || senPar.startsWith("noGUI") || senPar.startsWith("NOGUI") || senPar.startsWith("NO_GUI")) {
useGui = false;
} else if (senPar.startsWith("tool=") || senPar.startsWith("Tool=") || senPar.startsWith("TOOL=")) {
if (gMixTool == null)
this.gMixTool = ToolName.getToolByIdentifier(senPar.split("=")[1]);
} else if (senPar.startsWith("config=") || senPar.startsWith("Config=") || senPar.startsWith("CONFIG=") || senPar.startsWith("configfile=") || senPar.startsWith("ConfigFile=") || senPar.startsWith("CONFIGFILE=") || senPar.startsWith("configFile=") || senPar.startsWith("CONFIG_FILE=")) {
configFile = senPar.split("=")[1];
userHasProvidedACustomConfigFile = true;
} else if (senPar.startsWith("overwrite=") || senPar.startsWith("Overwrite=") || senPar.startsWith("OVERWRITE=")) {
senPar = senPar.replaceAll("'", "");
senPar = senPar.replaceFirst("overwrite=", "");
senPar = senPar.replaceFirst("Overwrite=", "");
senPar = senPar.replaceFirst("OVERWRITE=", "");
overwriteParameters = senPar;
} else {
unknownParameters.add(par);
}
}
if (config != null)
configFile = config;
if (configFile == null)
configFile = new Settings(Paths.ANON_NODE_CONFIG_FILE_PATH +"default.txt").getProperty("DEFAULT_CONFIG");
if (unknownParameters.size() > 0) {
passthroughParameters = unknownParameters.toArray(new String[0]);
} else {
passthroughParameters = new String[0];
}
}
@Override
public String toString() {
String s = "CommandLineParameters: \n";
s += "NOGUI=" +!useGui +"\n";
s += "TOOL=" +gMixTool +"\n";
s += "CONFIGFILE=" +configFile +"\n";
s += "OVERWRITE=" +overwriteParameters +"\n";
List<String> c = Arrays.asList(passthroughParameters);
s += "PASSTHROUGH_PARAMETERS=" +c +"\n";
return s;
}
public Settings generateSettingsObject() {
if (settingsObjectCreated)
return settings;
settingsObjectCreated = true;
settings = new Settings(Paths.PATH_TO_PATH_CONFIG_FILE);
settings.addProperties(Paths.ANON_NODE_CONFIG_FILE_PATH + configFile);
settings.addProperties(Paths.LG_PROPERTY_FILE_PATH); // load generator properties
if (gMixTool != ToolName.SIMULATOR) // load plug-in settings (unless we want to start the simulator which does not use those plug-ins)
loadPluginSettings(settings, overwriteParameters);
// settigns in config file have higher priority than normal plug-in settings -> overwrite (again)
settings.addProperties(Paths.ANON_NODE_CONFIG_FILE_PATH + configFile);
if (overwriteParameters != null) // overwriteParameters have higher priority than all other settings -> overwrite (again)
Settings.overwriteSettings(settings.getPropertiesObject(), overwriteParameters, false);
// validate composition
boolean validateConfig = settings.getPropertyAsBoolean("VALIDATE_CONFIG");
if (validateConfig && !MatchingMechanism.isConfigValid(settings))
throw new RuntimeException("invalid plug-in composition");
return settings;
}
public static Settings loadPluginSettings(String pathToPluginComposition, String overwriteParameters) {
Settings settings = new Settings(pathToPluginComposition);
loadPluginSettings(settings, overwriteParameters);
return settings;
}
public static Settings loadPluginSettings(String pathToPluginComposition) {
Settings settings = new Settings(pathToPluginComposition);
loadPluginSettings(settings, null);
return settings;
}
public static void loadPluginSettings(Settings settings, String overwriteParameters) {
if (overwriteParameters != null) // overwrite so that loadPluginSettings() will load the right configurations
Settings.overwriteSettings(settings.getPropertiesObject(), overwriteParameters, true);
for (int i=1; i<=5; i++) {
loadSettingsForPlugin(settings, "LAYER_" +i +"_PLUG-IN_CLIENT");
loadSettingsForPlugin(settings, "LAYER_" +i +"_PLUG-IN_MIX");
}
if (settings.getProperty("GLOBAL_ROUTING_PLUG-IN") != null)
settings.addProperties(Paths.getProperty("GLOBAL_ROUTING_PLUG-IN_PATH") +settings.getProperty("GLOBAL_ROUTING_PLUG-IN") +"/PlugInSettings.txt");
if (settings.getProperty("DYNAMIC_ROUTING_PLUG-IN") != null)
settings.addProperties(Paths.getProperty("DYNAMIC_ROUTING_PLUG-IN_PATH") +settings.getProperty("DYNAMIC_ROUTING_PLUG-IN") +"/PlugInSettings.txt");
if (settings.getProperty("SOURCE_ROUTING_PLUG-IN") != null)
settings.addProperties(Paths.getProperty("SOURCE_ROUTING_PLUG-IN_PATH") +settings.getProperty("SOURCE_ROUTING_PLUG-IN") +"/PlugInSettings.txt");
}
public static void loadSettingsForPlugin(Settings settings, String key) {
Settings plugInSettings = new Settings(Paths.getProperty(key +"_PATH") +settings.getProperty(key) +"/PlugInSettings.txt");
String requirementsStr = plugInSettings.getProperty("SAME_LAYER_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty(key +"_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_1_CLIENT_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_1_PLUG-IN_CLIENT_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_1_MIX_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_1_PLUG-IN_MIX_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_2_CLIENT_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_2_PLUG-IN_CLIENT_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_2_MIX_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_2_PLUG-IN_MIX_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_3_MIX_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_3_PLUG-IN_MIX_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_3_CLIENT_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_4_PLUG-IN_CLIENT_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_4_MIX_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_4_PLUG-IN_MIX_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_4_CLIENT_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_4_PLUG-IN_CLIENT_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_5_MIX_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_5_PLUG-IN_MIX_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
requirementsStr = plugInSettings.getProperty("LAYER_5_CLIENT_REQUIREMENTS");
if (requirementsStr != null && !requirementsStr.equals(""))
for (String staticFunction: requirementsStr.split(","))
plugInSettings.addProperties((Paths.getProperty("LAYER_5_PLUG-IN_CLIENT_PATH")).replace("/layerPlugIns/", "/staticFunctionPlugIns/") +staticFunction +"/StaticFunctionSettings.txt");
settings.addProperties(plugInSettings.getPropertiesObject());
}
}