From 314e6e2709c4b0ebfe509e262ca366874f9069da Mon Sep 17 00:00:00 2001
From: Mark Craig <mark.craig@forgerock.com>
Date: Wed, 11 Mar 2015 11:59:20 +0000
Subject: [PATCH] CR-6316 OPENDJ-1786 Automate integration of generated content

---
 opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java |  116 ++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 88 insertions(+), 28 deletions(-)

diff --git a/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java b/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
index 6777007..262c3b0 100644
--- a/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
+++ b/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
@@ -33,12 +33,15 @@
 import static com.forgerock.opendj.util.StaticUtils.*;
 
 import java.io.OutputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 import java.util.SortedMap;
@@ -1104,31 +1107,32 @@
     }
 
     /**
-     * Appends a list generated DocBook XML RefSect2 elements to the StringBuilder, one per subcommand.
+     * Appends a generated DocBook XML RefEntry element for this command to the StringBuilder.
      *
-     * <br>
-     *
-     * Note: The result is not a complete XML document.
-     * Instead you must wrap the resulting list of RefSect2 elements in a RefSect1.
-     *
-     * @param builder   Append the list of RefSect2 elements to this.
-     * @param values    The SubCommands containing the reference information.
+     * @param builder       Append the RefEntry element to this.
+     * @param subCommands   SubCommands containing reference information.
      */
-    private void generateReferenceDoc(final StringBuilder builder, Collection<SubCommand> values) {
-        for (SubCommand s : values) {
-            toRefSect2(s, builder);
+    private void generateReferenceDoc(final StringBuilder builder, Collection<SubCommand> subCommands) {
+        toRefEntry(builder, subCommands);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    String getSynopsisArgs() {
+        if (subCommands.isEmpty()) {
+            return INFO_SUBCMDPARSER_OPTIONS.get().toString();
+        } else {
+            return INFO_SUBCMDPARSER_SUBCMD_AND_OPTIONS.get().toString();
         }
     }
 
     /**
-     * Appends a generated DocBook XML RefSect2 element for a single subcommand to the StringBuilder.
+     * Appends a generated DocBook XML RefEntry (man page) to the StringBuilder.
      *
-     * @param sc
-     *            The SubCommand containing reference information.
-     * @param sb
-     *            Append the RefSect2 element to this.
+     * @param builder       Append the RefEntry element to this.
+     * @param subCommands   Collection of subcommands for this tool.
      */
-    private void toRefSect2(SubCommand sc, StringBuilder sb) {
+    void toRefEntry(StringBuilder builder, Collection<SubCommand> subCommands) {
         final String scriptName = getScriptName();
         if (scriptName == null) {
             throw new RuntimeException("The script name should have been set via the environment property '"
@@ -1137,20 +1141,72 @@
 
         // Model for a FreeMarker template.
         Map<String, Object> map = new HashMap<String, Object>();
-        map.put("id", scriptName + "-" + sc.getName());
-        final String name = scriptName + " " + sc.getName();
+        map.put("locale", Locale.getDefault().getLanguage());
+        map.put("year", new SimpleDateFormat("yyyy").format(new Date()));
+        map.put("name", scriptName);
+        map.put("shortDesc", getShortToolDescription());
+        map.put("descTitle", REF_TITLE_DESCRIPTION.get());
+        map.put("args", getSynopsisArgs());
+        map.put("description", getToolDescription());
+        map.put("info", getDocToolDescriptionSupplement());
+        if (!globalArgumentList.isEmpty()) {
+            map.put("optionSection", getOptionsRefSect1(scriptName));
+        }
+        map.put("subcommands", toRefSect1(scriptName, subCommands));
+        map.put("trailingSections", pathsToXIncludes(getPathsToTrailingRefSect1s()));
+        applyTemplate(builder, "refEntry.ftl", map);
+    }
+
+    /**
+     * Returns a generated DocBook XML RefSect1 element for all subcommands.
+     * @param scriptName    The name of this script.
+     * @param subCommands   The SubCommands containing the reference information.
+     * @return              The RefSect1 element as a String.
+     */
+    private String toRefSect1(String scriptName, Collection<SubCommand> subCommands) {
+        if (subCommands.isEmpty()) {
+            return "";
+        }
+
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("name", scriptName);
+        map.put("info", getDocSubcommandsDescriptionSupplement());
+
+        List<String> scUsageList = new ArrayList<String>();
+        for (SubCommand subCommand : subCommands) {
+            scUsageList.add(toRefSect2(scriptName, subCommand));
+        }
+        map.put("subcommands", scUsageList);
+
+        StringBuilder sb = new StringBuilder();
+        applyTemplate(sb, "refSect1.ftl", map);
+        return sb.toString();
+    }
+
+    /**
+     * Returns a generated DocBook XML RefSect2 element for a single subcommand to the StringBuilder.
+     *
+     * @param scriptName    The name of this script.
+     * @param subCommand    The SubCommand containing reference information.
+     * @return    The RefSect2 element as a String.
+     */
+    private String toRefSect2(String scriptName, SubCommand subCommand) {
+        // Model for a FreeMarker template.
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("id", scriptName + "-" + subCommand.getName());
+        final String name = scriptName + " " + subCommand.getName();
         map.put("name", name);
-        map.put("description", sc.getDescription());
-        map.put("optsTitle", REF_TITLE_OPTIONS.get());
-        map.put("optsIntro", REF_INTRO_OPTIONS.get(name));
+        map.put("description", subCommand.getDescription());
+        map.put("optionsTitle", REF_TITLE_OPTIONS.get());
+        map.put("optionsIntro", REF_INTRO_OPTIONS.get(name));
 
         // If there is a supplement to the description for this subcommand,
         // then it is already DocBook XML, so use it as is.
-        map.put("info", sc.getDocDescriptionSupplement());
-        if (!sc.getArguments().isEmpty()) {
+        map.put("info", subCommand.getDocDescriptionSupplement());
+        if (!subCommand.getArguments().isEmpty()) {
             List<Map<String, Object>> options = new LinkedList<Map<String, Object>>();
             String nameOption = null;
-            for (Argument a : sc.getArguments()) {
+            for (Argument a : subCommand.getArguments()) {
                 Map<String, Object> option = new HashMap<String, Object>();
                 String optionSynopsis = getOptionSynopsis(a);
                 option.put("synopsis", optionSynopsis);
@@ -1162,9 +1218,10 @@
                     }
 
                     // Let this build its own arbitrarily formatted additional info.
-                    info.put("usage", subCommandUsageHandler.getArgumentAdditionalInfo(sc, a, nameOption));
+                    info.put("usage", subCommandUsageHandler.getArgumentAdditionalInfo(subCommand, a, nameOption));
                 } else {
-                    info.put("default", REF_DEFAULT.get(a.getDefaultValue()));
+                    String defaultValue = a.getDefaultValue();
+                    info.put("default", defaultValue != null ? REF_DEFAULT.get(defaultValue) : null);
 
                     // If there is a supplement to the description for this argument,
                     // then it is already DocBook XML, so use it as is.
@@ -1177,8 +1234,11 @@
         }
 
         if (subCommandUsageHandler != null) {
-            map.put("properties", subCommandUsageHandler.getProperties(sc));
+            map.put("propertiesInfo", subCommandUsageHandler.getProperties(subCommand));
         }
+
+        StringBuilder sb = new StringBuilder();
         applyTemplate(sb, "refSect2.ftl", map);
+        return sb.toString();
     }
 }

--
Gitblit v1.10.0