001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.util;
017
018 import java.util.Map;
019 import java.util.LinkedHashMap;
020 import java.util.List;
021 import java.util.ArrayList;
022 import java.util.Iterator;
023 import java.util.Arrays;
024 import java.util.Date;
025 import java.util.Locale;
026
027 import java.text.DateFormat;
028 import java.text.SimpleDateFormat;
029
030 /**
031 * Argument は、バãƒ?ƒ�処ç�?? main メソãƒ?ƒ‰の引数を解析するクラスですã?
032 * Argument はã€?¼“つのタイプにåˆ?�‹れますã?
033 *
034 * ?»コメント] ??# で始まる引数で、使用されませんã€?登録もされませんã€?
035 * ?»引数?½ ??#,-,= 以外で始まるé?常のæ–?—å?。登録のé ?•ªが指定されますã?
036 * ?»プロパティ?½??- で始まりã?キーと値ã‚?で区åˆ?�£てã�?‚‹パラメータですã?é ?º�ã?無関係ã?
037 *
038 * これらã?タイプを混在させても構いませんã€?引数]は、[コメンãƒ? や[プロパティ]ã‚?
039 * 無視したã?入力ã?é ?•ªが重要視されますã?取り出すå?合も、番号で取り出しますã?
040 * æœ??の?»引数?½がã?0 で、以é™?引数個数-1 までの番号で取り出しますã?
041 * ?»プロパティ?½はã€??番は無視し、キー部を指定することで取り出せますã?
042 * ただしã?キー部を重è¤?�—て登録することは出来ません。なおã?キー部の頭のæ–?—å?のみで
043 * 取り出すメソãƒ?ƒ‰があるためã?key1,key2,key3 などとæŒ?®šして、key で取り出せã?ã€?
044 * è¤?•°プロパティを同ä¸?‚ーで取り出すことが可能ですã?
045 * ?»プロパティ?½のæŒ?®šでは、キーと値ã‚?で区åˆ?‚Šますが、その前後にスペã?スã‚?
046 * 入れなã�?�§下さã�??引数の前後に = が付くæ–?—å?はæŒ?®šできませんã€?
047 *
048 * java Program AAA BBB #CCC -DD=XX -EE=YY -FF=ZZ GGG
049 * ~~~ ~~~ ~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~
050 * ?»コメント] ??#CCC
051 * ?»引数?½ ??[0]=AAA , [1]=BBB , [2]=GGG
052 * ?»プロパティ?½??key=DD,val=XX key=EE,val=YY key=FF,val=ZZ
053 *
054 * Argument の整合æ?チェãƒ?‚¯はã€?¼“つのパターンがありますã?
055 *
056 * ?»引数?½個数æŒ?®??š引数自身のæœ?°�å?数、最大個数を登録しておくことで、ã?ロパティのハイフン忘れ等を防止しますã?
057 * ?»プロパティ?½å¿??チェãƒ?‚¯ ?šå¿??キーが登録されたかどã�?�‹のチェãƒ?‚¯を行いますã?
058 * ?»プロパティ?½整合æ?チェãƒ?‚¯ ??æŒ?®šされてã�?‚‹キーのみ登録可能ですã?
059 *
060 * これらã?チェãƒ?‚¯で、整合æ?チェãƒ?‚¯のみ、Argument の登録時に行いますã?
061 * それ以外ã?、取りå?し時まで、判断できませんã€?
062 * (取り出しã?、登録がすべて終äº?�—たã?ちに行われると仮定してã�?�¾ã�?
063 *
064 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
065 * ?»プロパティ?½設定可能なプロパティの値を指定することで、誤記å?を防止しますã?
066 *
067 * @version 4.0
068 * @author Kazuhiko Hasegawa
069 * @since JDK5.0,
070 */
071 public final class Argument {
072 /** Argument引数のタイãƒ??»コメント]は、無視されますã? {@value} */
073 public static final int CMNT = 0; // ?»コメント]
074
075 /** Argument引数のタイãƒ??»引数?½は、å?力é?にアクセスできますã? {@value} */
076 public static final int ARGS = 1; // ?»引数?½
077
078 /** Argument引数のタイãƒ??»プロパティ?½はã€?KEY=VALUE 形式でキーでアクセスできますã? {@value} */
079 public static final int PROP = 2; // ?»プロパティ?½
080
081 private static final String CR = System.getProperty("line.separator");
082
083 private boolean argOkFlag = false;
084 private final List<String> argments = new ArrayList<String>();
085 private final Map<String,String> proparty = new LinkedHashMap<String,String>();
086
087 private int argRangeMin = 0;
088 private int argRangeMax = 200 ; // 本当ã?、Windows の引数の上限値を設å®?
089
090 private Map<String,String> mustProparty = null;
091 private Map<String,String> usableProparty = null;
092
093 private final String programID ;
094
095 /**
096 * こã? Argument を使用してã�?‚‹ プログラãƒ?D(Javaクラスå�?を指定して
097 * インスタンスを作æ?しますã?
098 * toString() する際に、表示しますã?
099 *
100 * @param pgid プログラãƒ?D
101 */
102 public Argument( final String pgid ) {
103 programID = pgid;
104 }
105
106 /**
107 * Argument の配å?æ–?—å?から、引数ã‚??ロパティをセãƒ?ƒˆしますã?
108 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
109 * これは、main メソãƒ?ƒ‰等で単独起動するå?合に、引数そã?ままã‚?
110 * セãƒ?ƒˆする場合に使用しますã?
111 *
112 * @param args 引数配å?æ–?—å?
113 * @see #putArgument( String )
114 */
115 public void setArgument( final String[] args ) {
116 for( int i=0; i<args.length; i++ ) {
117 putArgument( args[i] );
118 }
119 }
120
121 /**
122 * Argument のæ–?—å?から、引数かã?ロパティをセãƒ?ƒˆしますã?
123 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
124 * Argument を設定する時に、タイプ判断として、getArgumentType( String ) ã‚?
125 * 使用しますã?よって、不正な Argument を設定したå?合ã?、強制終äº?�•れますã?
126 *
127 * @param arg 引数
128 * @see #putArgument( String,String )
129 */
130 public void putArgument( final String arg ) {
131 int type = getArgumentType( arg );
132
133 switch( type ) {
134 case CMNT : break;
135 case ARGS : argments.add( arg ); break;
136 case PROP :
137 int sep = arg.indexOf( '=' ); // sep はã€?0 以上保証済み
138 String key = arg.substring(1,sep);
139 String val = arg.substring(sep+1);
140 checkProparty( key ); // 3.8.0.1 (2005/06/17)
141 proparty.put( key,val );
142 break;
143 default: break;
144 }
145 }
146
147 /**
148 * Argument のæ–?—å?から、ã?ロパティをセãƒ?ƒˆしますã?
149 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
150 * こã?メソãƒ?ƒ‰は、引数 ã‚?コメントã?判断を行いません。ã?ロパティ のみ
151 * 設定されるもã?として、å?ç�?�—ますã?
152 * プロパティの key=val がå?めからå?割されてã�?‚‹場合ã?簡易メソãƒ?ƒ‰ですã?
153 *
154 * @param key プロパティのキー
155 * @param val プロパティの値
156 * @see #putArgument( String )
157 */
158 public void putArgument( final String key,final String val ) {
159 checkProparty( key ); // 3.8.0.1 (2005/06/17)
160 proparty.put( key,val );
161 }
162
163 /**
164 * ?»引数?½個数æŒ?®šを設定しますã?
165 * æœ?¤§値、最小å?を登録しておくことで、å?数がã?規定から外れてã�?�ªã�?�‹
166 * どã�?�‹を確認しますã?
167 * エラー判定ã?、実際にã€?¼»引数?½を取りå?すときに行われますã?
168 * こã?チェãƒ?‚¯の登録は、putArgument( String ) の前でも後でもよくã?
169 * getArgument の実行前であれば、いつでも構いませんã€?
170 * 設定しなã�??合ã?初期値はã€???00 ですã?
171 *
172 * @param min ?»引数?½のæœ?°�å?数(初期値:0)
173 * @param max ?»引数?½のæœ?¤§個数(初期値:200)
174 */
175 public void setArgRange( final int min, final int max ) {
176 argRangeMin = min ;
177 argRangeMax = max ;
178 }
179
180 /**
181 * ?»プロパティ?½å¿??チェãƒ?‚¯ Map 登録
182 * å¿??キーが登録されたかどã�?�‹のチェãƒ?‚¯を行いますã?
183 * マスト判定ã?、実際にã€?¼»プロパティ?½を取りå?すときに行われますã?
184 * すべてのプロパティーがセãƒ?ƒˆし終わったかどã�?�‹の判断がå?来なã�?�Ÿめですã?
185 * それ以外ã?チェãƒ?‚¯は、putArgument( String ) 時に行われるので、それまでに
186 * mustProparty のMapを登録しておくå¿?¦�がありますã?
187 * ただしã?引数æ–?—å?の記述チェãƒ?‚¯(使用してもよã�??の配å?チェãƒ?‚¯)はã€?
188 * #getProparty( String , String , String[] ) で行われるので、取得時になりますã?
189 *
190 * 設定しなã�??合ã?初期値は、制限なしですã?
191 * æŒ?®šã?MapのValue値には、エラー時ã?コメントを記述しておきますã?
192 *
193 * @param mustProp å¿??キーのMap
194 * @see #getProparty( String , String , String[] )
195 */
196 public void setMustProparty( final Map<String,String> mustProp ) {
197 mustProparty = new LinkedHashMap<String,String>( mustProp ) ;
198 }
199
200 /**
201 * ?»プロパティ?½整合æ?チェãƒ?‚¯ Map 登録
202 * æŒ?®šされてã�?‚‹キーのみ登録可能ですã?
203 * エラー判定ã?、実際にã€?¼»プロパティ?½を取りå?すときに行われますã?
204 * こã?チェãƒ?‚¯の登録は、putArgument( String ) 時に行われるので、それまでに
205 * usableProparty のMapを登録しておくå¿?¦�がありますã?
206 * ただしã?引数æ–?—å?の記述チェãƒ?‚¯(使用してもよã�??の配å?チェãƒ?‚¯)はã€?
207 * #getProparty( String , String , String[] ) で行われるので、取得時になりますã?
208 *
209 * 設定しなã�??合ã?初期値は、制限なしですã?
210 * æŒ?®šã?MapのValue値には、このキーに対する解説を登録しておきますã?
211 *
212 * @param useProp 使用可能キーのMap
213 */
214 public void setUsableProparty( final Map<String,String> useProp ) {
215 usableProparty = new LinkedHashMap<String,String>( useProp ) ;
216 }
217
218 /**
219 * Argument のæ–?—å?から、そのタイプを判断しますã?
220 * 引数の形式が不正な場å�?例えば、キーと値のåˆ?›¢の = の前後にスペã?スがå?ったå?å�?
221 * RuntimeException で強制終äº?�—ますã?
222 *
223 * ?»コメント] ??# で始まる引数で、使用されませんã€?登録もされませんã€?
224 * ?»引数?½ ??#,-,= 以外で始まるé?常のæ–?—å?。登録のé ?•ªが指定されますã?
225 * ?»プロパティ?½??- で始まりã?キーと値ã‚?で区åˆ?�£てã�?‚‹パラメータですã?é ?º�ã?無関係ã?
226 *
227 * ※ 引数の設定方法が間違ってã�?‚‹場合ã?RuntimeException ã�?throw されますã?
228 *
229 * @og.rev 5.3.4.0 (2011/04/01) 空æ–?—å?など無関係なパラメータは処ç�?�—なã�?‚ˆã�?�«変更
230 *
231 * @param arg 引数
232 *
233 * @return 引数タイãƒ?CMNT,ARGS,PROP)
234 * @see Argument#CMNT ?»コメント]
235 * @see Argument#ARGS ?»引数?½
236 * @see Argument#PROP ?»プロパティ?½
237 */
238 public int getArgumentType( final String arg ) {
239 // if( arg == null || arg.length() == 0 || arg.startsWith( "#" ) ) {
240 if( arg == null || arg.trim().length() == 0 || arg.startsWith( "#" ) ) { // 5.3.4.0 (2011/04/01)
241 return CMNT;
242 }
243 else if( arg.startsWith( "=" ) || arg.endsWith( "=" ) ) { // 不正引数
244 String errMsg = "引数の = の前後には、スペã?スをå?れなã�?�§下さã�??"
245 + " BAD Argument=[" + arg + "]" ;
246 throw new RuntimeException( errMsg );
247 }
248 else if( arg.startsWith( "-" ) ) {
249 int sep = arg.indexOf( '=' );
250 if( sep > 0 && sep < arg.length()-1 ) {
251 return PROP;
252 }
253 else {
254 String errMsg = "-KEY を指定するå?合ã?ã€? を続けて、VALUEを指定して下さã�??"
255 + " -KEY=VALUE 形å¼?BAD Argument=[" + arg + "]" ;
256 throw new RuntimeException( errMsg );
257 }
258 }
259 else {
260 return ARGS ;
261 }
262 }
263
264 /**
265 * æŒ?®šã?番号に対する?»引数?½を返しますã?
266 * ?»引数?½はã€?,-,= 以外で始まるé?常のæ–?—å?として登録されてã�?�¾すã?
267 * 登録されたé?番で取得しますã?
268 *
269 * ※ 引数の設定方法が間違ってã�?‚‹場合ã?RuntimeException ã�?throw されますã?
270 *
271 * @param adrs 番号
272 *
273 * @return ?»引数?½
274 */
275 public String getArgument( final int adrs ) {
276 // 以下ã?チェãƒ?‚¯は、getArgument が呼ばれてä¸?º¦のみの実行でよいã€?
277 if( ! argOkFlag ) {
278 if( argRangeMin < argments.size() || argments.size() < argRangeMax ) {
279 String errMsg = "?»引数?½個数が最å°?æœ?¤§個数をæº?�Ÿしてã�?�¾せんã€?
280 + " Min:" + argRangeMin + " <= " + argments.size() + " < Max:" + argRangeMax ;
281 throw new RuntimeException( errMsg );
282 }
283 argOkFlag = true;
284 }
285
286 if( argments.size() <= adrs ) {
287 String errMsg = "æŒ?®šã?アドレスはã€?¼»引数?½設定å?数外ですã?"
288 + " Size:" + argments.size() + " <= " + adrs ;
289 throw new RuntimeException( errMsg );
290 }
291
292 return argments.get( adrs );
293 }
294
295 /**
296 * æŒ?®šã?番号に対する?»引数?½を返しますã?
297 * def には、文字å?の初期値を指定しておきますã?adrs に対応するå?がã?null の場合ã?
298 * こã? def をそのまま返しますã?
299 *
300 * 処ç�??、getArgument( int ) の結果をã?使用してã�?�¾すã?
301 *
302 * @param adrs 番号
303 * @param def 値ã�?null の場合ã?初期値
304 *
305 * @return ?»引数?½
306 * @see #getArgument( int )
307 */
308 public String getArgument( final int adrs, final String def ) {
309 String value = getArgument( adrs );
310 return ( value != null ) ? value : def ;
311 }
312
313 /**
314 * æŒ?®šã?番号に対する?»引数?½を返しますã?
315 * def には、数字ã?初期値を指定しておきますã?adrs に対応するå?がã?null の場合ã?
316 * こã? def をそのまま返しますã?
317 *
318 * 処ç�??、getArgument( int ) の結果をã?使用してã�?�¾すã?
319 *
320 * @param adrs 番号
321 * @param def 値ã�?null の場合ã?初期値
322 *
323 * @return ?»引数?½
324 * @see #getArgument( int )
325 */
326 public int getArgument( final int adrs, final int def ) {
327 String value = getArgument( adrs );
328 return ( value != null ) ? Integer.parseInt( value ) : def ;
329 }
330
331 /**
332 * æŒ?®šã?番号に対する?»引数?½を返しますã?
333 * def には、boolean の初期値を指定しておきますã?adrs に対応するå?がã?null の場合ã?
334 * こã? def をそのまま返しますã?
335 *
336 * 処ç�??、getArgument( int ) の結果をã?使用してã�?�¾すã?
337 *
338 * @param adrs 番号
339 * @param def 値ã�?null の場合ã?初期値
340 *
341 * @return ?»引数?½
342 * @see #getArgument( int )
343 */
344 public boolean getArgument( final int adrs, final boolean def ) {
345 String value = getArgument( adrs );
346 return ( value != null ) ? Boolean.valueOf( value ).booleanValue() : def ;
347 }
348
349 /**
350 * ?»プロパティ?½整合æ?チェãƒ?‚¯ 実è¡?
351 * 設定された整合æ?チェãƒ?‚¯を実行しますã?
352 * è¤?•°キーに対応する為に、å?頭からの判定も行いますã?
353 * チェãƒ?‚¯するキーの大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
354 *
355 * ※ 引数の設定方法が間違ってã�?‚‹場合ã?RuntimeException ã�?throw されますã?
356 *
357 * @og.rev 5.1.5.0 (2010/04/01) 判定ã?条件がã?重è¤?�—てã�?�Ÿので修正ã€?
358 *
359 * @param key チェãƒ?‚¯する入力キー
360 */
361 private void checkProparty( final String key ) {
362
363 // 第?‘ã?判定ã? proparty にすでに存在してã�?‚Œば、エラーになるã?
364 if( proparty.get( key ) != null ) {
365 StringBuilder errMsg = new StringBuilder();
366
367 errMsg.append( "キー[" ).append( key ).append( "]は、すでにæŒ?®š済みですã?" ).append( CR );
368 errMsg.append( " 登録済み??" ).append( key ).append( "=" ).append( proparty.get( key ) );
369 errMsg.append( CR );
370 throw new RuntimeException( errMsg.toString() );
371 }
372
373 if( mustProparty != null ) {
374 // 第?’ã?判定ã? mustProparty に存在すれば、即抜けするã€?
375 if( mustProparty.containsKey( key ) ) { return; }
376
377 // 第?“ã?判定ã?è¤?•°キー(先é?ä¸??キー)の場合もありã�?‚‹ため、å?頭からの比è¼?‚’行うã€?
378 Iterator<Map.Entry<String,String>> ite = mustProparty.entrySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
379 while( ite.hasNext() ) {
380 Map.Entry<String,String> entry = ite.next(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
381 String propKey = entry.getKey(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
382 if( key.startsWith( propKey ) ) { return ; } // マッチすれã?、即抜けるã?
383 }
384 }
385
386 // 5.1.5.0 (2010/04/01) 判定ã?条件がã?重è¤?�—てã�?�Ÿので修正ã€?
387 // if( usableProparty != null && !usableProparty.containsKey( key ) ) {
388 if( usableProparty != null ) {
389 // 第?”ã?判定ã? usableProparty に存在すれば、即抜けするã€?
390 if( usableProparty.containsKey( key ) ) { return ; }
391
392 // 第?•ã?判定ã?è¤?•°キー(先é?ä¸??キー)の場合もありã�?‚‹ため、å?頭からの比è¼?‚’行うã€?
393 Iterator<Map.Entry<String,String>> ite = usableProparty.entrySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
394 while( ite.hasNext() ) {
395 Map.Entry<String,String> entry = ite.next(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
396 String propKey = entry.getKey(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
397 if( key.startsWith( propKey ) ) { return ; } // マッチすれã?、即抜けるã?
398 }
399
400 // そこまで探して見つからなã�??合ã?、定義外引数エラー
401 StringBuilder errMsg = new StringBuilder();
402
403 errMsg.append( "-KEY がã?æŒ?®šã?整合æ?リストに含まれてã�?�¾せんã€? );
404 errMsg.append( CR ) ;
405 errMsg.append( " -KEY=VALUE 形å¼?BAD Key=[" ).append( key ).append( "]" );
406 errMsg.append( CR ) ;
407 errMsg.append( toString() ) ;
408 throw new RuntimeException( errMsg.toString() );
409 }
410 }
411
412 /**
413 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
414 * 値が設定されてã�?�ªã�??合ã?ã€?null を返しますã?
415 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
416 *
417 * ※ 引数の設定方法が間違ってã�?‚‹場合ã?RuntimeException ã�?throw されますã?
418 *
419 * @param key 引数のキー
420 *
421 * @return 引数に対する値
422 */
423 public String getProparty( final String key ) {
424
425 String value = proparty.get( key );
426
427 // 値ã�?null で must 設定があり、かつマストキーが指定してã�?‚‹場合ã?
428 if( value == null &&
429 mustProparty != null &&
430 mustProparty.containsKey( key ) ) {
431 String errMsg = "æŒ?®šã??»プロパティ?½は、å¿??キーですが、å?ã�?null ですã?"
432 + " Key:" + key + " 説æ˜?" + mustProparty.get( key )
433 + CR + toString() ;
434 throw new RuntimeException( errMsg );
435 }
436
437 return value ;
438 }
439
440 /**
441 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
442 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
443 * def には、文字å?の初期値を指定しておきますã?key に対応するå?がã?null の場合ã?
444 * こã? def をそのまま返しますã?
445 *
446 * 処ç�??、getProparty( String ) の結果をã?使用してã�?�¾すã?
447 *
448 * @param key キー
449 * @param def 値ã�?null の場合ã?初期値
450 *
451 * @return ?»プロパティ?½
452 * @see #getProparty( String )
453 */
454 public String getProparty( final String key, final String def ) {
455 String value = getProparty( key );
456 return ( value != null ) ? value : def ;
457 }
458
459 /**
460 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
461 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
462 * def には、文字å?の初期値を指定しておきますã?key に対応するå?がã?null の場合ã?
463 * こã? def をそのまま返しますã?
464 * list 配å?には、登録できるæ–?—å?配å?を指定しますã?こã?æ–?—å?に含まれなã�?
465 * 値が設定されてã�?�Ÿ場合ã?、エラーになりますã?
466 *
467 * 処ç�??、getProparty( String ) の結果をã?使用してã�?�¾すã?
468 *
469 * ※ 引数の設定方法が間違ってã�?‚‹場合ã?RuntimeException ã�?throw されますã?
470 *
471 * @param key キー
472 * @param def 値ã�?null の場合ã?初期値
473 * @param list 値として存在できるæ–?—å?リスãƒ?
474 *
475 * @return ?»プロパティ?½
476 * @see #getProparty( String )
477 */
478 public String getProparty( final String key, final String def, final String[] list ) {
479 String value = getProparty( key,def );
480 if( value != null ) {
481 boolean isOK = false;
482 for( int i=0; i<list.length; i++ ) {
483 if( value.equalsIgnoreCase( list[i] ) ) {
484 isOK = true; break;
485 }
486 }
487 if( !isOK ) {
488 String errMsg = key + " はã€? + Arrays.toString( list )
489 + " からæŒ?®šしてくださいã€? + CR
490 + "-" + key + "=[" + value + "]" ;
491 throw new RuntimeException( errMsg );
492 }
493 }
494
495 return value ;
496 }
497
498 /**
499 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
500 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
501 * def には、数字ã?初期値を指定しておきますã?key に対応するå?がã?null の場合ã?
502 * こã? def をそのまま返しますã?
503 *
504 * 処ç�??、getProparty( String ) の結果をã?使用してã�?�¾すã?
505 *
506 * @param key キー
507 * @param def 値ã�?null の場合ã?初期値
508 *
509 * @return ?»プロパティ?½
510 * @see #getProparty( String )
511 */
512 public int getProparty( final String key, final int def ) {
513 String value = getProparty( key );
514 return ( value != null ) ? Integer.parseInt( value ) : def ;
515 }
516
517 /**
518 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
519 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
520 * def には、boolean の初期値を指定しておきますã?key に対応するå?がã?null の場合ã?
521 * こã? def をそのまま返しますã?
522 *
523 * 処ç�??、getProparty( String ) の結果をã?使用してã�?�¾すã?
524 *
525 * @param key キー
526 * @param def 値ã�?null の場合ã?初期値
527 *
528 * @return ?»プロパティ?½
529 * @see #getProparty( String )
530 */
531 public boolean getProparty( final String key, final boolean def ) {
532 String value = getProparty( key );
533 return ( value != null ) ? Boolean.valueOf( value ).booleanValue() : def ;
534 }
535
536 /**
537 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
538 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
539 * key プロパティはã€??常の引数としてæŒ?®šできる簡易的な値を設定しますã?
540 * keyFile プロパティ は、ファイル名をæŒ?®šし、そのファイルの中身ã‚?
541 * 取得して返しますã?通常は?‘行であるがã?時にはè¤?•°行ã?ãƒ??タを指å®?
542 * したã�??合にã€?¼’つのパラメータを使ã�?�¾すが、設定å?は、同じ引数として
543 * 使用したã�?‚±ースに便利ですã?
544 * key プロパティと、keyFile プロパティ は、同時指定できませんã€?
545 * これは、指定方法ã?間違ã�?‰を避ける為ですã?
546 * どちらも、null である可能性はありますã?
547 *
548 * ※ 同時æŒ?®š時、またã?、must å¿??時に null の場合ã?RuntimeException ã�?throw されますã?
549 *
550 * @param key キー
551 * @param keyFile 設定ファイルå�?
552 * @param must å¿??条件[true/false]
553 *
554 * @return ?»プロパティ?½
555 * @see #getProparty( String )
556 */
557 public String getFileProparty( final String key, final String keyFile, final boolean must ) {
558 return getFileProparty( key,keyFile,null,must );
559 }
560
561 /**
562 * å†?ƒ¨で使用する?»プロパティ?½をã?キーを指定して取得しますã?
563 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
564 * key プロパティはã€??常の引数としてæŒ?®šできる簡易的な値を設定しますã?
565 * keyFile プロパティ は、ファイル名をæŒ?®šし、そのファイルの中身ã‚?
566 * 取得して返しますã?通常は?‘行であるがã?時にはè¤?•°行ã?ãƒ??タを指å®?
567 * したã�??合にã€?¼’つのパラメータを使ã�?�¾すが、設定å?は、同じ引数として
568 * 使用したã�?‚±ースに便利ですã?
569 * key プロパティと、keyFile プロパティ は、同時指定できませんã€?
570 * これは、指定方法ã?間違ã�?‰を避ける為ですã?
571 * どちらも、null である可能性はありますã?
572 *
573 * ※ 同時æŒ?®š時、またã?、must å¿??時に null の場合ã?RuntimeException ã�?throw されますã?
574 *
575 * @param key キー
576 * @param keyFile 設定ファイルå�?
577 * @param encode keyFile読取エンコーãƒ?null はãƒ?ƒ•ォルトエンコーãƒ?
578 * @param must å¿??条件[true/false]
579 *
580 * @return ?»プロパティ?½
581 * @see #getProparty( String )
582 */
583 public String getFileProparty( final String key, final String keyFile,
584 final String encode,final boolean must ) {
585 String val = getProparty( key );
586 String valFile = getProparty( keyFile );
587
588 if( val != null && valFile != null ) {
589 String errMsg = key + "かã?" + keyFile + " は、両方同時にæŒ?®šできませんã€?" + val + "],[" + valFile + "]";
590 throw new RuntimeException( errMsg );
591 }
592
593 if( valFile != null ) {
594 FileString fs = new FileString();
595 fs.setFilename( valFile );
596 fs.setEncode( encode );
597 val = fs.getValue();
598 }
599
600 if( must && val == null ) {
601 String errMsg = key + "かã?" + keyFile + " は、片方å¿??ですã?";
602 throw new RuntimeException( errMsg );
603 }
604
605 return val;
606 }
607
608 /**
609 * å†?ƒ¨で使用する?»プロパティ?½をã?キーをå?頭に含ã‚??を取得しますã?
610 * ?»プロパティ?½のキー部の大æ–?—・小文字ã?、厳格に判定してã�?�¾すã?
611 * 値が設定されてã�?�ªã�??合ã?、String[0] を返しますã?
612 * HybsEntry のキーに設定される値は、引数の先é?キーを除ã�?�Ÿæ–?—å?ですã?
613 * 例えばã€?const_" のような値を与えて、const_AA, const_BB, const_CC の
614 * ?“つのキーが選定された場合ã?キーは、AA, BB, CC のみ返しますã?
615 *
616 * @param startsKey 引数の先é?のキー
617 *
618 * @return 引数に対する?»プロパティ?½のHybsEntry
619 */
620 public HybsEntry[] getEntrys( final String startsKey ) {
621
622 ArrayList<HybsEntry> list = new ArrayList<HybsEntry>();
623 int len = startsKey.length();
624
625 Iterator<Map.Entry<String,String>> ite = proparty.entrySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
626 while( ite.hasNext() ) {
627 Map.Entry<String,String> entry = ite.next(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
628 String key = entry.getKey(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
629 if( key.startsWith( startsKey ) ) {
630 list.add( new HybsEntry( key.substring( len ), entry.getValue() ) ); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
631 }
632 }
633
634 return list.toArray( new HybsEntry[list.size()] ) ;
635 }
636
637 /**
638 * 入力文字å?に、{@XXXX}関係ã?æ–?—å?変換を行いますã?
639 * 引数に含まれる {@XXXX}=YYYY とã�?�†入力に対して、inMsg に
640 * 含まれる{@XXXX} æ–?—å?をã?YYYY とã�?�†æ–?—å?に変換しますã?
641 * それ以外に、予ç´?–‡字変換としてã€?
642 * {@ARG.XXX} 引数に使用されたå?をå?利用(割り当て)しますã?
643 * {@DATE.XXX} SimpleDateFormat 形式ã?æ–?—を変換しますã?(日付ã?時刻ç?
644 * {@ENV.XXX} シスãƒ?ƒ プロパティーのæ–?—を変換しますã?(java -Dkey=value オプション)
645 *
646 * @param inMsg 入力文字å?
647 *
648 * @return 変換後文字å?
649 */
650 public String changeParam( final String inMsg ) {
651 if( inMsg == null ) { return inMsg; }
652
653 String message = inMsg;
654
655 // {@ARG.XXXX} 変数の置換å?ç�?
656 int adrs = message.indexOf( "{@ARG." ) ;
657 while( adrs >= 0 ) {
658 int end = message.indexOf( '}',adrs ) ;
659 String key = message.substring( adrs+6,end );
660 String oldData = "{@ARG." + key + "}" ;
661 // 注意:{@XXX}と異なりã?{@ARG.XXX} では、XXX で proparty を検索するã€?
662 String newData = StringUtil.nval( getProparty( key ),"" );
663 message = StringUtil.replace( message,oldData,newData );
664 adrs = message.indexOf( "{@ARG.",adrs ) ;
665 }
666 // {@DATE.XXXX} 変数の置換å?ç�?
667 adrs = message.indexOf( "{@DATE." ) ;
668 if( adrs >= 0 ) {
669 Date dt = new Date();
670 while( adrs >= 0 ) {
671 int end = message.indexOf( '}',adrs ) ;
672 String key = message.substring( adrs+7,end );
673 String oldData = "{@DATE." + key + "}" ;
674 DateFormat formatter = new SimpleDateFormat( key, Locale.JAPANESE );
675 String newData = StringUtil.nval( formatter.format(dt),"" );
676 message = StringUtil.replace( message,oldData,newData );
677 adrs = message.indexOf( "{@DATE.",adrs ) ;
678 }
679 }
680 // {@ENV.XXXX} 変数の置換å?ç�?
681 adrs = message.indexOf( "{@ENV." ) ;
682 while( adrs >= 0 ) {
683 int end = message.indexOf( '}',adrs ) ;
684 String key = message.substring( adrs+6,end );
685 String oldData = "{@ENV." + key + "}" ;
686 String newData = System.getProperty( key,"" );
687 message = StringUtil.replace( message,oldData,newData );
688 adrs = message.indexOf( "{@ARG.",adrs ) ;
689 }
690
691 // 残りのメãƒ?‚»ージ本æ–?¸の置換文字å?をå?ç�?�—ますã?
692 adrs = message.indexOf( "{@" ) ;
693 while( adrs >= 0 ) {
694 int end = message.indexOf( '}',adrs ) ;
695 String key = message.substring( adrs,end+1 ); // +1 注æ„?
696 String oldData = key ;
697 // 注意:{@ARG.XXX} と異なりã?{@XXX} そã?もã?で proparty を検索するã€?
698 String newData = StringUtil.nval( getProparty( key ),"" );
699 message = StringUtil.replace( message,oldData,newData );
700 adrs = message.indexOf( "{@",adrs ) ;
701 }
702
703 return message;
704 }
705
706 /**
707 * こã?オブジェクトã?å†?ƒ¨表現をã?æ–?—å?にして返しますã?
708 * クラスå�???起動時の引数リストを表示しますã?
709 *
710 * @return 引数に対する値
711 */
712 @Override
713 public String toString() {
714 StringBuilder buf = new StringBuilder();
715
716 buf.append( "java " ).append( programID ).append( CR );
717
718 if( ! argments.isEmpty() ) {
719 for( int i=0; i<argments.size(); i++ ) {
720 buf.append( " " ).append( argments.get(i) );
721 }
722 buf.append( CR );
723 }
724
725 Iterator<Map.Entry<String,String>> propIte = proparty.entrySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
726 while( propIte.hasNext() ) {
727 Map.Entry<String,String> entry = propIte.next(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
728 String key = entry.getKey(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
729 Object val = entry.getValue();
730 if( key.startsWith( "passwd" ) ) {
731 val = "*****" ;
732 }
733
734 buf.append( " -" ).append( key ).append( "=" ).append( val );
735 buf.append( CR );
736 }
737
738 return buf.toString();
739 }
740
741 /**
742 * こã?クラスの使用方法を返しますã?
743 *
744 * @return こã?クラスの使用方æ³?
745 */
746 public String usage() {
747 StringBuilder buf = new StringBuilder();
748
749 buf.append( toString() );
750 buf.append( CR );
751
752 buf.append( propartyToString( "[ Must Proparty List ]",mustProparty ) );
753
754 buf.append( propartyToString( "[ Usable Proparty List ]",usableProparty ) );
755
756 return buf.toString();
757 }
758
759 /**
760 * プロパティーを文字å?に変換しますã?
761 *
762 * proparty の キーのæœ?¤§長さを求め、位置あわせã?ためのスペã?スを追åŠ?�—ますã?
763 *
764 * @param title タイトル
765 * @param proparty プロパティー(Mapオブジェクãƒ?
766 *
767 * @return プロパティーæ–?—å?
768 */
769 private String propartyToString( final String title,final Map<String,String> proparty ) {
770 StringBuilder buf = new StringBuilder();
771
772 if( proparty != null ) {
773 buf.append( title ).append( CR );
774
775 // キーの長さをそろえるための処ç�?
776 int maxLen = 0;
777 Iterator<String> keyIte = proparty.keySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
778 while( keyIte.hasNext() ) {
779 int len = keyIte.next().length(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
780 if( len > maxLen ) { maxLen = len; }
781 }
782
783 char[] ch = new char[maxLen];
784 Arrays.fill( ch,' ' ); // スペã?スで埋めますã?
785 String SPACE = new String( ch );
786 String VAL_SPACE = CR + SPACE + " " ;
787
788 Iterator<Map.Entry<String,String>> propIte = proparty.entrySet().iterator(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
789 while( propIte.hasNext() ) {
790 Map.Entry<String,String> entry = propIte.next(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
791 String key = entry.getKey(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
792 String val = entry.getValue(); // 4.3.3.6 (2008/11/15) Generics警告対å¿?
793 if( val != null ) { val = val.replaceAll( CR,VAL_SPACE ); }
794 buf.append( " -" ).append( key );
795 buf.append( SPACE.substring( key.length() ) ); // 使用されるキー
796 buf.append( " : " ).append( val ) ; // そã?説æ˜?
797 buf.append( CR );
798 }
799 }
800
801 return buf.toString();
802 }
803 }