Skip to content

Commit e1bc252

Browse files
committed
re-use UpdateOptions merge code
1 parent e78c3f4 commit e1bc252

File tree

3 files changed

+52
-20
lines changed

3 files changed

+52
-20
lines changed

temporal-sdk/src/main/java/io/temporal/client/WorkflowClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,7 +1348,7 @@ static <R, A1, A2, A3, A4, A5, A6> R executeUpdateWithStart(
13481348
* Executes zero argument workflow.
13491349
*
13501350
* @param updateMethod The only supported value is method reference to a proxy created through
1351-
* {@link #newWorkflowStub(Class, WorkflowOptions)}.
1351+
* {@link #newWorkflowStub(Class, WorkflowOptions)}.
13521352
* @param withStartOperation start workflow operation
13531353
* @return update result
13541354
*/
@@ -1358,7 +1358,7 @@ static <R> R executeUpdateWithStart(
13581358
@Nonnull UpdateOptions<R> options,
13591359
@Nonnull WithStartWorkflowOperation<?> withStartOperation) {
13601360
return WorkflowClientInternalImpl.executeUpdateWithStart(
1361-
updateMethod::apply, options, withStartOperation);
1361+
updateMethod::apply, options, withStartOperation);
13621362
}
13631363

13641364
/**

temporal-sdk/src/main/java/io/temporal/client/WorkflowInvocationHandler.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,20 @@ public void invoke(
474474
throw new IllegalArgumentException(
475475
"Only a method annotated with @UpdateMethod can be used to start an Update.");
476476
}
477+
result = untyped.startUpdate(mergeUpdateOptions(options, workflowMetadata, method), args);
478+
}
479+
480+
@Override
481+
@SuppressWarnings("unchecked")
482+
public <R> R getResult(Class<R> resultClass) {
483+
return (R) result;
484+
}
485+
486+
static UpdateOptions<?> mergeUpdateOptions(
487+
UpdateOptions<?> options, POJOWorkflowInterfaceMetadata workflowMetadata, Method method) {
477488
POJOWorkflowMethodMetadata methodMetadata = workflowMetadata.getMethodMetadata(method);
478489
UpdateOptions.Builder builder = UpdateOptions.newBuilder(options);
490+
479491
if (Strings.isNullOrEmpty(options.getUpdateName())) {
480492
builder.setUpdateName(methodMetadata.getName());
481493
} else if (!options.getUpdateName().equals(methodMetadata.getName())) {
@@ -491,14 +503,7 @@ public void invoke(
491503
if (options.getResultClass() == null) {
492504
builder.setResultClass(method.getReturnType());
493505
}
494-
495-
result = untyped.startUpdate(builder.build(), args);
496-
}
497-
498-
@Override
499-
@SuppressWarnings("unchecked")
500-
public <R> R getResult(Class<R> resultClass) {
501-
return (R) result;
506+
return builder.build();
502507
}
503508
}
504509

@@ -510,7 +515,7 @@ enum State {
510515
UPDATE_RECEIVED,
511516
}
512517

513-
private final UpdateOptions<?> baseUpdateOptions;
518+
private final UpdateOptions<?> userProvidedUpdateOptions;
514519
private Object[] updateArgs;
515520
private UpdateOptions updateOptions;
516521
private final WithStartWorkflowOperation<?> startOp;
@@ -519,8 +524,10 @@ enum State {
519524
private WorkflowStub stub;
520525

521526
public UpdateWithStartInvocationHandler(
522-
UpdateOptions<?> baseUpdateOptions, WithStartWorkflowOperation<?> startOp) {
523-
this.baseUpdateOptions = baseUpdateOptions;
527+
UpdateOptions<?> options, WithStartWorkflowOperation<?> startOp) {
528+
Preconditions.checkNotNull(options, "options");
529+
Preconditions.checkNotNull(startOp, "startOp");
530+
this.userProvidedUpdateOptions = options;
524531
this.startOp = startOp;
525532
}
526533

@@ -542,22 +549,19 @@ public void invoke(
542549
UpdateMethod updateMethod = method.getAnnotation(UpdateMethod.class);
543550
if (updateMethod == null) {
544551
throw new IllegalArgumentException(
545-
"Method '" + method.getName() + "' is not an UpdateMethod");
552+
"Method '" + method.getName() + "' is not an @UpdateMethod");
546553
}
547554
this.setStub(untyped);
548555
this.updateArgs = args;
549556
this.updateOptions =
550-
this.baseUpdateOptions.toBuilder()
551-
.setUpdateName(methodMetadata.getName())
552-
.setResultClass(method.getReturnType())
553-
.setResultType(method.getGenericReturnType())
554-
.build();
557+
UpdateInvocationHandler.mergeUpdateOptions(
558+
userProvidedUpdateOptions, workflowMetadata, method);
555559
state = State.UPDATE_RECEIVED;
556560
} else if (state == State.UPDATE_RECEIVED) {
557561
WorkflowMethod workflowMethod = method.getAnnotation(WorkflowMethod.class);
558562
if (workflowMethod == null) {
559563
throw new IllegalArgumentException(
560-
"Method '" + method.getName() + "' is not a WorkflowMethod");
564+
"Method '" + method.getName() + "' is not a @WorkflowMethod");
561565
}
562566
this.setStub(untyped);
563567
this.startOp.setStub(untyped);

temporal-sdk/src/test/java/io/temporal/workflow/updateTest/UpdateWithStartTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,34 @@ public void failWhenStartOperationUsedAgain() {
627627
}
628628
}
629629

630+
@Test
631+
public void failWhenUpdateNamesDoNotMatch() {
632+
WorkflowClient workflowClient = testWorkflowRule.getWorkflowClient();
633+
634+
WorkflowOptions options = createWorkflowOptions();
635+
TestWorkflows.TestUpdatedWorkflow workflow =
636+
workflowClient.newWorkflowStub(TestWorkflows.TestUpdatedWorkflow.class, options);
637+
638+
WithStartWorkflowOperation<String> startOp =
639+
new WithStartWorkflowOperation<>(workflow::execute);
640+
641+
try {
642+
WorkflowUpdateHandle<String> updHandle =
643+
WorkflowClient.startUpdateWithStart(
644+
workflow::update,
645+
"Hello Update",
646+
createUpdateOptions().toBuilder()
647+
.setUpdateName("custom_update_name") // custom name!
648+
.build(),
649+
startOp);
650+
fail("unreachable");
651+
} catch (IllegalArgumentException e) {
652+
assertEquals(
653+
e.getMessage(),
654+
"Update name in the options doesn't match the method name: custom_update_name != testUpdate");
655+
}
656+
}
657+
630658
@Test
631659
public void failServerSideWhenStartIsInvalid() {
632660
WorkflowClient workflowClient = testWorkflowRule.getWorkflowClient();

0 commit comments

Comments
 (0)