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    ?‘ï¼”byte ã®ä»Šæ—¥ã®ã‚·ã‚¹ãƒ?ƒ æ—¥æ™?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    }