Browse Source

[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
pull/778/head
FinnTew GitHub 7 months ago
parent
commit
6734025528
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
71 changed files with 2630 additions and 53 deletions
  1. +17
    -0
      pkg/saga/statemachine/constant/constant.go
  2. +17
    -0
      pkg/saga/statemachine/engine/core/bussiness_processor.go
  3. +17
    -0
      pkg/saga/statemachine/engine/core/compensation_holder.go
  4. +17
    -0
      pkg/saga/statemachine/engine/core/default_statemachine_config.go
  5. +17
    -0
      pkg/saga/statemachine/engine/core/engine_utils.go
  6. +17
    -0
      pkg/saga/statemachine/engine/core/event.go
  7. +17
    -0
      pkg/saga/statemachine/engine/core/event_bus.go
  8. +17
    -0
      pkg/saga/statemachine/engine/core/event_consumer.go
  9. +17
    -0
      pkg/saga/statemachine/engine/core/event_publisher.go
  10. +17
    -0
      pkg/saga/statemachine/engine/core/instruction.go
  11. +17
    -0
      pkg/saga/statemachine/engine/core/loop_context_holder.go
  12. +17
    -0
      pkg/saga/statemachine/engine/core/loop_task_utils.go
  13. +17
    -0
      pkg/saga/statemachine/engine/core/parameter_utils.go
  14. +17
    -0
      pkg/saga/statemachine/engine/core/process_context.go
  15. +17
    -0
      pkg/saga/statemachine/engine/core/process_controller.go
  16. +17
    -0
      pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go
  17. +17
    -0
      pkg/saga/statemachine/engine/core/process_router.go
  18. +17
    -0
      pkg/saga/statemachine/engine/core/process_state.go
  19. +17
    -0
      pkg/saga/statemachine/engine/core/state_router.go
  20. +17
    -0
      pkg/saga/statemachine/engine/core/statemachine_config.go
  21. +17
    -0
      pkg/saga/statemachine/engine/core/statemachine_engine.go
  22. +17
    -0
      pkg/saga/statemachine/engine/core/statemachine_engine_test.go
  23. +17
    -0
      pkg/saga/statemachine/engine/core/statemachine_store.go
  24. +17
    -0
      pkg/saga/statemachine/engine/core/status_decision.go
  25. +17
    -0
      pkg/saga/statemachine/engine/core/utils.go
  26. +17
    -0
      pkg/saga/statemachine/engine/exception/exception.go
  27. +17
    -0
      pkg/saga/statemachine/engine/expr/expression.go
  28. +17
    -0
      pkg/saga/statemachine/engine/invoker/func_invoker.go
  29. +17
    -0
      pkg/saga/statemachine/engine/invoker/func_invoker_test.go
  30. +17
    -0
      pkg/saga/statemachine/engine/invoker/grpc_invoker.go
  31. +17
    -0
      pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go
  32. +17
    -0
      pkg/saga/statemachine/engine/invoker/invoker.go
  33. +17
    -0
      pkg/saga/statemachine/engine/sequence/sequence.go
  34. +17
    -0
      pkg/saga/statemachine/engine/sequence/snowflake.go
  35. +17
    -0
      pkg/saga/statemachine/engine/sequence/snowflake_test.go
  36. +17
    -0
      pkg/saga/statemachine/engine/sequence/uuid.go
  37. +17
    -0
      pkg/saga/statemachine/engine/serializer/serializer.go
  38. +17
    -0
      pkg/saga/statemachine/engine/serializer/serializer_test.go
  39. +17
    -0
      pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go
  40. +17
    -0
      pkg/saga/statemachine/process_ctrl/process/process_type.go
  41. +17
    -0
      pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go
  42. +17
    -0
      pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go
  43. +17
    -0
      pkg/saga/statemachine/statelang/parser/end_state_parser.go
  44. +136
    -0
      pkg/saga/statemachine/statelang/parser/statemachine_config_parser.go
  45. +881
    -0
      pkg/saga/statemachine/statelang/parser/statemachine_config_parser_test.go
  46. +18
    -17
      pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go
  47. +83
    -25
      pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go
  48. +38
    -10
      pkg/saga/statemachine/statelang/parser/statemachine_parser.go
  49. +17
    -0
      pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go
  50. +18
    -1
      pkg/saga/statemachine/statelang/parser/task_state_json_parser.go
  51. +17
    -0
      pkg/saga/statemachine/statelang/state.go
  52. +17
    -0
      pkg/saga/statemachine/statelang/state/choice_state.go
  53. +17
    -0
      pkg/saga/statemachine/statelang/state/compensation_trigger_state.go
  54. +17
    -0
      pkg/saga/statemachine/statelang/state/end_state.go
  55. +17
    -0
      pkg/saga/statemachine/statelang/state/loop_start_state.go
  56. +17
    -0
      pkg/saga/statemachine/statelang/state/sub_state_machine.go
  57. +17
    -0
      pkg/saga/statemachine/statelang/state/task_state.go
  58. +17
    -0
      pkg/saga/statemachine/statelang/state_instance.go
  59. +17
    -0
      pkg/saga/statemachine/statelang/statemachine.go
  60. +17
    -0
      pkg/saga/statemachine/statelang/statemachine_instance.go
  61. +17
    -0
      pkg/saga/statemachine/store/db/db.go
  62. +17
    -0
      pkg/saga/statemachine/store/db/db_test.go
  63. +17
    -0
      pkg/saga/statemachine/store/db/statelang.go
  64. +17
    -0
      pkg/saga/statemachine/store/db/statelang_test.go
  65. +17
    -0
      pkg/saga/statemachine/store/db/statelog.go
  66. +17
    -0
      pkg/saga/statemachine/store/db/statelog_test.go
  67. +17
    -0
      pkg/saga/statemachine/store/repository/state_machine_repository.go
  68. +17
    -0
      pkg/util/reflectx/unmarkshaler.go
  69. +26
    -0
      testdata/saga/statelang/simple_statelang_with_choice.yaml
  70. +90
    -0
      testdata/saga/statelang/simple_statemachine.yaml
  71. +286
    -0
      testdata/saga/statelang/state_machine_new_designer.yaml

+ 17
- 0
pkg/saga/statemachine/constant/constant.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/bussiness_processor.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/compensation_holder.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/default_statemachine_config.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/engine_utils.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/event.go View File

@@ -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 {


+ 17
- 0
pkg/saga/statemachine/engine/core/event_bus.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/event_consumer.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/event_publisher.go View File

@@ -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"


+ 17
- 0
pkg/saga/statemachine/engine/core/instruction.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/loop_context_holder.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/loop_task_utils.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/parameter_utils.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/process_context.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/process_controller.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/process_ctrl_statemachine_engine.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/process_router.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/process_state.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/state_router.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/statemachine_config.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/statemachine_engine.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/statemachine_engine_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/statemachine_store.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/status_decision.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/core/utils.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/exception/exception.go View File

@@ -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"


+ 17
- 0
pkg/saga/statemachine/engine/expr/expression.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/invoker/func_invoker.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/invoker/func_invoker_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/invoker/grpc_invoker.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/invoker/grpc_invoker_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/invoker/invoker.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/sequence/sequence.go View File

@@ -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 {


+ 17
- 0
pkg/saga/statemachine/engine/sequence/snowflake.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/sequence/snowflake_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/sequence/uuid.go View File

@@ -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"


+ 17
- 0
pkg/saga/statemachine/engine/serializer/serializer.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/engine/serializer/serializer_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/process_ctrl/handlers/service_task_state_handler.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/process_ctrl/process/process_type.go View File

@@ -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


+ 17
- 0
pkg/saga/statemachine/statelang/parser/choice_state_json_parser.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/parser/compensation_trigger_state_parser.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/parser/end_state_parser.go View File

@@ -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 (


+ 136
- 0
pkg/saga/statemachine/statelang/parser/statemachine_config_parser.go View File

@@ -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"`
}

+ 881
- 0
pkg/saga/statemachine/statelang/parser/statemachine_config_parser_test.go View File

@@ -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",
},
},
}
}

