From 23ef87294b0ff598b11271240eabba14bd837c0c Mon Sep 17 00:00:00 2001
From: Arnaud Jelmoni <arnaud.jelmoni@keyconsulting.fr>
Date: Tue, 1 Dec 2020 16:00:49 +0000
Subject: [PATCH] TANGOARCH-628 / TANGOARCH-634

---
 .../snap/api/tools/SnapAttributeExtract.java  | 82 ++++++++-----------
 .../api/tools/SnapAttributesExtractTest.java  | 72 ++++++++++++++++
 2 files changed, 107 insertions(+), 47 deletions(-)
 create mode 100644 src/test/java/fr/soleil/archiving/snap/api/tools/SnapAttributesExtractTest.java

diff --git a/src/main/java/fr/soleil/archiving/snap/api/tools/SnapAttributeExtract.java b/src/main/java/fr/soleil/archiving/snap/api/tools/SnapAttributeExtract.java
index 40999ee..60b4ce6 100644
--- a/src/main/java/fr/soleil/archiving/snap/api/tools/SnapAttributeExtract.java
+++ b/src/main/java/fr/soleil/archiving/snap/api/tools/SnapAttributeExtract.java
@@ -592,20 +592,7 @@ public class SnapAttributeExtract extends SnapAttribute {
         writable = snapAttributeLight.getWritable();
     }
 
