com.alkacon.opencms.v8.documentcenter.CmsShowDocumentCenter.java Source code

Java tutorial

Introduction

Here is the source code for com.alkacon.opencms.v8.documentcenter.CmsShowDocumentCenter.java

Source

/*
 * File   : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.documentcenter/src/com/alkacon/opencms/documentcenter/CmsShowDefaultFile.java,v $
 * Date   : $Date: 2010/03/19 15:31:13 $
 * Version: $Revision: 1.3 $
 *
 * This file is part of the Alkacon OpenCms Add-On Module Package
 *
 * Copyright (c) 2010 Alkacon Software GmbH (http://www.alkacon.com)
 *
 * The Alkacon OpenCms Add-On Module Package is free software: 
 * you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * The Alkacon OpenCms Add-On Module Package is distributed 
 * in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with the Alkacon OpenCms Add-On Module Package.  
 * If not, see http://www.gnu.org/licenses/.
 *
 * For further information about Alkacon Software GmbH, please see the
 * company website: http://www.alkacon.com.
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org.
 */

package com.alkacon.opencms.v8.documentcenter;

import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.I_CmsResourceInit;
import org.opencms.main.OpenCms;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.xml.containerpage.CmsContainerElementBean;
import org.opencms.xml.containerpage.CmsContainerPageBean;
import org.opencms.xml.containerpage.CmsXmlContainerPage;
import org.opencms.xml.containerpage.CmsXmlContainerPageFactory;
import org.opencms.xml.content.CmsXmlContent;
import org.opencms.xml.content.CmsXmlContentFactory;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;

/**
 * The document center resource handler.<p>
 * 
 * This handler checks the presence of a document center element on a container page
 * and handles requests to folders and files of the center.<p>
 *
 * @author  Andreas Zahner 
 * 
 * @version $Revision: 1.3 $ 
 * 
 * @since 8.0.0 
 */
public class CmsShowDocumentCenter implements I_CmsResourceInit {

    /** Value for the session variable when disclaimer was accepted. */
    public static final String ACCEPTED_VALUE = "true";

    /** Disclaimer property name. */
    public static final String DISCLAIMER_PROPERTY = "disclaimer_page";

    /** The log object for this class. */
    private static final Log LOG = CmsLog.getLog(CmsShowDocumentCenter.class);

    /**
     * Sets the request attributes to make the document center work
     * 
     * @param startPath the start path of the document center
     * @param inDocPath the relative path to the current document or folder
     * @param req the current request
     * 
     * @return the absolute VFS path to the document center folder or file to show
     */
    public static String setDocumentCenterAttributes(String startPath, String inDocPath, HttpServletRequest req) {

        startPath = CmsFileUtil.removeTrailingSeparator(startPath);
        // set document center start path
        req.setAttribute(CmsDocumentFrontend.ATTR_STARTPATH, startPath);
        // set relative path to document folder
        req.setAttribute(CmsDocumentFrontend.ATTR_PATHPART, inDocPath);
        // set full VFS path to document folder
        String docPath = startPath + inDocPath;
        req.setAttribute(CmsDocumentFrontend.ATTR_FULLPATH, docPath);
        return docPath;
    }

    /**
     * Checks if a disclaimer has to be shown for the requested document URI.<p>
     * 
     * @param requestedDocumentUri the URI of the document to check
     * @param cms the current users context
     * @param req the current request
     * 
     * @return <code>true</code> if a disclaimer should be shown, otherwise <code>false</code>
     */
    protected boolean checkDisclaimer(String requestedDocumentUri, CmsObject cms, HttpServletRequest req) {

        boolean result = false;
        String disclaimer = null;

        try {
            disclaimer = cms.readPropertyObject(requestedDocumentUri, DISCLAIMER_PROPERTY, true).getValue();
        } catch (CmsException e) {
            // do nothing
        }

        if (disclaimer != null) {
            // found disclaimer property, eventually show other file
            LOG.debug(DISCLAIMER_PROPERTY + ": " + disclaimer);

            if (cms.existsResource(disclaimer)) {
                // get the HTTP session
                HttpSession session = req.getSession();
                // get the value of the session attribute according to the requested resource
                String accepted = (String) session.getAttribute(disclaimer);

                LOG.debug("Session Attribute " + disclaimer + ": " + accepted);

                // disclaimer has not been accepted, show disclaimer page
                if (!ACCEPTED_VALUE.equals(accepted)) {
                    result = true;
                    req.setAttribute(CmsDocumentFrontend.ATTR_DISCLAIMER, disclaimer);
                }
            } else {
                // specified disclaimer page does not exist
                LOG.error("Error reading disclaimer page '" + disclaimer);
            }
        }
        return result;
    }

