CommandLineOptionParser なるものを作った。
ダウンロード kakkun61.jar
何これ
コマンドライン引数の処理をするよ。
まず、使い方
-d と --debug でデバッグを有効にしたいとき。(Debug.setActive(true)にしたいとき。)
CommandLineOptionParser parser = new CommandLineOptionParser(); CommandLineOption debugOpt = new CommandLineOption( new String[]{"-d", "--debug"}, true ); parser.addOption( debugOpt ); parser.parse( args ); Debug.setActive( debugOpt.isExisting() );
とする。
CommandLineOption のコンストラクタの第2引数は、そのコマンドラインオプションが引数をとらなければ、true、とるなら、false。反対のほうがいいかもしれないが、英語で nullary なら true と考える。
CommandLineOption#isExisting() でそのオプションが与えられたかを知り、引数がある場合は CommandLineOption#getParameter() で得る。
CommandLineOption のコンストラクタの第2引数で、true を指定したのに CommandLineOption#getParameter() を呼び出した場合は、null が返る。
実行時にユーザから期待されないコマンドラインオプションが与えられた場合、CommandLineOptionParser#parse(String[]) は InvalidCommandLineOptionException をスローする。
次に、CommandLineOptionParser と CommandLineOption と InvalidCommandLineOptionException の中身
CommandLineOption
package kakkun61.cmdline; public class CommandLineOption { private String[] names; private boolean nullary; private boolean existing; private String parameter; public CommandLineOption( String[] names, boolean nullary ) { this.names = names; this.nullary = nullary; } public boolean match( String arg ) { for( int i=0; i<names.length; i++ ) if( names[i].equals( arg ) ) return existing = true; return false; } boolean isNullary() { return nullary; } public boolean isExisting() { return existing; } void setExisting( boolean existing ) { this.existing = existing; } public String getParameter() { return parameter; } void setParameter( String parameter ) { this.parameter = parameter; } }
CommandLineOptionParser
package kakkun61.cmdline; import java.util.ArrayList; import java.util.List; public class CommandLineOptionParser { private List<CommandLineOption> opts = new ArrayList<CommandLineOption>(); public void addOption( CommandLineOption opt ) { opts.add( opt ); } public void addOptions( CommandLineOption[] opts ) { for( CommandLineOption opt : opts ) this.opts.add( opt ); } public void parse( String[] args ) throws InvalidCommandLineOptionException { ARG_LOOP: for( int i=0; i<args.length; ) { for( CommandLineOption opt: opts ) if( opt.match( args[i] ) ) { if( opt.isNullary() ) i++; else { opt.setParameter( args[i+1] ); i+=2; } continue ARG_LOOP; } throw new InvalidCommandLineOptionException( "invalid command line option: " + args[i] ); } } }
InvalidCommandLineOptionException
単にスーパークラスのコンストラクタをオーバーライドするだけ。
package kakkun61.cmdline; public class InvalidCommandLineOptionException extends IllegalArgumentException { public InvalidCommandLineOptionException() { super(); } public InvalidCommandLineOptionException( String message, Throwable cause ) { super( message, cause ); } public InvalidCommandLineOptionException( String s ) { super( s ); } public InvalidCommandLineOptionException( Throwable cause ) { super( cause ); } }
ダウンロード kakkun61.jar