2 * command line argument info
4 * License : The MIT License
5 * Copyright(c) 2012 MikuToga Partners
8 package jp.sourceforge.mikutoga.pmd2xml;
10 import java.text.MessageFormat;
11 import java.util.HashMap;
13 import jp.sourceforge.mikutoga.pmd.ModelFileType;
20 private static final String EOL_LF = "\n";
21 private static final String EOL_CRLF = "\r\n";
22 private static final String EOL_DEFAULT = EOL_LF;
24 private static final String GENERATOR =
25 Pmd2Xml.APPNAME + ' ' + Pmd2Xml.APPVER;
27 private static final String HELP_CONSOLE =
28 "-h : put help message\n"
29 + "-pmd2xml : convert *.pmd to *.xml\n"
30 + "-xml2pmd : convert *.xml to *.pmd\n"
31 + "-i file : specify input file\n"
32 + "-o file : specify output file\n"
33 + "-f : force overwriting\n"
34 + "-lf : use LF as XML-newline (default)\n"
35 + "-crlf : use CR+LF as XML-newline\n"
36 + "-gen : print generator to XML (default)\n"
37 + "-nogen : do not print generator to XML\n"
40 private static final String ERRMSG_UNKNOWN =
41 "Unknown option : {0}";
42 private static final String ERRMSG_NODIR =
43 "You must specify -pmd2xml or -xml2pmd.";
44 private static final String ERRMSG_NOINFILE =
45 "You must specify input file with -i.";
46 private static final String ERRMSG_NOOUTFILE =
47 "You must specify output file with -o.";
50 private boolean hasError = false;
51 private String errMsg = null;
53 private boolean needHelp = false;
54 private ModelFileType inTypes = ModelFileType.NONE;
55 private ModelFileType outTypes = ModelFileType.NONE;
56 private String inFilename = null;
57 private String outFilename = null;
58 private boolean overwrite = false;
59 private String newline = EOL_DEFAULT;
60 private String generator = GENERATOR;
77 static OptInfo parseOption(String... args){
78 OptInfo result = new OptInfo();
81 int argLength = args.length;
83 argline: while(argIdx < argLength){
84 String arg = args[argIdx];
86 OptSwitch opt = OptSwitch.find(arg);
88 String errMsg = MessageFormat.format(ERRMSG_UNKNOWN, arg);
89 result.putErrMsg(errMsg);
95 result.needHelp = true;
98 result.overwrite = true;
101 result.inTypes = ModelFileType.PMD;
102 result.outTypes = ModelFileType.XML_101009;
105 result.inTypes = ModelFileType.XML_101009;
106 result.outTypes = ModelFileType.PMD;
110 if(argIdx >= argLength){
111 result.putErrMsg(ERRMSG_NOINFILE);
114 result.inFilename = args[argIdx];
118 if(argIdx >= argLength){
119 result.putErrMsg(ERRMSG_NOOUTFILE);
122 result.outFilename = args[argIdx];
125 result.newline = EOL_LF;
128 result.newline = EOL_CRLF;
131 result.generator = GENERATOR;
134 result.generator = null;
138 String errMsg = MessageFormat.format(ERRMSG_UNKNOWN, arg);
139 result.putErrMsg(errMsg);
143 if(result.hasError()) return result;
148 if(result.hasError()) return result;
149 if(result.needHelp()) return result;
158 * @param result オプション情報
160 private static void checkResult(OptInfo result){
161 if( result.getInFileType() == ModelFileType.NONE
162 || result.getOutFileType() == ModelFileType.NONE ){
163 result.putErrMsg(ERRMSG_NODIR);
167 if(result.getInFilename() == null){
168 result.putErrMsg(ERRMSG_NOINFILE);
172 if(result.getOutFilename() == null){
173 result.putErrMsg(ERRMSG_NOOUTFILE);
181 * コンソール提示用ヘルプ出力文字列を返す。
182 * @return オプションヘルプ文字列
184 static String getConsoleHelp(){
191 * @return エラーが起きていればtrue
194 return this.hasError;
199 * @return エラーメッセージ。なければnull
201 String getErrorMessage(){
210 return this.needHelp;
217 ModelFileType getInFileType(){
225 ModelFileType getOutFileType(){
226 return this.outTypes;
233 String getInFilename(){
234 return this.inFilename;
241 String getOutFilename(){
242 return this.outFilename;
247 * @return 上書きモードならtrue
249 boolean overwriteMode(){
250 return this.overwrite;
263 * @return ジェネレータ名。表示したくない時はnull
265 String getGenerator(){
266 return this.generator;
273 private void putErrMsg(String txt){
274 this.hasError = true;
283 static enum OptSwitch{
284 OPT_HELP ("-h", "-help", "-?"),
285 OPT_XML2PMD ("-xml2pmd"),
286 OPT_PMD2XML ("-pmd2xml"),
293 OPT_NOGEN ("-nogen"),
299 * @param cmdargs オプションスイッチパターン群
301 private OptSwitch(String... cmdargs){
302 for(String cmdarg : cmdargs){
303 MapHolder.MAP_OPT.put(cmdarg, this);
309 * パターンに合致するオプションを見つける。
311 * @return オプション。見つからなければnull
313 static OptSwitch find(String cmd){
314 OptSwitch result = MapHolder.MAP_OPT.get(cmd);
320 * enumコンストラクタからクラス変数にアクセスできない文法を回避。
322 private static class MapHolder{
323 static final Map<String, OptSwitch> MAP_OPT =
324 new HashMap<String, OptSwitch>();