lookuputil.java
来自「displaytag-1.0修正版」· Java 代码 · 共 231 行
JAVA
231 行
/**
* Licensed under the Artistic License; you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://displaytag.sourceforge.net/license.html
*
* THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.displaytag.util;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.servlet.jsp.PageContext;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.exception.ObjectLookupException;
/**
* Utility class with methods for object and properties retrieving.
* @author Fabrizio Giustina
* @version $Revision: 1.13 $ ($Author: fgiust $)
*/
public final class LookupUtil
{
/**
* logger.
*/
private static Log log = LogFactory.getLog(LookupUtil.class);
/**
* don't instantiate a LookupUtil.
*/
private LookupUtil()
{
// unused
}
/**
* Read an object from the pagecontext with the specified scope and eventually lookup a property in it.
* @param pageContext PageContext
* @param beanAndPropertyName String expression with bean name and attributes
* @param scope One of the following values:
* <ul>
* <li>PageContext.PAGE_SCOPE</li>
* <li>PageContext.REQUEST_SCOPE</li>
* <li>PageContext.SESSION_SCOPE</li>
* <li>PageContext.APPLICATION_SCOPE</li>
* </ul>
* @return Object
* @throws ObjectLookupException for errors while retrieving a property in the bean
*/
public static Object getBeanValue(PageContext pageContext, String beanAndPropertyName, int scope)
throws ObjectLookupException
{
if (beanAndPropertyName.indexOf(".") != -1)
{
// complex: property from a bean
String objectName = beanAndPropertyName.substring(0, beanAndPropertyName.indexOf("."));
String beanProperty = beanAndPropertyName.substring(beanAndPropertyName.indexOf(".") + 1);
Object beanObject;
if (log.isDebugEnabled())
{
log.debug("getBeanValue - bean: {" + objectName + "}, property: {" + beanProperty + "}");
}
// get the bean
beanObject = pageContext.getAttribute(objectName, scope);
// if null return
if (beanObject == null)
{
return null;
}
// go get the property
return getBeanProperty(beanObject, beanProperty);
}
// simple, only the javabean
if (log.isDebugEnabled())
{
log.debug("getBeanValue - bean: {" + beanAndPropertyName + "}");
}
return pageContext.getAttribute(beanAndPropertyName, scope);
}
/**
* <p>
* Returns the value of a property in the given bean.
* </p>
* <p>
* This method is a modificated version from commons-beanutils PropertyUtils.getProperty(). It allows intermediate
* nulls in expression without throwing exception (es. it doesn't throw an exception for the property
* <code>object.date.time</code> if <code>date</code> is null)
* </p>
* @param bean javabean
* @param name name of the property to read from the javabean
* @return Object
* @throws ObjectLookupException for errors while retrieving a property in the bean
*/
public static Object getBeanProperty(Object bean, String name) throws ObjectLookupException
{
if (log.isDebugEnabled())
{
log.debug("getProperty [" + name + "] on bean " + bean);
}
if (bean == null)
{
throw new IllegalArgumentException("No bean specified");
}
if (name == null)
{
throw new IllegalArgumentException("No name specified");
}
Object evalBean = bean;
String evalName = name;
try
{
int indexOfINDEXEDDELIM;
int indexOfMAPPEDDELIM;
int indexOfMAPPEDDELIM2;
int indexOfNESTEDDELIM;
while (true)
{
indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM);
indexOfMAPPEDDELIM = evalName.indexOf(PropertyUtils.MAPPED_DELIM);
indexOfMAPPEDDELIM2 = evalName.indexOf(PropertyUtils.MAPPED_DELIM2);
if (indexOfMAPPEDDELIM2 >= 0
&& indexOfMAPPEDDELIM >= 0
&& (indexOfNESTEDDELIM < 0 || indexOfNESTEDDELIM > indexOfMAPPEDDELIM))
{
indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM, indexOfMAPPEDDELIM2);
}
else
{
indexOfNESTEDDELIM = evalName.indexOf(PropertyUtils.NESTED_DELIM);
}
if (indexOfNESTEDDELIM < 0)
{
break;
}
String next = evalName.substring(0, indexOfNESTEDDELIM);
indexOfINDEXEDDELIM = next.indexOf(PropertyUtils.INDEXED_DELIM);
indexOfMAPPEDDELIM = next.indexOf(PropertyUtils.MAPPED_DELIM);
if (evalBean instanceof Map)
{
evalBean = ((Map) evalBean).get(next);
}
else if (indexOfMAPPEDDELIM >= 0)
{
evalBean = PropertyUtils.getMappedProperty(evalBean, next);
}
else if (indexOfINDEXEDDELIM >= 0)
{
evalBean = PropertyUtils.getIndexedProperty(evalBean, next);
}
else
{
evalBean = PropertyUtils.getSimpleProperty(evalBean, next);
}
if (evalBean == null)
{
log.debug("Null property value for '" + evalName.substring(0, indexOfNESTEDDELIM) + "'");
return null;
}
evalName = evalName.substring(indexOfNESTEDDELIM + 1);
}
indexOfINDEXEDDELIM = evalName.indexOf(PropertyUtils.INDEXED_DELIM);
indexOfMAPPEDDELIM = evalName.indexOf(PropertyUtils.MAPPED_DELIM);
if (evalBean instanceof Map)
{
evalBean = ((Map) evalBean).get(evalName);
}
else if (indexOfMAPPEDDELIM >= 0)
{
evalBean = PropertyUtils.getMappedProperty(evalBean, evalName);
}
else if (indexOfINDEXEDDELIM >= 0)
{
evalBean = PropertyUtils.getIndexedProperty(evalBean, evalName);
}
else
{
evalBean = PropertyUtils.getSimpleProperty(evalBean, evalName);
}
}
catch (IllegalAccessException e)
{
throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
}
catch (InvocationTargetException e)
{
throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
}
catch (NoSuchMethodException e)
{
throw new ObjectLookupException(LookupUtil.class, evalBean, evalName, e);
}
return evalBean;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?