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 @@
  *           &lt;required&gt;true&lt;/required&gt;
  *           &lt;description&gt;some required and long option&lt;/description&gt;
  *         &lt;/option&gt;
+ *         &lt;options common="true"&gt;
+ *           &lt;long&gt;dbUrl&lt;/long&gt;
+ *           &lt;required&gt;true&lt;/required&gt;
+ *         &lt;/option&gt;
  *       &lt;/options&gt;
  *       &lt;bundles&gt;
  *         &lt;bundle&gt;hello-world-plugin-0.1-SNAPSHOT.jar&lt;/bundle&gt;
@@ -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 &lt;foo&gt;</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 &lt;foo&gt;</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);
+    }
 }