fr.paris.lutece.portal.web.xpages.SiteMapApp.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.portal.web.xpages.SiteMapApp.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.portal.web.xpages;

import fr.paris.lutece.portal.business.XmlContent;
import fr.paris.lutece.portal.business.page.Page;
import fr.paris.lutece.portal.business.page.PageHome;
import fr.paris.lutece.portal.business.portalcomponent.PortalComponentHome;
import fr.paris.lutece.portal.business.style.ModeHome;
import fr.paris.lutece.portal.business.stylesheet.StyleSheet;
import fr.paris.lutece.portal.service.html.XmlTransformerService;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.plugin.Plugin;
import fr.paris.lutece.portal.service.portal.PortalService;
import fr.paris.lutece.portal.service.security.LuteceUser;
import fr.paris.lutece.portal.service.security.SecurityService;
import fr.paris.lutece.portal.service.util.AppPathService;
import fr.paris.lutece.portal.web.admin.AdminPageJspBean;
import fr.paris.lutece.util.xml.XmlUtil;

import org.apache.commons.lang.StringUtils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

/**
 * This class provides the map of the pages on the site
 */
public class SiteMapApp implements XPageApplication {
    /**
     * Serial version UID
     */
    private static final long serialVersionUID = 1799476496018552101L;
    private static final int PORTAL_COMPONENT_SITE_MAP_ID = 6;
    private static final int MODE_NORMAL = 0;
    private static final int MODE_ADMIN = 1;
    private static final String PARAMETER_SITE_PATH = "site-path";
    private static final String MARKER_TARGET = "target";
    private static final String TARGET_TOP = "target='_top'";
    private static final String PROPERTY_SERVICE_NAME = "portal.site.serviceName.siteMapService";
    private static final String PROPERTY_PATH_LABEL = "portal.site.site_map.pathLabel";
    private static final String PROPERTY_PAGE_TITLE = "portal.site.site_map.pageTitle";

    /**
     * Creates a new SiteMapPage object
     */
    public SiteMapApp() {
    }

    /**
     * Returns the localized service name
     * @param locale The locale
     * @return The localized service name
     */
    public String getName(Locale locale) {
        return I18nService.getLocalizedString(PROPERTY_SERVICE_NAME, locale);
    }

    /**
     * Build or get in the cache the page which contains the site map depending
     * on the mode
     *
     * @param request The Http request
     * @param nMode The selected mode
     * @param plugin The plugin
     * @return The content of the site map
     */
    @Override
    public XPage getPage(HttpServletRequest request, int nMode, Plugin plugin) {
        XPage page = new XPage();
        String strKey = getKey(nMode, request);

        Locale locale = request.getLocale();

        SiteMapCacheService siteMapCacheService = SiteMapCacheService.getInstance();

        // Check the key in the cache
        String strCachedPage = siteMapCacheService.isCacheEnable()
                ? (String) siteMapCacheService.getFromCache(strKey)
                : null;

        if (strCachedPage == null) {
            // Build the HTML document
            String strPage = buildPageContent(nMode, request);

            // Add it to the cache
            if (siteMapCacheService.isCacheEnable()) {
                synchronized (strKey) {
                    siteMapCacheService.putInCache(strKey, strPage);
                }
            }

            page.setPathLabel(I18nService.getLocalizedString(PROPERTY_PATH_LABEL, locale));
            page.setTitle(I18nService.getLocalizedString(PROPERTY_PAGE_TITLE, locale));
            page.setContent(strPage);

            return page;
        }

        // The document exist in the cache
        page.setPathLabel(I18nService.getLocalizedString(PROPERTY_PATH_LABEL, locale));
        page.setTitle(I18nService.getLocalizedString(PROPERTY_PAGE_TITLE, locale));
        page.setContent(strCachedPage);

        return page;
    }

    /**
     * Gets the cache key
     * @param nMode The mode
     * @param request The HTTP request
     * @return The key
     */
    private String getKey(int nMode, HttpServletRequest request) {
        String strRoles = "-";

        if (SecurityService.isAuthenticationEnable()) {
            LuteceUser user = SecurityService.getInstance().getRegisteredUser(request);

            if ((user != null) && (user.getRoles() != null)) {
                String[] roles = user.getRoles();
                Arrays.sort(roles);
                strRoles = StringUtils.join(roles, ',');
            }
        }

        return "[m:" + nMode + "][roles:" + strRoles + "]";
    }

