blob: c6852fceecd4fe2b594b2c77f7cd9638d31e9b72 [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// 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 org.apache.tapestry.util.prop;
import java.util.HashMap;
import java.util.Map;
import ognl.ClassResolver;
import ognl.Ognl;
import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.Tapestry;
/**
* Utilities wrappers around <a href="http://www.ognl.org">OGNL</a>.
*
* @author Howard Lewis Ship
* @version $Id$
* @since 2.2
*
**/
public class OgnlUtils
{
private static final Map _cache = new HashMap();
private OgnlUtils()
{
}
/**
* Gets a parsed OGNL expression from the input string.
*
* @throws ApplicationRuntimeException if the expression can not be parsed.
*
**/
public static synchronized Object getParsedExpression(String expression)
{
Object result = _cache.get(expression);
if (result == null)
{
try
{
result = Ognl.parseExpression(expression);
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(
Tapestry.format("OgnlUtils.unable-to-parse-expression", expression),
ex);
}
_cache.put(expression, result);
}
return result;
}
/**
* Parses and caches the expression and uses it to update
* the target object with the provided value.
*
* @throws ApplicationRuntimeException if the expression
* can not be parsed, or the target can not be updated.
*
**/
public static void set(String expression, ClassResolver resolver, Object target, Object value)
{
set(getParsedExpression(expression), resolver, target, value);
}
/**
* Updates the target object with the provided value.
*
* @param expression a parsed OGNL expression
* @throws ApplicationRuntimeException if the target can not be updated.
*
**/
public static void set(Object expression, ClassResolver resolver, Object target, Object value)
{
try
{
Map context = Ognl.createDefaultContext(target, resolver);
Ognl.setValue(expression, context, target, value);
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(
Tapestry.format(
"OgnlUtils.unable-to-update-expression",
"<parsed expression>",
target,
value),
ex);
}
}
/**
* Returns the value of the expression evaluated against
* the object.
*
* @param expression a parsed OGNL expression
* @param object the root object
*
* @throws ApplicationRuntimeException
* if the value can not be obtained from the object.
*
**/
public static Object get(Object expression, ClassResolver resolver, Object object)
{
try
{
Map context = Ognl.createDefaultContext(object, resolver);
return Ognl.getValue(expression, context, object);
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(
Tapestry.format(
"OgnlUtils.unable-to-read-expression",
"<parsed expression>",
object),
ex);
}
}
/**
* Returns the value of the expression evaluated against
* the object.
*
*
* @throws ApplicationRuntimeException if the
* expression can not be parsed, or the value
* not obtained from the object.
**/
public static Object get(String expression, ClassResolver resolver, Object object)
{
return get(getParsedExpression(expression), resolver, object);
}
}