/* * 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 02111R-1307 USA */ package org.opencms.jsp; import org.opencms.i18n.CmsMessageContainer; import org.opencms.main.CmsLog; import org.opencms.main.OpenCms; import org.opencms.util.CmsMacroResolver; import org.opencms.util.CmsStringUtil; import org.opencms.util.I_CmsMacroResolver; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.Tag; import org.apache.commons.logging.Log; /** * Used to access and display XML content item information from the VFS.<p> * * @since 6.0.0 */ public class CmsJspTagContentInfo extends CmsJspScopedVarBodyTagSuport implements I_CmsMacroResolver { /** The keys of the supported content info values. */ private static final String[] KEYS = { "resultSize", "resultIndex", "pageCount", "pageIndex", "pageSize", "pageNavStartIndex", "pageNavEndIndex", "pageNavLength"}; /** The keys of the supported content info values as a list. */ private static final List<String> KEYS_LIST = Collections.unmodifiableList(Arrays.asList(KEYS)); /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsJspTagContentInfo.class); /** Serial version UID required for safe serialization. */ private static final long serialVersionUID = -1955531050687258685L; /** The name of the content info's value that should be printed out. */ private String m_value; /** * @see javax.servlet.jsp.tagext.Tag#doEndTag() */ @Override public int doEndTag() { if (OpenCms.getSystemInfo().getServletContainerSettings().isReleaseTagsAfterEnd()) { // need to release manually, JSP container may not call release as required (happens with Tomcat) release(); } return EVAL_PAGE; } /** * @see javax.servlet.jsp.tagext.Tag#doStartTag() */ @Override public int doStartTag() throws JspException { // get a reference to the parent "content container" class Tag ancestor = findAncestorWithClass(this, I_CmsResourceContainer.class); if (ancestor == null) { // build a container CmsMessageContainer container = Messages.get().container(Messages.ERR_PARENTLESS_TAG_1, "contentinfo"); String msg = Messages.getLocalizedMessage(container, pageContext); throw new JspTagException(msg); } I_CmsResourceContainer contentContainer = (I_CmsResourceContainer)ancestor; String tagContent = ""; if (isScopeVarSet()) { if (contentContainer instanceof CmsJspTagContentLoad) { storeContentInfoBean((CmsJspTagContentLoad)contentContainer); } else if (contentContainer instanceof CmsJspTagResourceLoad) { storeContentInfoBean((CmsJspTagResourceLoad)contentContainer); } } if (CmsStringUtil.isNotEmpty(m_value)) { // value is provided - resolve macros tagContent = resolveMacros(m_value); } try { pageContext.getOut().print(tagContent); } catch (IOException e) { CmsMessageContainer message = Messages.get().container(Messages.ERR_PROCESS_TAG_1, "contentinfo"); LOG.error(message.key(), e); throw new JspException(message.key(pageContext.getRequest().getLocale())); } return SKIP_BODY; } /** * @see org.opencms.util.I_CmsMacroResolver#getMacroValue(java.lang.String) */ public String getMacroValue(String macro) { int dotIndex = macro.indexOf('.'); String beanName = null; if ((dotIndex > 1) && (dotIndex < (macro.length() - 1))) { beanName = macro.substring(0, dotIndex); } else { return null; } String variableName = macro.substring(dotIndex + 1, macro.length()); if (CmsStringUtil.isEmpty(beanName) || CmsStringUtil.isEmpty(variableName)) { return null; } // extract bean from page context CmsContentInfoBean bean; int scope = pageContext.getAttributesScope(beanName); try { bean = (CmsContentInfoBean)pageContext.getAttribute(beanName, scope); } catch (ClassCastException e) { // attribute exists but is not of required class return null; } if (bean == null) { return null; } switch (KEYS_LIST.indexOf(variableName)) { case 0: // "resultSize" return Integer.toString(bean.getResultSize()); case 1: // "resultIndex" return Integer.toString(bean.getResultIndex()); case 2: // "pageCount" return Integer.toString(bean.getPageCount()); case 3: // "pageIndex" return Integer.toString(bean.getPageIndex()); case 4: // "pageSize" return Integer.toString(bean.getPageSize()); case 5: // pageNavStartIndex return Integer.toString(bean.getPageNavStartIndex()); case 6: // pageNavEndIndex return Integer.toString(bean.getPageNavEndIndex()); case 7: // pageNavLength return Integer.toString(bean.getPageNavLength()); default: // unknown value return null; } } /** * Returns the name of the content info's value that should be printed out.<p> * * @return the name of the content info's value that should be printed out */ public String getValue() { return m_value; } /** * @see org.opencms.util.I_CmsMacroResolver#isKeepEmptyMacros() */ public boolean isKeepEmptyMacros() { return true; } /** * @see javax.servlet.jsp.tagext.Tag#release() */ @Override public void release() { m_value = null; super.release(); } /** * @see org.opencms.util.I_CmsMacroResolver#resolveMacros(java.lang.String) */ public String resolveMacros(String input) { return CmsMacroResolver.resolveMacros(input, this); } /** * Sets the name of the content info's value that should be printed out.<p> * * @param value the name of the content info's value that should be printed out */ public void setValue(String value) { m_value = value; } /** * Stores the container's content info bean in the page context.<p> * * @param container the parent container */ protected void storeContentInfoBean(CmsJspTagResourceLoad container) { CmsContentInfoBean contentInfoBean = container.getContentInfoBean(); contentInfoBean.setPageSize(container.getContentInfoBean().getPageSize()); contentInfoBean.setPageIndex(container.getContentInfoBean().getPageIndex()); contentInfoBean.setResultSize(container.getContentInfoBean().getResultSize()); storeAttribute(contentInfoBean); } }