From 169fae88ab138e0d52635ad478561d5954bfe1bc Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Mon, 13 Jul 2026 18:10:13 +0200 Subject: [PATCH] Export linkResolution in JSON and tighten source-proven trigger scoping. Wire enterprise regression tests for linkResolution, extend REST body enum detection to nested DTOs/records, infer if-branch source states only from provable literals, and fix String/java.lang.String routing equivalence so shared-service scoping stays fail-closed without dropping valid chains. Co-authored-by: Cursor --- .../HeuristicBeanResolutionEngine.java | 25 +- .../service/ExternalTriggerPolicy.java | 37 + .../service/GenericEventDetector.java | 39 +- .../MachineScopeFilterEntryPointTest.java | 38 + ...risticBeanResolutionEngineRoutingTest.java | 1 + ...nterpriseDedicatedEndpointLinkingTest.java | 1 + ...tcherMatchedTransitionsRegressionTest.java | 1 + .../service/ExternalTriggerPolicyTest.java | 36 + .../service/GenericEventDetectorFireTest.java | 66 ++ .../DocumentStateMachineConfiguration.json | 18 +- .../EnterpriseStateMachineConfig.json | 18 +- .../ExtendedStateMachineConfig.json | 776 +++++++++++++++++- .../ExtendedStateMachineConfig.json | 776 +++++++++++++++++- .../InheritanceStateMachineConfig.json | 3 +- .../MavenOrderStateMachine.json | 34 +- .../MavenOrderStateMachine.png | Bin 0 -> 11719 bytes .../OrderStateMachineConfig.json | 3 +- .../OrderStateMachineConfig.png | Bin 0 -> 12135 bytes .../OrderStateMachineConfiguration.json | 15 +- .../PolymorphicStateMachineConfiguration.json | 36 +- .../PolymorphicStateMachineConfiguration.png | Bin 0 -> 22229 bytes ...dardDocumentStateMachineConfiguration.json | 18 +- ...ndardDocumentStateMachineConfiguration.png | Bin 0 -> 21384 bytes ...tandardOrderStateMachineConfiguration.json | 30 +- ...StandardOrderStateMachineConfiguration.png | Bin 0 -> 18775 bytes .../StateMachineConfig.json | 21 +- .../StateMachineConfig/StateMachineConfig.png | Bin 0 -> 22595 bytes .../UserStateMachineConfiguration.json | 15 +- 28 files changed, 1898 insertions(+), 109 deletions(-) create mode 100644 state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.png create mode 100644 state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/OrderStateMachineConfig.png create mode 100644 state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.png create mode 100644 state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.png create mode 100644 state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.png create mode 100644 state_machine_exporter/src/test/resources/golden/StateMachineConfig/StateMachineConfig.png diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngine.java index bd3356c..a053ee2 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngine.java @@ -24,7 +24,7 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { boolean mismatched = false; if (triggerEventFqn != null && machineEventFqn != null) { - if (eraseGenerics(triggerEventFqn).equals(eraseGenerics(machineEventFqn))) { + if (typesEquivalent(triggerEventFqn, machineEventFqn)) { matched = true; } else if (isTypeMismatched(triggerEventFqn, machineEventFqn)) { mismatched = true; @@ -34,7 +34,7 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { } } if (triggerStateFqn != null && machineStateFqn != null) { - if (eraseGenerics(triggerStateFqn).equals(eraseGenerics(machineStateFqn))) { + if (typesEquivalent(triggerStateFqn, machineStateFqn)) { matched = true; } else if (isTypeMismatched(triggerStateFqn, machineStateFqn)) { mismatched = true; @@ -322,6 +322,27 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { return type; } + private boolean typesEquivalent(String type1, String type2) { + if (type1 == null || type2 == null) { + return false; + } + String erased1 = normalizePrimitiveFqn(eraseGenerics(type1)); + String erased2 = normalizePrimitiveFqn(eraseGenerics(type2)); + return erased1.equals(erased2); + } + + private String normalizePrimitiveFqn(String type) { + if (type == null) { + return null; + } + return switch (type) { + case "java.lang.String" -> "String"; + case "java.lang.Object" -> "Object"; + case "java.io.Serializable" -> "Serializable"; + default -> type; + }; + } + private boolean isTypeMismatched(String type1, String type2) { if (type1 == null || type2 == null) return false; type1 = eraseGenerics(type1); diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicy.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicy.java index 50bf852..a67cd61 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicy.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicy.java @@ -5,6 +5,8 @@ import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; import click.kamil.springstatemachineexporter.analysis.resolver.MachineEnumCanonicalizer; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; import org.eclipse.jdt.core.dom.*; +import java.util.HashSet; +import java.util.Set; /** * Single source-derived policy for marking REST triggers as external vs internal. @@ -173,6 +175,9 @@ public final class ExternalTriggerPolicy { if (isEnumDtoField(bodyBinding, fieldName, context)) { return new RestParamBinding(false, false, true, true); } + if (containsNestedEnumField(bodyBinding, fieldName, context)) { + return new RestParamBinding(false, false, true, true); + } } return null; } @@ -218,6 +223,38 @@ public final class ExternalTriggerPolicy { return false; } + private static boolean containsNestedEnumField( + ITypeBinding bodyBinding, String fieldName, CodebaseContext context) { + return containsNestedEnumField(bodyBinding, fieldName, context, new HashSet<>()); + } + + private static boolean containsNestedEnumField( + ITypeBinding bodyBinding, + String fieldName, + CodebaseContext context, + Set visited) { + if (bodyBinding == null || fieldName == null || context == null) { + return false; + } + String bodyFqn = bodyBinding.getQualifiedName(); + if (bodyFqn == null || !visited.add(bodyFqn)) { + return false; + } + for (IVariableBinding component : bodyBinding.getDeclaredFields()) { + ITypeBinding nestedType = component.getType(); + if (nestedType == null || nestedType.isPrimitive() || nestedType.isEnum()) { + continue; + } + if (isEnumRecordComponent(nestedType, fieldName) || isEnumDtoField(nestedType, fieldName, context)) { + return true; + } + if (containsNestedEnumField(nestedType, fieldName, context, visited)) { + return true; + } + } + return false; + } + private static boolean hasParameterAstAnnotation(SingleVariableDeclaration param, String simpleName) { for (Object modifier : param.modifiers()) { if (modifier instanceof Annotation annotation 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 fabb8ca..353e0a7 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 @@ -477,20 +477,15 @@ public class GenericEventDetector { if (isRoutingParameter(left) || isRoutingParameter(right)) { return null; } - - // Usually one is a method call like getState() or a variable like `state` - // and the other is the constant enum like `OrderState.PENDING` or `"PENDING"` - - // If one is a QualifiedName (enum constant) or StringLiteral, it's likely the state - if (left instanceof QualifiedName || left instanceof StringLiteral || left instanceof FieldAccess) { - return getSimpleNameString(left); + + String leftState = resolveProvableStateLiteral(left); + if (leftState != null) { + return leftState; } - if (right instanceof QualifiedName || right instanceof StringLiteral || right instanceof FieldAccess) { - return getSimpleNameString(right); + String rightState = resolveProvableStateLiteral(right); + if (rightState != null) { + return rightState; } - - // Fallback - return getSimpleNameString(right); } } else if (expr instanceof MethodInvocation mi) { String methodName = mi.getName().getIdentifier(); @@ -501,22 +496,12 @@ public class GenericEventDetector { if (isRoutingParameter(receiver) || isRoutingParameter(arg)) { return null; } - - // If receiver is null (e.g., implicit this), fall back to arg - if (receiver == null) { - return getSimpleNameString(arg); + + String receiverState = resolveProvableStateLiteral(receiver); + if (receiverState != null) { + return receiverState; } - - // Prioritize the one that looks like a constant (QualifiedName or StringLiteral) - if (receiver instanceof QualifiedName || receiver instanceof StringLiteral || receiver instanceof FieldAccess) { - return getSimpleNameString(receiver); - } - if (arg instanceof QualifiedName || arg instanceof StringLiteral || arg instanceof FieldAccess) { - return getSimpleNameString(arg); - } - - // Fallback to receiver - return getSimpleNameString(receiver); + return resolveProvableStateLiteral(arg); } } return null; diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilterEntryPointTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilterEntryPointTest.java index c1eb9f5..cbc2f84 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilterEntryPointTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilterEntryPointTest.java @@ -106,6 +106,44 @@ class MachineScopeFilterEntryPointTest { assertThat(orderScoped).isEmpty(); } + @Test + void shouldFilterSharedDispatcherCallChainsByProvenMachineTypes(@TempDir Path tempDir) throws Exception { + writeEnterpriseWebLayer(tempDir); + + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + CallChain payChain = CallChain.builder() + .triggerPoint(TriggerPoint.builder() + .event("com.example.OrderEvent.PAY") + .eventTypeFqn("com.example.OrderEvent") + .stateTypeFqn("com.example.OrderState") + .className("com.example.StateMachineDispatcher") + .methodName("payOrder") + .build()) + .methodChain(List.of("com.example.StateMachineController.payOrder()")) + .build(); + CallChain documentChain = CallChain.builder() + .triggerPoint(TriggerPoint.builder() + .event("com.example.DocumentEvent.SUBMIT") + .eventTypeFqn("com.example.DocumentEvent") + .stateTypeFqn("com.example.DocumentState") + .className("com.example.StateMachineDispatcher") + .methodName("submitDocument") + .build()) + .methodChain(List.of("com.example.StateMachineController.submitDocument()")) + .build(); + + List orderScoped = MachineScopeFilter.filterCallChainsForMachine( + List.of(payChain, documentChain), + "com.example.OrderStateMachineConfiguration", + context); + + assertThat(orderScoped).hasSize(1); + assertThat(orderScoped.get(0).getTriggerPoint().getEvent()).isEqualTo("com.example.OrderEvent.PAY"); + } + private static void writeEnterpriseWebLayer(Path tempDir) throws Exception { Files.writeString(tempDir.resolve("App.java"), """ package com.example; diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngineRoutingTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngineRoutingTest.java index ac1b0cb..1665226 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngineRoutingTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/HeuristicBeanResolutionEngineRoutingTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.io.TempDir; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDedicatedEndpointLinkingTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDedicatedEndpointLinkingTest.java index 54a8eea..c46d87e 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDedicatedEndpointLinkingTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDedicatedEndpointLinkingTest.java @@ -38,6 +38,7 @@ class EnterpriseDedicatedEndpointLinkingTest { assertThat(chain.path("matchedTransitions")).isNotEmpty(); assertThat(chain.path("matchedTransitions").get(0).path("event").asText()) .isEqualTo("click.kamil.enterprise.machines.order.OrderEvent.PAY"); + assertThat(chain.path("linkResolution").asText()).isEqualTo("RESOLVED"); } private static JsonNode findPayEndpointChain(JsonNode machineJson) { diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDispatcherMatchedTransitionsRegressionTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDispatcherMatchedTransitionsRegressionTest.java index b91c9cd..4e7ab8c 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDispatcherMatchedTransitionsRegressionTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/EnterpriseDispatcherMatchedTransitionsRegressionTest.java @@ -37,6 +37,7 @@ class EnterpriseDispatcherMatchedTransitionsRegressionTest { assertThat(chain.path("triggerPoint").path("polymorphicEvents")).isEmpty(); JsonNode matched = chain.path("matchedTransitions"); assertThat(matched.isNull() || (matched.isArray() && matched.isEmpty())).isTrue(); + assertThat(chain.path("linkResolution").asText()).isEqualTo("UNRESOLVED_EXTERNAL"); } private static JsonNode findTransitionEndpointChain(JsonNode machineJson) { diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicyTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicyTest.java index 5d5002e..5a8cf4d 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicyTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/ExternalTriggerPolicyTest.java @@ -119,4 +119,40 @@ class ExternalTriggerPolicyTest { assertThat(ExternalTriggerPolicy.isExternalFromSource( entryPoint, trigger, "com.example.Api.pay", "event", context)).isFalse(); } + + @Test + void requestBodyNestedDtoEnumFieldShouldBeInternal(@TempDir Path tempDir) throws Exception { + String source = """ + package com.example; + import org.springframework.web.bind.annotation.*; + public class Api { + @PostMapping("/pay") + public void pay(@RequestBody OrderRequest request) { + fire(request.details().event()); + } + void fire(OrderEvent event) {} + } + record OrderRequest(OrderDetails details) {} + record OrderDetails(OrderEvent event) {} + enum OrderEvent { PAY } + """; + Files.writeString(tempDir.resolve("Api.java"), source); + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + EntryPoint entryPoint = EntryPoint.builder() + .type(EntryPoint.Type.REST) + .name("POST /pay") + .className("com.example.Api") + .methodName("pay") + .build(); + TriggerPoint trigger = TriggerPoint.builder() + .event("com.example.OrderEvent.PAY") + .polymorphicEvents(List.of("com.example.OrderEvent.PAY")) + .build(); + + assertThat(ExternalTriggerPolicy.isExternalFromSource( + entryPoint, trigger, "com.example.Api.pay", "event", context)).isFalse(); + } } diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorFireTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorFireTest.java index a35dc0a..b86ce3a 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorFireTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorFireTest.java @@ -43,4 +43,70 @@ class GenericEventDetectorFireTest { assertThat(triggers.get(0).getMethodName()).isEqualTo("pay"); assertThat(triggers.get(0).getEvent()).contains("PAY"); } + + @Test + void shouldInferSourceStateFromNonGuardIfLiteralBranch(@TempDir Path tempDir) throws Exception { + String source = """ + package com.example; + enum OrderState { NEW, PAID } + enum OrderEvent { PAY } + class OrderService { + private final StateMachineFacade facade; + OrderService(StateMachineFacade facade) { this.facade = facade; } + public void payWhenPaid(OrderState state) { + if (state == OrderState.PAID) { + facade.sendEvent(OrderEvent.PAY); + } + } + } + class StateMachineFacade { + public void sendEvent(OrderEvent event) {} + } + """; + Files.writeString(tempDir.resolve("OrderService.java"), source); + + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + GenericEventDetector detector = new GenericEventDetector(context, context.getConstantResolver(), List.of()); + org.eclipse.jdt.core.dom.TypeDeclaration td = context.getTypeDeclaration("com.example.OrderService"); + List triggers = detector.detect((org.eclipse.jdt.core.dom.CompilationUnit) td.getRoot()); + + assertThat(triggers).hasSize(1); + assertThat(triggers.get(0).getSourceState()).isEqualTo("PAID"); + } + + @Test + void shouldNotInferSourceStateFromVariableOnlyIfCondition(@TempDir Path tempDir) throws Exception { + String source = """ + package com.example; + enum OrderState { NEW, PAID } + enum OrderEvent { PAY } + class OrderService { + private final StateMachineFacade facade; + OrderService(StateMachineFacade facade) { this.facade = facade; } + public void payWhenPaid(boolean isPaid) { + if (isPaid) { + facade.sendEvent(OrderEvent.PAY); + } + } + } + class StateMachineFacade { + public void sendEvent(OrderEvent event) {} + } + """; + Files.writeString(tempDir.resolve("OrderService.java"), source); + + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + GenericEventDetector detector = new GenericEventDetector(context, context.getConstantResolver(), List.of()); + org.eclipse.jdt.core.dom.TypeDeclaration td = context.getTypeDeclaration("com.example.OrderService"); + List triggers = detector.detect((org.eclipse.jdt.core.dom.CompilationUnit) td.getRoot()); + + assertThat(triggers).hasSize(1); + assertThat(triggers.get(0).getSourceState()).isNull(); + } } diff --git a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json index 89edca0..cebb5bb 100644 --- a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json @@ -297,7 +297,8 @@ "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT", "targetState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", "event" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -335,7 +336,8 @@ "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", "targetState" : "click.kamil.enterprise.machines.document.DocumentState.APPROVED", "event" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -373,7 +375,8 @@ "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", "targetState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT", "event" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -415,7 +418,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -457,7 +461,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -499,7 +504,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json index 0898484..829fa24 100644 --- a/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json @@ -376,7 +376,8 @@ "sourceState" : "String.NEW", "targetState" : "String.CHECK_AVAILABILITY", "event" : "String.PLACE_ORDER" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -414,7 +415,8 @@ "sourceState" : "String.PAID", "targetState" : "String.CANCELLED", "event" : "String.CANCEL_ORDER" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "CUSTOM", @@ -443,7 +445,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" }, { "entryPoint" : { "type" : "REST", @@ -481,7 +484,8 @@ "sourceState" : "String.PENDING_PAYMENT", "targetState" : "String.PAID", "event" : "String.PAY_ORDER" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "JMS", @@ -519,7 +523,8 @@ "sourceState" : "String.PAID", "targetState" : "String.SHIPPED", "event" : "String.SHIP_ORDER" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "RABBIT", @@ -557,7 +562,8 @@ "sourceState" : "String.DELIVERED", "targetState" : "String.RETURNED", "event" : "String.RETURN_ORDER" - } ] + } ], + "linkResolution" : "RESOLVED" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json index 8d59b7f..ba6a2fe 100644 --- a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json @@ -124,6 +124,97 @@ "eventTypeFqn" : "String", "metadata" : { "triggers" : [ { + "event" : "java.lang.String.FINISH", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 34, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.AUDIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/AuditInterceptor.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 16, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.FALLBACK_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.FallbackQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/FallbackQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.PROFILED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ProfiledQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ProfiledQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.SUBMIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processSubmit", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 20, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.CANCEL_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processCancel", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 25, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { "event" : "[LIFECYCLE:RESTORE]", "className" : "click.kamil.examples.statemachine.extended.service.OrderService", "methodName" : "resumeOrder", @@ -136,6 +227,58 @@ "external" : false, "constraint" : null, "ambiguous" : false + }, { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.AUTHORIZE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "processPayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 22, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.CAPTURE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "capturePayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 35, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false }, { "event" : "[LIFECYCLE:RESTORE]", "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", @@ -149,8 +292,54 @@ "external" : false, "constraint" : null, "ambiguous" : false + }, { + "event" : "java.lang.String.REACTIVE_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", + "methodName" : "processReactive", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ReactiveOrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 18, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false } ], "entryPoints" : [ { + "type" : "REST", + "name" : "POST /api/orders/submit", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "submitOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "metadata" : { + "path" : "/api/orders/finish", + "verb" : "POST" + }, + "parameters" : [ ] + }, { "type" : "REST", "name" : "POST /api/orders/resume", "className" : "click.kamil.examples.statemachine.extended.web.OrderController", @@ -167,19 +356,106 @@ } ] }, { "type" : "REST", - "name" : "POST /api/payment/{id}/capture", - "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", - "methodName" : "capturePaymentEndpoint", - "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "name" : "POST /api/orders/reactive", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "reactiveOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", "metadata" : { - "path" : "/api/payment/{id}/capture", + "path" : "/api/orders/reactive", "verb" : "POST" }, "parameters" : [ { - "name" : "id", + "name" : "orderId", "type" : "String", - "annotations" : [ "PathVariable" ] + "annotations" : [ ] } ] + }, { + "type" : "CUSTOM", + "name" : "INTERCEPTOR: AuditInterceptor.preHandle", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : null, + "metadata" : { + "interceptorType" : "Spring MVC Interceptor" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-setter", + "className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController", + "methodName" : "testSetter", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java", + "metadata" : { + "path" : "/test-setter", + "verb" : "GET" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/primary", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testPrimary", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/primary", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/named", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testNamed", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/named", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/qualifier", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testQualifier", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/qualifier", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/fallback", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testFallback", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/fallback", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-concrete", + "className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController", + "methodName" : "testConcrete", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java", + "metadata" : { + "path" : "/test-concrete", + "verb" : "GET" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-field", + "className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController", + "methodName" : "testField", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java", + "metadata" : { + "path" : "/test-field", + "verb" : "GET" + }, + "parameters" : [ ] }, { "type" : "REST", "name" : "GET /api/base/{id}", @@ -195,8 +471,128 @@ "type" : "String", "annotations" : [ "PathVariable" ] } ] + }, { + "type" : "REST", + "name" : "POST /api/payment/{id}/capture", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "capturePaymentEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/payment/{id}/capture", + "verb" : "POST" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] } ], "callChains" : [ { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/submit", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "submitOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.SUBMIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processSubmit", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 20, + "polymorphicEvents" : [ "java.lang.String.SUBMIT_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.PROCESSING", + "event" : "String.SUBMIT_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/cancel", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "cancelOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.CANCEL_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processCancel", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.PROCESSING", + "lineNumber" : 25, + "polymorphicEvents" : [ "java.lang.String.CANCEL_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.PROCESSING", + "targetState" : "String.CANCELLED", + "event" : "String.CANCEL_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/finish", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "metadata" : { + "path" : "/api/orders/finish", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.finishOrder" ], + "triggerPoint" : { + "event" : "java.lang.String.FINISH", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.PROCESSING", + "lineNumber" : 34, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.PROCESSING", + "targetState" : "String.COMPLETED", + "event" : "String.FINISH" + } ], + "linkResolution" : "RESOLVED" + }, { "entryPoint" : { "type" : "REST", "name" : "POST /api/orders/resume", @@ -229,7 +625,368 @@ "ambiguous" : false }, "contextMachineId" : "orderId", - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : null + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/reactive", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "reactiveOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.REACTIVE_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", + "methodName" : "processReactive", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ReactiveOrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 18, + "polymorphicEvents" : [ "java.lang.String.REACTIVE_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.PROCESSING", + "event" : "String.REACTIVE_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "CUSTOM", + "name" : "INTERCEPTOR: AuditInterceptor.preHandle", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : null, + "metadata" : { + "interceptorType" : "Spring MVC Interceptor" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.AuditInterceptor.preHandle" ], + "triggerPoint" : { + "event" : "java.lang.String.AUDIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/AuditInterceptor.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 16, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.START", + "event" : "String.AUDIT_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-setter", + "className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController", + "methodName" : "testSetter", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java", + "metadata" : { + "path" : "/test-setter", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.SetterInjectionController.testSetter", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/primary", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testPrimary", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/primary", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testPrimary", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/named", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testNamed", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/named", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testNamed", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/qualifier", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testQualifier", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/qualifier", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testQualifier", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/fallback", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testFallback", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/fallback", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testFallback", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-concrete", + "className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController", + "methodName" : "testConcrete", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java", + "metadata" : { + "path" : "/test-concrete", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController.testConcrete", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-field", + "className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController", + "methodName" : "testField", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java", + "metadata" : { + "path" : "/test-field", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.FieldInjectionController.testField", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /api/base/{id}", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "processBaseEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/base/{id}", + "verb" : "GET" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.processBaseEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.processPayment" ], + "triggerPoint" : { + "event" : "java.lang.String.AUTHORIZE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "processPayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 22, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/payment/{id}/capture", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "capturePaymentEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/payment/{id}/capture", + "verb" : "POST" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ], + "triggerPoint" : { + "event" : "java.lang.String.CAPTURE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "capturePayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 35, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : "paymentId", + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" }, { "entryPoint" : { "type" : "REST", @@ -263,7 +1020,8 @@ "ambiguous" : false }, "contextMachineId" : "paymentId", - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : null } ], "properties" : { "default" : { diff --git a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json index 8d59b7f..ba6a2fe 100644 --- a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json @@ -124,6 +124,97 @@ "eventTypeFqn" : "String", "metadata" : { "triggers" : [ { + "event" : "java.lang.String.FINISH", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 34, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.AUDIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/AuditInterceptor.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 16, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.FALLBACK_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.FallbackQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/FallbackQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.PROFILED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ProfiledQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ProfiledQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.SUBMIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processSubmit", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 20, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.CANCEL_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processCancel", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 25, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { "event" : "[LIFECYCLE:RESTORE]", "className" : "click.kamil.examples.statemachine.extended.service.OrderService", "methodName" : "resumeOrder", @@ -136,6 +227,58 @@ "external" : false, "constraint" : null, "ambiguous" : false + }, { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.AUTHORIZE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "processPayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 22, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.CAPTURE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "capturePayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 35, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false }, { "event" : "[LIFECYCLE:RESTORE]", "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", @@ -149,8 +292,54 @@ "external" : false, "constraint" : null, "ambiguous" : false + }, { + "event" : "java.lang.String.REACTIVE_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", + "methodName" : "processReactive", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ReactiveOrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 18, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false } ], "entryPoints" : [ { + "type" : "REST", + "name" : "POST /api/orders/submit", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "submitOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "metadata" : { + "path" : "/api/orders/finish", + "verb" : "POST" + }, + "parameters" : [ ] + }, { "type" : "REST", "name" : "POST /api/orders/resume", "className" : "click.kamil.examples.statemachine.extended.web.OrderController", @@ -167,19 +356,106 @@ } ] }, { "type" : "REST", - "name" : "POST /api/payment/{id}/capture", - "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", - "methodName" : "capturePaymentEndpoint", - "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "name" : "POST /api/orders/reactive", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "reactiveOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", "metadata" : { - "path" : "/api/payment/{id}/capture", + "path" : "/api/orders/reactive", "verb" : "POST" }, "parameters" : [ { - "name" : "id", + "name" : "orderId", "type" : "String", - "annotations" : [ "PathVariable" ] + "annotations" : [ ] } ] + }, { + "type" : "CUSTOM", + "name" : "INTERCEPTOR: AuditInterceptor.preHandle", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : null, + "metadata" : { + "interceptorType" : "Spring MVC Interceptor" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-setter", + "className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController", + "methodName" : "testSetter", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java", + "metadata" : { + "path" : "/test-setter", + "verb" : "GET" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/primary", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testPrimary", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/primary", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/named", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testNamed", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/named", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/qualifier", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testQualifier", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/qualifier", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "POST /api/quirk/fallback", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testFallback", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/fallback", + "verb" : "POST" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-concrete", + "className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController", + "methodName" : "testConcrete", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java", + "metadata" : { + "path" : "/test-concrete", + "verb" : "GET" + }, + "parameters" : [ ] + }, { + "type" : "REST", + "name" : "GET /test-field", + "className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController", + "methodName" : "testField", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java", + "metadata" : { + "path" : "/test-field", + "verb" : "GET" + }, + "parameters" : [ ] }, { "type" : "REST", "name" : "GET /api/base/{id}", @@ -195,8 +471,128 @@ "type" : "String", "annotations" : [ "PathVariable" ] } ] + }, { + "type" : "REST", + "name" : "POST /api/payment/{id}/capture", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "capturePaymentEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/payment/{id}/capture", + "verb" : "POST" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] } ], "callChains" : [ { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/submit", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "submitOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.SUBMIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processSubmit", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 20, + "polymorphicEvents" : [ "java.lang.String.SUBMIT_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.PROCESSING", + "event" : "String.SUBMIT_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/cancel", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "cancelOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.CANCEL_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.OrderService", + "methodName" : "processCancel", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/OrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.PROCESSING", + "lineNumber" : 25, + "polymorphicEvents" : [ "java.lang.String.CANCEL_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.PROCESSING", + "targetState" : "String.CANCELLED", + "event" : "String.CANCEL_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/finish", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "metadata" : { + "path" : "/api/orders/finish", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.finishOrder" ], + "triggerPoint" : { + "event" : "java.lang.String.FINISH", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "finishOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.PROCESSING", + "lineNumber" : 34, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.PROCESSING", + "targetState" : "String.COMPLETED", + "event" : "String.FINISH" + } ], + "linkResolution" : "RESOLVED" + }, { "entryPoint" : { "type" : "REST", "name" : "POST /api/orders/resume", @@ -229,7 +625,368 @@ "ambiguous" : false }, "contextMachineId" : "orderId", - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : null + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/orders/reactive", + "className" : "click.kamil.examples.statemachine.extended.web.OrderController", + "methodName" : "reactiveOrder", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java", + "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" : "java.lang.String.REACTIVE_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.ReactiveOrderService", + "methodName" : "processReactive", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ReactiveOrderService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 18, + "polymorphicEvents" : [ "java.lang.String.REACTIVE_EVENT" ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.PROCESSING", + "event" : "String.REACTIVE_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "CUSTOM", + "name" : "INTERCEPTOR: AuditInterceptor.preHandle", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : null, + "metadata" : { + "interceptorType" : "Spring MVC Interceptor" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.AuditInterceptor.preHandle" ], + "triggerPoint" : { + "event" : "java.lang.String.AUDIT_EVENT", + "className" : "click.kamil.examples.statemachine.extended.web.AuditInterceptor", + "methodName" : "preHandle", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/AuditInterceptor.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : "java.lang.String.START", + "lineNumber" : 16, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : [ { + "sourceState" : "String.START", + "targetState" : "String.START", + "event" : "String.AUDIT_EVENT" + } ], + "linkResolution" : "RESOLVED" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-setter", + "className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController", + "methodName" : "testSetter", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java", + "metadata" : { + "path" : "/test-setter", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.SetterInjectionController.testSetter", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/primary", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testPrimary", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/primary", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testPrimary", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/named", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testNamed", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/named", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testNamed", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/qualifier", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testQualifier", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/qualifier", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testQualifier", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/quirk/fallback", + "className" : "click.kamil.examples.statemachine.extended.web.QuirkController", + "methodName" : "testFallback", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java", + "metadata" : { + "path" : "/api/quirk/fallback", + "verb" : "POST" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testFallback", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.PRIMARY_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 19, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-concrete", + "className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController", + "methodName" : "testConcrete", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java", + "metadata" : { + "path" : "/test-concrete", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController.testConcrete", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.QUALIFIER_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /test-field", + "className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController", + "methodName" : "testField", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java", + "metadata" : { + "path" : "/test-field", + "verb" : "GET" + }, + "parameters" : [ ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.FieldInjectionController.testField", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ], + "triggerPoint" : { + "event" : "java.lang.String.NAMED_EVENT", + "className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService", + "methodName" : "doQuirk", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 17, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "GET /api/base/{id}", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "processBaseEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/base/{id}", + "verb" : "GET" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.processBaseEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.processPayment" ], + "triggerPoint" : { + "event" : "java.lang.String.AUTHORIZE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "processPayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 22, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : null, + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" + }, { + "entryPoint" : { + "type" : "REST", + "name" : "POST /api/payment/{id}/capture", + "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", + "methodName" : "capturePaymentEndpoint", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java", + "metadata" : { + "path" : "/api/payment/{id}/capture", + "verb" : "POST" + }, + "parameters" : [ { + "name" : "id", + "type" : "String", + "annotations" : [ "PathVariable" ] + } ] + }, + "methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ], + "triggerPoint" : { + "event" : "java.lang.String.CAPTURE", + "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", + "methodName" : "capturePayment", + "sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java", + "sourceModule" : null, + "stateMachineId" : null, + "sourceState" : null, + "lineNumber" : 35, + "polymorphicEvents" : [ ], + "external" : false, + "constraint" : null, + "ambiguous" : false + }, + "contextMachineId" : "paymentId", + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" }, { "entryPoint" : { "type" : "REST", @@ -263,7 +1020,8 @@ "ambiguous" : false }, "contextMachineId" : "paymentId", - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : null } ], "properties" : { "default" : { diff --git a/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json index 8b474bd..87db0a5 100644 --- a/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json @@ -91,7 +91,8 @@ "sourceState" : "String.START", "targetState" : "String.WORKING", "event" : "String.INHERITED_SUBMIT" - } ] + } ], + "linkResolution" : "RESOLVED" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json index 09f2406..4c0f68d 100644 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json +++ b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json @@ -59,7 +59,33 @@ "stateTypeFqn" : "String", "eventTypeFqn" : "String", "metadata" : { - "triggers" : [ ], + "triggers" : [ { + "event" : "java.lang.String.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, + "sourceState" : null, + "lineNumber" : 40, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + }, { + "event" : "java.lang.String.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, + "sourceState" : null, + "lineNumber" : 52, + "polymorphicEvents" : null, + "external" : false, + "constraint" : null, + "ambiguous" : false + } ], "entryPoints" : [ { "type" : "REST", "name" : "POST /maven/orders/submit", @@ -128,7 +154,8 @@ "sourceState" : "String.INIT", "targetState" : "String.BUSY", "event" : "String.SUBMIT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "JMS", @@ -166,7 +193,8 @@ "sourceState" : "String.BUSY", "targetState" : "String.DONE", "event" : "String.ORDER_EVENT" - } ] + } ], + "linkResolution" : "RESOLVED" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.png b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab7953b808da633857cf24413ea68ad1d437a06 GIT binary patch literal 11719 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 z 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 VYHjK?f{yna4^*{P%9PAQ{ukX`PU-*v literal 0 HcmV?d00001 diff --git a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json index 7583329..be54139 100644 --- a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json @@ -259,7 +259,8 @@ "sourceState" : "click.kamil.enterprise.machines.order.OrderState.NEW", "targetState" : "click.kamil.enterprise.machines.order.OrderState.PENDING", "event" : "click.kamil.enterprise.machines.order.OrderEvent.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -297,7 +298,8 @@ "sourceState" : "click.kamil.enterprise.machines.order.OrderState.PENDING", "targetState" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED", "event" : "click.kamil.enterprise.machines.order.OrderEvent.SHIP" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -339,7 +341,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -381,7 +384,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -423,7 +427,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json index e7b0a41..b17f969 100644 --- a/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json @@ -299,7 +299,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -333,7 +334,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.FULFILL" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -367,7 +369,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.CANCEL" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -401,7 +404,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -435,7 +439,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -469,7 +474,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -503,7 +509,8 @@ "ambiguous" : true }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "AMBIGUOUS_WIDEN" }, { "entryPoint" : { "type" : "REST", @@ -537,7 +544,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -571,7 +579,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.FULFILL" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -605,7 +614,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.CANCEL" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -639,7 +649,8 @@ "sourceState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID", "targetState" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED", "event" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.ABCD" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -669,7 +680,8 @@ "ambiguous" : true }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "AMBIGUOUS_WIDEN" } ], "properties" : { "default" : { diff --git a/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.png b/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..7aff84a17bf9d7bacccc11b1f06a36c20b18ca9a GIT binary patch literal 22229 zcmdqJbyQWs+doQkfJ2vbHwe;BeV_wW0M%jMa#_sl$d_RRB%$4I!U0yZW&CISKi_6tQ>4Fm+lAn+#%f&_l~ zMp~l_{$h8N({(d#Zv~ojGuyn9=F?F-Fpf&TNwRUrJauwm`cCs^daC5h}dur}z z?=jd%gMffUYon>__CLQPAcE(-%glN;<1j6S=eJOq#?Jjh3y&F&7zMAYW+;B4&XZ8e zT1s+YqCMF(u}`j4cJK3VjX+7=+w0^rpX>Uc4;$JPr78&pt1m086V(;B z_@^EJl;p~@<7v?9IfcE~a}aEY|Bl)SQ?3rJmk#}F=fddSEB7f?FP=Qa5v9H0h*!M^ z@6X4QaRct}9R#USIn!pOduT16>v62>7LPQtCl+-%<2z?Zp{BHUB~(01#`x1W;Zyk# zzE8YZVs>xY0x`D*us*Pv8!~F|+*Eg=TDrVmc1_6@8}zp-24oEwY6_2wVT7+1~6)RQL*d?(TdF}%EQpvg+45-EA82 zy<=3^xjhGjGK0%-uSTa^4=%`jva7d5FUz5c8k*Z=OqK2luek2r zdripEf_YAj$LCP*Qr}d19$WRo7L7YmFmR+N|=q!6JTqI{} zC(qeWxZTc=$<9TfkwC;>J-sYV@^O)7CHigrpOCfY0Y;=ds*nd zL~=L3z5Es)-uf8tM8B5uR*0fktfY^ir^2s}rl-%22r@&(kDoW7m9nNwLZC|u!NI_I z0kO%ynD=>l^RPE)S^KGpF?H4Do9BhEwj|?=vQ&)cbuOcA5T_`hNCmWLYQ(!tc?Qh z+>Okkc?xmVS65fQQ6ZSLWb~XE3JMBFuWdWSuqiHyFo>miWpxR_*wzaQn4#2SX=({@ zL~wt1d_uxVjis`YzOACQHS3qBrVb!1(H&h~!KBIQuD6%Y60bXFAIBS9Tg%7IF7O77 z*|#y|2M8o*n7-K4{QgGwol7?iR}f!aDCtwfMY)1?N@1t>YNPEF|T4I;nM%9to$Bv*`_NY~jpY|T&Odx%*1Z2Xz+SaDDg zk_49w)nh;vJUq_xUwnL5P?CwyAkWCeboAe0Ra8<^B6(^!+3e+Nm z`0?Y_9;9C8f49!caFYxnc5XX2HtE zCnU%Qi)GTp0@3PNB_;8ikBm|qvon7#70(&zP5-N* z7nUte?MWX@PjLAaLkqkHUBO(~DhA1%|WR4+qal zzppL*>932%n(f4$?tks|yu2COmM?h|NM@>%Midt63}pZ<5IW5gqNpW>qN zv(v>nR@8?ViZAHP z_Tbu#)VqXewkGD@l?JcT3{oAJoiGSpc<5&KEx|2m6E3wb+NO#)(6jWYFYK^ z9LT_B`h#AB{HZfspPLcZpz3cr(m40jhU_`$K_Z^2hsXk(#kthIpYQ&EA^ z`zP%gH##~BlaWc|>7cqf?82qPQ$(D{oIY|K?-3Vaf!%EoQeIc4C3I5xNm1LE8KoEP*9mr-eRMRNJo3$7R-=Yi9XVil9HAies@B2z%f&& z`viUYi5In6apQDrG#+`Z5yX~=KGZLV?eV}Cjh_|rIvEh6+jl1oMc5FRQ&FA6mL{LPaZ>rHzbx_@bILJXUoh|&pi3@^GQy2A8SuF@_un2?T@#O zK@`}FR~GU+ma40kU_4q*F7)c=CXVts z!HvY_Vz9XPDIR;@FnGD-ig{d<2pnbFUpph+_h-p=VBt93t<%Vg?a4DByUQckyiv&# z(NbmM=O=11Z1Q*+Zvjz-!{K=Oh%J(ij?VK;%&?P

WE8tF=_{A%AUxQVBaDbPim9 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 literal 0 HcmV?d00001 diff --git a/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json index 08bc5f7..cbb3d17 100644 --- a/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json @@ -213,7 +213,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.SUBMIT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -247,7 +248,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.APPROVE" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -281,7 +283,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.REJECT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -319,7 +322,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.SUBMIT" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -357,7 +361,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.APPROVE" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -395,7 +400,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED", "targetState" : "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED", "event" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.REJECT" - } ] + } ], + "linkResolution" : "RESOLVED" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.png b/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..d046627550e3c4cba1dbc917e93642fc9f7c9c09 GIT binary patch literal 21384 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 literal 0 HcmV?d00001 diff --git a/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json index 3e173d9..24d7e42 100644 --- a/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json @@ -257,7 +257,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -291,7 +292,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -325,7 +327,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.CANCEL" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -359,7 +362,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -393,7 +397,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -427,7 +432,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -461,7 +467,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -499,7 +506,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -537,7 +545,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -575,7 +584,8 @@ "sourceState" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID", "targetState" : "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED", "event" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.CANCEL" - } ] + } ], + "linkResolution" : "RESOLVED" } ], "properties" : { "default" : { } diff --git a/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.png b/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..665ef05cb214bcd2340e55bef7247a4357bb569d GIT binary patch literal 18775 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 TM(aSDFWWIoJKR02cijH~m_80P literal 0 HcmV?d00001 diff --git a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json index 665f567..331debf 100644 --- a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json @@ -252,7 +252,8 @@ "sourceState" : "click.kamil.enterprise.machines.user.UserState.REGISTERED", "targetState" : "click.kamil.enterprise.machines.user.UserState.VERIFIED", "event" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY" - } ] + } ], + "linkResolution" : "RESOLVED" }, { "entryPoint" : { "type" : "REST", @@ -286,7 +287,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "NO_MATCH" }, { "entryPoint" : { "type" : "REST", @@ -328,7 +330,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -370,7 +373,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" }, { "entryPoint" : { "type" : "REST", @@ -412,7 +416,8 @@ "ambiguous" : false }, "contextMachineId" : null, - "matchedTransitions" : null + "matchedTransitions" : null, + "linkResolution" : "UNRESOLVED_EXTERNAL" } ], "properties" : { "default" : { }