[java-matter-controller] Support to print help info for command (#23801)

diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/Command.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/Command.java
index 16c3b30..fe33e24 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/Command.java
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/Command.java
@@ -76,6 +76,10 @@
     return mArgs.size();
   }
 
+  public final boolean getArgumentIsOptional(int index) {
+    return mArgs.get(index).isOptional();
+  }
+
   /**
    * @brief Get argument description if it exists
    * @return A pointer to an Optional where the argument description will be stored
diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java
index ad6cd68..8a7110a 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java
@@ -22,6 +22,7 @@
 import java.util.Arrays;

 import java.util.HashMap;

 import java.util.Map;

+import java.util.Optional;

 

 public final class CommandManager {

   private final ArrayList<Command> mCommandMgr = new ArrayList<Command>();

@@ -96,7 +97,7 @@
       command.initArguments(temp.length, temp);

       command.run();

     } catch (IllegalArgumentException e) {

-      System.out.println("Arguments init failed with exception: " + e.getMessage());

+      showCommand(args[0], command);

     } catch (Exception e) {

       System.out.println("Run command failed with exception: " + e.getMessage());

     }

@@ -244,4 +245,45 @@
     System.out.println(

         "  +-------------------------------------------------------------------------------------+");

   }

+

+  private void showCommand(String clusterName, Command command) {

+    System.out.println("Usage:");

+

+    String arguments = command.getName();

+    String description = "";

+

+    int argumentsCount = command.getArgumentsCount();

+    for (int i = 0; i < argumentsCount; i++) {

+      String arg = "";

+      boolean isOptional = command.getArgumentIsOptional(i);

+      if (isOptional) {

+        arg += "[--";

+      }

+      arg += command.getArgumentName(i);

+      if (isOptional) {

+        arg += "]";

+      }

+      arguments += " ";

+      arguments += arg;

+

+      Optional<String> argDescription = command.getArgumentDescription(i);

+      if (argDescription.isPresent()) {

+        description += "\n";

+        description += arg;

+        description += ":\n  ";

+        description += argDescription.get();

+        description += "\n";

+      }

+    }

+    System.out.format("  java-matter-controller %s %s\n", clusterName, arguments);

+

+    Optional<String> helpText = command.getHelpText();

+    if (helpText.isPresent()) {

+      System.out.format("\n%s\n", helpText.get());

+    }

+

+    if (!description.isEmpty()) {

+      System.out.println(description);

+    }

+  }

 }

diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/MatterCommand.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/MatterCommand.java
index d78a7bb..5336ce8 100644
--- a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/MatterCommand.java
+++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/MatterCommand.java
@@ -58,38 +58,38 @@
     this.mChipDeviceController = controller;
 
     addArgument(
-        "--paa-trust-store-path",
+        "paa-trust-store-path",
         mPaaTrustStorePath,
         "Path to directory holding PAA certificate information.  Can be absolute or relative to the current working "
             + "directory.",
         true);
     addArgument(
-        "--cd-trust-store-path",
+        "cd-trust-store-path",
         mCDTrustStorePath,
         "Path to directory holding CD certificate information.  Can be absolute or relative to the current working "
             + "directory.",
         true);
     addArgument(
-        "--commissioner-name",
+        "commissioner-name",
         mCommissionerName,
         "Name of fabric to use. Valid values are \"alpha\", \"beta\", \"gamma\", and integers greater than or equal to "
             + "4.  The default if not specified is \"alpha\".",
         true);
     addArgument(
-        "--commissioner-nodeid",
+        "commissioner-nodeid",
         0,
         Long.MAX_VALUE,
         mCommissionerNodeId,
-        "The node id to use for chip-tool.  If not provided, kTestControllerNodeId (112233, 0x1B669) will be used.",
+        "The node id to use for java-matter-controller.  If not provided, kTestControllerNodeId (112233, 0x1B669) will be used.",
         true);
     addArgument(
-        "--use-max-sized-certs",
+        "use-max-sized-certs",
         mUseMaxSizedCerts,
         "Maximize the size of operational certificates. If not provided or 0 (\"false\"), normally sized operational "
             + "certificates are generated.",
         true);
     addArgument(
-        "--only-allow-trusted-cd-keys",
+        "only-allow-trusted-cd-keys",
         mOnlyAllowTrustedCdKeys,
         "Only allow trusted CD verifying keys (disallow test keys). If not provided or 0 (\"false\"), untrusted CD "
             + "verifying keys are allowed. If 1 (\"true\"), test keys are disallowed.",