    /**
     * @see org.opencms.main.I_CmsResourceInit#initResource(org.opencms.file.CmsResource, org.opencms.file.CmsObject, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    public CmsResource initResource(CmsResource resource, CmsObject cms, HttpServletRequest req,
            HttpServletResponse res) {

        // search only when file is null!
        if (resource == null) {
            // get the requested URI
            String uri = cms.getRequestContext().getUri();
            if (uri.startsWith(CmsResource.VFS_FOLDER_SYSTEM)) {
                // don't show the system folder!
                return null;
            }
            if (cms.existsResource(uri)) {
                // resource does exist, check if disclaimer should be shown
                checkDisclaimer(uri, cms, req);
                return null;
            }

            // cut the site root from the URI if it is there already
            String siteRoot = OpenCms.getSiteManager().getSiteRoot(uri);
            if (siteRoot != null) {
                uri = uri.substring(siteRoot.length());
            } else {
                siteRoot = "";
            }

            // split the requested path in parts
            List<String> pathParts = CmsStringUtil.splitAsList(uri, '/');
            try {
                String fullPath = siteRoot;
                String prevPath = fullPath;
                for (String pathPart : pathParts) {
                    prevPath = fullPath;
                    fullPath += "/" + pathPart;
                    if (!cms.existsResource(fullPath)) {
                        // found non-existing path part, check last existing for document center property
                        String docCenterMarker = cms.readPropertyObject(prevPath,
                                CmsDocumentFactory.PROPERTY_DOCCENTER_STARTFOLDER, false).getValue();
                        if (CmsStringUtil.isNotEmpty(docCenterMarker)) {
                            // we have a doc center here, first read default file of the current folder
                            CmsResource result = cms.readDefaultFile(prevPath);
                            if (result != null) {
                                // get the start path from the container page containing the document center element
                                String startPath = getDocumentCenterStartPath(result, cms);
                                // calculate path to document
                                String inDocPath = (siteRoot + uri).substring(prevPath.length());
                                String fullDocPath = cms.getRequestContext()
                                        .removeSiteRoot(setDocumentCenterAttributes(startPath, inDocPath, req));
                                if (!cms.existsResource(fullDocPath)) {
                                    // the document does not exist, stop and return
                                    return null;
                                }
                                if (!checkDisclaimer(fullDocPath, cms, req) && !CmsResource.isFolder(inDocPath)) {
                                    // no disclaimer to show, the document has to be shown
                                    result = cms.readResource(fullDocPath);
                                }
                                // set URI to requested document or container page
                                cms.getRequestContext().setUri(cms.getSitePath(result));
                                return result;
                            }
                        }
                        // no need to continue loop here 
                        return null;
                    }
                }
            } catch (CmsException e) {
                // ignore this exception
            } catch (UnsupportedOperationException e2) {
                // ignore this exception
            }
        }
        return resource;
    }

    /**
     * Returns the start folder of the document center that is configured in an element of the given resource.<p>
     * 
     * The resource has to be a container page.<p>
     * 
     * @param resource the resource to look up the document center start path
     * @param cms the current users context
     * 
     * @return the start folder of the document center
     * 
     * @throws CmsException if something goes wrong
     */
    private String getDocumentCenterStartPath(CmsResource resource, CmsObject cms) throws CmsException {

        // get the container page to fetch the document center configuration
        CmsXmlContainerPage cPage = CmsXmlContainerPageFactory.unmarshal(cms, resource);
        CmsContainerPageBean pageBean = cPage.getContainerPage(cms, cms.getRequestContext().getLocale());
        if (pageBean != null) {
            // found the page bean, look up document center element
            List<CmsContainerElementBean> elements = pageBean.getElements();
            for (CmsContainerElementBean element : elements) {
                if (element.getResource() == null) {
                    element.initResource(cms);
                }
                if (element.getResource().getTypeId() == 269) {
                    // read the start folder from the document center configuration
                    CmsXmlContent docConfig = CmsXmlContentFactory.unmarshal(cms,
                            cms.readFile(element.getResource()));
                    return docConfig.getStringValue(cms, "Folder", cms.getRequestContext().getLocale());
                }
            }
        }
        return "";
    }

}