+ 18
- 17
pkg/saga/statemachine/statelang/parser/statemachine_json_parser.go View File

@@ -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"`
}

+ 83
- 25
pkg/saga/statemachine/statelang/parser/statemachine_json_parser_test.go View File

@@ -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())
}
})
}
}

+ 38
- 10
pkg/saga/statemachine/statelang/parser/statemachine_parser.go View File

@@ -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 {


+ 17
- 0
pkg/saga/statemachine/statelang/parser/sub_state_machine_parser.go View File

@@ -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 (


+ 18
- 1
pkg/saga/statemachine/statelang/parser/task_state_json_parser.go View File

@@ -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
}


+ 17
- 0
pkg/saga/statemachine/statelang/state.go View File

@@ -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 {


+ 17
- 0
pkg/saga/statemachine/statelang/state/choice_state.go View File

@@ -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"


+ 17
- 0
pkg/saga/statemachine/statelang/state/compensation_trigger_state.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/state/end_state.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/state/loop_start_state.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/state/sub_state_machine.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/state/task_state.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/state_instance.go View File

@@ -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"


+ 17
- 0
pkg/saga/statemachine/statelang/statemachine.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/statelang/statemachine_instance.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/db.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/db_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/statelang.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/statelang_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/statelog.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/db/statelog_test.go View File

@@ -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 (


+ 17
- 0
pkg/saga/statemachine/store/repository/state_machine_repository.go View File

@@ -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 (


+ 17
- 0
pkg/util/reflectx/unmarkshaler.go View File

@@ -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 (


+ 26
- 0
testdata/saga/statelang/simple_statelang_with_choice.yaml View File

@@ -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

+ 90
- 0
testdata/saga/statelang/simple_statemachine.yaml View File

@@ -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

+ 286
- 0
testdata/saga/statelang/state_machine_new_designer.yaml View File

@@ -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

Loading…
Cancel
Save