mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

lutoff
24.13.2007 a746e30f968e6d0e544e7d30b18245b3018c2838
fix for issue #1635 (In CLi Usage, the 'help' information shoud be the last element)

when iterating on the argument list, store the ussageArgument and handle
it at the end.
This proposed modification also adds code to improve handling of
"-V/--version"
3 files modified
515 ■■■■■ changed files
opends/src/ads/org/opends/admin/ads/DsServiceCLI.java 2 ●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/args/ArgumentParser.java 276 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/args/SubCommandArgumentParser.java 237 ●●●● patch | view | raw | blame | history
opends/src/ads/org/opends/admin/ads/DsServiceCLI.java
@@ -312,7 +312,7 @@
    }
    // If we should just display usage information, then print it and exit.
    if (argParser.usageDisplayed())
    if (argParser.usageOrVersionDisplayed())
    {
      return 0;
    }
opends/src/server/org/opends/server/util/args/ArgumentParser.java
@@ -1050,6 +1050,7 @@
    buffer.append( getMessage(MSGID_DESCRIPTION_PRODUCT_VERSION));
    buffer.append(EOL);
    Argument helpArgument = null ;
    for (Argument a : argumentList)
    {
      // If this argument is hidden, then skip it.
@@ -1058,133 +1059,20 @@
        continue;
      }
      // Write a line with the short and/or long identifiers that may be used
      // for the argument.
      Character shortID = a.getShortIdentifier();
      String longID = a.getLongIdentifier();
      if (shortID != null)
      // Help argument should be printed at the end
      if ((usageArgument != null) ? usageArgument.getName().equals(a.getName())
          : false)
      {
        int currentLength = buffer.length();
        if (usageArgument.getName().equals(a.getName()))
        {
          buffer.append("-?, ");
        }
        buffer.append("-");
        buffer.append(shortID.charValue());
        if (a.needsValue() && longID == null)
        {
          buffer.append(" ");
          buffer.append(a.getValuePlaceholder());
        }
        if (longID != null)
        {
          StringBuilder newBuffer = new StringBuilder();
          newBuffer.append(", --");
          newBuffer.append(longID);
          if (a.needsValue())
          {
            newBuffer.append(" ");
            newBuffer.append(a.getValuePlaceholder());
          }
          int lineLength = (buffer.length() - currentLength) +
                           newBuffer.length();
          if (lineLength > 80)
          {
            buffer.append(EOL);
            buffer.append(newBuffer.toString());
          }
          else
          {
            buffer.append(newBuffer.toString());
          }
        }
        buffer.append(EOL);
        helpArgument = a ;
        continue ;
      }
      else
      {
        if (longID != null)
        {
          if (usageArgument.getName().equals(a.getName()))
          {
            buffer.append("-?, ");
          }
          buffer.append("--");
          buffer.append(longID);
          if (a.needsValue())
          {
            buffer.append(" ");
            buffer.append(a.getValuePlaceholder());
          }
          buffer.append(EOL);
        }
      }
      // Write one or more lines with the description of the argument.  We will
      // indent the description five characters and try our best to wrap at or
      // before column 79 so it will be friendly to 80-column displays.
      String description = a.getDescription();
      if (description.length() <= 75)
      {
        buffer.append("    ");
        buffer.append(description);
        buffer.append(EOL);
      }
      else
      {
        String s = description;
        while (s.length() > 75)
        {
          int spacePos = s.lastIndexOf(' ', 75);
          if (spacePos > 0)
          {
            buffer.append("    ");
            buffer.append(s.substring(0, spacePos).trim());
            s = s.substring(spacePos+1).trim();
            buffer.append(EOL);
          }
          else
          {
            // There are no spaces in the first 74 columns.  See if there is one
            // after that point.  If so, then break there.  If not, then don't
            // break at all.
            spacePos = s.indexOf(' ');
            if (spacePos > 0)
            {
              buffer.append("    ");
              buffer.append(s.substring(0, spacePos).trim());
              s = s.substring(spacePos+1).trim();
              buffer.append(EOL);
            }
            else
            {
              buffer.append("    ");
              buffer.append(s);
              s = "";
              buffer.append(EOL);
            }
          }
        }
        if (s.length() > 0)
        {
          buffer.append("    ");
          buffer.append(s);
          buffer.append(EOL);
        }
      }
      printArgumentUsage(a, buffer);
    }
    if (usageArgument == null)
    if (helpArgument != null)
    {
      printArgumentUsage(helpArgument, buffer);
    }
    else
    {
      buffer.append(EOL);
      buffer.append("-?");
@@ -1245,5 +1133,145 @@
    return usageOrVersionDisplayed;
  }
  /**
  * Appends argument usage information to the provided buffer.
  *
  * @param a The argument to handle.
  * @param buffer
  *          The buffer to which the usage information should be
  *          appended.
  */
   private void printArgumentUsage(Argument a, StringBuilder buffer)
  {
    // Write a line with the short and/or long identifiers that may be
    // used
    // for the argument.
    Character shortID = a.getShortIdentifier();
    String longID = a.getLongIdentifier();
    if (shortID != null)
    {
      int currentLength = buffer.length();
      if (usageArgument.getName().equals(a.getName()))
      {
        buffer.append("-?, ");
      }
      buffer.append("-");
      buffer.append(shortID.charValue());
      if (a.needsValue() && longID == null)
      {
        buffer.append(" ");
        buffer.append(a.getValuePlaceholder());
      }
      if (longID != null)
      {
        StringBuilder newBuffer = new StringBuilder();
        newBuffer.append(", --");
        newBuffer.append(longID);
        if (a.needsValue())
        {
          newBuffer.append(" ");
          newBuffer.append(a.getValuePlaceholder());
        }
        int lineLength = (buffer.length() - currentLength) +
                         newBuffer.length();
        if (lineLength > 80)
        {
          buffer.append(EOL);
          buffer.append(newBuffer.toString());
        }
        else
        {
          buffer.append(newBuffer.toString());
        }
      }
      buffer.append(EOL);
    }
    else
    {
      if (longID != null)
      {
        if (usageArgument.getName().equals(a.getName()))
        {
          buffer.append("-?, ");
        }
        buffer.append("--");
        buffer.append(longID);
        if (a.needsValue())
        {
          buffer.append(" ");
          buffer.append(a.getValuePlaceholder());
        }
        buffer.append(EOL);
      }
    }
    // Write one or more lines with the description of the argument.
    // We will
    // indent the description five characters and try our best to wrap
    // at or
    // before column 79 so it will be friendly to 80-column displays.
    String description = a.getDescription();
    if (description.length() <= 75)
    {
      buffer.append("    ");
      buffer.append(description);
      buffer.append(EOL);
    }
    else
    {
      String s = description;
      while (s.length() > 75)
      {
        int spacePos = s.lastIndexOf(' ', 75);
        if (spacePos > 0)
        {
          buffer.append("    ");
          buffer.append(s.substring(0, spacePos).trim());
          s = s.substring(spacePos+1).trim();
          buffer.append(EOL);
        }
        else
        {
          // There are no spaces in the first 74 columns. See if there
          // is one
          // after that point. If so, then break there. If not, then
          // don't
          // break at all.
          spacePos = s.indexOf(' ');
          if (spacePos > 0)
          {
            buffer.append("    ");
            buffer.append(s.substring(0, spacePos).trim());
            s = s.substring(spacePos+1).trim();
            buffer.append(EOL);
          }
          else
          {
            buffer.append("    ");
            buffer.append(s);
            s = "";
            buffer.append(EOL);
          }
        }
      }
      if (s.length() > 0)
      {
        buffer.append("    ");
        buffer.append(s);
        buffer.append(EOL);
      }
    }
  }
}
opends/src/server/org/opends/server/util/args/SubCommandArgumentParser.java
@@ -41,6 +41,7 @@
import org.opends.server.core.DirectoryServer;
import static org.opends.server.messages.MessageHandler.*;
import static org.opends.server.messages.ToolMessages.*;
import static org.opends.server.messages.UtilityMessages.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -72,7 +73,7 @@
  private boolean longArgumentsCaseSensitive;
  // Indicates whether the usage information has been displayed.
  private boolean usageDisplayed;
  private boolean usageOrVersionDisplayed;
  // The set of global arguments defined for this parser, referenced by short
  // ID.
