    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         * すべてが 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         * @og.rev 5.9.4.0 (201601//08) commit前にvalidのチェックを行う(10秒でタイムアウト)
    172         *
    173         * @param conn コネクションオブジェクト
    174         *
    175         * @return 正常:true/異常:false
    176         */
    177        public static boolean connClose( final Connection conn ) {
    178                boolean isOK = true;
    179
    180                try {
    181                        if( conn != null && ! conn.isClosed() ) {
    182                                if( conn.isValid(10) ){ // 5.9.4.0 (2016/01/08)
    183                                        conn.commit(); // 5.5.5.0 (2012/07/28)
    184                                }
    185                                conn.close();
    186                        }
    187                }
    188                catch( SQLException ex ) {
    189                        String errMsg = "Connection を rollback することが出来ません。" + CR
    190                                                        + ex.getMessage() + ":" + ex.getSQLState() + CR;
    191                        LogWriter.log( errMsg );
    192                        LogWriter.log( ex );
    193                }
    194                catch( RuntimeException ex ) {
    195                        isOK = false;
    196                        String errMsg = "予期せぬエラーが発生しました。" + CR
    197                                                        + ex.getMessage() + CR;
    198                        LogWriter.log( errMsg );
    199                        LogWriter.log( ex );
    200                }
    201
    202                return isOK;
    203        }
    204
    205        /**
    206         * Statement オブジェクトをクローズします。
    207         * ここでは、処理中のエラーは、標準出力に出力するだけで無視します。
    208         *
    209         * @og.rev 4.0.0.0 (2007/02/08) 新規追加
    210         *
    211         * @param stmt Statementオブジェクト
    212         *
    213         * @return 正常:true/異常:false
    214         */
    215        public static boolean stmtClose( final Statement stmt ) {
    216                boolean isOK = true;
    217
    218                try {
    219                        if( stmt != null ) { stmt.close(); }
    220                }
    221                catch( SQLException ex ) {
    222                        String errMsg = "Statement を close することが出来ません。"
    223                                                + ex.getMessage() + ":" + ex.getSQLState() + CR;
    224                        LogWriter.log( errMsg );
    225                        LogWriter.log( ex );
    226                }
    227                catch( RuntimeException ex ) {
    228                        isOK = false;
    229                        String errMsg = "予期せぬエラーが発生しました。" + CR
    230                                                        + ex.getMessage() + CR;
    231                        LogWriter.log( errMsg );
    232                        LogWriter.log( ex );
    233                }
    234
    235                return isOK;
    236        }
    237
    238        /**
    239         * ResultSet オブジェクトをクローズします。
    240         * ここでは、処理中のエラーは、標準出力に出力するだけで無視します。
    241         *
    242         * @og.rev 4.0.0.0 (2007/02/08) 新規追加
    243         *
    244         * @param result ResultSetオブジェクト
    245         *
    246         * @return 正常:true/異常:false
    247         */
    248        public static boolean resultClose( final ResultSet result ) {
    249                boolean isOK = true;
    250
    251                try {
    252                        if( result != null ) { result.close(); }
    253                }
    254                catch( SQLException ex ) {
    255                        String errMsg = "ResultSet を close することが出来ません。"
    256                                                + ex.getMessage() + ":" + ex.getSQLState() + CR;
    257                        LogWriter.log( errMsg );
    258                        LogWriter.log( ex );
    259                }
    260                catch( RuntimeException ex ) {
    261                        isOK = false;
    262                        String errMsg = "予期せぬエラーが発生しました。" + CR
    263                                                        + ex.getMessage() + CR;
    264                        LogWriter.log( errMsg );
    265                        LogWriter.log( ex );
    266                }
    267
    268                return isOK;
    269        }
    270
    271        /**
    272         * ZipFile オブジェクトをクローズします。
    273         * Jar ファイルも、このメソッドでクローズします。
    274         * ここでは、処理中のエラーは、標準出力に出力するだけで無視します。
    275         *
    276         * @og.rev 5.5.2.6 (2012/05/25) findbugs対応に伴い、新規追加
    277         *
    278         * @param zipFile ZipFileオブジェクト
    279         *
    280         * @return 正常:true/異常:false
    281         */
    282        public static boolean zipClose( final ZipFile zipFile ) {
    283                boolean isOK = true;
    284
    285                try {
    286                        if( zipFile != null ) { zipFile.close(); }
    287                }
    288                catch( IOException ex ) {
    289                        String errMsg = "ZipFile/JarFile を close することが出来ません。"
    290                                                + ex.getMessage() + ":" + zipFile.getName() + CR;
    291                        LogWriter.log( errMsg );
    292                        LogWriter.log( ex );
    293                }
    294                catch( RuntimeException ex ) {
    295                        isOK = false;
    296                        String errMsg = "予期せぬエラーが発生しました。" + CR
    297                                                        + ex.getMessage() + CR;
    298                        LogWriter.log( errMsg );
    299                        LogWriter.log( ex );
    300                }
    301
    302                return isOK;
    303        }
    304}