
fr.soleil.tango.clientapi.TangoAttribute Maven / Gradle / Ivy
package fr.soleil.tango.clientapi;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tango.utils.DevFailedUtils;
import fr.esrf.Tango.AttrDataFormat;
import fr.esrf.Tango.AttrQuality;
import fr.esrf.Tango.AttrWriteType;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.AttributeProxy;
import fr.esrf.TangoApi.DeviceAttribute;
import fr.esrf.TangoDs.TangoConst;
import fr.soleil.tango.clientapi.attribute.ITangoAttribute;
import fr.soleil.tango.clientapi.attribute.MockAttribute;
import fr.soleil.tango.clientapi.attribute.RealAttribute;
/**
* Manage access to a tango attribute.
*
* @author ABEILLE
*/
public final class TangoAttribute {
private static final String ATTRIBUTE_MUST_BE_SPECTRUM_OR_IMAGE = "attribute must be spectrum or image";
private static final String LOG_EXTRACTING = "extracting {}";
private static final String LOG_INSERTING = "inserting {}";
private final Logger logger = LoggerFactory.getLogger(TangoAttribute.class);
private static final String TANGO_WRONG_DATA_ERROR = "TANGO_WRONG_DATA_ERROR";
private static final String THIS_ATTRIBUTE_MUST_BE_A_JAVA_LANG_NUMBER = "this attribute must be a java.lang.Number";
private final ITangoAttribute attributeImpl;
/**
* Build a mock connection to a tango attribute.
*
* @param name
* the attribute name
* @param mockValue
* The default mock value
* @throws DevFailed
*/
public TangoAttribute(final String name, final Object mockValue) throws DevFailed {
attributeImpl = new MockAttribute(name, mockValue);
}
/**
* Build a mock connection to a tango attribute.
*
* @param attribute
* The mock attribute behavior. Default behavior may be changed
* by using a mock library like http://mockito.org
* @throws DevFailed
*/
public TangoAttribute(final ITangoAttribute attribute) throws DevFailed {
attributeImpl = attribute;
}
/**
* Build a connection to a tango attribute.
*
* @param name
* the attribute name The full name of the attribute
*/
public TangoAttribute(final String name) throws DevFailed {
attributeImpl = new RealAttribute(name);
}
public void write() throws DevFailed {
attributeImpl.write();
}
public void write(final Object value) throws DevFailed {
insert(value);
this.write();
}
public void writeImage(final int dimX, final int dimY, final Object values) throws DevFailed {
insertImage(dimX, dimY, values);
this.write();
}
/**
* Get the value on the attribute
*
* @throws DevFailed
*/
public void update() throws DevFailed {
attributeImpl.update();
}
/**
* Read the tango attribute with SCALAR format and convert it
*
* @param
* @param type
* The requested output type
* @return
* @throws DevFailed
*/
public T read(final Class type) throws DevFailed {
update();
return extract(type);
}
/**
* @see #extract()
* @return
* @throws DevFailed
*/
public Object read() throws DevFailed {
update();
return extract();
}
/**
* Read the tango attribute with SCALAR format, but does not convert it.
* Does not works for String and Boolean
*
* @return
* @throws DevFailed
*/
public Number readAsNumber() throws DevFailed {
update();
return extractNumber();
}
/**
* Read attribute and return result as array.
*
* @param type
* The requested output type, is the component type (double,
* Double...).
* @return
* @throws DevFailed
*/
public Object readArray(final Class type) throws DevFailed {
update();
return extractArray(type);
}
public Object readWrittenArray(final Class type) throws DevFailed {
update();
return extractWrittenArray(type);
}
/**
* Read written value of attribute
*
* @param
* @param type
* The requested output type
* @return
* @throws DevFailed
*/
public T readWritten(final Class type) throws DevFailed {
update();
return extractWritten(type);
}
/**
* Read the written part of attribute without any conversion
*
* @return
* @throws DevFailed
*/
public Object readWritten() throws DevFailed {
update();
return extractWritten();
}
public Number readWrittenAsNumber() throws DevFailed {
update();
return extractNumberWritten();
}
/**
* Read attribute with format SPECTRUM or IMAGE
*
* @param
* @param type
* @return
* @throws DevFailed
*/
public T[] readSpecOrImage(final Class type) throws DevFailed {
update();
return extractSpecOrImage(type);
}
/**
* Read the tango attribute with SPECTRUM and IMAGE format, but does not
* convert it. Does not works for String and Boolean
*
* @return
* @throws DevFailed
*/
public Number[] readSpecOrImageAsNumber() throws DevFailed {
update();
return extractNumberSpecOrImage();
}
public T[] readWrittenSpecOrImage(final Class type) throws DevFailed {
update();
return extractWrittenSpecOrImage(type);
}
public Number[] readWrittenSpecOrImageAsNumber() throws DevFailed {
update();
return extractNumberWrittenSpecOrImage();
}
/**
* Read attribute and convert it to a String with separators
*
* @param separator
* between each value (for SPECTRUM and IMAGE only)
* @param endSeparator
* between each dimension (for IMAGE only)
* @return The formatted string
* @throws DevFailed
*/
public String readAsString(final String separator, final String endSeparator) throws DevFailed {
update();
return extractToString(separator, endSeparator);
}
/**
* Insert scalar, spectrum or image. spectrum can be arrays of Objects or
* primitives. image can be 2D arrays of Objects or primitives
*
* @param value
* @throws DevFailed
*/
public void insert(final Object value) throws DevFailed {
logger.debug(LOG_INSERTING, this);
attributeImpl.insert(value);
}
public void insertImage(final int dimX, final int dimY, final Object values) throws DevFailed {
logger.debug(LOG_INSERTING, this);
attributeImpl.insertImage(dimX, dimY, values);
}
public T extract(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extract(type);
}
public Object extractArray(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extractArray(type);
}
public Object extractWrittenArray(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extractWrittenArray(type);
}
/**
* Extract value in a Number without conversion
*
* @return
* @throws DevFailed
*/
public Number extractNumber() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
final Object result = attributeImpl.extract();
if (!Number.class.isAssignableFrom(result.getClass())) {
DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, THIS_ATTRIBUTE_MUST_BE_A_JAVA_LANG_NUMBER);
}
return (Number) result;
}
/**
* Extract read part without conversion. Spectrum attributes are returned as
* primitive array. Image attributes are returned as 2D array of primitives
* (e.g Double[][])
*/
public Object extract() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extract();
}
/**
* Extract write part without conversion. Spectrum attributes are returned
* as primitive array. Image attributes are returned as 2D array of
* primitives (e.g Double[][])
*/
public Object extractWritten() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extractWritten();
}
public T extractWritten(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extractWritten(type);
}
public Number extractNumberWritten() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
final Object result = attributeImpl.extractWritten();
if (!Number.class.isAssignableFrom(result.getClass())) {
DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, THIS_ATTRIBUTE_MUST_BE_A_JAVA_LANG_NUMBER);
}
return (Number) result;
}
public T[] extractSpecOrImage(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
if (attributeImpl.getDataFormat().equals(AttrDataFormat.SCALAR)) {
throw DevFailedUtils.newDevFailed(ATTRIBUTE_MUST_BE_SPECTRUM_OR_IMAGE);
}
return attributeImpl.extractSpecOrImage(type);
}
public Number[] extractNumberSpecOrImage() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
if (attributeImpl.getDataFormat().equals(AttrDataFormat.SCALAR)) {
throw DevFailedUtils.newDevFailed(ATTRIBUTE_MUST_BE_SPECTRUM_OR_IMAGE);
}
final Object result = attributeImpl.extractArray();
if (!Number.class.isAssignableFrom(result.getClass().getComponentType())) {
DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, THIS_ATTRIBUTE_MUST_BE_A_JAVA_LANG_NUMBER);
}
return (Number[]) result;
}
public T[] extractWrittenSpecOrImage(final Class type) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
if (attributeImpl.getDataFormat().equals(AttrDataFormat.SCALAR)) {
throw DevFailedUtils.newDevFailed(ATTRIBUTE_MUST_BE_SPECTRUM_OR_IMAGE);
}
return attributeImpl.extractSpecOrImage(type);
}
public Number[] extractNumberWrittenSpecOrImage() throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
if (attributeImpl.getDataFormat().equals(AttrDataFormat.SCALAR)) {
throw DevFailedUtils.newDevFailed(ATTRIBUTE_MUST_BE_SPECTRUM_OR_IMAGE);
}
final Object result = attributeImpl.extractWrittenArray();
if (!Number.class.isAssignableFrom(result.getClass().getComponentType())) {
DevFailedUtils.throwDevFailed(TANGO_WRONG_DATA_ERROR, THIS_ATTRIBUTE_MUST_BE_A_JAVA_LANG_NUMBER);
}
return (Number[]) result;
}
/**
* Extract data and format it as followed :\n SCALAR: ex: 1 SPECTRUM: one
* line separated by separator. \n ex: 1 3 5 IMAGE: x lines and y colums
* separated by endSeparator.\n ex: 3 5 8 5 6 9
*
* @param separator
* @param endSeparator
* @return
* @throws DevFailed
*/
public String extractToString(final String separator, final String endSeparator) throws DevFailed {
logger.debug(LOG_EXTRACTING, this);
return attributeImpl.extractToString(separator, endSeparator);
}
public boolean isNumber() {
return attributeImpl.isNumber();
}
public boolean isBoolean() {
return attributeImpl.isBoolean();
}
public boolean isString() {
return attributeImpl.isString();
}
public boolean isWritable() {
return attributeImpl.isWritable();
}
public boolean isScalar() {
return attributeImpl.isScalar();
}
public boolean isSpectrum() {
return attributeImpl.isSpectrum();
}
public boolean isImage() {
return attributeImpl.isImage();
}
public AttributeProxy getAttributeProxy() {
return attributeImpl.getAttributeProxy();
}
public DeviceAttribute getDeviceAttribute() {
return attributeImpl.getDeviceAttribute();
}
public int getDimX() throws DevFailed {
return attributeImpl.getDimX();
}
public int getDimY() throws DevFailed {
return attributeImpl.getDimY();
}
public int getWrittenDimX() throws DevFailed {
return attributeImpl.getWrittenDimX();
}
public int getWrittenDimY() throws DevFailed {
return attributeImpl.getWrittenDimY();
}
public int getDataType() throws DevFailed {
return attributeImpl.getDataType();
}
public AttrWriteType getWriteType() {
return attributeImpl.getWriteType();
}
public long getTimestamp() throws DevFailed {
return attributeImpl.getTimestamp();
}
public AttrQuality getQuality() throws DevFailed {
return attributeImpl.getQuality();
}
public String getDeviceName() throws DevFailed {
return attributeImpl.getDeviceName();
}
public String getName() {
return attributeImpl.getAttributeName();
}
@Override
public String toString() {
final ToStringBuilder str = new ToStringBuilder(this);
str.append("name", attributeImpl.getAttributeName());
String typeString = "UNKOWN";
try {
typeString = TangoConst.Tango_CmdArgTypeName[attributeImpl.getDataType()];
} catch (final DevFailed e) {
}
final String formatString = TangoConst.Tango_AttrDataFormatName[attributeImpl.getDataFormat().value()];
str.append("type", typeString);
str.append("format", formatString);
str.append("writeType", attributeImpl.getWriteType().value());
return str.toString();
}
public void setTimeout(final int timeout) throws DevFailed {
attributeImpl.setTimeout(timeout);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy