org.eclipse.jubula.rc.common.commands.MethodParams.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.rc.common.commands.MethodParams.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 BREDEX GmbH.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.rc.common.commands;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.ConvertUtils;
import org.eclipse.jubula.communication.message.MessageParam;
import org.eclipse.jubula.rc.common.exception.MethodParamException;
import org.eclipse.jubula.tools.constants.StringConstants;

/**
 * Represents all parameters of the implementation class method that will be invoked by this command.
 * @author BREDEX GmbH
 * @created 20.12.2006
 */
public class MethodParams {
    /** The parameter types as <code>Class</code> objects. */
    private List m_types = new ArrayList();

    /** The parameter values. */
    private List m_objectValues = new ArrayList();

    /**
     * Adds the type and value of a method parameter to the internal lists.
     * @param param The parameter object that holds the type and value information in a string manner.
     * @throws MethodParamException If the parameter type cannot be found or If the parameter string value cannot be converted into an object defined by the parameter type.
     */
    public void add(MessageParam param) throws MethodParamException {
        try {
            Class type = null;
            try {
                type = Class.forName(param.getType(), true, Thread.currentThread().getContextClassLoader());
            } catch (ClassNotFoundException e) {
                // this happens if guidancer.datatype.Variable is used!
                type = Class.forName(String.class.getName(), true, Thread.currentThread().getContextClassLoader());
            }
            String stringValue = param.getValue() == null ? StringConstants.EMPTY : param.getValue();
            Object objectValue = ConvertUtils.convert(stringValue, type);
            if (objectValue == null || !type.isAssignableFrom(objectValue.getClass())) {
                throw new MethodParamException("Failed converting " //$NON-NLS-1$
                        + stringValue + " into an instance of " + type, param); //$NON-NLS-1$
            }
            m_types.add(type);
            m_objectValues.add(objectValue);
        } catch (ClassNotFoundException e) {
            throw new MethodParamException("Action parameter type not found: " + e, param); //$NON-NLS-1$
        }
    }

    /**
     * Copies the passed source list into the passed array and returns it.
     * @param dest The array the list is copied into.
     * @param source The list
     * @return The <code>dest</code> array.
     */
    private Object[] createArray(Object[] dest, List source) {
        source.toArray(dest);
        return dest;
    }

    /**
     * @return The list of parameter types as <code>Class</code> objects.
     */
    public List getTypesAsList() {
        return m_types;
    }

    /**
     * @return The array of parameter types.
     */
    public Class[] getTypes() {
        return m_types.isEmpty() ? null : (Class[]) createArray(new Class[m_types.size()], m_types);
    }

    /**
     * @return The list of parameter values.
     */
    public List getValuesAsList() {
        return m_objectValues;
    }

    /**
     * @return The array of parameter values.
     */
    public Object[] getValues() {
        return m_objectValues.isEmpty() ? null : createArray(new Object[m_objectValues.size()], m_objectValues);
    }
}