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/compatibility/proto/serviceclient/GrpcServiceStubs.java b/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/GrpcServiceStubs.java index 451d8868a..fdf5a2bab 100644 --- a/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/GrpcServiceStubs.java +++ b/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/GrpcServiceStubs.java @@ -16,8 +16,6 @@ package com.uber.cadence.internal.compatibility.proto.serviceclient; import com.google.common.base.Strings; -import com.google.protobuf.ByteString; -import com.uber.cadence.api.v1.*; import com.uber.cadence.api.v1.DomainAPIGrpc; import com.uber.cadence.api.v1.MetaAPIGrpc; import com.uber.cadence.api.v1.MetaAPIGrpc.MetaAPIBlockingStub; @@ -32,7 +30,6 @@ import com.uber.cadence.api.v1.WorkflowAPIGrpc.WorkflowAPIBlockingStub; import com.uber.cadence.api.v1.WorkflowAPIGrpc.WorkflowAPIFutureStub; import com.uber.cadence.internal.Version; -import com.uber.cadence.internal.tracing.TracingPropagator; import com.uber.cadence.serviceclient.ClientOptions; import com.uber.cadence.serviceclient.auth.IAuthorizationProvider; import io.grpc.*; @@ -41,13 +38,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentracing.Scope; -import io.opentracing.Span; import io.opentracing.Tracer; import java.nio.charset.StandardCharsets; -import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; @@ -116,6 +109,7 @@ final class GrpcServiceStubs implements IGrpcServiceStubs { if (!Strings.isNullOrEmpty(options.getIsolationGroup())) { headers.put(ISOLATION_GROUP_HEADER_KEY, options.getIsolationGroup()); } + mergeHeaders(headers, options.getHeaders()); Channel interceptedChannel = ClientInterceptors.intercept( @@ -205,117 +199,7 @@ public void start(Listener responseListener, Metadata headers) { } private ClientInterceptor newOpenTracingInterceptor(Tracer tracer) { - return new ClientInterceptor() { - private final TracingPropagator tracingPropagator = new TracingPropagator(tracer); - private final String OPERATIONFORMAT = "cadence-%s"; - - @Override - public ClientCall interceptCall( - MethodDescriptor method, CallOptions callOptions, Channel next) { - return new ForwardingClientCall.SimpleForwardingClientCall( - next.newCall(method, callOptions)) { - - @Override - public void start(Listener responseListener, Metadata headers) { - Span span = - tracingPropagator.spanByServiceMethod( - String.format(OPERATIONFORMAT, method.getBareMethodName())); - Scope scope = tracer.activateSpan(span); - super.start( - new ForwardingClientCallListener.SimpleForwardingClientCallListener( - responseListener) { - @Override - public void onClose(Status status, Metadata trailers) { - try { - super.onClose(status, trailers); - } finally { - span.finish(); - scope.close(); - } - } - }, - headers); - } - - @SuppressWarnings("unchecked") - @Override - public void sendMessage(ReqT message) { - if (Objects.equals(method.getBareMethodName(), "StartWorkflowExecution") - && message instanceof StartWorkflowExecutionRequest) { - StartWorkflowExecutionRequest request = (StartWorkflowExecutionRequest) message; - Header newHeader = addTracingHeaders(request.getHeader()); - - // cast should not throw error as we are using the builder - message = (ReqT) request.toBuilder().setHeader(newHeader).build(); - } else if (Objects.equals(method.getBareMethodName(), "StartWorkflowExecutionAsync") - && message instanceof StartWorkflowExecutionAsyncRequest) { - StartWorkflowExecutionAsyncRequest request = - (StartWorkflowExecutionAsyncRequest) message; - Header newHeader = addTracingHeaders(request.getRequest().getHeader()); - - // cast should not throw error as we are using the builder - message = - (ReqT) - request - .toBuilder() - .setRequest(request.getRequest().toBuilder().setHeader(newHeader)) - .build(); - } else if (Objects.equals( - method.getBareMethodName(), "SignalWithStartWorkflowExecution") - && message instanceof SignalWithStartWorkflowExecutionRequest) { - SignalWithStartWorkflowExecutionRequest request = - (SignalWithStartWorkflowExecutionRequest) message; - Header newHeader = addTracingHeaders(request.getStartRequest().getHeader()); - - // cast should not throw error as we are using the builder - message = - (ReqT) - request - .toBuilder() - .setStartRequest( - request.getStartRequest().toBuilder().setHeader(newHeader)) - .build(); - } else if (Objects.equals( - method.getBareMethodName(), "SignalWithStartWorkflowExecutionAsync") - && message instanceof SignalWithStartWorkflowExecutionAsyncRequest) { - SignalWithStartWorkflowExecutionAsyncRequest request = - (SignalWithStartWorkflowExecutionAsyncRequest) message; - Header newHeader = - addTracingHeaders(request.getRequest().getStartRequest().getHeader()); - - // cast should not throw error as we are using the builder - message = - (ReqT) - request - .toBuilder() - .setRequest( - request - .getRequest() - .toBuilder() - .setStartRequest( - request - .getRequest() - .getStartRequest() - .toBuilder() - .setHeader(newHeader))) - .build(); - } - super.sendMessage(message); - } - - private Header addTracingHeaders(Header header) { - Map headers = new HashMap<>(); - tracingPropagator.inject(headers); - Header.Builder headerBuilder = header.toBuilder(); - headers.forEach( - (k, v) -> - headerBuilder.putFields( - k, Payload.newBuilder().setData(ByteString.copyFrom(v)).build())); - return headerBuilder.build(); - } - }; - } - }; + return new OpenTracingInterceptor(tracer); } private ClientInterceptor newTracingInterceptor() { @@ -488,4 +372,22 @@ public ClientCall interceptCall( return next.newCall(method, callOptions.withDeadlineAfter(duration, TimeUnit.MILLISECONDS)); } } + + private static void mergeHeaders(Metadata metadata, Map headers) { + if (headers == null) { + return; + } + for (Map.Entry entry : headers.entrySet()) { + Metadata.Key key = Metadata.Key.of(entry.getKey(), Metadata.ASCII_STRING_MARSHALLER); + // Allow headers to overwrite any defaults + if (metadata.containsKey(key)) { + metadata.removeAll(key); + } + // Only replace it if they specify a value. + // This allows for removing headers + if (!Strings.isNullOrEmpty(entry.getValue())) { + metadata.put(key, entry.getValue()); + } + } + } } diff --git a/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/OpenTracingInterceptor.java b/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/OpenTracingInterceptor.java new file mode 100644 index 000000000..553e49b03 --- /dev/null +++ b/src/main/java/com/uber/cadence/internal/compatibility/proto/serviceclient/OpenTracingInterceptor.java @@ -0,0 +1,231 @@ +/* + * Modifications Copyright (c) 2017-2021 Uber Technologies Inc. + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.uber.cadence.internal.compatibility.proto.serviceclient; + +import com.google.protobuf.ByteString; +import com.uber.cadence.api.v1.Header; +import com.uber.cadence.api.v1.Payload; +import com.uber.cadence.api.v1.SignalWithStartWorkflowExecutionAsyncRequest; +import com.uber.cadence.api.v1.SignalWithStartWorkflowExecutionRequest; +import com.uber.cadence.api.v1.StartWorkflowExecutionAsyncRequest; +import com.uber.cadence.api.v1.StartWorkflowExecutionRequest; +import com.uber.cadence.internal.tracing.TracingPropagator; +import io.grpc.Attributes; +import io.grpc.CallOptions; +import io.grpc.Channel; +import io.grpc.ClientCall; +import io.grpc.ClientInterceptor; +import io.grpc.ForwardingClientCall; +import io.grpc.ForwardingClientCallListener; +import io.grpc.Metadata; +import io.grpc.MethodDescriptor; +import io.grpc.Status; +import io.opentracing.Scope; +import io.opentracing.Span; +import io.opentracing.Tracer; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.annotation.Nullable; + +final class OpenTracingInterceptor implements ClientInterceptor { + private static final String OPERATION_FORMAT = "cadence-%s"; + private final Tracer tracer; + private final TracingPropagator tracingPropagator; + + OpenTracingInterceptor(Tracer tracer) { + this.tracer = tracer; + this.tracingPropagator = new TracingPropagator(tracer); + } + + @Override + public ClientCall interceptCall( + MethodDescriptor method, CallOptions callOptions, Channel next) { + + Span span = + tracingPropagator.spanByServiceMethod( + String.format(OPERATION_FORMAT, method.getBareMethodName())); + try (Scope ignored = tracer.activateSpan(span)) { + return new OpenTracingClientCall<>(next, method, callOptions, span); + } + } + + private class OpenTracingClientCall + extends ForwardingClientCall.SimpleForwardingClientCall { + + private final AtomicBoolean finished = new AtomicBoolean(); + private final MethodDescriptor method; + private final Span span; + + public OpenTracingClientCall( + Channel next, MethodDescriptor method, CallOptions callOptions, Span span) { + super(next.newCall(method, callOptions)); + this.method = method; + this.span = span; + } + + @Override + public void start(Listener responseListener, Metadata headers) { + try (Scope ignored = tracer.activateSpan(span)) { + super.start( + new ForwardingClientCallListener.SimpleForwardingClientCallListener( + responseListener) { + @Override + public void onClose(Status status, Metadata trailers) { + try { + super.onClose(status, trailers); + } finally { + finishSpan(); + } + } + }, + headers); + } + } + + @Override + public void request(int numMessages) { + try (Scope ignored = tracer.activateSpan(span)) { + super.request(numMessages); + } + } + + @Override + public void setMessageCompression(boolean enabled) { + try (Scope ignored = tracer.activateSpan(span)) { + super.setMessageCompression(enabled); + } + } + + @Override + public boolean isReady() { + try (Scope ignored = tracer.activateSpan(span)) { + return super.isReady(); + } + } + + @Override + public Attributes getAttributes() { + try (Scope ignored = tracer.activateSpan(span)) { + return super.getAttributes(); + } + } + + @Override + public void cancel(@Nullable String message, @Nullable Throwable cause) { + try (Scope ignored = tracer.activateSpan(span)) { + super.cancel(message, cause); + } finally { + finishSpan(); + } + } + + @Override + public void halfClose() { + try (Scope ignored = tracer.activateSpan(span)) { + super.halfClose(); + } + } + + @Override + public void sendMessage(ReqT message) { + try (Scope ignored = tracer.activateSpan(span)) { + message = replaceMessage(message); + super.sendMessage(message); + } + } + + private void finishSpan() { + // Some combination of cancel and onClose can be called so ensure we only finish once + if (finished.compareAndSet(false, true)) { + span.finish(); + } + } + + @SuppressWarnings("unchecked") + private ReqT replaceMessage(ReqT message) { + if (Objects.equals(method.getBareMethodName(), "StartWorkflowExecution") + && message instanceof StartWorkflowExecutionRequest) { + StartWorkflowExecutionRequest request = (StartWorkflowExecutionRequest) message; + Header newHeader = addTracingHeaders(request.getHeader()); + + // cast should not throw error as we are using the builder + message = (ReqT) request.toBuilder().setHeader(newHeader).build(); + } else if (Objects.equals(method.getBareMethodName(), "StartWorkflowExecutionAsync") + && message instanceof StartWorkflowExecutionAsyncRequest) { + StartWorkflowExecutionAsyncRequest request = (StartWorkflowExecutionAsyncRequest) message; + Header newHeader = addTracingHeaders(request.getRequest().getHeader()); + + // cast should not throw error as we are using the builder + message = + (ReqT) + request + .toBuilder() + .setRequest(request.getRequest().toBuilder().setHeader(newHeader)) + .build(); + } else if (Objects.equals(method.getBareMethodName(), "SignalWithStartWorkflowExecution") + && message instanceof SignalWithStartWorkflowExecutionRequest) { + SignalWithStartWorkflowExecutionRequest request = + (SignalWithStartWorkflowExecutionRequest) message; + Header newHeader = addTracingHeaders(request.getStartRequest().getHeader()); + + // cast should not throw error as we are using the builder + message = + (ReqT) + request + .toBuilder() + .setStartRequest(request.getStartRequest().toBuilder().setHeader(newHeader)) + .build(); + } else if (Objects.equals(method.getBareMethodName(), "SignalWithStartWorkflowExecutionAsync") + && message instanceof SignalWithStartWorkflowExecutionAsyncRequest) { + SignalWithStartWorkflowExecutionAsyncRequest request = + (SignalWithStartWorkflowExecutionAsyncRequest) message; + Header newHeader = addTracingHeaders(request.getRequest().getStartRequest().getHeader()); + + // cast should not throw error as we are using the builder + message = + (ReqT) + request + .toBuilder() + .setRequest( + request + .getRequest() + .toBuilder() + .setStartRequest( + request + .getRequest() + .getStartRequest() + .toBuilder() + .setHeader(newHeader))) + .build(); + } + + return message; + } + + private Header addTracingHeaders(Header header) { + Map headers = new HashMap<>(); + tracingPropagator.inject(headers); + Header.Builder headerBuilder = header.toBuilder(); + headers.forEach( + (k, v) -> + headerBuilder.putFields( + k, Payload.newBuilder().setData(ByteString.copyFrom(v)).build())); + return headerBuilder.build(); + } + }; +} 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)); } } diff --git a/src/test/java/com/uber/cadence/internal/compatibility/Thrift2ProtoAdapterTest.java b/src/test/java/com/uber/cadence/internal/compatibility/Thrift2ProtoAdapterTest.java index d28b69804..5098145f8 100644 --- a/src/test/java/com/uber/cadence/internal/compatibility/Thrift2ProtoAdapterTest.java +++ b/src/test/java/com/uber/cadence/internal/compatibility/Thrift2ProtoAdapterTest.java @@ -25,6 +25,7 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; +import com.google.common.collect.ImmutableMap; import com.uber.cadence.AccessDeniedError; import com.uber.cadence.RefreshWorkflowTasksRequest; import com.uber.cadence.SignalWithStartWorkflowExecutionAsyncRequest; @@ -84,6 +85,13 @@ public class Thrift2ProtoAdapterTest { private static final Metadata.Key AUTHORIZATION_HEADER_KEY = Metadata.Key.of("cadence-authorization", Metadata.ASCII_STRING_MARSHALLER); + private static final Metadata.Key EXPECTED_HEADER_KEY = + Metadata.Key.of("rpc-service", Metadata.ASCII_STRING_MARSHALLER); + private static final Metadata.Key REMOVED_HEADER_KEY = + Metadata.Key.of("rpc-caller", Metadata.ASCII_STRING_MARSHALLER); + private static final Metadata.Key ADDED_HEADER_KEY = + Metadata.Key.of("from-options", Metadata.ASCII_STRING_MARSHALLER); + private static final String ADDED_HEADER_VALUE = "added-value"; private static final StatusRuntimeException GRPC_ACCESS_DENIED = new StatusRuntimeException(Status.PERMISSION_DENIED); @@ -107,11 +115,14 @@ public void setup() { (Logger) LoggerFactory.getLogger( "com.uber.cadence.internal.compatibility.proto.serviceclient.GrpcServiceStubs"); + Map headers = + ImmutableMap.of(REMOVED_HEADER_KEY.name(), "", ADDED_HEADER_KEY.name(), ADDED_HEADER_VALUE); logger.setLevel(Level.TRACE); client = new Thrift2ProtoAdapter( IGrpcServiceStubs.newInstance( ClientOptions.newBuilder() + .setHeaders(headers) .setAuthorizationProvider("foo"::getBytes) .setGRPCChannel(clientChannel) .build())); @@ -119,6 +130,7 @@ public void setup() { new Thrift2ProtoAdapter( IGrpcServiceStubs.newInstance( ClientOptions.newBuilder() + .setHeaders(headers) .setAuthorizationProvider("foo"::getBytes) .setTracer(tracer) .setGRPCChannel(clientChannel) @@ -1020,7 +1032,9 @@ public Server createServer(ServiceDescriptor... descriptors) { } serverBuilder.addService( ServerInterceptors.intercept( - serviceDefinition.build(), new AuthHeaderValidatingInterceptor())); + serviceDefinition.build(), + new AuthHeaderValidatingInterceptor(), + new HeaderValidatingInterceptor())); } return serverBuilder.build().start(); } catch (IOException e) { @@ -1058,7 +1072,41 @@ private static class AuthHeaderValidatingInterceptor implements ServerIntercepto public ServerCall.Listener interceptCall( ServerCall call, Metadata headers, ServerCallHandler next) { if (!headers.containsKey(AUTHORIZATION_HEADER_KEY)) { - call.close(Status.INVALID_ARGUMENT, new Metadata()); + call.close( + Status.INVALID_ARGUMENT.withDescription( + "Missing auth header: " + AUTHORIZATION_HEADER_KEY.name()), + new Metadata()); + } + return next.startCall(call, headers); + } + } + + private static class HeaderValidatingInterceptor implements ServerInterceptor { + @Override + public ServerCall.Listener interceptCall( + ServerCall call, Metadata headers, ServerCallHandler next) { + if (!headers.containsKey(EXPECTED_HEADER_KEY)) { + call.close( + Status.INVALID_ARGUMENT.withDescription("Missing " + EXPECTED_HEADER_KEY.name()), + new Metadata()); + } + String addedHeaderValue = headers.get(ADDED_HEADER_KEY); + if (!ADDED_HEADER_VALUE.equals(addedHeaderValue)) { + call.close( + Status.INVALID_ARGUMENT.withDescription( + "Incorrect value for " + + ADDED_HEADER_KEY.name() + + "; got " + + addedHeaderValue + + " instead of " + + ADDED_HEADER_VALUE), + new Metadata()); + } + if (headers.containsKey(REMOVED_HEADER_KEY)) { + call.close( + Status.INVALID_ARGUMENT.withDescription( + "Unexpected header " + REMOVED_HEADER_KEY.name()), + new Metadata()); } return next.startCall(call, headers); }