/*******************************************************************************
* 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.config;
import staticContent.framework.launcher.CommandLineParameters;
import staticContent.framework.util.Util;
public class MatchingMechanism {
private static Settings settings;
/**
* Comment
*
* @param args Not used.
*/
public static void main(String[] args) {
Settings settings = new Settings(Paths.PATH_TO_PATH_CONFIG_FILE);
String configFilePath = new Settings(Paths.ANON_NODE_CONFIG_FILE_PATH +"default.txt").getProperty("DEFAULT_CONFIG");
settings.addProperties(configFilePath);
isConfigValid(settings);
}
// validates if the configuration for this mix/client is valid (are the plug-ins compatible?)
public static boolean isConfigValid(Settings settings) {
MatchingMechanism.settings = settings;
Settings selectedPlugIns = new Settings();
for (int i=1; i<=5; i++) {
CommandLineParameters.loadSettingsForPlugin(selectedPlugIns, "LAYER_" +i +"_PLUG-IN_CLIENT");
CommandLineParameters.loadSettingsForPlugin(selectedPlugIns, "LAYER_" +i +"_PLUG-IN_MIX");
}
// part I: validate if plug-ins match the user design choices
System.out.println("validating if plug-ins match the user design choices");
Settings userDesignChoices = new Settings("./inputOutput/anonNode/individual/matchingMechanism/userDesignChoices.txt");
Settings ruleDefinitions = new Settings("./inputOutput/anonNode/individual/matchingMechanism/globalRules/ruleDefinitions.txt");
System.out.println("user choices: \n" +userDesignChoices.getConfig());
System.out.println("\nrule definitions: \n" +ruleDefinitions.getConfig());
for (String ruleName: userDesignChoices.getPropertiesObject().stringPropertyNames()) {
System.out.println("\n\n ruleName: " +ruleName);
Settings ruleSet = getRuleSet(ruleName, userDesignChoices.getProperty(ruleName), ruleDefinitions);
String[] clientRequirementsAllLayers = ruleSet.getProperty("CLIENT_REQUIREMENTS_FOR_ALL_LAYERS").split(",");
String[] mixRequirementsAllLayers = ruleSet.getProperty("MIX_REQUIREMENTS_FOR_ALL_LAYERS").split(",");
System.out.println(" clientRequirementsAllLayers: " +java.util.Arrays.asList(clientRequirementsAllLayers));
System.out.println(" mixRequirementsAllLayers: " +java.util.Arrays.asList(mixRequirementsAllLayers));
for (int layer=1; layer<=5; layer++) { // for each layer
System.out.println(" layer " +layer +":");
// load plug-in requirements:
String[] clientRequirements = getClientPlugInRequirements(layer, ruleSet);
String[] mixRequirements = getMixPlugInRequirements(layer, ruleSet);
System.out.println(" clientRequirements: " +java.util.Arrays.asList(clientRequirements));
System.out.println(" mixRequirements: " +java.util.Arrays.asList(mixRequirements));
// load plug-in capabilities:
String[] clientCapabilities = getGlobalClientPlugInCapabilities(layer, selectedPlugIns, ruleName);
String[] mixCapabilities = getGlobalMixPlugInCapabilities(layer, selectedPlugIns, ruleName);
System.out.println(" clientCapabilities: " +java.util.Arrays.asList(clientCapabilities));
System.out.println(" mixCapabilities: " +java.util.Arrays.asList(mixCapabilities));
// match requirements and capabilities:
if ( !isGlobalCompatible(layer, clientRequirementsAllLayers, clientCapabilities) ||
!isGlobalCompatible(layer, mixRequirementsAllLayers, mixCapabilities) ||
!isGlobalCompatible(layer, clientRequirements, clientCapabilities) ||
!isGlobalCompatible(layer, mixRequirements, mixCapabilities)
)
return false;
}
}
// part II: validate if the chosen plug-ins are compatible
System.out.println("\n\nvalidating if the chosen plug-ins are compatible ");
for (int layer=1; layer<=5; layer++) {
System.out.println(" layer " +layer +":");
Settings mixPlugInSettings = getMixPlugInSettings(layer, selectedPlugIns);
Settings clientPlugInSettings = getClientPlugInSettings(layer, selectedPlugIns);
System.out.println(" bothUseSamePlugIn(): " +bothUseSamePlugIn(selectedPlugIns, layer));
// validate if client and mix plug-ins are compatible
if (!bothUseSamePlugIn(selectedPlugIns, layer)) {
System.out.println("\n validate if client and mix plug-ins are compatible");
String[] compatibleClientPlugIns = mixPlugInSettings.getProperty("COMPATIBLE_CLIENT_PLUG_INS").split(",");
String[] compatibleMixPlugIns = clientPlugInSettings.getProperty("COMPATIBLE_MIX_PLUG_INS").split(",");
System.out.println(" compatibleClientPlugIns: " +java.util.Arrays.asList(compatibleClientPlugIns));
System.out.println(" requirement: " +selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_CLIENT"));
System.out.println(" compatibleMixPlugIns: " +java.util.Arrays.asList(compatibleMixPlugIns));
System.out.println(" requirement: " +selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_MIX"));
if ( !contains(selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_CLIENT"), compatibleClientPlugIns) ||
!contains(selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_MIX"), compatibleMixPlugIns)
) {
System.err.println("the selected client and mix plug-ins on layer " +layer +" are not compatible");
return false;
}
}
System.out.println("\n validate if static function requirements are met");
// validate if static function requirements are met
String[] sameLayerRequirementsClient = mixPlugInSettings.getProperty("SAME_LAYER_REQUIREMENTS").split(",");
String[] sameLayerRequirementsMix = mixPlugInSettings.getProperty("SAME_LAYER_REQUIREMENTS").split(",");
System.out.println(" sameLayerRequirementsClient: " +java.util.Arrays.asList(sameLayerRequirementsClient));
System.out.println(" sameLayerRequirementsMix: " +java.util.Arrays.asList(sameLayerRequirementsMix));
//for (String requirement:sameLayerRequirementsClient) {
// TODO: check if file is available (e.g. new File("pathToFile").isFile());
// return false;
//}
//for (String requirement:sameLayerRequirementsMix) {
// TODO: check if file is available (e.g. new File("pathToFile").isFile())
// return false;
//}
System.out.println("\n validate if static function requirements between layers are met");
for (int lay=1; lay<=5; lay++) {
if (lay != layer) {
String[] requirementsClient = clientPlugInSettings.getProperty("LAYER_" +lay +"_CLIENT_REQUIREMENTS").split(",");
String[] requirementsMix = mixPlugInSettings.getProperty("LAYER_" +lay +"_MIX_REQUIREMENTS").split(",");
String[] capabilitiesClient = getClientPlugInSettings(lay, selectedPlugIns).getProperty("CAPABILITIES_CLIENT").split(",");
String[] capabilitiesMix = getMixPlugInSettings(lay, selectedPlugIns).getProperty("CAPABILITIES_MIX").split(",");
System.out.println(" lay " +lay);
System.out.println(" requirementsClient: " +java.util.Arrays.asList(requirementsClient));
System.out.println(" capabilitiesClient: " +java.util.Arrays.asList(capabilitiesClient));
System.out.println(" requirementsMix: " +java.util.Arrays.asList(requirementsMix));
System.out.println(" capabilitiesMix: " +java.util.Arrays.asList(capabilitiesMix));
if ( !isStaticFunctionCompatible(layer, lay, requirementsClient, capabilitiesClient) ||
!isStaticFunctionCompatible(layer, lay, requirementsMix, capabilitiesMix)
) {
System.err.println("the selected plug-ins on layer " +layer +" and " +lay +" are not compatible");
return false;
}
}
}
}
System.out.println("\n\nconfig seems valid");
return true;
}
private static boolean bothUseSamePlugIn(Settings selectedPlugIns, int layer) {
String clientPlugIn = selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_CLIENT");
String mixPlugIn = selectedPlugIns.getProperty("LAYER_" +layer +"_PLUG-IN_MIX");
return clientPlugIn.equals(mixPlugIn);
}
private static boolean contains(String searchFor, String[] in) {
for (String s:in)
if (s.equals(searchFor))
return true;
return false;
}
private static boolean isGlobalCompatible(int layer, String[] requirements, String[] capabilitis) {
requirementLoop:
for (String requirement:requirements) {
if (requirement.equals(""))
continue;
for (String capability:capabilitis)
if (capability.equals(requirement))
continue requirementLoop;
System.err.println(
"inadquate plug-in selected for layer " +layer
+"\nthe layer " +layer +" plugin must support "
+requirement
);
return false;
}
return true;
}
private static boolean isStaticFunctionCompatible(int srcLayer, int dstLayer, String[] requirements, String[] capabilitis) {
requirementLoop:
for (String requirement:requirements) {
if (requirement.equals(""))
continue;
for (String capability:capabilitis)
if (capability.equals(requirement))
continue requirementLoop;
System.err.println(
"inadquate plug-in selected for layer " +dstLayer
+"\nthe layer " +srcLayer +" plugin requires a " +dstLayer
+"plug-in that supports " +requirement
);
return false;
}
return true;
}
private static Settings getRuleSet(String ruleName, String userChoice, Settings ruleDefinitions) {
String ruleDefinition = ruleDefinitions.getProperty(ruleName); // form: RULE_NAME=[CHOICE_1],[CHOICE_2],...[CHOICE_n], with [CHOICE_x] = CHOICE_NAME:REQUIREMENTS_FILE; example: TOPOLOGY=FIXED_ROUTE:fixedRoute.txt,FREE_ROUTE:freeRoute.txt
String ruleContentFileName = Util.getTextBetweenAAndB(ruleDefinition, userChoice +":", ".txt");
System.out.println(" loading ruleset " +"./inputOutput/anonNode/individual/matchingMechanism/globalRules/" +ruleContentFileName +".txt");
return new Settings("./inputOutput/anonNode/individual/matchingMechanism/globalRules/" +ruleContentFileName +".txt");
}
private static String[] getClientPlugInRequirements(int layer, Settings ruleSet) {
return ruleSet.getProperty("CLIENT_REQUIREMENTS_FOR_LAYER_" +layer).split(",");
}
private static String[] getMixPlugInRequirements(int layer, Settings ruleSet) {
return ruleSet.getProperty("MIX_REQUIREMENTS_FOR_LAYER_" +layer).split(",");
}
private static String[] getGlobalClientPlugInCapabilities(int layer, Settings selectedPlugIns, String ruleName) {
Settings plugInSettings = getClientPlugInSettings(layer, selectedPlugIns);
return plugInSettings.getProperty(ruleName + "_CLIENT").split(",");
}
private static String[] getGlobalMixPlugInCapabilities(int layer, Settings selectedPlugIns, String ruleName) {
Settings plugInSettings = getMixPlugInSettings(layer, selectedPlugIns);
return plugInSettings.getProperty(ruleName + "_MIX").split(",");
}
private static Settings getClientPlugInSettings(int layer, Settings selectedPlugIns) {
return getPlugInSettings(layer, selectedPlugIns, "CLIENT");
}
private static Settings getMixPlugInSettings(int layer, Settings selectedPlugIns) {
return getPlugInSettings(layer, selectedPlugIns, "MIX");
}
private static Settings getPlugInSettings(int layer, Settings selectedPlugIns, String mixOrClient) {
switch (layer) {
case 1:
return new Settings(settings.getProperty("LAYER_1_PLUG-IN_MIX_PATH") +selectedPlugIns.getProperty("LAYER_1_PLUG-IN_" +mixOrClient) +"/PlugInSettings.txt");
case 2:
return new Settings(settings.getProperty("LAYER_2_PLUG-IN_MIX_PATH") +selectedPlugIns.getProperty("LAYER_2_PLUG-IN_" +mixOrClient) +"/PlugInSettings.txt");
case 3:
return new Settings(settings.getProperty("LAYER_3_PLUG-IN_MIX_PATH") +selectedPlugIns.getProperty("LAYER_3_PLUG-IN_" +mixOrClient) +"/PlugInSettings.txt");
case 4:
return new Settings(settings.getProperty("LAYER_4_PLUG-IN_MIX_PATH") +selectedPlugIns.getProperty("LAYER_4_PLUG-IN_" +mixOrClient) +"/PlugInSettings.txt");
case 5:
return new Settings(settings.getProperty("LAYER_5_PLUG-IN_MIX_PATH") +selectedPlugIns.getProperty("LAYER_5_PLUG-IN_" +mixOrClient) +"/PlugInSettings.txt");
default:
throw new RuntimeException("not found " + layer);
}
}
}