package org.ovirt.engine.api.restapi.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ovirt.engine.api.model.PowerManagement; import org.ovirt.engine.api.model.Option; import org.ovirt.engine.api.model.Options; public class FencingOptionsParser { /* Format of @str is <agent>;<agent>;... * Format of @typeStr is <name>=<type>,<name=type>,... */ public static List<PowerManagement> parse(String str, String typeStr, boolean ignoreValues) { List<PowerManagement> ret = new ArrayList<PowerManagement>(); Map<String, String> types = parseTypes(typeStr); for (String agent : str.split(";", -1)) { if (!agent.isEmpty()) { ret.add(parseAgent(agent, types, ignoreValues)); } } return ret; } public static List<PowerManagement> parse(String str, String typeStr) { return parse(str, typeStr, false); } /* Format is <name>=<bool|int>,<name=bool|int>,... */ private static Map<String, String> parseTypes(String str) { Map<String, String> ret = new HashMap<String, String>(); for (String option : str.split(",", -1)) { if (!option.isEmpty()) { String[] parts = option.split("=", -1); if (parts.length != 2) { throw new IllegalArgumentException("Invalid fencing type description: '" + option + "'"); } ret.put(parts[0], parts[1]); } } return ret; } /* Format is <agent>:<name=value>,<name=value>,... * * e.g. alom:secure=secure,port=ipport */ private static PowerManagement parseAgent(String str, Map<String, String> types, boolean ignoreValues) { String[] parts = str.split(":", -1); if (parts.length != 2) { throw new IllegalArgumentException("Invalid fencing agent description: '" + str + "'"); } PowerManagement ret = new PowerManagement(); ret.setType(parts[0]); ret.setOptions(parseOptions(parts[1], types, ignoreValues)); return ret; } /* Format is <name=value>,<name=value>,... */ private static Options parseOptions(String str, Map<String, String> types, boolean ignoreValues) { Options ret = new Options(); for (String option : str.split(",", -1)) { if (!option.isEmpty()) { ret.getOptions().add(parseOption(option, types, ignoreValues)); } } return ret; } /* Format is <name=value> */ private static Option parseOption(String str, Map<String, String> types, boolean ignoreValues) { String[] parts = str.split("=", -1); if (parts.length != 2) { throw new IllegalArgumentException("Invalid fencing option description: '" + str + "'"); } Option ret = new Option(); ret.setName(parts[0]); if (!ignoreValues) { ret.setValue(parts[1]); } if (types.containsKey(parts[0])) { ret.setType(types.get(parts[0])); } else { throw new IllegalArgumentException("No type specified for option: '" + parts[0] + "'"); } return ret; } }