Mercurial > hg > release > thermostat-0.11
changeset 1013:2bb2a1d1aa03
Allow plugins to use common options
Reviewed-by: ebaron
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-February/005924.html
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Wed, 27 Feb 2013 17:51:03 -0500 |
parents | d13774aae518 |
children | 89add75f3b71 |
files | launcher/src/main/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParser.java launcher/src/test/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParserTest.java |
diffstat | 2 files changed, 140 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/launcher/src/main/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParser.java Wed Feb 27 14:52:27 2013 -0500 +++ b/launcher/src/main/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParser.java Wed Feb 27 17:51:03 2013 -0500 @@ -98,6 +98,10 @@ * <required>true</required> * <description>some required and long option</description> * </option> + * <options common="true"> + * <long>dbUrl</long> + * <required>true</required> + * </option> * </options> * <bundles> * <bundle>hello-world-plugin-0.1-SNAPSHOT.jar</bundle> @@ -301,7 +305,9 @@ opts.addOptionGroup(group); } else if (node.getNodeName().equals("option")) { Option option = parseOption(node); - opts.addOption(option); + if (option != null) { + opts.addOption(option); + } } } @@ -316,7 +322,9 @@ Node node = nodes.item(i); if (node.getNodeName().equals("option")) { Option option = parseOption(node); - group.addOption(option); + if (option != null) { + group.addOption(option); + } } else if (node.getNodeName().equals("required")) { group.setRequired(Boolean.valueOf(node.getTextContent().trim())); } @@ -326,6 +334,54 @@ } private Option parseOption(Node optionNode) { + Option option; + Node type = optionNode.getAttributes().getNamedItem("common"); + if (type != null && Boolean.valueOf(type.getNodeValue())) { + option = parseCommonOption(optionNode); + } else { + option = parseNormalOption(optionNode); + } + + return option; + } + + private Option parseCommonOption(Node optionNode) { + String longName = null; + String shortName = null; + boolean required = false; + Option option = null; + + NodeList nodes = optionNode.getChildNodes(); + for (int i = 0; i < nodes.getLength(); i++) { + Node node = nodes.item(i); + if (node.getNodeName().equals("long")) { + longName = node.getTextContent().trim(); + } else if (node.getNodeName().equals("short")) { + shortName = node.getTextContent().trim(); + } else if (node.getNodeName().equals("required")) { + required = Boolean.valueOf(node.getTextContent().trim()); + } + } + + List<Option> allKnownOptions = new ArrayList<Option>(); + allKnownOptions.addAll(CommonOptions.getDbOptions()); + allKnownOptions.add(CommonOptions.getLogOption()); + + for (Option knownOption : allKnownOptions) { + if (knownOption.getOpt().equals(shortName) || knownOption.getLongOpt().equals(longName)) { + option = new Option(knownOption.getOpt(), knownOption.getLongOpt(), knownOption.hasArg(), knownOption.getDescription()); + option.setRequired(required); + option.setArgName(knownOption.getArgName()); + return option; + } + } + + logger.warning("The option " + longName != null ? longName : shortName + " claims to be a common option but isnt"); + + return null; + } + + private Option parseNormalOption(Node optionNode) { String longName = null; String shortName = null; String description = null;
--- a/launcher/src/test/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParserTest.java Wed Feb 27 14:52:27 2013 -0500 +++ b/launcher/src/test/java/com/redhat/thermostat/launcher/internal/PluginConfigurationParserTest.java Wed Feb 27 17:51:03 2013 -0500 @@ -40,6 +40,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -53,6 +54,7 @@ import org.apache.commons.cli.Options; import org.junit.Test; +import com.redhat.thermostat.common.locale.Translate; import com.redhat.thermostat.launcher.internal.PluginConfiguration.CommandExtensions; import com.redhat.thermostat.launcher.internal.PluginConfiguration.NewCommand; @@ -260,4 +262,84 @@ OptionGroup group = opts.getOptionGroup(exclusiveOptionA); assertTrue(group.isRequired()); } + + @Test + public void testCommonOptionParsing() throws UnsupportedEncodingException { + String config = "<?xml version=\"1.0\"?>\n" + + "<plugin>\n" + + " <commands>\n" + + " <command type='provides'>\n" + + " <name>test</name>\n" + + " <description>just a test</description>\n" + + " <usage>test [ -a | -b ] -l <foo></usage>\n" + + " <options>\n" + + " <option common=\"true\">\n" + + " <long>dbUrl</long>\n" + + " </option>\n" + + " </options>\n" + + " </command>\n" + + " </commands>\n" + + "</plugin>"; + + PluginConfiguration result = new PluginConfigurationParser() + .parse("test", new ByteArrayInputStream(config.getBytes("UTF-8"))); + + assertEquals(0, result.getExtendedCommands().size()); + + List<NewCommand> newCommands = result.getNewCommands(); + assertEquals(1, newCommands.size()); + + NewCommand command = newCommands.get(0); + + Options opts = command.getOptions(); + assertTrue(opts.getRequiredOptions().isEmpty()); + + Option dbUrlOption = opts.getOption("d"); + assertNotNull(dbUrlOption); + + Option otherDbUrlOption = opts.getOption("dbUrl"); + assertSame(dbUrlOption, otherDbUrlOption); + + Translate<LocaleResources> t = LocaleResources.createLocalizer(); + + assertEquals("dbUrl", dbUrlOption.getArgName()); + assertEquals(1, dbUrlOption.getArgs()); + assertEquals(t.localize(LocaleResources.OPTION_DB_URL_DESC), dbUrlOption.getDescription()); + assertFalse(dbUrlOption.isRequired()); + } + + @Test + public void testFakeCommonOptionIsIgnored() throws UnsupportedEncodingException { + String config = "<?xml version=\"1.0\"?>\n" + + "<plugin>\n" + + " <commands>\n" + + " <command type='provides'>\n" + + " <name>test</name>\n" + + " <description>just a test</description>\n" + + " <usage>test [ -a | -b ] -l <foo></usage>\n" + + " <options>\n" + + " <option common=\"true\">\n" + + " <long>foobarbaz</long>\n" + + " </option>\n" + + " </options>\n" + + " </command>\n" + + " </commands>\n" + + "</plugin>"; + + PluginConfiguration result = new PluginConfigurationParser() + .parse("test", new ByteArrayInputStream(config.getBytes("UTF-8"))); + + assertEquals(0, result.getExtendedCommands().size()); + + List<NewCommand> newCommands = result.getNewCommands(); + assertEquals(1, newCommands.size()); + + NewCommand command = newCommands.get(0); + + Options opts = command.getOptions(); + assertTrue(opts.getRequiredOptions().isEmpty()); + + Option dbUrlOption = opts.getOption("foobarbaz"); + assertNull(dbUrlOption); + } }