From 6759f1da3fa7e28ffa8c0b7296dd2c17d1111112 Mon Sep 17 00:00:00 2001 From: Nathanael Mortensen Date: Tue, 18 Nov 2025 09:16:03 -0800 Subject: [PATCH] Make Proto Mappers Unopinionated Proto objects throw a NullPointerException if you pass a null value into any setFoo method. Our current mappers make strong assumptions about what fields are and aren't necessary, and any time they don't match either the server or the client logic we get a vague NullPointerException. Instead, map all objects and don't assume that any field is non-null. The server or client should enforce the validity of the requests rather than the mapper. Additionally don't mutate Maps that we receive from Thrift/Proto in WorkflowContext. --- .../compatibility/proto/DecisionMapper.java | 61 ++- .../compatibility/proto/RequestMapper.java | 410 +++++++++++------- .../compatibility/proto/TypeMapper.java | 139 ++++-- .../internal/replay/WorkflowContext.java | 28 +- 4 files changed, 415 insertions(+), 223 deletions(-) diff --git a/src/main/java/com/uber/cadence/internal/compatibility/proto/DecisionMapper.java b/src/main/java/com/uber/cadence/internal/compatibility/proto/DecisionMapper.java index a3d5e5ca5..8d850bfc0 100644 --- a/src/main/java/com/uber/cadence/internal/compatibility/proto/DecisionMapper.java +++ b/src/main/java/com/uber/cadence/internal/compatibility/proto/DecisionMapper.java @@ -77,7 +77,6 @@ static Decision decision(com.uber.cadence.Decision d) { d.getScheduleActivityTaskDecisionAttributes(); ScheduleActivityTaskDecisionAttributes.Builder builder = ScheduleActivityTaskDecisionAttributes.newBuilder() - .setActivityId(attr.getActivityId()) .setActivityType(activityType(attr.getActivityType())) .setTaskList(taskList(attr.getTaskList())) .setInput(payload(attr.getInput())) @@ -89,6 +88,9 @@ static Decision decision(com.uber.cadence.Decision d) { .setHeartbeatTimeout(secondsToDuration(attr.getHeartbeatTimeoutSeconds())) .setHeader(header(attr.getHeader())) .setRequestLocalDispatch(attr.isRequestLocalDispatch()); + if (attr.getActivityId() != null) { + builder.setActivityId(attr.getActivityId()); + } if (attr.getRetryPolicy() != null) { builder.setRetryPolicy(retryPolicy(attr.getRetryPolicy())); } @@ -102,19 +104,27 @@ static Decision decision(com.uber.cadence.Decision d) { { com.uber.cadence.RequestCancelActivityTaskDecisionAttributes attr = d.getRequestCancelActivityTaskDecisionAttributes(); - decision.setRequestCancelActivityTaskDecisionAttributes( - RequestCancelActivityTaskDecisionAttributes.newBuilder() - .setActivityId(attr.getActivityId())); + + RequestCancelActivityTaskDecisionAttributes.Builder builder = + RequestCancelActivityTaskDecisionAttributes.newBuilder(); + if (attr.getActivityId() != null) { + builder.setActivityId(attr.getActivityId()); + } + decision.setRequestCancelActivityTaskDecisionAttributes(builder.build()); } break; case StartTimer: { com.uber.cadence.StartTimerDecisionAttributes attr = d.getStartTimerDecisionAttributes(); - decision.setStartTimerDecisionAttributes( + StartTimerDecisionAttributes.Builder builder = StartTimerDecisionAttributes.newBuilder() - .setTimerId(attr.getTimerId()) .setStartToFireTimeout( - secondsToDuration(longToInt(attr.getStartToFireTimeoutSeconds())))); + secondsToDuration(longToInt(attr.getStartToFireTimeoutSeconds()))); + if (attr.getTimerId() != null) { + builder.setTimerId(attr.getTimerId()); + } + + decision.setStartTimerDecisionAttributes(builder.build()); } break; case CompleteWorkflowExecution: @@ -139,8 +149,12 @@ static Decision decision(com.uber.cadence.Decision d) { { com.uber.cadence.CancelTimerDecisionAttributes attr = d.getCancelTimerDecisionAttributes(); - decision.setCancelTimerDecisionAttributes( - CancelTimerDecisionAttributes.newBuilder().setTimerId(attr.getTimerId())); + CancelTimerDecisionAttributes.Builder builder = + CancelTimerDecisionAttributes.newBuilder(); + if (attr.getTimerId() != null) { + builder.setTimerId(attr.getTimerId()); + } + decision.setCancelTimerDecisionAttributes(builder.build()); } break; case CancelWorkflowExecution: @@ -158,9 +172,11 @@ static Decision decision(com.uber.cadence.Decision d) { d.getRequestCancelExternalWorkflowExecutionDecisionAttributes(); RequestCancelExternalWorkflowExecutionDecisionAttributes.Builder builder = RequestCancelExternalWorkflowExecutionDecisionAttributes.newBuilder() - .setDomain(attr.getDomain()) .setWorkflowExecution(workflowRunPair(attr.getWorkflowId(), attr.getRunId())) .setChildWorkflowOnly(attr.isChildWorkflowOnly()); + if (attr.getDomain() != null) { + builder.setDomain(attr.getDomain()); + } if (attr.getControl() != null) { builder.setControl(arrayToByteString(attr.getControl())); } @@ -203,8 +219,6 @@ static Decision decision(com.uber.cadence.Decision d) { d.getStartChildWorkflowExecutionDecisionAttributes(); StartChildWorkflowExecutionDecisionAttributes.Builder builder = StartChildWorkflowExecutionDecisionAttributes.newBuilder() - .setDomain(attr.getDomain()) - .setWorkflowId(attr.getWorkflowId()) .setWorkflowType(workflowType(attr.getWorkflowType())) .setTaskList(taskList(attr.getTaskList())) .setInput(payload(attr.getInput())) @@ -217,6 +231,12 @@ static Decision decision(com.uber.cadence.Decision d) { .setHeader(header(attr.getHeader())) .setMemo(memo(attr.getMemo())) .setSearchAttributes(searchAttributes(attr.getSearchAttributes())); + if (attr.getDomain() != null) { + builder.setDomain(attr.getDomain()); + } + if (attr.getWorkflowId() != null) { + builder.setWorkflowId(attr.getWorkflowId()); + } if (attr.getRetryPolicy() != null) { builder.setRetryPolicy(retryPolicy(attr.getRetryPolicy())); } @@ -235,11 +255,15 @@ static Decision decision(com.uber.cadence.Decision d) { d.getSignalExternalWorkflowExecutionDecisionAttributes(); SignalExternalWorkflowExecutionDecisionAttributes.Builder builder = SignalExternalWorkflowExecutionDecisionAttributes.newBuilder() - .setDomain(attr.getDomain()) .setWorkflowExecution(workflowExecution(attr.getExecution())) - .setSignalName(attr.getSignalName()) .setInput(payload(attr.getInput())) .setChildWorkflowOnly(attr.isChildWorkflowOnly()); + if (attr.getDomain() != null) { + builder.setDomain(attr.getDomain()); + } + if (attr.getSignalName() != null) { + builder.setSignalName(attr.getSignalName()); + } if (attr.getControl() != null) { builder.setControl(arrayToByteString(attr.getControl())); } @@ -259,11 +283,14 @@ static Decision decision(com.uber.cadence.Decision d) { { com.uber.cadence.RecordMarkerDecisionAttributes attr = d.getRecordMarkerDecisionAttributes(); - decision.setRecordMarkerDecisionAttributes( + RecordMarkerDecisionAttributes.Builder builder = RecordMarkerDecisionAttributes.newBuilder() - .setMarkerName(attr.getMarkerName()) .setDetails(payload(attr.getDetails())) - .setHeader(header(attr.getHeader()))); + .setHeader(header(attr.getHeader())); + if (attr.getMarkerName() != null) { + builder.setMarkerName(attr.getMarkerName()); + } + decision.setRecordMarkerDecisionAttributes(builder.build()); } break; default: diff --git a/src/main/java/com/uber/cadence/internal/compatibility/proto/RequestMapper.java b/src/main/java/com/uber/cadence/internal/compatibility/proto/RequestMapper.java index c07d67361..4d086d681 100644 --- a/src/main/java/com/uber/cadence/internal/compatibility/proto/RequestMapper.java +++ b/src/main/java/com/uber/cadence/internal/compatibility/proto/RequestMapper.java @@ -134,12 +134,19 @@ public static DescribeTaskListRequest describeTaskListRequest( if (t == null) { return null; } - return DescribeTaskListRequest.newBuilder() - .setDomain(t.getDomain()) - .setTaskList(taskList(t.getTaskList())) - .setTaskListType(taskListType(t.getTaskListType())) - .setIncludeTaskListStatus(t.isIncludeTaskListStatus()) - .build(); + DescribeTaskListRequest.Builder builder = + DescribeTaskListRequest.newBuilder().setIncludeTaskListStatus(t.isIncludeTaskListStatus()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getTaskList() != null) { + builder.setTaskList(taskList(t.getTaskList())); + } + if (t.getTaskListType() != null) { + builder.setTaskListType(taskListType(t.getTaskListType())); + } + + return builder.build(); } public static ListArchivedWorkflowExecutionsRequest listArchivedWorkflowExecutionsRequest( @@ -148,9 +155,10 @@ public static ListArchivedWorkflowExecutionsRequest listArchivedWorkflowExecutio return null; } ListArchivedWorkflowExecutionsRequest.Builder request = - ListArchivedWorkflowExecutionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setPageSize(t.getPageSize()); + ListArchivedWorkflowExecutionsRequest.newBuilder().setPageSize(t.getPageSize()); + if (t.getDomain() != null) { + request.setDomain(t.getDomain()); + } if (t.getNextPageToken() != null) { request.setNextPageToken(arrayToByteString(t.getNextPageToken())); } @@ -166,10 +174,16 @@ public static RequestCancelWorkflowExecutionRequest requestCancelWorkflowExecuti return null; } RequestCancelWorkflowExecutionRequest.Builder builder = - RequestCancelWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getWorkflowExecution())) - .setRequestId(t.getRequestId()); + RequestCancelWorkflowExecutionRequest.newBuilder(); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getWorkflowExecution() != null) { + builder.setWorkflowExecution(workflowExecution(t.getWorkflowExecution())); + } + if (t.getRequestId() != null) { + builder.setRequestId(t.getRequestId()); + } if (t.getCause() != null) { builder.setCause(t.getCause()); } @@ -187,10 +201,14 @@ public static ResetStickyTaskListRequest resetStickyTaskListRequest( if (t == null) { return null; } - return ResetStickyTaskListRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getExecution())) - .build(); + ResetStickyTaskListRequest.Builder builder = ResetStickyTaskListRequest.newBuilder(); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getExecution() != null) { + builder.setWorkflowExecution(workflowExecution(t.getExecution())); + } + return builder.build(); } public static ResetWorkflowExecutionRequest resetWorkflowExecutionRequest( @@ -198,14 +216,23 @@ public static ResetWorkflowExecutionRequest resetWorkflowExecutionRequest( if (t == null) { return null; } - return ResetWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getWorkflowExecution())) - .setReason(t.getReason()) - .setDecisionFinishEventId(t.getDecisionFinishEventId()) - .setRequestId(t.getRequestId()) - .setSkipSignalReapply(t.isSkipSignalReapply()) - .build(); + ResetWorkflowExecutionRequest.Builder builder = + ResetWorkflowExecutionRequest.newBuilder() + .setDecisionFinishEventId(t.getDecisionFinishEventId()) + .setSkipSignalReapply(t.isSkipSignalReapply()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getWorkflowExecution() != null) { + builder.setWorkflowExecution(workflowExecution(t.getWorkflowExecution())); + } + if (t.getReason() != null) { + builder.setReason(t.getReason()); + } + if (t.getRequestId() != null) { + builder.setRequestId(t.getRequestId()); + } + return builder.build(); } public static RespondActivityTaskCanceledByIDRequest respondActivityTaskCanceledByIdRequest( @@ -215,10 +242,16 @@ public static RespondActivityTaskCanceledByIDRequest respondActivityTaskCanceled } RespondActivityTaskCanceledByIDRequest.Builder builder = RespondActivityTaskCanceledByIDRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())) - .setActivityId(t.getActivityID()) - .setDetails(payload(t.getDetails())); + .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getActivityID() != null) { + builder.setActivityId(t.getActivityID()); + } + if (t.getDetails() != null) { + builder.setDetails(payload(t.getDetails())); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -231,7 +264,10 @@ public static RespondActivityTaskCanceledRequest respondActivityTaskCanceledRequ return null; } RespondActivityTaskCanceledRequest.Builder builder = - RespondActivityTaskCanceledRequest.newBuilder().setDetails(payload(t.getDetails())); + RespondActivityTaskCanceledRequest.newBuilder(); + if (t.getDetails() != null) { + builder.setDetails(payload(t.getDetails())); + } if (t.getTaskToken() != null) { builder.setTaskToken(arrayToByteString(t.getTaskToken())); } @@ -248,10 +284,16 @@ public static RespondActivityTaskCompletedByIDRequest respondActivityTaskComplet } RespondActivityTaskCompletedByIDRequest.Builder builder = RespondActivityTaskCompletedByIDRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())) - .setActivityId(t.getActivityID()) - .setResult(payload(t.getResult())); + .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getActivityID() != null) { + builder.setActivityId(t.getActivityID()); + } + if (t.getResult() != null) { + builder.setResult(payload(t.getResult())); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -264,7 +306,10 @@ public static RespondActivityTaskCompletedRequest respondActivityTaskCompletedRe return null; } RespondActivityTaskCompletedRequest.Builder builder = - RespondActivityTaskCompletedRequest.newBuilder().setResult(payload(t.getResult())); + RespondActivityTaskCompletedRequest.newBuilder(); + if (t.getResult() != null) { + builder.setResult(payload(t.getResult())); + } if (t.getTaskToken() != null) { builder.setTaskToken(arrayToByteString(t.getTaskToken())); } @@ -281,10 +326,14 @@ public static RespondActivityTaskFailedByIDRequest respondActivityTaskFailedById } RespondActivityTaskFailedByIDRequest.Builder builder = RespondActivityTaskFailedByIDRequest.newBuilder() - .setDomain(t.getDomain()) .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())) - .setActivityId(t.getActivityID()) .setFailure(failure(t.getReason(), t.getDetails())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getActivityID() != null) { + builder.setActivityId(t.getActivityID()); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -342,8 +391,10 @@ public static RespondDecisionTaskFailedRequest respondDecisionTaskFailedRequest( } RespondDecisionTaskFailedRequest.Builder builder = RespondDecisionTaskFailedRequest.newBuilder() - .setCause(decisionTaskFailedCause(t.getCause())) - .setDetails(payload(t.getDetails())); + .setCause(decisionTaskFailedCause(t.getCause())); + if (t.getDetails() != null) { + builder.setDetails(payload(t.getDetails())); + } if (t.getBinaryChecksum() != null) { builder.setBinaryChecksum(t.getBinaryChecksum()); } @@ -365,6 +416,9 @@ public static RespondQueryTaskCompletedRequest respondQueryTaskCompletedRequest( WorkflowQueryResult.newBuilder() .setResultType(queryTaskCompletedType(t.getCompletedType())) .setAnswer(payload(t.getQueryResult())); + if (t.getQueryResult() != null) { + wqBuilder.setAnswer(payload(t.getQueryResult())); + } if (t.getErrorMessage() != null) { wqBuilder.setErrorMessage(t.getErrorMessage()); } @@ -383,17 +437,18 @@ public static ScanWorkflowExecutionsRequest scanWorkflowExecutionsRequest( if (t == null) { return null; } - ScanWorkflowExecutionsRequest.Builder request = - ScanWorkflowExecutionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setPageSize(t.getPageSize()); + ScanWorkflowExecutionsRequest.Builder builder = + ScanWorkflowExecutionsRequest.newBuilder().setPageSize(t.getPageSize()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getNextPageToken() != null) { - request.setNextPageToken(arrayToByteString(t.getNextPageToken())); + builder.setNextPageToken(arrayToByteString(t.getNextPageToken())); } if (t.getQuery() != null) { - request.setQuery(t.getQuery()); + builder.setQuery(t.getQuery()); } - return request.build(); + return builder.build(); } public static DescribeWorkflowExecutionRequest describeWorkflowExecutionRequest( @@ -401,11 +456,18 @@ public static DescribeWorkflowExecutionRequest describeWorkflowExecutionRequest( if (t == null) { return null; } - return DescribeWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getExecution())) - .setQueryConsistencyLevel(queryConsistencyLevel(t.getQueryConsistencyLevel())) - .build(); + DescribeWorkflowExecutionRequest.Builder builder = + DescribeWorkflowExecutionRequest.newBuilder(); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getExecution() != null) { + builder.setWorkflowExecution(workflowExecution(t.getExecution())); + } + if (t.getQueryConsistencyLevel() != null) { + builder.setQueryConsistencyLevel(queryConsistencyLevel(t.getQueryConsistencyLevel())); + } + return builder.build(); } public static GetWorkflowExecutionHistoryRequest getWorkflowExecutionHistoryRequest( @@ -415,13 +477,17 @@ public static GetWorkflowExecutionHistoryRequest getWorkflowExecutionHistoryRequ } GetWorkflowExecutionHistoryRequest.Builder builder = GetWorkflowExecutionHistoryRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getExecution())) .setPageSize(t.getMaximumPageSize()) .setWaitForNewEvent(t.isWaitForNewEvent()) .setHistoryEventFilterType(eventFilterType(t.HistoryEventFilterType)) .setSkipArchival(t.isSkipArchival()) .setQueryConsistencyLevel(queryConsistencyLevel(t.getQueryConsistencyLevel())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getExecution() != null) { + builder.setWorkflowExecution(workflowExecution(t.getExecution())); + } if (t.getNextPageToken() != null) { builder.setNextPageToken(arrayToByteString(t.getNextPageToken())); } @@ -435,19 +501,25 @@ public static SignalWithStartWorkflowExecutionRequest signalWithStartWorkflowExe } StartWorkflowExecutionRequest.Builder builder = StartWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowId(t.getWorkflowId()) .setWorkflowType(workflowType(t.getWorkflowType())) .setTaskList(taskList(t.getTaskList())) .setInput(payload(t.getInput())) .setExecutionStartToCloseTimeout( secondsToDuration(t.getExecutionStartToCloseTimeoutSeconds())) .setTaskStartToCloseTimeout(secondsToDuration(t.getTaskStartToCloseTimeoutSeconds())) - .setRequestId(t.getRequestId()) .setMemo(memo(t.getMemo())) .setSearchAttributes(searchAttributes(t.getSearchAttributes())) .setHeader(header(t.getHeader())) .setJitterStart(secondsToDuration(t.getJitterStartSeconds())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getWorkflowId() != null) { + builder.setWorkflowId(t.getWorkflowId()); + } + if (t.getRequestId() != null) { + builder.setRequestId(t.getRequestId()); + } if (t.isSetFirstRunAtTimestamp()) { builder.setFirstRunAt(unixNanoToTime(t.getFirstRunAtTimestamp())); } @@ -471,8 +543,10 @@ public static SignalWithStartWorkflowExecutionRequest signalWithStartWorkflowExe SignalWithStartWorkflowExecutionRequest.Builder sb = SignalWithStartWorkflowExecutionRequest.newBuilder() .setStartRequest(builder.build()) - .setSignalName(t.getSignalName()) .setSignalInput(payload(t.getSignalInput())); + if (t.getSignalName() != null) { + sb.setSignalName(t.getSignalName()); + } if (t.getControl() != null) { sb.setControl(arrayToByteString(t.getControl())); } @@ -500,11 +574,17 @@ public static SignalWorkflowExecutionRequest signalWorkflowExecutionRequest( } SignalWorkflowExecutionRequest.Builder builder = SignalWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) .setWorkflowExecution(workflowExecution(t.getWorkflowExecution())) - .setSignalName(t.getSignalName()) - .setSignalInput(payload(t.getInput())) - .setRequestId(t.getRequestId()); + .setSignalInput(payload(t.getInput())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getSignalName() != null) { + builder.setSignalName(t.getSignalName()); + } + if (t.getRequestId() != null) { + builder.setRequestId(t.getRequestId()); + } if (t.getControl() != null) { builder.setControl(arrayToByteString(t.getControl())); } @@ -519,14 +599,11 @@ public static StartWorkflowExecutionRequest startWorkflowExecutionRequest( if (t == null) { return null; } - StartWorkflowExecutionRequest.Builder request = + StartWorkflowExecutionRequest.Builder builder = StartWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowId(t.getWorkflowId()) .setWorkflowType(workflowType(t.getWorkflowType())) .setTaskList(taskList(t.getTaskList())) .setInput(payload(t.getInput())) - .setRequestId(t.getRequestId()) .setExecutionStartToCloseTimeout( secondsToDuration(t.getExecutionStartToCloseTimeoutSeconds())) .setTaskStartToCloseTimeout(secondsToDuration(t.getTaskStartToCloseTimeoutSeconds())) @@ -536,19 +613,28 @@ public static StartWorkflowExecutionRequest startWorkflowExecutionRequest( .setHeader(header(t.getHeader())) .setDelayStart(secondsToDuration(t.getDelayStartSeconds())) .setJitterStart(secondsToDuration(t.getJitterStartSeconds())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getWorkflowId() != null) { + builder.setWorkflowId(t.getWorkflowId()); + } + if (t.getRequestId() != null) { + builder.setRequestId(t.getRequestId()); + } if (t.isSetFirstRunAtTimestamp()) { - request.setFirstRunAt(unixNanoToTime(t.getFirstRunAtTimestamp())); + builder.setFirstRunAt(unixNanoToTime(t.getFirstRunAtTimestamp())); } if (t.getRetryPolicy() != null) { - request.setRetryPolicy(retryPolicy(t.getRetryPolicy())); + builder.setRetryPolicy(retryPolicy(t.getRetryPolicy())); } if (t.getCronSchedule() != null) { - request.setCronSchedule(t.getCronSchedule()); + builder.setCronSchedule(t.getCronSchedule()); } if (t.getIdentity() != null) { - request.setIdentity(t.getIdentity()); + builder.setIdentity(t.getIdentity()); } - return request.build(); + return builder.build(); } public static StartWorkflowExecutionAsyncRequest startWorkflowExecutionAsyncRequest( @@ -571,10 +657,14 @@ public static TerminateWorkflowExecutionRequest terminateWorkflowExecutionReques } TerminateWorkflowExecutionRequest.Builder builder = TerminateWorkflowExecutionRequest.newBuilder() - .setDomain(t.getDomain()) .setWorkflowExecution(workflowExecution(t.getWorkflowExecution())) - .setReason(t.getReason()) .setDetails(payload(t.getDetails())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getReason() != null) { + builder.setReason(t.getReason()); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -589,10 +679,14 @@ public static DeprecateDomainRequest deprecateDomainRequest( if (t == null) { return null; } - return DeprecateDomainRequest.newBuilder() - .setName(t.getName()) - .setSecurityToken(t.getSecurityToken()) - .build(); + DeprecateDomainRequest.Builder builder = DeprecateDomainRequest.newBuilder(); + if (t.getName() != null) { + builder.setName(t.getName()); + } + if (t.getSecurityToken() != null) { + builder.setSecurityToken(t.getSecurityToken()); + } + return builder.build(); } public static DescribeDomainRequest describeDomainRequest( @@ -600,11 +694,11 @@ public static DescribeDomainRequest describeDomainRequest( if (t == null) { return null; } - if (t.uuid != null) { - return DescribeDomainRequest.newBuilder().setId(t.uuid).build(); + if (t.getUuid() != null) { + return DescribeDomainRequest.newBuilder().setId(t.getUuid()).build(); } - if (t.name != null) { - return DescribeDomainRequest.newBuilder().setName(t.name).build(); + if (t.getName() != null) { + return DescribeDomainRequest.newBuilder().setName(t.getName()).build(); } throw new IllegalArgumentException("neither one of field is set for DescribeDomainRequest"); } @@ -613,7 +707,8 @@ public static ListDomainsRequest listDomainsRequest(com.uber.cadence.ListDomains if (t == null) { return null; } - ListDomainsRequest.Builder request = ListDomainsRequest.newBuilder().setPageSize(t.pageSize); + ListDomainsRequest.Builder request = + ListDomainsRequest.newBuilder().setPageSize(t.getPageSize()); if (t.getNextPageToken() != null) { request.setNextPageToken(arrayToByteString(t.getNextPageToken())); } @@ -625,10 +720,13 @@ public static ListTaskListPartitionsRequest listTaskListPartitionsRequest( if (t == null) { return null; } - return ListTaskListPartitionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setTaskList(taskList(t.getTaskList())) - .build(); + ListTaskListPartitionsRequest.Builder builder = + ListTaskListPartitionsRequest.newBuilder().setTaskList(taskList(t.getTaskList())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + + return builder.build(); } public static ListWorkflowExecutionsRequest listWorkflowExecutionsRequest( @@ -636,17 +734,18 @@ public static ListWorkflowExecutionsRequest listWorkflowExecutionsRequest( if (t == null) { return null; } - ListWorkflowExecutionsRequest.Builder request = - ListWorkflowExecutionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setPageSize(t.getPageSize()); + ListWorkflowExecutionsRequest.Builder builder = + ListWorkflowExecutionsRequest.newBuilder().setPageSize(t.getPageSize()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getNextPageToken() != null) { - request.setNextPageToken(arrayToByteString(t.getNextPageToken())); + builder.setNextPageToken(arrayToByteString(t.getNextPageToken())); } if (t.getQuery() != null) { - request.setQuery(t.getQuery()); + builder.setQuery(t.getQuery()); } - return request.build(); + return builder.build(); } public static PollForActivityTaskRequest pollForActivityTaskRequest( @@ -656,9 +755,11 @@ public static PollForActivityTaskRequest pollForActivityTaskRequest( } PollForActivityTaskRequest.Builder builder = PollForActivityTaskRequest.newBuilder() - .setDomain(t.getDomain()) .setTaskList(taskList(t.getTaskList())) .setTaskListMetadata(taskListMetadata(t.getTaskListMetadata())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -671,9 +772,10 @@ public static PollForDecisionTaskRequest pollForDecisionTaskRequest( return null; } PollForDecisionTaskRequest.Builder builder = - PollForDecisionTaskRequest.newBuilder() - .setDomain(t.getDomain()) - .setTaskList(taskList(t.getTaskList())); + PollForDecisionTaskRequest.newBuilder().setTaskList(taskList(t.getTaskList())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getBinaryChecksum() != null) { builder.setBinaryChecksum(t.getBinaryChecksum()); } @@ -687,13 +789,16 @@ public static QueryWorkflowRequest queryWorkflowRequest(com.uber.cadence.QueryWo if (t == null) { return null; } - return QueryWorkflowRequest.newBuilder() - .setDomain(t.getDomain()) - .setWorkflowExecution(workflowExecution(t.getExecution())) - .setQuery(workflowQuery(t.getQuery())) - .setQueryRejectCondition(queryRejectCondition(t.getQueryRejectCondition())) - .setQueryConsistencyLevel(queryConsistencyLevel(t.getQueryConsistencyLevel())) - .build(); + QueryWorkflowRequest.Builder builder = + QueryWorkflowRequest.newBuilder() + .setWorkflowExecution(workflowExecution(t.getExecution())) + .setQuery(workflowQuery(t.getQuery())) + .setQueryRejectCondition(queryRejectCondition(t.getQueryRejectCondition())) + .setQueryConsistencyLevel(queryConsistencyLevel(t.getQueryConsistencyLevel())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + return builder.build(); } public static RecordActivityTaskHeartbeatByIDRequest recordActivityTaskHeartbeatByIdRequest( @@ -703,10 +808,14 @@ public static RecordActivityTaskHeartbeatByIDRequest recordActivityTaskHeartbeat } RecordActivityTaskHeartbeatByIDRequest.Builder builder = RecordActivityTaskHeartbeatByIDRequest.newBuilder() - .setDomain(t.getDomain()) .setWorkflowExecution(TypeMapper.workflowRunPair(t.getWorkflowID(), t.getRunID())) - .setActivityId(t.getActivityID()) .setDetails(payload(t.getDetails())); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } + if (t.getActivityID() != null) { + builder.setActivityId(t.getActivityID()); + } if (t.getIdentity() != null) { builder.setIdentity(t.getIdentity()); } @@ -734,9 +843,8 @@ public static RegisterDomainRequest registerDomainRequest( if (t == null) { return null; } - RegisterDomainRequest request = + RegisterDomainRequest.Builder builder = RegisterDomainRequest.newBuilder() - .setName(t.getName()) .setDescription(Helpers.nullToEmpty(t.getDescription())) .setOwnerEmail(Helpers.nullToEmpty(t.getOwnerEmail())) .setWorkflowExecutionRetentionPeriod( @@ -749,29 +857,35 @@ public static RegisterDomainRequest registerDomainRequest( .setHistoryArchivalStatus(archivalStatus(t.getHistoryArchivalStatus())) .setHistoryArchivalUri(Helpers.nullToEmpty(t.getHistoryArchivalURI())) .setVisibilityArchivalStatus(archivalStatus(t.getVisibilityArchivalStatus())) - .setVisibilityArchivalUri(Helpers.nullToEmpty(t.getVisibilityArchivalURI())) - .build(); - return request; + .setVisibilityArchivalUri(Helpers.nullToEmpty(t.getVisibilityArchivalURI())); + if (t.getName() != null) { + builder.setName(t.getName()); + } + return builder.build(); } public static UpdateDomainRequest updateDomainRequest(com.uber.cadence.UpdateDomainRequest t) { if (t == null) { return null; } - Builder request = - UpdateDomainRequest.newBuilder() - .setName(t.getName()) - .setSecurityToken(t.getSecurityToken()); + Builder builder = UpdateDomainRequest.newBuilder(); + + if (t.getName() != null) { + builder.setName(t.getName()); + } + if (t.getSecurityToken() != null) { + builder.setSecurityToken(t.getSecurityToken()); + } List fields = new ArrayList<>(); UpdateDomainInfo updatedInfo = t.getUpdatedInfo(); if (updatedInfo != null) { if (updatedInfo.getDescription() != null) { - request.setDescription(updatedInfo.getDescription()); + builder.setDescription(updatedInfo.getDescription()); fields.add(DomainUpdateDescriptionField); } if (updatedInfo.getOwnerEmail() != null) { - request.setOwnerEmail(updatedInfo.getOwnerEmail()); + builder.setOwnerEmail(updatedInfo.getOwnerEmail()); fields.add(DomainUpdateOwnerEmailField); } if (updatedInfo.getData() != null) { @@ -782,57 +896,57 @@ public static UpdateDomainRequest updateDomainRequest(com.uber.cadence.UpdateDom DomainConfiguration configuration = t.getConfiguration(); if (configuration != null) { if (configuration.getWorkflowExecutionRetentionPeriodInDays() > 0) { - request.setWorkflowExecutionRetentionPeriod( + builder.setWorkflowExecutionRetentionPeriod( daysToDuration(configuration.getWorkflowExecutionRetentionPeriodInDays())); fields.add(DomainUpdateRetentionPeriodField); } // if t.EmitMetric != null {} - DEPRECATED if (configuration.getBadBinaries() != null) { - request.setBadBinaries(badBinaries(configuration.getBadBinaries())); + builder.setBadBinaries(badBinaries(configuration.getBadBinaries())); fields.add(DomainUpdateBadBinariesField); } if (configuration.getHistoryArchivalStatus() != null) { - request.setHistoryArchivalStatus(archivalStatus(configuration.getHistoryArchivalStatus())); + builder.setHistoryArchivalStatus(archivalStatus(configuration.getHistoryArchivalStatus())); fields.add(DomainUpdateHistoryArchivalStatusField); } if (configuration.getHistoryArchivalURI() != null) { - request.setHistoryArchivalUri(configuration.getHistoryArchivalURI()); + builder.setHistoryArchivalUri(configuration.getHistoryArchivalURI()); fields.add(DomainUpdateHistoryArchivalURIField); } if (configuration.getVisibilityArchivalStatus() != null) { - request.setVisibilityArchivalStatus( + builder.setVisibilityArchivalStatus( archivalStatus(configuration.getVisibilityArchivalStatus())); fields.add(DomainUpdateVisibilityArchivalStatusField); } if (configuration.getVisibilityArchivalURI() != null) { - request.setVisibilityArchivalUri(configuration.getVisibilityArchivalURI()); + builder.setVisibilityArchivalUri(configuration.getVisibilityArchivalURI()); fields.add(DomainUpdateVisibilityArchivalURIField); } } DomainReplicationConfiguration replicationConfiguration = t.getReplicationConfiguration(); if (replicationConfiguration != null) { if (replicationConfiguration.getActiveClusterName() != null) { - request.setActiveClusterName(replicationConfiguration.getActiveClusterName()); + builder.setActiveClusterName(replicationConfiguration.getActiveClusterName()); fields.add(DomainUpdateActiveClusterNameField); } if (replicationConfiguration.getClusters() != null) { - request.addAllClusters( + builder.addAllClusters( clusterReplicationConfigurationArray(replicationConfiguration.getClusters())); fields.add(DomainUpdateClustersField); } } if (t.getDeleteBadBinary() != null) { - request.setDeleteBadBinary(t.getDeleteBadBinary()); + builder.setDeleteBadBinary(t.getDeleteBadBinary()); fields.add(DomainUpdateDeleteBadBinaryField); } if (t.getFailoverTimeoutInSeconds() > 0) { - request.setFailoverTimeout(secondsToDuration(t.getFailoverTimeoutInSeconds())); + builder.setFailoverTimeout(secondsToDuration(t.getFailoverTimeoutInSeconds())); fields.add(DomainUpdateFailoverTimeoutField); } - request.setUpdateMask(newFieldMask(fields)); + builder.setUpdateMask(newFieldMask(fields)); - return request.build(); + return builder.build(); } public static ListClosedWorkflowExecutionsRequest listClosedWorkflowExecutionsRequest( @@ -840,26 +954,27 @@ public static ListClosedWorkflowExecutionsRequest listClosedWorkflowExecutionsRe if (t == null) { return null; } - ListClosedWorkflowExecutionsRequest.Builder request = - ListClosedWorkflowExecutionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setPageSize(t.getMaximumPageSize()); + ListClosedWorkflowExecutionsRequest.Builder builder = + ListClosedWorkflowExecutionsRequest.newBuilder().setPageSize(t.getMaximumPageSize()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getExecutionFilter() != null) { - request.setExecutionFilter(workflowExecutionFilter(t.getExecutionFilter())); + builder.setExecutionFilter(workflowExecutionFilter(t.getExecutionFilter())); } if (t.getTypeFilter() != null) { - request.setTypeFilter(workflowTypeFilter(t.getTypeFilter())); + builder.setTypeFilter(workflowTypeFilter(t.getTypeFilter())); } if (t.getStatusFilter() != null) { - request.setStatusFilter(statusFilter(t.getStatusFilter())); + builder.setStatusFilter(statusFilter(t.getStatusFilter())); } if (t.getNextPageToken() != null) { - request.setNextPageToken(arrayToByteString(t.getNextPageToken())); + builder.setNextPageToken(arrayToByteString(t.getNextPageToken())); } if (t.getStartTimeFilter() != null) { - request.setStartTimeFilter(startTimeFilter(t.getStartTimeFilter())); + builder.setStartTimeFilter(startTimeFilter(t.getStartTimeFilter())); } - return request.build(); + return builder.build(); } public static ListOpenWorkflowExecutionsRequest listOpenWorkflowExecutionsRequest( @@ -867,22 +982,23 @@ public static ListOpenWorkflowExecutionsRequest listOpenWorkflowExecutionsReques if (t == null) { return null; } - ListOpenWorkflowExecutionsRequest.Builder request = - ListOpenWorkflowExecutionsRequest.newBuilder() - .setDomain(t.getDomain()) - .setPageSize(t.getMaximumPageSize()); + ListOpenWorkflowExecutionsRequest.Builder builder = + ListOpenWorkflowExecutionsRequest.newBuilder().setPageSize(t.getMaximumPageSize()); + if (t.getDomain() != null) { + builder.setDomain(t.getDomain()); + } if (t.getExecutionFilter() != null) { - request.setExecutionFilter(workflowExecutionFilter(t.getExecutionFilter())); + builder.setExecutionFilter(workflowExecutionFilter(t.getExecutionFilter())); } if (t.getTypeFilter() != null) { - request.setTypeFilter(workflowTypeFilter(t.getTypeFilter())); + builder.setTypeFilter(workflowTypeFilter(t.getTypeFilter())); } if (t.getNextPageToken() != null) { - request.setNextPageToken(arrayToByteString(t.getNextPageToken())); + builder.setNextPageToken(arrayToByteString(t.getNextPageToken())); } if (t.getStartTimeFilter() != null) { - request.setStartTimeFilter(startTimeFilter(t.getStartTimeFilter())); + builder.setStartTimeFilter(startTimeFilter(t.getStartTimeFilter())); } - return request.build(); + return builder.build(); } } diff --git a/src/main/java/com/uber/cadence/internal/compatibility/proto/TypeMapper.java b/src/main/java/com/uber/cadence/internal/compatibility/proto/TypeMapper.java index c2d4cb03a..8197c0483 100644 --- a/src/main/java/com/uber/cadence/internal/compatibility/proto/TypeMapper.java +++ b/src/main/java/com/uber/cadence/internal/compatibility/proto/TypeMapper.java @@ -59,11 +59,15 @@ static BadBinaryInfo badBinaryInfo(com.uber.cadence.BadBinaryInfo t) { if (t == null) { return null; } - return BadBinaryInfo.newBuilder() - .setReason(t.getReason()) - .setOperator(t.getOperator()) - .setCreatedTime(unixNanoToTime(t.getCreatedTimeNano())) - .build(); + BadBinaryInfo.Builder builder = + BadBinaryInfo.newBuilder().setCreatedTime(unixNanoToTime(t.getCreatedTimeNano())); + if (t.getReason() != null) { + builder.setReason(t.getReason()); + } + if (t.getOperator() != null) { + builder.setOperator(t.getOperator()); + } + return builder.build(); } static Payload payload(byte[] data) { @@ -74,21 +78,24 @@ static Payload payload(byte[] data) { } static Failure failure(String reason, byte[] details) { - if (reason == null) { - return Failure.newBuilder().build(); + Failure.Builder builder = Failure.newBuilder(); + if (reason != null) { + builder.setReason(reason); + } + if (details != null) { + builder.setDetails(arrayToByteString(details)); } - return Failure.newBuilder().setReason(reason).setDetails(arrayToByteString(details)).build(); + return builder.build(); } static WorkflowExecution workflowExecution(com.uber.cadence.WorkflowExecution t) { if (t == null) { return WorkflowExecution.newBuilder().build(); } - if (t.getWorkflowId() == null && t.getRunId() == null) { - return WorkflowExecution.newBuilder().build(); + WorkflowExecution.Builder builder = WorkflowExecution.newBuilder(); + if (t.getWorkflowId() != null) { + builder.setWorkflowId(t.getWorkflowId()); } - WorkflowExecution.Builder builder = - WorkflowExecution.newBuilder().setWorkflowId(t.getWorkflowId()); if (t.getRunId() != null) { builder.setRunId(t.getRunId()); } @@ -96,31 +103,50 @@ static WorkflowExecution workflowExecution(com.uber.cadence.WorkflowExecution t) } static WorkflowExecution workflowRunPair(String workflowId, String runId) { - if (Strings.isNullOrEmpty(workflowId) && Strings.isNullOrEmpty(runId)) { - return WorkflowExecution.newBuilder().build(); + WorkflowExecution.Builder builder = WorkflowExecution.newBuilder(); + if (!Strings.isNullOrEmpty(workflowId)) { + builder.setWorkflowId(workflowId); + } + if (!Strings.isNullOrEmpty(runId)) { + builder.setRunId(runId); } - return WorkflowExecution.newBuilder().setWorkflowId(workflowId).setRunId(runId).build(); + return builder.build(); } static ActivityType activityType(com.uber.cadence.ActivityType t) { if (t == null) { return ActivityType.newBuilder().build(); } - return ActivityType.newBuilder().setName(t.getName()).build(); + ActivityType.Builder builder = ActivityType.newBuilder(); + if (t.getName() != null) { + builder.setName(t.getName()); + } + return builder.build(); } static WorkflowType workflowType(com.uber.cadence.WorkflowType t) { if (t == null) { return WorkflowType.newBuilder().build(); } - return WorkflowType.newBuilder().setName(t.getName()).build(); + WorkflowType.Builder builder = WorkflowType.newBuilder(); + if (t.getName() != null) { + builder.setName(t.getName()); + } + return builder.build(); } static TaskList taskList(com.uber.cadence.TaskList t) { if (t == null) { return TaskList.newBuilder().build(); } - return TaskList.newBuilder().setName(t.getName()).setKind(taskListKind(t.getKind())).build(); + TaskList.Builder builder = TaskList.newBuilder(); + if (t.getName() != null) { + builder.setName(t.getName()); + } + if (t.getKind() != null) { + builder.setKind(taskListKind(t.getKind())); + } + return builder.build(); } static TaskListMetadata taskListMetadata(com.uber.cadence.TaskListMetadata t) { @@ -165,7 +191,7 @@ static Memo memo(com.uber.cadence.Memo t) { static SearchAttributes searchAttributes(com.uber.cadence.SearchAttributes t) { if (t == null) { - return SearchAttributes.newBuilder().build(); + return SearchAttributes.newBuilder().putAllIndexedFields(Collections.emptyMap()).build(); } return SearchAttributes.newBuilder() .putAllIndexedFields(payloadByteBufferMap(t.getIndexedFields())) @@ -184,28 +210,42 @@ static ClusterReplicationConfiguration clusterReplicationConfiguration( if (t == null) { return ClusterReplicationConfiguration.newBuilder().build(); } - return ClusterReplicationConfiguration.newBuilder().setClusterName(t.getClusterName()).build(); + ClusterReplicationConfiguration.Builder builder = ClusterReplicationConfiguration.newBuilder(); + if (t.getClusterName() != null) { + builder.setClusterName(t.getClusterName()); + } + return builder.build(); } static WorkflowQuery workflowQuery(com.uber.cadence.WorkflowQuery t) { if (t == null) { return null; } - return WorkflowQuery.newBuilder() - .setQueryType(t.getQueryType()) - .setQueryArgs(payload(t.getQueryArgs())) - .build(); + WorkflowQuery.Builder builder = WorkflowQuery.newBuilder(); + if (t.getQueryType() != null) { + builder.setQueryType(t.getQueryType()); + } + if (t.getQueryArgs() != null) { + builder.setQueryArgs(payload(t.getQueryArgs())); + } + return builder.build(); } static WorkflowQueryResult workflowQueryResult(com.uber.cadence.WorkflowQueryResult t) { if (t == null) { return WorkflowQueryResult.newBuilder().build(); } - return WorkflowQueryResult.newBuilder() - .setResultType(queryResultType(t.getResultType())) - .setAnswer(payload(t.getAnswer())) - .setErrorMessage(t.getErrorMessage()) - .build(); + WorkflowQueryResult.Builder builder = WorkflowQueryResult.newBuilder(); + if (t.getResultType() != null) { + builder.setResultType(queryResultType(t.getResultType())); + } + if (t.getAnswer() != null) { + builder.setAnswer(payload(t.getAnswer())); + } + if (t.getErrorMessage() != null) { + builder.setErrorMessage(t.getErrorMessage()); + } + return builder.build(); } static StickyExecutionAttributes stickyExecutionAttributes( @@ -213,20 +253,27 @@ static StickyExecutionAttributes stickyExecutionAttributes( if (t == null) { return StickyExecutionAttributes.newBuilder().build(); } - return StickyExecutionAttributes.newBuilder() - .setWorkerTaskList(taskList(t.getWorkerTaskList())) - .setScheduleToStartTimeout(secondsToDuration(t.getScheduleToStartTimeoutSeconds())) - .build(); + StickyExecutionAttributes.Builder builder = + StickyExecutionAttributes.newBuilder() + .setScheduleToStartTimeout(secondsToDuration(t.getScheduleToStartTimeoutSeconds())); + if (t.getWorkerTaskList() != null) { + builder.setWorkerTaskList(taskList(t.getWorkerTaskList())); + } + return builder.build(); } static WorkerVersionInfo workerVersionInfo(com.uber.cadence.WorkerVersionInfo t) { if (t == null) { return WorkerVersionInfo.newBuilder().build(); } - return WorkerVersionInfo.newBuilder() - .setImpl(t.getImpl()) - .setFeatureVersion(t.getFeatureVersion()) - .build(); + WorkerVersionInfo.Builder builder = WorkerVersionInfo.newBuilder(); + if (t.getImpl() != null) { + builder.setImpl(t.getImpl()); + } + if (t.getFeatureVersion() != null) { + builder.setFeatureVersion(t.getFeatureVersion()); + } + return builder.build(); } static StartTimeFilter startTimeFilter(com.uber.cadence.StartTimeFilter t) { @@ -244,17 +291,25 @@ static WorkflowExecutionFilter workflowExecutionFilter( if (t == null) { return WorkflowExecutionFilter.newBuilder().build(); } - return WorkflowExecutionFilter.newBuilder() - .setWorkflowId(t.getWorkflowId()) - .setRunId(t.getRunId()) - .build(); + WorkflowExecutionFilter.Builder builder = WorkflowExecutionFilter.newBuilder(); + if (t.getWorkflowId() != null) { + builder.setWorkflowId(t.getWorkflowId()); + } + if (t.getRunId() != null) { + builder.setRunId(t.getRunId()); + } + return builder.build(); } static WorkflowTypeFilter workflowTypeFilter(com.uber.cadence.WorkflowTypeFilter t) { if (t == null) { return WorkflowTypeFilter.newBuilder().build(); } - return WorkflowTypeFilter.newBuilder().setName(t.getName()).build(); + WorkflowTypeFilter.Builder builder = WorkflowTypeFilter.newBuilder(); + if (t.getName() != null) { + builder.setName(t.getName()); + } + return builder.build(); } static StatusFilter statusFilter(com.uber.cadence.WorkflowExecutionCloseStatus t) { diff --git a/src/main/java/com/uber/cadence/internal/replay/WorkflowContext.java b/src/main/java/com/uber/cadence/internal/replay/WorkflowContext.java index ca7633986..e40291169 100644 --- a/src/main/java/com/uber/cadence/internal/replay/WorkflowContext.java +++ b/src/main/java/com/uber/cadence/internal/replay/WorkflowContext.java @@ -20,6 +20,7 @@ import com.uber.cadence.*; import com.uber.cadence.context.ContextPropagator; import java.nio.ByteBuffer; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -176,24 +177,17 @@ Map getPropagatedContexts() { } void mergeSearchAttributes(SearchAttributes searchAttributes) { - if (searchAttributes == null) { - return; + Map newIndexedFields = new HashMap<>(); + + if (this.searchAttributes != null && this.searchAttributes.getIndexedFields() != null) { + newIndexedFields.putAll(this.searchAttributes.getIndexedFields()); } - if (this.searchAttributes == null) { - this.searchAttributes = newSearchAttributes(); + // New attributes override existing ones + if (searchAttributes != null && searchAttributes.getIndexedFields() != null) { + newIndexedFields.putAll(searchAttributes.getIndexedFields()); } - Map current = this.searchAttributes.getIndexedFields(); - searchAttributes - .getIndexedFields() - .forEach( - (k, v) -> { - current.put(k, v); - }); - } - - private SearchAttributes newSearchAttributes() { - SearchAttributes result = new SearchAttributes(); - result.setIndexedFields(new HashMap()); - return result; + + this.searchAttributes = + new SearchAttributes().setIndexedFields(Collections.unmodifiableMap(newIndexedFields)); } }