Index: lutincommandline/src/java/org/codelutin/option/actions/OptionActionHelpRunnable.java diff -u lutincommandline/src/java/org/codelutin/option/actions/OptionActionHelpRunnable.java:1.1 lutincommandline/src/java/org/codelutin/option/actions/OptionActionHelpRunnable.java:1.2 --- lutincommandline/src/java/org/codelutin/option/actions/OptionActionHelpRunnable.java:1.1 Tue Mar 18 23:40:47 2008 +++ lutincommandline/src/java/org/codelutin/option/actions/OptionActionHelpRunnable.java Wed Mar 19 20:21:12 2008 @@ -15,11 +15,21 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import static org.codelutin.i18n.I18n._; import org.codelutin.option.AbstractContext; +import org.codelutin.option.ConfigKey; +import org.codelutin.option.ConfigPropertyKey; import org.codelutin.option.OptionAction; import org.codelutin.option.OptionActionRunnable; +import org.codelutin.option.OptionKey; +import static org.codelutin.option.ParserUtil.addTitle; +import org.codelutin.option.def.OptionDefinition; +import org.codelutin.util.ReflectUtil; +import java.io.IOException; import java.io.StringWriter; +import java.io.Writer; +import java.util.List; /** @author chemit */ public class OptionActionHelpRunnable implements OptionActionRunnable { @@ -32,9 +42,58 @@ StringWriter writer = new StringWriter(); String title = "TODO Add project name v " + context.getMainConfig().getPropertyKey("version").getCurrentValue(); - context.getParser().printUsage(writer, title); + printUsage(context, writer, title); //TODO should be able to register writer System.out.println(writer); context.setQuit(true); } + + /** + * Print usage of the parser + * + * @param context current context + * @param w writer + * @param name title @throws java.io.IOException if any io pb while writing + * @throws java.io.IOException if any pb while writing + */ + public void printUsage(AbstractContext context, Writer w, String name) throws IOException { + + //TODO Use a Visitor in context + try { + String head = _("lutinutil.parserdef.printUsage.head", name); + String prefixOption = _("lutinutil.parserdef.printUsage.options.head", name); + String prefixConfig = _("lutinutil.parserdef.printUsage.configs.head", name); + String prefix = "\n"; + toString(context, w, head, prefix, prefixOption, prefixConfig); + } finally { + + w.flush(); + } + } + + public void toString(AbstractContext context, Writer w, String head, String prefix, String prefixOption, String prefixConfig) throws IOException { + w.append(addTitle(head, '=', true)).append("\n\n"); + w.append(addTitle(prefixOption, '-', false)).append("\n"); + for (OptionKey key : context.getParser().getOptionKeys()) { + OptionDefinition definition = key.getDefinition(); + w.append(prefix).append(definition.toString()); + w.append("\n ").append(key.getDescription()).append("\n\n"); + } + List> configKeys = context.getConfigKeys(); + if (configKeys.isEmpty()) { + return; + } + w.append(addTitle(prefixConfig, '-', false)).append("\n"); + for (ConfigKey key : configKeys) { + w.append("\n").append(addTitle(key.getDescription() + " (" + key.getCategory() + ")", '~', false)).append("\n"); + for (ConfigPropertyKey propertyKey : ReflectUtil.getConstants(key.getAbstractConfigClass(), ConfigPropertyKey.class)) { + w.append(prefix).append(propertyKey.getKey()).append(" (").append(propertyKey.getType().getSimpleName()).append(")"); + if (propertyKey.getDefaultValue() != null) { + w.append(" "); + + } + w.append("\n ").append(propertyKey.getDescription()).append("\n\n"); + } + } + } } \ No newline at end of file