fr.paris.lutece.plugins.crm.web.CRMApp.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.plugins.crm.web.CRMApp.java

Source

/*
 * Copyright (c) 2002-2014, Mairie de 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.plugins.crm.web;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

import fr.paris.lutece.plugins.crm.business.demand.Demand;
import fr.paris.lutece.plugins.crm.business.demand.DemandFilter;
import fr.paris.lutece.plugins.crm.business.demand.DemandStatusCRM;
import fr.paris.lutece.plugins.crm.business.demand.DemandType;
import fr.paris.lutece.plugins.crm.business.demand.PaginationFilterSortManager;
import fr.paris.lutece.plugins.crm.business.notification.Notification;
import fr.paris.lutece.plugins.crm.business.notification.NotificationFilter;
import fr.paris.lutece.plugins.crm.business.user.CRMUser;
import fr.paris.lutece.plugins.crm.service.CRMPlugin;
import fr.paris.lutece.plugins.crm.service.category.CategoryService;
import fr.paris.lutece.plugins.crm.service.demand.DemandService;
import fr.paris.lutece.plugins.crm.service.demand.DemandStatusCRMService;
import fr.paris.lutece.plugins.crm.service.demand.DemandTypeService;
import fr.paris.lutece.plugins.crm.service.listener.CRMUserModificationListenerService;
import fr.paris.lutece.plugins.crm.service.notification.NotificationService;
import fr.paris.lutece.plugins.crm.service.parameters.AdvancedParametersService;
import fr.paris.lutece.plugins.crm.service.signrequest.CRMRequestAuthenticatorService;
import fr.paris.lutece.plugins.crm.service.user.CRMUserAttributesService;
import fr.paris.lutece.plugins.crm.service.user.CRMUserService;
import fr.paris.lutece.plugins.crm.util.ListUtils;
import fr.paris.lutece.plugins.crm.util.constants.CRMConstants;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.message.SiteMessage;
import fr.paris.lutece.portal.service.message.SiteMessageException;
import fr.paris.lutece.portal.service.message.SiteMessageService;
import fr.paris.lutece.portal.service.page.PageNotFoundException;
import fr.paris.lutece.portal.service.plugin.Plugin;
import fr.paris.lutece.portal.service.security.LuteceUser;
import fr.paris.lutece.portal.service.security.SecurityService;
import fr.paris.lutece.portal.service.security.UserNotSignedException;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppPathService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.web.PortalJspBean;
import fr.paris.lutece.portal.web.xpages.XPage;
import fr.paris.lutece.portal.web.xpages.XPageApplication;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.html.IPaginator;
import fr.paris.lutece.util.string.StringUtil;
import fr.paris.lutece.util.url.UrlItem;

/**
 *
 * CRMApp
 *
 */
public class CRMApp implements XPageApplication {
    // JSP
    private static final String JSP_PORTAL = "Portal.jsp";
    private static final String JSP_SITE = "jsp/site/";

    // TEMPLATES
    private static final String TEMPLATE_CRM_HOME_PAGE = "skin/plugins/crm/crm.html";
    private static final String TEMPLATE_MANAGE_NOTIFICATIONS = "skin/plugins/crm/manage_notifications.html";
    private static final String TEMPLATE_VIEW_NOTIFICATION = "skin/plugins/crm/view_notification.html";
    private static final String TEMPLATE_MODIFY_CRM_USER = "skin/plugins/crm/modify_crm_user.html";

    // VARIABLES
    private DemandTypeService _demandTypeService = DemandTypeService.getService();
    private DemandService _demandService = DemandService.getService();
    private CategoryService _categoryService = CategoryService.getService();
    private NotificationService _notificationService = NotificationService.getService();
    private DemandStatusCRMService _statusCRMService = DemandStatusCRMService.getService();
    private CRMUserService _crmUserService = CRMUserService.getService();
    private CRMUserAttributesService _crmUserAttributesService = CRMUserAttributesService.getService();
    private AdvancedParametersService _advancedParametersService = AdvancedParametersService.getService();
    //PROPERTIE
    private static final String CRM_WEBB_APP_CODE_PROPERTY = "crm.webapp.code";