-    /*
-     * public int getData_type() { return data_type; }
-     * 
-     * public void setData_type(int data_type) { this.data_type = data_type; }
-     * 
-     * public int getData_format() { return data_format; }
-     * 
-     * public void setData_format(int data_format) { this.data_format =
-     * data_format; }
-     * 
-     * public int getWritable() { return writable; }
-     * 
-     * public void setWritable(int writable) { this.writable = writable; }
-     */
+
     // Everything here is already available in SnapAttribute
     public String valueToString(final int pos) {
         final String nullvalue = "NULL";
@@ -613,12 +600,13 @@ public class SnapAttributeExtract extends SnapAttribute {
         if (getValue() == null) {
             return nullvalue;
         }
-        if (getValue() instanceof Object[]) {
-            final Object[] valTab = (Object[]) getValue();
-            if (valTab[pos] == null) {
-                return nullvalue;
-            }
-        }
+		if (getValue() instanceof Object[]) {
+			final Object[] valTab = (Object[]) getValue();
+			if ((writable == AttrWriteType._READ_WITH_WRITE || writable == AttrWriteType._READ_WRITE)
+					&& valTab[pos] == null) {
+				return nullvalue;
+			}
+		}
 
         switch (dataFormat) {
             case AttrDataFormat._SCALAR:
@@ -650,7 +638,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                             switch (dataType) {
                                 case TangoConst.Tango_DEV_BOOLEAN:
                                     final boolean[] valb = (boolean[]) getValue();
-                                    if (valb != null) {
+									if (valb != null && valb.length > 0) {
                                         for (int i = 0; i < valb.length - 1; i++) {
                                             value += valb[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -659,7 +647,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_STRING:
                                     final String[] valstr = (String[]) getValue();
-                                    if (valstr != null) {
+									if (valstr != null && valstr.length > 0) {
                                         for (int i = 0; i < valstr.length - 1; i++) {
                                             value += valstr[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -669,7 +657,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_CHAR:
                                 case TangoConst.Tango_DEV_UCHAR:
                                     final byte[] valc = (byte[]) getValue();
-                                    if (valc != null) {
+									if (valc != null && valc.length > 0) {
                                         for (int i = 0; i < valc.length - 1; i++) {
                                             value += valc[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -680,7 +668,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_LONG:
                                 case TangoConst.Tango_DEV_ULONG:
                                     final int[] vall = (int[]) getValue();
-                                    if (vall != null) {
+									if (vall != null && vall.length > 0) {
                                         for (int i = 0; i < vall.length - 1; i++) {
                                             value += vall[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -690,7 +678,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_USHORT:
                                 case TangoConst.Tango_DEV_SHORT:
                                     final short[] vals = (short[]) getValue();
-                                    if (vals != null) {
+									if (vals != null && vals.length > 0) {
                                         for (int i = 0; i < vals.length - 1; i++) {
                                             value += vals[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -699,7 +687,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_FLOAT:
                                     final float[] valf = (float[]) getValue();
-                                    if (valf != null) {
+									if (valf != null && valf.length > 0) {
                                         for (int i = 0; i < valf.length - 1; i++) {
                                             value += valf[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -708,7 +696,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_DOUBLE:
                                     final double[] vald = (double[]) getValue();
-                                    if (vald != null) {
+									if (vald != null && vald.length > 0) {
                                         for (int i = 0; i < vald.length - 1; i++) {
                                             value += vald[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -725,7 +713,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                             switch (dataType) {
                                 case TangoConst.Tango_DEV_BOOLEAN:
                                     final boolean[] valb = (boolean[]) temp[pos];
-                                    if (valb != null) {
+									if (valb != null && valb.length > 0) {
                                         for (int i = 0; i < valb.length - 1; i++) {
                                             value += valb[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -734,7 +722,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_STRING:
                                     final String[] valstr = (String[]) temp[pos];
-                                    if (valstr != null) {
+									if (valstr != null && valstr.length > 0) {
                                         for (int i = 0; i < valstr.length - 1; i++) {
                                             value += valstr[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -744,7 +732,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_CHAR:
                                 case TangoConst.Tango_DEV_UCHAR:
                                     final byte[] valc = (byte[]) temp[pos];
-                                    if (valc != null) {
+									if (valc != null && valc.length > 0) {
                                         for (int i = 0; i < valc.length - 1; i++) {
                                             value += valc[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -755,7 +743,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_LONG:
                                 case TangoConst.Tango_DEV_ULONG:
                                     final int[] vall = (int[]) temp[pos];
-                                    if (vall != null) {
+									if (vall != null && vall.length > 0) {
                                         for (int i = 0; i < vall.length - 1; i++) {
                                             value += vall[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -765,7 +753,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_USHORT:
                                 case TangoConst.Tango_DEV_SHORT:
                                     final short[] vals = (short[]) temp[pos];
-                                    if (vals != null) {
+									if (vals != null && vals.length > 0) {
                                         for (int i = 0; i < vals.length - 1; i++) {
                                             value += vals[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -774,7 +762,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_FLOAT:
                                     final float[] valf = (float[]) temp[pos];
-                                    if (valf != null) {
+									if (valf != null && valf.length > 0) {
                                         for (int i = 0; i < valf.length - 1; i++) {
                                             value += valf[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -783,7 +771,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_DOUBLE:
                                     final double[] vald = (double[]) temp[pos];
-                                    if (vald != null) {
+									if (vald != null && vald.length > 0) {
                                         for (int i = 0; i < vald.length - 1; i++) {
                                             value += vald[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -801,7 +789,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                             switch (dataType) {
                                 case TangoConst.Tango_DEV_BOOLEAN:
                                     final boolean[] valb = (boolean[]) getValue();
-                                    if (valb != null) {
+									if (valb != null && valb.length > 0) {
                                         for (int i = 0; i < valb.length - 1; i++) {
                                             value += valb[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -810,7 +798,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_STRING:
                                     final String[] valstr = (String[]) getValue();
-                                    if (valstr != null) {
+									if (valstr != null && valstr.length > 0) {
                                         for (int i = 0; i < valstr.length - 1; i++) {
                                             value += valstr[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -830,7 +818,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_LONG:
                                 case TangoConst.Tango_DEV_ULONG:
                                     final int[] vall = (int[]) getValue();
-                                    if (vall != null) {
+									if (vall != null && vall.length > 0) {
                                         for (int i = 0; i < vall.length - 1; i++) {
                                             value += vall[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -840,7 +828,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_USHORT:
                                 case TangoConst.Tango_DEV_SHORT:
                                     final short[] vals = (short[]) getValue();
-                                    if (vals != null) {
+									if (vals != null && vals.length > 0) {
                                         for (int i = 0; i < vals.length - 1; i++) {
                                             value += vals[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -849,7 +837,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_FLOAT:
                                     final float[] valf = (float[]) getValue();
-                                    if (valf != null) {
+									if (valf != null && valf.length > 0) {
                                         for (int i = 0; i < valf.length - 1; i++) {
                                             value += valf[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -858,7 +846,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_DOUBLE:
                                     final double[] vald = (double[]) getValue();
-                                    if (vald != null) {
+									if (vald != null && vald.length > 0) {
                                         for (int i = 0; i < vald.length - 1; i++) {
                                             value += vald[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -875,7 +863,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                             switch (dataType) {
                                 case TangoConst.Tango_DEV_BOOLEAN:
                                     final boolean[] valb = (boolean[]) temp[pos];
-                                    if (valb != null) {
+									if (valb != null && valb.length > 0) {
                                         for (int i = 0; i < valb.length - 1; i++) {
                                             value += valb[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -884,7 +872,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_STRING:
                                     final String[] valstr = (String[]) temp[pos];
-                                    if (valstr != null) {
+									if (valstr != null && valstr.length > 0) {
                                         for (int i = 0; i < valstr.length - 1; i++) {
                                             value += valstr[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -894,7 +882,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_CHAR:
                                 case TangoConst.Tango_DEV_UCHAR:
                                     final byte[] valc = (byte[]) temp[pos];
-                                    if (valc != null) {
+									if (valc != null && valc.length > 0) {
                                         for (int i = 0; i < valc.length - 1; i++) {
                                             value += valc[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -904,7 +892,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_LONG:
                                 case TangoConst.Tango_DEV_ULONG:
                                     final int[] vall = (int[]) temp[pos];
-                                    if (vall != null) {
+									if (vall != null && vall.length > 0) {
                                         for (int i = 0; i < vall.length - 1; i++) {
                                             value += vall[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -914,7 +902,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                 case TangoConst.Tango_DEV_USHORT:
                                 case TangoConst.Tango_DEV_SHORT:
                                     final short[] vals = (short[]) temp[pos];
-                                    if (vals != null) {
+									if (vals != null && vals.length > 0) {
                                         for (int i = 0; i < vals.length - 1; i++) {
                                             value += vals[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -923,7 +911,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_FLOAT:
                                     final float[] valf = (float[]) temp[pos];
-                                    if (valf != null) {
+									if (valf != null && valf.length > 0) {
                                         for (int i = 0; i < valf.length - 1; i++) {
                                             value += valf[i] + SnapConst.CLOB_SEPARATOR;
                                         }
@@ -932,7 +920,7 @@ public class SnapAttributeExtract extends SnapAttribute {
                                     break;
                                 case TangoConst.Tango_DEV_DOUBLE:
                                     final double[] vald = (double[]) temp[pos];
-                                    if (vald != null) {
+									if (vald != null && vald.length > 0) {
                                         for (int i = 0; i < vald.length - 1; i++) {
                                             value += vald[i] + SnapConst.CLOB_SEPARATOR;
                                         }
diff --git a/src/test/java/fr/soleil/archiving/snap/api/tools/SnapAttributesExtractTest.java b/src/test/java/fr/soleil/archiving/snap/api/tools/SnapAttributesExtractTest.java
new file mode 100644
index 0000000..d567dd3
--- /dev/null
+++ b/src/test/java/fr/soleil/archiving/snap/api/tools/SnapAttributesExtractTest.java
@@ -0,0 +1,72 @@
+package fr.soleil.archiving.snap.api.tools;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import fr.esrf.Tango.AttrDataFormat;
+import fr.esrf.Tango.AttrWriteType;
+import fr.esrf.TangoDs.TangoConst;
+
+public class SnapAttributesExtractTest {
+	@Test
+	public void ScalareToStingTest() {
+		
+		testReadWrite(99, AttrDataFormat._SCALAR, "0.0", "1.0", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_STRING,AttrDataFormat._SCALAR, "read", "write", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_STATE, AttrDataFormat._SCALAR, "0", "1", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_UCHAR, AttrDataFormat._SCALAR, "0", "1", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_LONG, AttrDataFormat._SCALAR, "0", "1", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_ULONG, AttrDataFormat._SCALAR, "0", "1", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_BOOLEAN, AttrDataFormat._SCALAR, "true", "false", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_SHORT, AttrDataFormat._SCALAR, "0", "1", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_FLOAT, AttrDataFormat._SCALAR, "0.0", "1.0", "NULL");
+		testReadWrite(TangoConst.Tango_DEV_DOUBLE, AttrDataFormat._SCALAR, "0.0", "1.0", "NULL");
+
+	}
+
+	@Test
+	public void SpectrumToStringTest() {
+		testReadWrite(TangoConst.Tango_DEV_STRING, AttrDataFormat._SPECTRUM, "[test,test]", "[test]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_UCHAR, AttrDataFormat._SPECTRUM, "[0]", "[1]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_LONG, AttrDataFormat._SPECTRUM, "[0]", "[1]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_ULONG, AttrDataFormat._SPECTRUM, "[0]", "[1]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_BOOLEAN, AttrDataFormat._SPECTRUM, "[true]", "[false]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_SHORT, AttrDataFormat._SPECTRUM, "[0]", "[1]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_FLOAT, AttrDataFormat._SPECTRUM, "[0.0]", "[1.0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_DOUBLE, AttrDataFormat._SPECTRUM, "[0.0]", "[1.0]", "[]");
+
+		testReadWrite(TangoConst.Tango_DEV_STRING, AttrDataFormat._SPECTRUM, "[test,test,test3]", "[test,test2]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_UCHAR, AttrDataFormat._SPECTRUM, "[0,1]", "[1,0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_LONG, AttrDataFormat._SPECTRUM, "[0,1]", "[1,0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_ULONG, AttrDataFormat._SPECTRUM, "[0,1]", "[1,0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_BOOLEAN, AttrDataFormat._SPECTRUM, "[true,false]", "[false,true]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_SHORT, AttrDataFormat._SPECTRUM, "[0,1]", "[1,0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_FLOAT, AttrDataFormat._SPECTRUM, "[0.0,1.0]", "[1.0,2.0]", "[]");
+		testReadWrite(TangoConst.Tango_DEV_DOUBLE, AttrDataFormat._SPECTRUM, "[0.0,1.0]", "[1.0,2.0]", "[]");
+	}
+
+	private void testReadWrite(int dataType,int dataFormat, String readStringValue, String writeStringValue, String emptyValue) {
+		String[] args = { "test", "0", "" + dataType , "" + dataFormat,
+				"", readStringValue, writeStringValue };
+		args[4] = "" + AttrWriteType._READ;
+		SnapAttributeExtract sae = new SnapAttributeExtract(args);
+		assertEquals(readStringValue, sae.valueToString(0));
+		assertEquals(emptyValue, sae.valueToString(1));
+
+		args[4] = "" + AttrWriteType._WRITE;
+		sae = new SnapAttributeExtract(args);
+		assertEquals(emptyValue, sae.valueToString(0));
+		assertEquals(writeStringValue, sae.valueToString(1));
+
+		args[4] = "" + AttrWriteType._READ_WITH_WRITE;
+		sae = new SnapAttributeExtract(args);
+		assertEquals(readStringValue, sae.valueToString(0));
+		assertEquals(writeStringValue, sae.valueToString(1));
+
+		args[4] = "" + AttrWriteType._READ_WRITE;
+		sae = new SnapAttributeExtract(args);
+		assertEquals(readStringValue, sae.valueToString(0));
+		assertEquals(writeStringValue, sae.valueToString(1));
+	}
+}
-- 
GitLab