    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 */
    016package org.opengion.fukurou.util;
    017
    018import java.io.IOException;
    019import java.io.Closeable;
    020import java.sql.Connection;
    021import java.sql.ResultSet;
    022import java.sql.Statement;
    023import java.sql.SQLException;
    024import 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 */
    045public final class Closer {
    046
    047        /** システム依存の改行記号をセットします。 */
    048        private static final String CR = System.getProperty("line.separator");
    049
    050        /**
    051         * すべてが staticメソッドなので、コンストラクタを呼び出さなくしておきます。
    052         *
    053         */
    054        private Closer() {}
    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}