Portlet.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.business.portlet;
import fr.paris.lutece.portal.business.XmlContent;
import fr.paris.lutece.portal.business.page.Page;
import fr.paris.lutece.portal.business.stylesheet.StyleSheet;
import fr.paris.lutece.portal.web.l10n.LocaleService;
import fr.paris.lutece.util.xml.XmlUtil;
import java.sql.Timestamp;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
/**
* This class represents business objects Portlet. It is the base class of all portlets. It is abstract and the implementation of the interface XmlContent is
* compulsory.
*/
public abstract class Portlet implements XmlContent
{
// //////////////////////////////////////////////////////////////////////////
// Publics variables common to all the portlets
public static final int STATUS_PUBLISHED = 0;
public static final int STATUS_UNPUBLISHED = 1;
public static final int FLAG_DISPLAY_ON_SMALL_DEVICE = 0x00000001;
public static final int FLAG_DISPLAY_ON_NORMAL_DEVICE = 0x00000010;
public static final int FLAG_DISPLAY_ON_LARGE_DEVICE = 0x00000100;
public static final int FLAG_DISPLAY_ON_XLARGE_DEVICE = 0x00001000;
private static final String VALUE_TRUE = "1";
private static final String VALUE_FALSE = "0";
// //////////////////////////////////////////////////////////////////////////
// Privates variables common to all the portlets
private static final int MODE_NORMAL = 0;
private static final int MODE_ADMIN = 1;
private int _nId;
private int _nPageId;
private int _nStyleId;
private int _nColumn;
private int _nOrder;
private int _nStatus;
private int _nAcceptAlias;
private int _nDisplayPortletTitle;
private String _strName;
private String _strPortletTypeId;
private String _strPortletTypeName;
private String _strUrlCreation;
private String _strUrlUpdate;
private String _strPluginName;
private String _strHomeClassName;
private String _strRole;
private Timestamp _dateUpdate;
private int _nDeviceFlags;
// //////////////////////////////////////////////////////////////////////////
// Accessors
/**
* Returns the identifier of this portlet.
*
* @return the portlet identifier
*/
public int getId( )
{
return _nId;
}
/**
* Sets the identifier of the portlet to the specified int.
*
* @param nId
* the new identifier
*/
public void setId( int nId )
{
_nId = nId;
}
/**
* Returns the style identifier of this portlet
*
* @return the style identifier
*/
public int getStyleId( )
{
return _nStyleId;
}
/**
* Sets the identifier of the portlet style with the specified int.
*
* @param nStyleId
* the new style identifier
*/
public void setStyleId( int nStyleId )
{
_nStyleId = nStyleId;
}
/**
* Returns the page identifier associated to this portlet
*
* @return the page identifier
*/
public int getPageId( )
{
return _nPageId;
}
/**
* Sets the identifier of the portlet style with the specified int.
*
* @param nPageId
* The identifier of the page
*/
public void setPageId( int nPageId )
{
_nPageId = nPageId;
}
/**
* Returns the identifier of this portlet.
*
* @return the portlet identifier
*/
public int getStatus( )
{
return _nStatus;
}
/**
* Sets the identifier of the portlet to the specified int.
*
* @param nStatus
* the new status
*/
public void setStatus( int nStatus )
{
_nStatus = nStatus;
}
/**
* Returns the name of this portlet
*
* @return the portlet name
*/
public String getName( )
{
return _strName;
}
/**
* Sets the name of this portlet to the specified string.
*
* @param strName
* the new name
*/
public void setName( String strName )
{
_strName = strName;
}
/**
* Returns the identifier of the portlet type of this portlet which caracterizes the portlet.
*
* @return the portlet type identifier
*/
public String getPortletTypeId( )
{
return _strPortletTypeId;
}
/**
* Sets the identifier of the portlet type to the specified int.
*
* @param strPortletTypeId
* the portlet type identifier
*/
public void setPortletTypeId( String strPortletTypeId )
{
_strPortletTypeId = strPortletTypeId;
}
/**
* Returns the portlet type name of this portlet
*
* @return the portlet type name
*/
public String getPortletTypeName( )
{
return _strPortletTypeName;
}
/**
* Sets the name of this portlet type with the specified string.
*
* @param strPortletTypeName
* the new portlet type name
*/
public void setPortletTypeName( String strPortletTypeName )
{
_strPortletTypeName = strPortletTypeName;
}
/**
* Returns the url of the program which manages the creation of a portlet
*
* @return the url of the creation
*/
public String getUrlCreation( )
{
return _strUrlCreation;
}
/**
* Sets the url of the program which creates this portlet
*
* @param strUrlCreation
* The url of creation
*/
public void setUrlCreation( String strUrlCreation )
{
_strUrlCreation = strUrlCreation;
}
/**
* Returns the url of the program which manages the update of a portlet
*
* @return the url of the program as a String
*/
public String getUrlUpdate( )
{
return _strUrlUpdate;
}
/**
* Sets the url of the program which updates this portlet
*
* @param strUrlUpdate
* The url of update
*/
public void setUrlUpdate( String strUrlUpdate )
{
_strUrlUpdate = strUrlUpdate;
}
/**
* Returns the date of update of this portlet
*
* @return the update date
*/
public Timestamp getDateUpdate( )
{
return _dateUpdate;
}
/**
* Sets the date of update of this portlet with the specified date.
*
* @param dateUpdate
* the new date
*/
public void setDateUpdate( Timestamp dateUpdate )
{
_dateUpdate = dateUpdate;
}
/**
* Return the number of the column of this portlet in the page
*
* @return the number of the column
*/
public int getColumn( )
{
return _nColumn;
}
/**
* Sets the number of the column of this portlet in its page with the specified int.
*
* @param nColumn
* the new number of column
*/
public void setColumn( int nColumn )
{
_nColumn = nColumn;
}
/**
* Returns the order of this portlet in the page which contains it.
*
* @return the order
*/
public int getOrder( )
{
return _nOrder;
}
/**
* Sets the order of this portlet in its page with the specified int.
*
* @param nType
* the new order
*/
public void setOrder( int nType )
{
_nOrder = nType;
}
/**
* Gets device display flags
*
* @return Flags
*/
public int getDeviceDisplayFlags( )
{
return _nDeviceFlags;
}
/**
* Check if a flag is setted
*
* @param nFlag
* The flag to check
* @return true if the flag is set, otherwise false
*/
public boolean hasDeviceDisplayFlag( int nFlag )
{
return ( _nDeviceFlags & nFlag ) != 0;
}
/**
* Set device display flags
*
* @param nFlags
* Flags
*/
public void setDeviceDisplayFlags( int nFlags )
{
_nDeviceFlags = nFlags;
}
/**
* Returns the name of the java class which manages this type of portlet.
*
* @return the java class name
*/
public String getHomeClassName( )
{
return _strHomeClassName;
}
/**
* Sets the name of the java class which manages this type of portlet with the specified string.
*
* @param strHomeClassName
* The Home Class name
*/
public void setHomeClassName( String strHomeClassName )
{
_strHomeClassName = strHomeClassName;
}
/**
* Indicates if this portlet can be modified after its creation or not.
*
* @return 1 if the portlet can be updated, 0 if not
*/
public int getAcceptAlias( )
{
return _nAcceptAlias;
}
/**
* Sets the flag which indicates that this portlet can be have a title or not.
*
* @param nDisplayPortletTitle
* The flag
*/
public void setDisplayPortletTitle( int nDisplayPortletTitle )
{
_nDisplayPortletTitle = nDisplayPortletTitle;
}
/**
* Indicates if this portlet can be modified have a title or not.
*
* @return 1 if the portlet can be have a title, 0 if not
*/
public int getDisplayPortletTitle( )
{
return _nDisplayPortletTitle;
}
/**
* Sets the flag which indicates that this portlet can be updated or not.
*
* @param nAcceptAlias
* The flag
*/
public void setAcceptAlias( int nAcceptAlias )
{
_nAcceptAlias = nAcceptAlias;
}
/**
* Get the plugin Name
*
* @return The pluginName
*/
public String getPluginName( )
{
return _strPluginName;
}
/**
* Sets the flag which indicates that this portlet can be updated or not.
*
* @param strPluginName
* The flag
*/
public void setPluginName( String strPluginName )
{
_strPluginName = strPluginName;
}
/**
* Gets the portlet's role
*
* @return page's role as a String
* @since v2.5
*/
public String getRole( )
{
_strRole = ( _strRole == null ) ? Page.ROLE_NONE : _strRole;
return _strRole;
}
/**
* Sets the portlet's role
*
* @param strRole
* The role
* @since v2.5
*/
public void setRole( String strRole )
{
_strRole = ( ( strRole == null ) || ( strRole.equals( "" ) ) ) ? Page.ROLE_NONE : strRole;
}
// //////////////////////////////////////////////////////////////////////////
// Operations
/**
* This method copies the fields of the portlet specified in this portlet.
*
* @param portlet
* the portlet to copy
*/
public void copy( Portlet portlet )
{
setId( portlet.getId( ) );
setPortletTypeId( portlet.getPortletTypeId( ) );
setPageId( portlet.getPageId( ) );
setStyleId( portlet.getStyleId( ) );
setName( portlet.getName( ) );
setPortletTypeName( portlet.getPortletTypeName( ) );
setUrlCreation( portlet.getUrlCreation( ) );
setUrlUpdate( portlet.getUrlUpdate( ) );
setDateUpdate( portlet.getDateUpdate( ) );
setColumn( portlet.getColumn( ) );
setOrder( portlet.getOrder( ) );
setAcceptAlias( portlet.getAcceptAlias( ) );
setPluginName( portlet.getPluginName( ) );
setDisplayPortletTitle( portlet.getDisplayPortletTitle( ) );
setDeviceDisplayFlags( portlet.getDeviceDisplayFlags( ) );
setStatus( portlet.getStatus( ) );
setRole( portlet.getRole( ) );
}
/**
* Add the common tags to all the portlets to the XML document
*
* @param strPortlet
* The string buffer which contains the XML content of this portlet
* @return The XML content of this portlet encapsulated by the common tags
*/
protected String addPortletTags( StringBuffer strPortlet )
{
StringBuffer strXml = new StringBuffer( );
XmlUtil.beginElement( strXml, TAG_PORTLET );
XmlUtil.addElementHtml( strXml, TAG_PORTLET_NAME, getName( ) );
XmlUtil.addElement( strXml, TAG_PORTLET_ID, getId( ) );
XmlUtil.addElement( strXml, TAG_PAGE_ID, getPageId( ) );
XmlUtil.addElement( strXml, TAG_PLUGIN_NAME, getPluginName( ) );
XmlUtil.addElement( strXml, TAG_DISPLAY_PORTLET_TITLE, getDisplayPortletTitle( ) );
String strDisplayOnSmallDevice = ( ( getDeviceDisplayFlags( ) & FLAG_DISPLAY_ON_SMALL_DEVICE ) != 0 ) ? VALUE_TRUE : VALUE_FALSE;
XmlUtil.addElement( strXml, TAG_DISPLAY_ON_SMALL_DEVICE, strDisplayOnSmallDevice );
String strDisplayOnNormalDevice = ( ( getDeviceDisplayFlags( ) & FLAG_DISPLAY_ON_NORMAL_DEVICE ) != 0 ) ? VALUE_TRUE : VALUE_FALSE;
XmlUtil.addElement( strXml, TAG_DISPLAY_ON_NORMAL_DEVICE, strDisplayOnNormalDevice );
String strDisplayOnLargeDevice = ( ( getDeviceDisplayFlags( ) & FLAG_DISPLAY_ON_LARGE_DEVICE ) != 0 ) ? VALUE_TRUE : VALUE_FALSE;
XmlUtil.addElement( strXml, TAG_DISPLAY_ON_LARGE_DEVICE, strDisplayOnLargeDevice );
String strDisplayOnXLargeDevice = ( ( getDeviceDisplayFlags( ) & FLAG_DISPLAY_ON_XLARGE_DEVICE ) != 0 ) ? VALUE_TRUE : VALUE_FALSE;
XmlUtil.addElement( strXml, TAG_DISPLAY_ON_XLARGE_DEVICE, strDisplayOnXLargeDevice );
strXml.append( strPortlet.toString( ) );
XmlUtil.endElement( strXml, TAG_PORTLET );
return strXml.toString( );
}
/**
* Recovers the stylesheet of the portlet according to the mode
*
* @param nMode
* the selected mode.
* @return the name of the stylesheet file
*/
public String getXslFile( int nMode )
{
StyleSheet xsl;
// Added in v1.3
// Use the same stylesheet for normal or admin mode
switch( nMode )
{
case MODE_NORMAL:
case MODE_ADMIN:
xsl = PortletHome.getXsl( getId( ), MODE_NORMAL );
break;
default:
xsl = PortletHome.getXsl( getId( ), nMode );
break;
}
return xsl.getFile( );
}
/**
* Recovers the stylesheet of the portlet according to the mode
*
* @param nMode
* the selected mode.
* @return the content of the stylesheet file
*/
public byte [ ] getXslSource( int nMode )
{
StyleSheet xsl;
// Added in v1.3
// Use the same stylesheet for normal or admin mode
switch( nMode )
{
case MODE_NORMAL:
case MODE_ADMIN:
xsl = PortletHome.getXsl( getId( ), MODE_NORMAL );
break;
default:
xsl = PortletHome.getXsl( getId( ), nMode );
break;
}
return xsl.getSource( );
}
/**
* Recovers the parameters to use with the stylesheet at the time of the transformation.<br>
* By default, portlets do not return any parameter
*
* @return a collection of the type Dictionary (Use the Hashtable implementation)
*/
public Map<String, String> getXslParams( )
{
return null;
}
/**
* Remove the portlet. This method MUST be overloaded on the level of the implementation of each portlet
*/
public abstract void remove( );
/**
* Check if the content of this portlet is generated by xml and xsl, or if it manage its own content generation
*
* @return True if the content must be generated from XML and XSL, false if it must be generated by the {@link #getHtmlContent(HttpServletRequest request)}
* method
*/
public boolean isContentGeneratedByXmlAndXsl( )
{
return true;
}
/**
* Get the HTML content of the portlet. If the content must be generated from XML and XSL, then this method should return null. This method should only be
* overrided if the method {@link #isContentGeneratedByXmlAndXsl()} returns true
*
* @param request
* The request
* @return The HTML content of the portlet, or null if the content is generated from XML and XSL
*/
public String getHtmlContent( HttpServletRequest request )
{
return null;
}
/**
* Default getLocale() implementation. Could be overriden
*
* @param request
* The HTTP request
* @return The Locale
*/
protected Locale getLocale( HttpServletRequest request )
{
return LocaleService.getContextUserLocale( request );
}
/**
* Check if the content of the portlet can be put in cache if the current user is not authenticated. If a cache is disabled for a portlet, then every page
* that contains a portlet of this type will NOT use the page cache, and portlet contents of this portlet type will not be saved into portlet cache.<br>
* WARNING : Overrides this method with extreme care : disabling page cache can cause severe performance issues !
*
* @return True if the content of the portlet can be put in cache if the user is not authenticated, false otherwise.<br>
* The default value is true.
* @see #canBeCachedForConnectedUsers() {@link #canBeCachedForConnectedUsers()} for cache for authenticated users
*/
public boolean canBeCachedForAnonymousUsers( )
{
return true;
}
/**
* Check if the content of the portlet can be put in cache if the current user is authenticated. If a cache is disabled for a portlet, then every page that
* contains a portlet of this type will NOT use the page cache, and portlet contents of this portlet type will not be saved into portlet cache.<br>
* WARNING : Overrides this method with extreme care : disabling page cache can cause severe performance issues !
*
* @return True if the content of the portlet can be put in cache if the user is authenticated, false otherwise.<br>
* The default value is true.
* @see #canBeCachedForAnonymousUsers() {@link #canBeCachedForAnonymousUsers()} for cache for anonymous users
*/
public boolean canBeCachedForConnectedUsers( )
{
return true;
}
}