From 0c9e8de310c3277d050cbbfcdfd4d2157783c917 Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Wed, 17 Jun 2026 21:22:03 +0200 Subject: [PATCH] inhertiance --- ...ded.config.ExtendedStateMachineConfig.html | 994 ------------- ...ded.config.ExtendedStateMachineConfig.json | 374 ----- ...mil.maven.core.MavenOrderStateMachine.html | 770 ---------- ...mil.maven.core.MavenOrderStateMachine.json | 150 -- ...mil.maven.core.MavenOrderStateMachine.puml | 31 - ...il.multi.core.OrderStateMachineConfig.html | 735 ---------- ...il.multi.core.OrderStateMachineConfig.json | 115 -- ...il.multi.core.OrderStateMachineConfig.puml | 32 - .../analysis/service/CallGraphBuilder.java | 150 +- .../service/GenericEventDetector.java | 60 +- .../analysis/service/MessagingDetector.java | 8 +- .../analysis/service/SpringMvcDetector.java | 14 +- .../ast/common/CodebaseContext.java | 62 + .../analysis/InheritedEventDetectionTest.java | 90 ++ ...ine.complex.ComplexStateMachineConfig.html | 1279 ----------------- ...ine.complex.ComplexStateMachineConfig.json | 614 -------- ...e.config.EnterpriseStateMachineConfig.html | 1039 ------------- ...e.config.EnterpriseStateMachineConfig.json | 390 ----- ...e.config.EnterpriseStateMachineConfig.html | 1043 -------------- ...e.config.EnterpriseStateMachineConfig.json | 390 ----- 20 files changed, 324 insertions(+), 8016 deletions(-) delete mode 100644 out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.html delete mode 100644 out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.json delete mode 100644 out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html delete mode 100644 out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json delete mode 100644 out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml delete mode 100644 out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.html delete mode 100644 out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json delete mode 100644 out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.puml create mode 100644 state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/InheritedEventDetectionTest.java delete mode 100644 state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.html delete mode 100644 state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.json delete mode 100644 state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html delete mode 100644 state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json delete mode 100644 state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html delete mode 100644 state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json diff --git a/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.html b/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.html deleted file mode 100644 index 3855989..0000000 --- a/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.html +++ /dev/null @@ -1,994 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig - - - - - - - - - - - - - - - - -
- -
- app.states.initialSTARTSTARTPROCESSINGCOMPLETEDCANCELLEDSUBMIT_EVENTFINISHCANCEL_EVENTREACTIVE_EVENTAUDIT_EVENTEXTERNAL_TRIGGER -
-
- - - - - - diff --git a/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.json b/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.json deleted file mode 100644 index cc9e13f..0000000 --- a/out_extended/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig/click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.json +++ /dev/null @@ -1,374 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "FINISH", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "finishOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 34 - }, { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - }, { - "event" : "EXTERNAL_TRIGGER", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processSubmit", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 19 - }, { - "event" : "SUBMIT_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processSubmit", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 20 - }, { - "event" : "CANCEL_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processCancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 25 - }, { - "event" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "resumeOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 29 - }, { - "event" : "REACTIVE_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", - "methodName" : "processReactive", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/orders/submit", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/api/orders/submit", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/orders/cancel", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/orders/cancel", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/orders/finish", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "finishOrder", - "metadata" : { - "path" : "/api/orders/finish", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/orders/resume", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "resumeOrder", - "metadata" : { - "path" : "/api/orders/resume", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/orders/reactive", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "reactiveOrder", - "metadata" : { - "path" : "/api/orders/reactive", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: AuditInterceptor.preHandle", - "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/submit", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/api/orders/submit", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.submitOrder", "click.kamil.examples.statemachine.extended.service.OrderService.processSubmit" ], - "triggerPoint" : { - "event" : "EXTERNAL_TRIGGER", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processSubmit", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 19 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/submit", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/api/orders/submit", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.submitOrder", "click.kamil.examples.statemachine.extended.service.OrderService.processSubmit" ], - "triggerPoint" : { - "event" : "SUBMIT_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processSubmit", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 20 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/cancel", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/orders/cancel", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.cancelOrder", "click.kamil.examples.statemachine.extended.service.OrderService.processCancel" ], - "triggerPoint" : { - "event" : "CANCEL_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "processCancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 25 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/finish", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "finishOrder", - "metadata" : { - "path" : "/api/orders/finish", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.finishOrder" ], - "triggerPoint" : { - "event" : "FINISH", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "finishOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 34 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/resume", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "resumeOrder", - "metadata" : { - "path" : "/api/orders/resume", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.resumeOrder", "click.kamil.examples.statemachine.extended.service.OrderService.resumeOrder" ], - "triggerPoint" : { - "event" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.OrderService", - "methodName" : "resumeOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 29 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/reactive", - "className" : "click.kamil.examples.statemachine.extended.web.OrderController", - "methodName" : "reactiveOrder", - "metadata" : { - "path" : "/api/orders/reactive", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.reactiveOrder", "click.kamil.examples.statemachine.extended.service.ReactiveOrderService.processReactive" ], - "triggerPoint" : { - "event" : "REACTIVE_EVENT", - "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", - "methodName" : "processReactive", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } - }, { - "entryPoint" : { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: AuditInterceptor.preHandle", - "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.statemachine.extended.web.AuditInterceptor.preHandle" ], - "triggerPoint" : { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - } - } ], - "properties" : { - "default" : { - "app.states.initial" : "INIT_STATE" - }, - "prod" : { - "app.states.initial" : "PROD_INITIAL" - } - } - }, - "name" : "click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "${app.states.initial:START}" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"START\"", - "fullIdentifier" : "START" - } ], - "targetStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "event" : "SUBMIT_EVENT", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "\"COMPLETED\"", - "fullIdentifier" : "COMPLETED" - } ], - "event" : "FINISH", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "\"CANCELLED\"", - "fullIdentifier" : "CANCELLED" - } ], - "event" : "CANCEL_EVENT", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"START\"", - "fullIdentifier" : "START" - } ], - "targetStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "event" : "REACTIVE_EVENT", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"START\"", - "fullIdentifier" : "START" - } ], - "targetStates" : [ { - "rawName" : "\"START\"", - "fullIdentifier" : "START" - } ], - "event" : "AUDIT_EVENT", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"START\"", - "fullIdentifier" : "START" - } ], - "targetStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "event" : "EXTERNAL_TRIGGER", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "CANCELLED", "COMPLETED" ] -} diff --git a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html b/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html deleted file mode 100644 index 964cc30..0000000 --- a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html +++ /dev/null @@ -1,770 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.maven.core.MavenOrderStateMachine - - - - - - - - - - - - - - - - -
- - -
- - - - - - diff --git a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json b/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json deleted file mode 100644 index 37d159a..0000000 --- a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "SUBMIT", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 40 - }, { - "event" : "ORDER_EVENT", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderService", - "methodName" : "onMessage", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 52 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /maven/orders/submit", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "metadata" : { - "path" : "/maven/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "REST", - "name" : "POST /reactive/order", - "className" : "click.kamil.maven.api.ReactiveOrderApi", - "methodName" : "orderRoutes", - "sourceFile" : "api-module/src/main/java/click/kamil/maven/api/ReactiveOrderApi.java", - "metadata" : { - "path" : "/reactive/order", - "verb" : "POST", - "style" : "WebFlux Functional" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /maven/orders/submit", - "className" : "click.kamil.maven.api.MavenOrderApi", - "methodName" : "submitOrder", - "sourceFile" : "api-module/src/main/java/click/kamil/maven/api/MavenOrderApi.java", - "metadata" : { - "path" : "/maven/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: order.queue", - "className" : "click.kamil.maven.api.JmsOrderListener", - "methodName" : "onMessage", - "sourceFile" : null, - "metadata" : { - "protocol" : "JMS", - "destination" : "order.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /maven/orders/submit", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "metadata" : { - "path" : "/maven/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.maven.core.MavenOrderStateMachine.OrderController.submitOrder" ], - "triggerPoint" : { - "event" : "SUBMIT", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 40 - } - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.maven.core.MavenOrderStateMachine", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "INIT" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"INIT\"", - "fullIdentifier" : "INIT" - } ], - "targetStates" : [ { - "rawName" : "\"BUSY\"", - "fullIdentifier" : "BUSY" - } ], - "event" : "SUBMIT", - "guard" : null, - "actions" : [ { - "expression" : "loggingAction()", - "isLambda" : false, - "internalLogic" : "context -> {\n System.out.println(\"LOG: State transition in progress...\");\n}\n", - "lineNumber" : 25, - "className" : "click.kamil.maven.core.MavenOrderStateMachine", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java" - } ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"BUSY\"", - "fullIdentifier" : "BUSY" - } ], - "targetStates" : [ { - "rawName" : "\"DONE\"", - "fullIdentifier" : "DONE" - } ], - "event" : "ORDER_EVENT", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "DONE" ] -} diff --git a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml b/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml deleted file mode 100644 index 98f60a8..0000000 --- a/out_maven/click.kamil.maven.core.MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -!pragma layout smetana -set separator none -hide empty description -hide stereotype -skinparam state { - BackgroundColor white - BorderColor #94a3b8 - BorderThickness 1 - FontName Inter - FontSize 9 - FontStyle bold - RoundCorner 20 - Padding 1 -} -skinparam shadowing false -skinparam ArrowFontName JetBrains Mono -skinparam ArrowFontSize 8 -skinparam ArrowColor #cbd5e1 -skinparam ArrowThickness 1 -skinparam dpi 110 -skinparam svgLinkTarget _self - -[*] --> INIT - - -INIT -[#1E90FF,bold]-> BUSY <> <> : ORDER_EVENT / loggingAction() - -DONE --> [*] -@enduml - diff --git a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.html b/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.html deleted file mode 100644 index d731eec..0000000 --- a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.html +++ /dev/null @@ -1,735 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.multi.core.OrderStateMachineConfig - - - - - - - - - - - - - - - - -
- -
- NEWPROCESSINGCOMPLETEDSUBMIT / processAction()FINISH -
-
- - - - - - diff --git a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json b/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json deleted file mode 100644 index 0f80575..0000000 --- a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "SUBMIT", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.api.OrderApi", - "methodName" : "submitOrder", - "sourceFile" : "api-module/src/main/java/click/kamil/multi/api/OrderApi.java", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.multi.core.OrderController.submitOrder" ], - "triggerPoint" : { - "event" : "SUBMIT", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.multi.core.OrderStateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "NEW" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"NEW\"", - "fullIdentifier" : "NEW" - } ], - "targetStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "event" : "SUBMIT", - "guard" : null, - "actions" : [ { - "expression" : "processAction()", - "isLambda" : false, - "internalLogic" : "@Override default void execute(StateContext context){\n System.out.println(\"Processing order: \" + context.getMessageHeader(\"orderId\"));\n}\n", - "lineNumber" : 31, - "className" : "click.kamil.multi.core.OrderStateMachineConfig", - "sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderStateMachineConfig.java" - } ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "\"COMPLETED\"", - "fullIdentifier" : "COMPLETED" - } ], - "event" : "FINISH", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "COMPLETED" ] -} diff --git a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.puml b/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.puml deleted file mode 100644 index 3b59d0b..0000000 --- a/out_multi/click.kamil.multi.core.OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.puml +++ /dev/null @@ -1,32 +0,0 @@ -@startuml -!pragma layout smetana -set separator none -hide empty description -hide stereotype -skinparam state { - BackgroundColor white - BorderColor #94a3b8 - BorderThickness 1 - FontName Inter - FontSize 9 - FontStyle bold - RoundCorner 20 - Padding 1 -} -skinparam shadowing false -skinparam ArrowFontName JetBrains Mono -skinparam ArrowFontSize 8 -skinparam ArrowColor #cbd5e1 -skinparam ArrowThickness 1 -skinparam dpi 110 -skinparam svgLinkTarget _self - -[*] --> NEW - - -NEW -[#1E90FF,bold]-> PROCESSING <> <> : SUBMIT / processAction() -PROCESSING -[#1E90FF,bold]-> COMPLETED <> <> : FINISH - -COMPLETED --> [*] -@enduml - diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphBuilder.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphBuilder.java index 15cb7b7..415e2ca 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphBuilder.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphBuilder.java @@ -4,19 +4,32 @@ import click.kamil.springstatemachineexporter.analysis.model.CallChain; import click.kamil.springstatemachineexporter.analysis.model.EntryPoint; import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; -import lombok.RequiredArgsConstructor; +import click.kamil.springstatemachineexporter.analysis.resolver.ConstantResolver; import lombok.extern.slf4j.Slf4j; import org.eclipse.jdt.core.dom.*; import java.util.*; @Slf4j -@RequiredArgsConstructor public class CallGraphBuilder { private final CodebaseContext context; + private final ConstantResolver constantResolver; + private String currentMethodFqn; + private Map> graph; + + @lombok.Data + private static class CallEdge { + private final String targetMethod; + private final List arguments; + } + + public CallGraphBuilder(CodebaseContext context) { + this.context = context; + this.constantResolver = new ConstantResolver(); + } public List findChains(List entryPoints, List triggers) { - Map> callGraph = buildCallGraph(); + Map> callGraph = buildCallGraph(); List chains = new ArrayList<>(); for (EntryPoint ep : entryPoints) { @@ -25,9 +38,10 @@ public class CallGraphBuilder { String targetMethod = tp.getClassName() + "." + tp.getMethodName(); List path = findPath(startMethod, targetMethod, callGraph, new HashSet<>()); if (path != null) { + TriggerPoint resolvedTp = resolveTriggerPointParameters(tp, path, callGraph); chains.add(CallChain.builder() .entryPoint(ep) - .triggerPoint(tp) + .triggerPoint(resolvedTp) .methodChain(path) .build()); } @@ -36,12 +50,57 @@ public class CallGraphBuilder { return chains; } - private Map> buildCallGraph() { - Map> graph = new HashMap<>(); + private TriggerPoint resolveTriggerPointParameters(TriggerPoint tp, List path, Map> callGraph) { + if (path.size() < 2) return tp; + + String event = tp.getEvent(); + if (event == null || event.isEmpty() || event.contains("\"")) return tp; + + TypeDeclaration td = context.getTypeDeclaration(tp.getClassName()); + if (td != null) { + MethodDeclaration md = context.findMethodDeclaration(td, tp.getMethodName(), true); + if (md != null) { + int paramIndex = -1; + for (int i = 0; i < md.parameters().size(); i++) { + SingleVariableDeclaration svd = (SingleVariableDeclaration) md.parameters().get(i); + if (svd.getName().getIdentifier().equals(event)) { + paramIndex = i; + break; + } + } + + if (paramIndex >= 0) { + String caller = path.get(path.size() - 2); + String target = path.get(path.size() - 1); + List edges = callGraph.get(caller); + if (edges != null) { + for (CallEdge edge : edges) { + if (edge.getTargetMethod().equals(target) || isHeuristicMatch(edge.getTargetMethod(), target)) { + if (paramIndex < edge.getArguments().size()) { + String resolvedValue = edge.getArguments().get(paramIndex); + if (resolvedValue != null) { + return TriggerPoint.builder() + .event(resolvedValue) + .className(tp.getClassName()) + .methodName(tp.getMethodName()) + .sourceFile(tp.getSourceFile()) + .lineNumber(tp.getLineNumber()) + .build(); + } + } + } + } + } + } + } + } + return tp; + } + + private Map> buildCallGraph() { + graph = new HashMap<>(); for (CompilationUnit cu : context.getCompilationUnits()) { cu.accept(new ASTVisitor() { - private String currentMethodFqn; - @Override public boolean visit(MethodDeclaration node) { TypeDeclaration td = findEnclosingType(node); @@ -55,8 +114,31 @@ public class CallGraphBuilder { public boolean visit(MethodInvocation node) { if (currentMethodFqn != null) { List calledMethods = resolveCalledMethodsPolymorphic(node); + List args = resolveArguments(node.arguments()); for (String calledMethod : calledMethods) { - graph.computeIfAbsent(currentMethodFqn, k -> new ArrayList<>()).add(calledMethod); + graph.computeIfAbsent(currentMethodFqn, k -> new ArrayList<>()).add(new CallEdge(calledMethod, args)); + } + } + return super.visit(node); + } + + @Override + public boolean visit(SuperMethodInvocation node) { + if (currentMethodFqn != null) { + String methodName = node.getName().getIdentifier(); + TypeDeclaration td = findEnclosingType(node); + if (td != null) { + String superFqn = context.getSuperclassFqn(td); + if (superFqn != null) { + TypeDeclaration superTd = context.getTypeDeclaration(superFqn); + if (superTd != null) { + String calledMethod = resolveMethodInType(superTd, methodName); + if (calledMethod != null) { + List args = resolveArguments(node.arguments()); + graph.computeIfAbsent(currentMethodFqn, k -> new ArrayList<>()).add(new CallEdge(calledMethod, args)); + } + } + } } } return super.visit(node); @@ -66,6 +148,19 @@ public class CallGraphBuilder { return graph; } + private List resolveArguments(List astArguments) { + List args = new ArrayList<>(); + for (Object argObj : astArguments) { + Expression expr = (Expression) argObj; + String val = constantResolver.resolve(expr, context); + if (val == null && expr instanceof SimpleName sn) { + val = sn.getIdentifier(); + } + args.add(val); + } + return args; + } + private List resolveCalledMethodsPolymorphic(MethodInvocation node) { String baseCalled = resolveCalledMethod(node); if (baseCalled == null) return Collections.emptyList(); @@ -73,7 +168,6 @@ public class CallGraphBuilder { List allResolved = new ArrayList<>(); allResolved.add(baseCalled); - // Polymorphic fan-out if (baseCalled.contains(".")) { String className = baseCalled.substring(0, baseCalled.lastIndexOf('.')); String methodName = baseCalled.substring(baseCalled.lastIndexOf('.') + 1); @@ -92,39 +186,43 @@ public class CallGraphBuilder { String methodName = node.getName().getIdentifier(); if (receiver == null) { - // Local call or static import (simplified) TypeDeclaration td = findEnclosingType(node); - return td != null ? context.getFqn(td) + "." + methodName : null; + if (td != null) { + return resolveMethodInType(td, methodName); + } + return null; } - // Try to resolve receiver type - // This is a simplified resolution without full JDT bindings. - // It works for local variables and fields within the same project. ITypeBinding binding = receiver.resolveTypeBinding(); if (binding != null) { return binding.getQualifiedName() + "." + methodName; } - // Fallback: heuristic resolution for simple cases like 'orderService.process()' if (receiver instanceof SimpleName sn) { String receiverName = sn.getIdentifier(); - // Look for fields or variables (simplified) - // For now, we'll return a "best guess" if we can't resolve it perfectly - // In a real implementation, we'd use JDT bindings more heavily. return receiverName + "." + methodName; } return null; } - private List findPath(String start, String target, Map> graph, Set visited) { + private String resolveMethodInType(TypeDeclaration td, String methodName) { + MethodDeclaration md = context.findMethodDeclaration(td, methodName, true); + if (md != null) { + TypeDeclaration declaringTd = findEnclosingType(md); + return context.getFqn(declaringTd) + "." + methodName; + } + return null; + } + + private List findPath(String start, String target, Map> graph, Set visited) { if (start.equals(target)) return new ArrayList<>(List.of(start)); if (!visited.add(start)) return null; - List neighbors = graph.get(start); + List neighbors = graph.get(start); if (neighbors != null) { - for (String neighbor : neighbors) { - // Heuristic: neighbor might be 'orderService.process' while target is 'click.kamil...OrderService.process' + for (CallEdge edge : neighbors) { + String neighbor = edge.getTargetMethod(); if (neighbor.equals(target) || isHeuristicMatch(neighbor, target)) { return new ArrayList<>(List.of(start, target)); } @@ -139,14 +237,10 @@ public class CallGraphBuilder { } private boolean isHeuristicMatch(String neighbor, String target) { - // Match 'orderService.process' with 'click.kamil.OrderService.process' if (target.endsWith("." + neighbor)) return true; - // Match simple names if we don't have FQN String simpleTarget = target.contains(".") ? target.substring(target.lastIndexOf('.') + 1) : target; String simpleNeighbor = neighbor.contains(".") ? neighbor.substring(neighbor.lastIndexOf('.') + 1) : neighbor; - - // Very basic heuristic for now - return neighbor.toLowerCase().contains(simpleTarget.toLowerCase()) || target.toLowerCase().contains(simpleNeighbor.toLowerCase()); + return simpleNeighbor.equals(simpleTarget); } private TypeDeclaration findEnclosingType(ASTNode node) { diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java index ada4a22..96d7043 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java @@ -21,7 +21,11 @@ public class GenericEventDetector { public List detect(CompilationUnit cu) { List triggers = new ArrayList<>(); - String fileName = cu.getJavaElement() != null ? cu.getJavaElement().getElementName() : "unknown"; + String fileName = "unknown"; + try { + if (cu.getJavaElement() != null) fileName = cu.getJavaElement().getElementName(); + } catch (Exception e) {} + log.debug("Scanning for triggers in {}", fileName); cu.accept(new ASTVisitor() { @@ -29,12 +33,10 @@ public class GenericEventDetector { public boolean visit(MethodInvocation node) { String methodName = node.getName().getIdentifier(); - // 1. Core sendEvent if ("sendEvent".equals(methodName)) { processSendEvent(node, cu, triggers); } - // 2. Library Hints processHints(node, cu, triggers); return super.visit(node); @@ -44,10 +46,9 @@ public class GenericEventDetector { } private void processSendEvent(MethodInvocation node, CompilationUnit cu, List triggers) { - log.info("Found potential trigger: {}", node); TriggerPoint trigger = buildTriggerPoint(node, cu, null); if (trigger != null) { - log.info("Successfully built trigger point: {}", trigger.getEvent()); + log.debug("Successfully built trigger point: {}", trigger.getEvent()); triggers.add(trigger); } } @@ -57,15 +58,12 @@ public class GenericEventDetector { String calledMethod = resolveCalledMethodName(node); if (calledMethod == null) return; - - log.info("Checking method call '{}' against {} hints", calledMethod, hints.size()); for (LibraryHint hint : hints) { if (calledMethod.equals(hint.getMethodFqn()) || isHintMatch(calledMethod, hint.getMethodFqn())) { - log.info("MATCH! Found hint for '{}'", calledMethod); TriggerPoint trigger = buildTriggerPoint(node, cu, hint.getEvent()); if (trigger != null) { - log.info("Successfully built synthetic trigger point from hint: {}", trigger.getEvent()); + log.debug("Successfully built synthetic trigger point from hint: {}", trigger.getEvent()); triggers.add(trigger); } } @@ -104,15 +102,20 @@ public class GenericEventDetector { } private TriggerPoint buildTriggerPoint(MethodInvocation node, CompilationUnit cu, String forcedEvent) { - String eventValue; + String eventValue = null; if (forcedEvent != null) { - eventValue = forcedEvent; + eventValue = context.resolveString(forcedEvent); } else { if (node.arguments().isEmpty()) return null; Expression eventExpr = (Expression) node.arguments().get(0); - eventValue = constantResolver.resolve(eventExpr, context); - if (eventValue == null) { - eventValue = eventExpr.toString(); + + // Try MessageBuilder extraction first + eventValue = extractEventFromMessageBuilder(eventExpr); + + if (eventValue != null) { + eventValue = context.resolveString(eventValue); + } else { + eventValue = context.resolveExpression(eventExpr); } } @@ -130,6 +133,35 @@ public class GenericEventDetector { .build(); } + private String extractEventFromMessageBuilder(Expression expr) { + if (!(expr instanceof MethodInvocation mi)) return null; + + // Trace back chain: MessageBuilder.withPayload(event).setHeader(...).build() + MethodInvocation current = mi; + while (current != null) { + String name = current.getName().getIdentifier(); + if ("withPayload".equals(name) && !current.arguments().isEmpty()) { + Expression payloadExpr = (Expression) current.arguments().get(0); + String resolved = constantResolver.resolve(payloadExpr, context); + if (resolved != null) return resolved; + + // If not a constant, it might be a parameter like 'event' + if (payloadExpr instanceof SimpleName sn) { + return sn.getIdentifier(); // Return the parameter name so the call graph can fill it + } + return payloadExpr.toString(); + } + + Expression receiver = current.getExpression(); + if (receiver instanceof MethodInvocation nextMi) { + current = nextMi; + } else { + current = null; + } + } + return null; + } + private MethodDeclaration findEnclosingMethod(ASTNode node) { ASTNode parent = node.getParent(); while (parent != null && !(parent instanceof MethodDeclaration)) { diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/MessagingDetector.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/MessagingDetector.java index 3c4f23c..beffa1b 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/MessagingDetector.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/MessagingDetector.java @@ -1,7 +1,6 @@ package click.kamil.springstatemachineexporter.analysis.service; import click.kamil.springstatemachineexporter.analysis.model.EntryPoint; -import click.kamil.springstatemachineexporter.analysis.resolver.ConstantResolver; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; import lombok.RequiredArgsConstructor; import org.eclipse.jdt.core.dom.*; @@ -14,7 +13,6 @@ import java.util.Map; @RequiredArgsConstructor public class MessagingDetector { private final CodebaseContext context; - private final ConstantResolver constantResolver = new ConstantResolver(); public List detect(CompilationUnit cu) { List entryPoints = new ArrayList<>(); @@ -99,13 +97,11 @@ public class MessagingDetector { if (value instanceof ArrayInitializer ai) { List values = new ArrayList<>(); for (Object o : ai.expressions()) { - String resolved = constantResolver.resolve((Expression) o, context); - values.add(resolved != null ? resolved : o.toString()); + values.add(context.resolveExpression((Expression) o)); } return String.join(", ", values); } - String resolved = constantResolver.resolve(value, context); - return resolved != null ? resolved : value.toString(); + return context.resolveExpression(value); } return "unknown"; } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/SpringMvcDetector.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/SpringMvcDetector.java index bd90415..41597ff 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/SpringMvcDetector.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/SpringMvcDetector.java @@ -44,13 +44,7 @@ public class SpringMvcDetector { String verb = getHttpVerb(name); if (verb != null && !call.arguments().isEmpty()) { Expression pathArg = (Expression) call.arguments().get(0); - String path = constantResolver.resolve(pathArg, context); - if (path != null) { - path = context.resolveString(path); - } else { - path = pathArg.toString().replaceAll("\"", ""); - path = context.resolveString(path); - } + String path = context.resolveExpression(pathArg); entryPoints.add(EntryPoint.builder() .type(EntryPoint.Type.REST) @@ -224,11 +218,7 @@ public class SpringMvcDetector { } if (value != null) { - String resolved = constantResolver.resolve(value, context); - if (resolved == null) { - resolved = value.toString().replaceAll("^\"|\"$", ""); - } - return context.resolveString(resolved); + return context.resolveExpression(value); } return ""; } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java index 474a96f..4f4cc7d 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java @@ -114,6 +114,17 @@ public class CodebaseContext { return PlaceholderResolver.resolve(input, merged); } + + public String resolveExpression(Expression expr) { + if (expr == null) return null; + + String astResolved = constantResolver.resolve(expr, this); + if (astResolved == null) { + astResolved = expr.toString().replaceAll("^\"|\"$", ""); + } + + return resolveString(astResolved); + } public TypeDeclaration resolveStaticImport(String memberName, CompilationUnit contextCu) { if (contextCu == null) return null; @@ -416,6 +427,57 @@ public class CodebaseContext { return getTypeDeclaration(name); } + public String getSuperclassFqn(TypeDeclaration td) { + Type superType = td.getSuperclassType(); + if (superType == null) return null; + + String superName = extractTypeName(superType); + CompilationUnit cu = (CompilationUnit) td.getRoot(); + TypeDeclaration superTd = getTypeDeclaration(superName, cu); + return superTd != null ? getFqn(superTd) : superName; + } + + private String extractTypeName(Type type) { + if (type.isParameterizedType()) { + return extractTypeName(((ParameterizedType) type).getType()); + } else if (type.isSimpleType()) { + return ((SimpleType) type).getName().getFullyQualifiedName(); + } else if (type.isQualifiedType()) { + return ((QualifiedType) type).getName().getFullyQualifiedName(); + } + return type.toString(); + } + + public MethodDeclaration findMethodDeclaration(TypeDeclaration td, String methodName, boolean includeSuper) { + for (MethodDeclaration method : td.getMethods()) { + if (method.getName().getIdentifier().equals(methodName)) { + return method; + } + } + + if (includeSuper) { + String superFqn = getSuperclassFqn(td); + if (superFqn != null) { + TypeDeclaration superTd = getTypeDeclaration(superFqn); + if (superTd != null) { + return findMethodDeclaration(superTd, methodName, true); + } + } + + // Check interfaces + for (Object interfaceTypeObj : td.superInterfaceTypes()) { + Type interfaceType = (Type) interfaceTypeObj; + String interfaceName = extractTypeName(interfaceType); + TypeDeclaration interfaceTd = getTypeDeclaration(interfaceName, (CompilationUnit) td.getRoot()); + if (interfaceTd != null) { + MethodDeclaration found = findMethodDeclaration(interfaceTd, methodName, true); + if (found != null) return found; + } + } + } + return null; + } + public String getFqn(TypeDeclaration td) { StringBuilder sb = new StringBuilder(td.getName().getIdentifier()); ASTNode current = td.getParent(); diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/InheritedEventDetectionTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/InheritedEventDetectionTest.java new file mode 100644 index 0000000..a8b1d0b --- /dev/null +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/InheritedEventDetectionTest.java @@ -0,0 +1,90 @@ +package click.kamil.springstatemachineexporter.analysis; + +import click.kamil.springstatemachineexporter.analysis.model.CallChain; +import click.kamil.springstatemachineexporter.analysis.model.EntryPoint; +import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; +import click.kamil.springstatemachineexporter.analysis.resolver.ConstantResolver; +import click.kamil.springstatemachineexporter.analysis.service.CallGraphBuilder; +import click.kamil.springstatemachineexporter.analysis.service.GenericEventDetector; +import click.kamil.springstatemachineexporter.analysis.service.SpringMvcDetector; +import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.TypeDeclaration; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class InheritedEventDetectionTest { + + @Test + void testInheritedMessageBuilderEvent(@TempDir Path tempDir) throws IOException { + Path srcDir = tempDir.resolve("src/main/java/com/example"); + Files.createDirectories(srcDir); + + // 1. Abstract Base Controller with protected method using MessageBuilder + Files.writeString(srcDir.resolve("BaseController.java"), + "package com.example;\n" + + "import org.springframework.messaging.support.MessageBuilder;\n" + + "import org.springframework.statemachine.StateMachine;\n" + + "public abstract class BaseController {\n" + + " protected StateMachine stateMachine;\n" + + " \n" + + " protected void send(String event) {\n" + + " stateMachine.sendEvent(MessageBuilder.withPayload(event).build());\n" + + " }\n" + + "}"); + + // 2. Child Controller calling super.send() + Files.writeString(srcDir.resolve("ChildController.java"), + "package com.example;\n" + + "import org.springframework.web.bind.annotation.*;\n" + + "@RestController\n" + + "public class ChildController extends BaseController {\n" + + " \n" + + " @GetMapping(\"/trigger\")\n" + + " public void trigger() {\n" + + " super.send(\"MY_EVENT\");\n" + + " }\n" + + "}"); + + CodebaseContext context = new CodebaseContext(); + context.scan(tempDir); + + // Detect Entry Points + SpringMvcDetector mvcDetector = new SpringMvcDetector(context, new ConstantResolver()); + TypeDeclaration childTd = context.getTypeDeclaration("com.example.ChildController"); + CompilationUnit childCu = (CompilationUnit) childTd.getRoot(); + List entryPoints = mvcDetector.detect(childCu); + assertThat(entryPoints).hasSize(1); + EntryPoint ep = entryPoints.get(0); + + // Detect Trigger Points + GenericEventDetector eventDetector = new GenericEventDetector(context, new ConstantResolver(), List.of()); + TypeDeclaration baseTd = context.getTypeDeclaration("com.example.BaseController"); + CompilationUnit baseCu = (CompilationUnit) baseTd.getRoot(); + + List triggers = eventDetector.detect(baseCu); + + assertThat(triggers).describedAs("Should detect sendEvent in BaseController").hasSize(1); + TriggerPoint tp = triggers.get(0); + assertThat(tp.getEvent()).isEqualTo("event"); + + // Build Call Chains + CallGraphBuilder callGraphBuilder = new CallGraphBuilder(context); + List chains = callGraphBuilder.findChains(entryPoints, triggers); + + assertThat(chains).describedAs("Should link ChildController.trigger to BaseController.send").hasSize(1); + CallChain chain = chains.get(0); + assertThat(chain.getMethodChain()).containsExactly( + "com.example.ChildController.trigger", + "com.example.BaseController.send" + ); + assertThat(chain.getTriggerPoint().getEvent()).isEqualTo("MY_EVENT"); + } +} diff --git a/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.html b/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.html deleted file mode 100644 index 6b1668d..0000000 --- a/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.html +++ /dev/null @@ -1,1279 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.examples.statemachine.complex.ComplexStateMachineConfig - - - - - - - - - - - - - - - - - - - - - - - diff --git a/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.json b/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.json deleted file mode 100644 index 6df9980..0000000 --- a/state_machine_exporter_html/out_complex/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig/click.kamil.examples.statemachine.complex.ComplexStateMachineConfig.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "metadata" : { - "triggers" : [ ], - "entryPoints" : [ ], - "callChains" : [ ], - "properties" : { - "default" : { - "spring.application.name" : "statemachinedemo" - } - } - }, - "name" : "click.kamil.examples.statemachine.complex.ComplexStateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "States.STATE1" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE1", - "fullIdentifier" : "States.STATE1" - } ], - "targetStates" : [ { - "rawName" : "States.STATE2", - "fullIdentifier" : "States.STATE2" - } ], - "event" : "Events.EVENT1", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE2", - "fullIdentifier" : "States.STATE2" - } ], - "targetStates" : [ { - "rawName" : "States.STATE3", - "fullIdentifier" : "States.STATE3" - } ], - "event" : "Events.EVENT2", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE3", - "fullIdentifier" : "States.STATE3" - } ], - "targetStates" : [ { - "rawName" : "States.STATE4", - "fullIdentifier" : "States.STATE4" - } ], - "event" : "Events.EVENT3", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE4", - "fullIdentifier" : "States.STATE4" - } ], - "targetStates" : [ { - "rawName" : "States.STATE5", - "fullIdentifier" : "States.STATE5" - } ], - "event" : "Events.EVENT4", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE5", - "fullIdentifier" : "States.STATE5" - } ], - "targetStates" : [ { - "rawName" : "States.STATE6", - "fullIdentifier" : "States.STATE6" - } ], - "event" : "Events.EVENT5", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE6", - "fullIdentifier" : "States.STATE6" - } ], - "targetStates" : [ { - "rawName" : "States.STATE7", - "fullIdentifier" : "States.STATE7" - } ], - "event" : "Events.EVENT6", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE7", - "fullIdentifier" : "States.STATE7" - } ], - "targetStates" : [ { - "rawName" : "States.STATE8", - "fullIdentifier" : "States.STATE8" - } ], - "event" : "Events.EVENT7", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE8", - "fullIdentifier" : "States.STATE8" - } ], - "targetStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "event" : "Events.EVENT8", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "targetStates" : [ { - "rawName" : "States.STATE10", - "fullIdentifier" : "States.STATE10" - } ], - "event" : "Events.EVENT9", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE10", - "fullIdentifier" : "States.STATE10" - } ], - "targetStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "event" : "Events.EVENT10", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "targetStates" : [ { - "rawName" : "States.STATE12", - "fullIdentifier" : "States.STATE12" - } ], - "event" : "Events.EVENT11", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE12", - "fullIdentifier" : "States.STATE12" - } ], - "targetStates" : [ { - "rawName" : "States.STATE13", - "fullIdentifier" : "States.STATE13" - } ], - "event" : "Events.EVENT12", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE13", - "fullIdentifier" : "States.STATE13" - } ], - "targetStates" : [ { - "rawName" : "States.STATE14", - "fullIdentifier" : "States.STATE14" - } ], - "event" : "Events.EVENT13", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE14", - "fullIdentifier" : "States.STATE14" - } ], - "targetStates" : [ { - "rawName" : "States.STATE15", - "fullIdentifier" : "States.STATE15" - } ], - "event" : "Events.EVENT14", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "States.STATE15", - "fullIdentifier" : "States.STATE15" - } ], - "targetStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "event" : "Events.EVENT15", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "targetStates" : [ { - "rawName" : "States.STATE17", - "fullIdentifier" : "States.STATE17" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"value1\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 86 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "targetStates" : [ { - "rawName" : "States.STATE18", - "fullIdentifier" : "States.STATE18" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"value2\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 87 - }, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "targetStates" : [ { - "rawName" : "States.STATE19", - "fullIdentifier" : "States.STATE19" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 2 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE17", - "fullIdentifier" : "States.STATE17" - } ], - "targetStates" : [ { - "rawName" : "States.STATE20", - "fullIdentifier" : "States.STATE20" - } ], - "event" : null, - "guard" : { - "expression" : "guardEventHeaderEquals(\"header1\",\"foo\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 92 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE17", - "fullIdentifier" : "States.STATE17" - } ], - "targetStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE18", - "fullIdentifier" : "States.STATE18" - } ], - "targetStates" : [ { - "rawName" : "States.STATE19", - "fullIdentifier" : "States.STATE19" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"value3\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 97 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE18", - "fullIdentifier" : "States.STATE18" - } ], - "targetStates" : [ { - "rawName" : "States.STATE20", - "fullIdentifier" : "States.STATE20" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE19", - "fullIdentifier" : "States.STATE19" - } ], - "targetStates" : [ { - "rawName" : "States.STATE1", - "fullIdentifier" : "States.STATE1" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"reset\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 102 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE19", - "fullIdentifier" : "States.STATE19" - } ], - "targetStates" : [ { - "rawName" : "States.STATE20", - "fullIdentifier" : "States.STATE20" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE20", - "fullIdentifier" : "States.STATE20" - } ], - "targetStates" : [ { - "rawName" : "States.STATE5", - "fullIdentifier" : "States.STATE5" - } ], - "event" : null, - "guard" : { - "expression" : "guardEventHeaderEquals(\"header2\",\"bar\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 107 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE20", - "fullIdentifier" : "States.STATE20" - } ], - "targetStates" : [ { - "rawName" : "States.STATE1", - "fullIdentifier" : "States.STATE1" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "targetStates" : [ { - "rawName" : "States.STATE13", - "fullIdentifier" : "States.STATE13" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"goTo13\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 112 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "targetStates" : [ { - "rawName" : "States.STATE14", - "fullIdentifier" : "States.STATE14" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"goTo14\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 113 - }, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "targetStates" : [ { - "rawName" : "States.STATE15", - "fullIdentifier" : "States.STATE15" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 2 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE12", - "fullIdentifier" : "States.STATE12" - } ], - "targetStates" : [ { - "rawName" : "States.STATE10", - "fullIdentifier" : "States.STATE10" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"goBack10\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 118 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE12", - "fullIdentifier" : "States.STATE12" - } ], - "targetStates" : [ { - "rawName" : "States.STATE11", - "fullIdentifier" : "States.STATE11" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE14", - "fullIdentifier" : "States.STATE14" - } ], - "targetStates" : [ { - "rawName" : "States.STATE12", - "fullIdentifier" : "States.STATE12" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"loop12\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 123 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE14", - "fullIdentifier" : "States.STATE14" - } ], - "targetStates" : [ { - "rawName" : "States.STATE16", - "fullIdentifier" : "States.STATE16" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "targetStates" : [ { - "rawName" : "States.STATE8", - "fullIdentifier" : "States.STATE8" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"stepBack\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 128 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "targetStates" : [ { - "rawName" : "States.STATE7", - "fullIdentifier" : "States.STATE7" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"stepBackMore\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 129 - }, - "actions" : [ ], - "order" : 1 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "targetStates" : [ { - "rawName" : "States.STATE6", - "fullIdentifier" : "States.STATE6" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 2 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE8", - "fullIdentifier" : "States.STATE8" - } ], - "targetStates" : [ { - "rawName" : "States.STATE9", - "fullIdentifier" : "States.STATE9" - } ], - "event" : null, - "guard" : { - "expression" : "guardVarEquals(\"forward9\")", - "isLambda" : false, - "internalLogic" : null, - "lineNumber" : 134 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "States.STATE8", - "fullIdentifier" : "States.STATE8" - } ], - "targetStates" : [ { - "rawName" : "States.STATE10", - "fullIdentifier" : "States.STATE10" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - } ], - "endStates" : [ ] -} diff --git a/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html b/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html deleted file mode 100644 index 0c7f250..0000000 --- a/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html +++ /dev/null @@ -1,1039 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig - - - - - - - - - - - - - - - - -
- -
- NEWPENDING_PAYMENTCANCELLEDPAIDSHIPPEDDELIVEREDRETURNEDPLACE_ORDERλ (order=0)(order=1)PAY_ORDERSHIP_ORDERFINALIZECANCEL_ORDERRETURN_ORDER -
-
- - - - - - diff --git a/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json b/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json deleted file mode 100644 index 74e2d02..0000000 --- a/state_machine_exporter_html/out_enterprise_v7/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - }, { - "event" : "PLACE_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "place", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - }, { - "event" : "CANCEL_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "cancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 21 - }, { - "event" : "PAY_ORDER", - "className" : "click.kamil.examples.enterprise.service.ReactivePaymentService", - "methodName" : "processPayment", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - }, { - "event" : "SHIP_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - }, { - "event" : "RETURN_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/enterprise/orders/place", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "placeOrder", - "metadata" : { - "path" : "/api/enterprise/orders/place", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/enterprise/orders/{id}/cancel", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/enterprise/orders/{id}/cancel", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "id", - "type" : "String", - "annotations" : [ "PathVariable" ] - } ] - }, { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: SecurityInterceptor.preHandle", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/enterprise/payments", - "className" : "click.kamil.examples.enterprise.api.ReactivePaymentController", - "methodName" : "pay", - "metadata" : { - "path" : "/api/enterprise/payments", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: shipping.queue", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "metadata" : { - "protocol" : "JMS", - "destination" : "shipping.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "RABBIT", - "name" : "RABBIT: returns.queue", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "returns.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/orders/place", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "placeOrder", - "metadata" : { - "path" : "/api/enterprise/orders/place", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.OrderController.placeOrder", "click.kamil.examples.enterprise.service.OrderServiceImpl.place" ], - "triggerPoint" : { - "event" : "PLACE_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "place", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/orders/{id}/cancel", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/enterprise/orders/{id}/cancel", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "id", - "type" : "String", - "annotations" : [ "PathVariable" ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.OrderController.cancelOrder", "click.kamil.examples.enterprise.service.OrderServiceImpl.cancel" ], - "triggerPoint" : { - "event" : "CANCEL_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "cancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 21 - } - }, { - "entryPoint" : { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: SecurityInterceptor.preHandle", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.SecurityInterceptor.preHandle" ], - "triggerPoint" : { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/payments", - "className" : "click.kamil.examples.enterprise.api.ReactivePaymentController", - "methodName" : "pay", - "metadata" : { - "path" : "/api/enterprise/payments", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.ReactivePaymentController.pay", "click.kamil.examples.enterprise.service.ReactivePaymentService.processPayment" ], - "triggerPoint" : { - "event" : "PAY_ORDER", - "className" : "click.kamil.examples.enterprise.service.ReactivePaymentService", - "methodName" : "processPayment", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } - }, { - "entryPoint" : { - "type" : "JMS", - "name" : "JMS: shipping.queue", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "metadata" : { - "protocol" : "JMS", - "destination" : "shipping.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.messaging.ShippingJmsListener.onShippingReady" ], - "triggerPoint" : { - "event" : "SHIP_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - }, { - "entryPoint" : { - "type" : "RABBIT", - "name" : "RABBIT: returns.queue", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "returns.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener.onReturn" ], - "triggerPoint" : { - "event" : "RETURN_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "NEW" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"NEW\"", - "fullIdentifier" : "NEW" - } ], - "targetStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "event" : "PLACE_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "targetStates" : [ { - "rawName" : "\"PENDING_PAYMENT\"", - "fullIdentifier" : "PENDING_PAYMENT" - } ], - "event" : null, - "guard" : { - "expression" : "(c) -> true", - "isLambda" : true, - "internalLogic" : "(c) -> true", - "lineNumber" : 41 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "targetStates" : [ { - "rawName" : "\"CANCELLED\"", - "fullIdentifier" : "CANCELLED" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PENDING_PAYMENT\"", - "fullIdentifier" : "PENDING_PAYMENT" - } ], - "targetStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "event" : "PAY_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "targetStates" : [ { - "rawName" : "\"SHIPPED\"", - "fullIdentifier" : "SHIPPED" - } ], - "event" : "SHIP_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"SHIPPED\"", - "fullIdentifier" : "SHIPPED" - } ], - "targetStates" : [ { - "rawName" : "\"DELIVERED\"", - "fullIdentifier" : "DELIVERED" - } ], - "event" : "FINALIZE", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "targetStates" : [ { - "rawName" : "\"CANCELLED\"", - "fullIdentifier" : "CANCELLED" - } ], - "event" : "CANCEL_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"DELIVERED\"", - "fullIdentifier" : "DELIVERED" - } ], - "targetStates" : [ { - "rawName" : "\"RETURNED\"", - "fullIdentifier" : "RETURNED" - } ], - "event" : "RETURN_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "CANCELLED", "DELIVERED", "RETURNED" ] -} diff --git a/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html b/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html deleted file mode 100644 index f9d928d..0000000 --- a/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.html +++ /dev/null @@ -1,1043 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig - - - - - - - - - - - - - - - - -
- -
- order.initial.stateNEWNEWCHECK_AVAILABILITYPENDING_PAYMENTCANCELLEDPAIDSHIPPEDDELIVEREDRETURNEDPLACE_ORDERλ (order=0)(order=1)PAY_ORDERSHIP_ORDERFINALIZECANCEL_ORDERRETURN_ORDER -
-
- - - - - - diff --git a/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json b/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json deleted file mode 100644 index e66500d..0000000 --- a/state_machine_exporter_html/out_enterprise_v7_no_diamonds/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig/click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - }, { - "event" : "PLACE_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "place", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - }, { - "event" : "CANCEL_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "cancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 21 - }, { - "event" : "PAY_ORDER", - "className" : "click.kamil.examples.enterprise.service.ReactivePaymentService", - "methodName" : "processPayment", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - }, { - "event" : "SHIP_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - }, { - "event" : "RETURN_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/enterprise/orders/place", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "placeOrder", - "metadata" : { - "path" : "/api/enterprise/orders/place", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/enterprise/orders/{id}/cancel", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/enterprise/orders/{id}/cancel", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "id", - "type" : "String", - "annotations" : [ "PathVariable" ] - } ] - }, { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: SecurityInterceptor.preHandle", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/enterprise/payments", - "className" : "click.kamil.examples.enterprise.api.ReactivePaymentController", - "methodName" : "pay", - "metadata" : { - "path" : "/api/enterprise/payments", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: shipping.queue", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "metadata" : { - "protocol" : "JMS", - "destination" : "shipping.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "RABBIT", - "name" : "RABBIT: returns.queue", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "returns.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/orders/place", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "placeOrder", - "metadata" : { - "path" : "/api/enterprise/orders/place", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.OrderController.placeOrder", "click.kamil.examples.enterprise.service.OrderServiceImpl.place" ], - "triggerPoint" : { - "event" : "PLACE_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "place", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 16 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/orders/{id}/cancel", - "className" : "click.kamil.examples.enterprise.api.OrderController", - "methodName" : "cancelOrder", - "metadata" : { - "path" : "/api/enterprise/orders/{id}/cancel", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "id", - "type" : "String", - "annotations" : [ "PathVariable" ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.OrderController.cancelOrder", "click.kamil.examples.enterprise.service.OrderServiceImpl.cancel" ], - "triggerPoint" : { - "event" : "CANCEL_ORDER", - "className" : "click.kamil.examples.enterprise.service.OrderServiceImpl", - "methodName" : "cancel", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 21 - } - }, { - "entryPoint" : { - "type" : "CUSTOM", - "name" : "INTERCEPTOR: SecurityInterceptor.preHandle", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "metadata" : { - "interceptorType" : "Spring MVC Interceptor" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.SecurityInterceptor.preHandle" ], - "triggerPoint" : { - "event" : "AUDIT_EVENT", - "className" : "click.kamil.examples.enterprise.api.SecurityInterceptor", - "methodName" : "preHandle", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/enterprise/payments", - "className" : "click.kamil.examples.enterprise.api.ReactivePaymentController", - "methodName" : "pay", - "metadata" : { - "path" : "/api/enterprise/payments", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.api.ReactivePaymentController.pay", "click.kamil.examples.enterprise.service.ReactivePaymentService.processPayment" ], - "triggerPoint" : { - "event" : "PAY_ORDER", - "className" : "click.kamil.examples.enterprise.service.ReactivePaymentService", - "methodName" : "processPayment", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } - }, { - "entryPoint" : { - "type" : "JMS", - "name" : "JMS: shipping.queue", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "metadata" : { - "protocol" : "JMS", - "destination" : "shipping.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.messaging.ShippingJmsListener.onShippingReady" ], - "triggerPoint" : { - "event" : "SHIP_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener", - "methodName" : "onShippingReady", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - }, { - "entryPoint" : { - "type" : "RABBIT", - "name" : "RABBIT: returns.queue", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "returns.queue" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener.onReturn" ], - "triggerPoint" : { - "event" : "RETURN_ORDER", - "className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener", - "methodName" : "onReturn", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 17 - } - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig", - "renderChoicesAsDiamonds" : false, - "startStates" : [ "${order.initial.state:NEW}" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"NEW\"", - "fullIdentifier" : "NEW" - } ], - "targetStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "event" : "PLACE_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "targetStates" : [ { - "rawName" : "\"PENDING_PAYMENT\"", - "fullIdentifier" : "PENDING_PAYMENT" - } ], - "event" : null, - "guard" : { - "expression" : "(c) -> true", - "isLambda" : true, - "internalLogic" : "(c) -> true", - "lineNumber" : 41 - }, - "actions" : [ ], - "order" : 0 - }, { - "type" : "CHOICE", - "sourceStates" : [ { - "rawName" : "\"CHECK_AVAILABILITY\"", - "fullIdentifier" : "CHECK_AVAILABILITY" - } ], - "targetStates" : [ { - "rawName" : "\"CANCELLED\"", - "fullIdentifier" : "CANCELLED" - } ], - "event" : null, - "guard" : null, - "actions" : [ ], - "order" : 1 - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PENDING_PAYMENT\"", - "fullIdentifier" : "PENDING_PAYMENT" - } ], - "targetStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "event" : "PAY_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "targetStates" : [ { - "rawName" : "\"SHIPPED\"", - "fullIdentifier" : "SHIPPED" - } ], - "event" : "SHIP_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"SHIPPED\"", - "fullIdentifier" : "SHIPPED" - } ], - "targetStates" : [ { - "rawName" : "\"DELIVERED\"", - "fullIdentifier" : "DELIVERED" - } ], - "event" : "FINALIZE", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PAID\"", - "fullIdentifier" : "PAID" - } ], - "targetStates" : [ { - "rawName" : "\"CANCELLED\"", - "fullIdentifier" : "CANCELLED" - } ], - "event" : "CANCEL_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"DELIVERED\"", - "fullIdentifier" : "DELIVERED" - } ], - "targetStates" : [ { - "rawName" : "\"RETURNED\"", - "fullIdentifier" : "RETURNED" - } ], - "event" : "RETURN_ORDER", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "CANCELLED", "DELIVERED", "RETURNED" ] -}