Skip to content

Commit d9456b3

Browse files
optimize: add StateType Enum (#6891)
1 parent 7975aa5 commit d9456b3

32 files changed

+379
-131
lines changed

compatible/src/main/java/io/seata/saga/statelang/domain/State.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public interface State {
4343
*
4444
* @return the state type
4545
*/
46-
String getType();
46+
StateType getType();
4747

4848
/**
4949
* next state name

compatible/src/main/java/io/seata/saga/statelang/domain/StateInstance.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ public interface StateInstance {
7272
*
7373
* @return state instance type
7474
*/
75-
String getType();
75+
StateType getType();
7676

7777
/**
7878
* set type
7979
*
8080
* @param type state instance type
8181
*/
82-
void setType(String type);
82+
void setType(StateType type);
8383

8484
/**
8585
* get service name
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package io.seata.saga.statelang.domain;
18+
19+
/**
20+
* StateType
21+
*/
22+
@Deprecated
23+
public enum StateType {
24+
25+
/**
26+
* ServiceTask State
27+
*/
28+
SERVICE_TASK("ServiceTask"),
29+
30+
/**
31+
* Choice State
32+
*/
33+
CHOICE("Choice"),
34+
35+
/**
36+
* Fail State
37+
*/
38+
FAIL("Fail"),
39+
40+
/**
41+
* Succeed State
42+
*/
43+
SUCCEED("Succeed"),
44+
45+
/**
46+
* CompensationTrigger State
47+
*/
48+
COMPENSATION_TRIGGER("CompensationTrigger"),
49+
50+
/**
51+
* SubStateMachine State
52+
*/
53+
SUB_STATE_MACHINE("SubStateMachine"),
54+
55+
/**
56+
* CompensateSubMachine State
57+
*/
58+
SUB_MACHINE_COMPENSATION("CompensateSubMachine"),
59+
60+
/**
61+
* ScriptTask State
62+
*/
63+
SCRIPT_TASK("ScriptTask"),
64+
65+
/**
66+
* LoopStart State
67+
*/
68+
LOOP_START("LoopStart");
69+
70+
71+
private String value;
72+
73+
StateType(String value) {
74+
this.value = value;
75+
}
76+
77+
public String getValue() {
78+
return value;
79+
}
80+
81+
public static StateType getStateType(String value) {
82+
for (StateType stateType : values()) {
83+
if (stateType.getValue().equalsIgnoreCase(value)) {
84+
return stateType;
85+
}
86+
}
87+
88+
throw new IllegalArgumentException("Unknown StateType[" + value + "]");
89+
}
90+
91+
92+
public static StateType wrap(org.apache.seata.saga.statelang.domain.StateType target) {
93+
if (target == null) {
94+
return null;
95+
}
96+
switch (target) {
97+
case SERVICE_TASK:
98+
return SERVICE_TASK;
99+
case CHOICE:
100+
return CHOICE;
101+
case FAIL:
102+
return FAIL;
103+
case SUCCEED:
104+
return SUCCEED;
105+
case COMPENSATION_TRIGGER:
106+
return COMPENSATION_TRIGGER;
107+
case SUB_STATE_MACHINE:
108+
return SUB_STATE_MACHINE;
109+
case SUB_MACHINE_COMPENSATION:
110+
return SUB_MACHINE_COMPENSATION;
111+
case SCRIPT_TASK:
112+
return SCRIPT_TASK;
113+
case LOOP_START:
114+
return LOOP_START;
115+
default:
116+
throw new IllegalArgumentException("Cannot convert " + target.name());
117+
}
118+
}
119+
120+
public org.apache.seata.saga.statelang.domain.StateType unwrap() {
121+
switch (this) {
122+
case SERVICE_TASK:
123+
return org.apache.seata.saga.statelang.domain.StateType.SERVICE_TASK;
124+
case CHOICE:
125+
return org.apache.seata.saga.statelang.domain.StateType.CHOICE;
126+
case FAIL:
127+
return org.apache.seata.saga.statelang.domain.StateType.FAIL;
128+
case SUCCEED:
129+
return org.apache.seata.saga.statelang.domain.StateType.SUCCEED;
130+
case COMPENSATION_TRIGGER:
131+
return org.apache.seata.saga.statelang.domain.StateType.COMPENSATION_TRIGGER;
132+
case SUB_STATE_MACHINE:
133+
return org.apache.seata.saga.statelang.domain.StateType.SUB_STATE_MACHINE;
134+
case SUB_MACHINE_COMPENSATION:
135+
return org.apache.seata.saga.statelang.domain.StateType.SUB_MACHINE_COMPENSATION;
136+
case SCRIPT_TASK:
137+
return org.apache.seata.saga.statelang.domain.StateType.SCRIPT_TASK;
138+
case LOOP_START:
139+
return org.apache.seata.saga.statelang.domain.StateType.LOOP_START;
140+
default:
141+
throw new IllegalArgumentException("Cannot convert " + this.name());
142+
}
143+
}
144+
145+
}

compatible/src/main/java/io/seata/saga/statelang/domain/impl/StateImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import io.seata.saga.statelang.domain.State;
2222
import io.seata.saga.statelang.domain.StateMachine;
23+
import io.seata.saga.statelang.domain.StateType;
2324

2425
/**
2526
* The type State.
@@ -45,8 +46,8 @@ public String getComment() {
4546
}
4647

4748
@Override
48-
public String getType() {
49-
return actual.getType();
49+
public StateType getType() {
50+
return StateType.wrap(actual.getType());
5051
}
5152

5253
@Override

compatible/src/main/java/io/seata/saga/statelang/domain/impl/StateInstanceImpl.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.seata.saga.statelang.domain.ExecutionStatus;
2222
import io.seata.saga.statelang.domain.StateInstance;
2323
import io.seata.saga.statelang.domain.StateMachineInstance;
24+
import io.seata.saga.statelang.domain.StateType;
2425

2526
/**
2627
* state execution instance
@@ -67,13 +68,17 @@ public void setName(String name) {
6768
}
6869

6970
@Override
70-
public String getType() {
71-
return actual.getType();
71+
public StateType getType() {
72+
return StateType.wrap(actual.getType());
7273
}
7374

7475
@Override
75-
public void setType(String type) {
76-
actual.setType(type);
76+
public void setType(StateType type) {
77+
if (type == null) {
78+
actual.setType(null);
79+
} else {
80+
actual.setType(type.unwrap());
81+
}
7782
}
7883

7984
@Override

saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/config/AbstractStateMachineConfig.java

+26-16
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.apache.seata.saga.proctrl.impl.ProcessControllerImpl;
5555
import org.apache.seata.saga.proctrl.process.impl.CustomizeBusinessProcessor;
5656
import org.apache.seata.saga.statelang.domain.DomainConstants;
57+
import org.apache.seata.saga.statelang.domain.StateType;
5758

5859
import javax.script.ScriptEngineManager;
5960
import java.io.InputStream;
@@ -214,20 +215,8 @@ public void init() throws Exception {
214215
}
215216

216217
public ProcessControllerImpl createProcessorController(ProcessCtrlEventPublisher eventPublisher) throws Exception {
217-
StateMachineProcessRouter stateMachineProcessRouter = new StateMachineProcessRouter();
218-
stateMachineProcessRouter.initDefaultStateRouters();
219-
loadStateRouterInterceptors(stateMachineProcessRouter.getStateRouters());
220-
221-
StateMachineProcessHandler stateMachineProcessHandler = new StateMachineProcessHandler();
222-
stateMachineProcessHandler.initDefaultHandlers();
223-
loadStateHandlerInterceptors(stateMachineProcessHandler.getStateHandlers());
224-
225-
DefaultRouterHandler defaultRouterHandler = new DefaultRouterHandler();
226-
defaultRouterHandler.setEventPublisher(eventPublisher);
227-
228-
Map<String, ProcessRouter> processRouterMap = new HashMap<>(1);
229-
processRouterMap.put(ProcessType.STATE_LANG.getCode(), stateMachineProcessRouter);
230-
defaultRouterHandler.setProcessRouters(processRouterMap);
218+
StateMachineProcessHandler stateMachineProcessHandler = buildStateMachineProcessHandler();
219+
DefaultRouterHandler defaultRouterHandler = buildDefaultRouterHandler(eventPublisher);
231220

232221
CustomizeBusinessProcessor customizeBusinessProcessor = new CustomizeBusinessProcessor();
233222

@@ -245,7 +234,28 @@ public ProcessControllerImpl createProcessorController(ProcessCtrlEventPublisher
245234
return processorController;
246235
}
247236

248-
public void loadStateHandlerInterceptors(Map<String, StateHandler> stateHandlerMap) {
237+
private StateMachineProcessHandler buildStateMachineProcessHandler() {
238+
StateMachineProcessHandler stateMachineProcessHandler = new StateMachineProcessHandler();
239+
stateMachineProcessHandler.initDefaultHandlers();
240+
loadStateHandlerInterceptors(stateMachineProcessHandler.getStateHandlers());
241+
return stateMachineProcessHandler;
242+
}
243+
244+
private DefaultRouterHandler buildDefaultRouterHandler(ProcessCtrlEventPublisher eventPublisher) {
245+
DefaultRouterHandler defaultRouterHandler = new DefaultRouterHandler();
246+
defaultRouterHandler.setEventPublisher(eventPublisher);
247+
248+
StateMachineProcessRouter stateMachineProcessRouter = new StateMachineProcessRouter();
249+
stateMachineProcessRouter.initDefaultStateRouters();
250+
loadStateRouterInterceptors(stateMachineProcessRouter.getStateRouters());
251+
252+
Map<String, ProcessRouter> processRouterMap = new HashMap<>(2);
253+
processRouterMap.put(ProcessType.STATE_LANG.getCode(), stateMachineProcessRouter);
254+
defaultRouterHandler.setProcessRouters(processRouterMap);
255+
return defaultRouterHandler;
256+
}
257+
258+
public void loadStateHandlerInterceptors(Map<StateType, StateHandler> stateHandlerMap) {
249259
for (StateHandler stateHandler : stateHandlerMap.values()) {
250260
if (stateHandler instanceof InterceptableStateHandler) {
251261
InterceptableStateHandler interceptableStateHandler = (InterceptableStateHandler) stateHandler;
@@ -259,7 +269,7 @@ public void loadStateHandlerInterceptors(Map<String, StateHandler> stateHandlerM
259269
}
260270
}
261271

262-
public void loadStateRouterInterceptors(Map<String, StateRouter> stateRouterMap) {
272+
public void loadStateRouterInterceptors(Map<StateType, StateRouter> stateRouterMap) {
263273
for (StateRouter stateRouter : stateRouterMap.values()) {
264274
if (stateRouter instanceof InterceptableStateRouter) {
265275
InterceptableStateRouter interceptableStateRouter = (InterceptableStateRouter) stateRouter;

saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.seata.saga.proctrl.ProcessContext;
3939
import org.apache.seata.saga.proctrl.ProcessType;
4040
import org.apache.seata.saga.statelang.domain.DomainConstants;
41+
import org.apache.seata.saga.statelang.domain.StateType;
4142
import org.apache.seata.saga.statelang.domain.ExecutionStatus;
4243
import org.apache.seata.saga.statelang.domain.State;
4344
import org.apache.seata.saga.statelang.domain.StateInstance;
@@ -280,7 +281,7 @@ protected StateMachineInstance forwardInternal(String stateMachineInstId, Map<St
280281

281282
context.setVariable(lastForwardState.getName() + DomainConstants.VAR_NAME_RETRIED_STATE_INST_ID,
282283
lastForwardState.getId());
283-
if (DomainConstants.STATE_TYPE_SUB_STATE_MACHINE.equals(lastForwardState.getType()) && !ExecutionStatus.SU
284+
if (StateType.SUB_STATE_MACHINE.equals(lastForwardState.getType()) && !ExecutionStatus.SU
284285
.equals(lastForwardState.getCompensationStatus())) {
285286

286287
context.setVariable(DomainConstants.VAR_NAME_IS_FOR_SUB_STATMACHINE_FORWARD, true);
@@ -418,7 +419,7 @@ public StateInstance findOutLastForwardStateInstance(List<StateInstance> stateIn
418419
continue;
419420
}
420421

421-
if (DomainConstants.STATE_TYPE_SUB_STATE_MACHINE.equals(stateInstance.getType())) {
422+
if (StateType.SUB_STATE_MACHINE.equals(stateInstance.getType())) {
422423

423424
StateInstance finalState = stateInstance;
424425

saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/StateMachineProcessHandler.java

+17-18
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.apache.seata.saga.engine.pcext.handlers.SucceedEndStateHandler;
3434
import org.apache.seata.saga.proctrl.ProcessContext;
3535
import org.apache.seata.saga.proctrl.handler.ProcessHandler;
36-
import org.apache.seata.saga.statelang.domain.DomainConstants;
36+
import org.apache.seata.saga.statelang.domain.StateType;
3737
import org.apache.seata.saga.statelang.domain.State;
3838

3939
/**
@@ -43,13 +43,13 @@
4343
*/
4444
public class StateMachineProcessHandler implements ProcessHandler {
4545

46-
private final Map<String, StateHandler> stateHandlers = new ConcurrentHashMap<>();
46+
private final Map<StateType, StateHandler> stateHandlers = new ConcurrentHashMap<>();
4747

4848
@Override
4949
public void process(ProcessContext context) throws FrameworkException {
5050
StateInstruction instruction = context.getInstruction(StateInstruction.class);
5151
State state = instruction.getState(context);
52-
String stateType = state.getType();
52+
StateType stateType = state.getType();
5353
StateHandler stateHandler = stateHandlers.get(stateType);
5454

5555
List<StateHandlerInterceptor> interceptors = null;
@@ -84,28 +84,27 @@ public void process(ProcessContext context) throws FrameworkException {
8484
}
8585

8686
public void initDefaultHandlers() {
87-
if (stateHandlers.isEmpty()) {
88-
stateHandlers.put(DomainConstants.STATE_TYPE_SERVICE_TASK, new ServiceTaskStateHandler());
89-
90-
stateHandlers.put(DomainConstants.STATE_TYPE_SCRIPT_TASK, new ScriptTaskStateHandler());
91-
92-
stateHandlers.put(DomainConstants.STATE_TYPE_SUB_MACHINE_COMPENSATION, new ServiceTaskStateHandler());
87+
if (!stateHandlers.isEmpty()) {
88+
return;
89+
}
9390

94-
stateHandlers.put(DomainConstants.STATE_TYPE_SUB_STATE_MACHINE, new SubStateMachineHandler());
91+
stateHandlers.put(StateType.SERVICE_TASK, new ServiceTaskStateHandler());
92+
stateHandlers.put(StateType.SCRIPT_TASK, new ScriptTaskStateHandler());
93+
stateHandlers.put(StateType.SUB_MACHINE_COMPENSATION, new ServiceTaskStateHandler());
94+
stateHandlers.put(StateType.SUB_STATE_MACHINE, new SubStateMachineHandler());
95+
stateHandlers.put(StateType.CHOICE, new ChoiceStateHandler());
96+
stateHandlers.put(StateType.SUCCEED, new SucceedEndStateHandler());
97+
stateHandlers.put(StateType.FAIL, new FailEndStateHandler());
98+
stateHandlers.put(StateType.COMPENSATION_TRIGGER, new CompensationTriggerStateHandler());
99+
stateHandlers.put(StateType.LOOP_START, new LoopStartStateHandler());
95100

96-
stateHandlers.put(DomainConstants.STATE_TYPE_CHOICE, new ChoiceStateHandler());
97-
stateHandlers.put(DomainConstants.STATE_TYPE_SUCCEED, new SucceedEndStateHandler());
98-
stateHandlers.put(DomainConstants.STATE_TYPE_FAIL, new FailEndStateHandler());
99-
stateHandlers.put(DomainConstants.STATE_TYPE_COMPENSATION_TRIGGER, new CompensationTriggerStateHandler());
100-
stateHandlers.put(DomainConstants.STATE_TYPE_LOOP_START, new LoopStartStateHandler());
101-
}
102101
}
103102

104-
public Map<String, StateHandler> getStateHandlers() {
103+
public Map<StateType, StateHandler> getStateHandlers() {
105104
return stateHandlers;
106105
}
107106

108-
public void setStateHandlers(Map<String, StateHandler> stateHandlers) {
107+
public void setStateHandlers(Map<StateType, StateHandler> stateHandlers) {
109108
this.stateHandlers.putAll(stateHandlers);
110109
}
111110
}

0 commit comments

Comments
 (0)