    /**
     * Build an XML document containing the arborescence of the site pages and
     * transform it with the stylesheet
     * combined with the mode
     * @param nMode The selected mode
     * @param request The HttpServletRequest
     * @return The content of the site map
     */
    private String buildPageContent(int nMode, HttpServletRequest request) {
        StringBuffer strArborescenceXml = new StringBuffer();
        strArborescenceXml.append(XmlUtil.getXmlHeader());

        int nLevel = 0;
        findPages(strArborescenceXml, PortalService.getRootPageId(), nLevel, request);

        // Added in v1.3
        // Use the same stylesheet for normal or admin mode
        StyleSheet xslSource;

        switch (nMode) {
        case MODE_NORMAL:
        case MODE_ADMIN:
            xslSource = PortalComponentHome.getXsl(PORTAL_COMPONENT_SITE_MAP_ID, MODE_NORMAL);

            break;

        default:
            xslSource = PortalComponentHome.getXsl(PORTAL_COMPONENT_SITE_MAP_ID, nMode);

            break;
        }

        // Added in v1.3
        // Add a path param for choose url to use in admin or normal mode
        Map<String, String> mapParamRequest = new HashMap<String, String>();

        if (nMode != MODE_ADMIN) {
            mapParamRequest.put(PARAMETER_SITE_PATH, AppPathService.getPortalUrl());
        } else {
            mapParamRequest.put(PARAMETER_SITE_PATH, AppPathService.getAdminPortalUrl());
            mapParamRequest.put(MARKER_TARGET, TARGET_TOP);
        }

        Properties outputProperties = ModeHome.getOuputXslProperties(nMode);

        XmlTransformerService xmlTransformerService = new XmlTransformerService();

        return xmlTransformerService.transformBySourceWithXslCache(strArborescenceXml.toString(), xslSource,
                mapParamRequest, outputProperties);
    }

    /**
     * Build recursively the XML document containing the arborescence of the
     * site pages
     * @param strXmlArborescence The buffer in which adding the current page of
     *            the arborescence
     * @param nPageId The current page of the recursive course
     * @param nLevel The depth level of the page in the arborescence
     * @param request The HttpServletRequest
     */
    private void findPages(StringBuffer strXmlArborescence, int nPageId, int nLevel, HttpServletRequest request) {
        Page page = PageHome.getPage(nPageId);

        if (page.isVisible(request)) {
            XmlUtil.beginElement(strXmlArborescence, XmlContent.TAG_PAGE);
            XmlUtil.addElement(strXmlArborescence, XmlContent.TAG_PAGE_ID, page.getId());
            XmlUtil.addElementHtml(strXmlArborescence, XmlContent.TAG_PAGE_NAME, page.getName());
            XmlUtil.addElement(strXmlArborescence, XmlContent.TAG_PAGE_DESCRIPTION, page.getDescription());
            XmlUtil.addElement(strXmlArborescence, XmlContent.TAG_PAGE_LEVEL, nLevel);

            AdminPageJspBean adminPage = new AdminPageJspBean();

            if (page.getImageContent() != null) {
                int nImageLength = page.getImageContent().length;

                if (nImageLength >= 1) {
                    String strPageId = Integer.toString(page.getId());
                    XmlUtil.addElement(strXmlArborescence, XmlContent.TAG_PAGE_IMAGE,
                            adminPage.getResourceImagePage(page, strPageId));
                }
            }

            XmlUtil.beginElement(strXmlArborescence, XmlContent.TAG_CHILD_PAGES_LIST);

            for (Page pageChild : PageHome.getChildPagesMinimalData(nPageId)) {
                findPages(strXmlArborescence, pageChild.getId(), nLevel + 1, request);
            }

            XmlUtil.endElement(strXmlArborescence, XmlContent.TAG_CHILD_PAGES_LIST);
            XmlUtil.endElement(strXmlArborescence, XmlContent.TAG_PAGE);
        }
    }
}