Skip to content

Commit f3b8216

Browse files
authored
DataConvertor Argument Deserialization: Use defaults for missing arguments and ignore additional arguments (#184)
Use defaults for missing arguments and ignore additional arguments on workflow method invocation (#184)
1 parent b9db8c5 commit f3b8216

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

src/main/java/com/uber/cadence/converter/JsonDataConverter.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.uber.cadence.converter;
1919

20+
import com.google.common.base.Defaults;
2021
import com.google.common.collect.ImmutableSet;
2122
import com.google.gson.Gson;
2223
import com.google.gson.GsonBuilder;
@@ -162,10 +163,29 @@ public Object[] fromDataArray(byte[] content, Type... valueTypes) throws DataCon
162163
Object result = gson.fromJson(new String(content, StandardCharsets.UTF_8), valueTypes[0]);
163164
return new Object[] {result};
164165
}
165-
JsonArray array = parser.parse(new String(content, StandardCharsets.UTF_8)).getAsJsonArray();
166+
167+
JsonElement element = parser.parse(new String(content, StandardCharsets.UTF_8));
168+
JsonArray array;
169+
if (element instanceof JsonArray) {
170+
array = element.getAsJsonArray();
171+
} else {
172+
array = new JsonArray();
173+
array.add(element);
174+
}
175+
166176
Object[] result = new Object[valueTypes.length];
167177
for (int i = 0; i < valueTypes.length; i++) {
168-
result[i] = gson.fromJson(array.get(i), valueTypes[i]);
178+
179+
if (i >= array.size()) { // Missing arugments => add defaults
180+
Type t = valueTypes[i];
181+
if (t instanceof Class) {
182+
result[i] = Defaults.defaultValue((Class<?>) t);
183+
} else {
184+
result[i] = null;
185+
}
186+
} else {
187+
result[i] = gson.fromJson(array.get(i), valueTypes[i]);
188+
}
169189
}
170190
return result;
171191
} catch (DataConverterException e) {

src/test/java/com/uber/cadence/converter/JsonDataConverterTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,46 @@ public void testUUIDList() throws NoSuchMethodException {
7575
assertEquals(result.toString(), list, result);
7676
}
7777

78+
public static void threeArguments(int one, int two, String three) {}
79+
80+
public static void aLotOfArguments(int one, int two, String three, Object obj, int[] intArr) {}
81+
82+
@Test
83+
public void AdditionalInputArgumentsAreIgnored() throws NoSuchMethodException {
84+
Method m =
85+
JsonDataConverterTest.class.getDeclaredMethod(
86+
"threeArguments", int.class, int.class, String.class);
87+
Type[] arg = m.getGenericParameterTypes();
88+
89+
DataConverter converter = JsonDataConverter.getInstance();
90+
byte[] data = converter.toData(1, 2, "a string", "an extra string :o!!!");
91+
@SuppressWarnings("unchecked")
92+
Object[] deserializedArguments = converter.fromDataArray(data, arg);
93+
assertEquals(3, deserializedArguments.length);
94+
assertEquals(1, (int) deserializedArguments[0]);
95+
assertEquals(2, (int) deserializedArguments[1]);
96+
assertEquals("a string", deserializedArguments[2]);
97+
}
98+
99+
@Test
100+
public void MissingInputArgumentsArePopulatedWithDefaultValues() throws NoSuchMethodException {
101+
Method m =
102+
JsonDataConverterTest.class.getDeclaredMethod(
103+
"aLotOfArguments", int.class, int.class, String.class, Object.class, int[].class);
104+
Type[] arg = m.getGenericParameterTypes();
105+
106+
DataConverter converter = JsonDataConverter.getInstance();
107+
byte[] data = converter.toData(1);
108+
@SuppressWarnings("unchecked")
109+
Object[] deserializedArguments = converter.fromDataArray(data, arg);
110+
assertEquals(5, deserializedArguments.length);
111+
assertEquals(1, (int) deserializedArguments[0]);
112+
assertEquals(0, (int) deserializedArguments[1]);
113+
assertEquals(null, deserializedArguments[2]);
114+
assertEquals(null, deserializedArguments[3]);
115+
assertEquals(null, deserializedArguments[4]);
116+
}
117+
78118
@Test
79119
public void testClass() {
80120
DataConverter converter = JsonDataConverter.getInstance();

0 commit comments

Comments
 (0)