flypiggyyoyoyo commented on code in PR #805:
URL: 
https://github.com/apache/incubator-seata-go/pull/805#discussion_r2126243822


##########
pkg/saga/statemachine/engine/core/default_statemachine_config.go:
##########
@@ -242,19 +277,417 @@ func (c *DefaultStateMachineConfig) 
SetRmReportSuccessEnable(rmReportSuccessEnab
        c.rmReportSuccessEnable = rmReportSuccessEnable
 }
 
-func NewDefaultStateMachineConfig() *DefaultStateMachineConfig {
+func (c *DefaultStateMachineConfig) GetStateMachineDefinition(name string) 
*statemachine.StateMachineObject {
+       return c.stateMachineDefs[name]
+}
+
+func (c *DefaultStateMachineConfig) GetExpressionFactory(expressionType 
string) expr.ExpressionFactory {
+       return c.expressionFactoryManager.GetExpressionFactory(expressionType)
+}
+
+func (c *DefaultStateMachineConfig) GetServiceInvoker(serviceType string) 
invoker.ServiceInvoker {
+       return c.serviceInvokerManager.ServiceInvoker(serviceType)
+}
+
+func (c *DefaultStateMachineConfig) RegisterStateMachineDef(resources 
[]string) error {
+       for _, resourcePath := range resources {
+               file, err := os.Open(resourcePath)
+               if err != nil {
+                       return fmt.Errorf("open resource file failed: path=%s, 
err=%w", resourcePath, err)
+               }
+               defer file.Close()
+
+               if err := 
c.stateMachineRepository.RegistryStateMachineByReader(file); err != nil {
+                       return fmt.Errorf("register state machine from file 
failed: path=%s, err=%w", resourcePath, err)
+               }
+       }
+       return nil
+}
+
+func (c *DefaultStateMachineConfig) RegisterExpressionFactory(expressionType 
string, factory expr.ExpressionFactory) {
+       c.expressionFactoryManager.PutExpressionFactory(expressionType, factory)
+}
+
+func (c *DefaultStateMachineConfig) RegisterServiceInvoker(serviceType string, 
invoker invoker.ServiceInvoker) {
+       c.serviceInvokerManager.PutServiceInvoker(serviceType, invoker)
+}
+
+type ConfigFileParams struct {
+       TransOperationTimeout           int      
`json:"trans_operation_timeout" yaml:"trans_operation_timeout"`
+       ServiceInvokeTimeout            int      `json:"service_invoke_timeout" 
yaml:"service_invoke_timeout"`
+       Charset                         string   `json:"charset" yaml:"charset"`
+       DefaultTenantId                 string   `json:"default_tenant_id" 
yaml:"default_tenant_id"`
+       SagaRetryPersistModeUpdate      bool     
`json:"saga_retry_persist_mode_update" yaml:"saga_retry_persist_mode_update"`
+       SagaCompensatePersistModeUpdate bool     
`json:"saga_compensate_persist_mode_update" 
yaml:"saga_compensate_persist_mode_update"`
+       SagaBranchRegisterEnable        bool     
`json:"saga_branch_register_enable" yaml:"saga_branch_register_enable"`
+       RmReportSuccessEnable           bool     
`json:"rm_report_success_enable" yaml:"rm_report_success_enable"`
+       StateMachineResources           []string 
`json:"state_machine_resources" yaml:"state_machine_resources"`
+}
+
+type SequenceExpressionFactory struct {
+       seqGenerator sequence.SeqGenerator
+}
+
+var _ expr.ExpressionFactory = (*SequenceExpressionFactory)(nil)
+
+func NewSequenceExpressionFactory(seqGenerator sequence.SeqGenerator) 
*SequenceExpressionFactory {
+       return &SequenceExpressionFactory{
+               seqGenerator: seqGenerator,
+       }
+}
+
+func (f *SequenceExpressionFactory) CreateExpression(expression string) 
expr.Expression {
+       parts := strings.Split(expression, "|")
+       if len(parts) != 2 {
+               return &ErrorExpression{
+                       err:           fmt.Errorf("invalid sequence expression 
format: %s, expected 'entity|rule'", expression),
+                       expressionStr: expression,
+               }
+       }
+
+       seqExpr := &expr.SequenceExpression{}
+       seqExpr.SetSeqGenerator(f.seqGenerator)
+       seqExpr.SetEntity(strings.TrimSpace(parts[0]))
+       seqExpr.SetRule(strings.TrimSpace(parts[1]))
+
+       return seqExpr
+}
+
+type ErrorExpression struct {
+       err           error
+       expressionStr string
+}
+
+func (e *ErrorExpression) Value(elContext any) any {
+       return e.err
+}
+
+func (e *ErrorExpression) SetValue(value any, elContext any) {
+       //错误表达式不设置值

Review Comment:
   Because an ErrorExpression represents a parsing failure and has no valid 
value to store, its SetValue method is intentionally left empty. 



##########
pkg/saga/statemachine/engine/core/default_statemachine_config.go:
##########
@@ -242,19 +277,417 @@ func (c *DefaultStateMachineConfig) 
SetRmReportSuccessEnable(rmReportSuccessEnab
        c.rmReportSuccessEnable = rmReportSuccessEnable
 }
 
-func NewDefaultStateMachineConfig() *DefaultStateMachineConfig {
+func (c *DefaultStateMachineConfig) GetStateMachineDefinition(name string) 
*statemachine.StateMachineObject {
+       return c.stateMachineDefs[name]
+}
+
+func (c *DefaultStateMachineConfig) GetExpressionFactory(expressionType 
string) expr.ExpressionFactory {
+       return c.expressionFactoryManager.GetExpressionFactory(expressionType)
+}
+
+func (c *DefaultStateMachineConfig) GetServiceInvoker(serviceType string) 
invoker.ServiceInvoker {
+       return c.serviceInvokerManager.ServiceInvoker(serviceType)
+}
+
+func (c *DefaultStateMachineConfig) RegisterStateMachineDef(resources 
[]string) error {
+       for _, resourcePath := range resources {
+               file, err := os.Open(resourcePath)
+               if err != nil {
+                       return fmt.Errorf("open resource file failed: path=%s, 
err=%w", resourcePath, err)
+               }
+               defer file.Close()
+
+               if err := 
c.stateMachineRepository.RegistryStateMachineByReader(file); err != nil {
+                       return fmt.Errorf("register state machine from file 
failed: path=%s, err=%w", resourcePath, err)
+               }
+       }
+       return nil
+}
+
+func (c *DefaultStateMachineConfig) RegisterExpressionFactory(expressionType 
string, factory expr.ExpressionFactory) {
+       c.expressionFactoryManager.PutExpressionFactory(expressionType, factory)
+}
+
+func (c *DefaultStateMachineConfig) RegisterServiceInvoker(serviceType string, 
invoker invoker.ServiceInvoker) {
+       c.serviceInvokerManager.PutServiceInvoker(serviceType, invoker)
+}
+
+type ConfigFileParams struct {
+       TransOperationTimeout           int      
`json:"trans_operation_timeout" yaml:"trans_operation_timeout"`
+       ServiceInvokeTimeout            int      `json:"service_invoke_timeout" 
yaml:"service_invoke_timeout"`
+       Charset                         string   `json:"charset" yaml:"charset"`
+       DefaultTenantId                 string   `json:"default_tenant_id" 
yaml:"default_tenant_id"`
+       SagaRetryPersistModeUpdate      bool     
`json:"saga_retry_persist_mode_update" yaml:"saga_retry_persist_mode_update"`
+       SagaCompensatePersistModeUpdate bool     
`json:"saga_compensate_persist_mode_update" 
yaml:"saga_compensate_persist_mode_update"`
+       SagaBranchRegisterEnable        bool     
`json:"saga_branch_register_enable" yaml:"saga_branch_register_enable"`
+       RmReportSuccessEnable           bool     
`json:"rm_report_success_enable" yaml:"rm_report_success_enable"`
+       StateMachineResources           []string 
`json:"state_machine_resources" yaml:"state_machine_resources"`
+}
+
+type SequenceExpressionFactory struct {
+       seqGenerator sequence.SeqGenerator
+}
+
+var _ expr.ExpressionFactory = (*SequenceExpressionFactory)(nil)
+
+func NewSequenceExpressionFactory(seqGenerator sequence.SeqGenerator) 
*SequenceExpressionFactory {
+       return &SequenceExpressionFactory{
+               seqGenerator: seqGenerator,
+       }
+}
+
+func (f *SequenceExpressionFactory) CreateExpression(expression string) 
expr.Expression {
+       parts := strings.Split(expression, "|")
+       if len(parts) != 2 {
+               return &ErrorExpression{
+                       err:           fmt.Errorf("invalid sequence expression 
format: %s, expected 'entity|rule'", expression),
+                       expressionStr: expression,
+               }
+       }
+
+       seqExpr := &expr.SequenceExpression{}
+       seqExpr.SetSeqGenerator(f.seqGenerator)
+       seqExpr.SetEntity(strings.TrimSpace(parts[0]))
+       seqExpr.SetRule(strings.TrimSpace(parts[1]))
+
+       return seqExpr
+}
+
+type ErrorExpression struct {
+       err           error
+       expressionStr string
+}
+
+func (e *ErrorExpression) Value(elContext any) any {
+       return e.err
+}
+
+func (e *ErrorExpression) SetValue(value any, elContext any) {
+       //错误表达式不设置值

Review Comment:
   I originally coupled ErrorExpression with DefaultStateMachineConfig, but 
I’ve now moved it to the expr package and decoupled it.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org
For additional commands, e-mail: notifications-h...@seata.apache.org

Reply via email to