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             * 入力文字å?ã«ã€{&#064;XXXX}関係ã?æ–?­—å?変æ›ã‚’行ã„ã¾ã™ã?
639             * 引数ã«å«ã¾ã‚Œã‚‹ {&#064;XXXX}=YYYY ã¨ã?†å…¥åŠ›ã«å¯¾ã—ã¦ã€inMsg ã«
640             * å«ã¾ã‚Œã‚‹{&#064;XXXX} æ–?­—å?ã‚’ã?YYYY ã¨ã?†æ–?­—å?ã«å¤‰æ›ã—ã¾ã™ã?
641             * ãれ以外ã«ã€äºˆç´?–‡å­—変æ›ã¨ã—ã¦ã€?
642             *   {&#064;ARG.XXX}  引数ã«ä½¿ç”¨ã•れãŸå?ã‚’å?利用(割り当ã¦)ã—ã¾ã™ã?
643             *   {&#064;DATE.XXX} SimpleDateFormat å½¢å¼ã?æ–?­—を変æ›ã—ã¾ã™ã?(日付ã?時刻ç­?
644             *   {&#064;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    }