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;
}
}