Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,15 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.reflect.TypeToken;
import io.temporal.api.common.v1.Payload;
import java.lang.reflect.Type;
import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.junit.After;
Expand Down Expand Up @@ -76,6 +82,18 @@ public void testEncodingType() {
assertEquals("json/plain", converter.getEncodingType());
}

@Test
public void serializationUsesTypeHint() {
Jackson3JsonPayloadConverter converter = new Jackson3JsonPayloadConverter();
Type type = new TypeToken<List<Animal>>() {}.getType();

Payload payload = converter.toData(Collections.singletonList(new Cat("Milo")), type).get();
List<Animal> converted = converter.fromData(payload, List.class, type);

assertTrue(converted.get(0) instanceof Cat);
assertEquals("Milo", ((Cat) converted.get(0)).getName());
}

@Test
public void testWireCompatibilityBetweenJackson2AndJackson3() {
JacksonJsonPayloadConverter jackson2 = new JacksonJsonPayloadConverter();
Expand Down Expand Up @@ -213,4 +231,22 @@ public String toString() {
+ '}';
}
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes(@JsonSubTypes.Type(value = Cat.class, name = "cat"))
private interface Animal {}

private static class Cat implements Animal {
private String name;

public Cat() {}

Cat(String name) {
this.name = name;
}

public String getName() {
return name;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ public ActivityClientCallsInterceptor getInvoker() {
@Override
public <I> ActivityHandle<Void> start(
Class<I> activityInterface, Functions.Proc1<I> activity, StartActivityOptions options) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, new Object[0]);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), new Object[0]);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -80,10 +80,10 @@ public <I, A1> ActivityHandle<Void> start(
Functions.Proc2<I, A1> activity,
StartActivityOptions options,
A1 arg1) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, arg1);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -94,10 +94,10 @@ public <I, A1, A2> ActivityHandle<Void> start(
StartActivityOptions options,
A1 arg1,
A2 arg2) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -109,10 +109,10 @@ public <I, A1, A2, A3> ActivityHandle<Void> start(
A1 arg1,
A2 arg2,
A3 arg3) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -125,10 +125,10 @@ public <I, A1, A2, A3, A4> ActivityHandle<Void> start(
A2 arg2,
A3 arg3,
A4 arg4) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3, arg4);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3, arg4);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -142,10 +142,11 @@ public <I, A1, A2, A3, A4, A5> ActivityHandle<Void> start(
A3 arg3,
A4 arg4,
A5 arg5) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3, arg4, arg5);
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(
activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3, arg4, arg5);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -160,11 +161,19 @@ public <I, A1, A2, A3, A4, A5, A6> ActivityHandle<Void> start(
A4 arg4,
A5 arg5,
A6 arg6) {
String activityType =
MethodExtractor.activityTypeName(
activityInterface, MethodExtractor.extract(activityInterface, activity));
Method method = MethodExtractor.extract(activityInterface, activity);
String activityType = MethodExtractor.activityTypeName(activityInterface, method);
UntypedActivityHandle untyped =
start(activityType, options, arg1, arg2, arg3, arg4, arg5, arg6);
start(
activityType,
options,
method.getGenericParameterTypes(),
arg1,
arg2,
arg3,
arg4,
arg5,
arg6);
return ActivityHandle.fromUntyped(untyped, Void.class, null);
}

Expand All @@ -178,7 +187,8 @@ public <I, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, new Object[0]);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), new Object[0]);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -193,7 +203,8 @@ public <I, A1, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, arg1);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -209,7 +220,8 @@ public <I, A1, A2, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -226,7 +238,8 @@ public <I, A1, A2, A3, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -244,7 +257,8 @@ public <I, A1, A2, A3, A4, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3, arg4);
UntypedActivityHandle untyped =
start(activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3, arg4);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -263,7 +277,9 @@ public <I, A1, A2, A3, A4, A5, R> ActivityHandle<R> start(
@SuppressWarnings("unchecked")
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped = start(activityType, options, arg1, arg2, arg3, arg4, arg5);
UntypedActivityHandle untyped =
start(
activityType, options, method.getGenericParameterTypes(), arg1, arg2, arg3, arg4, arg5);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -284,7 +300,16 @@ public <I, A1, A2, A3, A4, A5, A6, R> ActivityHandle<R> start(
Class<R> resultClass = (Class<R>) method.getReturnType();
Type resultType = method.getGenericReturnType();
UntypedActivityHandle untyped =
start(activityType, options, arg1, arg2, arg3, arg4, arg5, arg6);
start(
activityType,
options,
method.getGenericParameterTypes(),
arg1,
arg2,
arg3,
arg4,
arg5,
arg6);
return ActivityHandle.fromUntyped(untyped, resultClass, resultType);
}

Expand All @@ -293,11 +318,20 @@ public <I, A1, A2, A3, A4, A5, A6, R> ActivityHandle<R> start(
@Override
public UntypedActivityHandle start(
String activityType, StartActivityOptions options, @Nullable Object... args) {
return start(activityType, options, null, args);
}

private UntypedActivityHandle start(
String activityType,
StartActivityOptions options,
@Nullable Type[] argTypes,
@Nullable Object... args) {
ActivityClientCallsInterceptor.StartActivityOutput output =
invoker.startActivity(
new ActivityClientCallsInterceptor.StartActivityInput(
activityType,
Arrays.asList(args != null ? args : new Object[0]),
argTypes,
options,
propagatedHeader()));
return new ActivityHandleImpl(output.getActivityId(), output.getActivityRunId(), invoker);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.temporal.api.common.v1.WorkflowExecution;
import io.temporal.workflow.Functions;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
Expand All @@ -13,7 +14,9 @@ final class SignalWithStartBatchRequest implements BatchRequest {
private WorkflowStub stub;
private String signalName;
private Object[] signalArgs;
private Type[] signalArgTypes;
private Object[] startArgs;
private Type[] startArgTypes;
private final AtomicBoolean invoked = new AtomicBoolean();

WorkflowExecution invoke() {
Expand All @@ -34,18 +37,21 @@ WorkflowExecution invoke() {
}

private WorkflowExecution signalWithStart() {
return stub.signalWithStart(signalName, signalArgs, startArgs);
return stub.signalWithStartWithTypeHints(
signalName, signalArgs, signalArgTypes, startArgs, startArgTypes);
}

void signal(WorkflowStub stub, String signalName, Object[] args) {
void signal(WorkflowStub stub, String signalName, Object[] args, Type[] argTypes) {
setStub(stub);
this.signalName = signalName;
this.signalArgs = args;
this.signalArgTypes = argTypes;
}

void start(WorkflowStub stub, Object[] args) {
void start(WorkflowStub stub, Object[] args, Type[] argTypes) {
setStub(stub);
this.startArgs = args;
this.startArgTypes = argTypes;
}

private void setStub(WorkflowStub stub) {
Expand Down
Loading
Loading