PortletJspBean.java
/*
* Copyright (c) 2002-2022, City of Paris
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice
* and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* License 1.0
*/
package fr.paris.lutece.portal.web.portlet;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import fr.paris.lutece.portal.business.page.PageHome;
import fr.paris.lutece.portal.business.portlet.Portlet;
import fr.paris.lutece.portal.business.portlet.PortletHome;
import fr.paris.lutece.portal.business.portlet.PortletType;
import fr.paris.lutece.portal.business.portlet.PortletTypeHome;
import fr.paris.lutece.portal.business.role.RoleHome;
import fr.paris.lutece.portal.service.message.AdminMessage;
import fr.paris.lutece.portal.service.message.AdminMessageService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
import fr.paris.lutece.portal.web.constants.Messages;
import fr.paris.lutece.portal.web.constants.Parameters;
import fr.paris.lutece.util.ReferenceList;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.string.StringUtil;
/**
* This class represents user interface Portlet. It is the base class of all user interface portlets. It is abstract and the implementation of the interface
* PortletJspBeanInterface is compulsary.
*/
public abstract class PortletJspBean extends AdminFeaturesPageJspBean
{
// //////////////////////////////////////////////////////////////////////////
// Constants
public static final String RIGHT_MANAGE_ADMIN_SITE = "CORE_ADMIN_SITE";
// Parameters
protected static final String PARAMETER_PAGE_ID = "page_id";
protected static final String PARAMETER_PORTLET_ID = "portlet_id";
protected static final String PARAMETER_PORTLET_TYPE_ID = "portlet_type_id";
private static final long serialVersionUID = -3546292252642160812L;
// Markers
private static final String MARK_PORTLET = "portlet";
private static final String MARK_PORTLET_TYPE = "portletType";
private static final String MARK_PORTLET_PAGE_ID = "portlet_page_id";
private static final String MARK_PORTLET_ORDER_COMBO = "portlet_order_combo";
private static final String MARK_PORTLET_COLUMNS_COMBO = "portlet_columns_combo";
private static final String MARK_PORTLET_STYLES_COMBO = "portlet_style_combo";
private static final String MARK_PORTLET_ROLES_COMBO = "portlet_role_combo";
private static final String MARK_SMALL_CHECKED = "small_checked";
private static final String MARK_NORMAL_CHECKED = "normal_checked";
private static final String MARK_LARGE_CHECKED = "large_checked";
private static final String MARK_XLARGE_CHECKED = "xlarge_checked";
private static final String VALUE_CHECKED = "checked=\"checked\"";
private static final String VALUE_UNCHECKED = "";
// Templates
private static final String TEMPLATE_CREATE_PORTLET = "admin/portlet/create_portlet.html";
private static final String TEMPLATE_MODIFY_PORTLET = "admin/portlet/modify_portlet.html";
// Properties
private static final String PROPERTY_LIST_ORDER_MAX = "list.order.max";
private static final String PROPERTY_COLUMN_NUM_MAX = "nb.columns";
// Messages
private static final String MESSAGE_INVALID_PAGE_ID = "portal.site.message.pageIdInvalid";
// Jsp
private static final String JSP_ADMIN_SITE = "../../site/AdminSite.jsp";
/**
* Displays the portlet's creation form
*
* @param request
* The http request
* @return The html code for displaying the creation form
*/
public abstract String getCreate( HttpServletRequest request );
/**
* Processes portlet's creation
*
* @param request
* The http request
* @return The Management jsp url
*/
public abstract String doCreate( HttpServletRequest request );
/**
* Displays the portlet's modification form
*
* @param request
* The http request
* @return The html code for displaying the modification form
*/
public abstract String getModify( HttpServletRequest request );
/**
* Processes portlet's modification
*
* @param request
* The http request
* @return The Management jsp url
*/
public abstract String doModify( HttpServletRequest request );
// //////////////////////////////////////////////////////////////////////////
// Management of the combos common to all portlets
// Order combo
/**
* Returns a list of orders
*
* @return the list of orders in form of ReferenceList
*/
private ReferenceList getOrdersList( )
{
ReferenceList list = new ReferenceList( );
int nOrderMax = AppPropertiesService.getPropertyInt( PROPERTY_LIST_ORDER_MAX, 15 );
for ( int i = 1; i <= nOrderMax; i++ )
{
list.addItem( i, String.valueOf( i ) );
}
return list;
}
/**
* Returns the list of the columns of the page where the portlet can be positioned
*
* @return the list of the page columns in form of ReferenceList
*/
private ReferenceList getColumnsList( )
{
ReferenceList list = new ReferenceList( );
int nColumnNumMax = AppPropertiesService.getPropertyInt( PROPERTY_COLUMN_NUM_MAX, 1 );
for ( int i = 1; i <= nColumnNumMax; i++ )
{
list.addItem( i, String.valueOf( i ) );
}
return list;
}
/**
* Recovers the common attributes of the portlet
*
* @param request
* the http request
* @param portlet
* The instance of the portlet
* @return An error Key if error, otherwise null.
*/
protected String setPortletCommonData( HttpServletRequest request, Portlet portlet )
{
String strErrorKey = null;
// get portlet attributes
String strName = request.getParameter( Parameters.PORTLET_NAME );
String strStyleId = request.getParameter( Parameters.STYLE );
String strColumn = request.getParameter( Parameters.COLUMN );
String strOrder = request.getParameter( Parameters.ORDER );
String strAcceptAlias = request.getParameter( Parameters.ACCEPT_ALIAS );
String strAcceptPortletTitle = request.getParameter( Parameters.DISPLAY_PORTLET_TITLE );
String strPortletTypeId = request.getParameter( Parameters.PORTLET_TYPE_ID );
String strRole = request.getParameter( Parameters.ROLE );
String strDisplaySmall = request.getParameter( Parameters.DISPLAY_ON_SMALL_DEVICE );
String strDisplayNormal = request.getParameter( Parameters.DISPLAY_ON_NORMAL_DEVICE );
String strDisplayLarge = request.getParameter( Parameters.DISPLAY_ON_LARGE_DEVICE );
String strDisplayXLarge = request.getParameter( Parameters.DISPLAY_ON_XLARGE_DEVICE );
strName = strName.replaceAll( "\"", "" );
// Check Mandatory fields
if ( StringUtil.isAnyEmpty( strName, strOrder, strColumn, strAcceptAlias, strAcceptPortletTitle ) )
{
return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
}
// style id is not mandatory if the content is not generated from XML and XSL
if ( portlet.isContentGeneratedByXmlAndXsl( ) && ( strStyleId == null || strStyleId.trim( ).equals( "" ) ) )
{
return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
}
String strPageId = request.getParameter( PARAMETER_PAGE_ID );
int nPageId;
// Test format of the id and the existence of the page
try
{
nPageId = Integer.parseInt( strPageId );
if ( !PageHome.checkPageExist( nPageId ) )
{
return AdminMessageService.getMessageUrl( request, MESSAGE_INVALID_PAGE_ID, AdminMessage.TYPE_STOP );
}
}
catch( NumberFormatException e )
{
AppLogService.error( e.getMessage( ), e );
return AdminMessageService.getMessageUrl( request, MESSAGE_INVALID_PAGE_ID, AdminMessage.TYPE_STOP );
}
int nOrder = Integer.parseInt( strOrder );
int nColumn = Integer.parseInt( strColumn );
int nAcceptAlias = Integer.parseInt( strAcceptAlias );
int nAcceptPortletTitle = Integer.parseInt( strAcceptPortletTitle );
int nStyleId = portlet.isContentGeneratedByXmlAndXsl( ) ? Integer.parseInt( strStyleId ) : 0;
int nDeviceDisplayFlags = 0;
if ( strDisplaySmall != null )
{
nDeviceDisplayFlags |= Portlet.FLAG_DISPLAY_ON_SMALL_DEVICE;
}
if ( strDisplayNormal != null )
{
nDeviceDisplayFlags |= Portlet.FLAG_DISPLAY_ON_NORMAL_DEVICE;
}
if ( strDisplayLarge != null )
{
nDeviceDisplayFlags |= Portlet.FLAG_DISPLAY_ON_LARGE_DEVICE;
}
if ( strDisplayXLarge != null )
{
nDeviceDisplayFlags |= Portlet.FLAG_DISPLAY_ON_XLARGE_DEVICE;
}
portlet.setName( strName );
portlet.setOrder( nOrder );
portlet.setColumn( nColumn );
portlet.setStyleId( nStyleId );
portlet.setPageId( nPageId );
portlet.setAcceptAlias( nAcceptAlias );
portlet.setDisplayPortletTitle( nAcceptPortletTitle );
portlet.setPortletTypeId( strPortletTypeId );
portlet.setRole( strRole );
portlet.setDeviceDisplayFlags( nDeviceDisplayFlags );
return strErrorKey;
}
/**
* Fills templates with common values shared by portlet creation form
*
* @param strPageId
* the page identifier
* @param strPortletTypeId
* the Portlet type identifier
* @return the template filled
*/
protected HtmlTemplate getCreateTemplate( String strPageId, String strPortletTypeId )
{
return getCreateTemplate( strPageId, strPortletTypeId, new HashMap<>( ) );
}
/**
* Fills templates with common values shared by portlet creation form
*
* @param strPageId
* the page identifier
* @param strPortletTypeId
* the Portlet type identifier
* @param model
* Specific data stored in a hashtable
* @return the template filled
*/
protected HtmlTemplate getCreateTemplate( String strPageId, String strPortletTypeId, Map<String, Object> model )
{
PortletType portletType = PortletTypeHome.findByPrimaryKey( strPortletTypeId );
Locale locale = getLocale( );
portletType.setLocale( locale );
model.put( MARK_PORTLET_TYPE, portletType );
model.put( MARK_PORTLET_PAGE_ID, strPageId );
model.put( MARK_PORTLET_ORDER_COMBO, getOrdersList( ) );
model.put( MARK_PORTLET_COLUMNS_COMBO, getColumnsList( ) );
model.put( MARK_PORTLET_STYLES_COMBO, PortletHome.getStylesList( strPortletTypeId ) );
model.put( MARK_PORTLET_ROLES_COMBO, RoleHome.getRolesList( getUser( ) ) );
return AppTemplateService.getTemplate( TEMPLATE_CREATE_PORTLET, locale, model );
}
/**
* Fills update template with portlet values
*
* @param portlet
* the object to update
* @return the update template filled
*/
protected HtmlTemplate getModifyTemplate( Portlet portlet )
{
return getModifyTemplate( portlet, new HashMap<>( ) );
}
/**
* Fills update template with portlet values
*
* @param portlet
* the object to update
* @param model
* The Data model
* @return the update template filled
*/
protected HtmlTemplate getModifyTemplate( Portlet portlet, Map<String, Object> model )
{
PortletType portletType = PortletTypeHome.findByPrimaryKey( portlet.getPortletTypeId( ) );
portletType.setLocale( getLocale( ) );
model.put( MARK_PORTLET_TYPE, portletType );
model.put( MARK_PORTLET, portlet );
model.put( MARK_PORTLET_ORDER_COMBO, getOrdersList( ) );
model.put( MARK_PORTLET_COLUMNS_COMBO, getColumnsList( ) );
model.put( MARK_PORTLET_STYLES_COMBO, PortletHome.getStylesList( portlet.getPortletTypeId( ) ) );
model.put( MARK_PORTLET_ROLES_COMBO, RoleHome.getRolesList( getUser( ) ) );
putCheckBox( model, MARK_SMALL_CHECKED, portlet.hasDeviceDisplayFlag( Portlet.FLAG_DISPLAY_ON_SMALL_DEVICE ) );
putCheckBox( model, MARK_NORMAL_CHECKED, portlet.hasDeviceDisplayFlag( Portlet.FLAG_DISPLAY_ON_NORMAL_DEVICE ) );
putCheckBox( model, MARK_LARGE_CHECKED, portlet.hasDeviceDisplayFlag( Portlet.FLAG_DISPLAY_ON_LARGE_DEVICE ) );
putCheckBox( model, MARK_XLARGE_CHECKED, portlet.hasDeviceDisplayFlag( Portlet.FLAG_DISPLAY_ON_XLARGE_DEVICE ) );
return AppTemplateService.getTemplate( TEMPLATE_MODIFY_PORTLET, getLocale( ), model );
}
/**
* Put check box.
*
* @param model
* the model
* @param strMarkerChecked
* the str marker checked
* @param bChecked
* the b checked
*/
protected void putCheckBox( Map<String, Object> model, String strMarkerChecked, boolean bChecked )
{
String strChecked = ( bChecked ) ? VALUE_CHECKED : VALUE_UNCHECKED;
model.put( strMarkerChecked, strChecked );
}
/**
* Gets the page URL
*
* @param nIdPage
* Page ID
* @return The page URL
*/
protected String getPageUrl( int nIdPage )
{
return JSP_ADMIN_SITE + "?" + PARAMETER_PAGE_ID + "=" + nIdPage;
}
}