KNOX-2341 - KnoxShell Custom Commands need Description and Usage Details (#313)

diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractKnoxShellCommand.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractKnoxShellCommand.java
index a24edad..e670035 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractKnoxShellCommand.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractKnoxShellCommand.java
@@ -27,11 +27,37 @@
 public abstract class AbstractKnoxShellCommand extends CommandSupport {
   static final String KNOXSQLHISTORY = "__knoxsqlhistory";
   protected static final String KNOXDATASOURCES = "__knoxdatasources";
+  private String description;
+  private String usage;
+  private String help;
 
   public AbstractKnoxShellCommand(Groovysh shell, String name, String shortcut) {
     super(shell, name, shortcut);
   }
 
+  public AbstractKnoxShellCommand(Groovysh shell, String name, String shortcut,
+      String desc, String usage, String help) {
+    super(shell, name, shortcut);
+    this.description = desc;
+    this.usage = usage;
+    this.help = help;
+  }
+
+  @Override
+  public String getDescription() {
+      return description;
+  }
+
+  @Override
+  public String getUsage() {
+    return usage;
+  }
+
+  @Override
+  public String getHelp() {
+    return help;
+  }
+
   protected String getBindingVariableNameForResultingTable(List<String> args) {
     String variableName = null;
     boolean nextOne = false;
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractSQLCommandSupport.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractSQLCommandSupport.java
index d39699f..47bed8a 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractSQLCommandSupport.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/AbstractSQLCommandSupport.java
@@ -40,6 +40,11 @@
     super(shell, name, shortcut);
   }
 
+  public AbstractSQLCommandSupport(Groovysh shell, String name, String shortcut, String desc, String usage,
+      String help) {
+    super(shell, name, shortcut, desc, usage, help);
+  }
+
   @SuppressWarnings("unchecked")
   protected Connection getConnectionFromSession(KnoxDataSource ds) {
     HashMap<String, Connection> connections =
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/CSVCommand.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/CSVCommand.java
index b8c3619..162d440 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/CSVCommand.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/CSVCommand.java
@@ -24,11 +24,13 @@
 import org.codehaus.groovy.tools.shell.Groovysh;
 
 public class CSVCommand extends AbstractKnoxShellCommand {
+  private static final String USAGE = ":csv [withHeaders] file-url||$variable-name [assign resulting-variable-name]";
+  private static final String DESC = "Build table from CSV file located at provided URL or KnoxShell $variable-name";
   private boolean withHeaders;
   private String url;
 
   public CSVCommand(Groovysh shell) {
-    super(shell, ":CSV", ":csv");
+    super(shell, ":CSV", ":csv", DESC, USAGE, DESC);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/DataSourceCommand.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/DataSourceCommand.java
index 4758df6..d063ac4 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/DataSourceCommand.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/DataSourceCommand.java
@@ -30,9 +30,11 @@
 import org.codehaus.groovy.tools.shell.Groovysh;
 
 public class DataSourceCommand extends AbstractSQLCommandSupport {
+  private static final String USAGE = ":ds (add|remove|select) [ds-name, connection-str, driver classname, authntype(none|basic)]";
+  private static final String DESC = "Datasource management commands. Persisted datasources maintain connection details across sessions";
 
   public DataSourceCommand(Groovysh shell) {
-    super(shell, ":datasources", ":ds");
+    super(shell, ":datasources", ":ds", DESC, USAGE, DESC);
   }
 
   @SuppressWarnings({"unchecked", "PMD.CloseResource"})
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/SelectCommand.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/SelectCommand.java
index d1de25e..6128e06 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/SelectCommand.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/SelectCommand.java
@@ -38,6 +38,8 @@
 import org.codehaus.groovy.tools.shell.Groovysh;
 
 public class SelectCommand extends AbstractSQLCommandSupport implements KeyListener {
+  private static final String USAGE = ":sql [assign resulting-variable-name]";
+  private static final String DESC = "Build table from SQL ResultSet";
 
   private static final String KNOXDATASOURCE = "__knoxdatasource";
   private JTextArea sqlField;
@@ -45,7 +47,7 @@
   private int historyIndex = -1;
 
   public SelectCommand(Groovysh shell) {
-    super(shell, ":SQL", ":sql");
+    super(shell, ":SQL", ":sql", DESC, USAGE, DESC);
   }
 
   @Override
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/WebHDFSCommand.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/WebHDFSCommand.java
index 4dafc27..f9f1731 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/WebHDFSCommand.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/commands/WebHDFSCommand.java
@@ -41,22 +41,21 @@
 import org.codehaus.groovy.tools.shell.Groovysh;
 
 public class WebHDFSCommand extends AbstractKnoxShellCommand {
+  private static final String DESC = "POSIX style commands for Hadoop Filesystems";
+  private static final String USAGE = "Usage: \n" +
+      "  :fs mounts \n" +
+      "  :fs mount target-topology-url mountpoint-name \n" +
+      "  :fs unmount mountpoint-name \n" +
+      "  :fs ls {target-path} \n" +
+      "  :fs cat {target-path} \n" +
+      "  :fs get {from-path} {to-path} \n" +
+      "  :fs put {from-path} {tp-path} \n" +
+      "  :fs rm {target-path} \n" +
+      "  :fs mkdir {dir-path} \n";
   private Map<String, KnoxSession> sessions = new HashMap<>();
 
   public WebHDFSCommand(Groovysh shell) {
-    super(shell, ":filesystem", ":fs");
-  }
-
-  @Override
-  public String getUsage() {
-    String usage = "Usage: \n" +
-                   "  :fs ls {target-path} \n" +
-                   "  :fs cat {target-path} \n" +
-                   "  :fs get {from-path} {to-path} \n" +
-                   "  :fs put {from-path} {tp-path} \n" +
-                   "  :fs rm {target-path} \n" +
-                   "  :fs mkdir {dir-path} \n";
-    return usage;
+    super(shell, ":filesystem", ":fs", DESC, USAGE, DESC);
   }
 
   @Override