cmsjspcontentaccessvaluewrapper.java
来自「找了很久才找到到源代码」· Java 代码 · 共 519 行 · 第 1/2 页
JAVA
519 行
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/jsp/util/CmsJspContentAccessValueWrapper.java,v $
* Date : $Date: 2007-08-21 14:02:10 $
* Version: $Revision: 1.6 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 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, 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.util;
import org.opencms.file.CmsObject;
import org.opencms.i18n.CmsLocaleManager;
import org.opencms.util.CmsConstantMap;
import org.opencms.util.CmsStringUtil;
import org.opencms.xml.CmsXmlUtils;
import org.opencms.xml.types.I_CmsXmlContentValue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.map.LazyMap;
/**
* Allows direct access to XML content values, with possible iteration of sub-nodes.<p>
*
* The implementation is optimized for performance and uses lazy initializing of the
* requested values as much as possible.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.6 $
*
* @since 7.0.2
*
* @see CmsJspContentAccessBean
* @see org.opencms.jsp.CmsJspTagContentAccess
*/
public final class CmsJspContentAccessValueWrapper {
/**
* Provides a Map with Booleans that
* indicate if a nested sub value (xpath) for the current value is available in the XML content.<p>
*/
public class CmsHasValueTransformer implements Transformer {
/**
* @see org.apache.commons.collections.Transformer#transform(java.lang.Object)
*/
public Object transform(Object input) {
return Boolean.valueOf(obtainContentValue().getDocument().hasValue(
createPath(input),
obtainContentValue().getLocale()));
}
}
/**
* Provides a Map which lets the user access nested sub value Lists from the current value,
* the input is assumed to be a String that represents an xpath in the XML content.<p>
*/
public class CmsValueListTransformer implements Transformer {
/**
* @see org.apache.commons.collections.Transformer#transform(java.lang.Object)
*/
public Object transform(Object input) {
List values = obtainContentValue().getDocument().getValues(
createPath(input),
obtainContentValue().getLocale());
List result = new ArrayList();
Iterator i = values.iterator();
while (i.hasNext()) {
// must iterate values from XML content and create wrapper for each
I_CmsXmlContentValue value = (I_CmsXmlContentValue)i.next();
result.add(createWrapper(obtainCmsObject(), value));
}
return result;
}
}
/**
* Provides a Map which lets the user a nested sub value from the current value,
* the input is assumed to be a String that represents an xpath in the XML content.<p>
*/
public class CmsValueTransformer implements Transformer {
/**
* @see org.apache.commons.collections.Transformer#transform(java.lang.Object)
*/
public Object transform(Object input) {
I_CmsXmlContentValue value = obtainContentValue().getDocument().getValue(
createPath(input),
obtainContentValue().getLocale());
return createWrapper(obtainCmsObject(), value);
}
}
/** Constant for the null (non existing) value. */
protected static final CmsJspContentAccessValueWrapper NULL_VALUE_WRAPPER = new CmsJspContentAccessValueWrapper();
/** The wrapped OpenCms user context. */
private CmsObject m_cms;
/** The wrapped XML content value. */
private I_CmsXmlContentValue m_contentValue;
/** Calculated hash code. */
private int m_hashCode;
/** The lazy initialized Map that checks if a value is available. */
private Map m_hasValue;
/** The lazy initialized value Map. */
private Map m_value;
/** The lazy initialized value list Map. */
private Map m_valueList;
/**
* Private constructor, used for creation of NULL constant value, use factory method to create instances.<p>
*
* @see #createWrapper(CmsObject, I_CmsXmlContentValue)
*/
private CmsJspContentAccessValueWrapper() {
this(null, null);
}
/**
* Private constructor, use factory method to create instances.<p>
*
* @param cms the current users OpenCms context
* @param value the value to warp
*
* @see #createWrapper(CmsObject, I_CmsXmlContentValue)
*/
private CmsJspContentAccessValueWrapper(CmsObject cms, I_CmsXmlContentValue value) {
// a null value is used for constant generation
m_cms = cms;
m_contentValue = value;
if ((m_contentValue == null) || m_contentValue.isSimpleType()) {
// maps must all be static
m_hasValue = CmsConstantMap.CONSTANT_BOOLEAN_FALSE_MAP;
m_value = CmsJspContentAccessBean.CONSTANT_NULL_VALUE_WRAPPER_MAP;
m_valueList = CmsConstantMap.CONSTANT_EMPTY_LIST_MAP;
}
}
/**
* Factory method to create a new XML content value wrapper.<p>
*
* In case either parameter is <code>null</code>, the {@link #NULL_VALUE_WRAPPER} is returned.<p>
*
* @param cms the current users OpenCms context
* @param value the value to warp
*
* @return a new content value wrapper instance, or <code>null</code> if any parameter is <code>null</code>
*/
public static CmsJspContentAccessValueWrapper createWrapper(CmsObject cms, I_CmsXmlContentValue value) {
if ((value != null) && (cms != null)) {
return new CmsJspContentAccessValueWrapper(cms, value);
}
// if no value is available,
return NULL_VALUE_WRAPPER;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof CmsJspContentAccessValueWrapper) {
// rely on hash code implementation for equals method
return hashCode() == ((CmsJspContentAccessValueWrapper)obj).hashCode();
}
return false;
}
/**
* Returns <code>true</code> in case this value actually exists in the XML content it was requested from.<p>
*
* Usage example on a JSP with the JSTL:<pre>
* <cms:contentload ... >
* <cms:contentaccess var="content" />
* <c:if test="${content.value['Link'].exists}" >
* The content has a "Link" value!
* </c:if>
* </cms:contentload></pre>
*
* @return <code>true</code> in case this value actually exists in the XML content it was requested from
*/
public boolean getExists() {
return m_contentValue != null;
}
/**
* Returns a lazy initialized Map that provides Booleans that
* indicate if a nested sub value (xpath) for the current value is available in the XML content.<p>
*
* The provided Map key is assumed to be a String that represents the relative xpath to the value.<p>
*
* In case the current value is not a nested XML content value, or the XML content value does not exist,
* the {@link CmsConstantMap#CONSTANT_BOOLEAN_FALSE_MAP} is returned.<p>
*
* Usage example on a JSP with the JSTL:<pre>
* <cms:contentload ... >
* <cms:contentaccess var="content" />
* <c:if test="${content.value['Link'].hasValue['Description']}" >
* The content has a "Description" value as sub element to the "Link" value!
* </c:if>
* </cms:contentload></pre>
*
* Please note that you can also test if a sub-value exists like this:<pre>
* <c:if test="${content.value['Link'].value['Description'].exists}" > ... </c:if></pre>
*
* @return a lazy initialized Map that provides Booleans that
* indicate if a sub value (xpath) for the current value is available in the XML content
*/
public Map getHasValue() {
if (m_hasValue == null) {
m_hasValue = LazyMap.decorate(new HashMap(), new CmsHasValueTransformer());
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?