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.text.DateFormat;
019    // import java.text.SimpleDateFormat;
020    // import java.util.Locale;
021    // import java.util.Calendar;
022    import java.util.ArrayList;
023    import java.util.Map;
024    import java.util.HashMap;
025    
026    /**
027     * SystemParameter は、{@XXXX} æ–?­—å?をå?ç�?�™るクラスですã?
028     * こã?クラスでは、{@XXXX} æ–?­—å?を別のæ–?­—å?と置き換えることã‚??
029     * 予め予ç´?�•れてã�?‚‹予ç´?ª?{@DATE.XXXX} æ–?­—å?を置き換えますã?
030     * 通常の {@XXXX} æ–?­—å?の置き換えã?、キーと値のペアをã?HybsEntry オブジェクトに
031     * セãƒ?ƒˆして、その配å?を受け取って処ç�?�—ますã?
032     *
033     * 以下ã?値はあらかじめã?動的に作æ?されますã?
034     * ・DATE.YMD       ?˜byte の今日のシスãƒ?ƒ 日ä»?yyyyMMdd)
035     * ・DATE.YMDH    ?‘4byte の今日のシスãƒ?ƒ 日æ™?yyyyMMddHHmmss)
036     * ・DATE.HMS       ?–byte の今日のシスãƒ?ƒ 時間(HHmmss)
037     *
038     * @og.group ユーãƒ?‚£リãƒ?‚£
039     *
040     * @version  4.0
041     * @author   Kazuhiko Hasegawa
042     * @since    JDK5.0,
043     */
044    public final class SystemParameter {
045    
046    //      private final Map<String,String> sysMap = new HashMap<String,String>();
047            /** 改行コーãƒ?*/
048            public static final String CR = System.getProperty("line.separator");   // 5.1.9.0 (2010/08/01) 追åŠ?
049    
050            //      5.5.7.2 (2012/10/09) HybsDateUtil を利用するため、削除しますã?
051    //      private static final Map<String,String>   DATE_FORMAT = new HashMap<String,String>();       // 5.3.4.0 (2011/04/01)
052    //      static {
053    //              DATE_FORMAT.put( "SYS.YMD"              ,"yyyyMMdd"                             );
054    //              DATE_FORMAT.put( "SYS.YMDH"     ,"yyyyMMddHHmmss"               );
055    //              DATE_FORMAT.put( "SYS.HMS"              ,"HHmmss"                               );
056    //              DATE_FORMAT.put( "DATE.YMD"     ,"yyyyMMdd"                     );
057    //              DATE_FORMAT.put( "DATE.Y2MD"    ,"yyMMdd"                               );
058    //              DATE_FORMAT.put( "DATE.YM"              ,"yyyyMM"                               );
059    //              DATE_FORMAT.put( "DATE.HMS"     ,"HHmmss"                               );
060    //              DATE_FORMAT.put( "DATE.YMDHMS"  ,"yyyyMMddHHmmss"               );
061    //              DATE_FORMAT.put( "DATE.YMDF"    ,"yyyy/MM/dd"                   );
062    //              DATE_FORMAT.put( "DATE.Y2MDF"   ,"yy/MM/dd"                     );
063    //              DATE_FORMAT.put( "DATE.YMF"     ,"yyyy/MM"                              );
064    //              DATE_FORMAT.put( "DATE.HMSF"    ,"HH:mm:ss"                     );
065    //              DATE_FORMAT.put( "DATE.YMDHMSF" ,"yyyy/MM/dd/ HH:mm:ss" );
066    //              DATE_FORMAT.put( "DATE.EEE"     ,"EEE"                                  );
067    //      }
068    
069            private final String    original ;
070            // 5.5.7.2 (2012/10/09) Calendarオブジェクトからã?String時刻に変更ã€?
071    //      private final Calendar  rightNow;                                                                               // 5.3.4.0 (2011/04/01)
072    //      private final String    RIGHT_NOW = HybsDateUtil.getDate( "yyyyMMdd" ); // 5.7.4.1 (2014/03/14) å»?­¢
073    
074            private final String[] clms;
075            private final String[] formats;
076    
077            /**
078             *  {&#064;XXXX} の特殊文字を含ã‚?–‡字å?をã?置き換えますã?
079             * 対象外ã?æ–?­—å?は、そのまま、残されますã?
080             *
081             * @og.rev 5.1.8.0 (2010/07/01) パã?ス方法見直ã�?StringTokenizerでは、{&#064;XXXX}がé?続してある場合に対応できなã�?
082             * @og.rev 5.3.2.0 (2011/02/01) original ãƒ??タをã?パã?ス結果を利用するように修正するã€?
083             * @og.rev 5.3.4.0 (2011/04/01) {&#064;DATE.XXXX} をå?ç�?�§きるように機è?追åŠ?
084             * @og.rev 5.3.5.0 (2011/05/01) {&#064;SYS.XXXX} は、å»?­¢
085             * @og.rev 5.5.7.2 (2012/10/09) rightNow をCalendarオブジェクãƒ?ではなくã?String時刻としますã?
086             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
087             *
088             * @param       orig    変換するæ–?­—å?(オリジナル)
089             */
090            public SystemParameter( final String orig ) {
091    //              rightNow = Calendar.getInstance();
092    
093                    if( orig == null || orig.length() == 0 || orig.indexOf( "{@" ) < 0 ) {
094                            clms     = null;
095                            formats  = null;
096                            original = orig;                // 5.3.2.0 (2011/02/01)
097                    }
098                    else {
099                            StringBuilder buf = new StringBuilder(orig.length());           // 5.3.2.0 (2011/02/01)
100    
101                            ArrayList<String> fmtList = new ArrayList<String>();
102                            ArrayList<String> clmList = new ArrayList<String>();
103    
104                            // 5.1.8.0 (2010/07/01) パã?ス方法見直ã�?
105                            int start = 0;
106                            int index = orig.indexOf( "{@" );
107                            String val ;
108                            while( index >= 0 ) {
109    //                              buf.append(  orig.substring( start, index ) );          // 5.3.2.0 (2011/02/01)
110    //                              fmtList.add( orig.substring( start, index ) );
111                                    val = orig.substring( start, index );                                   // 5.3.4.0 (2011/04/01)
112                                    buf.append(  val );
113                                    fmtList.add( val );
114                                    int end = orig.indexOf( '}',index );
115                                    if( end < 0 ) {
116                                            String errMsg = "{@ と } との対応関係がずれてã�?�¾すã?" + CR
117                                                                    + "str=[" + orig + "] : index=" + index ;
118                                            throw new RuntimeException( errMsg );
119                                    }
120                                    String param = orig.substring( index+2,end );
121    //                              if( param.startsWith( "SYS." ) || param.startsWith( "DATE." ) ) {
122                                    if( param.startsWith( "DATE." ) ) {             // 5.3.5.0 (2011/05/01) {&#064;SYS.XXXX} は、å»?­¢
123    //                                      val = getDateFormat( param );
124                                            val = getDateFormat( param.substring( 5 ) );    // 5.5.7.2 (2012/10/09) HybsDateUtil を利用時に "DATE." は不è¦?
125                                            clmList.add( null );            // パã?スした場合ã?、clmList は、使用しなã�??
126                                            buf.append( val );
127                                    }
128                                    else {
129                                            clmList.add( param );
130                                            buf.append( "{@" ).append( param ).append( "}" );               // å…??ままのæ–?­—å?を生æˆ?
131                                    }
132                                    start = end+1;
133                                    index = orig.indexOf( "{@",start );
134                            }
135    //                      buf.append(  orig.substring( start, orig.length() ) );          // 5.3.2.0 (2011/02/01)
136    //                      fmtList.add( orig.substring( start, orig.length() ) );
137                            val = orig.substring( start, orig.length() );                           // 5.3.4.0 (2011/04/01)
138                            buf.append(  val );
139                            fmtList.add( val );
140    
141                            original = buf.toString();              // 5.3.2.0 (2011/02/01)
142                            if( original.indexOf( "{@" ) < 0 ) {
143                                    clms     = null;
144                                    formats  = null;
145                            }
146                            else {
147                                    clms    = clmList.toArray( new String[clmList.size()] );
148                                    formats = fmtList.toArray( new String[fmtList.size()] );
149                            }
150                    }
151            }
152    
153            /**
154             * 日付関係ã?æƒ??を簡易的に取り出すå?ç�?‚’行いますã?
155             *
156             * 引数はã€?XXXX AA BB CC" とã�?�†状態で受け取りますã?
157             *
158             * 処ç�??詳細は、{@link org.opengion.fukurou.util.HybsDateUtil#getDateFormat( String,String,String,int ) }
159             * またã?、{@link org.opengion.hayabusa.taglib.CommonTagSupport#getDateFormat( String ) } ã‚?
160             * 参ç?してくださいã€?
161             *
162             * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
163             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
164             * @og.rev 5.5.8.2 (2012/11/09) prmA の判定に、null と ゼロæ–?­—å?を判定するã?
165             * @og.rev 5.7.4.1 (2014/03/14) AA 引数の@解析後ã?コマンド判定方法をã€?¼˜ケタ以下からå?頭が数字以外に変更しますã?
166             * @og.rev 5.7.4.1 (2014/03/14) taglib.CommonTagSupport#getDateFormat( String ) と処ç�?‚’合わせますã?
167             * @og.rev 5.7.4.2 (2014/03/20) リクエストパラメータ(@で始まる引数)は使えませんã€?
168             *
169             * @param   value パラメータ(引数はã€?DATE.XXXX AA BB" などとã�?�†状æ…?
170             *
171             * @return   メãƒ?‚»ージæƒ??
172             * @see         org.opengion.fukurou.util.HybsDateUtil#getDateFormat( String,String,String,int )
173             * @see         org.opengion.hayabusa.taglib.CommonTagSupport#getDateFormat( String )
174             */
175            private String getDateFormat( final String value ) {
176                    // 5.7.4.1 (2014/03/14) taglib.CommonTagSupport#getDateFormat( String ) と処ç�?‚’合わせますã?
177                    String[] vals = StringUtil.csv2Array( value,' ' );
178    
179                    String key = vals[0] ;
180    
181                    String prmA = (vals.length >= 2) ? vals[1] : null ;
182                    String prmB = (vals.length >= 3) ? vals[2] : null ;
183                    String prmC = (vals.length >= 4) ? vals[vals.length-1] : null ;              // 互換性。最後ã?値がã?CC引数
184    
185                    // 5.7.4.2 (2014/03/20) 現時点では、SystemParameter 処ç�?�«はリクエスト変数は使えなã�??で、@変数も使えなã�??
186                    if( prmA != null && prmA.startsWith( "@" ) ) {
187    //                      prmA = getDateFormat( prmA.substring(1) );              // getRequestValue ではなくã?自身をå?呼出ã�?
188                            String errMsg = "AA引数に、リクエストパラメータ(@で始まる引数)は使えません。value=[" + value + "]" ;
189                            throw new RuntimeException( errMsg );
190                    }
191    
192                    if( prmB != null && prmB.startsWith( "@" ) ) {
193    //                      prmB = getDateFormat( prmB.substring(1) );              // getRequestValue ではなくã?自身をå?呼出ã�?
194                            String errMsg = "BB引数に、リクエストパラメータ(@で始まる引数)は使えません。value=[" + value + "]" ;
195                            throw new RuntimeException( errMsg );
196                    }
197    
198                    if( prmC != null && prmC.startsWith( "@" ) ) {
199    //                      prmC = getDateFormat( prmC.substring(1) );              // getRequestValue ではなくã?自身をå?呼出ã�?
200                            String errMsg = "CC引数に、リクエストパラメータ(@で始まる引数)は使えません。value=[" + value + "]" ;
201                            throw new RuntimeException( errMsg );
202                    }
203    
204                    // 5.7.4.1 (2014/03/14) AA 引数の@解析後ã?コマンド判定方法をã€?¼˜ケタ以下からå?頭が数字以外に変更しますã?
205                    if( prmA != null && prmA.length() > 0 ) {
206                            char chA = prmA.charAt(0);
207                            if( chA < '0' || chA > '9' ) {            // 先é?がã?数字以外ã?場合ã?、コマンドなので、ä¸?�¤ずつずらすã?
208                                    prmC = prmB;
209                                    prmB = prmA;
210                                    prmA = null;
211                            }
212                    }
213    
214                    // 5.7.4.1 (2014/03/14) CC 引数をã?"H" , "D" , "M" 以外でも使用できるように拡張しますã?
215                    int intC = 0;
216                    if( prmC != null && prmC.length() > 0 ) {
217                            try { 
218                                    intC = Integer.parseInt( prmC );
219                            }
220                            catch( NumberFormatException ex ) {
221                                    String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 
222                                                                    + ex.getMessage() ;
223                                    System.err.println( errMsg );
224                            }
225                    }
226    
227                    // prmA ã�?null かã?isEmpty() の場合ã?、現在時刻が使用されるã?
228                    return HybsDateUtil.getDateFormat( key,prmA,prmB,intC );        // 5.7.4.1 (2014/03/14) CC 引数を拡張しますã?
229    
230    // 5.7.4.1 (2014/03/14) taglib.CommonTagSupport#getDateFormat( String ) と処ç�?‚’合わせますã?
231    //              String[] vals = StringUtil.csv2Array( value,' ' );
232    //
233    //              String key = vals[0].trim() ;
234    //
235    //              String prmA = null;                             // 5.5.7.2 (2012/10/09) 引数として渡すã?で上位で初期化しておくã€?
236    //              String prmB = null;
237    //              if( vals.length == 3 ) { prmB = vals[2].trim(); }
238    //
239    //              if( vals.length > 1 ) {
240    //                      prmA = vals[1].trim();
241    //                      if( prmA.startsWith( "@" ) ) {
242    //                              prmA = getDateFormat( prmA.substring(1) );
243    //                      }
244    //
245    //                      // prmA の@解析後ã??˜ケタ以下ã?場合ã?、コマンドとみなしã?prmB にセãƒ?ƒˆしã?自身は、null をセãƒ?ƒˆするã€?
246    //                      if( prmA != null && prmA.length() < 8 ) {
247    //                              prmB = prmA;
248    //                              prmA = null;
249    //                      }
250    //              }
251    //
252    //              if( prmA == null || prmA.isEmpty() ) { prmA = RIGHT_NOW; }              // 5.5.8.2 (2012/11/09) null と ゼロæ–?­—å?を判定するã?
253    //              return HybsDateUtil.getDateFormat( key,prmA,prmB );                             // 5.5.7.2 (2012/10/09) HybsDateUtil を利用する
254            }
255    
256            /**
257             *  {&#064;XXXX} の特殊文字を含ã‚?–‡字å?をã?置き換えますã?
258             * 対象外ã?æ–?­—å?は、そのまま、残されますã?
259             *
260             * @og.rev 5.3.4.0 (2011/04/01) 判定方æ³?修正
261             *
262             * @param       entry   置換文字å?のキーと値のペアを管ç�?�—てã�?‚‹Entryオブジェクトã?配å?
263             *
264             * @return      置換後ã?æ–?­—å?
265             */
266            public String replace( final HybsEntry[] entry ) {
267    //              if( orginal == null ) { return null; }
268    //              int index = orginal.indexOf( "{@" );
269    //              if( index < 0 ) { return orginal; }
270    //              if( formats == null || clms == null ) { return original; }
271                    if( formats == null ) { return original; }              // 5.3.4.0 (2011/04/01) 判定方æ³?修正
272                    if( entry == null || entry.length == 0 ) { return original; }
273    
274                    // HybsEntry[] ãƒ??タをã?Mapにマッピングしますã?
275                    Map<String, String> sysMap = new HashMap<String, String>();
276    //              if( entry != null ) {
277                            int size = entry.length;
278                            for( int i=0; i<size; i++ ) {
279                                    sysMap.put( entry[i].getKey(),entry[i].getValue() );
280                            }
281    //              }
282                    return replace( sysMap );
283            }
284    
285            /**
286             *  {&#064;XXXX} の特殊文字を含ã‚?–‡字å?をã?置き換えますã?
287             * 対象外ã?æ–?­—å?は、そのまま、残されますã?
288             *
289             * @param  map  置換文字å?のキーと値のペアを管ç�?�—てã�?‚‹Mapオブジェクãƒ?
290             *
291             * @return      置換後ã?æ–?­—å?
292             */
293            public String replace( final Map<String,String> map ) {
294    //              if( formats == null || clms == null ) { return original; }
295                    if( formats == null ) { return original; }              // 5.3.4.0 (2011/04/01) 判定方æ³?修正
296    //              if( map == null || map.size() == 0 ) { return original; }
297                    if( map == null || map.isEmpty() ) { return original; }
298    
299                    StringBuilder sb = new StringBuilder();
300                    for( int i=0; i<formats.length; i++ ) {
301                            sb.append( formats[i] );
302                            if( i < clms.length && clms[i] != null ) {           // 5.3.4.0 (2011/04/01) nullチェãƒ?‚¯追åŠ?
303                                    sb.append(  StringUtil.nval( map.get( clms[i] ), "" ) );
304                            }
305                    }
306    
307                    return sb.toString();
308            }
309    
310            /**
311             * フォーマットをパã?スした結果から、カラãƒ?¸?¦§をé?列形式で返しますã?
312             *
313             * @og.rev 5.1.7.0 (2010/06/01) 新規作æ?
314             *
315             * @return カラãƒ??åˆ?
316             */
317            public String[] getColumns() {
318                    if( clms == null ) { return new String[0]; }
319                    return clms.clone();
320            }
321    
322            /**
323             * フォーマットをパã?スした結果から、フォーマットä¸?¦§をé?列形式で返しますã?
324             *
325             * @og.rev 5.1.7.0 (2010/06/01) 新規作æ?
326             *
327             * @return フォーマットé?åˆ?
328             */
329            public String[] getFormats() {
330                    if( formats == null ) { return new String[0]; }
331                    return formats.clone();
332            }
333    }