DashboardDAO.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.util.AppLogService;
  37. import fr.paris.lutece.util.sql.DAOUtil;

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

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

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

  72.             daoUtil.setString( 1, strBeanName );

  73.             daoUtil.executeUpdate( );

  74.         }
  75.     }

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

  84.             daoUtil.executeUpdate( );

  85.         }
  86.     }

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

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

  97.             daoUtil.executeUpdate( );

  98.         }
  99.     }

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

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

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

  121.             daoUtil.setString( 1, strClassName );

  122.             daoUtil.executeQuery( );

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

  126.                 dashboardComponent = findDashboardFromFactory( strBeanName );

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

  136.         }

  137.         return dashboardComponent;
  138.     }

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

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

  148.             daoUtil.executeQuery( );

  149.             while ( daoUtil.next( ) )
  150.             {
  151.                 IDashboardComponent dashboardComponent = null;

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

  153.                 dashboardComponent = findDashboardFromFactory( strBeanName );

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

  164.         }

  165.         return listDashboards;
  166.     }

  167.     /**
  168.      * {@inheritDoc}
  169.      */
  170.     @Override
  171.     public int selectMaxOrder( )
  172.     {
  173.         int nMaxOrder = 0;
  174.         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_MAX_ORDER ) )
  175.         {
  176.             daoUtil.executeQuery( );

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

  181.         }

  182.         return nMaxOrder;
  183.     }

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

  194.             daoUtil.executeQuery( );

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

  199.         }

  200.         return nMaxOrder;
  201.     }

  202.     /**
  203.      * {@inheritDoc}
  204.      */
  205.     @Override
  206.     public List<IDashboardComponent> selectDashboardComponents( DashboardFilter filter )
  207.     {
  208.         List<IDashboardComponent> listDashboards = new ArrayList<>( );
  209.         StringBuilder sbSQL = new StringBuilder( SQL_QUERY_SELECT );
  210.         buildSQLFilter( sbSQL, filter );
  211.         sbSQL.append( SQL_QUERY_ORDER_BY_COLUMN_AND_ORDER );

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

  214.             applySQLFilter( daoUtil, 1, filter );

  215.             daoUtil.executeQuery( );

  216.             while ( daoUtil.next( ) )
  217.             {
  218.                 IDashboardComponent dashboardComponent = null;

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

  220.                 dashboardComponent = findDashboardFromFactory( strBeanName );

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

  231.         }

  232.         return listDashboards;
  233.     }

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

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

  244.             daoUtil.executeUpdate( );

  245.         }
  246.     }

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

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

  256.             daoUtil.executeQuery( );

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

  261.         }

  262.         return listColumns;
  263.     }

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

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

  295.         return nIndex;
  296.     }

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

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

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

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

  319.             boolean bFirstFilter = true;

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

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

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

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

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

  356.         return nIndex;
  357.     }
  358. }