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    }