com.tonbeller.wcf.expr.ExprUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.tonbeller.wcf.expr.ExprUtils.java

Source

/*
 * ====================================================================
 * This software is subject to the terms of the Common Public License
 * Agreement, available at the following URL:
 *   http://www.opensource.org/licenses/cpl.html .
 * Copyright (C) 2003-2004 TONBELLER AG.
 * All Rights Reserved.
 * You must accept the terms of that agreement to use this software.
 * ====================================================================
 *
 * 
 */
package com.tonbeller.wcf.expr;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

import com.tonbeller.wcf.utils.SoftException;

/**
 * evaluates EL expressions, while we are waiting for servlet 2 / tomcat 5
 * @author av
 */
public class ExprUtils {
    private static Logger logger = Logger.getLogger(ExprUtils.class);

    private ExprUtils() {
        super();
    }

    public static void checkExpr(String expr) {
        if (expr == null)
            throw new IllegalArgumentException("expr is null");
        if (isExpression(expr) && !expr.endsWith("}"))
            throw new IllegalArgumentException("expr must end with \"}\"");
    }

    public static Object getModelReference(PageContext pageContext, String expr) {
        ExprContext ec = getExprContextAdapter(pageContext);
        return getModelReference(ec, expr);

    }

    public static ExprContext getExprContextAdapter(final PageContext pageContext) {
        return new ExprContext() {
            public Object findBean(String name) {
                return pageContext.findAttribute(name);
            }

            public void setBean(String name, Object bean) {
                if (bean == null)
                    pageContext.removeAttribute(name);
                else
                    pageContext.setAttribute(name, bean, PageContext.SESSION_SCOPE);
            }
        };
    }

    public static Object getModelReference(ExprContext context, String expr) {
        try {
            if (expr == null || expr.length() == 0)
                return null;
            // plain string?
            if (!isExpression(expr))
                return context.findBean(expr);

            if (!expr.endsWith("}"))
                throw new IllegalArgumentException("expr must end with '}'");

            // dotted expression?
            int pos = expr.indexOf('.');
            if (pos < 0) {
                // no, find attribute in context
                String name = expr.substring(2, expr.length() - 1);
                return context.findBean(name);
            }
            // yes, evaluate property path
            String name = expr.substring(2, pos);
            Object bean = context.findBean(name);
            if (bean == null)
                throw new IllegalArgumentException("bean \"" + name + "\" not found");
            String path = expr.substring(pos + 1, expr.length() - 1);
            return PropertyUtils.getProperty(bean, path);
        } catch (IllegalAccessException e) {
            logger.error("?", e);
            throw new SoftException(e);
        } catch (InvocationTargetException e) {
            logger.error("?", e);
            throw new SoftException(e);
        } catch (NoSuchMethodException e) {
            logger.error("?", e);
            throw new SoftException(e);
        }
    }

    public static void setModelReference(ExprContext context, String expr, Object value) {
        if (expr == null)
            throw new NullPointerException("expr is null");

        // plain "bean" expr?
        if (!isExpression(expr)) {
            context.setBean(expr, value);
            return;
        }

        if (!expr.endsWith("}"))
            throw new IllegalArgumentException("expr must end with '}'");

        // "#{bean}" expr?
        if (expr.indexOf('.') < 0) {
            // no bean, set session attribute
            String name = expr.substring(2, expr.length() - 1);
            context.setBean(name, value);
            return;
        }

        // "#{bean.property.path}" expr
        try {
            int pos = expr.indexOf('.');
            String name = expr.substring(2, pos);
            Object bean = context.findBean(name);
            if (bean == null)
                throw new IllegalArgumentException("bean \"" + name + "\" not found");
            String path = expr.substring(pos + 1, expr.length() - 1);
            PropertyUtils.setProperty(bean, path, value);
        } catch (IllegalAccessException e) {
            logger.error("exception caught", e);
            throw new SoftException(e);
        } catch (InvocationTargetException e) {
            logger.error("exception caught", e);
            throw new SoftException(e);
        } catch (NoSuchMethodException e) {
            logger.error("exception caught", e);
            throw new SoftException(e);
        }
    }

    public static PropertyDescriptor getPropertyDescriptor(ExprContext context, String expr) {
        if (!ExprUtils.isExpression(expr) || !expr.endsWith("}") || expr.indexOf('.') < 0)
            throw new IllegalArgumentException("'#{bean.property}' expected");

        int pos = expr.indexOf('.');
        String name = expr.substring(2, pos);
        Object bean = context.findBean(name);
        if (bean == null)
            throw new IllegalArgumentException("bean \"" + name + "\" not found");
        String path = expr.substring(pos + 1, expr.length() - 1);
        try {
            return PropertyUtils.getPropertyDescriptor(bean, path);
        } catch (Exception e) {
            logger.error(null, e);
            return null;
        }
    }

    /**
     * extract the name of the bean. For example, in the expression
     * "${bean.property}" the bean name is "bean".
     */
    public static String getBeanName(String expr) {
        if (isExpression(expr))
            expr = expr.substring(2, expr.length() - 1);
        int pos = expr.indexOf('.');
        if (pos > 0)
            expr = expr.substring(0, pos);
        return expr;
    }

    /**
     * true, if expr starts with "${" or with "#{"
     */
    public static boolean isExpression(String expr) {
        if (expr == null)
            return false;
        return expr.startsWith("${") || expr.startsWith("#{");
    }

}