You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2017/05/15 15:34:56 UTC

[2/2] geode git commit: GEODE-2880: fix help, hint, regionName, filePath value completions

GEODE-2880: fix help, hint, regionName, filePath value completions


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/2a272acc
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/2a272acc
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/2a272acc

Branch: refs/heads/develop
Commit: 2a272acc9396fa499fe93d08e6a2ef0ba5a4448d
Parents: 119f84b
Author: Jinmei Liao <ji...@pivotal.io>
Authored: Mon May 15 08:27:59 2017 -0700
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Mon May 15 08:32:56 2017 -0700

----------------------------------------------------------------------
 .../geode/management/cli/ConverterHint.java     |  33 +-
 .../management/internal/cli/CommandManager.java |  30 +-
 .../internal/cli/CommandManagerAware.java       |  20 +
 .../management/internal/cli/GfshParser.java     |  33 +-
 .../CreateAlterDestroyRegionCommands.java       |   6 +-
 .../internal/cli/commands/DataCommands.java     |  12 +-
 .../cli/commands/DiskStoreCommands.java         |   6 +-
 .../internal/cli/commands/FunctionCommands.java |   2 +-
 .../internal/cli/commands/GfshHelpCommands.java |  29 +-
 .../internal/cli/commands/IndexCommands.java    |   6 +-
 .../cli/commands/LauncherLifecycleCommands.java |  25 +-
 .../cli/commands/MiscellaneousCommands.java     |   4 +-
 .../internal/cli/commands/RegionCommands.java   |   2 +-
 .../internal/cli/commands/ShellCommands.java    |   2 +-
 .../cli/converters/DirPathConverter.java        | 143 ------
 .../cli/converters/DiskStoreNameConverter.java  |  31 +-
 .../cli/converters/FilePathConverter.java       | 111 +----
 .../cli/converters/FilePathStringConverter.java | 132 ++---
 .../internal/cli/converters/HelpConverter.java  |  69 +++
 .../cli/converters/HintTopicConverter.java      |  75 +++
 .../cli/converters/RegionPathConverter.java     |  52 +-
 .../management/internal/cli/help/Helper.java    |  63 ++-
 .../cli/GfshParserAutoCompletionTest.java       | 292 +++++++++++
 .../internal/cli/GfshParserConverterTest.java   | 218 +++++++++
 .../internal/cli/GfshParserIntegrationTest.java | 490 -------------------
 .../internal/cli/GfshParserParsingTest.java     | 193 ++++++++
 .../cli/help/HelperIntegrationTest.java         |  63 +++
 .../internal/cli/help/HelperUnitTest.java       |  11 +-
 .../internal/cli/LuceneIndexCommands.java       |   8 +-
 29 files changed, 1197 insertions(+), 964 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/cli/ConverterHint.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/cli/ConverterHint.java b/geode-core/src/main/java/org/apache/geode/management/cli/ConverterHint.java
