You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@seata.apache.org by lu...@apache.org on 2025/02/15 11:53:49 UTC
(incubator-seata-go) branch feature/saga updated: [to-reply] feature: support saga multi type config (#741)
This is an automated email from the ASF dual-hosted git repository.
luky116 pushed a commit to branch feature/saga
in repository https://gitbox.apache.org/repos/asf/incubator-seata-go.git
The following commit(s) were added to refs/heads/feature/saga by this push:
new 67340255 [to-reply] feature: support saga multi type config (#741)
67340255 is described below
commit 67340255284640a88e4b59133140c4c8c6988158
Author: FinnTew <na...@gmail.com>
AuthorDate: Sat Feb 15 19:53:44 2025 +0800
[to-reply] feature: support saga multi type config (#741)
* added yaml format of statelang related test data
* feature: implement multi type config parser
* adjust statemachine_json_parser to suit config parser
* bugfix: fix the problem of failure to parse "ServiceName"
* adjust statemachine_parser to be compatible with yaml
* add apache License, add some comments, and make some logical adjustments
* update state_machine_new_designer.yaml
* optimize and improve the unit test of config parser
* refactor config parser
* add apache License
* update
---
pkg/saga/statemachine/constant/constant.go | 17 +
.../engine/core/bussiness_processor.go | 17 +
.../engine/core/compensation_holder.go | 17 +
.../engine/core/default_statemachine_config.go | 17 +
pkg/saga/statemachine/engine/core/engine_utils.go | 17 +
pkg/saga/statemachine/engine/core/event.go | 17 +
pkg/saga/statemachine/engine/core/event_bus.go | 17 +
.../statemachine/engine/core/event_consumer.go | 17 +
.../statemachine/engine/core/event_publisher.go | 17 +
pkg/saga/statemachine/engine/core/instruction.go | 17 +
.../engine/core/loop_context_holder.go | 17 +
.../statemachine/engine/core/loop_task_utils.go | 17 +
.../statemachine/engine/core/parameter_utils.go | 17 +
.../statemachine/engine/core/process_context.go | 17 +
.../statemachine/engine/core/process_controller.go | 17 +
.../core/process_ctrl_statemachine_engine.go | 17 +
.../statemachine/engine/core/process_router.go | 17 +
pkg/saga/statemachine/engine/core/process_state.go | 17 +
pkg/saga/statemachine/engine/core/state_router.go | 17 +
.../engine/core/statemachine_config.go | 17 +
.../engine/core/statemachine_engine.go | 17 +
.../engine/core/statemachine_engine_test.go | 17 +
.../statemachine/engine/core/statemachine_store.go | 17 +
.../statemachine/engine/core/status_decision.go | 17 +
pkg/saga/statemachine/engine/core/utils.go | 17 +
.../statemachine/engine/exception/exception.go | 17 +
pkg/saga/statemachine/engine/expr/expression.go | 17 +
.../statemachine/engine/invoker/func_invoker.go | 17 +
.../engine/invoker/func_invoker_test.go | 17 +
.../statemachine/engine/invoker/grpc_invoker.go | 17 +
.../engine/invoker/grpc_invoker_test.go | 17 +
pkg/saga/statemachine/engine/invoker/invoker.go | 17 +
pkg/saga/statemachine/engine/sequence/sequence.go | 17 +
pkg/saga/statemachine/engine/sequence/snowflake.go | 17 +
.../statemachine/engine/sequence/snowflake_test.go | 17 +
pkg/saga/statemachine/engine/sequence/uuid.go | 17 +
.../statemachine/engine/serializer/serializer.go | 17 +
.../engine/serializer/serializer_test.go | 17 +
.../handlers/service_task_state_handler.go | 17 +
.../process_ctrl/process/process_type.go | 17 +
.../statelang/parser/choice_state_json_parser.go | 17 +
.../parser/compensation_trigger_state_parser.go | 17 +
.../statelang/parser/end_state_parser.go | 17 +
.../statelang/parser/statemachine_config_parser.go | 136 ++++
.../parser/statemachine_config_parser_test.go | 881 +++++++++++++++++++++
.../statelang/parser/statemachine_json_parser.go | 35 +-
.../parser/statemachine_json_parser_test.go | 108 ++-
.../statelang/parser/statemachine_parser.go | 48 +-
.../statelang/parser/sub_state_machine_parser.go | 17 +
.../statelang/parser/task_state_json_parser.go | 19 +-
pkg/saga/statemachine/statelang/state.go | 17 +
.../statemachine/statelang/state/choice_state.go | 17 +
.../statelang/state/compensation_trigger_state.go | 17 +
pkg/saga/statemachine/statelang/state/end_state.go | 17 +
.../statelang/state/loop_start_state.go | 17 +
.../statelang/state/sub_state_machine.go | 17 +
.../statemachine/statelang/state/task_state.go | 17 +
pkg/saga/statemachine/statelang/state_instance.go | 17 +
pkg/saga/statemachine/statelang/statemachine.go | 17 +
.../statelang/statemachine_instance.go | 17 +
pkg/saga/statemachine/store/db/db.go | 17 +
pkg/saga/statemachine/store/db/db_test.go | 17 +
pkg/saga/statemachine/store/db/statelang.go | 17 +
pkg/saga/statemachine/store/db/statelang_test.go | 17 +
pkg/saga/statemachine/store/db/statelog.go | 17 +
pkg/saga/statemachine/store/db/statelog_test.go | 17 +
.../store/repository/state_machine_repository.go | 17 +
pkg/util/reflectx/unmarkshaler.go | 17 +
.../statelang/simple_statelang_with_choice.yaml | 26 +
testdata/saga/statelang/simple_statemachine.yaml | 90 +++
.../saga/statelang/state_machine_new_designer.yaml | 286 +++++++
71 files changed, 2630 insertions(+), 53 deletions(-)
diff --git a/pkg/saga/statemachine/constant/constant.go b/pkg/saga/statemachine/constant/constant.go
index a089e7d5..72af09e9 100644
--- a/pkg/saga/statemachine/constant/constant.go
+++ b/pkg/saga/statemachine/constant/constant.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 constant
const (
diff --git a/pkg/saga/statemachine/engine/core/bussiness_processor.go b/pkg/saga/statemachine/engine/core/bussiness_processor.go
index 6b0a2bb4..38846dff 100644
--- a/pkg/saga/statemachine/engine/core/bussiness_processor.go
+++ b/pkg/saga/statemachine/engine/core/bussiness_processor.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/compensation_holder.go b/pkg/saga/statemachine/engine/core/compensation_holder.go
index 562cb020..c22fb1fe 100644
--- a/pkg/saga/statemachine/engine/core/compensation_holder.go
+++ b/pkg/saga/statemachine/engine/core/compensation_holder.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/default_statemachine_config.go b/pkg/saga/statemachine/engine/core/default_statemachine_config.go
index c7692696..fa2ef157 100644
--- a/pkg/saga/statemachine/engine/core/default_statemachine_config.go
+++ b/pkg/saga/statemachine/engine/core/default_statemachine_config.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/engine_utils.go b/pkg/saga/statemachine/engine/core/engine_utils.go
index e1dcd4de..63eb7990 100644
--- a/pkg/saga/statemachine/engine/core/engine_utils.go
+++ b/pkg/saga/statemachine/engine/core/engine_utils.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/event.go b/pkg/saga/statemachine/engine/core/event.go
index 4f7c18b2..871c0ce9 100644
--- a/pkg/saga/statemachine/engine/core/event.go
+++ b/pkg/saga/statemachine/engine/core/event.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
type Event interface {
diff --git a/pkg/saga/statemachine/engine/core/event_bus.go b/pkg/saga/statemachine/engine/core/event_bus.go
index 47d617d4..e793419f 100644
--- a/pkg/saga/statemachine/engine/core/event_bus.go
+++ b/pkg/saga/statemachine/engine/core/event_bus.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/event_consumer.go b/pkg/saga/statemachine/engine/core/event_consumer.go
index 1df21bdb..25f8762e 100644
--- a/pkg/saga/statemachine/engine/core/event_consumer.go
+++ b/pkg/saga/statemachine/engine/core/event_consumer.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/event_publisher.go b/pkg/saga/statemachine/engine/core/event_publisher.go
index 9ad86940..447dee30 100644
--- a/pkg/saga/statemachine/engine/core/event_publisher.go
+++ b/pkg/saga/statemachine/engine/core/event_publisher.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import "context"
diff --git a/pkg/saga/statemachine/engine/core/instruction.go b/pkg/saga/statemachine/engine/core/instruction.go
index ed81fc9c..4b8f9d3c 100644
--- a/pkg/saga/statemachine/engine/core/instruction.go
+++ b/pkg/saga/statemachine/engine/core/instruction.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/loop_context_holder.go b/pkg/saga/statemachine/engine/core/loop_context_holder.go
index b1f69fe8..242e455b 100644
--- a/pkg/saga/statemachine/engine/core/loop_context_holder.go
+++ b/pkg/saga/statemachine/engine/core/loop_context_holder.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/loop_task_utils.go b/pkg/saga/statemachine/engine/core/loop_task_utils.go
index d56ac7f0..18a3bec4 100644
--- a/pkg/saga/statemachine/engine/core/loop_task_utils.go
+++ b/pkg/saga/statemachine/engine/core/loop_task_utils.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/parameter_utils.go b/pkg/saga/statemachine/engine/core/parameter_utils.go
index 680167cf..56336b7d 100644
--- a/pkg/saga/statemachine/engine/core/parameter_utils.go
+++ b/pkg/saga/statemachine/engine/core/parameter_utils.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/process_context.go b/pkg/saga/statemachine/engine/core/process_context.go
index 9da5c3e8..163ea640 100644
--- a/pkg/saga/statemachine/engine/core/process_context.go
+++ b/pkg/saga/statemachine/engine/core/process_context.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/process_controller.go b/pkg/saga/statemachine/engine/core/process_controller.go
index 2f45aebd..4c987db5 100644
--- a/pkg/saga/statemachine/engine/core/process_controller.go
+++ b/pkg/saga/statemachine/engine/core/process_controller.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go b/pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go
index 426ec65d..1b59123d 100644
--- a/pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go
+++ b/pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/process_router.go b/pkg/saga/statemachine/engine/core/process_router.go
index 5d7e5998..1875cb16 100644
--- a/pkg/saga/statemachine/engine/core/process_router.go
+++ b/pkg/saga/statemachine/engine/core/process_router.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/process_state.go b/pkg/saga/statemachine/engine/core/process_state.go
index 3dc06920..66dee8ff 100644
--- a/pkg/saga/statemachine/engine/core/process_state.go
+++ b/pkg/saga/statemachine/engine/core/process_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/state_router.go b/pkg/saga/statemachine/engine/core/state_router.go
index 185984e4..73dd02e2 100644
--- a/pkg/saga/statemachine/engine/core/state_router.go
+++ b/pkg/saga/statemachine/engine/core/state_router.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/statemachine_config.go b/pkg/saga/statemachine/engine/core/statemachine_config.go
index 9c77b73a..e3f9da29 100644
--- a/pkg/saga/statemachine/engine/core/statemachine_config.go
+++ b/pkg/saga/statemachine/engine/core/statemachine_config.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/statemachine_engine.go b/pkg/saga/statemachine/engine/core/statemachine_engine.go
index c18d91c1..75cdb1a6 100644
--- a/pkg/saga/statemachine/engine/core/statemachine_engine.go
+++ b/pkg/saga/statemachine/engine/core/statemachine_engine.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/statemachine_engine_test.go b/pkg/saga/statemachine/engine/core/statemachine_engine_test.go
index e87eb9ca..8af2cdfc 100644
--- a/pkg/saga/statemachine/engine/core/statemachine_engine_test.go
+++ b/pkg/saga/statemachine/engine/core/statemachine_engine_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/statemachine_store.go b/pkg/saga/statemachine/engine/core/statemachine_store.go
index 7a763335..f47065dd 100644
--- a/pkg/saga/statemachine/engine/core/statemachine_store.go
+++ b/pkg/saga/statemachine/engine/core/statemachine_store.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/status_decision.go b/pkg/saga/statemachine/engine/core/status_decision.go
index e95a6316..6fd596ff 100644
--- a/pkg/saga/statemachine/engine/core/status_decision.go
+++ b/pkg/saga/statemachine/engine/core/status_decision.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/core/utils.go b/pkg/saga/statemachine/engine/core/utils.go
index 8300c0eb..49f03e00 100644
--- a/pkg/saga/statemachine/engine/core/utils.go
+++ b/pkg/saga/statemachine/engine/core/utils.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 core
import (
diff --git a/pkg/saga/statemachine/engine/exception/exception.go b/pkg/saga/statemachine/engine/exception/exception.go
index f5c58239..ea7c0780 100644
--- a/pkg/saga/statemachine/engine/exception/exception.go
+++ b/pkg/saga/statemachine/engine/exception/exception.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 exception
import "github.com/seata/seata-go/pkg/util/errors"
diff --git a/pkg/saga/statemachine/engine/expr/expression.go b/pkg/saga/statemachine/engine/expr/expression.go
index 767c49da..00441d1f 100644
--- a/pkg/saga/statemachine/engine/expr/expression.go
+++ b/pkg/saga/statemachine/engine/expr/expression.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 expr
import (
diff --git a/pkg/saga/statemachine/engine/invoker/func_invoker.go b/pkg/saga/statemachine/engine/invoker/func_invoker.go
index 085decb8..3131c52e 100644
--- a/pkg/saga/statemachine/engine/invoker/func_invoker.go
+++ b/pkg/saga/statemachine/engine/invoker/func_invoker.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 invoker
import (
diff --git a/pkg/saga/statemachine/engine/invoker/func_invoker_test.go b/pkg/saga/statemachine/engine/invoker/func_invoker_test.go
index e800fdc1..9a97427b 100644
--- a/pkg/saga/statemachine/engine/invoker/func_invoker_test.go
+++ b/pkg/saga/statemachine/engine/invoker/func_invoker_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 invoker
import (
diff --git a/pkg/saga/statemachine/engine/invoker/grpc_invoker.go b/pkg/saga/statemachine/engine/invoker/grpc_invoker.go
index e83e798b..afdc7ef3 100644
--- a/pkg/saga/statemachine/engine/invoker/grpc_invoker.go
+++ b/pkg/saga/statemachine/engine/invoker/grpc_invoker.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 invoker
import (
diff --git a/pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go b/pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go
index 09d6745f..4beb0d18 100644
--- a/pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go
+++ b/pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 invoker
import (
diff --git a/pkg/saga/statemachine/engine/invoker/invoker.go b/pkg/saga/statemachine/engine/invoker/invoker.go
index e1dd5dce..e0cb85f4 100644
--- a/pkg/saga/statemachine/engine/invoker/invoker.go
+++ b/pkg/saga/statemachine/engine/invoker/invoker.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 invoker
import (
diff --git a/pkg/saga/statemachine/engine/sequence/sequence.go b/pkg/saga/statemachine/engine/sequence/sequence.go
index 1a7fdae7..57cb19c0 100644
--- a/pkg/saga/statemachine/engine/sequence/sequence.go
+++ b/pkg/saga/statemachine/engine/sequence/sequence.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 sequence
type SeqGenerator interface {
diff --git a/pkg/saga/statemachine/engine/sequence/snowflake.go b/pkg/saga/statemachine/engine/sequence/snowflake.go
index f5622b06..6f64edb4 100644
--- a/pkg/saga/statemachine/engine/sequence/snowflake.go
+++ b/pkg/saga/statemachine/engine/sequence/snowflake.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 sequence
import (
diff --git a/pkg/saga/statemachine/engine/sequence/snowflake_test.go b/pkg/saga/statemachine/engine/sequence/snowflake_test.go
index 451f478d..9c6a96a2 100644
--- a/pkg/saga/statemachine/engine/sequence/snowflake_test.go
+++ b/pkg/saga/statemachine/engine/sequence/snowflake_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 sequence
import (
diff --git a/pkg/saga/statemachine/engine/sequence/uuid.go b/pkg/saga/statemachine/engine/sequence/uuid.go
index f3060dcf..6dfb0c81 100644
--- a/pkg/saga/statemachine/engine/sequence/uuid.go
+++ b/pkg/saga/statemachine/engine/sequence/uuid.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 sequence
import "github.com/google/uuid"
diff --git a/pkg/saga/statemachine/engine/serializer/serializer.go b/pkg/saga/statemachine/engine/serializer/serializer.go
index 4d668ef5..3a3ddf0a 100644
--- a/pkg/saga/statemachine/engine/serializer/serializer.go
+++ b/pkg/saga/statemachine/engine/serializer/serializer.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 serializer
import (
diff --git a/pkg/saga/statemachine/engine/serializer/serializer_test.go b/pkg/saga/statemachine/engine/serializer/serializer_test.go
index 9dba88a0..eb163368 100644
--- a/pkg/saga/statemachine/engine/serializer/serializer_test.go
+++ b/pkg/saga/statemachine/engine/serializer/serializer_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 serializer
import (
diff --git a/pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go b/pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go
index 28d60d0a..f2a7aff2 100644
--- a/pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go
+++ b/pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 handlers
import (
diff --git a/pkg/saga/statemachine/process_ctrl/process/process_type.go b/pkg/saga/statemachine/process_ctrl/process/process_type.go
index b1a8e030..c67c806c 100644
--- a/pkg/saga/statemachine/process_ctrl/process/process_type.go
+++ b/pkg/saga/statemachine/process_ctrl/process/process_type.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 process
type ProcessType string
diff --git a/pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go b/pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go
index 9b4d51cd..09108548 100644
--- a/pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
diff --git a/pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go b/pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go
index d41a6d29..3131da90 100644
--- a/pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
diff --git a/pkg/saga/statemachine/statelang/parser/end_state_parser.go b/pkg/saga/statemachine/statelang/parser/end_state_parser.go
index 823ee8df..8baa03ad 100644
--- a/pkg/saga/statemachine/statelang/parser/end_state_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/end_state_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
diff --git a/pkg/saga/statemachine/statelang/parser/statemachine_config_parser.go b/pkg/saga/statemachine/statelang/parser/statemachine_config_parser.go
new file mode 100644
index 00000000..63276e2e
--- /dev/null
+++ b/pkg/saga/statemachine/statelang/parser/statemachine_config_parser.go
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "gopkg.in/yaml.v3"
+ "io"
+ "os"
+)
+
+// ConfigParser is a general configuration parser interface, used to agree on the implementation of different types of parsers
+type ConfigParser interface {
+ Parse(configContent []byte) (*StateMachineObject, error)
+}
+
+type JSONConfigParser struct{}
+
+func NewJSONConfigParser() *JSONConfigParser {
+ return &JSONConfigParser{}
+}
+
+func (p *JSONConfigParser) Parse(configContent []byte) (*StateMachineObject, error) {
+ if configContent == nil || len(configContent) == 0 {
+ return nil, fmt.Errorf("empty JSON config content")
+ }
+
+ var stateMachineObject StateMachineObject
+ if err := json.Unmarshal(configContent, &stateMachineObject); err != nil {
+ return nil, fmt.Errorf("failed to parse JSON config content: %w", err)
+ }
+
+ return &stateMachineObject, nil
+}
+
+type YAMLConfigParser struct{}
+
+func NewYAMLConfigParser() *YAMLConfigParser {
+ return &YAMLConfigParser{}
+}
+
+func (p *YAMLConfigParser) Parse(configContent []byte) (*StateMachineObject, error) {
+ if configContent == nil || len(configContent) == 0 {
+ return nil, fmt.Errorf("empty YAML config content")
+ }
+
+ var stateMachineObject StateMachineObject
+ if err := yaml.Unmarshal(configContent, &stateMachineObject); err != nil {
+ return nil, fmt.Errorf("failed to parse YAML config content: %w", err)
+ }
+
+ return &stateMachineObject, nil
+}
+
+type StateMachineConfigParser struct{}
+
+func NewStateMachineConfigParser() *StateMachineConfigParser {
+ return &StateMachineConfigParser{}
+}
+
+func (p *StateMachineConfigParser) CheckConfigFile(filePath string) error {
+ _, err := os.Stat(filePath)
+ if os.IsNotExist(err) {
+ return fmt.Errorf("config file %s does not exist: %w", filePath, err)
+ }
+ if err != nil {
+ return fmt.Errorf("failed to access config file %s: %w", filePath, err)
+ }
+ return nil
+}
+
+func (p *StateMachineConfigParser) ReadConfigFile(configFilePath string) ([]byte, error) {
+ file, _ := os.Open(configFilePath)
+ defer func(file *os.File) {
+ _ = file.Close()
+ }(file)
+
+ var buf bytes.Buffer
+ _, err := io.Copy(&buf, file)
+ if err != nil {
+ return nil, fmt.Errorf("failed to read config file %s: %w", configFilePath, err)
+ }
+
+ return buf.Bytes(), nil
+}
+
+func (p *StateMachineConfigParser) getParser(content []byte) (ConfigParser, error) {
+ var obj interface{}
+ if err := json.Unmarshal(content, &obj); err == nil {
+ return NewJSONConfigParser(), nil
+ }
+ if err := yaml.Unmarshal(content, &obj); err == nil {
+ return NewYAMLConfigParser(), nil
+ }
+
+ return nil, fmt.Errorf("unsupported config file format")
+}
+
+func (p *StateMachineConfigParser) Parse(content []byte) (*StateMachineObject, error) {
+ parser, err := p.getParser(content)
+ if err != nil {
+ return nil, err
+ }
+
+ return parser.Parse(content)
+}
+
+type StateMachineObject struct {
+ Name string `json:"Name" yaml:"Name"`
+ Comment string `json:"Comment" yaml:"Comment"`
+ Version string `json:"Version" yaml:"Version"`
+ StartState string `json:"StartState" yaml:"StartState"`
+ RecoverStrategy string `json:"RecoverStrategy" yaml:"RecoverStrategy"`
+ Persist bool `json:"IsPersist" yaml:"IsPersist"`
+ RetryPersistModeUpdate bool `json:"IsRetryPersistModeUpdate" yaml:"IsRetryPersistModeUpdate"`
+ CompensatePersistModeUpdate bool `json:"IsCompensatePersistModeUpdate" yaml:"IsCompensatePersistModeUpdate"`
+ Type string `json:"Type" yaml:"Type"`
+ States map[string]interface{} `json:"States" yaml:"States"`
+}
diff --git a/pkg/saga/statemachine/statelang/parser/statemachine_config_parser_test.go b/pkg/saga/statemachine/statelang/parser/statemachine_config_parser_test.go
new file mode 100644
index 00000000..d901296b
--- /dev/null
+++ b/pkg/saga/statemachine/statelang/parser/statemachine_config_parser_test.go
@@ -0,0 +1,881 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
+
+import (
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestStateMachineConfigParser_Parse(t *testing.T) {
+ parser := NewStateMachineConfigParser()
+
+ tests := []struct {
+ name string
+ configFilePath string
+ expectedStateMachineObject *StateMachineObject
+ }{
+ {
+ name: "JSON Simple 1",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statelang_with_choice.json",
+ expectedStateMachineObject: GetStateMachineObject1("json"),
+ },
+ {
+ name: "JSON Simple 2",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statemachine.json",
+ expectedStateMachineObject: GetStateMachineObject2("json"),
+ },
+ {
+ name: "JSON Simple 3",
+ configFilePath: "../../../../../testdata/saga/statelang/state_machine_new_designer.json",
+ expectedStateMachineObject: GetStateMachineObject3("json"),
+ },
+ {
+ name: "YAML Simple 1",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statelang_with_choice.yaml",
+ expectedStateMachineObject: GetStateMachineObject1("yaml"),
+ },
+ {
+ name: "YAML Simple 2",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statemachine.yaml",
+ expectedStateMachineObject: GetStateMachineObject2("yaml"),
+ },
+ {
+ name: "YAML Simple 3",
+ configFilePath: "../../../../../testdata/saga/statelang/state_machine_new_designer.yaml",
+ expectedStateMachineObject: GetStateMachineObject3("yaml"),
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ content, err := parser.ReadConfigFile(tt.configFilePath)
+ if err != nil {
+ t.Error("parse fail: " + err.Error())
+ }
+ object, err := parser.Parse(content)
+ if err != nil {
+ t.Error("parse fail: " + err.Error())
+ }
+ assert.Equal(t, tt.expectedStateMachineObject, object)
+ })
+ }
+}
+
+func GetStateMachineObject1(format string) *StateMachineObject {
+ switch format {
+ case "json":
+ case "yaml":
+ }
+
+ return &StateMachineObject{
+ Name: "simpleChoiceTestStateMachine",
+ Comment: "带条件分支的测试状态机定义",
+ StartState: "FirstState",
+ Version: "0.0.1",
+ States: map[string]interface{}{
+ "FirstState": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "demoService",
+ "ServiceMethod": "foo",
+ "Next": "ChoiceState",
+ },
+ "ChoiceState": map[string]interface{}{
+ "Type": "Choice",
+ "Choices": []interface{}{
+ map[string]interface{}{
+ "Expression": "[a] == 1",
+ "Next": "SecondState",
+ },
+ map[string]interface{}{
+ "Expression": "[a] == 2",
+ "Next": "ThirdState",
+ },
+ },
+ "Default": "SecondState",
+ },
+ "SecondState": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "demoService",
+ "ServiceMethod": "bar",
+ },
+ "ThirdState": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "demoService",
+ "ServiceMethod": "foo",
+ },
+ },
+ }
+}
+
+func GetStateMachineObject2(format string) *StateMachineObject {
+ var retryMap map[string]interface{}
+
+ switch format {
+ case "json":
+ retryMap = map[string]interface{}{
+ "Exceptions": []interface{}{
+ "java.lang.Exception",
+ },
+ "IntervalSeconds": float64(2),
+ "MaxAttempts": float64(3),
+ "BackoffRate": 1.5,
+ }
+ case "yaml":
+ retryMap = map[string]interface{}{
+ "Exceptions": []interface{}{
+ "java.lang.Exception",
+ },
+ "IntervalSeconds": 2,
+ "MaxAttempts": 3,
+ "BackoffRate": 1.5,
+ }
+ }
+
+ return &StateMachineObject{
+ Name: "simpleTestStateMachine",
+ Comment: "测试状态机定义",
+ StartState: "FirstState",
+ Version: "0.0.1",
+ States: map[string]interface{}{
+ "FirstState": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "is.seata.saga.DemoService",
+ "ServiceMethod": "foo",
+ "IsPersist": false,
+ "Next": "ScriptState",
+ },
+ "ScriptState": map[string]interface{}{
+ "Type": "ScriptTask",
+ "ScriptType": "groovy",
+ "ScriptContent": "return 'hello ' + inputA",
+ "Input": []interface{}{
+ map[string]interface{}{
+ "inputA": "$.data1",
+ },
+ },
+ "Output": map[string]interface{}{
+ "scriptStateResult": "$.#root",
+ },
+ "Next": "ChoiceState",
+ },
+ "ChoiceState": map[string]interface{}{
+ "Type": "Choice",
+ "Choices": []interface{}{
+ map[string]interface{}{
+ "Expression": "foo == 1",
+ "Next": "FirstMatchState",
+ },
+ map[string]interface{}{
+ "Expression": "foo == 2",
+ "Next": "SecondMatchState",
+ },
+ },
+ "Default": "FailState",
+ },
+ "FirstMatchState": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "is.seata.saga.DemoService",
+ "ServiceMethod": "bar",
+ "CompensateState": "CompensateFirst",
+ "Status": map[string]interface{}{
+ "return.code == 'S'": "SU",
+ "return.code == 'F'": "FA",
+ "$exception{java.lang.Throwable}": "UN",
+ },
+ "Input": []interface{}{
+ map[string]interface{}{
+ "inputA1": "$.data1",
+ "inputA2": map[string]interface{}{
+ "a": "$.data2.a",
+ },
+ },
+ map[string]interface{}{
+ "inputB": "$.header",
+ },
+ },
+ "Output": map[string]interface{}{
+ "firstMatchStateResult": "$.#root",
+ },
+ "Retry": []interface{}{
+ retryMap,
+ },
+ "Catch": []interface{}{
+ map[string]interface{}{
+ "Exceptions": []interface{}{
+ "java.lang.Exception",
+ },
+ "Next": "CompensationTrigger",
+ },
+ },
+ "Next": "SuccessState",
+ },
+ "CompensateFirst": map[string]interface{}{
+ "Type": "ServiceTask",
+ "ServiceName": "is.seata.saga.DemoService",
+ "ServiceMethod": "compensateBar",
+ "IsForCompensation": true,
+ "IsForUpdate": true,
+ "Input": []interface{}{
+ map[string]interface{}{
+ "input": "$.data",
+ },
+ },
+ "Output": map[string]interface{}{
+ "firstMatchStateResult": "$.#root",
+ },
+ "Status": map[string]interface{}{
+ "return.code == 'S'": "SU",
+ "return.code == 'F'": "FA",
+ "$exception{java.lang.Throwable}": "UN",
+ },
+ },
+ "CompensationTrigger": map[string]interface{}{
+ "Type": "CompensationTrigger",
+ "Next": "CompensateEndState",
+ },
+ "CompensateEndState": map[string]interface{}{
+ "Type": "Fail",
+ "ErrorCode": "StateCompensated",
+ "Message": "State Compensated!",
+ },
+ "SecondMatchState": map[string]interface{}{
+ "Type": "SubStateMachine",
+ "StateMachineName": "simpleTestSubStateMachine",
+ "Input": []interface{}{
+ map[string]interface{}{
+ "input": "$.data",
+ },
+ map[string]interface{}{
+ "header": "$.header",
+ },
+ },
+ "Output": map[string]interface{}{
+ "firstMatchStateResult": "$.#root",
+ },
+ "Next": "SuccessState",
+ },
+ "FailState": map[string]interface{}{
+ "Type": "Fail",
+ "ErrorCode": "DefaultStateError",
+ "Message": "No Matches!",
+ },
+ "SuccessState": map[string]interface{}{
+ "Type": "Succeed",
+ },
+ },
+ }
+}
+
+func GetStateMachineObject3(format string) *StateMachineObject {
+ var (
+ boundsMap1 map[string]interface{}
+ boundsMap2 map[string]interface{}
+ boundsMap3 map[string]interface{}
+ boundsMap4 map[string]interface{}
+ boundsMap5 map[string]interface{}
+ boundsMap6 map[string]interface{}
+ boundsMap7 map[string]interface{}
+ boundsMap8 map[string]interface{}
+ boundsMap9 map[string]interface{}
+
+ waypoints1 []interface{}
+ waypoints2 []interface{}
+ waypoints3 []interface{}
+ waypoints4 []interface{}
+ waypoints5 []interface{}
+ waypoints6 []interface{}
+ waypoints7 []interface{}
+ )
+
+ switch format {
+ case "json":
+ boundsMap1 = map[string]interface{}{
+ "x": float64(300),
+ "y": float64(178),
+ "width": float64(100),
+ "height": float64(80),
+ }
+ boundsMap2 = map[string]interface{}{
+ "x": float64(455),
+ "y": float64(193),
+ "width": float64(50),
+ "height": float64(50),
+ }
+ boundsMap3 = map[string]interface{}{
+ "x": float64(300),
+ "y": float64(310),
+ "width": float64(100),
+ "height": float64(80),
+ }
+ boundsMap4 = map[string]interface{}{
+ "x": float64(550),
+ "y": float64(178),
+ "width": float64(100),
+ "height": float64(80),
+ }
+ boundsMap5 = map[string]interface{}{
+ "x": float64(550),
+ "y": float64(310),
+ "width": float64(100),
+ "height": float64(80),
+ }
+ boundsMap6 = map[string]interface{}{
+ "x": float64(632),
+ "y": float64(372),
+ "width": float64(36),
+ "height": float64(36),
+ }
+ boundsMap7 = map[string]interface{}{
+ "x": float64(722),
+ "y": float64(200),
+ "width": float64(36),
+ "height": float64(36),
+ }
+ boundsMap8 = map[string]interface{}{
+ "x": float64(722),
+ "y": float64(372),
+ "width": float64(36),
+ "height": float64(36),
+ }
+ boundsMap9 = map[string]interface{}{
+ "x": float64(812),
+ "y": float64(372),
+ "width": float64(36),
+ "height": float64(36),
+ }
+
+ waypoints1 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(400),
+ "y": float64(218),
+ },
+ "x": float64(400),
+ "y": float64(218),
+ },
+ map[string]interface{}{"x": float64(435), "y": float64(218)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(455),
+ "y": float64(218),
+ },
+ "x": float64(455),
+ "y": float64(218),
+ },
+ }
+ waypoints2 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(505),
+ "y": float64(218),
+ },
+ "x": float64(505),
+ "y": float64(218),
+ },
+ map[string]interface{}{"x": float64(530), "y": float64(218)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(550),
+ "y": float64(218),
+ },
+ "x": float64(550),
+ "y": float64(218),
+ },
+ }
+ waypoints3 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(480),
+ "y": float64(243),
+ },
+ "x": float64(480),
+ "y": float64(243),
+ },
+ map[string]interface{}{"x": float64(600), "y": float64(290)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(600),
+ "y": float64(310),
+ },
+ "x": float64(600),
+ "y": float64(310),
+ },
+ }
+ waypoints4 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(650),
+ "y": float64(218),
+ },
+ "x": float64(650),
+ "y": float64(218),
+ },
+ map[string]interface{}{"x": float64(702), "y": float64(218)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(722),
+ "y": float64(218),
+ },
+ "x": float64(722),
+ "y": float64(218),
+ },
+ }
+ waypoints5 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(668),
+ "y": float64(390),
+ },
+ "x": float64(668),
+ "y": float64(390),
+ },
+ map[string]interface{}{"x": float64(702), "y": float64(390)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(722),
+ "y": float64(390),
+ },
+ "x": float64(722),
+ "y": float64(390),
+ },
+ }
+ waypoints6 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(600),
+ "y": float64(310),
+ },
+ "x": float64(600),
+ "y": float64(310),
+ },
+ map[string]interface{}{"x": float64(740), "y": float64(256)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(740),
+ "y": float64(236),
+ },
+ "x": float64(740),
+ "y": float64(236),
+ },
+ }
+ waypoints7 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(758),
+ "y": float64(390),
+ },
+ "x": float64(758),
+ "y": float64(390),
+ },
+ map[string]interface{}{"x": float64(792), "y": float64(390)},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": float64(812),
+ "y": float64(390),
+ },
+ "x": float64(812),
+ "y": float64(390),
+ },
+ }
+
+ case "yaml":
+ boundsMap1 = map[string]interface{}{
+ "x": 300,
+ "y": 178,
+ "width": 100,
+ "height": 80,
+ }
+ boundsMap2 = map[string]interface{}{
+ "x": 455,
+ "y": 193,
+ "width": 50,
+ "height": 50,
+ }
+ boundsMap3 = map[string]interface{}{
+ "x": 300,
+ "y": 310,
+ "width": 100,
+ "height": 80,
+ }
+ boundsMap4 = map[string]interface{}{
+ "x": 550,
+ "y": 178,
+ "width": 100,
+ "height": 80,
+ }
+ boundsMap5 = map[string]interface{}{
+ "x": 550,
+ "y": 310,
+ "width": 100,
+ "height": 80,
+ }
+ boundsMap6 = map[string]interface{}{
+ "x": 632,
+ "y": 372,
+ "width": 36,
+ "height": 36,
+ }
+ boundsMap7 = map[string]interface{}{
+ "x": 722,
+ "y": 200,
+ "width": 36,
+ "height": 36,
+ }
+ boundsMap8 = map[string]interface{}{
+ "x": 722,
+ "y": 372,
+ "width": 36,
+ "height": 36,
+ }
+ boundsMap9 = map[string]interface{}{
+ "x": 812,
+ "y": 372,
+ "width": 36,
+ "height": 36,
+ }
+
+ waypoints1 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 400,
+ "y": 218,
+ },
+ "x": 400,
+ "y": 218,
+ },
+ map[string]interface{}{"x": 435, "y": 218},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 455,
+ "y": 218,
+ },
+ "x": 455,
+ "y": 218,
+ },
+ }
+ waypoints2 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 505,
+ "y": 218,
+ },
+ "x": 505,
+ "y": 218,
+ },
+ map[string]interface{}{"x": 530, "y": 218},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 550,
+ "y": 218,
+ },
+ "x": 550,
+ "y": 218,
+ },
+ }
+ waypoints3 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 480,
+ "y": 243,
+ },
+ "x": 480,
+ "y": 243,
+ },
+ map[string]interface{}{"x": 600, "y": 290},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 600,
+ "y": 310,
+ },
+ "x": 600,
+ "y": 310,
+ },
+ }
+ waypoints4 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 650,
+ "y": 218,
+ },
+ "x": 650,
+ "y": 218,
+ },
+ map[string]interface{}{"x": 702, "y": 218},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 722,
+ "y": 218,
+ },
+ "x": 722,
+ "y": 218,
+ },
+ }
+ waypoints5 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 668,
+ "y": 390,
+ },
+ "x": 668,
+ "y": 390,
+ },
+ map[string]interface{}{"x": 702, "y": 390},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 722,
+ "y": 390,
+ },
+ "x": 722,
+ "y": 390,
+ },
+ }
+ waypoints6 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 600,
+ "y": 310,
+ },
+ "x": 600,
+ "y": 310,
+ },
+ map[string]interface{}{"x": 740, "y": 256},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 740,
+ "y": 236,
+ },
+ "x": 740,
+ "y": 236,
+ },
+ }
+ waypoints7 = []interface{}{
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 758,
+ "y": 390,
+ },
+ "x": 758,
+ "y": 390,
+ },
+ map[string]interface{}{"x": 792, "y": 390},
+ map[string]interface{}{
+ "original": map[string]interface{}{
+ "x": 812,
+ "y": 390,
+ },
+ "x": 812,
+ "y": 390,
+ },
+ }
+ }
+
+ return &StateMachineObject{
+ Name: "StateMachineNewDesigner",
+ Comment: "This state machine is modeled by designer tools.",
+ Version: "0.0.1",
+ StartState: "ServiceTask-a9h2o51",
+ RecoverStrategy: "",
+ Persist: false,
+ RetryPersistModeUpdate: false,
+ CompensatePersistModeUpdate: false,
+ Type: "",
+ States: map[string]interface{}{
+ "ServiceTask-a9h2o51": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap1,
+ },
+ "Name": "ServiceTask-a9h2o51",
+ "IsForCompensation": false,
+ "Input": []interface{}{map[string]interface{}{}},
+ "Output": map[string]interface{}{},
+ "Status": map[string]interface{}{},
+ "Retry": []interface{}{},
+ "ServiceName": "",
+ "ServiceMethod": "",
+ "Type": "ServiceTask",
+ "Next": "Choice-4ajl8nt",
+ "edge": map[string]interface{}{
+ "Choice-4ajl8nt": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints1,
+ "source": "ServiceTask-a9h2o51",
+ "target": "Choice-4ajl8nt",
+ },
+ "Type": "Transition",
+ },
+ },
+ "CompensateState": "CompensateFirstState",
+ },
+ "Choice-4ajl8nt": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap2,
+ },
+ "Name": "Choice-4ajl8nt",
+ "Type": "Choice",
+ "Choices": []interface{}{
+ map[string]interface{}{
+ "Expression": "",
+ "Next": "SubStateMachine-cauj9uy",
+ },
+ map[string]interface{}{
+ "Expression": "",
+ "Next": "ServiceTask-vdij28l",
+ },
+ },
+ "Default": "SubStateMachine-cauj9uy",
+ "edge": map[string]interface{}{
+ "SubStateMachine-cauj9uy": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints2,
+ "source": "Choice-4ajl8nt",
+ "target": "SubStateMachine-cauj9uy",
+ },
+ "Type": "ChoiceEntry",
+ },
+ "ServiceTask-vdij28l": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints3,
+ "source": "Choice-4ajl8nt",
+ "target": "ServiceTask-vdij28l",
+ },
+ "Type": "ChoiceEntry",
+ },
+ },
+ },
+ "CompensateFirstState": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap3,
+ },
+ "Name": "CompensateFirstState",
+ "IsForCompensation": true,
+ "Input": []interface{}{map[string]interface{}{}},
+ "Output": map[string]interface{}{},
+ "Status": map[string]interface{}{},
+ "Retry": []interface{}{},
+ "ServiceName": "",
+ "ServiceMethod": "",
+ "Type": "ServiceTask",
+ },
+ "SubStateMachine-cauj9uy": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap4,
+ },
+ "Name": "SubStateMachine-cauj9uy",
+ "IsForCompensation": false,
+ "Input": []interface{}{map[string]interface{}{}},
+ "Output": map[string]interface{}{},
+ "Status": map[string]interface{}{},
+ "Retry": []interface{}{},
+ "StateMachineName": "",
+ "Type": "SubStateMachine",
+ "Next": "Succeed-5x3z98u",
+ "edge": map[string]interface{}{
+ "Succeed-5x3z98u": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints4,
+ "source": "SubStateMachine-cauj9uy",
+ "target": "Succeed-5x3z98u",
+ },
+ "Type": "Transition",
+ },
+ },
+ },
+ "ServiceTask-vdij28l": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap5,
+ },
+ "Name": "ServiceTask-vdij28l",
+ "IsForCompensation": false,
+ "Input": []interface{}{map[string]interface{}{}},
+ "Output": map[string]interface{}{},
+ "Status": map[string]interface{}{},
+ "Retry": []interface{}{},
+ "ServiceName": "",
+ "ServiceMethod": "",
+ "Catch": []interface{}{
+ map[string]interface{}{
+ "Exceptions": []interface{}{},
+ "Next": "CompensationTrigger-uldp2ou",
+ },
+ },
+ "Type": "ServiceTask",
+ "catch": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap6,
+ },
+ "edge": map[string]interface{}{
+ "CompensationTrigger-uldp2ou": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints5,
+ "source": "ServiceTask-vdij28l",
+ "target": "CompensationTrigger-uldp2ou",
+ },
+ "Type": "ExceptionMatch",
+ },
+ },
+ },
+ "Next": "Succeed-5x3z98u",
+ "edge": map[string]interface{}{
+ "Succeed-5x3z98u": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints6,
+ "source": "ServiceTask-vdij28l",
+ "target": "Succeed-5x3z98u",
+ },
+ "Type": "Transition",
+ },
+ },
+ },
+ "Succeed-5x3z98u": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap7,
+ },
+ "Name": "Succeed-5x3z98u",
+ "Type": "Succeed",
+ },
+ "CompensationTrigger-uldp2ou": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap8,
+ },
+ "Name": "CompensationTrigger-uldp2ou",
+ "Type": "CompensationTrigger",
+ "Next": "Fail-9roxcv5",
+ "edge": map[string]interface{}{
+ "Fail-9roxcv5": map[string]interface{}{
+ "style": map[string]interface{}{
+ "waypoints": waypoints7,
+ "source": "CompensationTrigger-uldp2ou",
+ "target": "Fail-9roxcv5",
+ },
+ "Type": "Transition",
+ },
+ },
+ },
+ "Fail-9roxcv5": map[string]interface{}{
+ "style": map[string]interface{}{
+ "bounds": boundsMap9,
+ },
+ "Name": "Fail-9roxcv5",
+ "ErrorCode": "",
+ "Message": "",
+ "Type": "Fail",
+ },
+ },
+ }
+}
diff --git a/pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go b/pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go
index 4bcfdcbc..c3003ddf 100644
--- a/pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go
@@ -1,7 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
- "encoding/json"
"github.com/pkg/errors"
"github.com/seata/seata-go/pkg/saga/statemachine/constant"
"github.com/seata/seata-go/pkg/saga/statemachine/statelang"
@@ -23,9 +39,7 @@ func (stateMachineParser JSONStateMachineParser) GetType() string {
}
func (stateMachineParser JSONStateMachineParser) Parse(content string) (statelang.StateMachine, error) {
- var stateMachineJsonObject StateMachineJsonObject
-
- err := json.Unmarshal([]byte(content), &stateMachineJsonObject)
+ stateMachineJsonObject, err := NewStateMachineConfigParser().Parse([]byte(content))
if err != nil {
return nil, err
}
@@ -115,16 +129,3 @@ func (stateMachineParser JSONStateMachineParser) isTaskState(stateType string) b
}
return false
}
-
-type StateMachineJsonObject struct {
- Name string `json:"Name"`
- Comment string `json:"Comment"`
- Version string `json:"Version"`
- StartState string `json:"StartState"`
- RecoverStrategy string `json:"RecoverStrategy"`
- Persist bool `json:"IsPersist"`
- RetryPersistModeUpdate bool `json:"IsRetryPersistModeUpdate"`
- CompensatePersistModeUpdate bool `json:"IsCompensatePersistModeUpdate"`
- Type string `json:"Type"`
- States map[string]interface{} `json:"States"`
-}
diff --git a/pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go b/pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go
index 0028309a..2cc82808 100644
--- a/pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go
+++ b/pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go
@@ -1,45 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
- "os"
"testing"
)
func TestParseChoice(t *testing.T) {
- filePath := "../../../../../testdata/saga/statelang/simple_statelang_with_choice.json"
- fileContent, err := os.ReadFile(filePath)
- if err != nil {
- t.Error("parse fail: " + err.Error())
- return
+ parser := NewJSONStateMachineParser()
+
+ tests := []struct {
+ name string
+ configFilePath string
+ }{
+ {
+ name: "JSON Simple: StateLang With Choice",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statelang_with_choice.json",
+ },
+ {
+ name: "YAML Simple: StateLang With Choice",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statelang_with_choice.yaml",
+ },
}
- _, err = NewJSONStateMachineParser().Parse(string(fileContent))
- if err != nil {
- t.Error("parse fail: " + err.Error())
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ _, err := parser.Parse(tt.configFilePath)
+ if err != nil {
+ t.Error("parse fail: " + err.Error())
+ }
+ })
}
}
func TestParseServiceTaskForSimpleStateMachine(t *testing.T) {
- filePath := "../../../../../testdata/saga/statelang/simple_statemachine.json"
- fileContent, err := os.ReadFile(filePath)
- if err != nil {
- t.Error("parse fail: " + err.Error())
- return
+ parser := NewJSONStateMachineParser()
+
+ tests := []struct {
+ name string
+ configFilePath string
+ }{
+ {
+ name: "JSON Simple: StateMachine",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statemachine.json",
+ },
+ {
+ name: "YAML Simple: StateMachine",
+ configFilePath: "../../../../../testdata/saga/statelang/simple_statemachine.yaml",
+ },
}
- _, err = NewJSONStateMachineParser().Parse(string(fileContent))
- if err != nil {
- t.Error("parse fail: " + err.Error())
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ _, err := parser.Parse(tt.configFilePath)
+ if err != nil {
+ t.Error("parse fail: " + err.Error())
+ }
+ })
}
}
func TestParseServiceTaskForNewDesigner(t *testing.T) {
- filePath := "../../../../../testdata/saga/statelang/state_machine_new_designer.json"
- fileContent, err := os.ReadFile(filePath)
- if err != nil {
- t.Error("parse fail: " + err.Error())
- return
+ parser := NewJSONStateMachineParser()
+
+ tests := []struct {
+ name string
+ configFilePath string
+ }{
+ {
+ name: "JSON Simple: StateMachine New Designer",
+ configFilePath: "../../../../../testdata/saga/statelang/state_machine_new_designer.json",
+ },
+ {
+ name: "YAML Simple: StateMachine New Designer",
+ configFilePath: "../../../../../testdata/saga/statelang/state_machine_new_designer.yaml",
+ },
}
- _, err = NewJSONStateMachineParser().Parse(string(fileContent))
- if err != nil {
- t.Error("parse fail: " + err.Error())
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ _, err := parser.Parse(tt.configFilePath)
+ if err != nil {
+ t.Error("parse fail: " + err.Error())
+ }
+ })
}
}
diff --git a/pkg/saga/statemachine/statelang/parser/statemachine_parser.go b/pkg/saga/statemachine/statelang/parser/statemachine_parser.go
index 690ad278..883d28e2 100644
--- a/pkg/saga/statemachine/statelang/parser/statemachine_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/statemachine_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
@@ -148,18 +165,23 @@ func (b BaseStateParser) GetIntOrDefault(stateName string, stateMap map[string]i
return defaultValue, nil
}
- // just use float64 to convert, json reader will read all number as float64
- valueAsFloat64, ok := value.(float64)
- if !ok {
+ // use float64 conversion when the configuration file is json, and use int conversion when the configuration file is yaml
+ valueAsFloat64, okToFloat64 := value.(float64)
+ valueAsInt, okToInt := value.(int)
+ if !okToFloat64 && !okToInt {
return defaultValue, errors.New("State [" + stateName + "] " + key + " illegal, required int")
}
- floatStr := strconv.FormatFloat(valueAsFloat64, 'f', -1, 64)
- if strings.Contains(floatStr, ".") {
- return defaultValue, errors.New("State [" + stateName + "] " + key + " illegal, required int")
+ if okToFloat64 {
+ floatStr := strconv.FormatFloat(valueAsFloat64, 'f', -1, 64)
+ if strings.Contains(floatStr, ".") {
+ return defaultValue, errors.New("State [" + stateName + "] " + key + " illegal, required int")
+ }
+
+ return int(valueAsFloat64), nil
}
- return int(valueAsFloat64), nil
+ return valueAsInt, nil
}
func (b BaseStateParser) GetFloat64OrDefault(stateName string, stateMap map[string]interface{}, key string, defaultValue float64) (float64, error) {
@@ -169,11 +191,17 @@ func (b BaseStateParser) GetFloat64OrDefault(stateName string, stateMap map[stri
return defaultValue, nil
}
- valueAsFloat64, ok := value.(float64)
- if !ok {
+ // use float64 conversion when the configuration file is json, and use int conversion when the configuration file is yaml
+ valueAsFloat64, okToFloat64 := value.(float64)
+ valueAsInt, okToInt := value.(int)
+ if !okToFloat64 && !okToInt {
return defaultValue, errors.New("State [" + stateName + "] " + key + " illegal, required float64")
}
- return valueAsFloat64, nil
+
+ if okToFloat64 {
+ return valueAsFloat64, nil
+ }
+ return float64(valueAsInt), nil
}
type StateParserFactory interface {
diff --git a/pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go b/pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go
index 4de6e5de..5938e5e4 100644
--- a/pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
diff --git a/pkg/saga/statemachine/statelang/parser/task_state_json_parser.go b/pkg/saga/statemachine/statelang/parser/task_state_json_parser.go
index 8dcfff5c..3c9bff09 100644
--- a/pkg/saga/statemachine/statelang/parser/task_state_json_parser.go
+++ b/pkg/saga/statemachine/statelang/parser/task_state_json_parser.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 parser
import (
@@ -242,7 +259,7 @@ func (s ServiceTaskStateParser) Parse(stateName string, stateMap map[string]inte
return nil, err
}
- serviceName, err := s.GetString(stateName, stateMap, "serviceName")
+ serviceName, err := s.GetString(stateName, stateMap, "ServiceName")
if err != nil {
return nil, err
}
diff --git a/pkg/saga/statemachine/statelang/state.go b/pkg/saga/statemachine/statelang/state.go
index 29ac6727..f53449cf 100644
--- a/pkg/saga/statemachine/statelang/state.go
+++ b/pkg/saga/statemachine/statelang/state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 statelang
type State interface {
diff --git a/pkg/saga/statemachine/statelang/state/choice_state.go b/pkg/saga/statemachine/statelang/state/choice_state.go
index c3f48276..2226404b 100644
--- a/pkg/saga/statemachine/statelang/state/choice_state.go
+++ b/pkg/saga/statemachine/statelang/state/choice_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import "github.com/seata/seata-go/pkg/saga/statemachine/statelang"
diff --git a/pkg/saga/statemachine/statelang/state/compensation_trigger_state.go b/pkg/saga/statemachine/statelang/state/compensation_trigger_state.go
index cac71420..922b380f 100644
--- a/pkg/saga/statemachine/statelang/state/compensation_trigger_state.go
+++ b/pkg/saga/statemachine/statelang/state/compensation_trigger_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import (
diff --git a/pkg/saga/statemachine/statelang/state/end_state.go b/pkg/saga/statemachine/statelang/state/end_state.go
index 099e2e07..3e1c2033 100644
--- a/pkg/saga/statemachine/statelang/state/end_state.go
+++ b/pkg/saga/statemachine/statelang/state/end_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import (
diff --git a/pkg/saga/statemachine/statelang/state/loop_start_state.go b/pkg/saga/statemachine/statelang/state/loop_start_state.go
index e059431d..91d604a6 100644
--- a/pkg/saga/statemachine/statelang/state/loop_start_state.go
+++ b/pkg/saga/statemachine/statelang/state/loop_start_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import (
diff --git a/pkg/saga/statemachine/statelang/state/sub_state_machine.go b/pkg/saga/statemachine/statelang/state/sub_state_machine.go
index 78683a0a..e18fc0ee 100644
--- a/pkg/saga/statemachine/statelang/state/sub_state_machine.go
+++ b/pkg/saga/statemachine/statelang/state/sub_state_machine.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import (
diff --git a/pkg/saga/statemachine/statelang/state/task_state.go b/pkg/saga/statemachine/statelang/state/task_state.go
index bc9880ac..a258a28d 100644
--- a/pkg/saga/statemachine/statelang/state/task_state.go
+++ b/pkg/saga/statemachine/statelang/state/task_state.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 state
import (
diff --git a/pkg/saga/statemachine/statelang/state_instance.go b/pkg/saga/statemachine/statelang/state_instance.go
index e77da058..5248d033 100644
--- a/pkg/saga/statemachine/statelang/state_instance.go
+++ b/pkg/saga/statemachine/statelang/state_instance.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 statelang
import "time"
diff --git a/pkg/saga/statemachine/statelang/statemachine.go b/pkg/saga/statemachine/statelang/statemachine.go
index 8b13f8d0..0e7dfff8 100644
--- a/pkg/saga/statemachine/statelang/statemachine.go
+++ b/pkg/saga/statemachine/statelang/statemachine.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 statelang
import (
diff --git a/pkg/saga/statemachine/statelang/statemachine_instance.go b/pkg/saga/statemachine/statelang/statemachine_instance.go
index 9da71ee2..b794e101 100644
--- a/pkg/saga/statemachine/statelang/statemachine_instance.go
+++ b/pkg/saga/statemachine/statelang/statemachine_instance.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 statelang
import (
diff --git a/pkg/saga/statemachine/store/db/db.go b/pkg/saga/statemachine/store/db/db.go
index 39d62e97..aba2c668 100644
--- a/pkg/saga/statemachine/store/db/db.go
+++ b/pkg/saga/statemachine/store/db/db.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/db/db_test.go b/pkg/saga/statemachine/store/db/db_test.go
index a5e3edc1..e80f704b 100644
--- a/pkg/saga/statemachine/store/db/db_test.go
+++ b/pkg/saga/statemachine/store/db/db_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/db/statelang.go b/pkg/saga/statemachine/store/db/statelang.go
index e49bf96a..f0c25e33 100644
--- a/pkg/saga/statemachine/store/db/statelang.go
+++ b/pkg/saga/statemachine/store/db/statelang.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/db/statelang_test.go b/pkg/saga/statemachine/store/db/statelang_test.go
index 87f868d8..4b870c11 100644
--- a/pkg/saga/statemachine/store/db/statelang_test.go
+++ b/pkg/saga/statemachine/store/db/statelang_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/db/statelog.go b/pkg/saga/statemachine/store/db/statelog.go
index 23c3b551..ba60c61f 100644
--- a/pkg/saga/statemachine/store/db/statelog.go
+++ b/pkg/saga/statemachine/store/db/statelog.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/db/statelog_test.go b/pkg/saga/statemachine/store/db/statelog_test.go
index 43767476..fb15b8cb 100644
--- a/pkg/saga/statemachine/store/db/statelog_test.go
+++ b/pkg/saga/statemachine/store/db/statelog_test.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 db
import (
diff --git a/pkg/saga/statemachine/store/repository/state_machine_repository.go b/pkg/saga/statemachine/store/repository/state_machine_repository.go
index 8a62cc49..ea37171b 100644
--- a/pkg/saga/statemachine/store/repository/state_machine_repository.go
+++ b/pkg/saga/statemachine/store/repository/state_machine_repository.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 repository
import (
diff --git a/pkg/util/reflectx/unmarkshaler.go b/pkg/util/reflectx/unmarkshaler.go
index 73acb276..a507a3a8 100644
--- a/pkg/util/reflectx/unmarkshaler.go
+++ b/pkg/util/reflectx/unmarkshaler.go
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License 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 reflectx
import (
diff --git a/testdata/saga/statelang/simple_statelang_with_choice.yaml b/testdata/saga/statelang/simple_statelang_with_choice.yaml
new file mode 100644
index 00000000..32fa403f
--- /dev/null
+++ b/testdata/saga/statelang/simple_statelang_with_choice.yaml
@@ -0,0 +1,26 @@
+Name: simpleChoiceTestStateMachine
+Comment: 带条件分支的测试状态机定义
+StartState: FirstState
+Version: 0.0.1
+States:
+ FirstState:
+ Type: ServiceTask
+ ServiceName: demoService
+ ServiceMethod: foo
+ Next: ChoiceState
+ ChoiceState:
+ Type: Choice
+ Choices:
+ - Expression: "[a] == 1"
+ Next: SecondState
+ - Expression: "[a] == 2"
+ Next: ThirdState
+ Default: SecondState
+ SecondState:
+ Type: ServiceTask
+ ServiceName: demoService
+ ServiceMethod: bar
+ ThirdState:
+ Type: ServiceTask
+ ServiceName: demoService
+ ServiceMethod: foo
\ No newline at end of file
diff --git a/testdata/saga/statelang/simple_statemachine.yaml b/testdata/saga/statelang/simple_statemachine.yaml
new file mode 100644
index 00000000..a5da6c03
--- /dev/null
+++ b/testdata/saga/statelang/simple_statemachine.yaml
@@ -0,0 +1,90 @@
+Name: simpleTestStateMachine
+Comment: 测试状态机定义
+StartState: FirstState
+Version: 0.0.1
+States:
+ FirstState:
+ Type: ServiceTask
+ ServiceName: is.seata.saga.DemoService
+ ServiceMethod: foo
+ IsPersist: false
+ Next: ScriptState
+ ScriptState:
+ Type: ScriptTask
+ ScriptType: groovy
+ ScriptContent: return 'hello ' + inputA
+ Input:
+ - inputA: $.data1
+ Output:
+ scriptStateResult: '$.#root'
+ Next: ChoiceState
+ ChoiceState:
+ Type: Choice
+ Choices:
+ - Expression: foo == 1
+ Next: FirstMatchState
+ - Expression: foo == 2
+ Next: SecondMatchState
+ Default: FailState
+ FirstMatchState:
+ Type: ServiceTask
+ ServiceName: is.seata.saga.DemoService
+ ServiceMethod: bar
+ CompensateState: CompensateFirst
+ Status:
+ return.code == 'S': SU
+ return.code == 'F': FA
+ '$exception{java.lang.Throwable}': UN
+ Input:
+ - inputA1: $.data1
+ inputA2:
+ a: $.data2.a
+ - inputB: $.header
+ Output:
+ firstMatchStateResult: '$.#root'
+ Retry:
+ - Exceptions: [java.lang.Exception]
+ IntervalSeconds: 2
+ MaxAttempts: 3
+ BackoffRate: 1.5
+ Catch:
+ - Exceptions:
+ - java.lang.Exception
+ Next: CompensationTrigger
+ Next: SuccessState
+ CompensateFirst:
+ Type: ServiceTask
+ ServiceName: is.seata.saga.DemoService
+ ServiceMethod: compensateBar
+ IsForCompensation: true
+ IsForUpdate: true
+ Input:
+ - input: $.data
+ Output:
+ firstMatchStateResult: '$.#root'
+ Status:
+ return.code == 'S': SU
+ return.code == 'F': FA
+ '$exception{java.lang.Throwable}': UN
+ CompensationTrigger:
+ Type: CompensationTrigger
+ Next: CompensateEndState
+ CompensateEndState:
+ Type: Fail
+ ErrorCode: StateCompensated
+ Message: State Compensated!
+ SecondMatchState:
+ Type: SubStateMachine
+ StateMachineName: simpleTestSubStateMachine
+ Input:
+ - input: $.data
+ - header: $.header
+ Output:
+ firstMatchStateResult: '$.#root'
+ Next: SuccessState
+ FailState:
+ Type: Fail
+ ErrorCode: DefaultStateError
+ Message: No Matches!
+ SuccessState:
+ Type: Succeed
diff --git a/testdata/saga/statelang/state_machine_new_designer.yaml b/testdata/saga/statelang/state_machine_new_designer.yaml
new file mode 100644
index 00000000..d646ab01
--- /dev/null
+++ b/testdata/saga/statelang/state_machine_new_designer.yaml
@@ -0,0 +1,286 @@
+Name: StateMachineNewDesigner
+Comment: This state machine is modeled by designer tools.
+Version: 0.0.1
+style:
+ bounds:
+ x: 200
+ y: 200
+ width: 36
+ height: 36
+States:
+ ServiceTask-a9h2o51:
+ style:
+ bounds:
+ x: 300
+ y: 178
+ width: 100
+ height: 80
+ Name: ServiceTask-a9h2o51
+ IsForCompensation: false
+ Input:
+ - {}
+ Output: {}
+ Status: {}
+ Retry: []
+ ServiceName: ""
+ ServiceMethod: ""
+ Type: ServiceTask
+ Next: Choice-4ajl8nt
+ edge:
+ Choice-4ajl8nt:
+ style:
+ waypoints:
+ - original:
+ x: 400
+ y: 218
+ x: 400
+ y: 218
+ - x: 435
+ y: 218
+ - original:
+ x: 455
+ y: 218
+ x: 455
+ y: 218
+ source: ServiceTask-a9h2o51
+ target: Choice-4ajl8nt
+ Type: Transition
+ CompensateState: CompensateFirstState
+ Choice-4ajl8nt:
+ style:
+ bounds:
+ x: 455
+ y: 193
+ width: 50
+ height: 50
+ Name: Choice-4ajl8nt
+ Type: Choice
+ Choices:
+ - Expression: ""
+ Next: SubStateMachine-cauj9uy
+ - Expression: ""
+ Next: ServiceTask-vdij28l
+ Default: SubStateMachine-cauj9uy
+ edge:
+ SubStateMachine-cauj9uy:
+ style:
+ waypoints:
+ - original:
+ x: 505
+ y: 218
+ x: 505
+ y: 218
+ - x: 530
+ y: 218
+ - original:
+ x: 550
+ y: 218
+ x: 550
+ y: 218
+ source: Choice-4ajl8nt
+ target: SubStateMachine-cauj9uy
+ Type: ChoiceEntry
+ ServiceTask-vdij28l:
+ style:
+ waypoints:
+ - original:
+ x: 480
+ y: 243
+ x: 480
+ y: 243
+ - x: 600
+ y: 290
+ - original:
+ x: 600
+ y: 310
+ x: 600
+ y: 310
+ source: Choice-4ajl8nt
+ target: ServiceTask-vdij28l
+ Type: ChoiceEntry
+ CompensateFirstState:
+ style:
+ bounds:
+ x: 300
+ y: 310
+ width: 100
+ height: 80
+ Name: CompensateFirstState
+ IsForCompensation: true
+ Input:
+ - {}
+ Output: {}
+ Status: {}
+ Retry: []
+ ServiceName: ""
+ ServiceMethod: ""
+ Type: ServiceTask
+ SubStateMachine-cauj9uy:
+ style:
+ bounds:
+ x: 550
+ y: 178
+ width: 100
+ height: 80
+ Name: SubStateMachine-cauj9uy
+ IsForCompensation: false
+ Input:
+ - {}
+ Output: {}
+ Status: {}
+ Retry: []
+ StateMachineName: ""
+ Type: SubStateMachine
+ Next: Succeed-5x3z98u
+ edge:
+ Succeed-5x3z98u:
+ style:
+ waypoints:
+ - original:
+ x: 650
+ y: 218
+ x: 650
+ y: 218
+ - x: 702
+ y: 218
+ - original:
+ x: 722
+ y: 218
+ x: 722
+ y: 218
+ source: SubStateMachine-cauj9uy
+ target: Succeed-5x3z98u
+ Type: Transition
+ ServiceTask-vdij28l:
+ style:
+ bounds:
+ x: 550
+ y: 310
+ width: 100
+ height: 80
+ Name: ServiceTask-vdij28l
+ IsForCompensation: false
+ Input:
+ - {}
+ Output: {}
+ Status: {}
+ Retry: []
+ ServiceName: ""
+ ServiceMethod: ""
+ Catch:
+ - Exceptions: []
+ Next: CompensationTrigger-uldp2ou
+ Type: ServiceTask
+ catch:
+ style:
+ bounds:
+ x: 632
+ y: 372
+ width: 36
+ height: 36
+ edge:
+ CompensationTrigger-uldp2ou:
+ style:
+ waypoints:
+ - original:
+ x: 668
+ y: 390
+ x: 668
+ y: 390
+ - x: 702
+ y: 390
+ - original:
+ x: 722
+ y: 390
+ x: 722
+ y: 390
+ source: ServiceTask-vdij28l
+ target: CompensationTrigger-uldp2ou
+ Type: ExceptionMatch
+ Next: Succeed-5x3z98u
+ edge:
+ Succeed-5x3z98u:
+ style:
+ waypoints:
+ - original:
+ x: 600
+ y: 310
+ x: 600
+ y: 310
+ - x: 740
+ y: 256
+ - original:
+ x: 740
+ y: 236
+ x: 740
+ y: 236
+ source: ServiceTask-vdij28l
+ target: Succeed-5x3z98u
+ Type: Transition
+ Succeed-5x3z98u:
+ style:
+ bounds:
+ x: 722
+ y: 200
+ width: 36
+ height: 36
+ Name: Succeed-5x3z98u
+ Type: Succeed
+ CompensationTrigger-uldp2ou:
+ style:
+ bounds:
+ x: 722
+ y: 372
+ width: 36
+ height: 36
+ Name: CompensationTrigger-uldp2ou
+ Type: CompensationTrigger
+ Next: Fail-9roxcv5
+ edge:
+ Fail-9roxcv5:
+ style:
+ waypoints:
+ - original:
+ x: 758
+ y: 390
+ x: 758
+ y: 390
+ - x: 792
+ y: 390
+ - original:
+ x: 812
+ y: 390
+ x: 812
+ y: 390
+ source: CompensationTrigger-uldp2ou
+ target: Fail-9roxcv5
+ Type: Transition
+ Fail-9roxcv5:
+ style:
+ bounds:
+ x: 812
+ y: 372
+ width: 36
+ height: 36
+ Name: Fail-9roxcv5
+ ErrorCode: ""
+ Message: ""
+ Type: Fail
+StartState: ServiceTask-a9h2o51
+edge:
+ style:
+ waypoints:
+ - original:
+ x: 236
+ y: 218
+ x: 236
+ y: 218
+ - x: 280
+ y: 218
+ - original:
+ x: 300
+ y: 218
+ x: 300
+ y: 218
+ target: ServiceTask-a9h2o51
+ Type: Transition
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@seata.apache.org
For additional commands, e-mail: notifications-help@seata.apache.org