in src/main/java/com/uber/cadence/internal/sync/POJOWorkflowImplementationFactory.java [116:183]
private void addWorkflowImplementationType(
WorkflowImplementationOptions options, Class<?> workflowImplementationClass) {
TypeToken<?>.TypeSet interfaces =
TypeToken.of(workflowImplementationClass).getTypes().interfaces();
if (interfaces.isEmpty()) {
throw new IllegalArgumentException("Workflow must implement at least one interface");
}
boolean hasWorkflowMethod = false;
for (TypeToken<?> i : interfaces) {
Map<String, Method> signalHandlers = new HashMap<>();
for (Method method : i.getRawType().getMethods()) {
WorkflowMethod workflowMethod = method.getAnnotation(WorkflowMethod.class);
QueryMethod queryMethod = method.getAnnotation(QueryMethod.class);
SignalMethod signalMethod = method.getAnnotation(SignalMethod.class);
int count =
(workflowMethod == null ? 0 : 1)
+ (queryMethod == null ? 0 : 1)
+ (signalMethod == null ? 0 : 1);
if (count > 1) {
throw new IllegalArgumentException(
method
+ " must contain at most one annotation "
+ "from @WorkflowMethod, @QueryMethod or @SignalMethod");
}
if (workflowMethod != null) {
Functions.Func<SyncWorkflowDefinition> factory =
() ->
new POJOWorkflowImplementation(
method, workflowImplementationClass, signalHandlers);
String workflowName = workflowMethod.name();
if (workflowName.isEmpty()) {
workflowName = InternalUtils.getSimpleName(method);
}
if (workflowDefinitions.containsKey(workflowName)) {
throw new IllegalStateException(
workflowName + " workflow type is already registered with the worker");
}
workflowDefinitions.put(workflowName, factory);
implementationOptions.put(workflowName, options);
hasWorkflowMethod = true;
}
if (signalMethod != null) {
if (method.getReturnType() != Void.TYPE) {
throw new IllegalArgumentException(
"Method annotated with @SignalMethod " + "must have void return type: " + method);
}
String signalName = signalMethod.name();
if (signalName.isEmpty()) {
signalName = InternalUtils.getSimpleName(method);
}
signalHandlers.put(signalName, method);
}
if (queryMethod != null) {
if (method.getReturnType() == Void.TYPE) {
throw new IllegalArgumentException(
"Method annotated with @QueryMethod " + "cannot have void return type: " + method);
}
}
}
}
if (!hasWorkflowMethod) {
throw new IllegalArgumentException(
"Workflow implementation doesn't implement any interface "
+ "with a workflow method annotated with @WorkflowMethod: "
+ workflowImplementationClass);
}
}