index a4b30be..9c32559 100644
--- a/geode-core/src/main/java/org/apache/geode/management/cli/ConverterHint.java
+++ b/geode-core/src/main/java/org/apache/geode/management/cli/ConverterHint.java
@@ -23,23 +23,26 @@ import org.springframework.shell.core.annotation.CliOption;
  * @since GemFire 8.0
  */
 public interface ConverterHint {
-  public static final String DIR_PATHSTRING = "converter.hint.dir.path.string";
-  public static final String DISKSTORE_ALL = "converter.hint.cluster.diskstore";
-  public static final String FILE = "converter.hint.file";
-  public static final String FILE_PATHSTRING = "converter.hint.file.path.string";
-  public static final String HINTTOPIC = "converter.hint.gfsh.hint.topic";
-  public static final String MEMBERGROUP = "converter.hint.member.groups";
+  public static final String DISABLE_STRING_CONVERTER = ":disable-string-converter";
+  public static final String DISKSTORE =
+      "geode.converter.cluster.diskstore" + DISABLE_STRING_CONVERTER;
+  public static final String FILE = "geode.converter.file";
+  public static final String FILE_PATH = "geode.converter.file.path" + DISABLE_STRING_CONVERTER;
+  public static final String HINT = "geode.converter.hint" + DISABLE_STRING_CONVERTER;
+  public static final String HELP = "geode.converter.help" + DISABLE_STRING_CONVERTER;
+  public static final String MEMBERGROUP = "geode.converter.member.groups";
   /** Hint to be used for all types of GemFire cluster members */
-  public static final String ALL_MEMBER_IDNAME = "converter.hint.all.member.idOrName";
+  public static final String ALL_MEMBER_IDNAME = "geode.converter.all.member.idOrName";
   /** Hint to be used for all non locator GemFire cluster members */
-  public static final String MEMBERIDNAME = "converter.hint.member.idOrName";
+  public static final String MEMBERIDNAME = "geode.converter.member.idOrName";
   /** Hint to be used for GemFire stand-alone locator members */
-  public static final String LOCATOR_MEMBER_IDNAME = "converter.hint.locatormember.idOrName";
+  public static final String LOCATOR_MEMBER_IDNAME = "geode.converter.locatormember.idOrName";
   /** Hint to be used for configured locators for discovery */
-  public static final String LOCATOR_DISCOVERY_CONFIG = "converter.hint.locators.discovery.config";
-  public static final String REGIONPATH = "converter.hint.region.path";
-  public static final String INDEX_TYPE = "converter.hint.index.type";
-  public static final String GATEWAY_SENDER_ID = "converter.hint.gateway.senderid";
-  public static final String GATEWAY_RECEIVER_ID = "converter.hint.gateway.receiverid";
-  public static final String LOG_LEVEL = "converter.hint.log.levels:disable-string-converter";
+  public static final String LOCATOR_DISCOVERY_CONFIG = "geode.converter.locators.discovery.config";
+  public static final String REGION_PATH = "geode.converter.region.path" + DISABLE_STRING_CONVERTER;
+  public static final String INDEX_TYPE = "geode.converter.index.type";
+  public static final String GATEWAY_SENDER_ID = "geode.converter.gateway.senderid";
+  public static final String GATEWAY_RECEIVER_ID = "geode.converter.gateway.receiverid";
+  public static final String LOG_LEVEL = "geode.converter.log.levels" + DISABLE_STRING_CONVERTER;
+
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManager.java
index 24b07fa..0576e46 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManager.java
@@ -22,6 +22,7 @@ import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.management.internal.cli.help.Helper;
 import org.apache.geode.management.internal.cli.shell.Gfsh;
 import org.apache.geode.management.internal.cli.util.ClasspathScanLoadHelper;
+import org.springframework.shell.converters.SimpleFileConverter;
 import org.springframework.shell.core.CommandMarker;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
@@ -205,7 +206,9 @@ public class CommandManager {
           .loadAndGet("org.apache.geode.management.internal.cli.converters", Converter.class, true);
       for (Class<?> klass : foundClasses) {
         try {
-          add((Converter<?>) klass.newInstance());
+          Converter<?> object = (Converter<?>) klass.newInstance();
+          add(object);
+
         } catch (Exception e) {
           logWrapper.warning(
               "Could not load Converter from: " + klass + " due to " + e.getLocalizedMessage()); // continue
@@ -217,11 +220,13 @@ public class CommandManager {
       foundClasses = ClasspathScanLoadHelper.loadAndGet("org.springframework.shell.converters",
           Converter.class, true);
       for (Class<?> klass : foundClasses) {
-        try {
-          add((Converter<?>) klass.newInstance());
-        } catch (Exception e) {
-          logWrapper.warning(
-              "Could not load Converter from: " + klass + " due to " + e.getLocalizedMessage()); // continue
+        if (!SHL_CONVERTERS_TOSKIP.contains(klass)) {
+          try {
+            add((Converter<?>) klass.newInstance());
+          } catch (Exception e) {
+            logWrapper.warning(
+                "Could not load Converter from: " + klass + " due to " + e.getLocalizedMessage()); // continue
+          }
         }
       }
       raiseExceptionIfEmpty(foundClasses, "Basic Converters");
@@ -235,6 +240,13 @@ public class CommandManager {
     }
   }
 
+  /** Skip some of the Converters from Spring Shell for our customization */
+  private static List<Class> SHL_CONVERTERS_TOSKIP = new ArrayList();
+  static {
+    // skip springs SimpleFileConverter to use our own FilePathConverter
+    SHL_CONVERTERS_TOSKIP.add(SimpleFileConverter.class);
+  }
+
   public List<Converter<?>> getConverters() {
     return converters;
   }
@@ -249,6 +261,9 @@ public class CommandManager {
    * @param converter
    */
   void add(Converter<?> converter) {
+    if (CommandManagerAware.class.isAssignableFrom(converter.getClass())) {
+      ((CommandManagerAware) converter).setCommandManager(this);
+    }
     converters.add(converter);
   }
 
@@ -258,6 +273,9 @@ public class CommandManager {
    * @param commandMarker
    */
   void add(CommandMarker commandMarker) {
+    if (CommandManagerAware.class.isAssignableFrom(commandMarker.getClass())) {
+      ((CommandManagerAware) commandMarker).setCommandManager(this);
+    }
     commandMarkers.add(commandMarker);
     for (Method method : commandMarker.getClass().getMethods()) {
       CliCommand cliCommand = method.getAnnotation(CliCommand.class);

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManagerAware.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManagerAware.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManagerAware.java
new file mode 100644
index 0000000..0cda3ce
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandManagerAware.java
@@ -0,0 +1,20 @@
+/*
+ * 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.geode.management.internal.cli;
+
+public interface CommandManagerAware {
+  void setCommandManager(CommandManager commandManager);
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
index bc4db16..426b05b 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
@@ -16,6 +16,7 @@ package org.apache.geode.management.internal.cli;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.geode.internal.logging.LogService;
+import org.apache.logging.log4j.Logger;
 import org.springframework.shell.converters.ArrayConverter;
 import org.springframework.shell.core.CommandMarker;
 import org.springframework.shell.core.Completion;
@@ -28,7 +29,6 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Properties;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -47,17 +47,12 @@ public class GfshParser extends SimpleParser {
   public static final String COMMAND_DELIMITER = ";";
   public static final String CONTINUATION_CHARACTER = "\\";
 
-  // Make use of LogWrapper
-  private static final LogWrapper logWrapper = LogWrapper.getInstance();
-  private static final org.apache.logging.log4j.Logger logger = LogService.getLogger();
+  private static final Logger logger = LogService.getLogger();
 
   // pattern used to split the user input with whitespaces except those in quotes (single or double)
   private static Pattern PATTERN =
       Pattern.compile("\\s*([^\\s']*)'([^']*)'\\s+|\\s*([^\\s\"]*)\"([^\"]*)\"\\s+|\\S+");
-  /**
-   * Used for warning messages
-   */
-  private Logger consoleLogger;
+
 
   private CommandManager commandManager = null;
 
@@ -66,12 +61,6 @@ public class GfshParser extends SimpleParser {
   }
 
   public GfshParser(Properties cacheProperties) {
-    if (CliUtil.isGfshVM()) {
-      consoleLogger = Logger.getLogger(this.getClass().getCanonicalName());
-    } else {
-      consoleLogger = logWrapper.getLogger();
-    }
-
     this.commandManager = new CommandManager(cacheProperties);
 
     for (CommandMarker command : commandManager.getCommandMarkers()) {
@@ -282,7 +271,9 @@ public class GfshParser extends SimpleParser {
       // strip off the beginning part of the candidates from the cursor point
       potentials.replaceAll(
           completion -> new Completion(completion.getValue().substring(candidateBeginAt)));
-    } else {
+    }
+    // if the completed values are option, and the userInput doesn't ends with an "=" sign,
+    else if (!userInput.endsWith("=")) {
       // these potentials do not have "=" in front of them, manually add them
       potentials.replaceAll(completion -> new Completion("=" + completion.getValue()));
     }
@@ -322,16 +313,4 @@ public class GfshParser extends SimpleParser {
     candidates.replaceAll(completion -> new Completion(completion.getValue().trim()));
     return candidates;
   }
-
-  @Override
-  public void obtainHelp(String command) {
-    if (StringUtils.isBlank(command))
-      super.obtainHelp(command);
-    else
-      consoleLogger.info(commandManager.obtainHelp(command));
-  }
-
-  public void obtainHint(String topic) {
-    consoleLogger.info(commandManager.obtainHint(topic));
-  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
index c4455ad..fb292d2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
@@ -119,7 +119,7 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.CREATE_REGION__REGIONSHORTCUT__HELP) RegionShortcut regionShortcut,
       @CliOption(key = CliStrings.CREATE_REGION__USEATTRIBUTESFROM,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.CREATE_REGION__USEATTRIBUTESFROM__HELP) String useAttributesFrom,
       @CliOption(key = CliStrings.CREATE_REGION__GROUP, optionContext = ConverterHint.MEMBERGROUP,
@@ -140,7 +140,7 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.CREATE_REGION__CACHEWRITER,
           help = CliStrings.CREATE_REGION__CACHEWRITER__HELP) String cacheWriter,
       @CliOption(key = CliStrings.CREATE_REGION__COLOCATEDWITH,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.CREATE_REGION__COLOCATEDWITH__HELP) String prColocatedWith,
       @CliOption(key = CliStrings.CREATE_REGION__COMPRESSOR,
@@ -1036,7 +1036,7 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
   @CliMetaData(shellOnly = false, relatedTopic = CliStrings.TOPIC_GEODE_REGION)
   @ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
   public Result destroyRegion(
-      @CliOption(key = CliStrings.DESTROY_REGION__REGION, optionContext = ConverterHint.REGIONPATH,
+      @CliOption(key = CliStrings.DESTROY_REGION__REGION, optionContext = ConverterHint.REGION_PATH,
           mandatory = true, help = CliStrings.DESTROY_REGION__REGION__HELP) String regionPath) {
 
     if (regionPath == null) {

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
index 29d68bd..51ce318 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DataCommands.java
@@ -775,7 +775,7 @@ public class DataCommands implements CommandMarker {
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DATA, CliStrings.TOPIC_GEODE_REGION})
   public Result exportData(
       @CliOption(key = CliStrings.EXPORT_DATA__REGION, mandatory = true,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.EXPORT_DATA__REGION__HELP) String regionName,
       @CliOption(key = CliStrings.EXPORT_DATA__FILE,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE, mandatory = true,
@@ -832,7 +832,7 @@ public class DataCommands implements CommandMarker {
   @CliCommand(value = CliStrings.IMPORT_DATA, help = CliStrings.IMPORT_DATA__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_DATA, CliStrings.TOPIC_GEODE_REGION})
   public Result importData(
-      @CliOption(key = CliStrings.IMPORT_DATA__REGION, optionContext = ConverterHint.REGIONPATH,
+      @CliOption(key = CliStrings.IMPORT_DATA__REGION, optionContext = ConverterHint.REGION_PATH,
           mandatory = true, help = CliStrings.IMPORT_DATA__REGION__HELP) String regionName,
       @CliOption(key = CliStrings.IMPORT_DATA__FILE, mandatory = true,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
@@ -900,7 +900,7 @@ public class DataCommands implements CommandMarker {
           help = CliStrings.PUT__VALUE__HELP) String value,
       @CliOption(key = {CliStrings.PUT__REGIONNAME}, mandatory = true,
           help = CliStrings.PUT__REGIONNAME__HELP,
-          optionContext = ConverterHint.REGIONPATH) String regionPath,
+          optionContext = ConverterHint.REGION_PATH) String regionPath,
       @CliOption(key = {CliStrings.PUT__KEYCLASS},
           help = CliStrings.PUT__KEYCLASS__HELP) String keyClass,
       @CliOption(key = {CliStrings.PUT__VALUEKLASS},
@@ -968,7 +968,7 @@ public class DataCommands implements CommandMarker {
           help = CliStrings.GET__KEY__HELP) String key,
       @CliOption(key = {CliStrings.GET__REGIONNAME}, mandatory = true,
           help = CliStrings.GET__REGIONNAME__HELP,
-          optionContext = ConverterHint.REGIONPATH) String regionPath,
+          optionContext = ConverterHint.REGION_PATH) String regionPath,
       @CliOption(key = {CliStrings.GET__KEYCLASS},
           help = CliStrings.GET__KEYCLASS__HELP) String keyClass,
       @CliOption(key = {CliStrings.GET__VALUEKLASS},
@@ -1031,7 +1031,7 @@ public class DataCommands implements CommandMarker {
           help = CliStrings.LOCATE_ENTRY__KEY__HELP) String key,
       @CliOption(key = {CliStrings.LOCATE_ENTRY__REGIONNAME}, mandatory = true,
           help = CliStrings.LOCATE_ENTRY__REGIONNAME__HELP,
-          optionContext = ConverterHint.REGIONPATH) String regionPath,
+          optionContext = ConverterHint.REGION_PATH) String regionPath,
       @CliOption(key = {CliStrings.LOCATE_ENTRY__KEYCLASS},
           help = CliStrings.LOCATE_ENTRY__KEYCLASS__HELP) String keyClass,
       @CliOption(key = {CliStrings.LOCATE_ENTRY__VALUEKLASS},
@@ -1083,7 +1083,7 @@ public class DataCommands implements CommandMarker {
           specifiedDefaultValue = "") String key,
       @CliOption(key = {CliStrings.REMOVE__REGION}, mandatory = true,
           help = CliStrings.REMOVE__REGION__HELP,
-          optionContext = ConverterHint.REGIONPATH) String regionPath,
+          optionContext = ConverterHint.REGION_PATH) String regionPath,
       @CliOption(key = CliStrings.REMOVE__ALL, help = CliStrings.REMOVE__ALL__HELP,
           specifiedDefaultValue = "true", unspecifiedDefaultValue = "false") boolean removeAllKeys,
       @CliOption(key = {CliStrings.REMOVE__KEYCLASS},

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommands.java
index a96d3c2..460e1d1 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DiskStoreCommands.java
@@ -294,7 +294,7 @@ public class DiskStoreCommands extends AbstractCommandsSupport {
   @ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
   public Result createDiskStore(
       @CliOption(key = CliStrings.CREATE_DISK_STORE__NAME, mandatory = true,
-          optionContext = ConverterHint.DISKSTORE_ALL,
+          optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.CREATE_DISK_STORE__NAME__HELP) String name,
       @CliOption(key = CliStrings.CREATE_DISK_STORE__ALLOW_FORCE_COMPACTION,
           specifiedDefaultValue = "true", unspecifiedDefaultValue = "false",
@@ -418,7 +418,7 @@ public class DiskStoreCommands extends AbstractCommandsSupport {
   @ResourceOperation(resource = Resource.DATA, operation = Operation.MANAGE)
   public Result compactDiskStore(
       @CliOption(key = CliStrings.COMPACT_DISK_STORE__NAME, mandatory = true,
-          optionContext = ConverterHint.DISKSTORE_ALL,
+          optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.COMPACT_DISK_STORE__NAME__HELP) String diskStoreName,
       @CliOption(key = CliStrings.COMPACT_DISK_STORE__GROUP,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
@@ -872,7 +872,7 @@ public class DiskStoreCommands extends AbstractCommandsSupport {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.DESCRIBE_DISK_STORE__MEMBER__HELP) final String memberName,
       @CliOption(key = CliStrings.DESCRIBE_DISK_STORE__NAME, mandatory = true,
-          optionContext = ConverterHint.DISKSTORE_ALL,
+          optionContext = ConverterHint.DISKSTORE,
           help = CliStrings.DESCRIBE_DISK_STORE__NAME__HELP) final String diskStoreName) {
     try {
       return toCompositeResult(getDiskStoreDescription(memberName, diskStoreName));

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/FunctionCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/FunctionCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/FunctionCommands.java
index e21a334..1c37807 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/FunctionCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/FunctionCommands.java
@@ -94,7 +94,7 @@ public class FunctionCommands implements CommandMarker {
           help = CliStrings.EXECUTE_FUNCTION__ONMEMBER__HELP) String onMember,
       @CliOption(key = CliStrings.EXECUTE_FUNCTION__ONREGION,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.EXECUTE_FUNCTION__ONREGION__HELP) String onRegion,
       @CliOption(key = CliStrings.EXECUTE_FUNCTION__ARGUMENTS,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GfshHelpCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GfshHelpCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GfshHelpCommands.java
index 29e6bae..da13cdf 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GfshHelpCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GfshHelpCommands.java
@@ -16,8 +16,11 @@ package org.apache.geode.management.internal.cli.commands;
 
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
+import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.CommandManager;
+import org.apache.geode.management.internal.cli.CommandManagerAware;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.apache.geode.management.internal.cli.result.ResultBuilder;
 import org.springframework.shell.core.CommandMarker;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
@@ -25,20 +28,28 @@ import org.springframework.shell.core.annotation.CliOption;
 /**
  * @since GemFire 7.0
  */
-public class GfshHelpCommands implements CommandMarker {
+public class GfshHelpCommands implements CommandMarker, CommandManagerAware {
+  private CommandManager commandManager = null;
+
+  public void setCommandManager(CommandManager commandManager) {
+    this.commandManager = commandManager;
+  }
+
   @CliCommand(value = CliStrings.HELP, help = CliStrings.HELP__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_HELP})
-  public void obtainHelp(@CliOption(key = {"", CliStrings.SH__COMMAND},
-      help = "Command name to provide help for") String buffer) {
-    Gfsh.getCurrentInstance().getGfshParser().obtainHelp(buffer);
+  public Result obtainHelp(
+      @CliOption(key = {"", CliStrings.SH__COMMAND}, optionContext = ConverterHint.HELP,
+          help = "Command name to provide help for") String buffer) {
+
+    return ResultBuilder.createInfoResult(commandManager.obtainHelp(buffer));
   }
 
   @CliCommand(value = CliStrings.HINT, help = CliStrings.HINT__HELP)
   @CliMetaData(shellOnly = true, relatedTopic = {CliStrings.TOPIC_GEODE_HELP})
-  public void hint(
-      @CliOption(key = {"", CliStrings.HINT__TOPICNAME}, optionContext = ConverterHint.HINTTOPIC,
-          help = CliStrings.HINT__TOPICNAME) String topicName) {
-    Gfsh.getCurrentInstance().getGfshParser().obtainHint(topicName);
+  public Result hint(@CliOption(key = {"", CliStrings.HINT__TOPICNAME},
+      optionContext = ConverterHint.HINT, help = CliStrings.HINT__TOPICNAME) String topicName) {
+
+    return ResultBuilder.createInfoResult(commandManager.obtainHint(topicName));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/IndexCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/IndexCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/IndexCommands.java
index 080d520..005c98b 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/IndexCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/IndexCommands.java
@@ -181,7 +181,7 @@ public class IndexCommands extends AbstractCommandsSupport {
           help = CliStrings.CREATE_INDEX__EXPRESSION__HELP) final String indexedExpression,
 
       @CliOption(key = CliStrings.CREATE_INDEX__REGION, mandatory = true,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.CREATE_INDEX__REGION__HELP) String regionPath,
 
       @CliOption(key = CliStrings.CREATE_INDEX__MEMBER, mandatory = false,
@@ -330,7 +330,7 @@ public class IndexCommands extends AbstractCommandsSupport {
       help = CliStrings.DESTROY_INDEX__NAME__HELP) final String indexName,
 
       @CliOption(key = CliStrings.DESTROY_INDEX__REGION, mandatory = false,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.DESTROY_INDEX__REGION__HELP) final String regionPath,
 
       @CliOption(key = CliStrings.DESTROY_INDEX__MEMBER, mandatory = false,
@@ -472,7 +472,7 @@ public class IndexCommands extends AbstractCommandsSupport {
           help = CliStrings.DEFINE_INDEX__EXPRESSION__HELP) final String indexedExpression,
 
       @CliOption(key = CliStrings.DEFINE_INDEX__REGION, mandatory = true,
-          optionContext = ConverterHint.REGIONPATH,
+          optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.DEFINE_INDEX__REGION__HELP) String regionPath,
 
       @CliOption(key = CliStrings.DEFINE_INDEX__TYPE, mandatory = false,

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommands.java
index b3de975..d61e72d 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LauncherLifecycleCommands.java
@@ -224,15 +224,15 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.START_LOCATOR__PORT,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_LOCATOR__PORT__HELP) final Integer port,
-      @CliOption(key = CliStrings.START_LOCATOR__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.START_LOCATOR__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_LOCATOR__DIR__HELP) String workingDirectory,
       @CliOption(key = CliStrings.START_LOCATOR__PROPERTIES,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+          optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_LOCATOR__PROPERTIES__HELP) String gemfirePropertiesPathname,
       @CliOption(key = CliStrings.START_LOCATOR__SECURITY_PROPERTIES,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+          optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_LOCATOR__SECURITY_PROPERTIES__HELP) String gemfireSecurityPropertiesPathname,
       @CliOption(key = CliStrings.START_LOCATOR__INITIALHEAP,
@@ -774,7 +774,7 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.STATUS_LOCATOR__PID,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STATUS_LOCATOR__PID__HELP) final Integer pid,
-      @CliOption(key = CliStrings.STATUS_LOCATOR__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.STATUS_LOCATOR__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STATUS_LOCATOR__DIR__HELP) final String workingDirectory) {
     try {
@@ -829,7 +829,7 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.STOP_LOCATOR__PID,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STOP_LOCATOR__PID__HELP) final Integer pid,
-      @CliOption(key = CliStrings.STOP_LOCATOR__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.STOP_LOCATOR__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STOP_LOCATOR__DIR__HELP) final String workingDirectory) {
     LocatorState locatorState;
@@ -1297,11 +1297,11 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__BIND_ADDRESS__HELP) final String bindAddress,
       @CliOption(key = CliStrings.START_SERVER__CACHE_XML_FILE,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+          optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__CACHE_XML_FILE__HELP) String cacheXmlPathname,
       @CliOption(key = CliStrings.START_SERVER__CLASSPATH,
-          /* optionContext = ConverterHint.FILE_PATHSTRING, // there's an issue with TAB here */
+          /* optionContext = ConverterHint.FILE_PATH, // there's an issue with TAB here */
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__CLASSPATH__HELP) final String classpath,
       @CliOption(key = CliStrings.START_SERVER__CRITICAL__HEAP__PERCENTAGE,
@@ -1310,7 +1310,7 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.START_SERVER__CRITICAL_OFF_HEAP_PERCENTAGE,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__CRITICAL_OFF_HEAP__HELP) final Float criticalOffHeapPercentage,
-      @CliOption(key = CliStrings.START_SERVER__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.START_SERVER__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__DIR__HELP) String workingDirectory,
       @CliOption(key = CliStrings.START_SERVER__DISABLE_DEFAULT_SERVER,
@@ -1403,15 +1403,14 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.START_SERVER__OFF_HEAP_MEMORY_SIZE,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__OFF_HEAP_MEMORY_SIZE__HELP) final String offHeapMemorySize,
-      @CliOption(key = CliStrings.START_SERVER__PROPERTIES,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+      @CliOption(key = CliStrings.START_SERVER__PROPERTIES, optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__PROPERTIES__HELP) String gemfirePropertiesPathname,
       @CliOption(key = CliStrings.START_SERVER__REBALANCE, unspecifiedDefaultValue = "false",
           specifiedDefaultValue = "true",
           help = CliStrings.START_SERVER__REBALANCE__HELP) final Boolean rebalance,
       @CliOption(key = CliStrings.START_SERVER__SECURITY_PROPERTIES,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+          optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.START_SERVER__SECURITY_PROPERTIES__HELP) String gemfireSecurityPropertiesPathname,
       @CliOption(key = CliStrings.START_SERVER__SERVER_BIND_ADDRESS,
@@ -1853,7 +1852,7 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.STATUS_SERVER__PID,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STATUS_SERVER__PID__HELP) final Integer pid,
-      @CliOption(key = CliStrings.STATUS_SERVER__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.STATUS_SERVER__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STATUS_SERVER__DIR__HELP) final String workingDirectory) {
     try {
@@ -1911,7 +1910,7 @@ public class LauncherLifecycleCommands extends AbstractCommandsSupport {
       @CliOption(key = CliStrings.STOP_SERVER__PID,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STOP_SERVER__PID__HELP) final Integer pid,
-      @CliOption(key = CliStrings.STOP_SERVER__DIR, optionContext = ConverterHint.DIR_PATHSTRING,
+      @CliOption(key = CliStrings.STOP_SERVER__DIR,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.STOP_SERVER__DIR__HELP) final String workingDirectory) {
     ServerState serverState;

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
index b5fb9fe..e543c74 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/MiscellaneousCommands.java
@@ -405,7 +405,7 @@ public class MiscellaneousCommands implements CommandMarker {
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           optionContext = ConverterHint.MEMBERGROUP,
           help = CliStrings.NETSTAT__GROUP__HELP) String group,
-      @CliOption(key = CliStrings.NETSTAT__FILE, optionContext = ConverterHint.FILE,
+      @CliOption(key = CliStrings.NETSTAT__FILE,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.NETSTAT__FILE__HELP) String saveAs,
       @CliOption(key = CliStrings.NETSTAT__WITHLSOF, specifiedDefaultValue = "true",
@@ -817,7 +817,7 @@ public class MiscellaneousCommands implements CommandMarker {
       @CliOption(key = {CliStrings.SHOW_METRICS__MEMBER},
           optionContext = ConverterHint.ALL_MEMBER_IDNAME,
           help = CliStrings.SHOW_METRICS__MEMBER__HELP) String memberNameOrId,
-      @CliOption(key = {CliStrings.SHOW_METRICS__REGION}, optionContext = ConverterHint.REGIONPATH,
+      @CliOption(key = {CliStrings.SHOW_METRICS__REGION}, optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.SHOW_METRICS__REGION__HELP) String regionName,
       @CliOption(key = {CliStrings.SHOW_METRICS__FILE},
           help = CliStrings.SHOW_METRICS__FILE__HELP) String export_to_report_to,

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RegionCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RegionCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RegionCommands.java
index 0bf80a5..478975f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RegionCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/RegionCommands.java
@@ -154,7 +154,7 @@ public class RegionCommands implements CommandMarker {
       relatedTopic = {CliStrings.TOPIC_GEODE_REGION, CliStrings.TOPIC_GEODE_CONFIG})
   @ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
   public Result describeRegion(
-      @CliOption(key = CliStrings.DESCRIBE_REGION__NAME, optionContext = ConverterHint.REGIONPATH,
+      @CliOption(key = CliStrings.DESCRIBE_REGION__NAME, optionContext = ConverterHint.REGION_PATH,
           help = CliStrings.DESCRIBE_REGION__NAME__HELP, mandatory = true) String regionName) {
 
     Result result = null;

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java
index 81a96ae..c9e79b0 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShellCommands.java
@@ -304,7 +304,7 @@ public class ShellCommands implements CommandMarker {
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.CONNECT__SSL_PROTOCOLS__HELP) String sslProtocols,
       @CliOption(key = CliStrings.CONNECT__SECURITY_PROPERTIES,
-          optionContext = ConverterHint.FILE_PATHSTRING,
+          optionContext = ConverterHint.FILE_PATH,
           unspecifiedDefaultValue = CliMetaData.ANNOTATION_NULL_VALUE,
           help = CliStrings.CONNECT__SECURITY_PROPERTIES__HELP) final String gfSecurityPropertiesPath,
       @CliOption(key = {CliStrings.CONNECT__USE_SSL}, specifiedDefaultValue = "true",

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DirPathConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DirPathConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DirPathConverter.java
deleted file mode 100644
index 1670898..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DirPathConverter.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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.geode.management.internal.cli.converters;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.List;
-
-import org.springframework.shell.core.Completion;
-import org.springframework.shell.core.Converter;
-import org.springframework.shell.core.MethodTarget;
-
-import org.apache.geode.management.cli.ConverterHint;
-
-/**
- * 
- * @since GemFire 7.0
- */
-public class DirPathConverter implements Converter<String> {
-  private final DirFilterImpl dirFilter = new DirFilterImpl();
-
-  @Override
-  public boolean supports(Class<?> type, String optionContext) {
-    // System.out.println("FilePathConverter.supports() : type :: "+type+", optionContext ::
-    // "+optionContext);
-    return String.class.equals(type) && ConverterHint.DIR_PATHSTRING.equals(optionContext);
-  }
-
-  @Override
-  public String convertFromText(String value, Class<?> targetType, String optionContext) {
-    // System.out.println("FilePathConverter.convertFromText() : optionContext :: "+optionContext);
-    return value;
-  }
-
-  @Override
-  public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
-      String existingData, String optionContext, MethodTarget target) {
-    // prefix is needed while comparing Completion Candidates as potential matches
-    String prefixToUse = "";
-    boolean prependAbsolute = true;
-    File parentDir = null; // directory to be searched for file(s)
-
-    if (existingData != null) {
-      // System.out.println("FilePathConverter.getAllPossibleValues() : optionContext ::
-      // "+optionContext+", existingData : "+existingData);
-      String[] completionValues = new String[0];
-
-      if (ConverterHint.DIR_PATHSTRING.equals(optionContext)) {
-        // if existingData is empty, start from root
-        if (existingData != null && existingData.trim().isEmpty()) {
-          File[] listRoots = File.listRoots();
-          completionValues = new String[listRoots.length];
-          for (int i = 0; i < listRoots.length; i++) {
-            if (listRoots[i].isDirectory()) {
-              completionValues[i] = listRoots[i].getPath();
-            }
-          }
-          prefixToUse = File.separator;
-        } else {
-          // Create a file from existing data
-          File file = new File(existingData);
-          if (file.isDirectory()) {
-            // For a directory, list files/sub-dirs in the directory
-            parentDir = file;
-            completionValues = parentDir.list(dirFilter);
-          } else if (!file.exists()) {
-            parentDir = file.getParentFile();
-            if (parentDir == null) {
-              try {
-                parentDir = file.getCanonicalFile().getParentFile();
-              } catch (IOException e) {
-                parentDir = null;
-              }
-            }
-            if (parentDir != null) {
-              completionValues = parentDir.list(new DirNameFilterImpl(parentDir, file.getName()));
-            }
-          }
-          // whether the file path is absolute
-          prependAbsolute = file.isAbsolute();
-        }
-      }
-
-      if (completionValues.length > 0) {
-        // use directory path as prefix for completion of names of the contained files
-        if (parentDir != null) {
-          if (existingData.startsWith(".")) { // handle . & ..
-            prefixToUse = parentDir.getPath();
-          } else if (prependAbsolute) {
-            prefixToUse = parentDir.getAbsolutePath();
-          }
-        }
-        // add File.separator in the end
-        if (!prefixToUse.endsWith(File.separator)
-            && (prependAbsolute || existingData.startsWith("."))) {
-          prefixToUse += File.separator;
-        }
-        for (int i = 0; i < completionValues.length; i++) {
-          completions.add(new Completion(prefixToUse + completionValues[i]));
-        }
-      }
-    }
-
-    return !completions.isEmpty();
-  }
-
-  class DirNameFilterImpl implements FilenameFilter {
-    private File parentDirectory;
-    private String userInput;
-
-    public DirNameFilterImpl(File parentDirectory, String userInput) {
-      this.parentDirectory = parentDirectory;
-      this.userInput = userInput;
-    }
-
-    @Override
-    public boolean accept(File dir, String name) {
-      return parentDirectory.equals(dir) && name.startsWith(userInput)
-          && new File(dir, name).isDirectory();
-    }
-  }
-
-  class DirFilterImpl implements FilenameFilter {
-
-    @Override
-    public boolean accept(File dir, String name) {
-      return new File(dir, name).isDirectory();
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DiskStoreNameConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DiskStoreNameConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DiskStoreNameConverter.java
index f629046..04c5fd4 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DiskStoreNameConverter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/DiskStoreNameConverter.java
@@ -14,6 +14,12 @@
  */
 package org.apache.geode.management.internal.cli.converters;
 
+import org.apache.geode.management.cli.ConverterHint;
+import org.apache.geode.management.internal.cli.shell.Gfsh;
+import org.springframework.shell.core.Completion;
+import org.springframework.shell.core.Converter;
+import org.springframework.shell.core.MethodTarget;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -22,13 +28,6 @@ import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.internal.cli.shell.Gfsh;
-
-import org.springframework.shell.core.Completion;
-import org.springframework.shell.core.Converter;
-import org.springframework.shell.core.MethodTarget;
-
 /**
  * 
  * 
@@ -38,7 +37,7 @@ public class DiskStoreNameConverter implements Converter<String> {
 
   @Override
   public boolean supports(Class<?> type, String optionContext) {
-    return String.class.equals(type) && ConverterHint.DISKSTORE_ALL.equals(optionContext);
+    return String.class.equals(type) && optionContext.contains(ConverterHint.DISKSTORE);
   }
 
   @Override
@@ -49,24 +48,22 @@ public class DiskStoreNameConverter implements Converter<String> {
   @Override
   public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
       String existingData, String optionContext, MethodTarget target) {
-    if (String.class.equals(targetType) && ConverterHint.DISKSTORE_ALL.equals(optionContext)) {
-      Set<String> diskStoreNames = getDiskStoreNames();
+    Set<String> diskStoreNames = getDiskStoreNames();
 
-      for (String diskStoreName : diskStoreNames) {
-        if (existingData != null) {
-          if (diskStoreName.startsWith(existingData)) {
-            completions.add(new Completion(diskStoreName));
-          }
-        } else {
+    for (String diskStoreName : diskStoreNames) {
+      if (existingData != null) {
+        if (diskStoreName.startsWith(existingData)) {
           completions.add(new Completion(diskStoreName));
         }
+      } else {
+        completions.add(new Completion(diskStoreName));
       }
     }
 
     return !completions.isEmpty();
   }
 
-  private Set<String> getDiskStoreNames() {
+  public Set<String> getDiskStoreNames() {
     SortedSet<String> diskStoreNames = new TreeSet<String>();
     Gfsh gfsh = Gfsh.getCurrentInstance();
     if (gfsh != null && gfsh.isConnectedAndReady()) { // gfsh exists & is not null

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathConverter.java
index f36cdd5..7232795 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathConverter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathConverter.java
@@ -14,122 +14,45 @@
  */
 package org.apache.geode.management.internal.cli.converters;
 
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.List;
-
+import org.apache.geode.management.cli.ConverterHint;
 import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
 
-import org.apache.geode.management.cli.ConverterHint;
+import java.io.File;
+import java.util.List;
 
 /**
  * 
  * @since GemFire 7.0
  */
 public class FilePathConverter implements Converter<File> {
+  private FilePathStringConverter delegate;
+
+  public FilePathConverter() {
+    this.delegate = new FilePathStringConverter();
+  }
+
+  public void setDelegate(FilePathStringConverter delegate) {
+    this.delegate = delegate;
+  }
+
   @Override
   public boolean supports(Class<?> type, String optionContext) {
-    // System.out.println("FilePathConverter.supports() : type :: "+type+", optionContext ::
-    // "+optionContext);
-    return File.class.equals(type) && ConverterHint.FILE.equals(optionContext);
+    return File.class.equals(type) && optionContext.contains(ConverterHint.FILE);
   }
 
   @Override
   public File convertFromText(String value, Class<?> targetType, String optionContext) {
-    // System.out.println("FilePathConverter.convertFromText() : optionContext :: "+optionContext);
-    File filePath = null;
-    if (ConverterHint.FILE.equals(optionContext)) {
-      filePath = new File(value);
-    }
-    return filePath;
+    return new File(value);
   }
 
   @Override
   public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
       String existingData, String optionContext, MethodTarget target) {
-    // prefix is needed while comparing Completion Candidates as potential matches
-    String prefixToUse = "";
-    boolean prependAbsolute = true;
-    File parentDir = null; // directory to be searched for file(s)
-
-    if (existingData != null) {
-      // System.out.println("FilePathConverter.getAllPossibleValues() : optionContext ::
-      // "+optionContext+", existingData : "+existingData);
-      String[] completionValues = new String[0];
-
-      if (ConverterHint.FILE.equals(optionContext)) {
-        // if existingData is empty, start from root
-        if (existingData != null && existingData.trim().isEmpty()) {
-          File[] listRoots = File.listRoots();
-          completionValues = new String[listRoots.length];
-          for (int i = 0; i < listRoots.length; i++) {
-            completionValues[i] = listRoots[i].getPath();
-          }
-          prefixToUse = File.separator;
-        } else {
-          // Create a file from existing data
-          File file = new File(existingData);
-          if (file.isDirectory()) {
-            // For a directory, list files/sub-dirsin the directory
-            parentDir = file;
-            completionValues = parentDir.list();
-          } else if (!file.exists()) {
-            parentDir = file.getParentFile();
-            if (parentDir == null) {
-              try {
-                parentDir = file.getCanonicalFile().getParentFile();
-              } catch (IOException e) {
-                parentDir = null;
-              }
-            }
-            if (parentDir != null) {
-              completionValues = parentDir.list(new FileNameFilterImpl(parentDir, file.getName()));
-            }
-          }
-          // whether the file path is absolute
-          prependAbsolute = file.isAbsolute();
-        }
-      }
-
-      if (completionValues.length > 0) {
-        // use directory path as prefix for completion of names of the contained files
-        if (parentDir != null) {
-          if (existingData.startsWith(".")) { // handle . & ..
-            prefixToUse = parentDir.getPath();
-          } else if (prependAbsolute) {
-            prefixToUse = parentDir.getAbsolutePath();
-          }
-        }
-        // add File.separator in the end
-        if (!prefixToUse.endsWith(File.separator)
-            && (prependAbsolute || existingData.startsWith("."))) {
-          prefixToUse += File.separator;
-        }
-        for (int i = 0; i < completionValues.length; i++) {
-          completions.add(new Completion(prefixToUse + completionValues[i]));
-        }
-      }
-    }
-
-    return !completions.isEmpty();
+    return delegate.getAllPossibleValues(completions, targetType, existingData, optionContext,
+        target);
   }
 
-  class FileNameFilterImpl implements FilenameFilter {
-    private File parentDirectory;
-    private String userInput;
-
-    public FileNameFilterImpl(File parentDirectory, String userInput) {
-      this.parentDirectory = parentDirectory;
-      this.userInput = userInput;
-    }
-
-    @Override
-    public boolean accept(File dir, String name) {
-      return parentDirectory.equals(dir) && name.startsWith(userInput);
-    }
-  }
 
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathStringConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathStringConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathStringConverter.java
index 35baf76..3fadd96 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathStringConverter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/FilePathStringConverter.java
@@ -14,16 +14,16 @@
  */
 package org.apache.geode.management.internal.cli.converters;
 
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.List;
-
+import org.apache.geode.internal.lang.StringUtils;
+import org.apache.geode.management.cli.ConverterHint;
 import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
 
-import org.apache.geode.management.cli.ConverterHint;
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 
@@ -32,100 +32,64 @@ import org.apache.geode.management.cli.ConverterHint;
 public class FilePathStringConverter implements Converter<String> {
   @Override
   public boolean supports(Class<?> type, String optionContext) {
-    // System.out.println("FilePathConverter.supports() : type :: "+type+", optionContext ::
-    // "+optionContext);
-    return String.class.equals(type) && ConverterHint.FILE_PATHSTRING.equals(optionContext);
+    return String.class.equals(type) && optionContext.contains(ConverterHint.FILE_PATH);
   }
 
   @Override
   public String convertFromText(String value, Class<?> targetType, String optionContext) {
-    // System.out.println("FilePathConverter.convertFromText() : optionContext :: "+optionContext);
     return value;
   }
 
-  @Override
-  public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
-      String existingData, String optionContext, MethodTarget target) {
-    // prefix is needed while comparing Completion Candidates as potential matches
-    String prefixToUse = "";
-    boolean prependAbsolute = true;
-    File parentDir = null; // directory to be searched for file(s)
-
-    if (existingData != null) {
-      // System.out.println("FilePathConverter.getAllPossibleValues() : optionContext ::
-      // "+optionContext+", existingData : "+existingData);
-      String[] completionValues = new String[0];
+  public List<String> getRoots() {
+    File[] roots = File.listRoots();
+    return Arrays.stream(roots).map(File::getAbsolutePath).collect(Collectors.toList());
+  }
 
-      if (ConverterHint.FILE_PATHSTRING.equals(optionContext)) {
-        // if existingData is empty, start from root
-        if (existingData != null && existingData.trim().isEmpty()) {
-          File[] listRoots = File.listRoots();
-          completionValues = new String[listRoots.length];
-          for (int i = 0; i < listRoots.length; i++) {
-            completionValues[i] = listRoots[i].getPath();
-          }
-          prefixToUse = File.separator;
-        } else {
-          // Create a file from existing data
-          File file = new File(existingData);
-          if (file.isDirectory()) {
-            // For a directory, list files/sub-dirsin the directory
-            parentDir = file;
-            completionValues = parentDir.list();
-          } else if (!file.exists()) {
-            parentDir = file.getParentFile();
-            if (parentDir == null) {
-              try {
-                parentDir = file.getCanonicalFile().getParentFile();
-              } catch (IOException e) {
-                parentDir = null;
-              }
-            }
-            if (parentDir != null) {
-              completionValues = parentDir.list(new FileNameFilterImpl(parentDir, file.getName()));
-            }
-          }
-          // whether the file path is absolute
-          prependAbsolute = file.isAbsolute();
-        }
-      }
+  /**
+   * if path is a dir, it will return the list of files under this dir. if path is a filename, it
+   * will return all the siblings of this file
+   */
+  public List<String> getSiblings(String path) {
+    File currentFile = new File(path);
 
-      if (completionValues.length > 0) {
-        // use directory path as prefix for completion of names of the contained files
-        if (parentDir != null) {
-          if (existingData.startsWith(".")) { // handle . & ..
-            prefixToUse = parentDir.getPath();
-          } else if (prependAbsolute) {
-            prefixToUse = parentDir.getAbsolutePath();
-          }
-        }
-        // add File.separator in the end
-        if (!prefixToUse.endsWith(File.separator)
-            && (prependAbsolute || existingData.startsWith("."))) {
-          prefixToUse += File.separator;
-        }
-        for (int i = 0; i < completionValues.length; i++) {
-          completions.add(new Completion(prefixToUse + completionValues[i]));
-        }
+    // if currentFile is not a dir, convert currentFile to it's parent dir
+    if (!currentFile.isDirectory()) {
+      currentFile = currentFile.getParentFile();
+      // a file needs to be in a directory, if the file's parent is null, that means user
+      // typed a filename without "./" prefix, but meant to find the file in the current dir.
+      if (currentFile == null) {
+        currentFile = new File("./");
+        path = null;
+      } else {
+        path = currentFile.getPath();
       }
     }
 
-    return !completions.isEmpty();
+    // at this point, currentFile should be a directory, we need to return all the files
+    // under this directory
+    String prefix;
+    if (path == null) {
+      prefix = "";
+    } else {
+      prefix = path.endsWith(File.separator) ? path : path + File.separator;
+    }
+    return Arrays.stream(currentFile.list()).map(s -> prefix + s).collect(Collectors.toList());
   }
 
-  class FileNameFilterImpl implements FilenameFilter {
-    private File parentDirectory;
-    private String userInput;
-
-    public FileNameFilterImpl(File parentDirectory, String userInput) {
-      this.parentDirectory = parentDirectory;
-      this.userInput = userInput;
+  @Override
+  public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
+      String existingData, String optionContext, MethodTarget target) {
+    if (StringUtils.isBlank(existingData)) {
+      getRoots().stream().forEach(path -> completions.add(new Completion(path)));
+      return !completions.isEmpty();
     }
 
-    @Override
-    public boolean accept(File dir, String name) {
-      return parentDirectory.equals(dir) && name.startsWith(userInput);
-    }
+    getSiblings(existingData).stream().filter(string -> string.startsWith(existingData))
+        .forEach(path -> {
+          completions.add(new Completion(path));
+        });
+
+    return !completions.isEmpty();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HelpConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HelpConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HelpConverter.java
new file mode 100644
index 0000000..88fd758
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HelpConverter.java
@@ -0,0 +1,69 @@
+/*
+ * 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.geode.management.internal.cli.converters;
+
+import org.apache.geode.management.cli.ConverterHint;
+import org.apache.geode.management.internal.cli.CommandManager;
+import org.apache.geode.management.internal.cli.CommandManagerAware;
+import org.apache.geode.management.internal.cli.commands.GfshHelpCommands;
+import org.springframework.shell.core.Completion;
+import org.springframework.shell.core.Converter;
+import org.springframework.shell.core.MethodTarget;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * {@link Converter} for {@link GfshHelpCommands#obtainHelp(String)}
+ * 
+ *
+ * @since GemFire 7.0
+ */
+public class HelpConverter implements Converter<String>, CommandManagerAware {
+
+  private CommandManager commandManager;
+
+  @Override
+  public String convertFromText(String existingData, Class<?> dataType, String optionContext) {
+    return existingData;
+  }
+
+  @Override
+  public boolean getAllPossibleValues(List<Completion> completionCandidates, Class<?> dataType,
+      String existingData, String optionContext, MethodTarget arg4) {
+    Set<String> commandNames = commandManager.getHelper().getCommands();
+    for (String string : commandNames) {
+      completionCandidates.add(new Completion(string));
+    }
+
+    if (completionCandidates.size() > 0) {
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public boolean supports(Class<?> arg0, String optionContext) {
+    if (String.class.isAssignableFrom(arg0) && optionContext.contains(ConverterHint.HELP)) {
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public void setCommandManager(CommandManager commandManager) {
+    this.commandManager = commandManager;
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HintTopicConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HintTopicConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HintTopicConverter.java
new file mode 100644
index 0000000..17667ca
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/HintTopicConverter.java
@@ -0,0 +1,75 @@
+/*
+ * 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.geode.management.internal.cli.converters;
+
+import org.apache.geode.management.cli.ConverterHint;
+import org.apache.geode.management.internal.cli.CommandManager;
+import org.apache.geode.management.internal.cli.CommandManagerAware;
+import org.apache.geode.management.internal.cli.help.Helper;
+import org.springframework.shell.core.Completion;
+import org.springframework.shell.core.Converter;
+import org.springframework.shell.core.MethodTarget;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 
+ * @since GemFire 7.0
+ */
+public class HintTopicConverter implements Converter<String>, CommandManagerAware {
+
+  private CommandManager commandManager;
+
+  @Override
+  public boolean supports(Class<?> type, String optionContext) {
+    return String.class.equals(type) && optionContext.contains(ConverterHint.HINT);
+  }
+
+  @Override
+  public String convertFromText(String value, Class<?> targetType, String optionContext) {
+    return value;
+  }
+
+  @Override
+  public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
+      String existingData, String optionContext, MethodTarget target) {
+    Helper helper = commandManager.getHelper();
+    Set<String> topicNames = helper.getTopicNames();
+
+    for (String topicName : topicNames) {
+      if (existingData != null && !existingData.isEmpty()) {
+        if (topicName.startsWith(existingData)) { // match exact case
+          completions.add(new Completion(topicName));
+        } else if (topicName.toLowerCase().startsWith(existingData.toLowerCase())) { // match
+          // case
+          // insensitive
+          String completionStr = existingData + topicName.substring(existingData.length());
+
+          completions.add(new Completion(completionStr));
+        }
+      } else {
+        completions.add(new Completion(topicName));
+      }
+    }
+
+    return !completions.isEmpty();
+  }
+
+  @Override
+  public void setCommandManager(CommandManager commandManager) {
+    this.commandManager = commandManager;
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/RegionPathConverter.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/RegionPathConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/RegionPathConverter.java
index 3d96088..a992ddb 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/RegionPathConverter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/RegionPathConverter.java
@@ -14,18 +14,17 @@
  */
 package org.apache.geode.management.internal.cli.converters;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
 import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.internal.cli.shell.Gfsh;
-
 import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
 /**
  * 
  * @since GemFire 7.0
@@ -36,7 +35,7 @@ public class RegionPathConverter implements Converter<String> {
 
   @Override
   public boolean supports(Class<?> type, String optionContext) {
-    return String.class.equals(type) && ConverterHint.REGIONPATH.equals(optionContext);
+    return String.class.equals(type) && optionContext.contains(ConverterHint.REGION_PATH);
   }
 
   @Override
@@ -47,38 +46,35 @@ public class RegionPathConverter implements Converter<String> {
   @Override
   public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType,
       String existingData, String optionContext, MethodTarget target) {
-    if (String.class.equals(targetType) && ConverterHint.REGIONPATH.equals(optionContext)) {
-      Set<String> regionPathSet = getAllRegionPaths();
-      Gfsh gfsh = Gfsh.getCurrentInstance();
-      String currentContextPath = "";
-      if (gfsh != null) {
-        currentContextPath = gfsh.getEnvProperty(Gfsh.ENV_APP_CONTEXT_PATH);
-        if (currentContextPath != null
-            && !org.apache.geode.management.internal.cli.converters.RegionPathConverter.DEFAULT_APP_CONTEXT_PATH
-                .equals(currentContextPath)) {
-          regionPathSet.remove(currentContextPath);
-          regionPathSet.add(
-              org.apache.geode.management.internal.cli.converters.RegionPathConverter.DEFAULT_APP_CONTEXT_PATH);
-        }
+    Set<String> regionPathSet = getAllRegionPaths();
+    Gfsh gfsh = Gfsh.getCurrentInstance();
+    String currentContextPath = "";
+    if (gfsh != null) {
+      currentContextPath = gfsh.getEnvProperty(Gfsh.ENV_APP_CONTEXT_PATH);
+      if (currentContextPath != null
+          && !org.apache.geode.management.internal.cli.converters.RegionPathConverter.DEFAULT_APP_CONTEXT_PATH
+              .equals(currentContextPath)) {
+        regionPathSet.remove(currentContextPath);
+        regionPathSet.add(
+            org.apache.geode.management.internal.cli.converters.RegionPathConverter.DEFAULT_APP_CONTEXT_PATH);
       }
+    }
 
-      for (String regionPath : regionPathSet) {
-        if (existingData != null) {
-          if (regionPath.startsWith(existingData)) {
-            completions.add(new Completion(regionPath));
-          }
-        } else {
+    for (String regionPath : regionPathSet) {
+      if (existingData != null) {
+        if (regionPath.startsWith(existingData)) {
           completions.add(new Completion(regionPath));
         }
+      } else {
+        completions.add(new Completion(regionPath));
       }
     }
 
     return !completions.isEmpty();
   }
 
-  Set<String> getAllRegionPaths() {
+  public Set<String> getAllRegionPaths() {
     Set<String> regionPathSet = Collections.emptySet();
-
     Gfsh gfsh = Gfsh.getCurrentInstance();
     if (gfsh != null && gfsh.isConnectedAndReady()) {
       String[] regionPaths =

http://git-wip-us.apache.org/repos/asf/geode/blob/2a272acc/geode-core/src/main/java/org/apache/geode/management/internal/cli/help/Helper.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/help/Helper.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/help/Helper.java
index fe2dc7d..9dbf59c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/help/Helper.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/help/Helper.java
@@ -59,6 +59,8 @@ public class Helper {
   static final String VALUE_FIELD = "value";
   static final String TRUE_TOKEN = "true";
   static final String FALSE_TOKEN = "false";
+  static final String AVAILABLE = "Available";
+  static final String NOT_AVAILABLE = "Not Available";
 
   private final Map<String, Topic> topics = new HashMap<>();
   private final Map<String, Method> commands = new TreeMap<String, Method>();
@@ -123,12 +125,23 @@ public class Helper {
     });
   }
 
+  /**
+   * get help string for a specific command, or a brief description of all the commands if buffer is
+   * null or empty
+   */
   public String getHelp(String buffer, int terminalWidth) {
+    if (StringUtils.isBlank(buffer)) {
+      return getHelp().toString(terminalWidth);
+    }
+
     Method method = commands.get(buffer);
     if (method == null) {
       return "no help exists for this command.";
     }
-    return getHelp(method).toString(terminalWidth);
+
+    HelpBlock helpBlock = getHelp(method.getDeclaredAnnotation(CliCommand.class),
+        method.getParameterAnnotations(), method.getParameterTypes());
+    return helpBlock.toString(terminalWidth);
   }
 
   public String getHint(String buffer) {
@@ -157,13 +170,45 @@ public class Helper {
     return builder.toString();
   }
 
-  private HelpBlock getHelp(Method method) {
-    return getHelp(method.getDeclaredAnnotation(CliCommand.class), method.getParameterAnnotations(),
-        method.getParameterTypes());
+  public Set<String> getTopicNames() {
+    return topics.keySet();
+  }
+
+  boolean isAvailable(String command) {
+    MethodTarget target = availabilityIndicators.get(command);
+    if (target == null) {
+      return true;
+    }
+    try {
+      return (Boolean) target.getMethod().invoke(target.getTarget());
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+  HelpBlock getHelp() {
+    HelpBlock root = new HelpBlock();
+    commands.keySet().stream().sorted().map(commands::get).forEach(method -> {
+      root.addChild(getHelp(method.getDeclaredAnnotation(CliCommand.class), null, null));
+    });
+    return root;
   }
 
+  /**
+   * returns a short description and help string of the command if annotations is null or returns a
+   * details description of the command with the syntax and parameter description
+   */
   HelpBlock getHelp(CliCommand cliCommand, Annotation[][] annotations, Class<?>[] parameterTypes) {
     String commandName = cliCommand.value()[0];
+    boolean isAvailable = isAvailable(commandName);
+
+    if (annotations == null && parameterTypes == null) {
+      String available = isAvailable ? AVAILABLE : NOT_AVAILABLE;
+      HelpBlock help = new HelpBlock(commandName + " (" + available + ")");
+      help.addChild(new HelpBlock(cliCommand.help()));
+      return help;
+    }
+
     HelpBlock root = new HelpBlock();
     // First we will have the block for NAME of the command
     HelpBlock name = new HelpBlock(NAME_NAME);
@@ -172,15 +217,7 @@ public class Helper {
 
     // add the availability flag
     HelpBlock availability = new HelpBlock(IS_AVAILABLE_NAME);
-    boolean available = true;
-    MethodTarget target = availabilityIndicators.get(commandName);
-    if (target != null) {
-      try {
-        available = (Boolean) target.getMethod().invoke(target.getTarget());
-      } catch (Exception e) {
-      }
-    }
-    availability.addChild(new HelpBlock(available + ""));
+    availability.addChild(new HelpBlock(isAvailable + ""));
     root.addChild(availability);
 
     // Now add synonyms if any