@@ -140,7 +141,7 @@
    globalShortIDMap   = new HashMap<Character,Argument>();
    globalLongIDMap    = new HashMap<String,Argument>();
    subCommands        = new TreeMap<String,SubCommand>();
    usageDisplayed     = false;
    usageOrVersionDisplayed     = false;
    rawArguments       = null;
    subCommand         = null;
    usageArgument      = null;
@@ -658,7 +659,7 @@
    this.rawArguments = rawArguments;
    this.subCommand = null;
    this.trailingArguments = new ArrayList<String>();
    this.usageDisplayed = false;
    this.usageOrVersionDisplayed = false;
    boolean inTrailingArgs = false;
@@ -747,6 +748,7 @@
              try
              {
                DirectoryServer.printVersion(usageOutputStream);
                usageOrVersionDisplayed = true ;
              } catch (Exception e) {}
              return;
@@ -783,6 +785,7 @@
                try
                {
                  DirectoryServer.printVersion(usageOutputStream);
                  usageOrVersionDisplayed = true ;
                } catch (Exception e) {}
                return;
@@ -905,13 +908,45 @@
            else
            if (argCharacter == OPTION_SHORT_PRODUCT_VERSION)
            {
              // "-V" will always be interpreted as requesting
              // version information.
              try
              //  "-V" will always be interpreted as requesting
              // version information except if it's already defined.
              boolean dashVAccepted = true;
              if (globalShortIDMap.containsKey(OPTION_SHORT_PRODUCT_VERSION))
              {
                dashVAccepted = false;
              }
              else
              {
                for (SubCommand subCmd : subCommands.values())
                {
                getUsage(usageOutputStream);
              } catch (Exception e) {}
              return;
                  if (subCmd.getArgument(OPTION_SHORT_PRODUCT_VERSION) != null)
                  {
                    dashVAccepted = false;
                    break;
                  }
                }
              }
              if (dashVAccepted)
              {
                usageOrVersionDisplayed = true;
                try
                {
                  DirectoryServer.printVersion(usageOutputStream);
                }
                catch (Exception e)
                {
                }
                return;
              }
              else
              {
                // -V is defined in another suncommand, so we can
                // accepted it as the version information argument
                int msgID = MSGID_SUBCMDPARSER_NO_GLOBAL_ARGUMENT_FOR_SHORT_ID;
                String message = getMessage(msgID,
                    String.valueOf(argCharacter));
                throw new ArgumentException(msgID, message);
              }
            }
            else
            {
@@ -939,13 +974,36 @@
              else
              if (argCharacter == OPTION_SHORT_PRODUCT_VERSION)
              {
                // "-V" will always be interpreted as requesting
                // version information.
                try
                  // "-V" will always be interpreted as requesting
                  // version information except if it's alreadydefined.
                boolean dashVAccepted = true;
                if (globalShortIDMap.containsKey(OPTION_SHORT_PRODUCT_VERSION))
                {
                  getUsage(usageOutputStream);
                } catch (Exception e) {}
                return;
                  dashVAccepted = false;
                }
                else
                {
                  for (SubCommand subCmd : subCommands.values())
                  {
                    if (subCmd.getArgument(OPTION_SHORT_PRODUCT_VERSION)!=null)
                    {
                      dashVAccepted = false;
                      break;
                    }
                  }
                }
                if (dashVAccepted)
                {
                  usageOrVersionDisplayed = true;
                  try
                  {
                    DirectoryServer.printVersion(usageOutputStream);
                  }
                  catch (Exception e)
                  {
                  }
                  return;
                }
              }
              else
              {
@@ -1228,7 +1286,7 @@
   */
  public void getFullUsage(StringBuilder buffer)
  {
    usageDisplayed = true;
    usageOrVersionDisplayed = true;
    if ((toolDescription != null) && (toolDescription.length() > 0))
    {
      buffer.append(wrapText(toolDescription, 79));
@@ -1277,6 +1335,33 @@
    buffer.append("The accepted value for global options are:");
    buffer.append(EOL);
    // --version is a builtin option
    boolean dashVAccepted = true;
    if (globalShortIDMap.containsKey(OPTION_SHORT_PRODUCT_VERSION))
    {
      dashVAccepted = false;
    }
    else
    {
      for (SubCommand subCmd : subCommands.values())
      {
        if (subCmd.getArgument(OPTION_SHORT_PRODUCT_VERSION) != null)
        {
          dashVAccepted = false;
          break;
        }
      }
    }
    if (dashVAccepted)
    {
      buffer.append("-" + OPTION_SHORT_PRODUCT_VERSION + ", ");
    }
    buffer.append("--" + OPTION_LONG_PRODUCT_VERSION);
    buffer.append(EOL);
    buffer.append("    ");
    buffer.append( getMessage(MSGID_DESCRIPTION_PRODUCT_VERSION));
    buffer.append(EOL);
    Argument helpArgument = null ;
    for (Argument a : globalArgumentList)
    {
      if (a.isHidden())
@@ -1284,65 +1369,93 @@
        continue;
      }
      String value;
      if (a.needsValue())
      // Help argument should be printed at the end
      if ((usageArgument != null) ? usageArgument.getName().equals(a.getName())
          : false)
      {
        String valuePlaceholder = a.getValuePlaceholder();
        if (valuePlaceholder == null)
        {
          value = " {value}";
        }
        else
        {
          value = " " + valuePlaceholder;
        }
        helpArgument = a ;
        continue ;
      }
      printArgumentUsage(a, buffer);
    }
    if (helpArgument != null)
    {
      printArgumentUsage(helpArgument, buffer);
    }
    else
    {
      buffer.append("-?");
    }
    buffer.append(EOL);
  }
/**
 * Appends argument usage information to the provided buffer.
 *
 * @param a The argument to handle.
 * @param buffer
 *          The buffer to which the usage information should be
 *          appended.
 */
  private void printArgumentUsage(Argument a, StringBuilder buffer)
  {
    String value;
    if (a.needsValue())
    {
      String valuePlaceholder = a.getValuePlaceholder();
      if (valuePlaceholder == null)
      {
        value = " {value}";
      }
      else
      {
        value = "";
        value = " " + valuePlaceholder;
      }
    }
    else
    {
      value = "";
    }
      Character shortIDChar = a.getShortIdentifier();
      boolean isHelpArg = usageArgument.getName().equals(a.getName());
      if (shortIDChar != null)
    Character shortIDChar = a.getShortIdentifier();
    boolean isHelpArg = (usageArgument != null) ? usageArgument.getName()
        .equals(a.getName()) : false;
    if (shortIDChar != null)
    {
      if (isHelpArg)
      {
        buffer.append("-?, ");
      }
      buffer.append("-");
      buffer.append(shortIDChar);
      String longIDString = a.getLongIdentifier();
      if (longIDString != null)
      {
        buffer.append(", --");
        buffer.append(longIDString);
      }
      buffer.append(value);
    }
    else
    {
      String longIDString = a.getLongIdentifier();
      if (longIDString != null)
      {
        if (isHelpArg)
        {
          buffer.append("-?, ");
        }
        buffer.append("-");
        buffer.append(shortIDChar);
        String longIDString = a.getLongIdentifier();
        if (longIDString != null)
        {
          buffer.append(", --");
          buffer.append(longIDString);
        }
        buffer.append("--");
        buffer.append(longIDString);
        buffer.append(value);
      }
      else
      {
        String longIDString = a.getLongIdentifier();
        if (longIDString != null)
        {
          if (isHelpArg)
          {
            buffer.append("-?, ");
          }
          buffer.append("--");
          buffer.append(longIDString);
          buffer.append(value);
        }
      }
      buffer.append(EOL);
      indentAndWrap("    ", a.getDescription(), buffer);
    }
    buffer.append(EOL);
    indentAndWrap("    ", a.getDescription(), buffer);
  }
@@ -1358,7 +1471,7 @@
   */
  public void getSubCommandUsage(StringBuilder buffer, SubCommand subCommand)
  {
    usageDisplayed = true;
    usageOrVersionDisplayed = true;
    String scriptName = System.getProperty(PROPERTY_SCRIPT_NAME);
    String printName;
    if ((scriptName == null) || (scriptName.length() == 0))
@@ -1615,9 +1728,9 @@
   * @return  {@code true} if the usage information has been displayed, or
   *          {@code false} if not.
   */
  public boolean usageDisplayed()
  public boolean usageOrVersionDisplayed()
  {
    return usageDisplayed;
    return usageOrVersionDisplayed;
  }