    /**
     * Get the XPage of the plugin CRM
     * @param request {@link HttpServletRequest}
     * @param nMode the mode
     * @param plugin {@link Plugin}
     * @return a {@link XPage}
     * @throws UserNotSignedException exception when user is not connected
     * @throws SiteMessageException site message when displaying messages
     */
    @Override
    public XPage getPage(HttpServletRequest request, int nMode, Plugin plugin)
            throws UserNotSignedException, SiteMessageException {
        XPage page = null;
        LuteceUser user = null;

        try {
            user = getUser(request);
        } catch (UserNotSignedException e) {

        }

        createOrUpdateCRMAccount(user);

        String strAction = request.getParameter(CRMConstants.PARAMETER_ACTION);

        if (StringUtils.isNotBlank(strAction)) {
            if (user == null) {
                throw new UserNotSignedException();
            }

            if (CRMConstants.ACTION_MANAGE_NOTIFICATIONS.equals(strAction)) {
                page = getManageNotificationsPage(request, user);
            } else if (CRMConstants.ACTION_VIEW_NOTIFICATION.equals(strAction)) {
                page = getViewNotificationPage(request, user);
            } else if (CRMConstants.ACTION_REMOVE_DEMAND.equals(strAction)) {
                getDemandRemovingConfirmationMessage(request, user);
            } else if (CRMConstants.ACTION_MODIFY_CRM_USER.equals(strAction)) {
                page = getModifyCRMUserPage(request, user);
            } else if (CRMConstants.ACTION_DO_MODIFY_CRM_USER.equals(strAction)) {
                doModifyCRMUser(request, user);
                page = getModifyCRMUserPage(request, user);
            }
        }

        if (page == null) {
            page = getCRMHomePage(request, user);
        }

        return page;
    }

