Author: solomax
Date: Wed Apr 11 04:41:34 2012
New Revision: 1324549

URL: http://svn.apache.org/viewvc?rev=1324549&view=rev
Log:
OPENMEETINGS-111 usage section is improved (it is self descriptive now)

Modified:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmHelpFormatter.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmOption.java

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java?rev=1324549&r1=1324548&r2=1324549&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java 
(original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java 
Wed Apr 11 04:41:34 2012
@@ -46,36 +46,35 @@ public class Admin {
                opts = buildOptions();
        }
        
-       @SuppressWarnings("static-access")
        private Options buildOptions() {
                Options options = new Options();
                OptionGroup group = new OptionGroup()
-                       .addOption(new OmOption("i", "i", "install", false, 
"Fill DB table, and make OM usable"))
-                       .addOption(new OmOption("b", "b", "backup", false, 
"Backups OM"))
-                       .addOption(new OmOption("r", "r", "restore", false, 
"Restores OM"))
-                       .addOption(new OmOption("f", "f", "files", false, "File 
operations - statictics/cleanup"))
-                       .addOption(new OmOption("h", "h", "help", false, 
"prints this message"));
+                       .addOption(new OmOption("h", 0, "h", "help", false, 
"prints this message"))
+                       .addOption(new OmOption("b", 1, "b", "backup", false, 
"Backups OM"))
+                       .addOption(new OmOption("r", 2, "r", "restore", false, 
"Restores OM"))
+                       .addOption(new OmOption("i", 3, "i", "install", false, 
"Fill DB table, and make OM usable"))
+                       .addOption(new OmOption("f", 4, "f", "files", false, 
"File operations - statictics/cleanup"));
                group.setRequired(true); 
                options.addOptionGroup(group);
                //general
                options.addOption(new OmOption(null, "v", "verbose", false, 
"verbose error messages"));
                //backup/restore
-               options.addOption(new OmOption("b", null, "exclude-files", 
false, "should backup exclude files [default: include]"));
-               options.addOption(new OmOption("b,r", "file", null, true, "file 
used for backup/restore"));
+               options.addOption(new OmOption("b", null, "exclude-files", 
false, "should backup exclude files [default: include]", true));
+               options.addOption(new OmOption("b,r", "file", null, true, "file 
used for backup/restore", "b"));
                //install
                options.addOption(new OmOption("i", "user", null, true, "Login 
name of the default user, minimum " + 
InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters"));
-               options.addOption(new OmOption("i", "pass", null, true, 
"Password of the default user, minimum " + 
InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters (will be prompted 
if not set)"));
                options.addOption(new OmOption("i", "email", null, true, "Email 
of the default user"));
                options.addOption(new OmOption("i", "group", null, true, "The 
name of the default user group"));
                options.addOption(new OmOption("i", "tz", null, true, "Default 
server time zone, and time zone for the selected user [for ex: 'GMT+10', '-2', 
'Chicago']"));
-               options.addOption(new OmOption("i", null, 
"system-email-address", true, "System e-mail address [default: " + 
cfg.mailReferer + "]"));
-               options.addOption(new OmOption("i", null, "smtp-server", true, 
"SMTP server for outgoing e-mails [default: " + cfg.smtpServer + "]"));
-               options.addOption(new OmOption("i", null, "smtp-port", true, 
"SMTP server for outgoing e-mails [default: " + cfg.smtpPort + "]"));
-               options.addOption(new OmOption("i", null, "email-auth-user", 
true, "Email auth username (anonymous connection will be used if not set)"));
-               options.addOption(new OmOption("i", null, "email-auth-pass", 
true, "Email auth password (anonymous connection will be used if not set)"));
-               options.addOption(new OmOption("i", null, "email-use-tls", 
false, "Is secure e-mail connection [default: no]"));
-               options.addOption(new OmOption("i", null, "skip-default-rooms", 
false, "Do not create default rooms [created by default]"));
-               options.addOption(new OmOption("i", null, 
"disable-frontend-register", false, "Do not allow front end register [allowed 
by default]"));
+               options.addOption(new OmOption("i", null, "password", true, 
"Password of the default user, minimum " + 
InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters (will be prompted 
if not set)", true));
+               options.addOption(new OmOption("i", null, 
"system-email-address", true, "System e-mail address [default: " + 
cfg.mailReferer + "]", true));
+               options.addOption(new OmOption("i", null, "smtp-server", true, 
"SMTP server for outgoing e-mails [default: " + cfg.smtpServer + "]", true));
+               options.addOption(new OmOption("i", null, "smtp-port", true, 
"SMTP server for outgoing e-mails [default: " + cfg.smtpPort + "]", true));
+               options.addOption(new OmOption("i", null, "email-auth-user", 
true, "Email auth username (anonymous connection will be used if not set)", 
true));
+               options.addOption(new OmOption("i", null, "email-auth-pass", 
true, "Email auth password (anonymous connection will be used if not set)", 
true));
+               options.addOption(new OmOption("i", null, "email-use-tls", 
false, "Is secure e-mail connection [default: no]", true));
+               options.addOption(new OmOption("i", null, "skip-default-rooms", 
false, "Do not create default rooms [created by default]", true));
+               options.addOption(new OmOption("i", null, 
"disable-frontend-register", false, "Do not allow front end register [allowed 
by default]", true));
                
                return options;
        }
@@ -89,7 +88,9 @@ public class Admin {
        }
        
        private void usage() {
-               new OmHelpFormatter().printHelp("admin", opts);
+               OmHelpFormatter formatter = new OmHelpFormatter();
+               formatter.setWidth(100);
+               formatter.printHelp("admin", opts);
        }
        
        private void handleError(String msg, Exception e) {

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmHelpFormatter.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmHelpFormatter.java?rev=1324549&r1=1324548&r2=1324549&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmHelpFormatter.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmHelpFormatter.java
 Wed Apr 11 04:41:34 2012
@@ -1,7 +1,12 @@
 package org.openmeetings.cli;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.apache.commons.cli.HelpFormatter;
@@ -10,30 +15,152 @@ import org.apache.commons.cli.OptionGrou
 import org.apache.commons.cli.Options;
 
 public class OmHelpFormatter extends HelpFormatter {
-
+       private static String GENERAL_OPTION_GROUP = "";
+       private int maxPrefixLength = 0;
+       
        @SuppressWarnings("unchecked")
-       private Collection<Option> getReqOptions(Options opts) {
+       private List<OmOption> getReqOptions(Options opts) {
                //suppose we have only 1 group (for now)
                OptionGroup g = 
((List<OptionGroup>)opts.getRequiredOptions()).get(0);
-               return g.getOptions();
+               List<OmOption> result = new ArrayList<OmOption>(g.getOptions());
+               Collections.sort(result, new Comparator<OmOption>() {
+                       public int compare(OmOption o1, OmOption o2) {
+                               return o1.getOrder() - o2.getOrder();
+                       }
+               });
+               return result;
+       }
+       
+       @SuppressWarnings("unchecked")
+       private LinkedHashMap<String, List<OmOption>> getOptions(Options opts, 
int leftPad) {
+               final String longOptSeparator = " ";
+               final String lpad = createPadding(leftPad);
+               final String lpadParam = createPadding(leftPad + 2);
+               List<OmOption> reqOptions = getReqOptions(opts);
+               LinkedHashMap<String, List<OmOption>> map = new 
LinkedHashMap<String, List<OmOption>>(reqOptions.size());
+               map.put(GENERAL_OPTION_GROUP, new ArrayList<OmOption>());
+               for (OmOption o : reqOptions) {
+                       map.put(o.getOpt(), new ArrayList<OmOption>());
+               }
+               for (OmOption o : (Collection<OmOption>)opts.getOptions()) {
+                       //TODO need better check (required option should go 
first and should not be duplicated
+                       boolean skipOption = map.containsKey(o.getOpt());
+                       boolean mainOption = skipOption || o.getGroup() == null;
+                       
+                       // first create list containing only <lpad>-a,--aaa 
where
+                       // -a is opt and --aaa is long opt; in parallel look for
+                       // the longest opt string this list will be then used to
+                       // sort options ascending
+                       StringBuilder optBuf = new StringBuilder();
+                       if (o.getOpt() == null) {
+                               optBuf.append(mainOption ? lpad : 
lpadParam).append("   ").append(getLongOptPrefix())
+                                               .append(o.getLongOpt());
+                       } else {
+                               optBuf.append(mainOption ? lpad : 
lpadParam).append(getOptPrefix())
+                                               .append(o.getOpt());
+
+                               if (o.hasLongOpt()) {
+                                       
optBuf.append(',').append(getLongOptPrefix())
+                                                       .append(o.getLongOpt());
+                               }
+                       }
+
+                       if (o.hasArg()) {
+                               String argName = o.getArgName();
+                               if (argName != null && argName.length() == 0) {
+                                       // if the option has a blank argname
+                                       optBuf.append(' ');
+                               } else {
+                                       optBuf.append(o.hasLongOpt() ? 
longOptSeparator : " ");
+                                       optBuf.append("<")
+                                                       .append(argName != null 
? o.getArgName()
+                                                                       : 
getArgName()).append(">");
+                               }
+                       }
+
+                       o.setHelpPrefix(optBuf);
+                       maxPrefixLength = Math.max(optBuf.length(), 
maxPrefixLength);
+                       
+                       if (skipOption) {
+                               //TODO need better check (required option 
should go first and should not be duplicated
+                               continue;
+                       }
+                       String grp = o.getGroup();
+                       grp = grp == null ? GENERAL_OPTION_GROUP : grp;
+                       String[] grps = grp.split(",");
+                       for(String g : grps) {
+                               map.get(g).add(o);
+                       }
+               }
+               for (String _key : map.keySet()) {
+                       final String key = _key;
+                       List<OmOption> options = map.get(key);
+                       Collections.sort(options, new Comparator<OmOption>(){
+                               public int compare(OmOption o1, OmOption o2) {
+                                       boolean o1opt = !o1.isOptional(key);
+                                       boolean o2opt = !o2.isOptional(key);
+                                       return (o1opt && o2opt || !o1opt && 
!o2opt) ? (o1.getOpt() == null ? 1 : -1) : (o1opt ? -1 : 1);
+                               }
+                               
+                       });
+                       if (opts.hasOption(key)) {
+                               options.add(0, (OmOption)opts.getOption(key));
+                       }
+               }
+               return map;
        }
        
-       private String getReqOptionsString(Options opts) {
+       private StringBuilder getReqOptionsString(Options opts) {
                String delim = "";
                StringBuilder result = new StringBuilder();
                for (Option o : getReqOptions(opts)) {
-                       result.append(delim).append(o.getOpt());
+                       result.append(delim).append("-").append(o.getOpt());
                        delim = "|";
                }
-               return result.toString();
+               return result;
        }
        
        @Override
        protected StringBuffer renderOptions(StringBuffer sb, int width, 
Options options, int leftPad, int descPad) {
-               // TODO Auto-generated method stub
-               return super.renderOptions(sb, width, options, leftPad, 
descPad);
+               final String dpad = createPadding(descPad);
+               final String optional = "(optional) ";
+
+               LinkedHashMap<String, List<OmOption>> optList = 
getOptions(options, leftPad);
+
+               char[] delimiter = new char[width - 2];
+               Arrays.fill(delimiter, '-');
+
+               for (String key : optList.keySet()) {
+                       if (GENERAL_OPTION_GROUP.equals(key)) {
+                               sb.append("General 
options:").append(getNewLine());
+                       }
+                       for (OmOption option : optList.get(key)) {
+                               StringBuilder optBuf = new 
StringBuilder(option.getHelpPrefix());
+
+                               if (optBuf.length() < maxPrefixLength) {
+                                       
optBuf.append(createPadding(maxPrefixLength - optBuf.length()));
+                               }
+
+                               optBuf.append(dpad);
+
+                               int nextLineTabStop = maxPrefixLength + descPad;
+
+                               if (option.isOptional(key)) {
+                                       optBuf.append(optional);
+                               }
+                               if (option.getDescription() != null) {
+                                       optBuf.append(option.getDescription());
+                               }
+
+                               renderWrappedText(sb, width, nextLineTabStop, 
optBuf.toString());
+
+                               sb.append(getNewLine());
+                       }
+                       sb.append(delimiter).append(getNewLine());
+               }
+               return sb;
        }
-       
+
        @Override
        public void printHelp(PrintWriter pw, int width, String cmdLineSyntax,
                        String header, Options options, int leftPad, int 
descPad,

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmOption.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmOption.java?rev=1324549&r1=1324548&r2=1324549&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmOption.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OmOption.java
 Wed Apr 11 04:41:34 2012
@@ -1,16 +1,39 @@
 package org.openmeetings.cli;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.commons.cli.Option;
 
 public class OmOption extends Option {
        private static final long serialVersionUID = -544426769898915573L;
        private String group = null;
-       private boolean optional = true;
+       private Map<String, Boolean> optional = null;
+       private int order = 0;
+       private String helpPrefix = "";
+
+       public OmOption(String group, String opt, String longOpt, boolean 
hasArg,
+                       String description, boolean optional) throws 
IllegalArgumentException {
+               this(group, 0, opt, longOpt, hasArg, description);
+               setOptional(optional);
+       }
 
        public OmOption(String group, String opt, String longOpt, boolean 
hasArg,
+                       String description, String optional) throws 
IllegalArgumentException {
+               this(group, 0, opt, longOpt, hasArg, description);
+               setOptional(optional);
+       }
+
+       public OmOption(String group, int order, String opt, String longOpt, 
boolean hasArg,
                        String description) throws IllegalArgumentException {
                super(opt, longOpt, hasArg, description);
-               this.setGroup(group);
+               this.group = group;
+               this.setOrder(order);
+       }
+
+       public OmOption(String group, String opt, String longOpt, boolean 
hasArg,
+                       String description) throws IllegalArgumentException {
+               this(group, 0, opt, longOpt, hasArg, description);
        }
 
        public String getGroup() {
@@ -21,11 +44,46 @@ public class OmOption extends Option {
                this.group = group;
        }
 
-       public boolean isOptional() {
-               return optional;
+       public boolean isOptional(String group) {
+               boolean result = false;
+               if (optional != null) {
+                       String[] grps = group.split(",");
+                       for(String g : grps) {
+                               result |= optional.containsKey(g) ? 
optional.get(g) : false;
+                       }
+               }
+               return result;
+       }
+
+       public void setOptional(boolean val) {
+               setOptional(group);
+       }
+       
+       public void setOptional(String group) {
+               String[] grps = group.split(",");
+               optional = new HashMap<String, Boolean>(grps.length);
+               for(String g : grps) {
+                       optional.put(g, true);
+               }
+       }
+
+       public int getOrder() {
+               return order;
+       }
+
+       public void setOrder(int order) {
+               this.order = order;
+       }
+
+       public String getHelpPrefix() {
+               return helpPrefix;
+       }
+
+       public void setHelpPrefix(StringBuilder helpPrefix) {
+               this.helpPrefix = helpPrefix.toString();
        }
 
-       public void setOptional(boolean optional) {
-               this.optional = optional;
+       public void setHelpPrefix(String helpPrefix) {
+               this.helpPrefix = helpPrefix;
        }
 }


Reply via email to