diff --git a/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.html b/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.html deleted file mode 100644 index 0dda9bd..0000000 --- a/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.html +++ /dev/null @@ -1,1070 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.domain.StateMachineConfig - - - - - - - - - - - - - - - - -
- -
- OrderState.NEWOrderState.PROCESSINGOrderState.COMPLETEDOrderState.CANCELLEDOrderEvent.PROCESSOrderEvent.COMPLETEOrderEvent.CANCELOrderEvent.CANCEL -
-
- - - - - - diff --git a/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.json b/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.json deleted file mode 100644 index 0ab17ae..0000000 --- a/out_complex_multi_module_sm/click.kamil.domain.StateMachineConfig/click.kamil.domain.StateMachineConfig.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "event", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 25 - }, { - "event" : "eventProvider", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessageWithProvider", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 50 - }, { - "event" : "customMessage", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendCustomMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 69 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/orders/process", - "className" : "click.kamil.web.OrderController", - "methodName" : "processOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/process", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/orders/complete", - "className" : "click.kamil.web.OrderController", - "methodName" : "completeOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/complete", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "REST", - "name" : "POST /api/orders/cancel", - "className" : "click.kamil.web.OrderController", - "methodName" : "cancelOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/cancel", - "verb" : "POST" - }, - "parameters" : [ ] - }, { - "type" : "RABBIT", - "name" : "RABBIT: order.custom.transition.queue", - "className" : "click.kamil.web.RabbitOrderListener", - "methodName" : "handleCustomTransition", - "sourceFile" : "web/src/main/java/click/kamil/web/RabbitOrderListener.java", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "order.custom.transition.queue" - }, - "parameters" : [ { - "name" : "payload", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: order.process.queue", - "className" : "click.kamil.web.JmsOrderListener", - "methodName" : "receiveProcessCommand", - "sourceFile" : "web/src/main/java/click/kamil/web/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.process.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: order.cancel.queue", - "className" : "click.kamil.web.JmsOrderListener", - "methodName" : "receiveCancelCommand", - "sourceFile" : "web/src/main/java/click/kamil/web/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.cancel.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/process", - "className" : "click.kamil.web.OrderController", - "methodName" : "processOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/process", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.web.OrderController.processOrder", "click.kamil.service.StateMachineServiceImpl.sendMessageWithOutbox", "click.kamil.service.StateMachineServiceImpl.sendMessage" ], - "triggerPoint" : { - "event" : "OrderEvent.PROCESS", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 25 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.NEW", - "targetState" : "OrderState.PROCESSING", - "event" : "OrderEvent.PROCESS" - } ] - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/complete", - "className" : "click.kamil.web.OrderController", - "methodName" : "completeOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/complete", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.web.OrderController.completeOrder", "click.kamil.service.StateMachineServiceImpl.sendMessage" ], - "triggerPoint" : { - "event" : "OrderEvent.COMPLETE", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 25 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.PROCESSING", - "targetState" : "OrderState.COMPLETED", - "event" : "OrderEvent.COMPLETE" - } ] - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/orders/cancel", - "className" : "click.kamil.web.OrderController", - "methodName" : "cancelOrder", - "sourceFile" : "web/src/main/java/click/kamil/web/OrderController.java", - "metadata" : { - "path" : "/api/orders/cancel", - "verb" : "POST" - }, - "parameters" : [ ] - }, - "methodChain" : [ "click.kamil.web.OrderController.cancelOrder", "click.kamil.service.StateMachineServiceImpl.sendMessage" ], - "triggerPoint" : { - "event" : "OrderEvent.CANCEL", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 25 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.NEW", - "targetState" : "OrderState.CANCELLED", - "event" : "OrderEvent.CANCEL" - }, { - "sourceState" : "OrderState.PROCESSING", - "targetState" : "OrderState.CANCELLED", - "event" : "OrderEvent.CANCEL" - } ] - }, { - "entryPoint" : { - "type" : "RABBIT", - "name" : "RABBIT: order.custom.transition.queue", - "className" : "click.kamil.web.RabbitOrderListener", - "methodName" : "handleCustomTransition", - "sourceFile" : "web/src/main/java/click/kamil/web/RabbitOrderListener.java", - "metadata" : { - "protocol" : "RABBIT", - "destination" : "order.custom.transition.queue" - }, - "parameters" : [ { - "name" : "payload", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.web.RabbitOrderListener.handleCustomTransition", "click.kamil.service.StateMachineServiceImpl.sendCustomMessage" ], - "triggerPoint" : { - "event" : "OrderEvent.PROCESS", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendCustomMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 69 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.NEW", - "targetState" : "OrderState.PROCESSING", - "event" : "OrderEvent.PROCESS" - } ] - }, { - "entryPoint" : { - "type" : "JMS", - "name" : "JMS: order.process.queue", - "className" : "click.kamil.web.JmsOrderListener", - "methodName" : "receiveProcessCommand", - "sourceFile" : "web/src/main/java/click/kamil/web/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.process.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.web.JmsOrderListener.receiveProcessCommand", "click.kamil.service.StateMachineServiceImpl.sendMessageWithOutbox", "click.kamil.service.StateMachineServiceImpl.sendMessage" ], - "triggerPoint" : { - "event" : "OrderEvent.PROCESS", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessage", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 25 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.NEW", - "targetState" : "OrderState.PROCESSING", - "event" : "OrderEvent.PROCESS" - } ] - }, { - "entryPoint" : { - "type" : "JMS", - "name" : "JMS: order.cancel.queue", - "className" : "click.kamil.web.JmsOrderListener", - "methodName" : "receiveCancelCommand", - "sourceFile" : "web/src/main/java/click/kamil/web/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.cancel.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.web.JmsOrderListener.receiveCancelCommand", "click.kamil.service.StateMachineServiceImpl.sendMessageWithProvider" ], - "triggerPoint" : { - "event" : "OrderEvent.CANCEL", - "className" : "click.kamil.service.StateMachineServiceImpl", - "methodName" : "sendMessageWithProvider", - "sourceFile" : "service/src/main/java/click/kamil/service/StateMachineServiceImpl.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 50 - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "OrderState.NEW", - "targetState" : "OrderState.CANCELLED", - "event" : "OrderEvent.CANCEL" - }, { - "sourceState" : "OrderState.PROCESSING", - "targetState" : "OrderState.CANCELLED", - "event" : "OrderEvent.CANCEL" - } ] - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.domain.StateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "OrderState.NEW" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "OrderState.NEW", - "fullIdentifier" : "OrderState.NEW" - } ], - "targetStates" : [ { - "rawName" : "OrderState.PROCESSING", - "fullIdentifier" : "OrderState.PROCESSING" - } ], - "event" : { - "rawName" : "OrderEvent.PROCESS", - "fullIdentifier" : "OrderEvent.PROCESS" - }, - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "OrderState.PROCESSING", - "fullIdentifier" : "OrderState.PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "OrderState.COMPLETED", - "fullIdentifier" : "OrderState.COMPLETED" - } ], - "event" : { - "rawName" : "OrderEvent.COMPLETE", - "fullIdentifier" : "OrderEvent.COMPLETE" - }, - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "OrderState.NEW", - "fullIdentifier" : "OrderState.NEW" - } ], - "targetStates" : [ { - "rawName" : "OrderState.CANCELLED", - "fullIdentifier" : "OrderState.CANCELLED" - } ], - "event" : { - "rawName" : "OrderEvent.CANCEL", - "fullIdentifier" : "OrderEvent.CANCEL" - }, - "guard" : null, - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "OrderState.PROCESSING", - "fullIdentifier" : "OrderState.PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "OrderState.CANCELLED", - "fullIdentifier" : "OrderState.CANCELLED" - } ], - "event" : { - "rawName" : "OrderEvent.CANCEL", - "fullIdentifier" : "OrderEvent.CANCEL" - }, - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "OrderState.COMPLETED", "OrderState.CANCELLED" ] -} 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 75d3b11..f9bac43 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 @@ -164,6 +164,20 @@ public class CallGraphBuilder { for (String calledMethod : calledMethods) { graph.computeIfAbsent(currentMethodFqn, k -> new ArrayList<>()).add(new CallEdge(calledMethod, args)); } + for (Object argObj : node.arguments()) { + if (argObj instanceof ExpressionMethodReference emr) { + String typeName = emr.getExpression().toString(); + if ("this".equals(typeName) || "super".equals(typeName)) { + TypeDeclaration td = findEnclosingType(node); + if (td != null) { + String refMethod = resolveMethodInType(td, emr.getName().getIdentifier()); + if (refMethod != null) { + graph.computeIfAbsent(currentMethodFqn, k -> new ArrayList<>()).add(new CallEdge(refMethod, args)); + } + } + } + } + } } return super.visit(node); } @@ -215,6 +229,21 @@ public class CallGraphBuilder { } } } + + if (expr instanceof ExpressionMethodReference emr) { + TypeDeclaration td = findEnclosingType(expr); + if (td != null) { + MethodDeclaration md = context.findMethodDeclaration(td, emr.getName().getIdentifier(), true); + if (md != null && md.getBody() != null) { + for (Object stmtObj : md.getBody().statements()) { + if (stmtObj instanceof ReturnStatement rs && rs.getExpression() != null) { + expr = rs.getExpression(); + break; + } + } + } + } + } // Extract from constructor args (e.g., new CustomMessage(OrderEvent.PROCESS, ...)) expr = traceVariable(expr);