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.io.FileInputStream;
019    import java.io.FileOutputStream;
020    
021    // import java.util.Date;
022    // import java.util.Locale;
023    // import java.text.DateFormat;
024    // import java.text.SimpleDateFormat;
025    
026    /**
027     * DateSet.java ã¯ã€å?åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥ä»˜ï¼Œæ™‚åˆ»ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å®Ÿè¡Œæ™‚ã®æ—¥æ™‚ã§å¤‰æ›ã—ã¦,出力ã—ã¾ã™ã?
028     *
029     * 変æ›ã«ã¯,$(yyyy)ã®å½¢å¼ã§æŒ?®šã—,ã‚«ãƒ?‚³ã®æ–?­—å?ã¯,java.text.SimpleDateFormat ã§ä½¿ç”¨ã™ã‚‹??
030     * 時刻フォーマット構文を用ã?¾ã™ã?
031     * ã¾ãŸã?引数㫠keys,vals を渡ã™ã“ã¨ã§ã€?(KEY1) æ–?­—å?ã‚?VAL1 æ–?­—å?ã¨ç½®ãæ›ãˆã¾ã™ã?
032     *
033     *  サンプルファイル
034     *  $(yyyy/MM/dd)        å¹´?月?日を表ã—ã¾ã™ã?
035     *  $(yy)                å¹´ã?‘ã‚’ï¼’æ¡ã§è¡¨ã—ã¾ã™ã?
036     *  $(MM)                月を?’æ¡?(02,03ãªã©)ã§è¡¨ã—ã¾ã™ã?
037     *  $(dd)                日を2æ¡?(02,03ãªã©)ã§è¡¨ã—ã¾ã™ã?
038     *  $(HH:mm:ss)          時:å??šç§’を表ã—ã¾ã™ã?
039     *  $(MMMMMMMM)          月をフルスペルã§è¡¨ã—ã¾ã™ã?
040     *  $(MMM)               月を?“æ¡å›ºå®?Mar?ŒAplãªã©)ã§è¡¨ã—ã¾ã™ã?
041     *  $(EEEEEEEE)          曜日をフルスペルã§è¡¨ã—ã¾ã™ã?
042     *  $(EEE)               曜日を3æ¡å›ºå®?Sun,Monãªã©)ã§è¡¨ã—ã¾ã™ã?
043     *
044     *   時刻フォーマット構文
045     *
046     *   è¨˜å·     æ„味                    表示                ä¾?
047     *   ------   -------                 ------------        -------
048     *   G        å¹´å·                    (ãƒ?‚­ã‚¹ãƒ?          AD
049     *   y        年                      (数値)              1996
050     *   M        æœ?                     (ãƒ?‚­ã‚¹ãƒ?& 数値)   July & 07
051     *   d        日                      (数値)              10
052     *   h        åˆå‰/åˆå¾Œã?æ™?(1~12)    (数値)              12
053     *   H        ä¸?—¥ã«ãŠã‘る時 (0~23)   (数値)              0
054     *   m        �                     (数値)              30
055     *   s        �                     (数値)              55
056     *   S        ミリ�                 (数値)              978
057     *   E        曜日                    (ãƒ?‚­ã‚¹ãƒ?          ç«æ›œæ—¥
058     *   D        å¹´ã«ãŠã‘ã‚‹æ—¥            (数値)              189
059     *   F        月ã«ãŠã‘る曜日          (数値)              2 (7月ã?第2水曜日)
060     *   w        å¹´ã«ãŠã‘ã‚‹é?            (数値)              27
061     *   W        月ã«ãŠã‘ã‚‹é?            (数値)              2
062     *   a        åˆå‰/åˆå¾?              (ãƒ?‚­ã‚¹ãƒ?          PM
063     *   k        ä¸?—¥ã«ãŠã‘る時 (1~24)   (数値)              24
064     *   K        åˆå‰/åˆå¾Œã?æ™?(0~11)    (数値)              0
065     *   z        時間帯                  (ãƒ?‚­ã‚¹ãƒ?          PDT
066     *   '        ãƒ?‚­ã‚¹ãƒˆç”¨ã‚¨ã‚¹ã‚±ãƒ¼ãƒ?
067     *   ''       å˜ä¸?¼•用符                                  '
068     *
069     *  パターンæ–?­—ã?カウントã«ã‚ˆã£ã¦ã€ãã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæ±ºã¾ã‚Šã¾ã™ã?
070     *  (ãƒ?‚­ã‚¹ãƒ?: 4以ä¸? フル形å¼ã‚’使用ã—ã¾ã™ã?< 4: 短ã?¾ãŸã?çœåŠ›ã•れãŸå½¢å¼ãŒã‚れã°ã€ãれを使用ã—ã¾ã™ã?
071     *
072     *  (数値): æœ?°æ¡æ•°ã€‚ã“れより短ã?•°å€¤ã¯ã€ã“ã®æ¡æ•°ã¾ã§ã‚¼ãƒ­ãŒè¿½åŠ?•れã¾ã™ã?å¹´ã«ã¯ç‰¹åˆ¥ãªå‡¦ç?Œã‚りã¾ã™ã?
073     *  ã¤ã¾ã‚Šã?'y'ã®ã‚«ã‚¦ãƒ³ãƒˆãŒ2ãªã‚‰ã?å¹´ã¯2æ¡ã«çŸ­ç¸®ã•れã¾ã™ã?
074     *
075     *  (ãƒ?‚­ã‚¹ãƒ?& 数値): 3以上ãªã‚‰ãƒ†ã‚­ã‚¹ãƒˆã‚’ã€ãれ以外ãªã‚‰æ•°å€¤ã‚’使用ã—ã¾ã™ã?
076     *
077     *  ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–?­—ãŒ['a'..'z']ã¨['A'..'Z']ã®ç¯?›²ã«ãªã‘れã°ã€ãã®æ–?­—ã?引用ãƒ?‚­ã‚¹ãƒˆã¨ã—ã¦æ‰±ã‚れã¾ã™ã?
078     *  ãŸã¨ãˆã?ã€?:'ã€?.'ã€? 'ã€?#'ã€?@'ãªã©ã®æ–?­—ã?ã€å˜ä¸?¼•用符ã«å›²ã¾ã‚Œã¦ã?ªãã¦ã‚‚ã?
079     *  çµæžœã®æ™‚刻ãƒ?‚­ã‚¹ãƒˆã«ä½¿ç”¨ã•れã¾ã™ã?
080     *
081     *  無効ãªãƒ‘ターンæ–?­—ãŒãƒ‘ターンã«å…¥ã£ã¦ã?‚‹ã¨ã€ãƒ•ォーマットや解æžã§ä¾‹å¤–ãŒã‚¹ãƒ­ãƒ¼ã•れã¾ã™ã?
082     *
083     *  USロケールを使ã£ãŸä¾?
084     *
085     *   フォーマットパターン                   çµæžœ
086     *   --------------------                   ----
087     *   "yyyy.MM.dd G 'at' hh:mm:ss z"    ->>  1996.07.10 AD at 15:08:56 PDT
088     *   "EEE, MMM d, ''yy"                ->>  Wed, July 10, '96
089     *   "h:mm a"                          ->>  12:08 PM
090     *   "hh 'o''''clock' a, zzzz"         ->>  12 o'clock PM, Pacific Daylight Time
091     *   "K:mm a, z"                       ->>  0:00 PM, PST
092     *   "yyyyy.MMMMM.dd GGG hh:mm aaa"    ->>  1996.July.10 AD 12:08 PM
093     *
094     * @version  0.9.0  1999/03/09
095     * @author   Kazuhiko Hasegawa
096     * @since    JDK1.1,
097     */
098    public class DateSet {
099            private String[] keys = null;
100            private String[] vals = null;
101    
102            /**
103             * ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆè§£æžæ™‚ã«ç½®ãæ›ãˆã‚‹ キーã¨å€¤ã®é…å?を設定ã—ã¾ã™ã?
104             *
105             * $(KEY1) æ–?­—å?ã‚?VAL1 æ–?­—å?ã¨ç½®ãæ›ãˆã‚‹å‡¦ç?‚’行ã„ã¾ã™ã?ã“れã«ã‚ˆã‚Šæ—¥ä»˜ä»¥å¤–ã?
106             * æ–?­—å?ã‚’ç½®ãæ›ãˆã‚‹å‡¦ç?‚’実行ã§ãã¾ã™ã?
107             *
108             * @param       inkeys  ç½®ãæ›ãˆå?キーé…å?
109             * @param       invals  ç½®ãæ›ãˆå?値é…å?
110             */
111            public void setKeysVals( final String[] inkeys, final String[] invals ) {
112                    if( inkeys != null && invals != null && inkeys.length == invals.length ) {
113                            int size = inkeys.length ;
114                            keys = new String[size];
115                            vals = new String[size];
116                            System.arraycopy( inkeys,0,keys,0,size );
117                            System.arraycopy( invals,0,vals,0,size );
118                    }
119            }
120    
121            /**
122             * ç¾åœ¨æ—¥ä»˜ã?時刻をフォーマット指定å?æ‰?«åŸ‹ã‚è¾¼ã¿ã¾ã™ã?
123             * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã?
124             *
125             * @param       inByte  変æ›å…?ƒã‚¤ãƒˆé?åˆ?
126             *
127             * @return      変æ›å¾Œã?ãƒã‚¤ãƒˆé?åˆ?
128             */
129            public byte[] change( final byte[] inByte ) {
130                    byte[] outByte = new byte[ inByte.length+100 ];
131                    int add = 0;
132                    for( int i=0; i<inByte.length; i++) {
133                            if( inByte[i] == '$' && i<inByte.length-1 && inByte[i+1] == '(' ) {
134                                    int j = 0;
135                                    while( inByte[i+j+2] != ')') { j++; }
136    //                              String str = changeForm( new String( inByte,i+2,j ) );
137    //                              byte[] byteDate = str.getBytes() ;
138                                    String str = changeForm( new String( inByte,i+2,j,StringUtil.DEFAULT_CHARSET ) );       // 5.5.2.6 (2012/05/25) findbugs対�
139                                    byte[] byteDate = str.getBytes( StringUtil.DEFAULT_CHARSET ) ;                                          // 5.5.2.6 (2012/05/25) findbugs対�
140                                    for( int k = 0; k<byteDate.length; k++) {
141                                            outByte[add] = byteDate[k];
142                                            add++;
143                                    }
144                                    i += j+2;
145                            }
146                            else {
147                                    outByte[add] = inByte[i];
148                                    add++;
149                            }
150                    }
151                    byte[] rtnByte = new byte[ add ];
152                    System.arraycopy( outByte,0,rtnByte,0,add );
153                    return rtnByte;
154            }
155    
156            /**
157             * keys,vals ã®å¤‰æ›ã€ãŠã‚ˆã?ã€ç¾åœ¨æ—¥ä»˜ã?時刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã?
158             *
159             * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚?
160             * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã?
161             * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã?
162             *
163             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ­£ã—ã¾ã™ã?
164             *
165             * @param       form フォーãƒ?–‡å­—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" )
166             *
167             * @return      フォーマット変æ›çµæžœ
168             */
169            public String changeForm( final String form ) {
170                    if( keys != null ) {
171                            for( int i=0; i<keys.length; i++ ) {
172                                    if( form.equals( keys[i] ) ) {
173                                            return vals[i];
174                                    }
175                            }
176                    }
177    
178    //              DateFormat formatter = new SimpleDateFormat( form, Locale.JAPAN );
179    //              return formatter.format(new Date());
180    
181                    return HybsDateUtil.getDate( form );
182            }
183    
184            /**
185             * keys,vals ã®å¤‰æ›ã€ãŠã‚ˆã?ã€ç¾åœ¨æ—¥ä»˜ã?時刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã?
186             *
187             * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚?
188             * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã?
189             * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã?
190             *
191             * @param       form フォーãƒ?–‡å­—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" )
192             *
193             * @return      フォーマット変æ›çµæžœ
194             */
195            public String changeString( final String form ) {
196                    StringBuilder buf = new StringBuilder( 200 );
197                    int bkst = 0;
198                    int st = form.indexOf( "$(" );
199                    while( st >= 0 ) {
200                            buf.append( form.substring( bkst,st ) );
201                            int ed = form.indexOf( ")",st+2 );
202                            buf.append( changeForm( form.substring( st+2,ed ) ) );
203                            bkst = ed + 1;
204                            st = form.indexOf( "$(",bkst );
205                    }
206                    buf.append( form.substring( bkst ) );
207    
208                    return buf.toString();
209            }
210    
211            /**
212             * ç¾åœ¨æ—¥ä»˜ã?時刻をフォーマットをæŒ?®šã—ã¦ã€æ‰€å¾—ã—ã¾ã™ã?
213             * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã?
214             *
215             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ãŸã‚ã€å‰Šé™¤ã€?
216             *
217             * @param       form フォーãƒ?–‡å­—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" )
218             *
219             * @return      ç¾åœ¨æ—¥ä»˜ã?時刻
220             */
221    //      public static String getDate( final String form ) {
222    //              DateFormat formatter = new SimpleDateFormat( form, Locale.JAPAN );
223    //              return formatter.format(new Date());
224    //      }
225    
226            /**
227             * å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æ™‚刻フォーマットを変æ›ã—ã¦å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¿ã¾ã™ã?
228             *
229             * 引数㫠<key1> <val1> ã®ãƒšã‚¢æƒ??を渡ã™ã“ã¨ãŒå¯èƒ½ã§ã™ã?
230             * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚?
231             * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã?
232             * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã?
233             * フォーãƒ?–‡å­—å?ä¾?(  "yyyy/MM/dd HH:mm:ss" )
234             *
235             * @param       args 引数é…å?( 入力ファイル 出力ファイル キー??値???¥?¥?¥
236             */
237            public static void main( final String[] args ) throws Throwable {
238                    if( args.length > 2 && ( args.length % 2 != 0 ) ) {
239    //                      LogWriter.log("Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" );
240                            System.err.println( "Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" );
241                            return ;
242                    }
243    
244                    String[] keys = new String[ (args.length-2)/2 ];
245                    String[] vals = new String[ (args.length-2)/2 ];
246                    for( int i=1; i<=keys.length; i++ ) {
247                            keys[i-1] = args[i*2];
248                            vals[i-1] = args[i*2+1];
249                    }
250    
251                    FileInputStream filein = new FileInputStream( args[0] );
252                    byte[] byteIn = new byte[ filein.available() ];
253                    int len = filein.read( byteIn );
254                    if( len != byteIn.length ) {
255                            String errMsg = "読ã¿å–りファイルã®ãƒ??ã‚¿ãŒå?りæ¨ã¦ã‚‰ã‚Œã¾ã—ãŸã€? +
256                                                            "File=" + args[0] + " Length=" + len  + " Input=" + byteIn.length ;
257    //                      LogWriter.log( errMsg );
258                            System.err.println( errMsg );
259                    }
260                    filein.close();
261    
262                    DateSet dateSet = new DateSet();
263                    dateSet.setKeysVals( keys,vals );
264                    byte[] byteout = dateSet.change( byteIn );
265    
266                    FileOutputStream fileout = new FileOutputStream( args[1] );
267                    fileout.write( byteout );
268                    fileout.close();
269            }
270    }