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    }