/* Copyright 2005-2006 Tim Fennell
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sourceforge.stripes.util.bean;
/**
* <p>Provides a simple way to manipulate properties and nested properties specified by complex
* property expressions. It should be noted that while the interface to this class is simple it
* will be more efficient to use {@link PropertyExpressionEvaluation} directly if you plan
* to call more than one of the methods in this class with the same exact expression.</p>
*
* @author Tim Fennell
* @since Stripes 1.4
*/
public class BeanUtil {
/**
* Attempts to determine the type of the property specified by the property expression
* in the context of the supplied bean. Will return a Class if one is determinable or
* null if the type cannot be determined due to either there being no such property
* or a lack of type information.
*
* @param expression an expression representing a property or nested/indexed property
* @param bean the bean against which to evaluate the expression
* @return the Class representing the type of object that would be returned if
* {@link #getPropertyValue(String, Object)} were invoked with the same parameters
* @throws ParseException if the expression is invalid and cannot be parsed
* @throws EvaluationException if the expression is valid, but cannot be evaluated against
* this bean
*/
public static Class<?> getPropertyType(String expression, Object bean)
throws ParseException, EvaluationException {
return getEvaluation(expression, bean).getType();
}
/**
* Attempts to fetch the property specified by the property expression
* in the context of the supplied bean. If a value is present one will be returned. If
* the value or any intermediate value is null, then null will be returned.
*
* @param expression an expression representing a property or nested/indexed property
* @param bean the bean against which to evaluate the expression
* @return the value of the property or null
* @throws ParseException if the expression is invalid and cannot be parsed
* @throws EvaluationException if the expression is valid, but cannot be evaluated against
* this bean
*/
public static Object getPropertyValue(String expression, Object bean)
throws ParseException, EvaluationException {
return getEvaluation(expression, bean).getValue();
}
/**
* Attempts to set the property specified by the property expression
* in the context of the supplied bean.
*
* @param expression an expression representing a property or nested/indexed property
* @param bean the bean against which to evaluate the expression
* @param value the value to be set for the property, may be null
* @throws ParseException if the expression is invalid and cannot be parsed
* @throws EvaluationException if the expression is valid, but cannot be evaluated against
* this bean
*/
public static void setPropertyValue(String expression, Object bean, Object value)
throws ParseException, EvaluationException {
getEvaluation(expression, bean).setValue(value);
}
/**
* Attempts to set the property to null or an equivalent value. In most cases this leads
* to the property being set to null, but in the case of primitives the default value is
* used and in the case of Maps the key is removed from the Map.
*
* @param expression an expression representing a property or nested/indexed property
* @param bean the bean against which to evaluate the expression
* @throws ParseException if the expression is invalid and cannot be parsed
* @throws EvaluationException if the expression is valid, but cannot be evaluated against
* this bean
*/
public static void setPropertyToNull(String expression, Object bean)
throws ParseException, EvaluationException {
getEvaluation(expression, bean).setToNull();
}
/**
* Parses the expression and then creates an evaluation out of it with the supplied bean.
* @param expression an expression representing a property or nested/indexed property
* @param bean the bean against which to evaluate the expression
* @return a PropertyEvaluation object to be used to get/set information
* @throws ParseException if the expression is invalid and cannot be parsed
* @throws EvaluationException if the expression is valid, but cannot be evaluated against
* this bean
*/
private static PropertyExpressionEvaluation getEvaluation(String expression, Object bean)
throws ParseException, EvaluationException {
PropertyExpression expr = PropertyExpression.getExpression(expression);
return new PropertyExpressionEvaluation(expr, bean);
}
}