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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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);