All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.soleil.tango.clientapi.TangoCommand Maven / Gradle / Ivy

There is a newer version: 10.0.0
Show newest version
package fr.soleil.tango.clientapi;

import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.DeviceProxy;
import fr.esrf.TangoDs.TangoConst;
import fr.soleil.tango.clientapi.command.ITangoCommand;
import fr.soleil.tango.clientapi.command.MockCommand;
import fr.soleil.tango.clientapi.command.RealCommand;
import fr.soleil.tango.clientapi.util.TypeConversionUtil;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.tango.utils.DevFailedUtils;
import org.tango.utils.TangoUtil;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * Manage a connection to a tango command
 *
 * @author ABEILLE
 */
public final class TangoCommand {

    private static final String TANGO_WRONG_DATA_ERROR = "TANGO_WRONG_DATA_ERROR";
    private final ITangoCommand command;

    /**
     * Build a mock command.
     *
     * @param command
     *            The mock commandbehavior. Default behavior may be changed by using a mock library like
     *            http://mockito.org
     * @throws DevFailed
     */
    public TangoCommand(final ITangoCommand command) throws DevFailed {
        this.command = command;
    }

    /**
     * Build a mock command with parameter and return value
     *
     * @param commandName
     * @param parameterMockValue
     *            the parameter default value
     * @param returnMockValue
     *            the returned default value
     * @throws DevFailed
     */
    public TangoCommand(final String commandName, final Object parameterMockValue, final Object returnMockValue)
            throws DevFailed {
        command = new MockCommand(commandName, parameterMockValue, returnMockValue);
    }

    /**
     * Build a mock command with parameter or return value
     *
     * @param commandName
     * @param isParameterVoid
     *            true: parameter is void. false: return is void
     * @param mockValue
     *            the default mock value
     * @throws DevFailed
     */
    public TangoCommand(final boolean isParameterVoid, final String commandName, final Object mockValue)
            throws DevFailed {
        command = new MockCommand(isParameterVoid, commandName, mockValue);
    }

    /**
     * Build a connection to a tango command
     *
     * @param commandName
     * @param isMock
     *            true if is mocked. Mock command will be void-void.
     * @throws DevFailed
     */
    public TangoCommand(final String commandName, final boolean isMock) throws DevFailed {
        if (isMock) {
            command = new MockCommand(commandName);
        } else {
            command = new RealCommand(commandName);
        }
    }

    /**
     * @param deviceName
     *            The device tango (e.g. domain/family/member)
     * @param commandName
     *            The command name
     * @throws DevFailed
     */
    public TangoCommand(final String deviceName, final String commandName) throws DevFailed {
        command = new RealCommand(deviceName, commandName);
    }

    /**
     * @param commandName
     *            The device and command name in 4 fields (e.g. domain/family/member/commandName)
     * @throws DevFailed
     */
    public TangoCommand(final String commandName) throws DevFailed {
        TangoUtil.checkFullCommandName(commandName);
        command = new RealCommand(commandName);
    }

    public String getCommandName() {
        return command.getCommandName();
    }

    /**
     * Execute the command on a single device or on a group If group is used the return data is not managed for the
     * moment.
     *
     * @throws DevFailed
     */
    public void execute() throws DevFailed {
        command.execute();
    }

    public void execute(final Object value) throws DevFailed {
        command.execute(value);
    }

    public void execute(final Object... value) throws DevFailed {
        command.execute(value);
    }

    public Object executeExtract(final Object value) throws DevFailed {
        return command.executeExtract(value);
    }

    public  T execute(final Class clazz) throws DevFailed {
        final Object r = command.executeExtract();
        return TypeConversionUtil.castToType(clazz, r);
    }

