Skip to content

Commit 67c25ef

Browse files
authored
Merge pull request #135 from epics-base/serialize_vtable
Fix for corner case in serialization of VTable
2 parents a70930d + b4157f5 commit 67c25ef

4 files changed

Lines changed: 57 additions & 39 deletions

File tree

epics-vtype/vtype-gson/src/main/java/org/epics/vtype/gson/VTypeToGson.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -280,49 +280,49 @@ static VTable toVTable(JsonElement jsonElement) {
280280
listString.add(i, columnNames.get(i).getAsString());
281281
Class<?> clazz = getClass(columnTypes.get(i).getAsString());
282282
listClass.add(i, clazz);
283-
JsonArray value = jsonObject.get("value").getAsJsonArray();
284-
JsonArray ja = value.get(i).getAsJsonArray();
283+
JsonArray value = jsonObject.get("value").getAsJsonArray()
284+
.get(i).getAsJsonArray();
285285
clazz = listClass.get(i);
286-
if (ja == null || ja.size() == 0 || clazz == null) {
286+
if (clazz == null) {
287287
listObject.add(i, Collections.emptyList());
288288
} else {
289289
String columnType = columnTypes.get(i).getAsString();
290290
switch (columnType){
291291
case "bool":
292-
listObject.add(i, GsonArrays.toListBoolean(ja));
292+
listObject.add(i, GsonArrays.toListBoolean(value));
293293
break;
294294
case "byte":
295-
listObject.add(i, GsonArrays.toListByte(ja));
295+
listObject.add(i, GsonArrays.toListByte(value));
296296
break;
297297
case "ubyte":
298-
listObject.add(i, GsonArrays.toListUByte(ja));
298+
listObject.add(i, GsonArrays.toListUByte(value));
299299
break;
300300
case "short":
301-
listObject.add(i, GsonArrays.toListShort(ja));
301+
listObject.add(i, GsonArrays.toListShort(value));
302302
break;
303303
case "ushort":
304-
listObject.add(i, GsonArrays.toListUShort(ja));
304+
listObject.add(i, GsonArrays.toListUShort(value));
305305
break;
306306
case "int":
307-
listObject.add(i, GsonArrays.toListInt(ja));
307+
listObject.add(i, GsonArrays.toListInt(value));
308308
break;
309309
case "uint":
310-
listObject.add(i, GsonArrays.toListUInteger(ja));
310+
listObject.add(i, GsonArrays.toListUInteger(value));
311311
break;
312312
case "long":
313-
listObject.add(i, GsonArrays.toListLong(ja));
313+
listObject.add(i, GsonArrays.toListLong(value));
314314
break;
315315
case "ulong":
316-
listObject.add(i, GsonArrays.toListULong(ja));
316+
listObject.add(i, GsonArrays.toListULong(value));
317317
break;
318318
case "float":
319-
listObject.add(i, GsonArrays.toListFloat(ja));
319+
listObject.add(i, GsonArrays.toListFloat(value));
320320
break;
321321
case "double":
322-
listObject.add(i, GsonArrays.toListDouble(ja));
322+
listObject.add(i, GsonArrays.toListDouble(value));
323323
break;
324324
case "string":
325-
listObject.add(i, GsonArrays.toListString(ja));
325+
listObject.add(i, GsonArrays.toListString(value));
326326
break;
327327
default:
328328
listObject.add(i, Collections.emptyList());

epics-vtype/vtype-gson/src/test/java/org/epics/vtype/gson/VTypeToGsonTest.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,9 @@ public void testVTable(){
378378
Long.TYPE,
379379
Double.TYPE,
380380
Float.TYPE,
381-
String.class);
382-
List<String> names = Arrays.asList("bool", "byte", "ubyte", "short", "ushort", "int", "uint", "long", "ulong", "double", "float", "string");
381+
String.class,
382+
Long.TYPE);
383+
List<String> names = Arrays.asList("bool", "byte", "ubyte", "short", "ushort", "int", "uint", "long", "ulong", "double", "float", "string", "empty");
383384
boolean[] bools = {true, false, true};
384385
ArrayBoolean boolValues = ArrayBoolean.of(bools);
385386

@@ -412,6 +413,9 @@ public void testVTable(){
412413
String[] strings = {"a","b"};
413414
List<String> stringValues = Arrays.asList(strings);
414415

416+
long[] emptyLongs = new long[0];
417+
ArrayLong emptyLongValues = ArrayLong.of(emptyLongs);
418+
415419
VTable vTable = VTable.of(types, names, Arrays.asList(
416420
boolValues,
417421
byteValues,
@@ -424,11 +428,11 @@ public void testVTable(){
424428
ulongValues,
425429
doubleValues,
426430
floatValues,
427-
stringValues));
431+
stringValues,
432+
emptyLongValues));
428433

429434
// This should not fail
430435
JsonObject jsonObject = VTypeToGson.toJson(vTable);
431-
System.out.println(jsonObject.toString());
432436

433437
VTable deserialized = (VTable) VTypeToGson.toVType(jsonObject);
434438
assertEquals(vTable.getColumnCount(), deserialized.getColumnCount());
@@ -500,5 +504,10 @@ public void testVTable(){
500504
String[] deserializedStrings = new String[deserializedStringValues.size()];
501505
deserializedStringValues.toArray(deserializedStrings);
502506
assertArrayEquals(strings, deserializedStrings);
507+
508+
ArrayLong deserializedEmptyLongValues = (ArrayLong)deserialized.getColumnData(12);
509+
long[] deserializedEmptyLongs = new long[deserializedEmptyLongValues.size()];
510+
deserializedEmptyLongValues.toArray(deserializedEmptyLongs);
511+
assertArrayEquals(emptyLongs, deserializedEmptyLongs);
503512
}
504513
}

epics-vtype/vtype-json/src/main/java/org/epics/vtype/json/VTypeToJsonV1.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -384,49 +384,49 @@ static VTable toVTable(JsonObject jsonObject) {
384384
listString.add(i, columnNames.getString(i));
385385
Class<?> clazz = getClass(columnTypes.getString(i));
386386
listClass.add(i, clazz);
387-
JsonArray value = jsonObject.getJsonArray("value");
388-
JsonArray ja = value.getJsonArray(i);
387+
JsonArray value = jsonObject.getJsonArray("value").getJsonArray(i);
389388
clazz = listClass.get(i);
390-
if (ja == null || ja.isEmpty() || clazz == null) {
389+
if (clazz == null) {
391390
listObject.add(i, Collections.emptyList());
392-
} else {
391+
}
392+
else {
393393
String columnType = columnTypes.getString(i);
394394
switch (columnType){
395395
case "bool":
396-
listObject.add(i, JsonArrays.toListBoolean(ja));
396+
listObject.add(i, JsonArrays.toListBoolean(value));
397397
break;
398398
case "byte":
399-
listObject.add(i, JsonArrays.toListByte(ja));
399+
listObject.add(i, JsonArrays.toListByte(value));
400400
break;
401401
case "ubyte":
402-
listObject.add(i, JsonArrays.toListUByte(ja));
402+
listObject.add(i, JsonArrays.toListUByte(value));
403403
break;
404404
case "short":
405-
listObject.add(i, JsonArrays.toListShort(ja));
405+
listObject.add(i, JsonArrays.toListShort(value));
406406
break;
407407
case "ushort":
408-
listObject.add(i, JsonArrays.toListUShort(ja));
408+
listObject.add(i, JsonArrays.toListUShort(value));
409409
break;
410410
case "int":
411-
listObject.add(i, JsonArrays.toListInt(ja));
411+
listObject.add(i, JsonArrays.toListInt(value));
412412
break;
413413
case "uint":
414-
listObject.add(i, JsonArrays.toListUInteger(ja));
414+
listObject.add(i, JsonArrays.toListUInteger(value));
415415
break;
416416
case "long":
417-
listObject.add(i, JsonArrays.toListLong(ja));
417+
listObject.add(i, JsonArrays.toListLong(value));
418418
break;
419419
case "ulong":
420-
listObject.add(i, JsonArrays.toListULong(ja));
420+
listObject.add(i, JsonArrays.toListULong(value));
421421
break;
422422
case "float":
423-
listObject.add(i, JsonArrays.toListFloat(ja));
423+
listObject.add(i, JsonArrays.toListFloat(value));
424424
break;
425425
case "double":
426-
listObject.add(i, JsonArrays.toListDouble(ja));
426+
listObject.add(i, JsonArrays.toListDouble(value));
427427
break;
428428
case "string":
429-
listObject.add(i, JsonArrays.toListString(ja));
429+
listObject.add(i, JsonArrays.toListString(value));
430430
break;
431431
default:
432432
listObject.add(i, Collections.emptyList());

epics-vtype/vtype-json/src/test/java/org/epics/vtype/json/VTypeToJsonTest.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,9 @@ public void testVTable(){
365365
Long.TYPE,
366366
Double.TYPE,
367367
Float.TYPE,
368-
String.class);
369-
List<String> names = Arrays.asList("bool", "byte", "ubyte", "short", "ushort", "int", "uint", "long", "ulong", "double", "float", "string");
368+
String.class,
369+
Long.TYPE);
370+
List<String> names = Arrays.asList("bool", "byte", "ubyte", "short", "ushort", "int", "uint", "long", "ulong", "double", "float", "string", "empty");
370371
boolean[] bools = {true, false, true};
371372
ArrayBoolean boolValues = ArrayBoolean.of(bools);
372373

@@ -399,6 +400,9 @@ public void testVTable(){
399400
String[] strings = {"a","b"};
400401
List<String> stringValues = Arrays.asList(strings);
401402

403+
long[] emptyLongs = new long[0];
404+
ArrayLong emptyLongValues = ArrayLong.of(emptyLongs);
405+
402406
VTable vTable = VTable.of(types, names, Arrays.asList(
403407
boolValues,
404408
byteValues,
@@ -411,11 +415,11 @@ public void testVTable(){
411415
ulongValues,
412416
doubleValues,
413417
floatValues,
414-
stringValues));
418+
stringValues,
419+
emptyLongValues));
415420

416421
// This should not fail
417422
JsonObject jsonObject = VTypeToJson.toJson(vTable);
418-
System.out.println(jsonObject.toString());
419423

420424
VTable deserialized = (VTable) VTypeToJson.toVType(jsonObject);
421425
assertEquals(vTable.getColumnCount(), deserialized.getColumnCount());
@@ -487,5 +491,10 @@ public void testVTable(){
487491
String[] deserializedStrings = new String[deserializedStringValues.size()];
488492
deserializedStringValues.toArray(deserializedStrings);
489493
assertArrayEquals(strings, deserializedStrings);
494+
495+
ArrayLong deserializedEmptyLongValues = (ArrayLong)deserialized.getColumnData(12);
496+
long[] deserializedEmptyLongs = new long[deserializedEmptyLongValues.size()];
497+
deserializedEmptyLongValues.toArray(deserializedEmptyLongs);
498+
assertArrayEquals(emptyLongs, deserializedEmptyLongs);
490499
}
491500
}

0 commit comments

Comments
 (0)