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.UnsupportedEncodingException;
020    import java.io.IOException;
021    import java.util.StringTokenizer;
022    
023    /**
024     * FileString は、ファイルを読み取って、そのまま String æ–?­—å?として返すクラスですã?
025     * SQLを記述したファイルã‚??コマンドを記述したファイルを読み取って、コマンドラインからの
026     * 入力として利用できますã?
027     *
028     * ファイルは、ä¸?—¦すべて読み取ってメモリ上でåŠ?·¥されますã?
029     * パラメータ等ã?設定ファイルをイメージしてã�?‚‹為、巨大なファイルの読み込みは出来ませんã€?
030     *
031     * @version  4.0
032     * @author   Kazuhiko Hasegawa
033     * @since    JDK5.0,
034     */
035    public class FileString  {
036            private String  filename        = null ;
037            private String  encode          = null ;
038            private String  value           = null ;
039    
040            /**
041             * ファイル名を設定しますã?
042             * æŒ?®šã?ファイルを読み取って、å?部æ–?­—å?に格納しますã?
043             * なおã?格納するタイミングはã€?getValue() を最初に行ったときですã?
044             * ファイル名を再設定すると、å?部のvalue は、クリアされますã?
045             *
046             * @param  filename ファイルå�?
047             */
048            public void setFilename( final String filename ) {
049                    if( filename == null ) {
050                            String errMsg = "ファイル名がæŒ?®šされてã�?�¾せんã€? ;
051                            throw new RuntimeException( errMsg );
052                    }
053    
054                    this.filename = filename;
055                    value             = null;               // 初期åŒ?
056            }
057    
058            /**
059             * ファイル名を取得しますã?
060             *
061             * @og.rev 5.2.3.0 (2010/12/01) 新規追åŠ?
062             *
063             * @return      ファイルå�?
064             */
065            public String getFilename() {
066                    return filename;
067            }
068    
069            /**
070             * ファイルのエンコードを設定しますã?
071             * æŒ?®šã?ファイルを読み取る場合ã?エンコードをæŒ?®šしますã?
072             * 正確には、バイナリãƒ??タを読み取って、文字å?に変換する場合にã€?
073             * String( byte[],String ) コンストラクタの引数に使用しますã?
074             * æŒ?®šされてã�?�ªã�??合ã?、String( byte[] ) コンストラクタで変換しますã?
075             * エンコードを再設定すると、å?部のvalue は、クリアされますã?
076             *
077             * @param  encode エンコード名
078             */
079            public void setEncode( final String encode ) {
080                    this.encode     = encode;
081                    value           = null;         // 初期åŒ?
082            }
083    
084            /**
085             * ファイルのエンコードを取得しますã?
086             * 正確には、å?部æ–?­—å?に変換したときã?エンコードですã?
087             * null の場合ã?、無æŒ?®?つまりデフォルトエンコーãƒ?と
088             * なりますã?
089             *
090             * @og.rev 5.2.3.0 (2010/12/01) 新規追åŠ?
091             *
092             * @return      ファイルのエンコーãƒ?
093             */
094            public String getEncode() {
095                    return encode;
096            }
097    
098            /**
099             * ファイルを読み取って、文字å?を作æ?しますã?
100             *
101             * ãƒ??タの読取が完å?に出来なかったときにはã€??中までのãƒ??タを返しますã?
102             * æŒ?®šã?エンコードが存在しなã�??合や、ファイルが存在しなã�??合ã?ã€?
103             * RuntimeException ã‚?throw しますã?
104             *
105             * @return  ファイルを読み取った文字å?
106             * @throws RuntimeException æŒ?®šã?エンコードが存在しなかったときã?
107             */
108            public String getValue() {
109                    if( value != null ) { return value; }
110    
111                    FileInputStream file = null;
112                    try {
113                            file = new FileInputStream( filename );
114                            byte[] buf = new byte[file.available()];
115                            int len = file.read(buf);
116                            if( len != buf.length ) {
117                                    String errMsg = "読み取りファイルのãƒ??タがå?り捨てられましたã€? +
118                                                                    "File=" + filename + " Length=" + len ;
119                                    LogWriter.log( errMsg );
120                            }
121                            if( encode != null ) {
122                                    value = new String( buf,encode );
123                            }
124                            else {
125    //                              value = new String( buf );
126                                    value = new String( buf,StringUtil.DEFAULT_CHARSET );   // 5.5.2.6 (2012/05/25) findbugs対å¿?
127                            }
128                    }
129                    catch( UnsupportedEncodingException ex ) {
130                            String errMsg = "æŒ?®šされたエンコーãƒ?‚£ングがサポã?トされてã�?�¾せんã€?" + encode + "]" ;
131                            throw new RuntimeException( errMsg,ex );
132                    }
133                    catch( IOException ex ) {
134                            String errMsg = "ファイル名がオープン出来ませんでしたã€?" + filename + "]" ;
135                            throw new RuntimeException( errMsg,ex );
136                    }
137                    finally {
138                            Closer.ioClose( file );
139                    }
140    
141                    return value ;
142            }
143    
144            /**
145             * æŒ?®šã?区åˆ?‚Šæ–?­—でåˆ?‰²された文字å?配å?を取得しますã?
146             * 区åˆ?‚Šæ–?­—が連続してã�?‚‹場合ã?、ä¸?�¤の区åˆ?‚Šæ–?­—と認識しますã?
147             * 処ç�??、java.util.StringTokenizer で、å?ç�?�™る方法と同ä¸?�§すã?
148             * 例えばã€?;" を指定すれã?、SQL をè¤?•°記述しておくことが可能になりますã?
149             *
150             * @param       delim   ファイルをå?割する区åˆ?‚Šæ–?­?
151             *
152             * @return  ファイルを読み取った文字å?
153             */
154            public String[] getValue( final String delim ) {
155    
156                    StringTokenizer token = new StringTokenizer( getValue(),delim );
157    
158                    String[] rtn = new String[token.countTokens()];
159    
160                    for( int i=0; token.hasMoreTokens(); i++ ) {
161                            rtn[i] = token.nextToken();
162                    }
163    
164                    return rtn ;
165            }
166    }