/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * 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 * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.jsp; import org.opencms.flex.CmsFlexController; import org.opencms.loader.I_CmsResourceLoader; import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.main.OpenCms; import org.opencms.util.CmsStringUtil; import org.opencms.xml.I_CmsXmlDocument; import org.opencms.xml.page.CmsXmlPageFactory; import java.util.List; import java.util.Locale; import javax.servlet.ServletRequest; import javax.servlet.jsp.tagext.BodyTagSupport; import org.apache.commons.logging.Log; /** * Used to select various template elements form a JSP template that * is included in another file.<p> * * @since 6.0.0 */ public class CmsJspTagTemplate extends BodyTagSupport { /** Serial version UID required for safe serialization. */ private static final long serialVersionUID = -3773247710025810438L; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsJspTagTemplate.class); /** Condition for element check. */ private boolean m_checkall; /** Condition for negative element check. */ private boolean m_checknone; /** Name of element. */ private String m_element; /** List of elements for element check. */ private String m_elementlist; /** * Internal action method.<p> * * @param element the selected element * @param elementlist list the list of elements to check * @param checkall flag to indicate that all elements should be checked * @param checknone flag to indicate that the check is done for nonexisting elements * @param req the current request * @return boolean <code>true</code> if this element should be inclued, <code>false</code> * otherwise */ public static boolean templateTagAction( String element, String elementlist, boolean checkall, boolean checknone, ServletRequest req) { if (elementlist != null) { CmsFlexController controller = CmsFlexController.getController(req); String filename = controller.getCmsObject().getRequestContext().getUri(); I_CmsXmlDocument content = null; try { content = CmsXmlPageFactory.unmarshal(controller.getCmsObject(), filename, req); } catch (CmsException e) { LOG.error(Messages.get().getBundle().key(Messages.ERR_XML_DOCUMENT_UNMARSHAL_1, filename), e); } if (content != null) { String absolutePath = controller.getCmsObject().getSitePath(content.getFile()); // check the elements in the elementlist, if the check fails don't render the element String[] elements = CmsStringUtil.splitAsArray(elementlist, ','); boolean found = false; for (int i = 0; i < elements.length; i++) { String el = elements[i].trim(); List<Locale> locales = content.getLocales(el); Locale locale = null; if ((locales != null) && (locales.size() != 0)) { locale = OpenCms.getLocaleManager().getBestMatchingLocale( controller.getCmsObject().getRequestContext().getLocale(), OpenCms.getLocaleManager().getDefaultLocales(controller.getCmsObject(), absolutePath), locales); } if ((locale != null) && content.hasValue(el, locale) && content.isEnabled(el, locale)) { found = true; if (!checkall) { // found at least an element that is available break; } } else { if (checkall) { // found at least an element that is not available return false; } } } if (!found && !checknone) { // no element found while checking for existing elements return false; } else if (found && checknone) { // element found while checking for nonexisting elements return false; } } } // otherwise, check if an element was defined and if its equal to the desired element String param = req.getParameter(I_CmsResourceLoader.PARAMETER_ELEMENT); return ((element == null) || (param == null) || (param.equals(element))); } /** * @see javax.servlet.jsp.tagext.Tag#doStartTag() */ @Override public int doStartTag() { if (templateTagAction(m_element, m_elementlist, m_checkall, m_checknone, pageContext.getRequest())) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } /** * Returns the selected element.<p> * * @return the selected element */ public String getElement() { return m_element != null ? m_element : ""; } /** * Returns the list of elements to check.<p> * * @return the list of elements */ public String getIfexists() { return m_elementlist != null ? m_elementlist : ""; } /** * Returns the list of elements to check.<p> * * @return the list of elements */ public String getIfexistsall() { return m_elementlist != null ? m_elementlist : ""; } /** * Returns the list of elements to check.<p> * * @return the list of elements */ public String getIfexistsnone() { return m_elementlist != null ? m_elementlist : ""; } /** * Returns the list of elements to check.<p> * * @return the list of elements */ public String getIfexistsone() { return m_elementlist != null ? m_elementlist : ""; } /** * @see javax.servlet.jsp.tagext.Tag#release() */ @Override public void release() { super.release(); m_element = null; } /** * Sets the element target.<p> * * @param element the target to set */ public void setElement(String element) { if (element != null) { m_element = element.toLowerCase(); } } /** * Sets the list of elements to check.<p> * * @param elements the list of elements */ public void setIfexists(String elements) { if (elements != null) { m_elementlist = elements; m_checkall = false; m_checknone = false; } } /** * Sets the list of elements to check.<p> * * @param elements the list of elements */ public void setIfexistsall(String elements) { if (elements != null) { m_elementlist = elements; m_checkall = true; m_checknone = false; } } /** * Sets the list of elements to check.<p> * * @param elements the list of elements */ public void setIfexistsnone(String elements) { if (elements != null) { m_elementlist = elements; m_checkall = false; m_checknone = true; } } /** * Sets the list of elements to check.<p> * * @param elements the list of elements */ public void setIfexistsone(String elements) { if (elements != null) { m_elementlist = elements; m_checkall = false; m_checknone = false; } } }