1 /* 2 * Copyright (c) 2002-2022, City of Paris 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice 10 * and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice 13 * and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * License 1.0 33 */ 34 package fr.paris.lutece.util.pool.service; 35 36 import java.lang.reflect.InvocationHandler; 37 import java.lang.reflect.InvocationTargetException; 38 import java.lang.reflect.Method; 39 40 import java.sql.Connection; 41 42 /** 43 * 44 * LuteceConnectionProxy : proxy implementation of {@link LuteceConnection} This class should be removed when java5 support is dropped. 45 * 46 */ 47 public class LuteceConnectionProxy implements InvocationHandler 48 { 49 /** 50 * Close method name 51 */ 52 private static final String METHOD_CLOSE = "close"; 53 54 /** 55 * Close connection method name (from {@link LuteceConnection} 56 */ 57 private static final String METHOD_CLOSE_CONNECTION = "closeConnection"; 58 private ConnectionPool _pool; 59 private Connection _connection; 60 61 /** 62 * Private constructor 63 * 64 * @param pool 65 * the pool to use 66 * @param connection 67 * the actual connection 68 */ 69 LuteceConnectionProxy( ConnectionPool pool, Connection connection ) 70 { 71 _pool = pool; 72 _connection = connection; 73 } 74 75 /** 76 * Catches close() and closeConnection() method. close() calls _pool.freeConnection, and closeConnection() calls _connection.close(). 77 * 78 * @param proxy 79 * the proxy 80 * @param method 81 * the method 82 * @param args 83 * the args 84 * @return the object 85 * @throws Throwable 86 * the throwable 87 */ 88 @Override 89 public Object invoke( Object proxy, Method method, Object [ ] args ) throws Throwable 90 { 91 Object oReturn; 92 93 if ( METHOD_CLOSE.equals( method.getName( ) ) ) 94 { 95 _pool.freeConnection( (Connection) proxy ); 96 oReturn = null; 97 } 98 else 99 if ( METHOD_CLOSE_CONNECTION.equals( method.getName( ) ) ) 100 { 101 _connection.close( ); 102 oReturn = null; 103 } 104 else 105 { 106 try 107 { 108 oReturn = method.invoke( _connection, args ); 109 } 110 catch( InvocationTargetException e ) 111 { 112 throw e.getCause( ); 113 } 114 } 115 116 return oReturn; 117 } 118 }