1 /* 2 * Copyright (c) 2002-2014, Mairie de 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 * 45 * LuteceConnectionProxy : proxy implementation of {@link LuteceConnection} 46 * This class should be removed when java5 support is dropped. 47 * 48 */ 49 public class LuteceConnectionProxy implements InvocationHandler 50 { 51 /** 52 * Close method name 53 */ 54 private static final String METHOD_CLOSE = "close"; 55 56 /** 57 * Close connection method name (from {@link LuteceConnection} 58 */ 59 private static final String METHOD_CLOSE_CONNECTION = "closeConnection"; 60 private ConnectionPool _pool; 61 private Connection _connection; 62 63 /** 64 * Private constructor 65 * @param pool the pool to use 66 * @param connection the actual connection 67 */ 68 LuteceConnectionProxy( ConnectionPool pool, Connection connection ) 69 { 70 _pool = pool; 71 _connection = connection; 72 } 73 74 /** 75 * Catches close() and closeConnection() method. 76 * close() calls _pool.freeConnection, and closeConnection() calls _connection.close(). 77 * 78 * @param proxy the proxy 79 * @param method the method 80 * @param args the args 81 * @return the object 82 * @throws Throwable the throwable 83 */ 84 @Override 85 public Object invoke( Object proxy, Method method, Object[] args ) 86 throws Throwable 87 { 88 Object oReturn; 89 90 if ( METHOD_CLOSE.equals( method.getName( ) ) ) 91 { 92 _pool.freeConnection( (Connection) proxy ); 93 oReturn = null; 94 } 95 else if ( METHOD_CLOSE_CONNECTION.equals( method.getName( ) ) ) 96 { 97 _connection.close( ); 98 oReturn = null; 99 } 100 else 101 { 102 try { 103 oReturn = method.invoke( _connection, args ); 104 } catch (InvocationTargetException e) { 105 throw e.getCause(); 106 } 107 } 108 109 return oReturn; 110 } 111 }