* 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 * updatepull/778/head
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 { | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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" | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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" | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 { | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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" | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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"` | |||
} |
@@ -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", | |||
}, | |||
}, | |||
} | |||
} |
@@ -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"` | |||
} |
@@ -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()) | |||
} | |||
}) | |||
} | |||
} |
@@ -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 { | |||
@@ -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 ( | |||
@@ -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 | |||
} | |||
@@ -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 { | |||
@@ -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" | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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" | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 ( | |||
@@ -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 |
@@ -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 |
@@ -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 |