    /**
     * Get the home page
     * @param request {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @return a {@link XPage}
     * @throws SiteMessageException
     */
    private XPage getCRMHomePage(HttpServletRequest request, LuteceUser user) throws SiteMessageException {
        XPage page = null;
        CRMUser crmUser = user != null ? _crmUserService.findByUserGuid(user.getName()) : null;
        page = new XPage();
        Map<String, Object> model = new HashMap<String, Object>();
        if (crmUser != null) {
            //research by filter
            DemandFilter dFilter = new DemandFilter();
            dFilter.setIdCRMUser(crmUser.getIdCRMUser());

            PaginationFilterSortManager paginationFilterSortManager = new PaginationFilterSortManager(request);

            String strSession = (String) (request.getParameter(CRMConstants.PARAMETER_SESSION));

            if (StringUtils.isBlank(strSession)) {
                paginationFilterSortManager.cleanSession();
            }

            String strIdStatusToSort = (String) (request.getParameter(CRMConstants.PARAMETER_ID_STATUS));
            String strSortField = (String) (request.getParameter(CRMConstants.PARAMETER_SORT_ATTRIBUTE));
            String strSortOrder = (String) (request.getParameter(CRMConstants.PARAMETER_SORT_ORDER));

            int nIdStatusToSort = -1;

            if (StringUtils.isNotEmpty(strIdStatusToSort)) {
                nIdStatusToSort = Integer.parseInt(strIdStatusToSort);
            }

            if (StringUtils.isNotEmpty(strSortField) && StringUtils.isNotEmpty(strSortOrder)) {
                paginationFilterSortManager.storeSort(nIdStatusToSort, strSortField,
                        Boolean.parseBoolean(strSortOrder));
            }

            String strModificationDate = request.getParameter(CRMConstants.PARAMETER_MODIFICATIONDATE);
            String strDemandType = request.getParameter(CRMConstants.PARAMETER_DEMANDTYPE);
            String strNotification = request.getParameter(CRMConstants.PARAMETER_NOTIFICATION);

            if (StringUtils.isNotBlank(strModificationDate) || StringUtils.isNotBlank(strDemandType)
                    || StringUtils.isNotBlank(strNotification)) {
                paginationFilterSortManager.cleanSessionFilter();
            }

            if (StringUtils.isNotBlank(strModificationDate)) {
                Date modificationDate = checkFormatModificationDateFilter(strModificationDate, request);
                paginationFilterSortManager.storeFilterModificationDate(modificationDate);
                paginationFilterSortManager.storeFilterStringModificationDate(strModificationDate);
            }

            if (StringUtils.isNotBlank(strDemandType)) {
                int nIdDemandType = Integer.parseInt(strDemandType);
                paginationFilterSortManager.storeFilterDemandType(nIdDemandType);
            }

            if (StringUtils.isNotBlank(strNotification)) {
                paginationFilterSortManager.storeFilterNotification(strNotification);
            }

            Date dateModificationSession = paginationFilterSortManager.retrieveFilterModificationDate();

            if (dateModificationSession != null) {
                dFilter.setDateModification(dateModificationSession);
                model.put(CRMConstants.MARK_MODIFICATIONDATE,
                        paginationFilterSortManager.retrieveFilterStringModificationDate());
            }

            Integer nIdDemandTypeSession = paginationFilterSortManager.retrieveFilterDemandType();

            if ((nIdDemandTypeSession != null) && (nIdDemandTypeSession >= 0)) {
                dFilter.setIdDemandType(nIdDemandTypeSession);
            }

            String strNotificationSession = paginationFilterSortManager.retrieveFilterNotification();

            if (StringUtils.isNotBlank(strNotificationSession)) {
                dFilter.setNotification(strNotificationSession);
            }

            model.put(CRMConstants.MARK_MAP_DEMANDS_LIST,
                    _demandService.findByFilterMap(dFilter, request.getLocale(), paginationFilterSortManager));
            model.put(CRMConstants.MARK_FILTER, dFilter);

            Map<String, IPaginator<Demand>> mapPaginator = new HashMap<String, IPaginator<Demand>>();
            Map<String, String> mapNbItemsPerPage = new HashMap<String, String>();
            int nIdStatus;

            for (DemandStatusCRM statusCRM : DemandStatusCRMService.getService()
                    .getAllStatusCRM(request.getLocale())) {
                nIdStatus = statusCRM.getIdStatusCRM();

                IPaginator<Demand> paginator = paginationFilterSortManager.retrievePaginator(nIdStatus);
                int nItemsPerPage = paginationFilterSortManager.retrieveItemsPerPage(nIdStatus);

                mapNbItemsPerPage.put(Integer.toString(nIdStatus), Integer.toString(nItemsPerPage));
                mapPaginator.put(Integer.toString(nIdStatus), paginator);
            }
            model.put(CRMConstants.MARK_STATUS_CRM_LIST, _statusCRMService.getAllStatusCRM(request.getLocale()));

            model.put(CRMConstants.MARK_MAP_PAGINATOR, mapPaginator);
            model.put(CRMConstants.MARK_MAP_NB_ITEMS_PER_PAGE, mapNbItemsPerPage);
            model.put(CRMConstants.MARK_DISPLAYDRAFT,
                    _advancedParametersService.isParameterValueByKey(CRMConstants.CONSTANT_DISPLAYDRAFT));

        }
        model.put(CRMConstants.MARK_LOCALE, request.getLocale());
        model.put(CRMConstants.MARK_MAP_DEMAND_TYPES_LIST, _demandTypeService.findForLuteceUser(request));
        model.put(CRMConstants.MARK_CATEGORIES_LIST,
                _categoryService.getCategories(request.getLocale(), false, true));
        model.put(CRMConstants.MARK_DEMAND_TYPES_LIST, _demandTypeService.findAll());

        model.put(CRMConstants.MARK_CRM_USER, crmUser);
        List<DemandType> listAllOpenedDemandType = initListAllOpenedDemandType();

        model.put(CRMConstants.MARK_DEMAND_TYPES_REFLIST,
                ListUtils.toReferenceList(listAllOpenedDemandType, "idDemandType", "label", ""));

        model.put(CRMConstants.MARK_MAP_DO_LOGIN, SecurityService.getInstance().getLoginPageUrl());
        model.put(CRMConstants.MARK_BASE_URL, AppPathService.getBaseUrl(request));
        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_CRM_HOME_PAGE, request.getLocale(), model);

