diff --git a/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineService.java b/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineService.java index 23f4f92..9c86efe 100644 --- a/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineService.java +++ b/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineService.java @@ -14,6 +14,10 @@ public interface StateMachineService { // Quirky pattern 2: Generic Varargs void sendEventsVarargs(T... events); + // Functional quirks: passing functions and method references + void executeFunctionalTransition(java.util.function.Supplier eventSupplier, + java.util.function.Function transitionAction); + // Child class of Spring's GenericMessage with a generic payload void sendCustomMessage(click.kamil.domain.CustomStateMachineMessage customMessage); diff --git a/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineServiceImpl.java b/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineServiceImpl.java index f7dd0a5..b550c52 100644 --- a/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineServiceImpl.java +++ b/state_machines/complex_multi_module_sm/service/src/main/java/click/kamil/service/StateMachineServiceImpl.java @@ -59,6 +59,15 @@ public class StateMachineServiceImpl implements StateMachineService { } } + @Override + public void executeFunctionalTransition(java.util.function.Supplier eventSupplier, + java.util.function.Function transitionAction) { + // Resolve the event from the getter / supplier function + T event = eventSupplier.get(); + // Apply the transition via the provided function / method reference + transitionAction.apply(event); + } + @Override public void sendCustomMessage(click.kamil.domain.CustomStateMachineMessage customMessage) { // Because CustomStateMachineMessage extends GenericMessage and implements Message, diff --git a/state_machines/complex_multi_module_sm/web/src/main/java/click/kamil/web/OrderController.java b/state_machines/complex_multi_module_sm/web/src/main/java/click/kamil/web/OrderController.java index 4d0ba24..dad1a64 100644 --- a/state_machines/complex_multi_module_sm/web/src/main/java/click/kamil/web/OrderController.java +++ b/state_machines/complex_multi_module_sm/web/src/main/java/click/kamil/web/OrderController.java @@ -34,4 +34,27 @@ public class OrderController { stateMachineService.sendMessage(OrderEvent.CANCEL); return "Order cancel event sent"; } + + // --- Functional Quirks for Static Analysis --- + + // A getter returning a specific ENUM constant + public OrderEvent getCompleteEvent() { + return OrderEvent.COMPLETE; + } + + // A specific function that performs the transition + public Void triggerTransitionFunction(click.kamil.domain.IEvent event) { + stateMachineService.sendMessage(event); + return null; + } + + @PostMapping("/functional-complete") + public String functionalCompleteOrder() { + // Pass the getter and the transition applier as method references + stateMachineService.executeFunctionalTransition( + this::getCompleteEvent, + this::triggerTransitionFunction + ); + return "Functional complete event triggered via method references"; + } }