From ea6ea96cd898ed6131abfd010c5b369e5dd75b6f Mon Sep 17 00:00:00 2001 From: Quanzheng Long Date: Mon, 7 Nov 2022 11:54:16 -0800 Subject: [PATCH 1/2] Add context --- .../github/cadenceoss/iwf/core/Context.java | 2 +- .../cadenceoss/iwf/core/WorkerService.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/cadenceoss/iwf/core/Context.java b/src/main/java/io/github/cadenceoss/iwf/core/Context.java index 3c9e514..7476746 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/Context.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/Context.java @@ -4,7 +4,7 @@ @Value.Immutable public abstract class Context { - public abstract Integer getWorkflowStartTimestampSeconds(); + public abstract Long getWorkflowStartTimestampSeconds(); public abstract String getStateExecutionId(); diff --git a/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java b/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java index 4a1e5b6..7cdbc7b 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java @@ -32,15 +32,21 @@ public WorkflowStateStartResponse handleWorkflowStateStart(final WorkflowStateSt final Object input = objectEncoder.decode(stateInput, state.getWorkflowState().getInputType()); final QueryAttributesRWImpl queryAttributesRW = createQueryAttributesRW(req.getWorkflowType(), req.getQueryAttributes()); + final Context context = ImmutableContext.builder() + .workflowId(req.getContext().getWorkflowId()) + .workflowRunId(req.getContext().getWorkflowRunId()) + .workflowStartTimestampSeconds(req.getContext().getWorkflowStartedTimestamp()) + .stateExecutionId(req.getContext().getStateExecutionId()) + .build(); CommandRequest commandRequest = state.getWorkflowState().start( - null, + context, input, null, null, queryAttributesRW, null); - + return new WorkflowStateStartResponse() .commandRequest(CommandRequestMapper.toGenerated(commandRequest)) .upsertQueryAttributes(queryAttributesRW.getUpsertQueryAttributes()); @@ -54,8 +60,15 @@ public WorkflowStateDecideResponse handleWorkflowStateDecide(final WorkflowState final QueryAttributesRWImpl queryAttributesRW = createQueryAttributesRW(req.getWorkflowType(), req.getQueryAttributes()); + final Context context = ImmutableContext.builder() + .workflowId(req.getContext().getWorkflowId()) + .workflowRunId(req.getContext().getWorkflowRunId()) + .workflowStartTimestampSeconds(req.getContext().getWorkflowStartedTimestamp()) + .stateExecutionId(req.getContext().getStateExecutionId()) + .build(); + StateDecision stateDecision = state.getWorkflowState().decide( - null, + context, input, CommandResultsMapper.fromGenerated( req.getCommandResults(), From 37dedecc297f90d80ab44c1820b4c2dcc2ea7839 Mon Sep 17 00:00:00 2001 From: Quanzheng Long Date: Mon, 7 Nov 2022 13:34:54 -0800 Subject: [PATCH 2/2] Done state locals --- iwf-idl | 2 +- .../cadenceoss/iwf/core/StateDecision.java | 8 +-- .../cadenceoss/iwf/core/WorkerService.java | 28 +++++--- .../cadenceoss/iwf/core/WorkflowState.java | 6 +- .../attributes/QueryAttributesRWImpl.java | 8 +-- .../iwf/core/attributes/StateLocal.java | 32 +++++++++ .../attributes/StateLocalAttributesRW.java | 13 ---- .../iwf/core/attributes/StateLocalImpl.java | 69 +++++++++++++++++++ .../iwf/core/mapper/StateDecisionMapper.java | 7 +- .../cadenceoss/iwf/integ/IntegrationTest.java | 1 + .../iwf/integ/basic/BasicWorkflowS1.java | 6 +- .../iwf/integ/basic/BasicWorkflowS2.java | 6 +- .../integ/query/BasicQueryWorkflowState1.java | 16 +++-- .../signal/BasicSignalWorkflowState1.java | 6 +- .../integ/timer/BasicTimerWorkflowState1.java | 6 +- 15 files changed, 157 insertions(+), 57 deletions(-) create mode 100644 src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocal.java delete mode 100644 src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalAttributesRW.java create mode 100644 src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalImpl.java diff --git a/iwf-idl b/iwf-idl index df8e587..acf19a9 160000 --- a/iwf-idl +++ b/iwf-idl @@ -1 +1 @@ -Subproject commit df8e5870095c41a3b3661f42af116e1024f982b3 +Subproject commit acf19a9c7bc0b2e4dca0299a360baa2e9adea631 diff --git a/src/main/java/io/github/cadenceoss/iwf/core/StateDecision.java b/src/main/java/io/github/cadenceoss/iwf/core/StateDecision.java index b0a74c1..51b5fd8 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/StateDecision.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/StateDecision.java @@ -1,20 +1,14 @@ package io.github.cadenceoss.iwf.core; -import io.github.cadenceoss.iwf.gen.models.KeyValue; import org.immutables.value.Value; import java.util.Arrays; import java.util.List; -import java.util.Optional; @Value.Immutable public abstract class StateDecision { - public abstract Optional> getNextStates(); - - public abstract Optional getWaitForMoreCommandResults(); - - public abstract Optional> getUpsertQueryAttributes(); + public abstract List getNextStates(); public static final StateDecision DEAD_END = ImmutableStateDecision.builder().build(); diff --git a/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java b/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java index 7cdbc7b..76b9db7 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/WorkerService.java @@ -1,6 +1,7 @@ package io.github.cadenceoss.iwf.core; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRWImpl; +import io.github.cadenceoss.iwf.core.attributes.StateLocalImpl; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.mapper.CommandRequestMapper; import io.github.cadenceoss.iwf.core.mapper.CommandResultsMapper; @@ -38,18 +39,21 @@ public WorkflowStateStartResponse handleWorkflowStateStart(final WorkflowStateSt .workflowStartTimestampSeconds(req.getContext().getWorkflowStartedTimestamp()) .stateExecutionId(req.getContext().getStateExecutionId()) .build(); + final StateLocalImpl stateLocals = new StateLocalImpl(toMap(null), objectEncoder); CommandRequest commandRequest = state.getWorkflowState().start( context, input, - null, + stateLocals, null, queryAttributesRW, null); return new WorkflowStateStartResponse() .commandRequest(CommandRequestMapper.toGenerated(commandRequest)) - .upsertQueryAttributes(queryAttributesRW.getUpsertQueryAttributes()); + .upsertQueryAttributes(queryAttributesRW.getUpsertQueryAttributes()) + .upsertStateLocalAttributes(stateLocals.getUpsertStateLocalAttributes()) + .recordEvents(stateLocals.getRecordEvents()); } public WorkflowStateDecideResponse handleWorkflowStateDecide(final WorkflowStateDecideRequest req) { @@ -66,6 +70,7 @@ public WorkflowStateDecideResponse handleWorkflowStateDecide(final WorkflowState .workflowStartTimestampSeconds(req.getContext().getWorkflowStartedTimestamp()) .stateExecutionId(req.getContext().getStateExecutionId()) .build(); + final StateLocalImpl stateLocals = new StateLocalImpl(toMap(req.getStateLocalAttributes()), objectEncoder); StateDecision stateDecision = state.getWorkflowState().decide( context, @@ -74,18 +79,24 @@ public WorkflowStateDecideResponse handleWorkflowStateDecide(final WorkflowState req.getCommandResults(), registry.getSignalChannelNameToSignalTypeMap(req.getWorkflowType()), objectEncoder), - null, + stateLocals, null, queryAttributesRW, null); - List queryAttributesToUpsert = queryAttributesRW.getUpsertQueryAttributes(); - stateDecision = ImmutableStateDecision.copyOf(stateDecision).withUpsertQueryAttributes(queryAttributesToUpsert); return new WorkflowStateDecideResponse() - .stateDecision(StateDecisionMapper.toGenerated(stateDecision)); + .stateDecision(StateDecisionMapper.toGenerated(stateDecision)) + .upsertQueryAttributes(queryAttributesRW.getUpsertQueryAttributes()) + .upsertStateLocalAttributes(stateLocals.getUpsertStateLocalAttributes()) + .recordEvents(stateLocals.getRecordEvents()); } private QueryAttributesRWImpl createQueryAttributesRW(String workflowType, List keyValues) { - Map map; + final Map map = toMap(keyValues); + return new QueryAttributesRWImpl(registry.getQueryAttributeKeyToTypeMap(workflowType), map, objectEncoder); + } + + private Map toMap(final List keyValues) { + final Map map; if (keyValues == null || keyValues.isEmpty()) { map = new HashMap<>(); } else { @@ -93,7 +104,6 @@ private QueryAttributesRWImpl createQueryAttributesRW(String workflowType, List< .filter(keyValue -> keyValue.getValue() != null) .collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue)); } - - return new QueryAttributesRWImpl(registry.getQueryAttributeKeyToTypeMap(workflowType), map, objectEncoder); + return map; } } diff --git a/src/main/java/io/github/cadenceoss/iwf/core/WorkflowState.java b/src/main/java/io/github/cadenceoss/iwf/core/WorkflowState.java index 42986df..150ecbb 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/WorkflowState.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/WorkflowState.java @@ -3,7 +3,7 @@ import io.github.cadenceoss.iwf.core.attributes.AttributeLoadingPolicy; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandCarryOverPolicy; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; @@ -43,7 +43,7 @@ default StateOptions getStateOptions() { */ CommandRequest start( final Context context, I input, - final StateLocalAttributesRW stateLocals, + final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel); @@ -62,7 +62,7 @@ StateDecision decide( final Context context, final I input, final CommandResults commandResults, - final StateLocalAttributesRW stateLocals, + final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel); diff --git a/src/main/java/io/github/cadenceoss/iwf/core/attributes/QueryAttributesRWImpl.java b/src/main/java/io/github/cadenceoss/iwf/core/attributes/QueryAttributesRWImpl.java index f131c05..83c6c0f 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/attributes/QueryAttributesRWImpl.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/attributes/QueryAttributesRWImpl.java @@ -12,7 +12,7 @@ public class QueryAttributesRWImpl implements QueryAttributesRW{ private final Map> queryAttributeNameToTypeMap; private final Map queryAttributeNameToEncodedObjectMap; - private final Map queryAttributesToUpsert; + private final Map upsertQueryAttributesToReturnToServer; private final ObjectEncoder objectEncoder; public QueryAttributesRWImpl( @@ -21,7 +21,7 @@ public QueryAttributesRWImpl( final ObjectEncoder objectEncoder) { this.queryAttributeNameToTypeMap = queryAttributeNameToTypeMap; this.queryAttributeNameToEncodedObjectMap = queryAttributeNameToValueMap; - this.queryAttributesToUpsert = new HashMap<>(); + this.upsertQueryAttributesToReturnToServer = new HashMap<>(); this.objectEncoder = objectEncoder; } @@ -59,11 +59,11 @@ public void set(String key, Object value) { } this.queryAttributeNameToEncodedObjectMap.put(key, objectEncoder.encode(value)); - this.queryAttributesToUpsert.put(key, objectEncoder.encode(value)); + this.upsertQueryAttributesToReturnToServer.put(key, objectEncoder.encode(value)); } public List getUpsertQueryAttributes() { - return queryAttributesToUpsert.entrySet().stream() + return upsertQueryAttributesToReturnToServer.entrySet().stream() .map(stringEncodedObjectEntry -> new KeyValue() .key(stringEncodedObjectEntry.getKey()) diff --git a/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocal.java b/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocal.java new file mode 100644 index 0000000..0ec06c0 --- /dev/null +++ b/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocal.java @@ -0,0 +1,32 @@ +package io.github.cadenceoss.iwf.core.attributes; + +public interface StateLocal { + /** + * set a local attribute. The scope of the attribute is only within the execution of this state. + * Usually it's for passing from State Start API to State Decide API + * User code must make sure using the same type for both get & set + * + * @param key + * @param value + */ + void setLocalAttribute(String key, Object value); + + /** + * Retrieve a local state attribute + * User code must make sure using the same type for both get & set + * + * @param key + * @param type + * @param + * @return + */ + T getLocalAttribute(String key, Class type); + + /** + * Record an arbitrary event in State Start/Decide API for debugging/tracking purpose + * + * @param key the key of the event. Within a Start/Decide API, the same key cannot be used for more than once. + * @param eventData the data of the event. + */ + void recordEvent(String key, Object eventData); +} diff --git a/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalAttributesRW.java b/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalAttributesRW.java deleted file mode 100644 index a2064de..0000000 --- a/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalAttributesRW.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.github.cadenceoss.iwf.core.attributes; - -public class StateLocalAttributesRW { - // user code must make sure using the same type for both get & set - public void set(String key, Object value) { - return; - } - - // user code must make sure using the same type for both get & set - public T get(String key, Class type) { - return null; - } -} diff --git a/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalImpl.java b/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalImpl.java new file mode 100644 index 0000000..dec0af7 --- /dev/null +++ b/src/main/java/io/github/cadenceoss/iwf/core/attributes/StateLocalImpl.java @@ -0,0 +1,69 @@ +package io.github.cadenceoss.iwf.core.attributes; + +import io.github.cadenceoss.iwf.core.ObjectEncoder; +import io.github.cadenceoss.iwf.core.WorkflowDefinitionException; +import io.github.cadenceoss.iwf.gen.models.EncodedObject; +import io.github.cadenceoss.iwf.gen.models.KeyValue; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class StateLocalImpl implements StateLocal { + + private final Map recordEvents; + private final Map attributeNameToEncodedObjectMap; + private final Map upsertAttributesToReturnToServer; + private final ObjectEncoder objectEncoder; + + public StateLocalImpl(final Map attributeNameToEncodedObjectMap, + final ObjectEncoder objectEncoder) { + this.objectEncoder = objectEncoder; + this.attributeNameToEncodedObjectMap = attributeNameToEncodedObjectMap; + upsertAttributesToReturnToServer = new HashMap<>(); + recordEvents = new HashMap<>(); + } + + @Override + public void setLocalAttribute(final String key, final Object value) { + final EncodedObject encodedData = objectEncoder.encode(value); + attributeNameToEncodedObjectMap.put(key, encodedData); + upsertAttributesToReturnToServer.put(key, encodedData); + } + + @Override + public T getLocalAttribute(final String key, final Class type) { + final EncodedObject encodedData = this.attributeNameToEncodedObjectMap.get(key); + if (encodedData == null) { + return null; + } + return objectEncoder.decode(encodedData, type); + } + + @Override + public void recordEvent(final String key, final Object eventData) { + if (recordEvents.containsKey(key)) { + throw new WorkflowDefinitionException("cannot record the same event for more than once"); + } + recordEvents.put(key, objectEncoder.encode(eventData)); + } + + public List getUpsertStateLocalAttributes() { + return upsertAttributesToReturnToServer.entrySet().stream() + .map(stringEncodedObjectEntry -> + new KeyValue() + .key(stringEncodedObjectEntry.getKey()) + .value(stringEncodedObjectEntry.getValue())) + .collect(Collectors.toList()); + } + + public List getRecordEvents() { + return recordEvents.entrySet().stream() + .map(stringEncodedObjectEntry -> + new KeyValue() + .key(stringEncodedObjectEntry.getKey()) + .value(stringEncodedObjectEntry.getValue())) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/io/github/cadenceoss/iwf/core/mapper/StateDecisionMapper.java b/src/main/java/io/github/cadenceoss/iwf/core/mapper/StateDecisionMapper.java index 60583a8..88e680d 100644 --- a/src/main/java/io/github/cadenceoss/iwf/core/mapper/StateDecisionMapper.java +++ b/src/main/java/io/github/cadenceoss/iwf/core/mapper/StateDecisionMapper.java @@ -6,14 +6,13 @@ public class StateDecisionMapper { public static StateDecision toGenerated(io.github.cadenceoss.iwf.core.StateDecision stateDecision) { - if (!stateDecision.getNextStates().isPresent()) { + if (stateDecision.getNextStates() == null) { return null; } return new StateDecision() - .nextStates(stateDecision.getNextStates().get() + .nextStates(stateDecision.getNextStates() .stream() .map(StateMovementMapper::toGenerated) - .collect(Collectors.toList())) - .upsertQueryAttributes(stateDecision.getUpsertQueryAttributes().get()); + .collect(Collectors.toList())); } } diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/IntegrationTest.java b/src/test/java/io/github/cadenceoss/iwf/integ/IntegrationTest.java index 9dac8e8..408d00f 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/IntegrationTest.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/IntegrationTest.java @@ -70,6 +70,7 @@ public void testBasicQueryWorkflow() throws InterruptedException { "query-start-query-decide", allQueryAttributes.get(BasicQueryWorkflow.ATTRIBUTE_KEY)); Assertions.assertEquals( 1, allQueryAttributes.size()); + Assertions.assertEquals("test-value-2", output); } diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS1.java b/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS1.java index b282e48..7ea1b6b 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS1.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS1.java @@ -5,7 +5,7 @@ import io.github.cadenceoss.iwf.core.WorkflowState; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; import io.github.cadenceoss.iwf.core.command.InterStateChannel; @@ -25,12 +25,12 @@ public Class getInputType() { } @Override - public CommandRequest start(final Context context, final Integer input, final StateLocalAttributesRW stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public CommandRequest start(final Context context, final Integer input, final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { return CommandRequest.empty; } @Override - public StateDecision decide(final Context context, final Integer input, final CommandResults commandResults, final StateLocalAttributesRW stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public StateDecision decide(final Context context, final Integer input, final CommandResults commandResults, final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { final int output = input + 1; return StateDecision.singleNextState(BasicWorkflowS2.StateId, output); } diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS2.java b/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS2.java index 2096757..5bba5a5 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS2.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/basic/BasicWorkflowS2.java @@ -5,7 +5,7 @@ import io.github.cadenceoss.iwf.core.WorkflowState; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; import io.github.cadenceoss.iwf.core.command.InterStateChannel; @@ -25,12 +25,12 @@ public Class getInputType() { } @Override - public CommandRequest start(final Context context, final Integer input, final StateLocalAttributesRW stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public CommandRequest start(final Context context, final Integer input, final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { return CommandRequest.empty; } @Override - public StateDecision decide(final Context context, final Integer input, final CommandResults commandResults, final StateLocalAttributesRW stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public StateDecision decide(final Context context, final Integer input, final CommandResults commandResults, final StateLocal stateLocals, final SearchAttributesRW searchAttributes, final QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { final int output = input + 1; return StateDecision.gracefulCompleteWorkflow(output); } diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/query/BasicQueryWorkflowState1.java b/src/test/java/io/github/cadenceoss/iwf/integ/query/BasicQueryWorkflowState1.java index 7a54ed0..c59e80f 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/query/BasicQueryWorkflowState1.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/query/BasicQueryWorkflowState1.java @@ -7,7 +7,7 @@ import io.github.cadenceoss.iwf.core.WorkflowState; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; import io.github.cadenceoss.iwf.core.command.InterStateChannel; @@ -29,17 +29,25 @@ public Class getInputType() { } @Override - public CommandRequest start(Context context, String input, StateLocalAttributesRW stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public CommandRequest start(Context context, String input, StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { queryAttributes.set(ATTRIBUTE_KEY, "query-start"); + stateLocals.setLocalAttribute("test-key", "test-value-1"); + stateLocals.recordEvent("event-1", "event-1"); return CommandRequest.empty; } @Override - public StateDecision decide(Context context, String input, CommandResults commandResults, StateLocalAttributesRW stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { + public StateDecision decide(Context context, String input, CommandResults commandResults, StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { String str = queryAttributes.get(ATTRIBUTE_KEY, String.class); queryAttributes.set(ATTRIBUTE_KEY, str + "-query-decide"); + String testVal2 = stateLocals.getLocalAttribute("test-key", String.class); + if (testVal2.equals("test-value-1")) { + stateLocals.setLocalAttribute("test-key", "test-value-2"); + } + stateLocals.recordEvent("event-1", "event-1"); + stateLocals.recordEvent("event-2", "event-2"); return ImmutableStateDecision.builder() - .nextStates(Arrays.asList(StateMovement.gracefulCompleteWorkflow("end"))) + .nextStates(Arrays.asList(StateMovement.gracefulCompleteWorkflow("test-value-2"))) .build(); } } diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflowState1.java b/src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflowState1.java index 09628a1..92d5a2e 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflowState1.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/signal/BasicSignalWorkflowState1.java @@ -5,7 +5,7 @@ import io.github.cadenceoss.iwf.core.WorkflowState; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; import io.github.cadenceoss.iwf.core.command.InterStateChannel; @@ -31,7 +31,7 @@ public Class getInputType() { public CommandRequest start( Context context, Integer input, - StateLocalAttributesRW stateLocals, + StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { return CommandRequest.forAllCommandCompleted(SignalCommand.create(COMMAND_ID, SIGNAL_CHANNEL_NAME)); @@ -42,7 +42,7 @@ public StateDecision decide( Context context, Integer input, CommandResults commandResults, - StateLocalAttributesRW stateLocals, + StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { SignalCommandResult signalCommandResult = commandResults.getAllSignalCommandResults().get(0); diff --git a/src/test/java/io/github/cadenceoss/iwf/integ/timer/BasicTimerWorkflowState1.java b/src/test/java/io/github/cadenceoss/iwf/integ/timer/BasicTimerWorkflowState1.java index fbd0b50..f3a92f7 100644 --- a/src/test/java/io/github/cadenceoss/iwf/integ/timer/BasicTimerWorkflowState1.java +++ b/src/test/java/io/github/cadenceoss/iwf/integ/timer/BasicTimerWorkflowState1.java @@ -5,7 +5,7 @@ import io.github.cadenceoss.iwf.core.WorkflowState; import io.github.cadenceoss.iwf.core.attributes.QueryAttributesRW; import io.github.cadenceoss.iwf.core.attributes.SearchAttributesRW; -import io.github.cadenceoss.iwf.core.attributes.StateLocalAttributesRW; +import io.github.cadenceoss.iwf.core.attributes.StateLocal; import io.github.cadenceoss.iwf.core.command.CommandRequest; import io.github.cadenceoss.iwf.core.command.CommandResults; import io.github.cadenceoss.iwf.core.command.InterStateChannel; @@ -31,7 +31,7 @@ public Class getInputType() { public CommandRequest start( Context context, Integer input, - StateLocalAttributesRW stateLocals, + StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { return CommandRequest.forAllCommandCompleted(TimerCommand.createByDuration(COMMAND_ID, Duration.ofSeconds(input))); @@ -42,7 +42,7 @@ public StateDecision decide( Context context, Integer input, CommandResults commandResults, - StateLocalAttributesRW stateLocals, + StateLocal stateLocals, SearchAttributesRW searchAttributes, QueryAttributesRW queryAttributes, final InterStateChannel interStateChannel) { return StateDecision.gracefulCompleteWorkflow();