Skip to content

Commit 7554fde

Browse files
committed
Add missing types to PVA table decoding
Throw exception if cannot decode row to prevent later index out of bounds exceptions. ArrayBoolean is not supported in IVTable so put booleans in a regular Java list. This requires additional stream to convert primitive boolean to boxed Boolean.
1 parent d0eb0e4 commit 7554fde

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

core/pv/src/main/java/org/phoebus/pv/pva/PVAStructureHelper.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@
77
******************************************************************************/
88
package org.phoebus.pv.pva;
99

10+
import static java.util.stream.Collectors.toList;
11+
import static java.util.stream.IntStream.range;
1012
import static org.phoebus.pv.pva.Decoders.decodeAlarm;
1113
import static org.phoebus.pv.pva.Decoders.decodeTime;
1214

1315
import java.util.ArrayList;
1416
import java.util.Arrays;
1517
import java.util.List;
1618
import java.util.Optional;
19+
import java.util.stream.Collectors;
20+
import java.util.stream.IntStream;
1721

1822
import org.epics.pva.data.PVAArray;
1923
import org.epics.pva.data.PVABool;
24+
import org.epics.pva.data.PVABoolArray;
2025
import org.epics.pva.data.PVAByteArray;
2126
import org.epics.pva.data.PVAData;
2227
import org.epics.pva.data.PVADoubleArray;
@@ -30,10 +35,17 @@
3035
import org.epics.pva.data.PVAStructure;
3136
import org.epics.pva.data.PVAStructureArray;
3237
import org.epics.pva.data.PVAUnion;
38+
import org.epics.util.array.ArrayBoolean;
39+
import org.epics.util.array.ArrayByte;
3340
import org.epics.util.array.ArrayDouble;
3441
import org.epics.util.array.ArrayFloat;
3542
import org.epics.util.array.ArrayInteger;
43+
import org.epics.util.array.ArrayLong;
44+
import org.epics.util.array.ArrayShort;
45+
import org.epics.util.array.ArrayUByte;
3646
import org.epics.util.array.ArrayUInteger;
47+
import org.epics.util.array.ArrayULong;
48+
import org.epics.util.array.ArrayUShort;
3749
import org.epics.vtype.Alarm;
3850
import org.epics.vtype.AlarmSeverity;
3951
import org.epics.vtype.AlarmStatus;
@@ -203,6 +215,45 @@ else if (column instanceof PVAStringArray)
203215
types.add(String.class);
204216
values.add(Arrays.asList(typed.get()));
205217
}
218+
else if (column instanceof PVAShortArray)
219+
{
220+
final PVAShortArray typed = (PVAShortArray)column;
221+
types.add(Short.TYPE);
222+
if (typed.isUnsigned())
223+
values.add(ArrayUShort.of(typed.get()));
224+
else
225+
values.add(ArrayShort.of(typed.get()));
226+
}
227+
else if (column instanceof PVALongArray)
228+
{
229+
final PVALongArray typed = (PVALongArray)column;
230+
types.add(Long.TYPE);
231+
if (typed.isUnsigned())
232+
values.add(ArrayULong.of(typed.get()));
233+
else
234+
values.add(ArrayLong.of(typed.get()));
235+
}
236+
else if (column instanceof PVAByteArray)
237+
{
238+
final PVAByteArray typed = (PVAByteArray)column;
239+
types.add(Byte.TYPE);
240+
if (typed.isUnsigned())
241+
values.add(ArrayUByte.of(typed.get()));
242+
else
243+
values.add(ArrayByte.of(typed.get()));
244+
}
245+
else if (column instanceof PVABoolArray)
246+
{
247+
final PVABoolArray typed = (PVABoolArray)column;
248+
types.add(Boolean.TYPE);
249+
boolean[] data = typed.get();
250+
// Convert to boxed Integer to add to List
251+
values.add(range(0, data.length).mapToObj(i -> data[i]).collect(toList()));
252+
}
253+
else
254+
{
255+
throw new RuntimeException("Could not decode table column of type: " + column.getClass());
256+
}
206257
}
207258

208259
return VTable.of(types, names, values);

0 commit comments

Comments
 (0)