You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2013/07/30 09:27:39 UTC

svn commit: r1508327 - in /karaf/trunk: shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/

Author: cschneider
Date: Tue Jul 30 07:27:39 2013
New Revision: 1508327

URL: http://svn.apache.org/r1508327
Log:
KARAF-2419 Extract help printing in separate classes

Added:
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java   (with props)
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java   (with props)
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java   (with props)
Modified:
    karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ActionMetaData.java
    karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/GenerateHelpMojo.java

Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ActionMetaData.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ActionMetaData.java?rev=1508327&r1=1508326&r2=1508327&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ActionMetaData.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/commands/meta/ActionMetaData.java Tue Jul 30 07:27:39 2013
@@ -141,16 +141,14 @@ public class ActionMetaData {
                     IndentFormatter.printFormatted("                ", argument.description(), termWidth, out);
                     if (!argument.required()) {
                         if (argument.valueToShowInHelp() != null && argument.valueToShowInHelp().length() != 0) {
-                            try {
-                                if (Argument.DEFAULT_STRING.equals(argument.valueToShowInHelp())) {
-                                    arguments.get(argument).setAccessible(true);
-                                    Object o = arguments.get(argument).get(action);
-                                    printObjectDefaultsTo(out, o);
-                                } else {
-                                    printDefaultsTo(out, argument.valueToShowInHelp());
+                            if (Argument.DEFAULT_STRING.equals(argument.valueToShowInHelp())) {
+                                Object o = getDefaultValue(action, argument);
+                                String defaultValue = getDefaultValueString(o);
+                                if (defaultValue != null) {
+                                    printDefaultsTo(out, defaultValue);
                                 }
-                            } catch (Throwable t) {
-                                // Ignore
+                            } else {
+                                printDefaultsTo(out, argument.valueToShowInHelp());
                             }
                         }
                     }
@@ -168,16 +166,14 @@ public class ActionMetaData {
                     out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(opt).a(Ansi.Attribute.RESET));
                     IndentFormatter.printFormatted("                ", option.description(), termWidth, out);
                     if (option.valueToShowInHelp() != null && option.valueToShowInHelp().length() != 0) {
-                        try {
-                            if (Option.DEFAULT_STRING.equals(option.valueToShowInHelp())) {
-                                options.get(option).setAccessible(true);
-                                Object o = options.get(option).get(action);
-                                printObjectDefaultsTo(out, o);
-                            } else {
-                                printDefaultsTo(out, option.valueToShowInHelp());
+                        if (Option.DEFAULT_STRING.equals(option.valueToShowInHelp())) {
+                            Object o = getDefaultValue(action, option);
+                            String defaultValue = getDefaultValueString(o);
+                            if (defaultValue != null) {
+                                printDefaultsTo(out, defaultValue);
                             }
-                        } catch (Throwable t) {
-                            // Ignore
+                        } else {
+                            printDefaultsTo(out, option.valueToShowInHelp());
                         }
                     }
                 }
@@ -185,31 +181,53 @@ public class ActionMetaData {
             }
             if (command.detailedDescription().length() > 0) {
                 out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("DETAILS").a(Ansi.Attribute.RESET));
-                String desc = loadDescription(actionClass, command.detailedDescription());
+                String desc = getDetailedDescription();
                 IndentFormatter.printFormatted("        ", desc, termWidth, out);
             }
         }
     }
     
-    private String loadDescription(Class clazz, String desc) {
-        if (desc.startsWith("classpath:")) {
+    public Object getDefaultValue(Action action, Argument argument) {
+        try {
+            arguments.get(argument).setAccessible(true);
+            return arguments.get(argument).get(action);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+    
+    public Object getDefaultValue(Action action, Option option) {
+        try {
+            options.get(option).setAccessible(true);
+            return options.get(option).get(action);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+    
+    public String getDetailedDescription() {
+        String desc = command.detailedDescription();
+        return loadDescription(actionClass, desc);
+    }
+    
+    private String loadDescription(Class<?> clazz, String desc) {
+        if (desc != null && desc.startsWith("classpath:")) {
             desc = ShellUtil.loadClassPathResource(clazz, desc.substring("classpath:".length()));
         }
         return desc;
     }
-
-    private void printObjectDefaultsTo(PrintStream out, Object o) {
-        if (o != null
-                && (!(o instanceof Boolean) || ((Boolean) o))
-                && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
-            printDefaultsTo(out, o.toString());
+    
+    public String getDefaultValueString(Object o) {
+        if (o != null && (!(o instanceof Boolean) || ((Boolean)o))
+            && (!(o instanceof Number) || ((Number)o).doubleValue() != 0.0)) {
+            return o.toString();
+        } else {
+            return null;
         }
     }
 
     private void printDefaultsTo(PrintStream out, String value) {
-        out.print("                (defaults to ");
-        out.print(value);
-        out.println(")");
+        out.println("                (defaults to " + value + ")");
     }
 
 }

Added: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java?rev=1508327&view=auto
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java (added)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java Tue Jul 30 07:27:39 2013
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.tooling.commands;
+
+import java.io.PrintStream;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.karaf.shell.commands.Action;
+import org.apache.karaf.shell.commands.meta.ActionMetaData;
+
+public interface CommandHelpPrinter {
+    /**
+     * Print help for a single action to the out stream
+     * 
+     * @param action
+     * @param actionMeta
+     * @param out stream to write to
+     * @param includeHelpOption include the help option in the doc
+     */
+    void printHelp(Action action, ActionMetaData actionMeta, PrintStream out, boolean includeHelpOption);
+    
+    /**
+     * Print the overview of all given commands to the out stream 
+     * 
+     * @param commands
+     * @param out
+     */
+    void printOverview(Map<String, Set<String>> commands, PrintStream out);
+}

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/CommandHelpPrinter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java?rev=1508327&view=auto
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java (added)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java Tue Jul 30 07:27:39 2013
@@ -0,0 +1,163 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.tooling.commands;
+
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.karaf.shell.commands.Action;
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.HelpOption;
+import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.commands.meta.ActionMetaData;
+
+/**
+ * Prints documentation in docbook syntax
+ */
+public class DocBookCommandHelpPrinter implements CommandHelpPrinter {
+
+    @Override
+    public void printHelp(Action action, ActionMetaData actionMeta, PrintStream out, boolean includeHelpOption) {
+
+        Map<Option, Field> optionsMap = actionMeta.getOptions();
+        Map<Argument, Field> argsMap = actionMeta.getArguments();
+        Command command = action.getClass().getAnnotation(Command.class);
+        List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
+        Collections.sort(arguments, new Comparator<Argument>() {
+            public int compare(Argument o1, Argument o2) {
+                return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
+            }
+        });
+        Set<Option> options = new HashSet<Option>(optionsMap.keySet());
+        if (includeHelpOption)
+            options.add(HelpOption.HELP);
+
+        out.println("<section>");
+        out.println("  <title>" + command.scope() + ":" + command.name() + "</title>");
+        out.println("  <section>");
+        out.println("    <title>Description</title>");
+        out.println("    <para>");
+        out.println(command.description());
+        out.println("    </para>");
+        out.println("  </section>");
+
+        StringBuffer syntax = new StringBuffer();
+        syntax.append(String.format("%s:%s", command.scope(), command.name()));
+        if (options.size() > 0) {
+            syntax.append(" [options]");
+        }
+        if (arguments.size() > 0) {
+            syntax.append(' ');
+            for (Argument argument : arguments) {
+                syntax.append(String.format(argument.required() ? "%s " : "[%s] ", argument.name()));
+            }
+        }
+        out.println("  <section>");
+        out.println("    <title>Syntax</title>");
+        out.println("    <para>");
+        out.println(syntax.toString());
+        out.println("    </para>");
+        out.println("  </section>");
+
+        if (arguments.size() > 0) {
+            out.println("  <section>");
+            out.println("    <title>Arguments</title>");
+            out.println("    <informaltable>");
+            for (Argument argument : arguments) {
+                out.println("    <tr>");
+                out.println("      <td>" + argument.name() + "</td>");
+                String description = argument.description();
+                if (!argument.required()) {
+                    Object o = actionMeta.getDefaultValue(action, argument);
+                    String defaultValue = actionMeta.getDefaultValueString(o);
+                    if (defaultValue != null) {
+                        description += " (defaults to " + o.toString() + ")";
+                    }
+                }
+                out.println("      <td>" + description + "</td>");
+                out.println("    </tr>");
+            }
+
+            out.println("    </informaltable>");
+            out.println("  </section>");
+        }
+
+        if (options.size() > 0) {
+            out.println("  <section>");
+            out.println("    <title>Options</title>");
+            out.println("    <informaltable>");
+
+            for (Option option : options) {
+                String opt = option.name();
+                String description = option.description();
+                for (String alias : option.aliases()) {
+                    opt += ", " + alias;
+                }
+                Object o = actionMeta.getDefaultValue(action, option);
+                String defaultValue = actionMeta.getDefaultValueString(o);
+                if (defaultValue != null) {
+                    description += " (defaults to " + o.toString() + ")";
+                }
+                out.println("    <tr>");
+                out.println("      <td>" + opt + "</td>");
+                out.println("      <td>" + description + "</td>");
+                out.println("    </tr>");
+            }
+
+            out.println("    </informaltable>");
+            out.println("  </section>");
+        }
+
+        String desc = actionMeta.getDetailedDescription();
+        if (desc != null) {
+            out.println("  <section>");
+            out.println("    <title>Details</title>");
+            out.println("    <para>");
+            out.println(desc);
+            out.println("    </para>");
+            out.println("  </section>");
+        }
+        out.println("</section>");
+    }
+
+    @Override
+    public void printOverview(Map<String, Set<String>> commands, PrintStream writer) {
+        writer.println("<chapter id='commands' xmlns:xi=\"http://www.w3.org/2001/XInclude\">");
+        writer.println("  <title>Commands</title>");
+        writer.println("  <toc></toc>");
+        for (String key : commands.keySet()) {
+            writer.println("  <section id='commands-" + key + "'>");
+            writer.println("    <title>" + key + "</title>");
+            for (String cmd : commands.get(key)) {
+                writer.println("    <xi:include href='" + key + "-" + cmd + ".xml' parse='xml'/>");
+            }
+            writer.println("  </section>");
+        }
+        writer.println("</chapter>");
+    }
+
+}

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/DocBookCommandHelpPrinter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/GenerateHelpMojo.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/GenerateHelpMojo.java?rev=1508327&r1=1508326&r2=1508327&view=diff
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/GenerateHelpMojo.java (original)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/GenerateHelpMojo.java Tue Jul 30 07:27:39 2013
@@ -17,19 +17,13 @@
  */
 package org.apache.karaf.tooling.commands;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintStream;
-import java.io.Writer;
-import java.lang.reflect.Field;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,13 +31,10 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.apache.karaf.shell.commands.Action;
-import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.HelpOption;
-import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.commands.meta.ActionMetaData;
 import org.apache.karaf.shell.commands.meta.ActionMetaDataFactory;
-import org.apache.karaf.shell.util.ShellUtil;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -80,12 +71,13 @@ public class GenerateHelpMojo extends Ab
     /**
      * The output format
      *
-     * @parameter default-value="docbx";
+     * @parameter default-value="docbx" expression="${format}"
      */
     protected String format;
 
     /**
-     * The classloader to use for loading the commands
+     * The classloader to use for loading the commands.
+     * Can be "project" or "plugin"
      *
      * @parameter default-value="project"
      */
@@ -110,46 +102,34 @@ public class GenerateHelpMojo extends Ab
                 targetFolder.mkdirs();
             }
 
-            ClassFinder finder;
-            if ("project".equals(classLoader)) {
-                List<URL> urls = new ArrayList<URL>();
-                for (Object object : project.getCompileClasspathElements()) {
-                    String path = (String) object;
-                    urls.add(new File(path).toURI().toURL());
-                }
-                ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
-                finder = new ClassFinder(loader, urls);
-            } else if ("plugin".equals(classLoader)) {
-                finder = new ClassFinder(getClass().getClassLoader());
-            } else {
-                throw new MojoFailureException("classLoader attribute must be 'project' or 'plugin'");
-            }
+            ClassFinder finder = createFinder(classLoader);
             List<Class<?>> classes = finder.findAnnotatedClasses(Command.class);
             if (classes.isEmpty()) {
                 throw new MojoFailureException("No command found");
             }
+            
+            CommandHelpPrinter helpPrinter = FORMAT_DOCBX.equals(format) 
+                ? new DocBookCommandHelpPrinter()
+                : new UserConfCommandHelpPrinter();
 
             Map<String, Set<String>> commands = new TreeMap<String, Set<String>>();
 
-            for (Class clazz : classes) {
+            String commandSuffix = FORMAT_DOCBX.equals(format) ? "xml" : "conf"; 
+            for (Class<?> clazz : classes) {
                 try {
                     Action action = (Action) clazz.newInstance();
                     ActionMetaData meta = new ActionMetaDataFactory().create(action.getClass());
-                    String help = printHelp(action, meta, format, includeHelpOption);
                     Command cmd = meta.getCommand();
-                    File output = null;
 
                     // skip the *-help command
                     if (cmd.scope().equals("*")) continue;
 
-                    if (FORMAT_DOCBX.equals(format)) {
-                        output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + ".xml");
-                    } else if (FORMAT_CONF.equals(format)) {
-                        output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + ".conf");
-                    }
-                    Writer writer = new OutputStreamWriter(new FileOutputStream(output));
-                    writer.write(help);
-                    writer.close();
+                    File output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + "." + commandSuffix);
+                    FileOutputStream outStream = new FileOutputStream(output);
+                    PrintStream out = new PrintStream(outStream);
+                    helpPrinter.printHelp(action, meta, out, includeHelpOption);
+                    out.close();
+                    outStream.close();
 
                     Set<String> cmds = commands.get(cmd.scope());
                     if (cmds == null) {
@@ -163,264 +143,32 @@ public class GenerateHelpMojo extends Ab
                 }
             }
 
-            if (FORMAT_DOCBX.equals(format)) {
-                PrintStream writer = new PrintStream(new FileOutputStream(new File(targetFolder, "commands.xml")));
-                writer.println("<chapter id='commands' xmlns:xi=\"http://www.w3.org/2001/XInclude\">");
-                writer.println("  <title>Commands</title>");
-                writer.println("  <toc></toc>");
-                for (String key : commands.keySet()) {
-                    writer.println("  <section id='commands-" + key + "'>");
-                    writer.println("    <title>" + key + "</title>");
-                    for (String cmd : commands.get(key)) {
-                        writer.println("    <xi:include href='" + key + "-" + cmd + ".xml' parse='xml'/>");
-                    }
-                    writer.println("  </section>");
-                }
-                writer.println("</chapter>");
-                writer.close();
-            } else if (FORMAT_CONF.equals(format)) {
-                PrintStream writer = new PrintStream(new FileOutputStream(new File(targetFolder, "commands.conf")));
-                writer.println("h1. Commands");
-                writer.println();
-                for (String key : commands.keySet()) {
-                    writer.println("h2. " + key);
-                    writer.println();
-                    for (String cmd : commands.get(key)) {
-                        writer.println("* [" + key + ":" + cmd + "|" + key + "-" + cmd + "]");
-                    }
-                    writer.println();
-                }
-                writer.close();
-            }
-
+            String overViewSuffix = FORMAT_DOCBX.equals(format) ? "xml" : "conf";
+            PrintStream writer = new PrintStream(new FileOutputStream(new File(targetFolder, "commands." + overViewSuffix)));
+            helpPrinter.printOverview(commands, writer);
+            writer.close();
         } catch (Exception e) {
             throw new MojoExecutionException("Error building commands help", e);
         }
     }
 
-    public String printHelp(Action action, ActionMetaData meta, String format, boolean includeHelpOption) throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintStream newout = new PrintStream(baos);
-        
-        if (FORMAT_DOCBX.equals(format)) {
-            printUsageDocBook(action, meta, newout, includeHelpOption);
+    private ClassFinder createFinder(String classloaderType) throws DependencyResolutionRequiredException, MalformedURLException,
+        Exception, MojoFailureException {
+        ClassFinder finder;
+        if ("project".equals(classloaderType)) {
+            List<URL> urls = new ArrayList<URL>();
+            for (Object object : project.getCompileClasspathElements()) {
+                String path = (String) object;
+                urls.add(new File(path).toURI().toURL());
+            }
+            ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
+            finder = new ClassFinder(loader, urls);
+        } else if ("plugin".equals(classLoader)) {
+            finder = new ClassFinder(getClass().getClassLoader());
         } else {
-            printUsageConf(action, meta, newout, includeHelpOption);
+            throw new MojoFailureException("classLoader attribute must be 'project' or 'plugin'");
         }
-
-        meta.printUsage(action, newout, false, 80);
-        newout.close();
-        baos.close();
-        return baos.toString();
+        return finder;
     }
 
-    private void printUsageConf(Action action, ActionMetaData actionMeta, PrintStream out, boolean includeHelpOption) {
-        Map<Option, Field> optionsMap = actionMeta.getOptions();
-        Map<Argument, Field> argsMap = actionMeta.getArguments();
-        Command command = action.getClass().getAnnotation(Command.class);
-        List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
-        Collections.sort(arguments, new Comparator<Argument>() {
-            public int compare(Argument o1, Argument o2) {
-                return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
-            }
-        });
-        Set<Option> options = new HashSet<Option>(optionsMap.keySet());
-        if (includeHelpOption)
-            options.add(HelpOption.HELP);
-
-        out.println("<section>");
-        out.print("  <title>");
-        out.print(command.scope());
-        out.print(":");
-        out.print(command.name());
-        out.println("</title>");
-        out.println("  <section>");
-        out.println("    <title>Description</title>");
-        out.println("    <para>");
-        out.println(command.description());
-        out.println("    </para>");
-        out.println("  </section>");
-
-        StringBuffer syntax = new StringBuffer();
-        syntax.append(String.format("%s:%s", command.scope(), command.name()));
-        if (options.size() > 0) {
-            syntax.append(" [options]");
-        }
-        if (arguments.size() > 0) {
-            syntax.append(' ');
-            for (Argument argument : arguments) {
-                syntax.append(String.format(argument.required() ? "%s " : "[%s] ", argument.name()));
-            }
-        }
-        out.println("  <section>");
-        out.println("    <title>Syntax</title>");
-        out.println("    <para>");
-        out.println(syntax.toString());
-        out.println("    </para>");
-        out.println("  </section>");
-
-        if (arguments.size() > 0) {
-            out.println("  <section>");
-            out.println("    <title>Arguments</title>");
-            out.println("    <informaltable>");
-            for (Argument argument : arguments) {
-                out.println("    <tr>");
-                out.println("      <td>" + argument.name() + "</td>");
-                String description = argument.description();
-                if (!argument.required()) {
-                    try {
-                        argsMap.get(argument).setAccessible(true);
-                        Object o = argsMap.get(argument).get(action);
-                        if (o != null && (!(o instanceof Boolean) || ((Boolean) o))
-                                && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
-                            description += " (defaults to " + o.toString() + ")";
-                        }
-                    } catch (Exception e) {
-                        // Ignore
-                    }
-                }
-                out.println("      <td>" + description + "</td>");
-                out.println("    </tr>");
-            }
-
-            out.println("    </informaltable>");
-            out.println("  </section>");
-        }
-        if (options.size() > 0) {
-            out.println("  <section>");
-            out.println("    <title>Options</title>");
-            out.println("    <informaltable>");
-
-            for (Option option : options) {
-                String opt = option.name();
-                String description = option.description();
-                for (String alias : option.aliases()) {
-                    opt += ", " + alias;
-                }
-                try {
-                    optionsMap.get(option).get(action);
-                    Object o = optionsMap.get(option).get(action);
-                    if (o != null && (!(o instanceof Boolean) || ((Boolean) o))
-                            && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
-                        description += " (defaults to " + o.toString() + ")";
-                    }
-
-                } catch (Exception e) {
-
-                }
-                out.println("    <tr>");
-                out.println("      <td>" + opt + "</td>");
-                out.println("      <td>" + description + "</td>");
-                out.println("    </tr>");
-            }
-
-            out.println("    </informaltable>");
-            out.println("  </section>");
-
-            if (command.detailedDescription() != null && command.detailedDescription().trim().length() > 0) {
-                out.println("<section>");
-                out.println("   <title>Details</title>");
-                String description = loadDescription(action.getClass(), command.detailedDescription());
-                out.println("   <para>");
-
-            }
-        }
-        out.println("</section>");
-    }
-
-    private void printUsageDocBook(Action action, ActionMetaData actionMeta, PrintStream out, boolean includeHelpOption) {
-        Map<Option, Field> optionsMap = actionMeta.getOptions();
-        Map<Argument, Field> argsMap = actionMeta.getArguments();
-        Command command = actionMeta.getCommand();
-        List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
-        Collections.sort(arguments, new Comparator<Argument>() {
-            public int compare(Argument o1, Argument o2) {
-                return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
-            }
-        });
-        Set<Option> options = new HashSet<Option>(optionsMap.keySet());
-        if (includeHelpOption)
-            options.add(HelpOption.HELP);
-
-        out.println("h1. " + command.scope() + ":" + command.name());
-        out.println();
-
-        out.println("h2. Description");
-        out.println(command.description());
-        out.println();
-
-        StringBuffer syntax = new StringBuffer();
-        syntax.append(String.format("%s:%s", command.scope(), command.name()));
-        if (options.size() > 0) {
-            syntax.append(" \\[options\\]");
-        }
-        if (arguments.size() > 0) {
-            syntax.append(' ');
-            for (Argument argument : arguments) {
-                syntax.append(String.format(argument.required() ? "%s " : "\\[%s\\] ", argument.name()));
-            }
-        }
-        out.println("h2. Syntax");
-        out.println(syntax.toString());
-        out.println();
-
-        if (arguments.size() > 0) {
-            out.println("h2. Arguments");
-            out.println("|| Name || Description ||");
-            for (Argument argument : arguments) {
-                String description = argument.description();
-                if (!argument.required()) {
-                    try {
-                        argsMap.get(argument).setAccessible(true);
-                        Object o = argsMap.get(argument).get(action);
-                        if (o != null && (!(o instanceof Boolean) || ((Boolean) o))
-                                && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
-                            description += " (defaults to " + o.toString() + ")";
-                        }
-                    } catch (Throwable t) {
-                        // Ignore
-                    }
-                }
-                out.println("| " + argument.name() + " | " + description + " |");
-            }
-            out.println();
-        }
-        if (options.size() > 0) {
-            out.println("h2. Options");
-            out.println("|| Name || Description ||");
-            for (Option option : options) {
-                String opt = option.name();
-                String desc = option.description();
-                for (String alias : option.aliases()) {
-                    opt += ", " + alias;
-                }
-                try {
-                    optionsMap.get(option).setAccessible(true);
-                    Object o = optionsMap.get(option).get(action);
-                    if (o != null && (!(o instanceof Boolean) || ((Boolean) o))
-                            && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
-                        desc += " (defaults to " + o.toString() + ")";
-                    }
-                } catch (Throwable t) {
-                    // Ignore
-                }
-                out.println("| " + opt + " | " + desc + " |");
-            }
-            out.println();
-        }
-        if (command.detailedDescription().length() > 0) {
-            out.println("h2. Details");
-            String desc = loadDescription(action.getClass(), command.detailedDescription());
-            out.println(desc);
-        }
-        out.println();
-    }
-
-    private String loadDescription(Class clazz, String desc) {
-        if (desc.startsWith("classpath:")) {
-            desc = ShellUtil.loadClassPathResource(clazz, desc.substring("classpath:".length()));
-        }
-        return desc;
-    }
-            
 }

Added: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java?rev=1508327&view=auto
==============================================================================
--- karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java (added)
+++ karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java Tue Jul 30 07:27:39 2013
@@ -0,0 +1,136 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.tooling.commands;
+
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.karaf.shell.commands.Action;
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.HelpOption;
+import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.commands.meta.ActionMetaData;
+
+/**
+ * Prints documentation in wiki syntax
+ */
+public class UserConfCommandHelpPrinter implements CommandHelpPrinter {
+
+    @Override
+    public void printHelp(Action action, ActionMetaData actionMeta, PrintStream out, boolean includeHelpOption) {
+        Map<Option, Field> optionsMap = actionMeta.getOptions();
+        Map<Argument, Field> argsMap = actionMeta.getArguments();
+        Command command = actionMeta.getCommand();
+        List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
+        Collections.sort(arguments, new Comparator<Argument>() {
+            public int compare(Argument o1, Argument o2) {
+                return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
+            }
+        });
+        Set<Option> options = new HashSet<Option>(optionsMap.keySet());
+        if (includeHelpOption)
+            options.add(HelpOption.HELP);
+
+        out.println("h1. " + command.scope() + ":" + command.name());
+        out.println();
+
+        out.println("h2. Description");
+        out.println(command.description());
+        out.println();
+
+        StringBuffer syntax = new StringBuffer();
+        syntax.append(String.format("%s:%s", command.scope(), command.name()));
+        if (options.size() > 0) {
+            syntax.append(" \\[options\\]");
+        }
+        if (arguments.size() > 0) {
+            syntax.append(' ');
+            for (Argument argument : arguments) {
+                syntax.append(String.format(argument.required() ? "%s " : "\\[%s\\] ", argument.name()));
+            }
+        }
+        out.println("h2. Syntax");
+        out.println(syntax.toString());
+        out.println();
+
+        if (arguments.size() > 0) {
+            out.println("h2. Arguments");
+            out.println("|| Name || Description ||");
+            for (Argument argument : arguments) {
+                String description = argument.description();
+                if (!argument.required()) {
+                    Object o = actionMeta.getDefaultValue(action, argument);
+                    String defaultValue = actionMeta.getDefaultValueString(o);
+                    if (defaultValue != null) {
+                        description += " (defaults to " + o.toString() + ")";
+                    }
+                }
+                out.println("| " + argument.name() + " | " + description + " |");
+            }
+            out.println();
+        }
+        if (options.size() > 0) {
+            out.println("h2. Options");
+            out.println("|| Name || Description ||");
+            for (Option option : options) {
+                String opt = option.name();
+                String desc = option.description();
+                for (String alias : option.aliases()) {
+                    opt += ", " + alias;
+                }
+                Object o = actionMeta.getDefaultValue(action, option);
+                String defaultValue = actionMeta.getDefaultValueString(o);
+                if (defaultValue != null) {
+                    desc += " (defaults to " + defaultValue + ")";
+                }
+                out.println("| " + opt + " | " + desc + " |");
+            }
+            out.println();
+        }
+        String detailedDesc = actionMeta.getDetailedDescription();
+        if (detailedDesc != null) {
+            out.println("h2. Details");
+            out.println(detailedDesc);
+        }
+        out.println();
+    }
+
+    @Override
+    public void printOverview(Map<String, Set<String>> commands, PrintStream writer) {
+        writer.println("h1. Commands");
+        writer.println();
+        for (String key : commands.keySet()) {
+            writer.println("h2. " + key);
+            writer.println();
+            for (String cmd : commands.get(key)) {
+                writer.println("* [" + key + ":" + cmd + "|" + key + "-" + cmd + "]");
+            }
+            writer.println();
+        }
+    }
+
+}

Propchange: karaf/trunk/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/commands/UserConfCommandHelpPrinter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain