MultiPluginTransaction.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.sql;

  35. import fr.paris.lutece.portal.service.plugin.Plugin;

  36. import org.apache.commons.lang3.NotImplementedException;

  37. import java.sql.Connection;
  38. import java.sql.PreparedStatement;
  39. import java.sql.SQLException;

  40. /**
  41.  * Class to represents transactions that are shared between plugins. Such transactions will be shared by each plugin using the same pool than the one that
  42.  * created the transaction.
  43.  */
  44. public class MultiPluginTransaction extends Transaction
  45. {
  46.     private int _nNbTransactionsOpened;

  47.     /**
  48.      * Constructor
  49.      */
  50.     public MultiPluginTransaction( )
  51.     {
  52.         super( );
  53.         _nNbTransactionsOpened = 1;
  54.     }

  55.     /**
  56.      * Constructor
  57.      *
  58.      * @param plugin
  59.      *            The plugin owner of the transaction
  60.      */
  61.     public MultiPluginTransaction( Plugin plugin )
  62.     {
  63.         super( plugin );
  64.         _nNbTransactionsOpened = 1;
  65.     }

  66.     /**
  67.      * Get the number of transactions that plugins tried to open simultaneously on the same pool. If the number if 1, then the transaction can be safely
  68.      * committed. If it is more than 1, then this number should be decremented and the transaction should not be committed.
  69.      *
  70.      * @return The number of transactions that was required
  71.      */
  72.     public int getNbTransactionsOpened( )
  73.     {
  74.         return _nNbTransactionsOpened;
  75.     }

  76.     /**
  77.      * Increment the number of transactions by one. See {@link #getNbTransactionsOpened()} for more details.
  78.      */
  79.     public void incrementNbTransactionsOpened( )
  80.     {
  81.         _nNbTransactionsOpened++;
  82.     }

  83.     /**
  84.      * Decrement the number of transactions by one. See {@link #getNbTransactionsOpened()} for more details.
  85.      */
  86.     public void decrementNbTransactionsOpened( )
  87.     {
  88.         _nNbTransactionsOpened--;
  89.     }

  90.     /**
  91.      * {@inheritDoc}
  92.      */
  93.     @Override
  94.     public PreparedStatement prepareStatement( String strSQL, boolean bLogQueries ) throws SQLException
  95.     {
  96.         return prepareStatement( strSQL, null, bLogQueries );
  97.     }

  98.     /**
  99.      * {@inheritDoc}
  100.      */
  101.     @Override
  102.     public PreparedStatement prepareStatement( String strSQL ) throws SQLException
  103.     {
  104.         return prepareStatement( strSQL, null, true );
  105.     }

  106.     /**
  107.      * {@inheritDoc}
  108.      */
  109.     @Override
  110.     public PreparedStatement prepareStatement( String strSQL, Integer autoGeneratedKeys ) throws SQLException
  111.     {
  112.         return prepareStatement( strSQL, autoGeneratedKeys, true );
  113.     }

  114.     /**
  115.      * {@inheritDoc}
  116.      */
  117.     @Override
  118.     public PreparedStatement prepareStatement( String strSQL, Integer autoGeneratedKeys, boolean bLogQueries ) throws SQLException
  119.     {
  120.         // Get a new statement
  121.         if ( getConnection( ) == null )
  122.         {
  123.             throw new SQLException( "MultiPluginTransaction - Connection has been closed. The new prepared statement can not be created : "
  124.                     + ( bLogQueries ? strSQL : "(query log disabled)" ) );
  125.         }

  126.         Connection connection = getConnection( );
  127.         if ( autoGeneratedKeys != null )
  128.         {
  129.             return connection.prepareStatement( strSQL, autoGeneratedKeys );
  130.         }
  131.         else
  132.         {
  133.             return connection.prepareStatement( strSQL );
  134.         }
  135.     }

  136.     /**
  137.      * {@inheritDoc}
  138.      */
  139.     @Override
  140.     public void executeStatement( ) throws SQLException
  141.     {
  142.         throw new NotImplementedException(
  143.                 "The method executeStatement( ) of class MultiPluginTransaction must not be called. Use manually PreparedStatement.executeQuery() instead." );
  144.     }

  145.     /**
  146.      * {@inheritDoc}
  147.      */
  148.     @Override
  149.     public void commit( )
  150.     {
  151.         _nNbTransactionsOpened = 0;
  152.         super.commit( );
  153.     }

  154.     /**
  155.      * {@inheritDoc}
  156.      */
  157.     @Override
  158.     public void rollback( Exception e )
  159.     {
  160.         _nNbTransactionsOpened = 0;
  161.         super.rollback( e );
  162.     }
  163. }