    public Number executeExtractNumber() throws DevFailed {
        final Object result = command.executeExtract();
        Number returnVal = null;
        if (Array.getLength(result) >= 1) {
            if (Array.get(result, 0) instanceof String || Array.get(result, 0) instanceof Boolean) {
                DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, "this command must return a java.lang.Number");
            }
            returnVal = (Number) Array.get(result, 0);
        }
        return returnVal;
    }

    public  List executeExtractList(final Class clazz) throws DevFailed {
        return extractList(command.executeExtract(clazz));
    }

    public Number[] executeExtractNumberArray() throws DevFailed {
        final Object result = command.executeExtract();
        return extractAsNumberArray(result);
    }

    public  T execute(final Class clazz, final Object value) throws DevFailed {
        final Object r = command.executeExtract(value);
        return TypeConversionUtil.castToType(clazz, r);
    }

    public  T execute(final Class clazz, final Object... value) throws DevFailed {
        final Object r = command.executeExtract(value);
        return TypeConversionUtil.castToType(clazz, r);
    }

    public Number executeExtractNumber(final Object value) throws DevFailed {
        final Object result = command.executeExtract(value);
        Number returnVal = null;
        if (Array.getLength(result) >= 1) {
            if (Array.get(result, 0) instanceof String || Array.get(result, 0) instanceof Boolean) {
                DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, "this command must return a java.lang.Number");
            }
            returnVal = (Number) Array.get(result, 0);
        }
        return returnVal;
    }

    /**
     * Execute a command with argin which is a single value
     *
     * @param 
     * @param clazz
     * @param value
     * @return
     * @throws DevFailed
     */
    public  List executeExtractList(final Class clazz, final Object value) throws DevFailed {
        final Object r = command.executeExtract(value);
        return extractList(TypeConversionUtil.castToType(clazz, r));
    }

    /**
     * Execute a command with argin which is an array
     *
     * @param 
     * @param clazz
     * @param value
     * @return
     * @throws DevFailed
     */
    public  List executeExtractList(final Class clazz, final Object... value) throws DevFailed {
        final Object result = command.executeExtract(value);
        return extractList(TypeConversionUtil.castToArray(clazz, result));
    }

    @SuppressWarnings("unchecked")
    private  List extractList(final Object result) throws DevFailed {
        final List converted = new ArrayList();
        if (isArgoutScalar()) {
            converted.add((T) result);
        } else if (!isArgoutVoid()) {
            for (int i = 0; i < Array.getLength(result); i++) {
                final T val = (T) Array.get(result, i);
                converted.add(val);
            }
        }
        return converted;
    }

    private Number[] extractAsNumberArray(final Object result) throws DevFailed {
        Number[] returned = null;
        if (Array.getLength(result) >= 1) {
            if (Array.get(result, 0) instanceof String || Array.get(result, 0) instanceof Boolean) {
                DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, "this command must return a java.lang.Number");
            }
            returned = new Number[Array.getLength(result)];
            for (int i = 0; i < returned.length; i++) {
                returned[i] = (Number) Array.get(result, i);
            }
        }
        return returned;
    }

    public void insertMixArgin(final String[] numberArgin, final String[] stringArgin) throws DevFailed {
        command.insertMixArgin(numberArgin, stringArgin);
    }

    public void insertMixArgin(final double[] numberArgin, final String[] stringArgin) throws DevFailed {
        command.insertMixArgin(numberArgin, stringArgin);
    }

    public void insertMixArgin(final int[] numberArgin, final String[] stringArgin) throws DevFailed {
        command.insertMixArgin(numberArgin, stringArgin);
    }

    public String extractToString(final String separator) throws DevFailed {
        return command.extractToString(separator);
    }

    /**
     * Get Num part of DEVVASXSTRINGARRAY and convert to string
     *
     * @return
     * @throws DevFailed
     *             3 juin 2005
     */
    public String[] getNumMixArrayArgout() throws DevFailed {
        return command.getNumMixArrayArgout();
    }

    public String[] getStringMixArrayArgout() throws DevFailed {
        return command.getStringMixArrayArgout();
    }

    public double[] getNumDoubleMixArrayArgout() throws DevFailed {
        return command.getNumDoubleMixArrayArgout();
    }

    public int[] getNumLongMixArrayArgout() throws DevFailed {
        return command.getNumLongMixArrayArgout();
    }

    public boolean isArginScalar() throws DevFailed {
        return command.isArginScalar();
    }

    public boolean isArginSpectrum() throws DevFailed {
        return command.isArginSpectrum();
    }

    public boolean isArginVoid() throws DevFailed {
        return command.isArginVoid();
    }

    public boolean isArgoutVoid() throws DevFailed {
        return command.isArgoutVoid();
    }

    public boolean isArgoutSpectrum() throws DevFailed {
        return command.isArgoutSpectrum();
    }

    public boolean isArginMixFormat() throws DevFailed {
        return command.isArginMixFormat();
    }

    public boolean isArgoutScalar() throws DevFailed {
        return command.isArgoutScalar();
    }

    public boolean isArgoutMixFormat() throws DevFailed {
        return command.isArgoutMixFormat();
    }

    public DeviceProxy getDeviceProxy() {
        return command.getDeviceProxy();
    }

    @Override
    public String toString() {
        final ToStringBuilder str = new ToStringBuilder(this);
        str.append("name", command.getCommandName());
        try {
            str.append("argin type", TangoConst.Tango_CmdArgTypeName[command.getArginType()]);
        } catch (final DevFailed e) {
            str.append("argin type", "UNKNOWN");
        }
        try {
            str.append("argout type", TangoConst.Tango_CmdArgTypeName[command.getArgoutType()]);
        } catch (final DevFailed e) {
            str.append("argout type", "UNKNOWN");
        }
        return str.toString();
    }

    public int getArginType() throws DevFailed {
        return command.getArginType();
    }

    public int getArgoutType() throws DevFailed {
        return command.getArgoutType();
    }

    public void setTimeout(final int timeout) throws DevFailed {
        command.setTimeout(timeout);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy