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.IOException;
019    import java.io.Closeable;
020    import java.sql.Connection;
021    import java.sql.ResultSet;
022    import java.sql.Statement;
023    import java.sql.SQLException;
024    import java.util.zip.ZipFile;           // 5.5.2.6 (2012/05/25)
025    
026    /**
027     * Closer.java は、å?通的に使用されã‚?close処ç�?‚’é›?´?�—たã?クラスですã?
028     *
029     * å�?¨® close() 処ç�?�§は、Exception が発生してもã?どã�?�™ることもå?来なã�?
030     * ケースが多ã?ありますã?またã?close() 処ç�?¸­の Exception の為ã�?�‘にã€?
031     * try ??catch ç¯?‚’用意しなければならず、finally ç¯??からの さらなã‚?
032     * throw など、コーãƒ?‚£ング上ã?本流以外ã?ç®?‰€で、色ã€?�¨問題が発生しますã?
033     * ここでは、とりあえず、LogWriter.log するã�?�‘にしてã�?�¾すがã€?
034     * å°?�¥çš?�«は、エラーを別ファイルにセーブしたり、データベã?スに書き込んだã‚?
035     * 出来ると思いますã?
036     *
037     * またã?close 処ç�?�¨は異なりますが、commit ã‚??rollback など、finally ç¯?�«
038     * 書き込んで、å¿?�š処ç�?�—たいがã?Exception 発生時に、どã�?�—ようもなã�??ç�?‚‚ã€?
039     * ここにé›?´?�—てã�?��ますã?
040     *
041     * @version  4.0
042     * @author       Kazuhiko Hasegawa
043     * @since    JDK5.0,
044     */
045    public final class Closer {
046    
047            /**
048             * すべてã�?staticメソãƒ?ƒ‰なので、コンストラクタを呼び出さなくしておきますã?
049             *
050             */
051            private Closer() {}
052    
053            /** シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã?     */
054            private static final String CR = System.getProperty("line.separator");
055    
056            /**
057             * io関連の close 処ç�?™‚の IOException を無視して、close 処ç�?‚’行いますã?
058             * ここでは、å?ç�?¸­のエラーは、System.err に出力するだけで無視しますã?
059             *
060             * これにより、try ??catch ??finally 処ç�?�§、close ã‚?finally 処ç�?�‹ã‚?
061             * 例外を送å?させなくてすã?ようになりますã?
062             * 引数がã?null の場合ã?、何も処ç�?�—ませんã€?正常:trueを返しますã?)
063             *
064             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
065             *
066             * @param obj Closeableインターフェースを実è£?�—たIO関連オブジェクãƒ?
067             *
068             * @return 正常:true/異常:false
069             */
070            public static boolean ioClose( final Closeable obj ) {
071                    boolean isOK = true;
072    
073                    try {
074                            if( obj != null ) { obj.close(); }
075                    }
076                    catch( IOException ex ) {
077                            isOK = false;
078                            String errMsg = "ストリーãƒ?close 処ç�?�§エラーが発生しましたã€? + CR
079                                                            + ex.getMessage() + CR
080                                                            + obj.toString() ;
081                            LogWriter.log( errMsg );
082                            LogWriter.log( ex );
083                    }
084                    catch( RuntimeException ex ) {
085                            isOK = false;
086                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
087                                                            + ex.getMessage() + CR
088                                                            + obj.toString() ;
089                            LogWriter.log( errMsg );
090                            LogWriter.log( ex );
091                    }
092    
093                    return isOK;
094            }
095    
096            /**
097             * Connection オブジェクトを commit しますã?
098             * ここでは、å?ç�?¸­のエラーは、System.err に出力するだけで無視しますã?
099             *
100             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
101             *
102             * @param conn コネクションオブジェクãƒ?
103             *
104             * @return 正常:true/異常:false
105             */
106            public static boolean commit( final Connection conn ) {
107                    boolean isOK = true;
108    
109                    try {
110                            if( conn != null ) { conn.commit(); }
111                    }
112                    catch( SQLException ex ) {
113                            String errMsg = "Connection ã‚?commit することがå?来ませんã€? + CR
114                                                            + ex.getMessage() + ":" + ex.getSQLState() + CR ;
115                            LogWriter.log( errMsg );
116                            LogWriter.log( ex );
117                    }
118                    catch( RuntimeException ex ) {
119                            isOK = false;
120                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
121                                                            + ex.getMessage() + CR ;
122                            LogWriter.log( errMsg );
123                            LogWriter.log( ex );
124                    }
125    
126                    return isOK;
127            }
128    
129            /**
130             * Connection オブジェクトをrollbackしますã?
131             * ここでは、å?ç�?¸­のエラーは、標準å?力に出力するだけで無視しますã?
132             *
133             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
134             *
135             * @param conn コネクションオブジェクãƒ?
136             *
137             * @return 正常:true/異常:false
138             */
139            public static boolean rollback( final Connection conn ) {
140                    boolean isOK = true;
141    
142                    try {
143                            if( conn != null ) { conn.rollback(); }
144                    }
145                    catch( SQLException ex ) {
146                            String errMsg = "Connection ã‚?rollback することがå?来ませんã€? + CR
147                                                            + ex.getMessage() + ":" + ex.getSQLState() + CR;
148                            LogWriter.log( errMsg );
149                            LogWriter.log( ex );
150                    }
151                    catch( RuntimeException ex ) {
152                            isOK = false;
153                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
154                                                            + ex.getMessage() + CR;
155                            LogWriter.log( errMsg );
156                            LogWriter.log( ex );
157                    }
158    
159                    return isOK;
160            }
161    
162            /**
163             * Connection オブジェクトをcloseしますã?
164             * ここでは、å?ç�?¸­のエラーは、標準å?力に出力するだけで無視しますã?
165             *
166             * ここでは、現実ã? Connection の close() メソãƒ?ƒ‰を呼び出しますã?でã€?
167             * キャãƒ?‚·ュ等で使用してã�?‚‹コネクションには適用しなã�?�§くださいã€?
168             *
169             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
170             * @og.rev 5.5.5.0 (2012/07/28) commit追åŠ?
171             *
172             * @param conn コネクションオブジェクãƒ?
173             *
174             * @return 正常:true/異常:false
175             */
176            public static boolean connClose( final Connection conn ) {
177                    boolean isOK = true;
178    
179                    try {
180                            if( conn != null && ! conn.isClosed() ) { 
181                                    conn.commit(); // 5.5.5.0 (2012/07/28)
182                                    conn.close();
183                            }
184                    }
185                    catch( SQLException ex ) {
186                            String errMsg = "Connection ã‚?rollback することがå?来ませんã€? + CR
187                                                            + ex.getMessage() + ":" + ex.getSQLState() + CR;
188                            LogWriter.log( errMsg );
189                            LogWriter.log( ex );
190                    }
191                    catch( RuntimeException ex ) {
192                            isOK = false;
193                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
194                                                            + ex.getMessage() + CR;
195                            LogWriter.log( errMsg );
196                            LogWriter.log( ex );
197                    }
198    
199                    return isOK;
200            }
201    
202            /**
203             * Statement オブジェクトをクローズしますã?
204             * ここでは、å?ç�?¸­のエラーは、標準å?力に出力するだけで無視しますã?
205             *
206             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
207             *
208             * @param stmt Statementオブジェクãƒ?
209             *
210             * @return 正常:true/異常:false
211             */
212            public static boolean stmtClose( final Statement stmt ) {
213                    boolean isOK = true;
214    
215                    try {
216                            if( stmt != null ) { stmt.close(); }
217                    }
218                    catch( SQLException ex ) {
219                            String errMsg = "Statement ã‚?close することがå?来ませんã€?
220                                                    + ex.getMessage() + ":" + ex.getSQLState() + CR;
221                            LogWriter.log( errMsg );
222                            LogWriter.log( ex );
223                    }
224                    catch( RuntimeException ex ) {
225                            isOK = false;
226                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
227                                                            + ex.getMessage() + CR;
228                            LogWriter.log( errMsg );
229                            LogWriter.log( ex );
230                    }
231    
232                    return isOK;
233            }
234    
235            /**
236             * ResultSet オブジェクトをクローズしますã?
237             * ここでは、å?ç�?¸­のエラーは、標準å?力に出力するだけで無視しますã?
238             *
239             * @og.rev 4.0.0.0 (2007/02/08) 新規追åŠ?
240             *
241             * @param result ResultSetオブジェクãƒ?
242             *
243             * @return 正常:true/異常:false
244             */
245            public static boolean resultClose( final ResultSet result ) {
246                    boolean isOK = true;
247    
248                    try {
249                            if( result != null ) { result.close(); }
250                    }
251                    catch( SQLException ex ) {
252                            String errMsg = "ResultSet ã‚?close することがå?来ませんã€?
253                                                    + ex.getMessage() + ":" + ex.getSQLState() + CR;
254                            LogWriter.log( errMsg );
255                            LogWriter.log( ex );
256                    }
257                    catch( RuntimeException ex ) {
258                            isOK = false;
259                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
260                                                            + ex.getMessage() + CR;
261                            LogWriter.log( errMsg );
262                            LogWriter.log( ex );
263                    }
264    
265                    return isOK;
266            }
267    
268            /**
269             * ZipFile オブジェクトをクローズしますã?
270             * Jar ファイルもã?こã?メソãƒ?ƒ‰でクローズしますã?
271             * ここでは、å?ç�?¸­のエラーは、標準å?力に出力するだけで無視しますã?
272             *
273             * @og.rev 5.5.2.6 (2012/05/25) findbugs対応に伴ã�??新規追åŠ?
274             *
275             * @param zipFile ZipFileオブジェクãƒ?
276             *
277             * @return 正常:true/異常:false
278             */
279            public static boolean zipClose( final ZipFile zipFile ) {
280                    boolean isOK = true;
281    
282                    try {
283                            if( zipFile != null ) { zipFile.close(); }
284                    }
285                    catch( IOException ex ) {
286                            String errMsg = "ZipFile/JarFile ã‚?close することがå?来ませんã€?
287                                                    + ex.getMessage() + ":" + zipFile.getName() + CR;
288                            LogWriter.log( errMsg );
289                            LogWriter.log( ex );
290                    }
291                    catch( RuntimeException ex ) {
292                            isOK = false;
293                            String errMsg = "予期せぬエラーが発生しましたã€? + CR
294                                                            + ex.getMessage() + CR;
295                            LogWriter.log( errMsg );
296                            LogWriter.log( ex );
297                    }
298    
299                    return isOK;
300            }
301    }