You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/05/21 00:04:47 UTC

[1/5] incubator-geode git commit: GEODE-11 Adding missing imports

Repository: incubator-geode
Updated Branches:
  refs/heads/feature/GEODE-835 52f21b0fc -> ce2ac6830


GEODE-11 Adding missing imports


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

Branch: refs/heads/feature/GEODE-835
Commit: 92c104d9113524d567211f741555c26741245a8f
Parents: c674e35
Author: Jason Huynh <hu...@gmail.com>
Authored: Fri May 20 14:31:58 2016 -0700
Committer: Jason Huynh <hu...@gmail.com>
Committed: Fri May 20 14:31:58 2016 -0700

----------------------------------------------------------------------
 .../lucene/LuceneIndexCreationPersistenceIntegrationTest.java      | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/92c104d9/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationPersistenceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationPersistenceIntegrationTest.java b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationPersistenceIntegrationTest.java
index c43b592..96b4e93 100644
--- a/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationPersistenceIntegrationTest.java
+++ b/geode-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/LuceneIndexCreationPersistenceIntegrationTest.java
@@ -24,6 +24,7 @@ import static junitparams.JUnitParamsRunner.$;
 import static org.junit.Assert.*;
 
 import java.io.File;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
 import com.gemstone.gemfire.cache.Region;
@@ -35,6 +36,7 @@ import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
 import com.gemstone.gemfire.internal.cache.LocalRegion;
 import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
 import com.gemstone.gemfire.test.junit.rules.DiskDirRule;
+import com.jayway.awaitility.Awaitility;
 
 import org.apache.lucene.queryparser.classic.ParseException;
 import org.junit.Rule;


[5/5] incubator-geode git commit: Merge remote-tracking branch 'origin/develop' into feature/GEODE-835

Posted by kl...@apache.org.
Merge remote-tracking branch 'origin/develop' into feature/GEODE-835


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

Branch: refs/heads/feature/GEODE-835
Commit: ce2ac68308448309f5501ce9683b91d2b1e74630
Parents: 52f21b0 853c40d
Author: Kirk Lund <kl...@pivotal.io>
Authored: Fri May 20 17:04:30 2016 -0700
Committer: Kirk Lund <kl...@pivotal.io>
Committed: Fri May 20 17:04:30 2016 -0700

----------------------------------------------------------------------
 .../internal/PooledExecutorWithDMStats.java     |   9 +-
 .../internal/locks/DLockService.java            |   9 +-
 .../internal/cache/GemFireCacheImpl.java        |  37 +-
 .../gemfire/internal/cache/LocalRegion.java     |   2 +-
 .../gemfire/internal/jndi/JNDIInvoker.java      |   3 +-
 .../management/internal/cli/CommandManager.java |   4 +-
 .../cli/exceptions/CliCommandException.java     |  37 +-
 .../exceptions/CliCommandInvalidException.java  |  16 +-
 .../CliCommandMultiModeOptionException.java     |  16 +-
 .../CliCommandNotAvailableException.java        |  12 +-
 .../exceptions/CliCommandOptionException.java   |  36 +-
 ...CommandOptionHasMultipleValuesException.java |  17 +-
 .../CliCommandOptionInvalidException.java       |  14 +-
 .../CliCommandOptionMissingException.java       |  17 +-
 .../CliCommandOptionNotApplicableException.java |  20 +-
 ...liCommandOptionValueConversionException.java |  16 +-
 .../CliCommandOptionValueException.java         |  25 +-
 .../CliCommandOptionValueMissingException.java  |  20 +-
 .../internal/cli/exceptions/CliException.java   |  17 +-
 .../cli/exceptions/ExceptionGenerator.java      |  28 +-
 .../management/internal/cli/parser/Option.java  |   2 +-
 .../cli/parser/jopt/JoptOptionParser.java       |  27 +-
 .../gemfire/cache30/MultiVMRegionTestCase.java  |   1 -
 .../internal/cache/GemFireCacheImplTest.java    |  66 +++
 .../internal/cli/JoptOptionParserTest.java      | 507 +++++++++++++++++++
 .../com/gemstone/gemfire/test/fake/Fakes.java   |  10 +
 ...IndexCreationPersistenceIntegrationTest.java |   2 +
 27 files changed, 803 insertions(+), 167 deletions(-)
----------------------------------------------------------------------



[2/5] incubator-geode git commit: GEODE-1414: remove assertion of dunit jvm count

Posted by kl...@apache.org.
GEODE-1414: remove assertion of dunit jvm count


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

Branch: refs/heads/feature/GEODE-835
Commit: a17dc7182c3d0573dae4c14e9af0295e882d2dcd
Parents: 92c104d
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Thu May 19 15:34:37 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Fri May 20 14:51:47 2016 -0700

----------------------------------------------------------------------
 .../java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java    | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/a17dc718/geode-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java b/geode-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
index 9ad102d..e112337 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java
@@ -6945,7 +6945,6 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         }
     };
 
-    assertEquals(4, Host.getHost(0).getVMCount());
 //GemFireVersion.waitForJavaDebugger(getLogWriter(), "CTRLR WAITING AFTER CREATE");
     VM vm0 = Host.getHost(0).getVM(0);
     VM vm1 = Host.getHost(0).getVM(1);


[4/5] incubator-geode git commit: GEODE-835: Create JoptOptionParserTest

Posted by kl...@apache.org.
GEODE-835: Create JoptOptionParserTest

JoptOptionParser is the primary geode class using joptsimple so this test is necessary before replacing geode-joptsimple with a dependency on jopt-simple 5.0.1.
* cleanup CLI exceptions and the constructors for these exceptions


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

Branch: refs/heads/feature/GEODE-835
Commit: 853c40d26fe63f2411fb735b263efee11afdfa1a
Parents: 1af92d8
Author: Kirk Lund <kl...@apache.org>
Authored: Fri May 20 16:49:45 2016 -0700
Committer: Kirk Lund <kl...@apache.org>
Committed: Fri May 20 16:56:51 2016 -0700

----------------------------------------------------------------------
 .../management/internal/cli/CommandManager.java |   4 +-
 .../cli/exceptions/CliCommandException.java     |  37 +-
 .../exceptions/CliCommandInvalidException.java  |  16 +-
 .../CliCommandMultiModeOptionException.java     |  16 +-
 .../CliCommandNotAvailableException.java        |  12 +-
 .../exceptions/CliCommandOptionException.java   |  36 +-
 ...CommandOptionHasMultipleValuesException.java |  17 +-
 .../CliCommandOptionInvalidException.java       |  14 +-
 .../CliCommandOptionMissingException.java       |  17 +-
 .../CliCommandOptionNotApplicableException.java |  20 +-
 ...liCommandOptionValueConversionException.java |  16 +-
 .../CliCommandOptionValueException.java         |  25 +-
 .../CliCommandOptionValueMissingException.java  |  20 +-
 .../internal/cli/exceptions/CliException.java   |  17 +-
 .../cli/exceptions/ExceptionGenerator.java      |  28 +-
 .../management/internal/cli/parser/Option.java  |   2 +-
 .../cli/parser/jopt/JoptOptionParser.java       |  27 +-
 .../internal/cli/JoptOptionParserTest.java      | 507 +++++++++++++++++++
 18 files changed, 695 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/CommandManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/CommandManager.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/CommandManager.java
