AdminDashboardDAO.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.portal.business.dashboard;

  35. import fr.paris.lutece.portal.service.dashboard.IDashboardComponent;
  36. import fr.paris.lutece.portal.service.dashboard.admin.IAdminDashboardComponent;
  37. import fr.paris.lutece.portal.service.util.AppLogService;
  38. import fr.paris.lutece.util.sql.DAOUtil;

  39. import java.util.ArrayList;
  40. import java.util.List;

  41. /**
  42.  *
  43.  * AdminDashboardDAO
  44.  *
  45.  */
  46. public class AdminDashboardDAO implements IAdminDashboardDAO
  47. {
  48.     private static final String LOG_ERROR_NOT_FOUND = "Admindashboard named {} not found";
  49.     private static final String SQL_QUERY_MAX_ORDER = "SELECT max(dashboard_order) FROM core_admin_dashboard";
  50.     private static final String SQL_QUERY_MAX_ORDER_COLUMN = SQL_QUERY_MAX_ORDER + " WHERE dashboard_column = ? ";
  51.     private static final String SQL_QUERY_DELETE = "DELETE FROM core_admin_dashboard ";
  52.     private static final String SQL_QUERY_DELETE_BY_NAME = SQL_QUERY_DELETE + " WHERE dashboard_name = ? ";
  53.     private static final String SQL_QUERY_SELECT = "SELECT dashboard_name, dashboard_order, dashboard_column  FROM core_admin_dashboard ";
  54.     private static final String SQL_QUERY_ORDER_BY_COLUMN_AND_ORDER = " ORDER BY dashboard_column, dashboard_order";
  55.     private static final String SQL_QUERY_SELECT_ALL = SQL_QUERY_SELECT + " WHERE dashboard_column != - 1 " + SQL_QUERY_ORDER_BY_COLUMN_AND_ORDER;
  56.     private static final String SQL_QUERY_SELECT_COLUMNS = "SELECT dashboard_column FROM core_admin_dashboard GROUP BY dashboard_column";
  57.     private static final String SQL_QUERY_FILTER_COLUMN = " dashboard_column = ? ";
  58.     private static final String SQL_QUERY_FILTER_ORDER = " dashboard_order = ? ";
  59.     private static final String SQL_QUERY_FILTER_NAME = " dashboard_name = ? ";
  60.     private static final String SQL_QUERY_SELECT_BY_PRIMARY_KEY = SQL_QUERY_SELECT + " WHERE " + SQL_QUERY_FILTER_NAME;
  61.     private static final String SQL_QUERY_INSERT = "INSERT INTO core_admin_dashboard( dashboard_name, dashboard_order, dashboard_column ) " + " VALUES(?,?,?)";
  62.     private static final String SQL_QUERY_UPDATE = "UPDATE core_admin_dashboard " + " SET dashboard_order = ?, dashboard_column = ? WHERE dashboard_name = ?";
  63.     private static final String SQL_QUERY_KEYWORD_WHERE = "  WHERE ";
  64.     private static final String SQL_QUERY_KEYWORD_AND = " AND ";

  65.     /**
  66.      * {@inheritDoc}
  67.      */
  68.     @Override
  69.     public void delete( String strBeanName )
  70.     {
  71.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DELETE_BY_NAME ) )
  72.         {

  73.             daoUtil.setString( 1, strBeanName );

  74.             daoUtil.executeUpdate( );

  75.         }
  76.     }

  77.     /**
  78.      * {@inheritDoc}
  79.      */
  80.     @Override
  81.     public void deleteAll( )
  82.     {
  83.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DELETE ) )
  84.         {

  85.             daoUtil.executeUpdate( );

  86.         }
  87.     }

  88.     /**
  89.      * {@inheritDoc}
  90.      */
  91.     @Override
  92.     public void insert( IAdminDashboardComponent dashboardComponent )
  93.     {
  94.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_INSERT ) )
  95.         {

  96.             daoUtil.setString( 1, dashboardComponent.getName( ) );
  97.             setInsertOrUpdateValues( 2, dashboardComponent, daoUtil );

  98.             daoUtil.executeUpdate( );

  99.         }
  100.     }

  101.     /**
  102.      * Loads the dashboard from the factory
  103.      *
  104.      * @param strBeanName
  105.      *            the dashboard name
  106.      * @return the dashboard found
  107.      * @see AdminDashboardFactory#getDashboardComponent(String)
  108.      */
  109.     private IAdminDashboardComponent findDashboardFromFactory( String strBeanName )
  110.     {
  111.         return AdminDashboardFactory.getDashboardComponent( strBeanName );
  112.     }

  113.     /**
  114.      * {@inheritDoc}
  115.      */
  116.     @Override
  117.     public IAdminDashboardComponent load( String strClassName )
  118.     {
  119.         IAdminDashboardComponent dashboardComponent = null;

  120.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_BY_PRIMARY_KEY ) )
  121.         {

  122.             daoUtil.setString( 1, strClassName );

  123.             daoUtil.executeQuery( );

  124.             if ( daoUtil.next( ) )
  125.             {
  126.                 String strBeanName = daoUtil.getString( 1 );

  127.                 dashboardComponent = findDashboardFromFactory( strBeanName );

  128.                 if ( dashboardComponent != null )
  129.                 {
  130.                     load( dashboardComponent, daoUtil );
  131.                 }
  132.                 else
  133.                 {
  134.                     AppLogService.error( LOG_ERROR_NOT_FOUND, strBeanName );
  135.                 }
  136.             }

  137.         }

  138.         return dashboardComponent;
  139.     }

  140.     /**
  141.      * {@inheritDoc}
  142.      */
  143.     @Override
  144.     public List<IAdminDashboardComponent> selectAllDashboardComponents( )
  145.     {
  146.         List<IAdminDashboardComponent> listDashboards = new ArrayList<>( );

  147.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_ALL ) )
  148.         {

  149.             daoUtil.executeQuery( );
  150.             while ( daoUtil.next( ) )
  151.             {
  152.                 IAdminDashboardComponent dashboardComponent = null;

  153.                 String strBeanName = daoUtil.getString( 1 );

  154.                 dashboardComponent = findDashboardFromFactory( strBeanName );

  155.                 if ( dashboardComponent != null )
  156.                 {
  157.                     load( dashboardComponent, daoUtil );
  158.                     listDashboards.add( dashboardComponent );
  159.                 }
  160.                 else
  161.                 {
  162.                     AppLogService.error( LOG_ERROR_NOT_FOUND, strBeanName );
  163.                 }
  164.             }

  165.         }

  166.         return listDashboards;
  167.     }

  168.     /**
  169.      * {@inheritDoc}
  170.      */
  171.     @Override
  172.     public int selectMaxOrder( )
  173.     {
  174.         int nMaxOrder = 0;

  175.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_MAX_ORDER ) )
  176.         {
  177.             daoUtil.executeQuery( );

  178.             if ( daoUtil.next( ) )
  179.             {
  180.                 nMaxOrder = daoUtil.getInt( 1 );
  181.             }

  182.         }

  183.         return nMaxOrder;
  184.     }

  185.     /**
  186.      * {@inheritDoc}
  187.      */
  188.     @Override
  189.     public int selectMaxOrder( int nColumn )
  190.     {
  191.         int nMaxOrder = 0;
  192.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_MAX_ORDER_COLUMN ) )
  193.         {
  194.             daoUtil.setInt( 1, nColumn );

  195.             daoUtil.executeQuery( );

  196.             if ( daoUtil.next( ) )
  197.             {
  198.                 nMaxOrder = daoUtil.getInt( 1 );
  199.             }

  200.         }

  201.         return nMaxOrder;
  202.     }

  203.     /**
  204.      * {@inheritDoc}
  205.      */
  206.     @Override
  207.     public List<IAdminDashboardComponent> selectDashboardComponents( AdminDashboardFilter filter )
  208.     {
  209.         List<IAdminDashboardComponent> listDashboards = new ArrayList<>( );

  210.         StringBuilder sbSQL = new StringBuilder( SQL_QUERY_SELECT );
  211.         buildSQLFilter( sbSQL, filter );
  212.         sbSQL.append( SQL_QUERY_ORDER_BY_COLUMN_AND_ORDER );

  213.         try ( DAOUtil daoUtil = new DAOUtil( sbSQL.toString( ) ) )
  214.         {

  215.             applySQLFilter( daoUtil, 1, filter );

  216.             daoUtil.executeQuery( );

  217.             while ( daoUtil.next( ) )
  218.             {
  219.                 IAdminDashboardComponent dashboardComponent = null;

  220.                 String strBeanName = daoUtil.getString( 1 );

  221.                 dashboardComponent = findDashboardFromFactory( strBeanName );

  222.                 if ( dashboardComponent != null )
  223.                 {
  224.                     load( dashboardComponent, daoUtil );
  225.                     listDashboards.add( dashboardComponent );
  226.                 }
  227.                 else
  228.                 {
  229.                     AppLogService.error( LOG_ERROR_NOT_FOUND, strBeanName );
  230.                 }
  231.             }

  232.         }

  233.         return listDashboards;
  234.     }

  235.     /**
  236.      * {@inheritDoc}
  237.      */
  238.     @Override
  239.     public void store( IAdminDashboardComponent dashboardComponent )
  240.     {
  241.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_UPDATE ) )
  242.         {

  243.             int nIndex = setInsertOrUpdateValues( 1, dashboardComponent, daoUtil );
  244.             daoUtil.setString( nIndex, dashboardComponent.getName( ) );

  245.             daoUtil.executeUpdate( );

  246.         }
  247.     }

  248.     /**
  249.      * {@inheritDoc}
  250.      */
  251.     @Override
  252.     public List<Integer> selectColumns( )
  253.     {
  254.         List<Integer> listColumns = new ArrayList<>( );

  255.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_COLUMNS ) )
  256.         {

  257.             daoUtil.executeQuery( );

  258.             while ( daoUtil.next( ) )
  259.             {
  260.                 listColumns.add( daoUtil.getInt( 1 ) );
  261.             }

  262.         }

  263.         return listColumns;
  264.     }

  265.     /**
  266.      * Loads component data from daoUtil
  267.      *
  268.      * @param component
  269.      *            the component
  270.      * @param daoUtil
  271.      *            the daoutil
  272.      */
  273.     private void load( IDashboardComponent component, DAOUtil daoUtil )
  274.     {
  275.         int nIndex = 1;
  276.         component.setName( daoUtil.getString( nIndex++ ) );
  277.         component.setOrder( daoUtil.getInt( nIndex++ ) );
  278.         component.setZone( daoUtil.getInt( nIndex++ ) );
  279.     }

  280.     /**
  281.      * Sets daoUtil values from component
  282.      *
  283.      * @param nStartIndex
  284.      *            the start index
  285.      * @param component
  286.      *            the component
  287.      * @param daoUtil
  288.      *            daoutil
  289.      * @return the end index
  290.      */
  291.     private int setInsertOrUpdateValues( int nStartIndex, IDashboardComponent component, DAOUtil daoUtil )
  292.     {
  293.         int nIndex = nStartIndex;
  294.         daoUtil.setInt( nIndex++, component.getOrder( ) );
  295.         daoUtil.setInt( nIndex++, component.getZone( ) );

  296.         return nIndex;
  297.     }

  298.     /**
  299.      * Builds sql filter
  300.      *
  301.      * @param sbSQL
  302.      *            the buffer
  303.      * @param filter
  304.      *            the filter
  305.      */
  306.     private void buildSQLFilter( StringBuilder sbSQL, AdminDashboardFilter filter )
  307.     {
  308.         List<String> listFilters = new ArrayList<>( );

  309.         if ( filter.containsFilterOrder( ) )
  310.         {
  311.             listFilters.add( SQL_QUERY_FILTER_ORDER );
  312.         }

  313.         if ( filter.containsFilterColumn( ) )
  314.         {
  315.             listFilters.add( SQL_QUERY_FILTER_COLUMN );
  316.         }

  317.         if ( !listFilters.isEmpty( ) )
  318.         {
  319.             sbSQL.append( SQL_QUERY_KEYWORD_WHERE );

  320.             boolean bFirstFilter = true;

  321.             for ( String strFilter : listFilters )
  322.             {
  323.                 sbSQL.append( strFilter );

  324.                 if ( !bFirstFilter )
  325.                 {
  326.                     sbSQL.append( SQL_QUERY_KEYWORD_AND );
  327.                 }
  328.                 else
  329.                 {
  330.                     bFirstFilter = false;
  331.                 }
  332.             }
  333.         }
  334.     }

  335.     /**
  336.      * Add daoUtil parameters
  337.      *
  338.      * @param daoUtil
  339.      *            daoUtil
  340.      * @param nStartIndex
  341.      *            start index
  342.      * @param filter
  343.      *            the filter to apply
  344.      * @return end index
  345.      */
  346.     private int applySQLFilter( DAOUtil daoUtil, int nStartIndex, AdminDashboardFilter filter )
  347.     {
  348.         int nIndex = nStartIndex;

  349.         if ( filter.containsFilterOrder( ) )
  350.         {
  351.             daoUtil.setInt( nIndex++, filter.getFilterOrder( ) );
  352.         }

  353.         if ( filter.containsFilterColumn( ) )
  354.         {
  355.             daoUtil.setInt( nIndex++, filter.getFilterColumn( ) );
  356.         }

  357.         return nIndex;
  358.     }
  359. }