LuteceConnectionProxy.java

  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. import java.lang.reflect.InvocationHandler;
  36. import java.lang.reflect.InvocationTargetException;
  37. import java.lang.reflect.Method;

  38. import java.sql.Connection;

  39. /**
  40.  *
  41.  * LuteceConnectionProxy : proxy implementation of {@link LuteceConnection} This class should be removed when java5 support is dropped.
  42.  *
  43.  */
  44. public class LuteceConnectionProxy implements InvocationHandler
  45. {
  46.     /**
  47.      * Close method name
  48.      */
  49.     private static final String METHOD_CLOSE = "close";

  50.     /**
  51.      * Close connection method name (from {@link LuteceConnection}
  52.      */
  53.     private static final String METHOD_CLOSE_CONNECTION = "closeConnection";
  54.     private ConnectionPool _pool;
  55.     private Connection _connection;

  56.     /**
  57.      * Private constructor
  58.      *
  59.      * @param pool
  60.      *            the pool to use
  61.      * @param connection
  62.      *            the actual connection
  63.      */
  64.     LuteceConnectionProxy( ConnectionPool pool, Connection connection )
  65.     {
  66.         _pool = pool;
  67.         _connection = connection;
  68.     }

  69.     /**
  70.      * Catches close() and closeConnection() method. close() calls _pool.freeConnection, and closeConnection() calls _connection.close().
  71.      *
  72.      * @param proxy
  73.      *            the proxy
  74.      * @param method
  75.      *            the method
  76.      * @param args
  77.      *            the args
  78.      * @return the object
  79.      * @throws Throwable
  80.      *             the throwable
  81.      */
  82.     @Override
  83.     public Object invoke( Object proxy, Method method, Object [ ] args ) throws Throwable
  84.     {
  85.         Object oReturn;

  86.         if ( METHOD_CLOSE.equals( method.getName( ) ) )
  87.         {
  88.             _pool.freeConnection( (Connection) proxy );
  89.             oReturn = null;
  90.         }
  91.         else
  92.             if ( METHOD_CLOSE_CONNECTION.equals( method.getName( ) ) )
  93.             {
  94.                 _connection.close( );
  95.                 oReturn = null;
  96.             }
  97.             else
  98.             {
  99.                 try
  100.                 {
  101.                     oReturn = method.invoke( _connection, args );
  102.                 }
  103.                 catch( InvocationTargetException e )
  104.                 {
  105.                     throw e.getCause( );
  106.                 }
  107.             }

  108.         return oReturn;
  109.     }
  110. }