/* * File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.documentcenter/src/com/alkacon/opencms/documentcenter/CmsXmlDocumentContent.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.CmsFile; import org.opencms.file.CmsObject; import org.opencms.file.CmsResource; import org.opencms.jsp.CmsJspActionElement; import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.util.CmsFileUtil; import org.opencms.xml.content.CmsXmlContent; import org.opencms.xml.content.CmsXmlContentFactory; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.apache.commons.logging.Log; /** * Helper class to get texts for Header, Footer, Disclaimer, DisclaimerDeclined and FolderEmpty out * of xml content of a default file. * * @author Peter Bonrad */ public class CmsXmlDocumentContent { /** The name of the default file where the xml content can be found. */ private static final String DEFAULT_FILE = "$default.html"; /** The name of the element in the xml document where the text for the disclaimer can be found. */ private static final String ELEMENT_DISCLAIMER = "Disclaimer"; /** The name of the element in the xml document where the text for the disclaimer declined can be found. */ private static final String ELEMENT_DISCLAIMER_DECLINED = "Disclaimer_Declined"; /** The name of the element in the xml document where the text for the folder empty text can be found. */ private static final String ELEMENT_FOLDEREMPTY = "FolderEmpty"; /** The name of the element in the xml document where the text for the footer can be found. */ private static final String ELEMENT_FOOTER = "Footer"; /** The name of the element in the xml document where the text for the header can be found. */ private static final String ELEMENT_HEADER = "Header"; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsXmlDocumentContent.class); /** The name of the property where the path with the default file can be found. */ private static final String PROPERTY_CONTENT_PATH = "docs.content"; /** The name of the property where the page to show the disclaimer can be found. */ private static final String PROPERTY_DISCLAIMER_PAGE = "disclaimer_page"; /** The id of the xml document. */ private static final int XMLDOCUMENT_TYPE = 268; /** The actual cms object. */ private CmsJspActionElement m_cms; /** * Creates a new CmsXmlDocumentContent.<p> * * @param cms the actual action element */ public CmsXmlDocumentContent(CmsJspActionElement cms) { m_cms = cms; } /** * Returns the text with the disclaimer. Takes the path out of the property of the disclaimer * and searches there (and all parent folder) for the default file. If found it returns the content * of the element "Disclaimer" or null if not found or an error occurs.<p> * * @return the text with the disclaimer or null if not found or on errors */ public String getDisclaimer() { String path = (String)m_cms.getRequest().getAttribute(CmsDocumentFrontend.ATTR_DISCLAIMER); if (path == null) { return null; } return getContentElement(null, ELEMENT_DISCLAIMER, true, CmsResource.getFolderPath(path)); } /** * Returns the text with the disclaimer declined. Takes the path out of the property of the disclaimer * and searches there (and all parent folder) for the default file. If found it returns the content * of the element "Disclaimer_Declined" or null if not found or an error occurs.<p> * * @return the text for the disclaimer declined or null if not found */ public String getDisclaimerDeclined() { String path = (String)m_cms.getRequest().getAttribute(CmsDocumentFrontend.ATTR_DISCLAIMER); if (path == null) { return null; } return getContentElement(null, ELEMENT_DISCLAIMER_DECLINED, true, CmsResource.getFolderPath(path)); } /** * Returns the text for the folder empty.<p> * * @return the text for the folder empty or null if not found */ public String getFolderEmpty() { return getContentElement(PROPERTY_CONTENT_PATH, ELEMENT_FOLDEREMPTY, true); } /** * Returns the text for the footer.<p> * * @return the text for the footer or null if not found */ public String getFooter() { return getContentElement(PROPERTY_CONTENT_PATH, ELEMENT_FOOTER, true); } /** * Returns the text for the header.<p> * * @return the text for the header or null if not found */ public String getHeader() { return getContentElement(PROPERTY_CONTENT_PATH, ELEMENT_HEADER, true); } /** * Looks in the list of paths for the default file and returns the text of the first found * element.<p> * * @param paths list of paths to search for a default file * @param elementName the name of the element in the default file * @return the text of the element of the default file or null if not found */ private String getContentElement(List<String> paths, String elementName) { Iterator<String> iter = paths.iterator(); while (iter.hasNext()) { String actPath = iter.next(); String text = getContentElement(elementName, actPath); if (text != null) { if (LOG.isDebugEnabled()) { LOG.debug("Found in: " + actPath); } return text; } if (LOG.isDebugEnabled()) { LOG.debug("NOT Found in: " + actPath); } } return null; } /** * Looks for the default file in the given path and returns the text in the given element.<p> * * @param elementName the name of the element * @param path the path to look for the default file * @return the text of the element or null if not found */ private String getContentElement(String elementName, String path) { // try to open the default file with the xml content of the disclaimer CmsXmlContent xmlContent = getDefaultXmlContent(path); if (xmlContent != null) { // get the locale to use Locale loc = m_cms.getRequestContext().getLocale(); return xmlContent.getStringValue(m_cms.getCmsObject(), elementName, loc); } return null; } /** * Looks for the default file and returns the text in the given element. If flag to search is false * then the element will only be searched in the folder specified in the property. If the flag is * true then the paths of the current folder up to the root folder of the document center will be * included in the search.<p> * * @param property the name of the property where the name of the folder to search in is defined * @param elementName the name of the element * @param search the flag to search only in folder specified by the property or to search in parent folders * @return the text of the element of the default file or null if not found */ private String getContentElement(String property, String elementName, boolean search) { if (LOG.isDebugEnabled()) { LOG.debug("Search: " + elementName); } List<String> paths = getFolderList(property, search); return getContentElement(paths, elementName); } /** * Looks for the default file and returns the text in the given element. If flag to search is false * then the element will only be searched in the folder specified in the property. If the flag is * true then the paths of the given searchRoot up to the root folder of the document center will be * included in the search.<p> * * @param property the name of the property where the name of the folder to search in is defined * @param elementName the name of the element * @param search the flag to search only in folder specified by the property or to search in parent folders * @param searchRoot the folder where to start the search for a default file * @return the text of the element of the default file or null if not found */ private String getContentElement(String property, String elementName, boolean search, String searchRoot) { if (LOG.isDebugEnabled()) { LOG.debug("Search: " + elementName); } List<String> paths = getFolderList(property, search, searchRoot); return getContentElement(paths, elementName); } /** * Returns the default file in the given path as an xml content. If default file is not * found or the file is of wrong type null will be returned.<p> * * @param path the path to look for the default file * @return the xml content or null if not found or incorrect type */ private CmsXmlContent getDefaultXmlContent(String path) { // check if given path is valid if (path == null) { return null; } // check if path ends with slash if (!path.endsWith("/")) { path += "/"; } try { // try to open the default file with the xml content of the disclaimer CmsResource res = m_cms.getCmsObject().readResource(path + DEFAULT_FILE); // check if found resource is from correct type if (res.getTypeId() != XMLDOCUMENT_TYPE) { return null; } // open the xml content and return element with disclaimer CmsObject cms = m_cms.getCmsObject(); CmsFile file = cms.readFile(res); CmsXmlContent xmlContent = CmsXmlContentFactory.unmarshal(cms, file); return xmlContent; } catch (CmsException ex) { return null; } } /** * Returns a list with all paths to look for a default file. The order is to first * look in the folder specified in the property and then in the actual path and all * parent folder up to the root folder of the document center.<p> * * @param property the name of the property where the name of the folder to search in is defined * @param search flag if to search in parent folders too * @return a list with all found paths to look for a default file */ private List<String> getFolderList(String property, boolean search) { return getFolderList( property, search, CmsFileUtil.addTrailingSeparator((String)m_cms.getRequest().getAttribute(CmsDocumentFrontend.ATTR_FULLPATH))); } /** * Returns a list with all paths to look for a default file. The order is to first * look in the folder specified in the property and then in the given startRoot and all * parent folder up to the root folder of the document center.<p> * * @param property the name of the property where the name of the folder to search in is defined * @param search flag if to search in parent folders too * @param searchRoot the directory where to start the search for the default file * @return a list with all found paths to look for a default file */ private List<String> getFolderList(String property, boolean search, String searchRoot) { ArrayList<String> ret = new ArrayList<String>(); // look for the path defined in the property String path = m_cms.property(property, "search", null); if (path != null) { ret.add(path); } // if value is not going to be searched return only folder of property if (!search) { return ret; } // check if searchRoot ends with slash if ((searchRoot != null) && (!searchRoot.endsWith("/"))) { searchRoot += "/"; } String docCenterStart = CmsFileUtil.addTrailingSeparator((String)m_cms.getRequest().getAttribute( CmsDocumentFrontend.ATTR_STARTPATH)); try { // add actual path and all parent paths up to the document center boolean next = true; String currentPath = searchRoot; while ((next) && (currentPath != null)) { if (!ret.contains(currentPath)) { ret.add(currentPath); } // check if current folder is already root folder of document center CmsResource currentRes = m_cms.getCmsObject().readResource(currentPath); if (currentPath.equals(docCenterStart)) { next = false; } currentPath = CmsResource.getParentFolder(currentPath); } // if current resource is not inside a document center only add folder from property if (next) { ret = new ArrayList<String>(); if (path != null) { ret.add(path); } } } catch (CmsException ex) { // do nothing } return ret; } }