index 46a8226..9c8025e 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/CommandManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/CommandManager.java
@@ -365,8 +365,8 @@ public class CommandManager {
           for (Annotation annotation : annotations) {
             if (annotation instanceof CliArgument) {
               // Here we need to create the argument Object
-              arguments.add(createArgument((CliArgument) annotation,
-                  parameterType, parameterNo));
+              Argument argumentToAdd = createArgument((CliArgument) annotation, parameterType, parameterNo);
+              arguments.add(argumentToAdd);
               parameterNo++;
             } else if (annotation instanceof CliOption) {
               Option createdOption = createOption((CliOption) annotation, parameterType, parameterNo);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandException.java
index eb019a7..29358f3 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandException.java
@@ -16,50 +16,51 @@
  */
 package com.gemstone.gemfire.management.internal.cli.exceptions;
 
-import java.util.List;
-
 import com.gemstone.gemfire.management.internal.cli.parser.CommandTarget;
 import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandException extends CliException {
+
   private CommandTarget commandTarget;
   private OptionSet optionSet;
 
-  public OptionSet getOptionSet() {
-    return optionSet;
+  public CliCommandException(final CommandTarget commandTarget) {
+    this(commandTarget, null, null);
   }
 
-  public CommandTarget getCommandTarget() {
-    return commandTarget;
+  public CliCommandException(final CommandTarget commandTarget, final OptionSet optionSet) {
+    this(commandTarget, optionSet, null);
   }
 
-  public CliCommandException(CommandTarget commandTarget) {
+  public CliCommandException(final CommandTarget commandTarget, final OptionSet optionSet, final Throwable cause) {
+    super(cause);
     this.setCommandTarget(commandTarget);
-  }
-
-  public CliCommandException(CommandTarget commandTarget, OptionSet optionSet) {
-    this(commandTarget);
     this.setOptionSet(optionSet);
   }
 
-  public CliCommandException(CommandTarget commandTarget2,
-      List<String> nonOptionArguments) {
+  public CommandTarget getCommandTarget() {
+    return commandTarget;
   }
 
   /**
-   * @param commandTarget
-   *          the commandTarget to set
+   * TODO: make this immutable
+   *
+   * @param commandTarget the commandTarget to set
    */
   public void setCommandTarget(CommandTarget commandTarget) {
     this.commandTarget = commandTarget;
   }
 
+  public OptionSet getOptionSet() {
+    return optionSet;
+  }
+
   /**
-   * @param optionSet
-   *          the optionSet to set
+   * TODO: make this immutable
+   *
+   * @param optionSet the optionSet to set
    */
   public void setOptionSet(OptionSet optionSet) {
     this.optionSet = optionSet;
   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandInvalidException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandInvalidException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandInvalidException.java
index 6fde9db..b3d3775 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandInvalidException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandInvalidException.java
@@ -21,13 +21,19 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandInvalidException extends CliCommandException {
 
-  public CliCommandInvalidException(CommandTarget commandTarget) {
-    super(commandTarget);
+  public CliCommandInvalidException(final CommandTarget commandTarget) {
+    this(commandTarget, null, null);
   }
 
-  public CliCommandInvalidException(CommandTarget commandTarget,
-      OptionSet optionSet) {
-    super(commandTarget, optionSet);
+  public CliCommandInvalidException(final CommandTarget commandTarget, OptionSet optionSet) {
+    this(commandTarget, optionSet, null);
   }
 
+  public CliCommandInvalidException(final Throwable cause) {
+    this(null, null, cause);
+  }
+
+  public CliCommandInvalidException(final CommandTarget commandTarget, OptionSet optionSet, Throwable cause) {
+    super(commandTarget, optionSet, cause);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandMultiModeOptionException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandMultiModeOptionException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandMultiModeOptionException.java
index 5f5cbfd..3259406 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandMultiModeOptionException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandMultiModeOptionException.java
@@ -22,15 +22,18 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandMultiModeOptionException extends CliCommandOptionException {
   
-  public static final int MULTIPLE_LEAD_OPTIONS=1;
-  public static final int OPTIONS_FROM_MULTIPLE_MODES=2;
+  public static final int MULTIPLE_LEAD_OPTIONS = 1; // TODO: move or delete
+  public static final int OPTIONS_FROM_MULTIPLE_MODES = 2; // TODO: move or delete
   
   private String leadOptionString;
   private int code;
 
-  public CliCommandMultiModeOptionException(CommandTarget commandTarget,
-      Option option, String string, int code) {
-    super(commandTarget, option);
+  public CliCommandMultiModeOptionException(final CommandTarget commandTarget, final Option option, final String string, final int code) {
+    this(commandTarget, option, string, code, null);
+  }
+
+  public CliCommandMultiModeOptionException(final CommandTarget commandTarget, final Option option, final String string, final int code, final Throwable cause) {
+    super(commandTarget, option, cause);
     this.leadOptionString = string;
     this.code = code;
   }
@@ -42,7 +45,4 @@ public class CliCommandMultiModeOptionException extends CliCommandOptionExceptio
   public int getCode() {
     return code;
   }
-  
-  
 }
-

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandNotAvailableException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandNotAvailableException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandNotAvailableException.java
index cf8bc06..c1e1358 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandNotAvailableException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandNotAvailableException.java
@@ -21,13 +21,15 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandNotAvailableException extends CliCommandException {
 
-  public CliCommandNotAvailableException(CommandTarget commandTarget) {
-    super(commandTarget);
+  public CliCommandNotAvailableException(final CommandTarget commandTarget) {
+    this(commandTarget, null, null);
   }
 
-  public CliCommandNotAvailableException(CommandTarget commandTarget,
-      OptionSet optionSet) {
-    super(commandTarget, optionSet);
+  public CliCommandNotAvailableException(final CommandTarget commandTarget, final OptionSet optionSet) {
+    this(commandTarget, optionSet, null);
   }
 
+  public CliCommandNotAvailableException(final CommandTarget commandTarget, final OptionSet optionSet, final Throwable cause) {
+    super(commandTarget, optionSet, cause);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionException.java
index bfe6c3a..3fdec10 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionException.java
@@ -24,30 +24,36 @@ public class CliCommandOptionException extends CliCommandException {
 
   private Option option;
 
+  public CliCommandOptionException(final CommandTarget commandTarget, final Option option) {
+    this(commandTarget, option, null, null);
+  }
+
+  public CliCommandOptionException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet) {
+    this(commandTarget, option, optionSet, null);
+  }
+
+  public CliCommandOptionException(final CommandTarget commandTarget, final Option option, final Throwable cause) {
+    this(commandTarget, option, null, cause);
+  }
+
+  public CliCommandOptionException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final Throwable cause) {
+    super(commandTarget, optionSet, cause);
+    this.setOption(option);
+  }
+
   /**
-   * @return option for which the exception occured
+   * @return option for which the exception occurred
    */
   public Option getOption() {
     return option;
   }
 
   /**
-   * @param option
-   *          the option to set
+   * TODO: make this immutable
+   *
+   * @param option the option to set
    */
   public void setOption(Option option) {
     this.option = option;
   }
-
-  public CliCommandOptionException(CommandTarget commandTarget, Option option) {
-    super(commandTarget);
-    this.setOption(option);
-  }
-
-  public CliCommandOptionException(CommandTarget commandTarget, Option option,
-      OptionSet optionSet) {
-    super(commandTarget, optionSet);
-    this.setOption(option);
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionHasMultipleValuesException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionHasMultipleValuesException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionHasMultipleValuesException.java
index 3932636..2439945 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionHasMultipleValuesException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionHasMultipleValuesException.java
@@ -21,13 +21,22 @@ import com.gemstone.gemfire.management.internal.cli.parser.Option;
 import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandOptionHasMultipleValuesException extends CliCommandOptionValueException {
+
   private static final long serialVersionUID = -5277268341319591711L;
 
-  public CliCommandOptionHasMultipleValuesException(CommandTarget commandTarget, Option option, String value) {
-    super(commandTarget, option, value);
+  public CliCommandOptionHasMultipleValuesException(final CommandTarget commandTarget, final Option option, final String value) {
+    this(commandTarget, option, null, value, null);
+  }
+
+  public CliCommandOptionHasMultipleValuesException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value) {
+    this(commandTarget, option, optionSet, value, null);
+  }
+
+  public CliCommandOptionHasMultipleValuesException(final Throwable cause) {
+    this(null, null, null, null, cause);
   }
 
-  public CliCommandOptionHasMultipleValuesException(CommandTarget commandTarget, Option option, OptionSet optionSet, String value) {
-    super(commandTarget, option, optionSet, value);
+  public CliCommandOptionHasMultipleValuesException(final CommandTarget commandTarget, Option option, final OptionSet optionSet, final String value, final Throwable cause) {
+    super(commandTarget, option, optionSet, value, cause);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionInvalidException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionInvalidException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionInvalidException.java
index af7e44a..7ce747a 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionInvalidException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionInvalidException.java
@@ -22,13 +22,15 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandOptionInvalidException extends CliCommandOptionException {
 
-  public CliCommandOptionInvalidException(CommandTarget commandTarget,
-      Option option) {
-    super(commandTarget, option);
+  public CliCommandOptionInvalidException(final CommandTarget commandTarget, final Option option) {
+    this(commandTarget, option, null, null);
   }
 
-  public CliCommandOptionInvalidException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet) {
-    super(commandTarget, option, optionSet);
+  public CliCommandOptionInvalidException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet) {
+    this(commandTarget, option, optionSet, null);
+  }
+
+  public CliCommandOptionInvalidException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final Throwable cause) {
+    super(commandTarget, option, optionSet, cause);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionMissingException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionMissingException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionMissingException.java
index 00481fc..1a2c8fe 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionMissingException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionMissingException.java
@@ -22,14 +22,19 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandOptionMissingException extends CliCommandOptionException {
 
-  public CliCommandOptionMissingException(CommandTarget commandTarget,
-      Option option) {
-    super(commandTarget, option);
+  public CliCommandOptionMissingException(final CommandTarget commandTarget, final Option option) {
+    this(commandTarget, option, null, null);
   }
 
-  public CliCommandOptionMissingException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet) {
-    super(commandTarget, option, optionSet);
+  public CliCommandOptionMissingException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet) {
+    this(commandTarget, option, optionSet, null);
   }
 
+  public CliCommandOptionMissingException(final Throwable cause) {
+    this(null, null, null, cause);
+  }
+
+  public CliCommandOptionMissingException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final Throwable cause) {
+    super(commandTarget, option, optionSet, cause);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionNotApplicableException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionNotApplicableException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionNotApplicableException.java
index 4e99ba1..1e9f726 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionNotApplicableException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionNotApplicableException.java
@@ -20,17 +20,21 @@ import com.gemstone.gemfire.management.internal.cli.parser.CommandTarget;
 import com.gemstone.gemfire.management.internal.cli.parser.Option;
 import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
-public class CliCommandOptionNotApplicableException extends
-    CliCommandOptionException {
+public class CliCommandOptionNotApplicableException extends CliCommandOptionException {
 
-  public CliCommandOptionNotApplicableException(CommandTarget commandTarget,
-      Option option) {
-    super(commandTarget, option);
+  public CliCommandOptionNotApplicableException(final CommandTarget commandTarget, final Option option) {
+    this(commandTarget, option, null, null);
   }
 
-  public CliCommandOptionNotApplicableException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet) {
-    super(commandTarget, option, optionSet);
+  public CliCommandOptionNotApplicableException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet) {
+    this(commandTarget, option, optionSet, null);
   }
 
+  public CliCommandOptionNotApplicableException(final Throwable cause) {
+    this(null, null, null, cause);
+  }
+
+  public CliCommandOptionNotApplicableException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, Throwable cause) {
+    super(commandTarget, option, optionSet, cause);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueConversionException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueConversionException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueConversionException.java
index b16c8f2..8330f79 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueConversionException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueConversionException.java
@@ -20,17 +20,17 @@ import com.gemstone.gemfire.management.internal.cli.parser.CommandTarget;
 import com.gemstone.gemfire.management.internal.cli.parser.Option;
 import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
-public class CliCommandOptionValueConversionException extends
-    CliCommandOptionValueException {
+public class CliCommandOptionValueConversionException extends CliCommandOptionValueException {
 
-  public CliCommandOptionValueConversionException(CommandTarget commandTarget,
-      Option option, String value) {
-    super(commandTarget, option, value);
+  public CliCommandOptionValueConversionException(final CommandTarget commandTarget, final Option option, final String value) {
+    this(commandTarget, option, null, value, null);
   }
 
-  public CliCommandOptionValueConversionException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet, String value) {
-    super(commandTarget, option, optionSet, value);
+  public CliCommandOptionValueConversionException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value) {
+    this(commandTarget, option, optionSet, value, null);
   }
 
+  public CliCommandOptionValueConversionException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value, final Throwable cause) {
+    super(commandTarget, option, optionSet, value, null);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueException.java
index 774a8b1..4e04578 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueException.java
@@ -22,21 +22,26 @@ import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
 public class CliCommandOptionValueException extends CliCommandOptionException {
 
-  private String value;
+  private final String value;
 
-  public String getValue() {
-    return value;
+  public CliCommandOptionValueException(final CommandTarget commandTarget, final Option option, final String value) {
+    this(commandTarget, option, null, value, null);
   }
 
-  public CliCommandOptionValueException(CommandTarget commandTarget,
-      Option option, String value) {
-    super(commandTarget, option);
-    this.value = value;
+  public CliCommandOptionValueException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value) {
+    this(commandTarget, option, null, value, null);
+  }
+
+  public CliCommandOptionValueException(final Throwable cause) {
+    this(null, null, null, null, cause);
   }
 
-  public CliCommandOptionValueException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet, String value) {
-    super(commandTarget, option, optionSet);
+  public CliCommandOptionValueException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value, final Throwable cause) {
+    super(commandTarget, option, optionSet, cause);
     this.value = value;
   }
+
+  public String getValue() {
+    return value;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueMissingException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueMissingException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueMissingException.java
index 4eb2a6b..5fa02d9 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueMissingException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliCommandOptionValueMissingException.java
@@ -20,17 +20,21 @@ import com.gemstone.gemfire.management.internal.cli.parser.CommandTarget;
 import com.gemstone.gemfire.management.internal.cli.parser.Option;
 import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
 
-public class CliCommandOptionValueMissingException extends
-    CliCommandOptionValueException {
+public class CliCommandOptionValueMissingException extends CliCommandOptionValueException {
 
-  public CliCommandOptionValueMissingException(CommandTarget commandTarget,
-      Option option, String value) {
-    super(commandTarget, option, value);
+  public CliCommandOptionValueMissingException(final CommandTarget commandTarget, final Option option, final String value) {
+    this(commandTarget, option, null, value, null);
   }
 
-  public CliCommandOptionValueMissingException(CommandTarget commandTarget,
-      Option option, OptionSet optionSet, String value) {
-    super(commandTarget, option, optionSet, value);
+  public CliCommandOptionValueMissingException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value) {
+    this(commandTarget, option, optionSet, value, null);
+  }
+
+  public CliCommandOptionValueMissingException(final Throwable cause) {
+    this(null, null, null, null, cause);
   }
 
+  public CliCommandOptionValueMissingException(final CommandTarget commandTarget, final Option option, final OptionSet optionSet, final String value, final Throwable cause) {
+    super(commandTarget, option, optionSet, value);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliException.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliException.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliException.java
index bc0db3f..3e0551e 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliException.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/CliException.java
@@ -16,6 +16,21 @@
  */
 package com.gemstone.gemfire.management.internal.cli.exceptions;
 
-public class CliException extends Exception {
+public abstract class CliException extends Exception {
 
+  public CliException() {
+    this(null, null);
+  }
+
+  public CliException(String message) {
+    this(message, null);
+  }
+
+  public CliException(Throwable cause) {
+    super(null, cause);
+  }
+
+  public CliException(String message, Throwable cause) {
+    super(message, cause);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/ExceptionGenerator.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/ExceptionGenerator.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/ExceptionGenerator.java
index 6824735..61af7a4 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/ExceptionGenerator.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/exceptions/ExceptionGenerator.java
@@ -22,22 +22,26 @@ import joptsimple.OptionException;
 import joptsimple.OptionMissingRequiredArgumentException;
 import joptsimple.UnrecognizedOptionException;
 
+import com.gemstone.gemfire.management.internal.cli.parser.Option;
+
 /**
- * 
- *         Converts joptsimple exceptions into corresponding exceptions for cli
- * 
+ * Converts joptsimple exceptions into corresponding exceptions for cli
  */
 public class ExceptionGenerator {
 
-  public static CliException generate(OptionException oe) {
-    if (oe instanceof MissingRequiredOptionException) {
-      return new CliCommandOptionMissingException(null, null, null);
-    } else if (oe instanceof OptionMissingRequiredArgumentException) {
-      return new CliCommandOptionValueMissingException(null, null, null, null);
-    } else if (oe instanceof UnrecognizedOptionException) {
-      return new CliCommandOptionNotApplicableException(null, null, null);
-    } else if (oe instanceof MultipleArgumentsForOptionException) {
-      return new CliCommandOptionHasMultipleValuesException(null, null, null);
+  public static CliCommandOptionException generate(Option option, OptionException e) {
+    if (MissingRequiredOptionException.class.isInstance(e)) {
+      return new CliCommandOptionMissingException(e);
+
+    } else if (OptionMissingRequiredArgumentException.class.isInstance(e)) {
+      return new CliCommandOptionValueMissingException(e);
+
+    } else if (UnrecognizedOptionException.class.isInstance(e)) {
+      return new CliCommandOptionNotApplicableException(e);
+
+    } else if (MultipleArgumentsForOptionException.class.isInstance(e)) {
+      return new CliCommandOptionHasMultipleValuesException(e);
+
     } else {
       return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/Option.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/Option.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/Option.java
index 09aabd8..1d115ce 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/Option.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/Option.java
@@ -124,7 +124,7 @@ public class Option extends Parameter {
     return true;
   }
 
-  public final List<String> getAggregate() {
+  public List<String> getAggregate() {
     return aggregate;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/jopt/JoptOptionParser.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/jopt/JoptOptionParser.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/jopt/JoptOptionParser.java
index 6e56bf4..4ea9516 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/jopt/JoptOptionParser.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/parser/jopt/JoptOptionParser.java
@@ -44,9 +44,11 @@ import com.gemstone.gemfire.management.internal.cli.parser.preprocessor.TrimmedI
 /**
  * Implementation of {@link GfshOptionParser} which internally makes use of
  * {@link joptsimple.OptionParser}
+ *
+ * Newly constructed JoptOptionParser must be loaded with arguments and
+ * options before parsing command strings.
  * 
  * @since 7.0
- * 
  */
 public class JoptOptionParser implements GfshOptionParser {
 
@@ -119,11 +121,9 @@ public class JoptOptionParser implements GfshOptionParser {
       // int factor = 0;
       try {
         joptOptionSet = parser.parse(preProcessedInput);
-      } catch (Exception e) {
-        if (e instanceof OptionException) {
-          ce = processException(e);
-          joptOptionSet = ((OptionException) e).getDetected();
-        }
+      } catch (OptionException e) {
+        ce = processException(e);
+        joptOptionSet = e.getDetected();
       }
       if (joptOptionSet != null) {
 
@@ -244,19 +244,8 @@ public class JoptOptionParser implements GfshOptionParser {
     return optionSet;
   }
 
-  private CliCommandOptionException processException(Exception e) {
-    CliCommandOptionException ce = null;
-    if (e instanceof OptionException) {
-      ce = (CliCommandOptionException) ExceptionGenerator
-          .generate((OptionException) e);
-      if (ce != null) {
-        if (ce instanceof CliCommandOptionException) {
-          ((CliCommandOptionException) ce)
-              .setOption(getOption((OptionException) e));
-        }
-      }
-    }
-    return ce;
+  private CliCommandOptionException processException(final OptionException exception) {
+    return ExceptionGenerator.generate(getOption(exception), exception);
   }
 
   private Option getOption(OptionException oe) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/853c40d2/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/JoptOptionParserTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/JoptOptionParserTest.java b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/JoptOptionParserTest.java
new file mode 100644
index 0000000..ad82a94
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/JoptOptionParserTest.java
@@ -0,0 +1,507 @@
+/*
+ * 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 com.gemstone.gemfire.management.internal.cli;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import com.gemstone.gemfire.management.internal.cli.exceptions.CliCommandOptionMissingException;
+import com.gemstone.gemfire.management.internal.cli.exceptions.CliCommandOptionNotApplicableException;
+import com.gemstone.gemfire.management.internal.cli.parser.Argument;
+import com.gemstone.gemfire.management.internal.cli.parser.Option;
+import com.gemstone.gemfire.management.internal.cli.parser.OptionSet;
+import com.gemstone.gemfire.management.internal.cli.parser.jopt.JoptOptionParser;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+@RunWith(JUnitParamsRunner.class)
+public class JoptOptionParserTest {
+
+  private JoptOptionParser emptyOptionParser;
+  private OptionSet emptyOptionSet;
+
+  private Argument requiredArgument;
+  private Argument optionalArgument;
+
+  private Option requiredOption;
+  private Option optionalOption;
+
+  private JoptOptionParser simpleOptionParser;
+  private JoptOptionParser exampleOptionParser;
+
+  @Before
+  public void setUp() throws Exception {
+    this.emptyOptionParser = new JoptOptionParser();
+    this.emptyOptionSet = new OptionSet();
+    defineSimpleOptionParser();
+    defineExampleOptionParser();
+  }
+
+  @Test
+  public void getArgumentsIsEmptyByDefault() throws Exception {
+    assertThat(this.emptyOptionParser.getArguments()).isEmpty();
+  }
+
+  @Test
+  public void getOptionsIsNullByDefault() throws Exception {
+    assertThat(this.emptyOptionParser.getOptions()).isNull();
+  }
+
+  @Test
+  public void parseNullReturnsDefaultOptionSet() throws Exception {
+    OptionSet optionSet = this.emptyOptionParser.parse(null);
+    assertThat(optionSet.areArgumentsPresent()).isEqualTo(emptyOptionSet.areArgumentsPresent());
+    assertThat(optionSet.areOptionsPresent()).isEqualTo(emptyOptionSet.areOptionsPresent());
+    assertThat(optionSet.getNoOfSpacesRemoved()).isEqualTo(emptyOptionSet.getNoOfSpacesRemoved());
+    assertThat(optionSet.getSplit()).isEqualTo(emptyOptionSet.getSplit());
+    assertThat(optionSet.getNoOfSpacesRemoved()).isEqualTo(emptyOptionSet.getNoOfSpacesRemoved());
+    assertThat(optionSet.getUserInput()).isEqualTo(""); //emptyOptionSet.getUserInput());
+    assertThat(optionSet.getValue((Argument)null)).isEqualTo(emptyOptionSet.getValue((Argument)null));
+    assertThat(optionSet.getValue((Option)null)).isEqualTo(emptyOptionSet.getValue((Option)null));
+  }
+
+  @Test
+  public void parseEmptyThrowsNullPointerException() throws Exception {
+    assertThatThrownBy(() -> this.emptyOptionParser.parse("")).isInstanceOf(NullPointerException.class);
+  }
+
+  @Test
+  public void setArgumentsShouldCreateCopy() throws Exception {
+    Argument argument = mock(Argument.class);
+    when(argument.isRequired()).thenReturn(true);
+
+    LinkedList<Argument> arguments = new LinkedList<>();
+    arguments.add(argument);
+
+    this.emptyOptionParser.setArguments(arguments);
+
+    assertThat(this.emptyOptionParser.getArguments()).isNotSameAs(arguments);
+    assertThat(this.emptyOptionParser.getArguments()).hasSize(1);
+
+    arguments.clear();
+
+    assertThat(arguments).hasSize(0);
+    assertThat(this.emptyOptionParser.getArguments()).hasSize(1);
+  }
+
+  @Test
+  public void setArgumentsShouldKeepRequiredBeforeOptional() throws Exception {
+    Argument requiredArgument1 = mock(Argument.class);
+    when(requiredArgument1.isRequired()).thenReturn(true);
+    Argument optionalArgument1 = mock(Argument.class);
+    when(optionalArgument1.isRequired()).thenReturn(false);
+
+    LinkedList<Argument> arguments = new LinkedList<>();
+    arguments.add(requiredArgument1);
+    arguments.add(optionalArgument1);
+
+    this.emptyOptionParser.setArguments(arguments);
+
+    LinkedList<Argument> argumentsReturned = this.emptyOptionParser.getArguments();
+
+    assertThat(argumentsReturned).hasSize(2);
+    assertThat(argumentsReturned.getFirst()).isSameAs(requiredArgument1);
+    assertThat(argumentsReturned.getLast()).isSameAs(optionalArgument1);
+  }
+
+  @Test
+  public void setArgumentsShouldMoveRequiredBeforeOptional() throws Exception {
+    Argument requiredArgument1 = mock(Argument.class);
+    when(requiredArgument1.isRequired()).thenReturn(true);
+    Argument optionalArgument1 = mock(Argument.class);
+    when(optionalArgument1.isRequired()).thenReturn(false);
+
+    LinkedList<Argument> arguments = new LinkedList<>();
+    arguments.add(optionalArgument1);
+    arguments.add(requiredArgument1);
+
+    this.emptyOptionParser.setArguments(arguments);
+
+    LinkedList<Argument> argumentsReturned = this.emptyOptionParser.getArguments();
+
+    assertThat(argumentsReturned).hasSize(2);
+    assertThat(argumentsReturned.getFirst()).isSameAs(requiredArgument1);
+    assertThat(argumentsReturned.getLast()).isSameAs(optionalArgument1);
+  }
+
+  @Test
+  public void setOptionsShouldKeepSameInstance() throws Exception {
+    Option option = mock(Option.class);
+    ArrayList aggregate = new ArrayList<String>();
+    aggregate.add("option");
+    when(option.getAggregate()).thenReturn(aggregate);
+    when(option.getHelp()).thenReturn("help text");
+
+    LinkedList<Option> options = new LinkedList<>();
+    options.add(option);
+
+    this.emptyOptionParser.setOptions(options);
+
+    assertThat(this.emptyOptionParser.getOptions()).isSameAs(options);
+    assertThat(this.emptyOptionParser.getOptions()).hasSize(1);
+
+    options.clear();
+
+    assertThat(options).hasSize(0);
+    assertThat(this.emptyOptionParser.getOptions()).hasSize(0);
+  }
+
+  @Test
+  public void parseInputWithDefinedArgumentShouldWork() throws Exception {
+    LinkedList<Argument> arguments = new LinkedList<>();
+    LinkedList<Option> options = new LinkedList<>();
+
+    arguments.add(this.requiredArgument);
+
+    JoptOptionParser optionParser = new JoptOptionParser();
+    optionParser.setArguments(arguments);
+    optionParser.setOptions(options);
+
+    OptionSet optionSet = optionParser.parse("command1 argument1_value");
+    assertThat(optionSet.areArgumentsPresent()).isTrue();
+    assertThat(optionSet.hasArgument(this.requiredArgument)).isTrue();
+  }
+
+  @Test
+  public void parseInputWithOneArgumentShouldFindJustOneArgument() throws Exception {
+    LinkedList<Argument> arguments = new LinkedList<>();
+    LinkedList<Option> options = new LinkedList<>();
+
+    arguments.add(this.requiredArgument);
+
+    JoptOptionParser optionParser = new JoptOptionParser();
+    optionParser.setArguments(arguments);
+    optionParser.setOptions(options);
+
+    OptionSet optionSet = optionParser.parse("command1 argument1_value");
+    assertThat(optionSet.areArgumentsPresent()).isTrue();
+    assertThat(optionSet.hasArgument(this.requiredArgument)).isTrue();
+    assertThat(optionSet.hasArgument(this.optionalArgument)).isFalse();
+  }
+
+  @Test
+  public void parseInputWithTwoArgumentsShouldFindTwoArguments() throws Exception {
+    LinkedList<Argument> arguments = new LinkedList<>();
+    LinkedList<Option> options = new LinkedList<>();
+
+    arguments.add(this.requiredArgument);
+    arguments.add(this.optionalArgument);
+
+    JoptOptionParser optionParser = new JoptOptionParser();
+    optionParser.setArguments(arguments);
+    optionParser.setOptions(options);
+
+    OptionSet optionSet = optionParser.parse("command1 argument1_value? argument2_value");
+    assertThat(optionSet.areArgumentsPresent()).isTrue();
+    assertThat(optionSet.hasArgument(this.requiredArgument)).isTrue();
+    assertThat(optionSet.hasArgument(this.optionalArgument)).isTrue();
+  }
+
+  @Test
+  public void parseInputWithUndefinedArgumentShouldThrow() throws Exception {
+    LinkedList<Argument> arguments = new LinkedList<>();
+    LinkedList<Option> options = new LinkedList<>();
+
+    arguments.add(this.requiredArgument);
+
+    JoptOptionParser optionParser = new JoptOptionParser();
+    optionParser.setArguments(arguments);
+    optionParser.setOptions(options);
+
+    assertThatThrownBy(() -> optionParser.parse("command1 argument1_value? argument2_value")).isOfAnyClassIn(CliCommandOptionNotApplicableException.class);
+  }
+
+  @Test
+  public void parseInputWithUndefinedOptionShouldThrow() throws Exception {
+    assertThatThrownBy(() -> this.simpleOptionParser.parse("command1 argument1_value argument2_value --undefinedOption")).isExactlyInstanceOf(CliCommandOptionNotApplicableException.class);
+  }
+
+  @Test
+  public void parseInputWithOneOptionShouldFindOneOption() throws Exception {
+    OptionSet optionSet = this.simpleOptionParser.parse("command1 argument1_value --option1");
+    assertThat(optionSet.areOptionsPresent()).isTrue();
+    assertThat(optionSet.hasOption(this.requiredOption)).isTrue();
+    assertThat(optionSet.hasOption(this.optionalOption)).isFalse();
+  }
+
+  @Test
+  public void parseInputWithTwoOptionsShouldFindTwoOptions() throws Exception {
+    OptionSet optionSet = this.simpleOptionParser.parse("command1 argument1_value --option1 --option2");
+    assertThat(optionSet.areOptionsPresent()).isTrue();
+    assertThat(optionSet.hasOption(this.requiredOption)).isTrue();
+    assertThat(optionSet.hasOption(this.optionalOption)).isTrue();
+  }
+
+  @Test
+  public void parseInputWithOptionWithValueShouldFindOption() throws Exception {
+    OptionSet optionSet = this.simpleOptionParser.parse("command1 argument1_value --option1=value");
+    assertThat(optionSet.areOptionsPresent()).isTrue();
+    assertThat(optionSet.hasOption(this.requiredOption)).isTrue();
+  }
+
+  @Test
+  public void parseInputWithOptionWithoutValueShouldFindOption() throws Exception {
+    OptionSet optionSet = this.simpleOptionParser.parse("command1 argument1_value --option1");
+    assertThat(optionSet.areOptionsPresent()).isTrue();
+    assertThat(optionSet.hasOption(this.requiredOption)).isTrue();
+  }
+
+  @Test
+  public void parseInputWithoutOptionShouldNotFindOptions() throws Exception {
+    LinkedList<Argument> arguments = new LinkedList<>();
+    LinkedList<Option> options = new LinkedList<>();
+
+    arguments.add(this.requiredArgument);
+
+    JoptOptionParser optionParser = new JoptOptionParser();
+    optionParser.setArguments(arguments);
+    optionParser.setOptions(options);
+
+    OptionSet optionSet = optionParser.parse("command1 argument1_value");
+    assertThat(optionSet.areOptionsPresent()).isFalse();
+    assertThat(optionSet.hasOption(this.requiredOption)).isFalse();
+  }
+
+  @Test
+  @Parameters(method = "exampleInputParameters")
+  public void parseInputWithExampleInputParametesr(String command, boolean expectException, boolean hasArguments, boolean hasOptions) throws Exception {
+    if (expectException) {
+      assertThatThrownBy(() -> this.exampleOptionParser.parse(command)).isExactlyInstanceOf(CliCommandOptionMissingException.class);
+      return;
+    }
+
+    OptionSet options = this.exampleOptionParser.parse(command);
+    assertThat(options).isNotNull();
+    assertThat(options.areArgumentsPresent()).isEqualTo(hasArguments);
+    assertThat(options.areOptionsPresent()).isEqualTo(hasOptions);
+  }
+
+  private static Object[] exampleInputParameters() {
+    return new Object[]{
+      // 0
+      new Object[] { " ARGUMENT1_VALUE \u2014option1=somevalue", false, true, false },
+      // 1
+      new Object[] { " ARGUMENT1_VALUE?      ARGUMENT2_VALUE -- ----------", false, true, false },
+      // 2
+      new Object[] { " --option1=value", false, false, true },
+      // 3
+      new Object[] { "         ARGUMENT1_VALUE?       ARGUMENT2_VALUE --option1=option1value --option2", false, true, true },
+      // 4
+      new Object[] { "         ARGUMENT1_VALUE?       ARGUMENT2_VALUE --option1=option1value --option2=option2value --option3=option3value", false, true, true },
+      // 5
+      new Object[] { " --string=string1 --stringArray=1,2 --stringArray=3,4 --stringList=11,12,13 --integer=10 --stringArray=5 --stringList=14,15", false, false, true },
+      // 6
+      new Object[] { " --stringArray=1,2 --stringArray='3,4'", false, false, true },
+      // 7
+      new Object[] { " --string=\"1\" --colonArray=2:3:4 --stringArray=5,\"6,7\",8 --stringList=\"9,10,11,12\"", false, false, true },
+      // 8
+      new Object[] { " --string=string1 --stringArray=1,2 --string=string2", false, false, true },
+      // 9
+      new Object[] { " this is just one argument?this is a second argument", false, true, false }
+    };
+  }
+
+  private void defineSimpleOptionParser() {
+    LinkedList<Argument> arguments = new LinkedList<Argument>();
+    LinkedList<Option> options = new LinkedList<Option>();
+
+    this.requiredArgument = mock(Argument.class);
+    when(this.requiredArgument.getArgumentName()).thenReturn("argument1");
+    when(this.requiredArgument.getContext()).thenReturn("context for argument1");
+    when(this.requiredArgument.getHelp()).thenReturn("help for argument1");
+    when(this.requiredArgument.isRequired()).thenReturn(true);
+    arguments.add(this.requiredArgument);
+
+    this.optionalArgument = mock(Argument.class);
+    when(this.optionalArgument.getArgumentName()).thenReturn("argument2");
+    when(this.optionalArgument.getContext()).thenReturn("context for argument2");
+    when(this.optionalArgument.getHelp()).thenReturn("help for argument2");
+    when(this.optionalArgument.isRequired()).thenReturn(false);
+    when(this.optionalArgument.getUnspecifiedDefaultValue()).thenReturn("{unspecified default value for argument2}");
+    when(this.optionalArgument.isSystemProvided()).thenReturn(false);
+    arguments.add(this.optionalArgument);
+
+    this.requiredOption = mock(Option.class);
+    when(this.requiredOption.getLongOption()).thenReturn("--option1");
+    List<String> aggregate = new ArrayList<>();
+    aggregate.add("option1");
+    when(this.requiredOption.getAggregate()).thenReturn(aggregate);
+    when(this.requiredOption.getLongOption()).thenReturn("option1");
+    when(this.requiredOption.getHelp()).thenReturn("help for option1");
+    when(this.requiredOption.getValueSeparator()).thenReturn("=");
+    when(this.requiredOption.isRequired()).thenReturn(true);
+    assertThat(this.requiredOption.getAggregate()).isNotEmpty();
+    options.add(this.requiredOption);
+
+    this.optionalOption = mock(Option.class);
+    when(this.optionalOption.getLongOption()).thenReturn("--option2");
+    aggregate = new ArrayList<>();
+    aggregate.add("option2");
+    when(this.optionalOption.getAggregate()).thenReturn(aggregate);
+    when(this.optionalOption.getLongOption()).thenReturn("option2");
+    when(this.optionalOption.getHelp()).thenReturn("help for option2");
+    when(this.optionalOption.getValueSeparator()).thenReturn("=");
+    when(this.optionalOption.isRequired()).thenReturn(false);
+    assertThat(this.optionalOption.getAggregate()).isNotEmpty();
+    options.add(this.optionalOption);
+
+    this.simpleOptionParser = new JoptOptionParser();
+    this.simpleOptionParser.setArguments(arguments);
+    this.simpleOptionParser.setOptions(options);
+  }
+
+  private void defineExampleOptionParser() {
+    LinkedList<Argument> arguments = new LinkedList<Argument>();
+    LinkedList<Option> options = new LinkedList<Option>();
+
+    Argument argument1 = mock(Argument.class);
+    when(argument1.getArgumentName()).thenReturn("argument1");
+    when(argument1.getContext()).thenReturn("context for argument1");
+    when(argument1.getHelp()).thenReturn("help for argument1");
+    when(argument1.isRequired()).thenReturn(true);
+    arguments.add(argument1);
+
+    Argument argument2 = mock(Argument.class);
+    when(argument2.getArgumentName()).thenReturn("argument2");
+    when(argument2.getContext()).thenReturn("context for argument2");
+    when(argument2.getHelp()).thenReturn("help for argument2");
+    when(argument2.isRequired()).thenReturn(false);
+    when(argument2.getUnspecifiedDefaultValue()).thenReturn("{unspecified default value for argument2}");
+    when(argument2.isSystemProvided()).thenReturn(false);
+    arguments.add(argument2);
+
+    Argument argument3 = mock(Argument.class);
+    when(argument3.getArgumentName()).thenReturn("argument3");
+    when(argument3.getContext()).thenReturn("context for argument3");
+    when(argument3.getHelp()).thenReturn("help for argument3");
+    when(argument3.isRequired()).thenReturn(false);
+    when(argument3.getUnspecifiedDefaultValue()).thenReturn("{unspecified default value for argument3}");
+    when(argument2.isSystemProvided()).thenReturn(false);
+    arguments.add(argument3);
+
+    Option option1 = mock(Option.class);
+    when(option1.getLongOption()).thenReturn("--option1");
+    List<String> aggregate1 = new ArrayList<>();
+    aggregate1.add("option1");
+    when(option1.getAggregate()).thenReturn(aggregate1);
+    when(option1.getLongOption()).thenReturn("option1");
+    when(option1.getHelp()).thenReturn("help for option1");
+    when(option1.getValueSeparator()).thenReturn("=");
+    when(option1.isRequired()).thenReturn(false);
+    assertThat(option1.getAggregate()).isNotEmpty();
+    options.add(option1);
+
+    Option option2 = mock(Option.class);
+    when(option2.getLongOption()).thenReturn("--option2");
+    List<String> aggregate2 = new ArrayList<>();
+    aggregate2.add("option2");
+    when(option2.getAggregate()).thenReturn(aggregate2);
+    when(option2.getLongOption()).thenReturn("option2");
+    when(option2.getHelp()).thenReturn("help for option2");
+    when(option2.getValueSeparator()).thenReturn("=");
+    when(option2.isRequired()).thenReturn(false);
+    assertThat(option2.getAggregate()).isNotEmpty();
+    options.add(option2);
+
+    Option option3 = mock(Option.class);
+    when(option3.getLongOption()).thenReturn("--option3");
+    List<String> aggregate3 = new ArrayList<>();
+    aggregate3.add("option3");
+    when(option3.getAggregate()).thenReturn(aggregate3);
+    when(option3.getLongOption()).thenReturn("option3");
+    when(option3.getHelp()).thenReturn("help for option3");
+    when(option3.getValueSeparator()).thenReturn("=");
+    when(option3.isRequired()).thenReturn(false);
+    assertThat(option3.getAggregate()).isNotEmpty();
+    options.add(option3);
+
+    Option stringOption = mock(Option.class);
+    when(stringOption.getLongOption()).thenReturn("--string");
+    List<String> aggregateStringOption = new ArrayList<>();
+    aggregateStringOption.add("string");
+    when(stringOption.getAggregate()).thenReturn(aggregateStringOption);
+    when(stringOption.getLongOption()).thenReturn("string");
+    when(stringOption.getHelp()).thenReturn("help for string");
+    when(stringOption.getValueSeparator()).thenReturn("=");
+    when(stringOption.isRequired()).thenReturn(false);
+    assertThat(stringOption.getAggregate()).isNotEmpty();
+    options.add(stringOption);
+
+    Option stringArrayOption = mock(Option.class);
+    when(stringArrayOption.getLongOption()).thenReturn("--stringArray");
+    List<String> aggregateStringArrayOption = new ArrayList<>();
+    aggregateStringArrayOption.add("stringArray");
+    when(stringArrayOption.getAggregate()).thenReturn(aggregateStringArrayOption);
+    when(stringArrayOption.getLongOption()).thenReturn("stringArray");
+    when(stringArrayOption.getHelp()).thenReturn("help for stringArray");
+    when(stringArrayOption.getValueSeparator()).thenReturn("=");
+    when(stringArrayOption.isRequired()).thenReturn(false);
+    assertThat(stringArrayOption.getAggregate()).isNotEmpty();
+    options.add(stringArrayOption);
+
+    Option stringListOption = mock(Option.class);
+    when(stringListOption.getLongOption()).thenReturn("--stringList");
+    List<String> aggregateStringListOption = new ArrayList<>();
+    aggregateStringListOption.add("stringList");
+    when(stringListOption.getAggregate()).thenReturn(aggregateStringListOption);
+    when(stringListOption.getLongOption()).thenReturn("stringList");
+    when(stringListOption.getHelp()).thenReturn("help for stringList");
+    when(stringListOption.getValueSeparator()).thenReturn("=");
+    when(stringListOption.isRequired()).thenReturn(false);
+    assertThat(stringListOption.getAggregate()).isNotEmpty();
+    options.add(stringListOption);
+
+    Option integerOption = mock(Option.class);
+    when(integerOption.getLongOption()).thenReturn("--integer");
+    List<String> aggregateIntegerOption = new ArrayList<>();
+    aggregateIntegerOption.add("integer");
+    when(integerOption.getAggregate()).thenReturn(aggregateIntegerOption);
+    when(integerOption.getLongOption()).thenReturn("integer");
+    when(integerOption.getHelp()).thenReturn("help for integer");
+    when(integerOption.getValueSeparator()).thenReturn("=");
+    when(integerOption.isRequired()).thenReturn(false);
+    assertThat(integerOption.getAggregate()).isNotEmpty();
+    options.add(integerOption);
+
+    Option colonArrayOption = mock(Option.class);
+    when(colonArrayOption.getLongOption()).thenReturn("--colonArray");
+    List<String> aggregateColonArrayOption = new ArrayList<>();
+    aggregateColonArrayOption.add("colonArray");
+    when(colonArrayOption.getAggregate()).thenReturn(aggregateColonArrayOption);
+    when(colonArrayOption.getLongOption()).thenReturn("colonArray");
+    when(colonArrayOption.getHelp()).thenReturn("help for colonArray");
+    when(colonArrayOption.getValueSeparator()).thenReturn("=");
+    when(colonArrayOption.isRequired()).thenReturn(false);
+    assertThat(colonArrayOption.getAggregate()).isNotEmpty();
+    options.add(colonArrayOption);
+
+    this.exampleOptionParser = new JoptOptionParser();
+    this.exampleOptionParser.setArguments(arguments);
+    this.exampleOptionParser.setOptions(options);
+  }
+}


[3/5] incubator-geode git commit: GEODE-1246: change async event pool to use all its threads

Posted by kl...@apache.org.
GEODE-1246: change async event pool to use all its threads

The system property gemfire.Cache.EVENT_THREAD_LIMIT can be used to configure
the max number of threads used for async cache listener invocation.
It defaults to 16.


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

Branch: refs/heads/feature/GEODE-835
Commit: 1af92d89108dbdb570f60fe4682edb77558f91e2
Parents: a17dc71
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Wed May 18 09:23:38 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Fri May 20 14:54:24 2016 -0700

----------------------------------------------------------------------
 .../internal/PooledExecutorWithDMStats.java     |  9 +--
 .../internal/locks/DLockService.java            |  9 ++-
 .../internal/cache/GemFireCacheImpl.java        | 37 +++++------
 .../gemfire/internal/cache/LocalRegion.java     |  2 +-
 .../gemfire/internal/jndi/JNDIInvoker.java      |  3 +-
 .../internal/cache/GemFireCacheImplTest.java    | 66 ++++++++++++++++++++
 .../com/gemstone/gemfire/test/fake/Fakes.java   | 10 +++
 7 files changed, 106 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/PooledExecutorWithDMStats.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/PooledExecutorWithDMStats.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/PooledExecutorWithDMStats.java
index 0a9f9ec..3909474 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/PooledExecutorWithDMStats.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/PooledExecutorWithDMStats.java
@@ -39,7 +39,7 @@ public class PooledExecutorWithDMStats extends ThreadPoolExecutor {
   /** 
    * Create a new pool
    **/
-  public PooledExecutorWithDMStats(BlockingQueue<Runnable> q, int maxPoolSize, PoolStatHelper stats, ThreadFactory tf, int msTimeout, RejectedExecutionHandler reh) {
+  public PooledExecutorWithDMStats(SynchronousQueue<Runnable> q, int maxPoolSize, PoolStatHelper stats, ThreadFactory tf, int msTimeout, RejectedExecutionHandler reh) {
     super(getCorePoolSize(maxPoolSize), maxPoolSize,
           msTimeout, TimeUnit.MILLISECONDS,
           q, tf, reh);
@@ -61,9 +61,9 @@ public class PooledExecutorWithDMStats extends ThreadPoolExecutor {
    */
   private Thread bufferConsumer;
   
-  private static BlockingQueue<Runnable> initQ(BlockingQueue<Runnable> q) {
+  private static SynchronousQueue<Runnable> initQ(BlockingQueue<Runnable> q) {
     if (q instanceof SynchronousQueue) {
-      return q;
+      return (SynchronousQueue<Runnable>) q;
     } else {
       return new SynchronousQueue/*NoSpin*/<Runnable>();
     }
@@ -95,7 +95,8 @@ public class PooledExecutorWithDMStats extends ThreadPoolExecutor {
             try {
               for (;;) {
                 SystemFailure.checkFailure();
-                putQueue.put(takeQueue.take());
+                Runnable job = takeQueue.take();
+                putQueue.put(job);
               }
             }
             catch (InterruptedException ie) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/locks/DLockService.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/locks/DLockService.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/locks/DLockService.java
index 610944e..844a93d 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/locks/DLockService.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/locks/DLockService.java
@@ -133,7 +133,7 @@ public class DLockService extends DistributedLockService {
   private DLockRecoverGrantorProcessor.MessageProcessor recoverGrantorProcessor;
   
   /** Thread-safe reference to DistributedLockStats */
-  private final DistributedLockStats dlockStats = getOrCreateStats();
+  private final DistributedLockStats dlockStats;
   
   /** 
    * Protects {@link #lockGrantorId}, {@link #grantor} and 
@@ -2145,6 +2145,7 @@ public class DLockService extends DistributedLockService {
                          boolean destroyOnDisconnect,
                          boolean automateFreeResources) {
     super();
+    this.dlockStats = getOrCreateStats(ds);
     this.serialNumber = createSerialNumber();
     this.serviceName = serviceName;
     this.ds = (InternalDistributedSystem) ds;
@@ -3185,12 +3186,10 @@ public class DLockService extends DistributedLockService {
   }
   
   /** Get or create static dlock stats */
-  protected static synchronized DistributedLockStats getOrCreateStats() {
+  protected static synchronized DistributedLockStats getOrCreateStats(DistributedSystem ds) {
     if (stats == DUMMY_STATS) {
-      InternalDistributedSystem ds =
-          InternalDistributedSystem.getAnyInstance();
       Assert.assertTrue(ds != null, 
-          "Cannot find any instance of InternalDistributedSystem");
+          "Need an instance of InternalDistributedSystem");
       StatisticsFactory statFactory = ds;
       long statId = OSProcess.getId();
       stats = new DLockStats(statFactory, statId);

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
index 96b7bbc..c44f3b7 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
@@ -66,7 +66,6 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -270,9 +269,9 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
   private static final Set<CacheLifecycleListener> cacheLifecycleListeners = new HashSet<CacheLifecycleListener>();
 
   /**
-   * Define LocalRegion.ASYNC_EVENT_LISTENERS=true to invoke event listeners in the background
+   * Define gemfire.Cache.ASYNC_EVENT_LISTENERS=true to invoke event listeners in the background
    */
-  public static final boolean ASYNC_EVENT_LISTENERS = Boolean.getBoolean("gemfire.Cache.ASYNC_EVENT_LISTENERS");
+  private static final boolean ASYNC_EVENT_LISTENERS = Boolean.getBoolean("gemfire.Cache.ASYNC_EVENT_LISTENERS");
 
   /**
    * If true then when a delta is applied the size of the entry value will be recalculated. If false (the default) then
@@ -283,6 +282,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
   public static boolean DELTAS_RECALCULATE_SIZE = Boolean.getBoolean("gemfire.DELTAS_RECALCULATE_SIZE");
 
   public static final int EVENT_QUEUE_LIMIT = Integer.getInteger("gemfire.Cache.EVENT_QUEUE_LIMIT", 4096).intValue();
+  public static final int EVENT_THREAD_LIMIT = Integer.getInteger("gemfire.Cache.EVENT_THREAD_LIMIT", 16).intValue();
 
   /**
    * System property to limit the max query-execution time. By default its turned off (-1), the time is set in MiliSecs.
@@ -763,18 +763,22 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
   // }
 
   public static GemFireCacheImpl createClient(DistributedSystem system, PoolFactory pf, CacheConfig cacheConfig) {
-    return basicCreate(system, true, cacheConfig, pf, true);
+    return basicCreate(system, true, cacheConfig, pf, true, ASYNC_EVENT_LISTENERS);
   }
 
   public static GemFireCacheImpl create(DistributedSystem system, CacheConfig cacheConfig) {
-    return basicCreate(system, true, cacheConfig, null, false);
+    return basicCreate(system, true, cacheConfig, null, false, ASYNC_EVENT_LISTENERS);
   }
 
-  public static Cache create(DistributedSystem system, boolean existingOk, CacheConfig cacheConfig) {
-    return basicCreate(system, existingOk, cacheConfig, null, false);
+  public static GemFireCacheImpl createWithAsyncEventListeners(DistributedSystem system, CacheConfig cacheConfig) {
+    return basicCreate(system, true, cacheConfig, null, false, true);
+  }
+  
+ public static Cache create(DistributedSystem system, boolean existingOk, CacheConfig cacheConfig) {
+    return basicCreate(system, existingOk, cacheConfig, null, false, ASYNC_EVENT_LISTENERS);
   }
 
-  private static GemFireCacheImpl basicCreate(DistributedSystem system, boolean existingOk, CacheConfig cacheConfig, PoolFactory pf, boolean isClient)
+  private static GemFireCacheImpl basicCreate(DistributedSystem system, boolean existingOk, CacheConfig cacheConfig, PoolFactory pf, boolean isClient, boolean asyncEventListeners)
   throws CacheExistsException, TimeoutException, CacheWriterException,
   GatewayException,
   RegionExistsException 
@@ -782,7 +786,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
     try {
       GemFireCacheImpl instance = checkExistingCache(existingOk, cacheConfig);
       if (instance == null) {
-        instance = new GemFireCacheImpl(isClient, pf, system, cacheConfig);
+        instance = new GemFireCacheImpl(isClient, pf, system, cacheConfig, asyncEventListeners);
         instance.initialize();
       }
       return instance;
@@ -814,7 +818,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
   /**
    * Creates a new instance of GemFireCache and populates it according to the <code>cache.xml</code>, if appropriate.
    */
-  private GemFireCacheImpl(boolean isClient, PoolFactory pf, DistributedSystem system, CacheConfig cacheConfig) {
+  private GemFireCacheImpl(boolean isClient, PoolFactory pf, DistributedSystem system, CacheConfig cacheConfig, boolean asyncEventListeners) {
     this.isClient = isClient;
     this.clientpf = pf;
     this.cacheConfig = cacheConfig; // do early for bug 43213
@@ -825,7 +829,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
       
       // start JTA transaction manager within this synchronized block
       // to prevent race with cache close. fixes bug 43987
-      JNDIInvoker.mapTransactions();
+      JNDIInvoker.mapTransactions(system);
       this.system = (InternalDistributedSystem) system;
       this.dm = this.system.getDistributionManager();
       if (!this.isClient && PoolManager.getAll().isEmpty()) {
@@ -868,7 +872,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
 
       this.persistentMemberManager = new PersistentMemberManager();
 
-      if (ASYNC_EVENT_LISTENERS) {
+      if (asyncEventListeners) {
         final ThreadGroup group = LoggingThreadGroup.createThreadGroup("Message Event Threads",logger);
         ThreadFactory tf = new ThreadFactory() {
           public Thread newThread(final Runnable command) {
@@ -883,11 +887,8 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
             return thread;
           }
         };
-        // @todo darrel: add stats
-        // this.cachePerfStats.getEventQueueHelper());
         ArrayBlockingQueue q = new ArrayBlockingQueue(EVENT_QUEUE_LIMIT);
-        this.eventThreadPool = new PooledExecutorWithDMStats(q, 16, this.cachePerfStats.getEventPoolHelper(), tf, 1000,
-            new CallerRunsPolicy());
+        this.eventThreadPool = new PooledExecutorWithDMStats(q, EVENT_THREAD_LIMIT, this.cachePerfStats.getEventPoolHelper(), tf, 1000);
       } else {
         this.eventThreadPool = null;
       }
@@ -2078,7 +2079,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
 
         destroyGatewaySenderLockService();
 
-        if (ASYNC_EVENT_LISTENERS) {
+        if (this.eventThreadPool != null) {
           if (isDebugEnabled) {
             logger.debug("{}: stopping event thread pool...", this);
           }
@@ -3812,11 +3813,11 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
 
   /**
    * Returns the <code>Executor</code> (thread pool) that is used to execute cache event listeners.
+   * Returns <code>null</code> if no pool exists.
    *
    * @since 3.5
    */
   Executor getEventThreadPool() {
-    Assert.assertTrue(this.eventThreadPool != null);
     return this.eventThreadPool;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/LocalRegion.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/LocalRegion.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/LocalRegion.java
index b5ff7ee..d28496c 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/LocalRegion.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/LocalRegion.java
@@ -7582,7 +7582,7 @@ public class LocalRegion extends AbstractRegion
           }
         }
         
-        if (!GemFireCacheImpl.ASYNC_EVENT_LISTENERS) {
+        if (this.cache.getEventThreadPool() == null) {
           dispatchEvent(this, event, op);
         }
         else {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/main/java/com/gemstone/gemfire/internal/jndi/JNDIInvoker.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/jndi/JNDIInvoker.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/jndi/JNDIInvoker.java
index b3aecc4..2743537 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/jndi/JNDIInvoker.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/jndi/JNDIInvoker.java
@@ -125,9 +125,8 @@ public class JNDIInvoker  {
    * </p>
    *  
    */
-  public static void mapTransactions() {
+  public static void mapTransactions(DistributedSystem distSystem) {
     try {
-      DistributedSystem distSystem = InternalDistributedSystem.getAnyInstance();
       TransactionUtils.setLogWriter(distSystem.getLogWriter().convertToLogWriterI18n());
       cleanup();
       if (IGNORE_JTA) {

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/GemFireCacheImplTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/GemFireCacheImplTest.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/GemFireCacheImplTest.java
new file mode 100644
index 0000000..3dc2f7a
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/GemFireCacheImplTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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 com.gemstone.gemfire.internal.cache;
+
+import static org.junit.Assert.*;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import com.gemstone.gemfire.test.fake.Fakes;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+import com.jayway.awaitility.Awaitility;
+
+@Category(UnitTest.class)
+public class GemFireCacheImplTest {
+
+  @Test
+  public void checkThatAsyncEventListenersUseAllThreadsInPool() {
+    
+    GemFireCacheImpl gfc = GemFireCacheImpl.createWithAsyncEventListeners(Fakes.distributedSystem(), new CacheConfig());
+    ThreadPoolExecutor executor = (ThreadPoolExecutor) gfc.getEventThreadPool();
+    final long initialCount = executor.getCompletedTaskCount();
+    try {
+      int MAX_THREADS = GemFireCacheImpl.EVENT_THREAD_LIMIT;
+      final CountDownLatch cdl = new CountDownLatch(MAX_THREADS);
+      for (int i = 1; i <= MAX_THREADS; i++) {
+        Runnable r = new Runnable() {
+          @Override
+          public void run() {
+            cdl.countDown();
+            try {
+              cdl.await();
+            } catch (InterruptedException e) {
+            }
+          }
+        };
+        executor.execute(r);
+      }
+      Awaitility.await().pollInterval(10, TimeUnit.MILLISECONDS).pollDelay(10, TimeUnit.MILLISECONDS).timeout(15, TimeUnit.SECONDS)
+      .until(() -> {
+        return executor.getCompletedTaskCount() == MAX_THREADS+initialCount;
+      });
+    } finally {
+      executor.shutdown();
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1af92d89/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java b/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
index 2a1fd8e..16734b5 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/test/fake/Fakes.java
@@ -18,11 +18,14 @@ package com.gemstone.gemfire.test.fake;
 
 import static org.mockito.Mockito.*;
 
+import java.io.File;
 import java.net.UnknownHostException;
 
 import org.junit.Assert;
 
 import com.gemstone.gemfire.CancelCriterion;
+import com.gemstone.gemfire.LogWriter;
+import com.gemstone.gemfire.Statistics;
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.DataPolicy;
 import com.gemstone.gemfire.cache.Region;
@@ -65,6 +68,8 @@ public class Fakes {
     DistributionManager distributionManager = mock(DistributionManager.class);
     CancelCriterion systemCancelCriterion = mock(CancelCriterion.class);
     DSClock clock = mock(DSClock.class);
+    LogWriter logger = mock(LogWriter.class);
+    Statistics stats = mock(Statistics.class);
     
     InternalDistributedMember member;
     try {
@@ -73,6 +78,8 @@ public class Fakes {
       throw new RuntimeException(e);
     }
     
+    when(config.getCacheXmlFile()).thenReturn(new File(""));
+    when(config.getDeployWorkingDir()).thenReturn(new File("."));
     
     when(cache.getDistributedSystem()).thenReturn(system);
     when(cache.getMyId()).thenReturn(member);
@@ -84,6 +91,9 @@ public class Fakes {
     when(system.getDistributionManager()).thenReturn(distributionManager);
     when(system.getCancelCriterion()).thenReturn(systemCancelCriterion);
     when(system.getClock()).thenReturn(clock);
+    when(system.getLogWriter()).thenReturn(logger);
+    when(system.createAtomicStatistics(any(), any(), anyLong())).thenReturn(stats);
+    when(system.createAtomicStatistics(any(), any())).thenReturn(stats);
 
     when(distributionManager.getId()).thenReturn(member);
     when(distributionManager.getConfig()).thenReturn(config);