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

org.tango.server.attribute.AttributeValue Maven / Gradle / Ivy

There is a newer version: 10.0.0
Show newest version
/**
 * Copyright (C) :     2012
 * 

* Synchrotron Soleil * L'Orme des merisiers * Saint Aubin * BP48 * 91192 GIF-SUR-YVETTE CEDEX *

* This file is part of Tango. *

* Tango is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. *

* Tango 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 Tango. If not, see . */ package org.tango.server.attribute; import fr.esrf.Tango.AttrQuality; import fr.esrf.Tango.DevFailed; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.tango.attribute.AttributeTangoType; import org.tango.server.IValue; import org.tango.utils.ArrayUtils; import org.tango.utils.DevFailedUtils; import java.io.Serializable; import java.lang.reflect.Array; public final class AttributeValue implements Cloneable, Serializable, IValue { private static final String CANNOT_BE_AN_ATTRIBUTE = " cannot be an attribute"; /** * */ private static final long serialVersionUID = 717857459565709770L; private Object value = null; private AttrQuality quality = AttrQuality.ATTR_VALID; private long time = 0; private int xDim = 1; private int yDim = 1; public AttributeValue() { super(); } public AttributeValue(final Object value) throws DevFailed { super(); setValue(value); quality = AttrQuality.ATTR_VALID; time = System.currentTimeMillis(); } public AttributeValue(final Object value, final AttrQuality quality) throws DevFailed { super(); setValue(value); this.quality = quality; time = System.currentTimeMillis(); } public AttributeValue(final Object value, final AttrQuality quality, final int xDim, final int yDim) { super(); this.value = value; this.quality = quality; time = System.currentTimeMillis(); this.xDim = xDim; this.yDim = yDim; } public AttributeValue(final Object value, final AttrQuality quality, final int xDim, final int yDim, final long time) { super(); this.value = value; this.quality = quality; this.time = time; this.xDim = xDim; this.yDim = yDim; } @Override public Object getValue() { return value; } /** * Set the value of an attribute. see {@link AttributeTangoType#ATTRIBUTE_CLASSES} for allowed types. Some default * dimensions are set automatically: *
    *
  • scalar: x=1, y=0
  • *
  • 1D array: x=array.length, y=0
  • *
  • 2D array: x=array[0].length, y=array.length
  • *
* Time is set to System.currentTimeMillis(). * * @param value attribute value. * @throws DevFailed */ @Override public void setValue(final Object value) throws DevFailed { time = System.currentTimeMillis(); if (value != null) { if (!value.getClass().isArray()) { // SCALAR // check if this value can be an attribute value if (!AttributeTangoType.ATTRIBUTE_CLASSES.contains(value.getClass())) { throw DevFailedUtils.newDevFailed(value.getClass().getCanonicalName() + CANNOT_BE_AN_ATTRIBUTE); } setXDim(1); setYDim(0); } else if (!value.getClass().getComponentType().isArray()) {// SPECTRUM // check if this value can be an attribute value if (!AttributeTangoType.ATTRIBUTE_CLASSES.contains(value.getClass().getComponentType())) { throw DevFailedUtils.newDevFailed(value.getClass().getCanonicalName() + CANNOT_BE_AN_ATTRIBUTE); } setXDim(Array.getLength(value)); setYDim(0); } else { // IMAGE int y = Array.getLength(value); if (y > 0) { final Object xArray = Array.get(value, 0); final int x = Array.getLength(xArray); if (x == 0) { y = 0; // check if this value can be an attribute value } else if (!AttributeTangoType.ATTRIBUTE_CLASSES.contains(xArray.getClass().getComponentType())) { throw DevFailedUtils.newDevFailed(value.getClass().getCanonicalName() + CANNOT_BE_AN_ATTRIBUTE); } setXDim(x); } else { setXDim(0); } setYDim(y); } this.value = value; } else { this.value = null; } } /** * Set Value and time. cf {@link #setValue(Object)} for details * * @param value * @param time * @throws DevFailed */ @Override public void setValue(final Object value, final long time) throws DevFailed { this.setValue(value); this.setTime(time); } void setValueWithoutDim(final Object value) throws DevFailed { this.value = value; } public AttrQuality getQuality() { return AttrQuality.from_int(quality.value()); } /** * Set the quality of the attribute {@link AttrQuality} * * @param quality */ public void setQuality(final AttrQuality quality) { // copy value this.quality = AttrQuality.from_int(quality.value()); } public long getTime() { return time; } /** * Set timestamp. By default, time is set to System.currentTimeMillis() in {@link #setValue(Object)}. * * @param time timestamp in milliseconds */ @Override public void setTime(final long time) { this.time = time; } public int getXDim() { return xDim; } /** * Set x dimension.Must be called after setValue to override default value * * @param xDim */ public void setXDim(final int xDim) { this.xDim = xDim; } public int getYDim() { return yDim; } /** * Set y dimension. Must be called after setValue to override default value * * @param yDim */ public void setYDim(final int yDim) { this.yDim = yDim; } @Override public Object clone() throws CloneNotSupportedException { final AttributeValue newValue = (AttributeValue) super.clone(); newValue.quality = AttrQuality.from_int(quality.value()); newValue.value = ArrayUtils.deepCopyOf(value); return newValue; } @Override public String toString() { final ReflectionToStringBuilder reflectionToStringBuilder = new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); return reflectionToStringBuilder.toString(); } }