diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilter.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilter.java index aa8333f..29c7d88 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilter.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/MachineScopeFilter.java @@ -6,6 +6,7 @@ import click.kamil.springstatemachineexporter.analysis.model.CallChain; import click.kamil.springstatemachineexporter.analysis.model.EntryPoint; import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; +import click.kamil.springstatemachineexporter.model.Transition; import java.util.ArrayList; import java.util.List; @@ -22,12 +23,20 @@ public final class MachineScopeFilter { public static List filterTriggersForMachine( List triggers, String machineName, CodebaseContext context) { + return filterTriggersForMachine(triggers, machineName, context, null); + } + + public static List filterTriggersForMachine( + List triggers, + String machineName, + CodebaseContext context, + List machineTransitions) { if (triggers == null || machineName == null) { return triggers == null ? List.of() : triggers; } List filtered = new ArrayList<>(); for (TriggerPoint trigger : triggers) { - if (isTriggerForMachine(trigger, machineName, context)) { + if (isTriggerForMachine(trigger, machineName, context, machineTransitions)) { filtered.add(trigger); } } @@ -36,12 +45,20 @@ public final class MachineScopeFilter { public static List filterCallChainsForMachine( List chains, String machineName, CodebaseContext context) { + return filterCallChainsForMachine(chains, machineName, context, null); + } + + public static List filterCallChainsForMachine( + List chains, + String machineName, + CodebaseContext context, + List machineTransitions) { if (chains == null || machineName == null) { return chains == null ? List.of() : chains; } List filtered = new ArrayList<>(); for (CallChain chain : chains) { - if (ROUTING.isRoutedToCorrectMachine(chain, machineName, context)) { + if (ROUTING.hasProvenMachineAffinity(chain, machineName, context, machineTransitions)) { filtered.add(chain); } } @@ -84,11 +101,12 @@ public final class MachineScopeFilter { return false; } - private static boolean isTriggerForMachine(TriggerPoint trigger, String machineName, CodebaseContext context) { + private static boolean isTriggerForMachine( + TriggerPoint trigger, String machineName, CodebaseContext context, List machineTransitions) { if (trigger == null) { return false; } CallChain probe = CallChain.builder().triggerPoint(trigger).methodChain(List.of()).build(); - return ROUTING.isRoutedToCorrectMachine(probe, machineName, context); + return ROUTING.hasProvenMachineAffinity(probe, machineName, context, machineTransitions); } } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java index 1710ed0..35019dd 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java @@ -83,7 +83,7 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { Map canonicalSourceBySimplified = new LinkedHashMap<>(); for (Transition t : stateMachineTransitions) { if (t.getEvent() != null && matchingEngine.matches(t.getEvent(), tp) - && isRoutedToCorrectMachine(chain, result.getName(), context) + && isRoutedToCorrectMachine(chain, result.getName(), context, stateMachineTransitions) && isConstraintCompatible(tp.getConstraint(), result.getName())) { String smEventForLink = canonicalEvent(t.getEvent()); for (State smSourceState : t.getSourceStates()) { @@ -125,7 +125,7 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { .targetState(smSourceForLink) .event(smEventForLink) .build(); - if (isRoutedToCorrectMachine(chain, result.getName(), context) + if (isRoutedToCorrectMachine(chain, result.getName(), context, stateMachineTransitions) && isConstraintCompatible(tp.getConstraint(), result.getName())) { matched.add(mt); } @@ -137,7 +137,7 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { .targetState(targetForLink) .event(smEventForLink) .build(); - if (isRoutedToCorrectMachine(chain, result.getName(), context) + if (isRoutedToCorrectMachine(chain, result.getName(), context, stateMachineTransitions) && isConstraintCompatible(tp.getConstraint(), result.getName())) { matched.add(mt); } @@ -172,14 +172,16 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { } List scopedTriggers = MachineScopeFilter.filterTriggersForMachine( - result.getMetadata().getTriggers(), result.getName(), context); + result.getMetadata().getTriggers(), result.getName(), context, stateMachineTransitions); + List scopedChains = MachineScopeFilter.filterCallChainsForMachine( + updatedChains, result.getName(), context, stateMachineTransitions); List scopedEntryPoints = EntryPointScopeResolver.scopeFromCallChains( - updatedChains, result.getMetadata().getEntryPoints()); + scopedChains, result.getMetadata().getEntryPoints()); CodebaseMetadata updatedMetadata = CodebaseMetadata.builder() .triggers(scopedTriggers) .entryPoints(scopedEntryPoints) - .callChains(updatedChains) + .callChains(scopedChains) .properties(result.getMetadata().getProperties()) .build(); @@ -187,8 +189,9 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { } - private boolean isRoutedToCorrectMachine(CallChain chain, String currentMachineName, CodebaseContext context) { - return routingEngine.isRoutedToCorrectMachine(chain, currentMachineName, context); + private boolean isRoutedToCorrectMachine( + CallChain chain, String currentMachineName, CodebaseContext context, List machineTransitions) { + return routingEngine.hasProvenMachineAffinity(chain, currentMachineName, context, machineTransitions); } private boolean isConstraintCompatible(String constraint, String machineName) { diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java index f00225f..4baeea7 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java @@ -88,9 +88,10 @@ public class StrictFqnMatchingEngine implements EventMatchingEngine { if (!tConst.equals(smConst)) return false; - // Prevent matching string/primitive triggers to enum transitions + // String-typed triggers may match configured string transition events by constant name. if (isStringTypeOrPrimitive(eventTypeFqn) && smEvent.contains(".") && !triggerEvent.contains(".")) { - return false; + String smEnumType = smEvent.substring(0, smEvent.lastIndexOf('.')); + return isStringTypeOrPrimitive(smEnumType); } // Prevent matching enum triggers to string transitions diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/BeanResolutionEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/BeanResolutionEngine.java index 7812373..7e79866 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/BeanResolutionEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/routing/BeanResolutionEngine.java @@ -2,8 +2,19 @@ package click.kamil.springstatemachineexporter.analysis.enricher.routing; import click.kamil.springstatemachineexporter.analysis.model.CallChain; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; +import click.kamil.springstatemachineexporter.model.Transition; + +import java.util.List; public interface BeanResolutionEngine { boolean isRoutedToCorrectMachine(CallChain chain, String currentMachineName, CodebaseContext context); + + default boolean hasProvenMachineAffinity( + CallChain chain, + String currentMachineName, + CodebaseContext context, + List machineTransitions) { + return isRoutedToCorrectMachine(chain, currentMachineName, context); + } } 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 b008d55..689472b 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 @@ -1,23 +1,76 @@ package click.kamil.springstatemachineexporter.analysis.enricher.routing; +import click.kamil.springstatemachineexporter.analysis.enricher.matching.StrictFqnMatchingEngine; import click.kamil.springstatemachineexporter.analysis.model.CallChain; +import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; import click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver; import click.kamil.springstatemachineexporter.ast.common.AstUtils; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; +import click.kamil.springstatemachineexporter.model.Transition; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.TypeDeclaration; import java.util.HashSet; +import java.util.List; import java.util.Set; public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { + private final StrictFqnMatchingEngine matchingEngine = new StrictFqnMatchingEngine(); + + private enum DistinctTypeAffinity { + FOR_MACHINE, + AGAINST_MACHINE, + UNKNOWN + } + + @Override + public boolean hasProvenMachineAffinity( + CallChain chain, + String currentMachineName, + CodebaseContext context, + List machineTransitions) { + if (chain == null) { + return false; + } + if (currentMachineName == null) { + return isRoutedToCorrectMachine(chain, currentMachineName, context); + } + + String explicitTarget = resolveExplicitTarget(chain); + if (explicitTarget != null && !explicitTarget.isEmpty() && context != null) { + Boolean namedTarget = resolveNamedBeanTarget(explicitTarget, currentMachineName, context); + if (namedTarget != null) { + return namedTarget; + } + } + + if (chain.getTriggerPoint() != null && context != null) { + DistinctTypeAffinity typeAffinity = + resolveDistinctTypeAffinity(chain.getTriggerPoint(), currentMachineName, context); + if (typeAffinity == DistinctTypeAffinity.FOR_MACHINE) { + return true; + } + if (typeAffinity == DistinctTypeAffinity.AGAINST_MACHINE) { + return false; + } + } + + if (context == null || isSingleStateMachine(context)) { + return isRoutedToCorrectMachine(chain, currentMachineName, context); + } + + TriggerPoint trigger = chain.getTriggerPoint(); + if (trigger != null && matchesConfiguredTransitionEvent(trigger, machineTransitions)) { + return true; + } + + return false; + } + @Override public boolean isRoutedToCorrectMachine(CallChain chain, String currentMachineName, CodebaseContext context) { - String explicitTarget = chain.getContextMachineId(); - if (explicitTarget == null && chain.getTriggerPoint() != null) { - explicitTarget = chain.getTriggerPoint().getStateMachineId(); - } + String explicitTarget = resolveExplicitTarget(chain); if (explicitTarget != null && !explicitTarget.isEmpty() && context != null && currentMachineName != null) { Boolean namedTarget = resolveNamedBeanTarget(explicitTarget, currentMachineName, context); if (namedTarget != null) { @@ -59,7 +112,11 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { } } if (matched) { - return true; + if (!isAmbiguousSharedGenericMatch( + triggerEventFqn, triggerStateFqn, machineStateFqn, machineEventFqn) + || isSingleStateMachine(context)) { + return true; + } } if (mismatched) { return false; @@ -144,6 +201,105 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine { return context == null || isSingleStateMachine(context); } + private static String resolveExplicitTarget(CallChain chain) { + if (chain == null) { + return null; + } + String explicitTarget = chain.getContextMachineId(); + if (explicitTarget == null && chain.getTriggerPoint() != null) { + explicitTarget = chain.getTriggerPoint().getStateMachineId(); + } + return explicitTarget; + } + + private DistinctTypeAffinity resolveDistinctTypeAffinity( + TriggerPoint trigger, String machineName, CodebaseContext context) { + String triggerEventFqn = trigger.getEventTypeFqn(); + String triggerStateFqn = trigger.getStateTypeFqn(); + if (triggerEventFqn == null && triggerStateFqn == null) { + return DistinctTypeAffinity.UNKNOWN; + } + + String[] machineTypes = StateMachineTypeResolver.resolve(machineName, context); + String machineStateFqn = machineTypes[0]; + String machineEventFqn = machineTypes[1]; + + boolean matched = false; + boolean mismatched = false; + + if (triggerEventFqn != null && machineEventFqn != null) { + if (typesEquivalent(triggerEventFqn, machineEventFqn) + && !isAmbiguousSharedGenericType(triggerEventFqn)) { + matched = true; + } else if (isDistinctTypeMismatched(triggerEventFqn, machineEventFqn)) { + mismatched = true; + } + } + if (triggerStateFqn != null && machineStateFqn != null) { + if (typesEquivalent(triggerStateFqn, machineStateFqn) + && !isAmbiguousSharedGenericType(triggerStateFqn)) { + matched = true; + } else if (isDistinctTypeMismatched(triggerStateFqn, machineStateFqn)) { + mismatched = true; + } + } + + if (matched) { + return DistinctTypeAffinity.FOR_MACHINE; + } + if (mismatched) { + return DistinctTypeAffinity.AGAINST_MACHINE; + } + return DistinctTypeAffinity.UNKNOWN; + } + + private boolean matchesConfiguredTransitionEvent(TriggerPoint trigger, List machineTransitions) { + if (trigger == null || machineTransitions == null || machineTransitions.isEmpty()) { + return false; + } + for (Transition transition : machineTransitions) { + if (transition.getEvent() != null && matchingEngine.matches(transition.getEvent(), trigger)) { + return true; + } + } + return false; + } + + private boolean isAmbiguousSharedGenericMatch( + String triggerEventFqn, + String triggerStateFqn, + String machineStateFqn, + String machineEventFqn) { + boolean eventShared = triggerEventFqn != null + && machineEventFqn != null + && typesEquivalent(triggerEventFqn, machineEventFqn) + && isAmbiguousSharedGenericType(triggerEventFqn); + boolean stateShared = triggerStateFqn != null + && machineStateFqn != null + && typesEquivalent(triggerStateFqn, machineStateFqn) + && isAmbiguousSharedGenericType(triggerStateFqn); + return eventShared || stateShared; + } + + private boolean isAmbiguousSharedGenericType(String typeFqn) { + return isErasedOrOpaqueType(typeFqn) || isStringType(typeFqn); + } + + private boolean isDistinctTypeMismatched(String type1, String type2) { + if (isAmbiguousSharedGenericType(type1) || isAmbiguousSharedGenericType(type2)) { + return false; + } + return isTypeMismatched(type1, type2); + } + + private boolean isStringType(String typeFqn) { + if (typeFqn == null) { + return false; + } + String erased = eraseGenerics(typeFqn); + return "java.lang.String".equals(erased) || "String".equals(erased); + } + private Boolean resolveNamedBeanTarget(String beanName, String currentMachineName, CodebaseContext context) { String normalized = stripAnnotationQuotes(beanName); if (normalized == null || normalized.isEmpty()) { 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 cbc2f84..34ae70c 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 @@ -144,6 +144,79 @@ class MachineScopeFilterEntryPointTest { assertThat(orderScoped.get(0).getTriggerPoint().getEvent()).isEqualTo("com.example.OrderEvent.PAY"); } + @Test + void shouldExcludeOrderAndAuditChainsFromPaymentMachineExport(@TempDir Path tempDir) throws Exception { + writeExtendedStringMachineSample(tempDir); + + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + CallChain orderSubmit = CallChain.builder() + .entryPoint(EntryPoint.builder() + .type(EntryPoint.Type.REST) + .name("POST /api/orders/submit") + .className("com.example.OrderController") + .methodName("submitOrder") + .build()) + .methodChain(List.of( + "com.example.OrderController.submitOrder", + "com.example.OrderService.processSubmit")) + .triggerPoint(TriggerPoint.builder() + .event("java.lang.String.SUBMIT_EVENT") + .eventTypeFqn("java.lang.String") + .stateTypeFqn("java.lang.String") + .className("com.example.OrderService") + .methodName("processSubmit") + .build()) + .build(); + CallChain paymentAuthorize = CallChain.builder() + .methodChain(List.of("com.example.PaymentService.processPayment")) + .triggerPoint(TriggerPoint.builder() + .event("java.lang.String.AUTHORIZE") + .eventTypeFqn("java.lang.String") + .stateTypeFqn("java.lang.String") + .stateMachineId("paymentStateMachine") + .className("com.example.PaymentService") + .methodName("processPayment") + .build()) + .build(); + + List paymentScoped = MachineScopeFilter.filterCallChainsForMachine( + List.of(orderSubmit, paymentAuthorize), + "com.example.PaymentStateMachineConfig", + context, + List.of()); + + assertThat(paymentScoped).hasSize(1); + assertThat(paymentScoped.get(0).getTriggerPoint().getEvent()).isEqualTo("java.lang.String.AUTHORIZE"); + } + + private static void writeExtendedStringMachineSample(Path tempDir) throws Exception { + Files.writeString(tempDir.resolve("Machines.java"), """ + package com.example; + @org.springframework.statemachine.config.EnableStateMachine(name = "paymentStateMachine") + public class PaymentStateMachineConfig + extends org.springframework.statemachine.config.StateMachineConfigurerAdapter {} + @org.springframework.statemachine.config.EnableStateMachine(name = "extendedStateMachine") + public class ExtendedStateMachineConfig + extends org.springframework.statemachine.config.StateMachineConfigurerAdapter {} + class OrderController { + private final OrderService orderService = new OrderService(); + public void submitOrder() { orderService.processSubmit(); } + } + class OrderService { + org.springframework.statemachine.StateMachine stateMachine; + public void processSubmit() { stateMachine.sendEvent("SUBMIT_EVENT"); } + } + class PaymentService { + @org.springframework.beans.factory.annotation.Qualifier("paymentStateMachine") + org.springframework.statemachine.StateMachine stateMachine; + public void processPayment() { stateMachine.sendEvent("AUTHORIZE"); } + } + """); + } + 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/TransitionLinkerEnricherTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricherTest.java index 0ba0d87..8e66a06 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricherTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricherTest.java @@ -513,8 +513,7 @@ class TransitionLinkerEnricherTest { .build(); enricher.enrich(resultComputer, null, null); - CallChain updatedChainComp = resultComputer.getMetadata().getCallChains().get(0); - assertThat(updatedChainComp.getMatchedTransitions()).isNullOrEmpty(); + assertThat(resultComputer.getMetadata().getCallChains()).isEmpty(); } @@ -615,27 +614,22 @@ class TransitionLinkerEnricherTest { // Test Electronics SM - Should only keep Electronics Chain enricher.enrich(resElec, null, null); - assertThat(resElec.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1); // Elec - assertThat(resElec.getMetadata().getCallChains().get(1).getMatchedTransitions()).isNullOrEmpty(); // Furn - assertThat(resElec.getMetadata().getCallChains().get(2).getMatchedTransitions()).isNullOrEmpty(); // Groc + assertThat(resElec.getMetadata().getCallChains()).hasSize(1); + assertThat(resElec.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1); // Test Furniture SM - Should only keep Furniture Chain enricher.enrich(resFurn, null, null); - assertThat(resFurn.getMetadata().getCallChains().get(0).getMatchedTransitions()).isNullOrEmpty(); // Elec - assertThat(resFurn.getMetadata().getCallChains().get(1).getMatchedTransitions()).hasSize(1); // Furn - assertThat(resFurn.getMetadata().getCallChains().get(2).getMatchedTransitions()).isNullOrEmpty(); // Groc + assertThat(resFurn.getMetadata().getCallChains()).hasSize(1); + assertThat(resFurn.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1); // Test Groceries SM - Should only keep Groceries Chain enricher.enrich(resGroc, null, null); - assertThat(resGroc.getMetadata().getCallChains().get(0).getMatchedTransitions()).isNullOrEmpty(); // Elec - assertThat(resGroc.getMetadata().getCallChains().get(1).getMatchedTransitions()).isNullOrEmpty(); // Furn - assertThat(resGroc.getMetadata().getCallChains().get(2).getMatchedTransitions()).hasSize(1); // Groc + assertThat(resGroc.getMetadata().getCallChains()).hasSize(1); + assertThat(resGroc.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1); // Test ComputerStore SM - Should reject ALL because none belong to computerstore enricher.enrich(resComp, null, null); - assertThat(resComp.getMetadata().getCallChains().get(0).getMatchedTransitions()).isNullOrEmpty(); // Elec - assertThat(resComp.getMetadata().getCallChains().get(1).getMatchedTransitions()).isNullOrEmpty(); // Furn - assertThat(resComp.getMetadata().getCallChains().get(2).getMatchedTransitions()).isNullOrEmpty(); // Groc + assertThat(resComp.getMetadata().getCallChains()).isEmpty(); } @Test diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngineTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngineTest.java index 57b7581..0b266fe 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngineTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngineTest.java @@ -130,6 +130,28 @@ class StrictFqnMatchingEngineTest { assertThat(engine.matches(smEvent, triggerPoint)).isFalse(); } + @Test + void shouldMatchStringLiteralTriggerToConfiguredStringTransition() { + Event smEvent = Event.of("\"AUDIT_EVENT\"", "String.AUDIT_EVENT"); + TriggerPoint triggerPoint = TriggerPoint.builder() + .event("AUDIT_EVENT") + .eventTypeFqn("java.lang.String") + .build(); + + assertThat(engine.matches(smEvent, triggerPoint)).isTrue(); + } + + @Test + void shouldMatchCanonicalStringLiteralTriggerToConfiguredStringTransition() { + Event smEvent = Event.of("\"AUDIT_EVENT\"", "String.AUDIT_EVENT"); + TriggerPoint triggerPoint = TriggerPoint.builder() + .event("java.lang.String.AUDIT_EVENT") + .eventTypeFqn("java.lang.String") + .build(); + + assertThat(engine.matches(smEvent, triggerPoint)).isTrue(); + } + @Test void shouldNotMatchStringTypeToEnumFqn() { Event smEvent = Event.of("PAY", "com.example.OrderEvents.PAY"); 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 dcc5e8c..abe7976 100644 --- a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json @@ -123,157 +123,8 @@ "stateTypeFqn" : "String", "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.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", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 29, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", - "methodName" : "capturePayment", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 28, - "polymorphicEvents" : null, - "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 - } ], + "triggers" : [ ], "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/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" : [ ] - } ] - }, { - "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 /api/base/{id}", "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", @@ -304,185 +155,7 @@ "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/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" - } ], + "callChains" : [ ], "properties" : { "default" : { "app.states.initial" : "INIT_STATE" 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 dcc5e8c..abe7976 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 @@ -123,157 +123,8 @@ "stateTypeFqn" : "String", "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.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", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 29, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", - "methodName" : "capturePayment", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 28, - "polymorphicEvents" : null, - "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 - } ], + "triggers" : [ ], "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/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" : [ ] - } ] - }, { - "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 /api/base/{id}", "className" : "click.kamil.examples.statemachine.extended.web.PaymentController", @@ -304,185 +155,7 @@ "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/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" - } ], + "callChains" : [ ], "properties" : { "default" : { "app.states.initial" : "INIT_STATE" 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 4c0f68d..315c8ae 100644 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json +++ b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json @@ -59,143 +59,9 @@ "stateTypeFqn" : "String", "eventTypeFqn" : "String", "metadata" : { - "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", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "metadata" : { - "path" : "/maven/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "JMS", - "name" : "JMS: order.queue", - "className" : "click.kamil.maven.api.JmsOrderListener", - "methodName" : "onMessage", - "sourceFile" : "api-module/src/main/java/click/kamil/maven/api/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /maven/orders/submit", - "className" : "click.kamil.maven.core.MavenOrderStateMachine.OrderController", - "methodName" : "submitOrder", - "sourceFile" : "core-module/src/main/java/click/kamil/maven/core/MavenOrderStateMachine.java", - "metadata" : { - "path" : "/maven/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.maven.core.MavenOrderStateMachine.OrderController.submitOrder" ], - "triggerPoint" : { - "event" : "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" : "java.lang.String.INIT", - "lineNumber" : 40, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "String.INIT", - "targetState" : "String.BUSY", - "event" : "String.SUBMIT" - } ], - "linkResolution" : "RESOLVED" - }, { - "entryPoint" : { - "type" : "JMS", - "name" : "JMS: order.queue", - "className" : "click.kamil.maven.api.JmsOrderListener", - "methodName" : "onMessage", - "sourceFile" : "api-module/src/main/java/click/kamil/maven/api/JmsOrderListener.java", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - }, - "methodChain" : [ "click.kamil.maven.api.JmsOrderListener.onMessage", "click.kamil.maven.core.MavenOrderStateMachine.OrderService.onMessage" ], - "triggerPoint" : { - "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" : "java.lang.String.BUSY", - "lineNumber" : 52, - "polymorphicEvents" : [ "java.lang.String.ORDER_EVENT" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : [ { - "sourceState" : "String.BUSY", - "targetState" : "String.DONE", - "event" : "String.ORDER_EVENT" - } ], - "linkResolution" : "RESOLVED" - } ], + "triggers" : [ ], + "entryPoints" : [ ], + "callChains" : [ ], "properties" : { "default" : { } } diff --git a/state_machine_exporter/src/test/resources/golden/PaymentStateMachineConfig/PaymentStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/PaymentStateMachineConfig/PaymentStateMachineConfig.json index 5e04ad6..0f89539 100644 --- a/state_machine_exporter/src/test/resources/golden/PaymentStateMachineConfig/PaymentStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/PaymentStateMachineConfig/PaymentStateMachineConfig.json @@ -153,32 +153,6 @@ "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", @@ -217,45 +191,6 @@ "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", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 29, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false }, { "event" : "java.lang.String.QUALIFIER_EVENT", "className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService", @@ -308,92 +243,8 @@ "external" : false, "constraint" : null, "ambiguous" : false - }, { - "event" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", - "methodName" : "capturePayment", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 28, - "polymorphicEvents" : null, - "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/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" : [ ] - } ] - }, { - "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", @@ -502,164 +353,6 @@ } ] } ], "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" : null, - "lineNumber" : 20, - "polymorphicEvents" : [ ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null, - "linkResolution" : "NO_MATCH" - }, { - "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" : null, - "lineNumber" : 25, - "polymorphicEvents" : [ ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null, - "linkResolution" : "NO_MATCH" - }, { - "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" : null, - "lineNumber" : 34, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null, - "linkResolution" : "NO_MATCH" - }, { - "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" : null, - "lineNumber" : 18, - "polymorphicEvents" : [ ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null, - "linkResolution" : "NO_MATCH" - }, { - "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" : null, - "lineNumber" : 16, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null, - "linkResolution" : "NO_MATCH" - }, { "entryPoint" : { "type" : "REST", "name" : "GET /test-setter", @@ -943,80 +636,6 @@ "event" : "String.AUTHORIZE" } ], "linkResolution" : "RESOLVED" - }, { - "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" : "paymentStateMachine", - "sourceState" : "java.lang.String.AUTHORIZED", - "lineNumber" : 35, - "polymorphicEvents" : [ "java.lang.String.CAPTURE" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : "paymentId", - "matchedTransitions" : [ { - "sourceState" : "String.AUTHORIZED", - "targetState" : "String.CAPTURED", - "event" : "String.CAPTURE" - } ], - "linkResolution" : "RESOLVED" - }, { - "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" : "[LIFECYCLE:RESTORE]", - "className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl", - "methodName" : "capturePayment", - "sourceFile" : null, - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 28, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : "paymentId", - "matchedTransitions" : null, - "linkResolution" : null } ], "properties" : { "default" : {