org.ajax4jsf.renderkit.ComponentUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.ajax4jsf.renderkit.ComponentUtils.java

Source

/**
 * License Agreement.
 *
 * Rich Faces - Natural Ajax for Java Server Faces (JSF)
 *
 * Copyright (C) 2007 Exadel, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 *
 * 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.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */

package org.ajax4jsf.renderkit;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.el.MethodNotFoundException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

import org.ajax4jsf.Messages;
import org.apache.commons.beanutils.MethodUtils;

/**
 *    Utils for working with tempates
 *  @author ayukhovich@exadel.com (latest modification by $Author: alexsmirnov $)
 *  @version $Revision: 1.1.2.1 $ $Date: 2007/01/09 18:58:52 $
 */
public class ComponentUtils {
    private final static String UTILS_PREFIX = "util.";

    /**
     * 
     * @param className
     * @param functionName
     * @param parameters
     * @return
     */
    public static Object callFunction(FacesContext context, UIComponent component, RendererBase renderer,
            String functionName, Object[] parameters) {

        Object returnObject = null;

        int sizeParameters = 0;
        int sizeArrayParameters = 2;
        if (parameters != null) {
            sizeParameters = parameters.length;
            sizeArrayParameters = 3;
        }

        Object[][] arrayParameters = new Object[sizeArrayParameters][];
        arrayParameters[0] = new Object[sizeParameters + 2];
        arrayParameters[1] = new Object[sizeParameters + 1];

        if (sizeParameters != 0) {
            arrayParameters[2] = new Object[sizeParameters];
        }

        arrayParameters[0][0] = context;
        arrayParameters[0][1] = component;
        arrayParameters[1][0] = component;

        if (parameters != null) {
            for (int iParameter = 0; iParameter < parameters.length; iParameter++) {
                arrayParameters[0][iParameter + 2] = parameters;
                arrayParameters[1][iParameter + 1] = parameters;
                arrayParameters[2][iParameter] = parameters;
            }
        }

        String methodName;
        Object object;
        if (functionName.startsWith(UTILS_PREFIX)) {
            methodName = functionName.substring(UTILS_PREFIX.length());
            object = renderer.getUtils();
        } else {
            object = renderer;
            methodName = functionName;
        }

        returnObject = invokeMethod(object, methodName, arrayParameters);

        return returnObject;
    }

    /**
     * Invoke a named method whose parameter type matches the object type.
     * @param objects - invoke method on this object
     * @param methodName - get method with this name
     * @param arrayParameters - use these arguments - treat null as empty array
     * @return
     */
    private static Object invokeMethod(Object object, String methodName, Object[][] arrayParameters) {

        try {
            for (int iParameter = 0; iParameter < arrayParameters.length; iParameter++) {
                try {
                    return MethodUtils.invokeMethod(object, methodName, arrayParameters[iParameter]);
                } catch (NoSuchMethodException e) {
                    continue;
                }
            }
        } catch (InvocationTargetException e) {
            throw new FacesException(
                    Messages.getMessage(Messages.METHOD_CALL_ERROR_2b, methodName, e.getCause().getMessage()), e);
        } catch (IllegalAccessException e) {
            throw new FacesException(Messages.getMessage(Messages.METHOD_CALL_ERROR_4b, methodName, e.getMessage()),
                    e);
        }
        throw new MethodNotFoundException(Messages.getMessage(Messages.METHOD_CALL_ERROR_6b, methodName, object));
    }

    /**
     * Write html-attribute
     * @param writer
     * @param attribute
     * @param value
     * @throws IOException
     */
    public static void writeAttribute(ResponseWriter writer, String attribute, Object value) throws IOException {
        if ((value != null) && (value.toString().length() != 0)) {
            writer.writeAttribute(attribute, value.toString(), attribute);
        }
    }
}