Skip to content
Snippets Groups Projects
Commit d2805cec authored by Gwenaelle ABEILLE's avatar Gwenaelle ABEILLE
Browse files

fix bug for calculations on arrays that may return a scalar value for spectrum...

fix bug for calculations on arrays that may return a scalar value for spectrum attributes. Soleil Jira issue TANGODEVIC-2076
parent e4667436
No related branches found
No related tags found
No related merge requests found
package fr.soleil.tango.server.tangoparser;
import java.util.ArrayList;
import java.util.List;
import com.google.common.collect.BiMap;
import fr.esrf.Tango.AttrDataFormat;
import fr.esrf.Tango.AttrWriteType;
import fr.esrf.Tango.DevFailed;
import fr.soleil.tango.clientapi.util.TypeConversionUtil;
import fr.soleil.tango.parser.AJepParser;
import fr.soleil.tango.parser.JepParserRead;
import fr.soleil.tango.parser.JepParserWrite;
import fr.soleil.tango.parser.datasource.TangoSource;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -13,21 +19,13 @@ import org.tango.server.attribute.AttributeValue;
import org.tango.server.attribute.IAttributeBehavior;
import org.tango.utils.DevFailedUtils;
import com.google.common.collect.BiMap;
import fr.esrf.Tango.AttrDataFormat;
import fr.esrf.Tango.AttrWriteType;
import fr.esrf.Tango.DevFailed;
import fr.soleil.tango.clientapi.util.TypeConversionUtil;
import fr.soleil.tango.parser.AJepParser;
import fr.soleil.tango.parser.JepParserRead;
import fr.soleil.tango.parser.JepParserWrite;
import fr.soleil.tango.parser.datasource.TangoSource;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
*
* @author fourneau
*
*/
public final class DynamicAttributeParser implements IAttributeBehavior {
......@@ -35,10 +33,11 @@ public final class DynamicAttributeParser implements IAttributeBehavior {
private final AttributeConfiguration config;
// Threaded or not
private final boolean isSynchronous;
private JepParserRead jepParserRead;
private final WriteExpressionGroup jepParserWriterGroup;
private final AttributeValue value = new AttributeValue();
private final List<AJepParser> variablesJep;
private JepParserRead jepParserRead;
private boolean isWriteInitialized = false;
public DynamicAttributeParser(final String deviceName, final AttributeConfiguration config,
final String expressionsR, final List<String> expressionsW, final BiMap<String, String> variables,
......@@ -137,6 +136,13 @@ public final class DynamicAttributeParser implements IAttributeBehavior {
return value;
}
@Override
public void setValue(final AttributeValue value) throws DevFailed {
logger.debug("writing {} on {}", config.getName(), value.getValue());
isWriteInitialized = true;
jepParserWriterGroup.setValue(value.getValue(), true);
}
public void launchRefresh(final boolean lock) throws DevFailed {
if (jepParserRead != null) {
jepParserRead.refresh(lock);
......@@ -153,8 +159,17 @@ public final class DynamicAttributeParser implements IAttributeBehavior {
if (config.getFormat().equals(AttrDataFormat.SCALAR)) {
value.setValue(TypeConversionUtil.castToType(config.getType(), result), System.currentTimeMillis());
} else if (config.getFormat().equals(AttrDataFormat.SPECTRUM)) {
if (result.getClass().isArray()) {
value.setValue(TypeConversionUtil.castToArray(config.getScalarType(), result),
System.currentTimeMillis());
} else {
// in some cases, result is not an array. ex: test1 = doubleSpectrum/2 with doubleSpectrum with one element
// set value into an array
Object array = Array.newInstance(config.getScalarType(), 1);
Array.set(array, 0, result);
value.setValue(TypeConversionUtil.castToArray(config.getScalarType(), array),
System.currentTimeMillis());
}
} // TODO IMAGE not yet supported
}
} catch (final DevFailed e) {
......@@ -169,15 +184,6 @@ public final class DynamicAttributeParser implements IAttributeBehavior {
logger.debug("read {} on {}", value.getValue(), config.getName());
}
private boolean isWriteInitialized = false;
@Override
public void setValue(final AttributeValue value) throws DevFailed {
logger.debug("writing {} on {}", config.getName(), value.getValue());
isWriteInitialized = true;
jepParserWriterGroup.setValue(value.getValue(), true);
}
public List<AJepParser> getJepParsers() {
return variablesJep;
}
......
package fr.soleil.tango.server.tangoparser.testserver;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
import java.lang.reflect.Array;
import java.util.Map;
import fr.esrf.Tango.AttrDataFormat;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.ApiUtil;
import fr.esrf.TangoApi.Database;
import fr.esrf.TangoApi.DbDatum;
import fr.soleil.tango.clientapi.TangoAttribute;
import fr.soleil.tango.clientapi.TangoCommand;
import fr.soleil.tango.parser.datasource.AttributeResult;
import fr.soleil.tango.parser.datasource.SourceManager;
import fr.soleil.tango.parser.datasource.TangoSource;
import fr.soleil.tango.server.tangoparser.TangoParser;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
......@@ -30,28 +24,25 @@ import org.mockito.stubbing.Answer;
import org.tango.server.ServerManager;
import org.tango.utils.DevFailedUtils;
import fr.esrf.Tango.AttrDataFormat;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.ApiUtil;
import fr.esrf.TangoApi.Database;
import fr.esrf.TangoApi.DbDatum;
import fr.soleil.tango.clientapi.TangoAttribute;
import fr.soleil.tango.clientapi.TangoCommand;
import fr.soleil.tango.parser.datasource.AttributeResult;
import fr.soleil.tango.parser.datasource.SourceManager;
import fr.soleil.tango.parser.datasource.TangoSource;
import fr.soleil.tango.server.tangoparser.TangoParser;
import java.lang.reflect.Array;
import java.util.Map;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class TangoParserTest {
// Instance
private static final String INSTANCE_NAME = "junit";
// Boolean
private static String booleanParser = "calculBoolean";
// Boolean Publisher
private static String booleanPub = "ICA/TEST/TANGOPARSER.PUB/value1Boolean";
// DeviceName Parser
private static String deviceNameParser = "ICA/TEST/TANGOPARSER.JUNIT";
// Double
private static String doubleImgParser = "calculDoubleImg";
private static String doubleImgPub = "ICA/TEST/TANGOPARSER.PUB/value1DoubleIm";
......@@ -60,6 +51,7 @@ public class TangoParserTest {
private static String doubleSpectrumParserAdd = "calculDoubleSpectrumAdd";
private static String doubleSpectrumParserCos = "calculDoubleSpectrumCos";
private static String doubleSpectrumParserDiv = "calculDoubleSpectrumDiv";
private static String doubleSpectrumParserDiv2 = "calculDoubleSpectrumDiv2";
private static String doubleSpectrumParserFft = "calculDoubleSpectrumFft";
private static String doubleSpectrumParserLog = "calculDoubleSpectrumLog";
private static String doubleSpectrumParserMax = "calculDoubleSpectrumMax";
......@@ -74,15 +66,11 @@ public class TangoParserTest {
private static String doubleSpectrumPub = "ICA/TEST/TANGOPARSER.PUB/value1DoubleSpec";
// Float
private static String floatParser = "calculFloat";
private static String floatPub = "ICA/TEST/TANGOPARSER.PUB/value1Float";
private static String floatSpectrumParserAdd = "calculFloatSpectrumAdd";
private static String floatSpectrumParserDiv = "calculFloatSpectrumDiv";
// Float Publisher
private static String floatSpectrumPub = "ICA/TEST/TANGOPARSER.PUB/value1FloatSpec";
// Instance
private static final String INSTANCE_NAME = "junit";
// Integer
private static String intSpectrumParserAdd = "calculIntSpectrumAdd";
......@@ -139,7 +127,8 @@ public class TangoParserTest {
private static String wDoubleSQRTParser = "C";
private static TangoSource mockSource = Mockito.mock(TangoSource.class, withSettings().verboseLogging());
//private static TangoSource mockSource = Mockito.mock(TangoSource.class, withSettings().verboseLogging());
private static TangoSource mockSource = Mockito.mock(TangoSource.class);
private static SourceManager mngr = Mockito.spy(SourceManager.class);
......@@ -147,7 +136,7 @@ public class TangoParserTest {
public static void setUp() throws DevFailed {
System.setProperty("org.tango.server.checkalarms", "false");
// assertThat(System.getProperty("TANGO_HOST"), notNullValue());
// System.setProperty("TANGO_HOST", "calypso:20001");
System.setProperty("TANGO_HOST", "192.168.56.101:10000");
// configure mocking
doNothing().when(mockSource).getResults();
......@@ -156,8 +145,7 @@ public class TangoParserTest {
@Override
public Boolean answer(final InvocationOnMock invocation) {
System.out.println("mock add source " + invocation);
@SuppressWarnings("unchecked")
final Map<String, String> arg = invocation.getArgumentAt(1, Map.class);
@SuppressWarnings("unchecked") final Map<String, String> arg = invocation.getArgumentAt(1, Map.class);
for (final String s : arg.keySet()) {
if (s.contains("spec")) {
return true;
......@@ -184,8 +172,12 @@ public class TangoParserTest {
}).when(mngr).build(anyBoolean(), anyString(), anyString());
TangoParser.setSrcManager(mngr);
// configure properties
// create device in tangodb
System.out.println("create device in tango db");
final Database db = ApiUtil.get_db_obj();
db.add_device(deviceNameParser, TangoParser.class.getSimpleName(), TangoParser.class.getSimpleName() + "/" + INSTANCE_NAME);
// configure properties
final DbDatum[] dbDatum = new DbDatum[7];
final String[] propAttributeNames = new String[]{"value1Boolean," + booleanPub, "value1Double," + doublePub,
......@@ -213,6 +205,7 @@ public class TangoParserTest {
"SPECTRUM DevLong " + intSpectrumParserAdd + ",add(value1IntSpec,1)",
"SPECTRUM DevShort " + shortSpectrumParserAdd + ",add(value1ShortSpec,1)",
// Division
"SPECTRUM DevDouble " + doubleSpectrumParserDiv2 + ",value1DoubleSpec/2",
"SPECTRUM DevDouble " + doubleSpectrumParserDiv + ",div(value1DoubleSpec,[2,2,2,2,2])",
"SPECTRUM DevFloat " + floatSpectrumParserDiv + ",div(value1FloatSpec,value1FloatSpec)",
"SPECTRUM DevLong " + intSpectrumParserDiv + ",div(value1IntSpec,value1IntSpec)",
......@@ -283,9 +276,11 @@ public class TangoParserTest {
dbDatum[5] = new DbDatum("MovingState", "RUNNING");
dbDatum[6] = new DbDatum("ScanMode", true);
System.out.println("put properties in DB");
db.put_device_property(deviceNameParser, dbDatum);
// start the tangoparser
System.out.println("start the server");
ServerManager.getInstance().addClass(TangoParser.class.getSimpleName(), TangoParser.class);
ServerManager.getInstance().start(new String[]{INSTANCE_NAME}, TangoParser.class.getSimpleName());
......@@ -615,6 +610,25 @@ public class TangoParserTest {
assertThat(result, equalTo(value));
}
@Test
public void testReadDoubleSpecDiv1element() throws DevFailed {
final AttributeResult r = new AttributeResult(deviceNameParser, getAtt(doubleSpectrumPub),
AttrDataFormat.SPECTRUM, doubleSpectrumParserDiv2);
final MVector vect = new MVector(1);
vect.setEle(0, 1.0);
r.setValue(vect);
doReturn(r).when(mockSource).getResult(deviceNameParser, getAtt(doubleSpectrumPub));
// final TangoAttribute pub = new TangoAttribute(doubleSpectrumPub);
// pub.write(new Double[] { 1D, 2D, 3D, 4D, 5D });
final TangoAttribute tangoParser = new TangoAttribute(deviceNameParser + "/" + doubleSpectrumParserDiv2);
final Object result = tangoParser.read();
System.out.println("result " + result);
final Object value = new Double[]{0.5D};
assertThat(result, equalTo(value));
}
@Test
public void testReadDoubleSpecFft() throws DevFailed {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment