AdminDashboardJspBean.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.web.dashboard;

  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;

  38. import javax.servlet.http.HttpServletRequest;

  39. import org.apache.commons.lang3.StringUtils;

  40. import fr.paris.lutece.portal.business.dashboard.AdminDashboardFactory;
  41. import fr.paris.lutece.portal.business.dashboard.AdminDashboardHome;
  42. import fr.paris.lutece.portal.business.user.AdminUser;
  43. import fr.paris.lutece.portal.service.admin.AccessDeniedException;
  44. import fr.paris.lutece.portal.service.admin.AdminUserService;
  45. import fr.paris.lutece.portal.service.dashboard.admin.AdminDashboardService;
  46. import fr.paris.lutece.portal.service.dashboard.admin.IAdminDashboardComponent;
  47. import fr.paris.lutece.portal.service.message.AdminMessage;
  48. import fr.paris.lutece.portal.service.message.AdminMessageService;
  49. import fr.paris.lutece.portal.service.security.SecurityTokenService;
  50. import fr.paris.lutece.portal.service.template.AppTemplateService;
  51. import fr.paris.lutece.portal.service.util.AppLogService;
  52. import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
  53. import fr.paris.lutece.portal.web.constants.Messages;
  54. import fr.paris.lutece.util.ReferenceList;
  55. import fr.paris.lutece.util.html.HtmlTemplate;
  56. import fr.paris.lutece.util.string.StringUtil;

  57. /**
  58.  * Provides technical admin dashboard managements and display. Display is NOT managed as an admin feature (no right required).
  59.  *
  60.  */
  61. public class AdminDashboardJspBean extends AdminFeaturesPageJspBean
  62. {
  63.     private static final long serialVersionUID = 5312273100074724058L;

  64.     public static final String TEMPLATE_MANAGE_DASHBOARDS = "/admin/dashboard/admin/manage_dashboards.html";

  65.     // Constants
  66.     public static final String RIGHT_MANAGE_ADMINDASHBOARD = "CORE_ADMINDASHBOARD_MANAGEMENT";

  67.     // Parameters
  68.     private static final String PARAMETER_DASHBOARD_NAME = "dashboard_name";
  69.     private static final String PARAMETER_DASHBOARD_COLUMN = "dashboard_column";
  70.     private static final String PARAMETER_DASHBOARD_ORDER = "dashboard_order";
  71.     private static final String PARAMETER_COLUMN = "column";

  72.     // Messages
  73.     private static final String MESSAGE_DASHBOARD_NOT_FOUND = "portal.admindashboard.message.dashboardNotFound";

  74.     // Markers
  75.     private static final String MARK_COLUMN_CONTENT_PREFIX = "column_content_";
  76.     private static final String MARK_MAP_DASHBOARDS = "map_dashboards";
  77.     private static final String MARK_NOT_SET_DASHBOARDS = "not_set_dashboards";
  78.     private static final String MARK_COLUMN_COUNT = "column_count";
  79.     private static final String MARK_LIST_AVAILABLE_COLUMNS = "list_available_columns";
  80.     private static final String MARK_MAP_AVAILABLE_ORDERS = "map_available_orders";
  81.     private static final String MARK_MAP_COLUMN_ORDER_STATUS = "map_column_order_status";

  82.     // Templates
  83.     private static final String TEMPLATE_VIEW_DASHBOARDS = "/admin/dashboard/admin/view_dashboards.html";

  84.     // Jsp
  85.     private static final String JSP_MANAGE_DASHBOARDS = "ManageAdminDashboards.jsp";
  86.     private static final String EMPTY_STRING = "";
  87.     private transient AdminDashboardService _service = AdminDashboardService.getInstance( );

  88.     /**
  89.      * Displays admin dashboards
  90.      *
  91.      * @param request
  92.      *            the request
  93.      * @return html code [NOT AS A FEATURE]
  94.      */
  95.     public String getAdminDashboards( HttpServletRequest request )
  96.     {
  97.         AdminUser user = AdminUserService.getAdminUser( request );
  98.         Map<String, Object> model = new HashMap<>( );

  99.         // put each column data
  100.         for ( int nColumn = 1; nColumn <= getAdminDashboardService( ).getColumnCount( ); nColumn++ )
  101.         {
  102.             String strColumnData = getAdminDashboardService( ).getDashboardData( user, nColumn, request );

  103.             model.put( MARK_COLUMN_CONTENT_PREFIX + nColumn, strColumnData );
  104.         }

  105.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_VIEW_DASHBOARDS, user.getLocale( ), model );

  106.         return template.getHtml( );
  107.     }

  108.     /**
  109.      * Manages dashboard
  110.      *
  111.      * @param request
  112.      *            the request
  113.      * @return html code
  114.      */
  115.     public String getManageDashboards( HttpServletRequest request )
  116.     {
  117.         AdminUser user = AdminUserService.getAdminUser( request );

  118.         Map<String, Object> model = new HashMap<>( );

  119.         Map<String, List<IAdminDashboardComponent>> mapAdminDashboards = getAdminDashboardService( ).getAllSetDashboards( );
  120.         model.put( MARK_MAP_DASHBOARDS, mapAdminDashboards );

  121.         List<IAdminDashboardComponent> listNotSetDashboards = getAdminDashboardService( ).getNotSetDashboards( );
  122.         model.put( MARK_NOT_SET_DASHBOARDS, listNotSetDashboards );

  123.         model.put( MARK_COLUMN_COUNT, getAdminDashboardService( ).getColumnCount( ) );
  124.         model.put( MARK_MAP_AVAILABLE_ORDERS, getMapAvailableOrders( ) );
  125.         model.put( MARK_LIST_AVAILABLE_COLUMNS, getListAvailableColumns( ) );
  126.         model.put( MARK_MAP_COLUMN_ORDER_STATUS, getAdminDashboardService( ).getOrderedColumnsStatus( ) );
  127.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_MANAGE_DASHBOARDS ) );

  128.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_DASHBOARDS, user.getLocale( ), model );

  129.         return getAdminPage( template.getHtml( ) );
  130.     }

  131.     /**
  132.      * Reorders columns
  133.      *
  134.      * @param request
  135.      *            the request
  136.      * @return url
  137.      * @throws AccessDeniedException
  138.      *             if the security token is invalid
  139.      */
  140.     public String doReorderColumn( HttpServletRequest request ) throws AccessDeniedException
  141.     {
  142.         String strColumnName = request.getParameter( PARAMETER_COLUMN );

  143.         if ( StringUtils.isBlank( strColumnName ) )
  144.         {
  145.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  146.         }

  147.         int nColumn = 0;

  148.         try
  149.         {
  150.             nColumn = Integer.parseInt( strColumnName );
  151.         }
  152.         catch( NumberFormatException nfe )
  153.         {
  154.             AppLogService.error( "AdminDashboardJspBean.doReorderColumn : {}", nfe.getMessage( ), nfe );

  155.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  156.         }
  157.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_MANAGE_DASHBOARDS ) )
  158.         {
  159.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  160.         }
  161.         getAdminDashboardService( ).doReorderColumn( nColumn );

  162.         return JSP_MANAGE_DASHBOARDS;
  163.     }

  164.     /**
  165.      * Moves the dashboard
  166.      *
  167.      * @param request
  168.      *            the request
  169.      * @return url
  170.      * @throws AccessDeniedException
  171.      *             if the security token is invalid
  172.      */
  173.     public String doMoveAdminDashboard( HttpServletRequest request ) throws AccessDeniedException
  174.     {
  175.         String strDashboardName = request.getParameter( PARAMETER_DASHBOARD_NAME );

  176.         if ( StringUtils.isBlank( strDashboardName ) )
  177.         {
  178.             return AdminMessageService.getMessageUrl( request, MESSAGE_DASHBOARD_NOT_FOUND, AdminMessage.TYPE_STOP );
  179.         }

  180.         // retrieve dashboard from database. If not found, will use Spring.
  181.         IAdminDashboardComponent dashboard = AdminDashboardHome.findByPrimaryKey( strDashboardName );
  182.         int nOldOrder = 0;
  183.         int nOldColumn = 0;
  184.         boolean bCreate = false;

  185.         if ( dashboard == null )
  186.         {
  187.             bCreate = true;

  188.             if ( AppLogService.isDebugEnabled( ) )
  189.             {
  190.                 AppLogService.debug( "Dashboard " + strDashboardName + " has no property set. Retrieving from SpringContext" );
  191.             }

  192.             dashboard = AdminDashboardFactory.getDashboardComponent( strDashboardName );

  193.             if ( dashboard == null )
  194.             {
  195.                 return AdminMessageService.getMessageUrl( request, MESSAGE_DASHBOARD_NOT_FOUND, AdminMessage.TYPE_STOP );
  196.             }
  197.         }
  198.         else
  199.         {
  200.             nOldOrder = dashboard.getOrder( );
  201.             nOldColumn = dashboard.getZone( );
  202.         }
  203.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_MANAGE_DASHBOARDS ) )
  204.         {
  205.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  206.         }

  207.         // set order and column
  208.         String strOrder = request.getParameter( PARAMETER_DASHBOARD_ORDER );
  209.         String strColumn = request.getParameter( PARAMETER_DASHBOARD_COLUMN );

  210.         int nOrder = StringUtil.getIntValue( strOrder, -1 );
  211.         int nColumn = StringUtil.getIntValue( strColumn, -1 );

  212.         dashboard.setOrder( nOrder );
  213.         dashboard.setZone( nColumn );

  214.         getAdminDashboardService( ).doMoveDashboard( dashboard, nOldColumn, nOldOrder, bCreate );

  215.         return JSP_MANAGE_DASHBOARDS;
  216.     }

  217.     /**
  218.      * Returns list with available column
  219.      *
  220.      * @return all available columns
  221.      */
  222.     private ReferenceList getListAvailableColumns( )
  223.     {
  224.         ReferenceList refList = new ReferenceList( );

  225.         // add empty item
  226.         refList.addItem( EMPTY_STRING, EMPTY_STRING );

  227.         for ( int nColumnIndex = 1; nColumnIndex <= getAdminDashboardService( ).getColumnCount( ); nColumnIndex++ )
  228.         {
  229.             refList.addItem( nColumnIndex, Integer.toString( nColumnIndex ) );
  230.         }

  231.         return refList;
  232.     }

  233.     /**
  234.      * Builds all refList order for all columns
  235.      *
  236.      * @return the map with column id as key
  237.      */
  238.     private Map<String, ReferenceList> getMapAvailableOrders( )
  239.     {
  240.         Map<String, ReferenceList> mapAvailableOrders = new HashMap<>( );

  241.         // get columns
  242.         for ( Integer nColumn : AdminDashboardHome.findColumns( ) )
  243.         {
  244.             // get orders
  245.             mapAvailableOrders.put( nColumn.toString( ), getListAvailableOrders( nColumn ) );
  246.         }

  247.         return mapAvailableOrders;
  248.     }

  249.     /**
  250.      * Orders reference list for the given column
  251.      *
  252.      * @param nColumn
  253.      *            column
  254.      * @return the refList
  255.      */
  256.     private ReferenceList getListAvailableOrders( int nColumn )
  257.     {
  258.         ReferenceList refList = new ReferenceList( );

  259.         // add empty item
  260.         refList.addItem( EMPTY_STRING, EMPTY_STRING );

  261.         int nMaxOrder = AdminDashboardHome.findMaxOrder( nColumn );

  262.         for ( int nOrder = 1; nOrder <= nMaxOrder; nOrder++ )
  263.         {
  264.             refList.addItem( nOrder, Integer.toString( nOrder ) );
  265.         }

  266.         return refList;
  267.     }

  268.     private AdminDashboardService getAdminDashboardService( )
  269.     {
  270.         if ( _service == null )
  271.         {
  272.             _service = AdminDashboardService.getInstance( );
  273.         }
  274.         return _service;
  275.     }
  276. }