Skip to content

Commit b5057e8

Browse files
Fix adding a generic parameter failing (#2619)
Fix adding a generic parameter failing
1 parent cd76ad6 commit b5057e8

File tree

3 files changed

+98
-3
lines changed

3 files changed

+98
-3
lines changed

temporal-sdk/src/main/java/io/temporal/common/converter/DataConverter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.google.common.base.Defaults;
55
import com.google.common.base.Preconditions;
6+
import com.google.common.reflect.TypeToken;
67
import io.temporal.api.common.v1.Payload;
78
import io.temporal.api.common.v1.Payloads;
89
import io.temporal.api.failure.v1.Failure;
@@ -132,7 +133,7 @@ default Object[] fromPayloads(
132133
if (!content.isPresent()) {
133134
// Return defaults for all the parameters
134135
for (int i = 0; i < parameterTypes.length; i++) {
135-
result[i] = Defaults.defaultValue((Class<?>) genericParameterTypes[i]);
136+
result[i] = Defaults.defaultValue(TypeToken.of(genericParameterTypes[i]).getRawType());
136137
}
137138
return result;
138139
}
@@ -142,7 +143,7 @@ default Object[] fromPayloads(
142143
Class<?> pt = parameterTypes[i];
143144
Type gt = genericParameterTypes[i];
144145
if (i >= count) {
145-
result[i] = Defaults.defaultValue((Class<?>) gt);
146+
result[i] = Defaults.defaultValue(TypeToken.of(gt).getRawType());
146147
} else {
147148
result[i] = this.fromPayload(payloads.getPayloads(i), pt, gt);
148149
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package io.temporal.common.converter;
2+
3+
import io.temporal.api.common.v1.Payloads;
4+
import java.lang.reflect.Method;
5+
import java.util.List;
6+
import java.util.Optional;
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
10+
public class DataConverterTest {
11+
// Test methods for reflection
12+
public String testMethodNormalParameter(String input, String names) {
13+
return "";
14+
}
15+
16+
public String testMethodGenericParameter(String input, List<String> names) {
17+
return "";
18+
}
19+
20+
public String testMethodGenericArrayParameter(String input, List<Integer>[] names) {
21+
return "";
22+
}
23+
24+
@Test
25+
public void noContent() throws NoSuchMethodException {
26+
DataConverter dc = GlobalDataConverter.get();
27+
Method m = this.getClass().getMethod("testMethodGenericParameter", String.class, List.class);
28+
Object[] result =
29+
dc.fromPayloads(Optional.empty(), m.getParameterTypes(), m.getGenericParameterTypes());
30+
Assert.assertNull(result[0]);
31+
Assert.assertNull(result[1]);
32+
}
33+
34+
@Test
35+
public void addParameter() throws NoSuchMethodException {
36+
DataConverter dc = GlobalDataConverter.get();
37+
Optional<Payloads> p = dc.toPayloads("test");
38+
Method m = this.getClass().getMethod("testMethodNormalParameter", String.class, String.class);
39+
Object[] result = dc.fromPayloads(p, m.getParameterTypes(), m.getGenericParameterTypes());
40+
Assert.assertEquals("test", result[0]);
41+
Assert.assertNull(result[1]);
42+
}
43+
44+
@Test
45+
public void addGenericParameter() throws NoSuchMethodException {
46+
DataConverter dc = GlobalDataConverter.get();
47+
Optional<Payloads> p = dc.toPayloads("test");
48+
Method m = this.getClass().getMethod("testMethodGenericParameter", String.class, List.class);
49+
Object[] result = dc.fromPayloads(p, m.getParameterTypes(), m.getGenericParameterTypes());
50+
Assert.assertEquals("test", result[0]);
51+
Assert.assertNull(result[1]);
52+
}
53+
54+
@Test
55+
public void addGenericArrayParameter() throws NoSuchMethodException {
56+
DataConverter dc = GlobalDataConverter.get();
57+
Optional<Payloads> p = dc.toPayloads("test");
58+
Method m =
59+
this.getClass().getMethod("testMethodGenericArrayParameter", String.class, List[].class);
60+
Object[] result = dc.fromPayloads(p, m.getParameterTypes(), m.getGenericParameterTypes());
61+
Assert.assertEquals("test", result[0]);
62+
Assert.assertNull(result[1]);
63+
}
64+
}

temporal-sdk/src/test/java/io/temporal/workflow/GenericParametersWorkflowTest.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import io.temporal.activity.ActivityInterface;
44
import io.temporal.client.WorkflowClient;
5+
import io.temporal.client.WorkflowStub;
6+
import io.temporal.failure.ApplicationFailure;
57
import io.temporal.testing.internal.SDKTestOptions;
68
import io.temporal.testing.internal.SDKTestWorkflowRule;
79
import java.time.Duration;
@@ -19,7 +21,8 @@ public class GenericParametersWorkflowTest {
1921
@Rule
2022
public SDKTestWorkflowRule testWorkflowRule =
2123
SDKTestWorkflowRule.newBuilder()
22-
.setWorkflowTypes(GenericParametersWorkflowImpl.class)
24+
.setWorkflowTypes(
25+
GenericParametersWorkflowImpl.class, MissingGenericParametersWorkflowImpl.class)
2326
.setActivityImplementations(activitiesImpl)
2427
.build();
2528

@@ -119,4 +122,31 @@ public List<UUID> query(List<UUID> arg) {
119122
return result;
120123
}
121124
}
125+
126+
@Test
127+
public void testMissingGenericParameter() {
128+
WorkflowStub untypedStub =
129+
testWorkflowRule.newUntypedWorkflowStub("MissingGenericParametersWorkflow");
130+
untypedStub.start(testWorkflowRule.getTaskQueue());
131+
String result = untypedStub.getResult(String.class);
132+
Assert.assertEquals(testWorkflowRule.getTaskQueue(), result);
133+
}
134+
135+
@WorkflowInterface
136+
public interface MissingGenericParametersWorkflow {
137+
@WorkflowMethod
138+
String execute(String name, List<String> names);
139+
}
140+
141+
public static class MissingGenericParametersWorkflowImpl
142+
implements MissingGenericParametersWorkflow {
143+
@Override
144+
public String execute(String name, List<String> names) {
145+
if (names != null) {
146+
throw ApplicationFailure.newFailure(
147+
"Generic parameter should not be present", "GenericParameterError");
148+
}
149+
return name;
150+
}
151+
}
122152
}

0 commit comments

Comments
 (0)