001: /*
002: Copyright 2004-2007 Paul R. Holser, Jr. All rights reserved.
003: Licensed under the Academic Free License version 3.0
004: */
005:
006: package joptsimple;
007:
008: import java.util.Iterator;
009: import java.util.Map;
010: import java.util.SortedMap;
011: import java.util.TreeMap;
012:
013: import joptsimple.util.ColumnarData;
014:
015: /**
016: * @author <a href="mailto:pholser@alumni.rice.edu">Paul Holser</a>
017: * @version $Id: OptionParserHelpFormatter.java,v 1.12 2007/04/10 20:06:25 pholser Exp $
018: */
019: class OptionParserHelpFormatter implements OptionSpecVisitor {
020: private final ColumnarData grid;
021:
022: OptionParserHelpFormatter() {
023: grid = new ColumnarData(
024: new String[] { "Option", "Description" });
025: }
026:
027: String format(Map options) {
028: if (options.isEmpty())
029: return "No options specified";
030:
031: grid.clear();
032:
033: SortedMap sorted = new TreeMap(options);
034:
035: for (Iterator it = sorted.values().iterator(); it.hasNext();)
036: ((OptionSpec) it.next()).accept(this );
037:
038: return grid.format();
039: }
040:
041: void addHelpLineFor(OptionSpec spec, String additionalInfo) {
042: grid.addRow(new Object[] {
043: createOptionDisplay(spec) + additionalInfo,
044: spec.description() });
045: }
046:
047: public void visit(NoArgumentOptionSpec spec) {
048: addHelpLineFor(spec, "");
049: }
050:
051: public void visit(RequiredArgumentOptionSpec spec) {
052: visit(spec, '<', '>');
053: }
054:
055: public void visit(OptionalArgumentOptionSpec spec) {
056: visit(spec, '[', ']');
057: }
058:
059: private void visit(ArgumentAcceptingOptionSpec spec,
060: char descriptionBegin, char descriptionEnd) {
061:
062: String argDescription = spec.argumentDescription();
063: String argType = nameOfArgumentType(spec);
064: StringBuffer collector = new StringBuffer();
065:
066: if (argType.length() > 0) {
067: collector.append(argType);
068:
069: if (argDescription.length() > 0)
070: collector.append(": ").append(argDescription);
071: } else if (argDescription.length() > 0)
072: collector.append(argDescription);
073:
074: String helpLine = collector.length() == 0 ? ""
075: : ' ' + surround(collector.toString(),
076: descriptionBegin, descriptionEnd);
077: addHelpLineFor(spec, helpLine);
078: }
079:
080: public void visit(AlternativeLongOptionSpec spec) {
081: String argDescription = spec.argumentDescription();
082: addHelpLineFor(spec, ' ' + surround(argDescription, '<', '>'));
083: }
084:
085: private String createOptionDisplay(OptionSpec spec) {
086: StringBuffer buffer = new StringBuffer();
087: String option = spec.option();
088:
089: buffer.append(option.length() > 1 ? ParserRules.DOUBLE_HYPHEN
090: : ParserRules.HYPHEN);
091: buffer.append(option);
092:
093: return buffer.toString();
094: }
095:
096: private static String nameOfArgumentType(
097: ArgumentAcceptingOptionSpec spec) {
098: Class argType = spec.argumentType();
099: return String.class.equals(argType) ? "" : shortNameOf(argType);
100: }
101:
102: private static String shortNameOf(Class aClass) {
103: String name = aClass.getName();
104: return name.substring(name.lastIndexOf('.') + 1);
105: }
106:
107: private static String surround(String target, char begin, char end) {
108: return begin + target + end;
109: }
110: }
|