        page.setTitle(I18nService.getLocalizedString(CRMConstants.PROPERTY_PAGE_TITLE, request.getLocale()));
        page.setPathLabel(I18nService.getLocalizedString(CRMConstants.PROPERTY_PAGE_PATH, request.getLocale()));
        page.setContent(template.getHtml());

        return page;
    }

    /**
     * Get the page to manage the notifications of a resource
     * @param request {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @return a {@link XPage}
     */
    private XPage getManageNotificationsPage(HttpServletRequest request, LuteceUser user) {
        XPage page = null;
        CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());
        String strIdDemand = request.getParameter(CRMConstants.PARAMETER_ID_DEMAND);

        if ((crmUser != null) && StringUtils.isNotBlank(strIdDemand) && StringUtils.isNumeric(strIdDemand)) {
            int nIdDemand = Integer.parseInt(strIdDemand);
            Demand demand = _demandService.findByPrimaryKey(nIdDemand);

            if ((demand != null) && (crmUser.getIdCRMUser() == demand.getIdCRMUser())) {
                // Check the existence of the demand and the owner of the demand is indeed the current user
                page = new XPage();

                NotificationFilter nFilter = new NotificationFilter();
                nFilter.setIdDemand(nIdDemand);

                DemandType demandType = _demandTypeService.findByPrimaryKey(demand.getIdDemandType());

                Map<String, Object> model = new HashMap<String, Object>();
                model.put(CRMConstants.MARK_NOTIFICATIONS_LIST, _notificationService.findByFilter(nFilter));
                model.put(CRMConstants.MARK_DEMAND_TYPE, demandType);

                HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_NOTIFICATIONS,
                        request.getLocale(), model);

                page.setTitle(I18nService.getLocalizedString(CRMConstants.PROPERTY_MANAGE_NOTIFICATIONS_PAGE_TITLE,
                        request.getLocale()));
                page.setPathLabel(
                        I18nService.getLocalizedString(CRMConstants.PROPERTY_PAGE_PATH, request.getLocale()));
                page.setContent(template.getHtml());
            }
        }

        return page;
    }

    /**
     * Get the page to view the notification
     * @param request {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @return a {@link XPage}
     */
    private XPage getViewNotificationPage(HttpServletRequest request, LuteceUser user) {
        XPage page = null;
        CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());
        String strIdNotification = request.getParameter(CRMConstants.PARAMETER_ID_NOTIFICATION);

        if ((crmUser != null) && StringUtils.isNotBlank(strIdNotification)
                && StringUtils.isNumeric(strIdNotification)) {
            int nIdNotification = Integer.parseInt(strIdNotification);
            Notification notification = _notificationService.findByPrimaryKey(nIdNotification);

            if (notification != null) {
                Demand demand = _demandService.findByPrimaryKey(notification.getIdDemand());

                if ((demand != null) && (crmUser.getIdCRMUser() == demand.getIdCRMUser())) {
                    // Check the existence of the demand and the owner of the demand is indeed the current user
                    if (!notification.isRead()) {
                        // Set the status of the notification to READ
                        notification.setIsRead(true);
                        _notificationService.update(notification);
                    }

                    DemandType demandType = _demandTypeService.findByPrimaryKey(demand.getIdDemandType());

                    page = new XPage();

                    Map<String, Object> model = new HashMap<String, Object>();
                    model.put(CRMConstants.MARK_NOTIFICATION, notification);
                    model.put(CRMConstants.MARK_DEMAND, demand);
                    model.put(CRMConstants.MARK_DEMAND_TYPE, demandType);

                    HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_VIEW_NOTIFICATION,
                            request.getLocale(), model);

                    page.setTitle(I18nService.getLocalizedString(CRMConstants.PROPERTY_VIEW_NOTIFICATION_PAGE_TITLE,
                            request.getLocale()));
                    page.setPathLabel(
                            I18nService.getLocalizedString(CRMConstants.PROPERTY_PAGE_PATH, request.getLocale()));
                    page.setContent(template.getHtml());
                }
            }
        }

        return page;
    }

    /**
     * Get the modify crm account page
     * @param request {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @return a {@link XPage}
     */
    private XPage getModifyCRMUserPage(HttpServletRequest request, LuteceUser user) {
        XPage page = null;
        CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());

        if (crmUser != null) {
            page = new XPage();

            Map<String, Object> model = new HashMap<String, Object>();
            model.put(CRMConstants.MARK_CRM_USER, crmUser);

            HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MODIFY_CRM_USER, request.getLocale(),
                    model);

            page.setTitle(I18nService.getLocalizedString(CRMConstants.PROPERTY_VIEW_NOTIFICATION_PAGE_TITLE,
                    request.getLocale()));
            page.setPathLabel(I18nService.getLocalizedString(CRMConstants.PROPERTY_PAGE_PATH, request.getLocale()));
            page.setContent(template.getHtml());
        }

        return page;
    }

    /**
     * Do modify a crm user
     * @param request the {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @throws SiteMessageException message if some info are not well filled
     */
    private void doModifyCRMUser(HttpServletRequest request, LuteceUser user) throws SiteMessageException {
        CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());

        if (crmUser != null) {
            UrlItem url = new UrlItem(JSP_SITE + JSP_PORTAL);
            url.addParameter(CRMConstants.PARAMETER_PAGE, CRMPlugin.PLUGIN_NAME);
            url.addParameter(CRMConstants.PARAMETER_ACTION, CRMConstants.ACTION_MODIFY_CRM_USER);

            int nMaxSize = AppPropertiesService.getPropertyInt(CRMConstants.PROPERTY_CRM_USER_MAX_SIZE, 255);

            Map<String, String> userAttributes = new HashMap<String, String>();

            for (String strUserAttributeKey : _crmUserAttributesService.getUserAttributeKeys()) {
                String strUserAttributeValue = request.getParameter(strUserAttributeKey);

                if (StringUtils.isNotBlank(strUserAttributeValue) && (strUserAttributeValue.length() > nMaxSize)) {
                    Object[] params = { nMaxSize };
                    SiteMessageService.setMessage(request, CRMConstants.MESSAGE_SIZE_TOO_BIG, params,
                            SiteMessage.TYPE_STOP);
                }

                if (StringUtils.isNotBlank(strUserAttributeKey)
                        && strUserAttributeKey.endsWith(CRMConstants.PARAMETER_EMAIL)) {
                    if (!StringUtil.checkEmail(strUserAttributeValue)) {
                        SiteMessageService.setMessage(request, CRMConstants.MESSAGE_INVALID_EMAIL,
                                SiteMessage.TYPE_STOP, url.getUrl());
                    }
                    // If the user changed one of his emails
                    if (!StringUtils.equals(crmUser.getUserAttributeValue(strUserAttributeKey),
                            strUserAttributeValue)) {
                        if (_crmUserAttributesService.isAttributeValueInUse(strUserAttributeValue,
                                strUserAttributeKey)) {
                            SiteMessageService.setMessage(request, CRMConstants.MESSAGE_EMAIL_ALREADY_IN_USE,
                                    SiteMessage.TYPE_STOP, url.getUrl());
                        }
                    }
                }

                userAttributes.put(strUserAttributeKey,
                        StringUtils.isNotBlank(strUserAttributeValue) ? strUserAttributeValue : StringUtils.EMPTY);
            }

            crmUser.setUserAttributes(userAttributes);

            _crmUserService.update(crmUser);
            CRMUserModificationListenerService.getService().notifyListeners(crmUser,
                    CRMConstants.EVENT_CRM_USER_MODIFIED);
        }
    }

    /**
     * Get the confirmation message for removing the demand
     * @param request {@link HttpServletRequest}
     * @param user the {@link LuteceUser}
     * @throws SiteMessageException the confirmation message
     */
    private void getDemandRemovingConfirmationMessage(HttpServletRequest request, LuteceUser user)
            throws SiteMessageException {
        String strIdDemand = request.getParameter(CRMConstants.PARAMETER_ID_DEMAND);
        String strWebAppCode = AppPropertiesService.getProperty(CRM_WEBB_APP_CODE_PROPERTY);
        CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());

        if ((crmUser != null) && StringUtils.isNotBlank(strIdDemand) && StringUtils.isNumeric(strIdDemand)) {
            int nIdDemand = Integer.parseInt(strIdDemand);
            Demand demand = _demandService.findByPrimaryKey(nIdDemand);

            if ((demand != null) && (demand.getIdStatusCRM() == 0)
                    && (crmUser.getIdCRMUser() == demand.getIdCRMUser())) {
                // Check the existence of the demand and the owner of the demand is indeed the current user and the demand is not validated
                DemandType demandType = _demandTypeService.findByPrimaryKey(demand.getIdDemandType());

                if (demandType != null) {
                    String strData = demand.getData().replace("\"", "'");

                    List<String> listElements = new ArrayList<String>();
                    listElements.add(Integer.toString(nIdDemand));
                    if (StringUtils.isNotBlank(strWebAppCode)) {
                        listElements.add(strWebAppCode);
                    }

                    String strTimestamp = Long.toString(new Date().getTime());
                    String strSignature = CRMRequestAuthenticatorService.getRequestAuthenticatorForUrl()
                            .buildSignature(listElements, strTimestamp);

                    StringBuilder sbUrlReturn = new StringBuilder(AppPathService.getBaseUrl(request));

                    if (!sbUrlReturn.toString().endsWith(CRMConstants.SLASH)) {
                        sbUrlReturn.append(CRMConstants.SLASH);
                    }

                    sbUrlReturn.append(JSP_SITE + JSP_PORTAL);

                    UrlItem urlReturn = new UrlItem(sbUrlReturn.toString());
                    urlReturn.addParameter(CRMConstants.PARAMETER_PAGE, CRMPlugin.PLUGIN_NAME);

                    UrlItem url = new UrlItem(demandType.getUrlResource());
                    url.addParameter(CRMConstants.PARAMETER_ACTION, CRMConstants.ACTION_REMOVE_DRAFT);
                    url.addParameter(CRMConstants.PARAMETER_ID_DEMAND, nIdDemand);
                    url.addParameter(CRMConstants.PARAMETER_TIMESTAMP, strTimestamp);
                    url.addParameter(CRMConstants.PARAMETER_SIGNATURE, strSignature);
                    url.addParameter(CRMConstants.PARAMETER_DEMAND_DATA, strData);
                    url.addParameter(CRMConstants.PARAMETER_URL_RETURN, urlReturn.getUrl());
                    if (StringUtils.isNotBlank(strWebAppCode)) {
                        url.addParameter(CRMConstants.PARAMETER_CRM_WEBB_APP_CODE, strWebAppCode);
                    }
                    SiteMessageService.setMessage(request, CRMConstants.MESSAGE_CONFIRM_REMOVE_DEMAND,
                            SiteMessage.TYPE_CONFIRMATION, url.getUrl());
                }
            }
        }
    }

    /**
     * Create a CRM account if the current user does not have one
     * @param user the LuteceUser
     */
    private void createOrUpdateCRMAccount(LuteceUser user) {
        if (user != null) {

            CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());

            if (crmUser == null) {
                crmUser = new CRMUser();
                crmUser.setUserGuid(user.getName());
                crmUser.setStatus(CRMUser.STATUS_ACTIVATED);

                Map<String, String> userAttributes = new HashMap<String, String>();

                for (String strUserAttributeKey : _crmUserAttributesService.getUserAttributeKeys()) {
                    userAttributes.put(strUserAttributeKey, user.getUserInfo(strUserAttributeKey));
                }

                crmUser.setUserAttributes(userAttributes);
                _crmUserService.create(crmUser);
            } else if (crmUser.isMustBeUpdated()) {
                crmUser.setMustBeUpdated(false);
                crmUser.setStatus(CRMUser.STATUS_ACTIVATED);
                Map<String, String> userAttributes = new HashMap<String, String>();
                for (String strUserAttributeKey : _crmUserAttributesService.getUserAttributeKeys()) {
                    userAttributes.put(strUserAttributeKey, user.getUserInfo(strUserAttributeKey));
                }

                crmUser.setUserAttributes(userAttributes);
                _crmUserService.update(crmUser);

            }
        }
    }

    /**
     * Do open a demand type
     * @param request the HTTP request
     * @return the resource url of the demand type
     */
    public String doOpenDemandType(HttpServletRequest request) {
        String strUrl = AppPathService.getBaseUrl(request);
        LuteceUser user;
        String strWebAppCode = AppPropertiesService.getProperty(CRM_WEBB_APP_CODE_PROPERTY);
        try {

            String strIdDemandType = request.getParameter(CRMConstants.PARAMETER_ID_DEMAND_TYPE);
            CRMUser crmUser = null;

            if (StringUtils.isNotBlank(strIdDemandType) && StringUtils.isNumeric(strIdDemandType)) {

                int nIdDemandType = Integer.parseInt(strIdDemandType);
                DemandType demandType = _demandTypeService.findByPrimaryKey(nIdDemandType);

                if ((demandType != null) && demandType.isOpen()) {

                    if (demandType.isIncludeIdCrmUser()) {
                        user = getUser(request);
                        crmUser = _crmUserService.findByUserGuid(user.getName());
                        //if crm user does not exist create crm user
                        if (user != null && crmUser == null) {
                            crmUser = new CRMUser();
                            crmUser.setUserGuid(user.getName());
                            crmUser.setMustBeUpdated(true);
                            crmUser.setIdCRMUser(_crmUserService.create(crmUser));
                        }

                    }

                    List<String> listElements = new ArrayList<String>();

                    listElements.add(Integer.toString(demandType.getIdDemandType()));
                    if (demandType.isIncludeIdCrmUser()) {
                        listElements.add(Integer.toString(crmUser.getIdCRMUser()));

                    }

                    if (StringUtils.isNotBlank(strWebAppCode)) {
                        listElements.add(strWebAppCode);
                    }

                    String strTimestamp = Long.toString(new Date().getTime());
                    String strSignature = CRMRequestAuthenticatorService.getRequestAuthenticatorForUrl()
                            .buildSignature(listElements, strTimestamp);

                    UrlItem url = new UrlItem(demandType.getUrlResource());
                    url.addParameter(CRMConstants.PARAMETER_ID_DEMAND_TYPE, demandType.getIdDemandType());
                    if (demandType.isIncludeIdCrmUser()) {
                        url.addParameter(CRMConstants.PARAMETER_ID_CRM_USER, crmUser.getIdCRMUser());
                    }
                    if (StringUtils.isNotBlank(strWebAppCode)) {
                        url.addParameter(CRMConstants.PARAMETER_CRM_WEBB_APP_CODE, strWebAppCode);
                    }

                    url.addParameter(CRMConstants.PARAMETER_TIMESTAMP, strTimestamp);
                    url.addParameter(CRMConstants.PARAMETER_SIGNATURE, strSignature);

                    strUrl = url.getUrl();
                }
            }
        } catch (UserNotSignedException e) {
            strUrl = PortalJspBean.redirectLogin(request);
        }

        return strUrl;
    }

    /**
     * Do edit a demand
     * @param request the HTTP request
     * @return the url resource to edit the resource
     */
    public String doEditDemand(HttpServletRequest request) {
        String strUrl = AppPathService.getBaseUrl(request);
        LuteceUser user;
        String strWebAppCode = AppPropertiesService.getProperty(CRM_WEBB_APP_CODE_PROPERTY);
        try {
            user = getUser(request);

            CRMUser crmUser = _crmUserService.findByUserGuid(user.getName());
            String strIdDemand = request.getParameter(CRMConstants.PARAMETER_ID_DEMAND);

            if ((crmUser != null) && StringUtils.isNotBlank(strIdDemand) && StringUtils.isNumeric(strIdDemand)) {
                int nIdDemand = Integer.parseInt(strIdDemand);
                Demand demand = _demandService.findByPrimaryKey(nIdDemand);

                if ((demand != null) && (crmUser.getIdCRMUser() == demand.getIdCRMUser())
                        && (demand.getIdStatusCRM() == 0)) {
                    DemandType demandType = _demandTypeService.findByPrimaryKey(demand.getIdDemandType());

                    if ((demandType != null) && demandType.isOpen()) {
                        List<String> listElements = new ArrayList<String>();
                        listElements.add(Integer.toString(demand.getIdDemand()));
                        if (StringUtils.isNotBlank(strWebAppCode)) {
                            listElements.add(strWebAppCode);
                        }
                        String strTimestamp = Long.toString(new Date().getTime());
                        String strSignature = CRMRequestAuthenticatorService.getRequestAuthenticatorForUrl()
                                .buildSignature(listElements, strTimestamp);

                        UrlItem url = new UrlItem(demandType.getUrlResource());
                        url.addParameter(CRMConstants.PARAMETER_ID_DEMAND, demand.getIdDemand());
                        if (StringUtils.isNotBlank(strWebAppCode)) {
                            url.addParameter(CRMConstants.PARAMETER_CRM_WEBB_APP_CODE, strWebAppCode);
                        }
                        url.addParameter(CRMConstants.PARAMETER_DEMAND_DATA, demand.getData());
                        url.addParameter(CRMConstants.PARAMETER_TIMESTAMP, strTimestamp);
                        url.addParameter(CRMConstants.PARAMETER_SIGNATURE, strSignature);

                        strUrl = url.getUrl();
                    }
                }
            }
        } catch (UserNotSignedException e) {
            strUrl = PortalJspBean.redirectLogin(request);
        }

        return strUrl;
    }

    /**
    * Gets the user from the request
    * @param request The HTTP user
    * @return The Lutece User
    * @throws UserNotSignedException exception if user not connected
    */
    public LuteceUser getUser(HttpServletRequest request) throws UserNotSignedException {
        if (SecurityService.isAuthenticationEnable()) {
            LuteceUser user = SecurityService.getInstance().getRemoteUser(request);
            if (user == null) {
                throw new UserNotSignedException();
            }
            return user;
        } else {
            throw new PageNotFoundException();
        }
    }

    /**
     * Get the list of all the opened demand types only
     * @return the list of opened demand types
     */
    private List<DemandType> initListAllOpenedDemandType() {
        List<DemandType> listAllDemandType = _demandTypeService.findAll();
        List<DemandType> listAllOpenedDemandType = new ArrayList<DemandType>();

        for (DemandType demandType : listAllDemandType) {
            if (demandType.isOpen()) {
                listAllOpenedDemandType.add(demandType);
            }
        }

        return listAllOpenedDemandType;
    }

    /**
     * Check the format of the filter modification date
     * @throws SiteMessageException
     */
    private Date checkFormatModificationDateFilter(String strModificationDate, HttpServletRequest request)
            throws SiteMessageException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(true);

        Date d = new Date();

        try {
            d = sdf.parse(strModificationDate);
        } catch (Exception e) {
            SiteMessageService.setMessage(request, CRMConstants.MESSAGE_INVALID_FORMAT_DATE_MODIFICATION);
        }

        String t = sdf.format(d);

        if (t.compareTo(strModificationDate) != 0) {
            SiteMessageService.setMessage(request, CRMConstants.MESSAGE_INVALID_FORMAT_DATE_MODIFICATION);
        }

        return d;
    }
}