OSDN Git Service

テストセット整備
[mikutoga/Pmd2XML.git] / src / main / java / jp / sourceforge / mikutoga / pmd2xml / OptInfo.java
1 /*
2  * command line argument info
3  *
4  * License : The MIT License
5  * Copyright(c) 2012 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.pmd2xml;
9
10 import java.text.MessageFormat;
11 import java.util.HashMap;
12 import java.util.Map;
13 import jp.sourceforge.mikutoga.pmd.ModelFileType;
14
15 /**
16  * コマンドラインオプション情報。
17  */
18 final class OptInfo {
19
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;
23
24     private static final String GENERATOR =
25             Pmd2Xml.APPNAME + ' ' + Pmd2Xml.APPVER;
26
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"
38             ;
39
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.";
48
49
50     private boolean hasError = false;
51     private String errMsg = null;
52
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;
61
62
63     /**
64      * コンストラクタ。
65      */
66     private OptInfo(){
67         super();
68         return;
69     }
70
71
72     /**
73      * コマンドラインを解析する。
74      * @param args コマンドライン
75      * @return オプション情報
76      */
77     static OptInfo parseOption(String... args){
78         OptInfo result = new OptInfo();
79
80         int argIdx = 0;
81         int argLength = args.length;
82
83         argline: while(argIdx < argLength){
84             String arg = args[argIdx];
85
86             OptSwitch opt = OptSwitch.find(arg);
87             if(opt == null){
88                 String errMsg = MessageFormat.format(ERRMSG_UNKNOWN, arg);
89                 result.putErrMsg(errMsg);
90                 break argline;
91             }
92
93             switch(opt){
94             case OPT_HELP:
95                 result.needHelp = true;
96                 break argline;
97             case OPT_FORCE:
98                 result.overwrite = true;
99                 break;
100             case OPT_PMD2XML:
101                 result.inTypes  = ModelFileType.PMD;
102                 result.outTypes = ModelFileType.XML_101009;
103                 break;
104             case OPT_XML2PMD:
105                 result.inTypes  = ModelFileType.XML_101009;
106                 result.outTypes = ModelFileType.PMD;
107                 break;
108             case OPT_INFILE:
109                 argIdx++;
110                 if(argIdx >= argLength){
111                     result.putErrMsg(ERRMSG_NOINFILE);
112                     break argline;
113                 }
114                 result.inFilename = args[argIdx];
115                 break;
116             case OPT_OUTFILE:
117                 argIdx++;
118                 if(argIdx >= argLength){
119                     result.putErrMsg(ERRMSG_NOOUTFILE);
120                     break argline;
121                 }
122                 result.outFilename = args[argIdx];
123                 break;
124             case OPT_LF:
125                 result.newline = EOL_LF;
126                 break;
127             case OPT_CRLF:
128                 result.newline = EOL_CRLF;
129                 break;
130             case OPT_GEN:
131                 result.generator = GENERATOR;
132                 break;
133             case OPT_NOGEN:
134                 result.generator = null;
135                 break;
136             default:
137                 assert false;
138                 String errMsg = MessageFormat.format(ERRMSG_UNKNOWN, arg);
139                 result.putErrMsg(errMsg);
140                 break argline;
141             }
142
143             if(result.hasError()) return result;
144
145             argIdx++;
146         }
147
148         if(result.hasError()) return result;
149         if(result.needHelp()) return result;
150
151         checkResult(result);
152
153         return result;
154     }
155
156     /**
157      * オプション整合性の事後検査。
158      * @param result オプション情報
159      */
160     private static void checkResult(OptInfo result){
161         if(   result.getInFileType()  == ModelFileType.NONE
162            || result.getOutFileType() == ModelFileType.NONE ){
163             result.putErrMsg(ERRMSG_NODIR);
164             return;
165         }
166
167         if(result.getInFilename() == null){
168             result.putErrMsg(ERRMSG_NOINFILE);
169             return;
170         }
171
172         if(result.getOutFilename() == null){
173             result.putErrMsg(ERRMSG_NOOUTFILE);
174             return;
175         }
176
177         return;
178     }
179
180     /**
181      * コンソール提示用ヘルプ出力文字列を返す。
182      * @return オプションヘルプ文字列
183      */
184     static String getConsoleHelp(){
185         return HELP_CONSOLE;
186     }
187
188
189     /**
190      * 解析中にエラーが起きたか判定する。
191      * @return エラーが起きていればtrue
192      */
193     boolean hasError(){
194         return this.hasError;
195     }
196
197     /**
198      * エラーメッセージを返す。
199      * @return エラーメッセージ。なければnull
200      */
201     String getErrorMessage(){
202         return this.errMsg;
203     }
204
205     /**
206      * ヘルプ表示が必要か否か判定する。
207      * @return 必要ならtrue
208      */
209     boolean needHelp(){
210         return this.needHelp;
211     }
212
213     /**
214      * 入力ファイル種別を返す。
215      * @return 入力ファイル種別
216      */
217     ModelFileType getInFileType(){
218         return this.inTypes;
219     }
220
221     /**
222      * 出力ファイル種別を返す。
223      * @return 出力ファイル種別
224      */
225     ModelFileType getOutFileType(){
226         return this.outTypes;
227     }
228
229     /**
230      * 入力ファイル名を返す。
231      * @return 入力ファイル名
232      */
233     String getInFilename(){
234         return this.inFilename;
235     }
236
237     /**
238      * 出力ファイル名を返す。
239      * @return 出力ファイル名
240      */
241     String getOutFilename(){
242         return this.outFilename;
243     }
244
245     /**
246      * 上書きモードか否か返す。
247      * @return 上書きモードならtrue
248      */
249     boolean overwriteMode(){
250         return this.overwrite;
251     }
252
253     /**
254      * XML改行文字を返す。
255      * @return 改行文字
256      */
257     String getNewline(){
258         return this.newline;
259     }
260
261     /**
262      * ジェネレータ名を返す。
263      * @return ジェネレータ名。表示したくない時はnull
264      */
265     String getGenerator(){
266         return this.generator;
267     }
268
269     /**
270      * オプション解析エラー情報を設定する。
271      * @param txt エラー文字列
272      */
273     private void putErrMsg(String txt){
274         this.hasError = true;
275         this.errMsg = txt;
276         return;
277     }
278
279
280     /**
281      * オプションスイッチ群。
282      */
283     static enum OptSwitch{
284         OPT_HELP    ("-h", "-help", "-?"),
285         OPT_XML2PMD ("-xml2pmd"),
286         OPT_PMD2XML ("-pmd2xml"),
287         OPT_INFILE  ("-i"),
288         OPT_OUTFILE ("-o"),
289         OPT_FORCE   ("-f"),
290         OPT_LF      ("-lf"),
291         OPT_CRLF    ("-crlf"),
292         OPT_GEN     ("-gen"),
293         OPT_NOGEN   ("-nogen"),
294         ;
295
296
297         /**
298          * コンストラクタ。
299          * @param cmdargs オプションスイッチパターン群
300          */
301         private OptSwitch(String... cmdargs){
302             for(String cmdarg : cmdargs){
303                 MapHolder.MAP_OPT.put(cmdarg, this);
304             }
305             return;
306         }
307
308         /**
309          * パターンに合致するオプションを見つける。
310          * @param cmd パターン
311          * @return オプション。見つからなければnull
312          */
313         static OptSwitch find(String cmd){
314             OptSwitch result = MapHolder.MAP_OPT.get(cmd);
315             return result;
316         }
317
318
319         /**
320          * enumコンストラクタからクラス変数にアクセスできない文法を回避。
321          */
322         private static class MapHolder{
323             static final Map<String, OptSwitch> MAP_OPT =
324                     new HashMap<String, OptSwitch>();
325         }
326
327     }
328
329 }