0

私はApache commons-cli v1.3にちょっと苦労していますが、次の問題に対する実用的な解決策をまだ見つけていません:

指定されたパラメーターに応じて、文字列を作成(またはローカルファイルから読み取り)、インラインで編集し、オプションで表示、ローカルファイルへの文字列の書き込み、またはHTTPリクエスト経由で送信するコマンドラインツールがありますサーバーに。

したがって、「作成」の場合は「c」、「読み取り」の場合は「r」、「編集」の場合は「e」(cli 経由)、表示の場合は「d」、「書き込み」の場合は「w」、および「 p" は「サーバーにプッシュ」

もちろん、いくつかの組み合わせは可能です。たとえば、この文字列を作成して、ファイルから読み書きすることなくプッシュできるようにする必要があります。また、プッシュせずに作成して書き込むことができるはずです...

したがって、パラメーターのセマンティクスは次のとおりです。

("c" OR ("r" ["e"])) ["d" "w" "p"]

明らかに、文字列が「作成」されるとき、それは「読み取り」されてはなりません。「c」reating するときは、cli-parser からのインタラクティブな入力を使用します。「読む」とき、ユーザーがcliからのインタラクティブな入力を介して「e」編集できるようにしたいと思います。残りのパラメータはオプションです。

次へ: 「読む」ときは、ファイル名/パスを指定する必要があります。また、「書く」ときはこれが必要です。とにかく、読み取るファイルと書き込む 2 番目のファイルを指定できるようにする必要があります。したがって、ファイル名には 2 つの引数があり、どちらもオプションです。

結果の構文は次のようになります。

tool -cp
tool -rp "filenametoread"
tool -rdwp "filenametoread" "filenametowrite"
tool -cw "filenametowrite"

等々。

私はここで少し迷っています。指定されたパラメーター (オプション) に基づいて必要とされる、ファイル名に 2 つの引数を持つように commons-cli を構成するにはどうすればよいですか? これは可能ですか?

4

2 に答える 2

2

残念ながら、Commons CLI には、そのような相互に依存するオプションを指定する方法がありません。ifこれを処理するには、独自のチェックを行う必要があります。たとえば、このように

CommandLineParser parser = new PosixParser();
Options options = new Options();
options.addOption(new Option("h", "help", false, "display this message"));
options.addOption(new Option("c", "create", true, "Create a file"));
options.addOption(new Option("r", "read", truee, "Read a file"));
options.addOption(new Option("e", "edit", false, "Edit a file"));
options.addOption(new Option("d", "display", false, "Display a file"));
options.addOption(new Option("w", "write", false, "Write a file"));
options.addOption(new Option("p", "push", false, "Push a file"));

try {
    CommandLine commandLine = parser.parse(options, args);
    if (commandLine.hasOption("h")) {
        showHelp(options);
        System.exit(0);
    }
    // validate the commandline
    // obviously, these can be split up to give more helpful error messages
    if ((!(commandLine.hasOption("c") ^ (commandLine.hasOption("r") || commandLine.hasOption("e"))))
        || !(commandLine.hasOption("d") ^ commandLine.hasOption("w") ^ commandLine.hasOption("p"))) {
        throw new ParseException("Invalid combination");
    }
    if ((!commandLine.hasOption("c") && !commandLine.hasOption("r")) {
        throw new ParseException("Missing required arg");
    }

    // rest of the logic
} catch (ParseException pe) {
    throw new ParseException("Bad arguments\n" + pe.getMessage());
}
于 2015-08-09T03:39:48.490 に答える