diff --git a/src/main/java/click/kamil/springstatemachineexporter/statemachine/ComplexStateMachineConfig.java b/src/main/java/click/kamil/examples/statemachine/complex/ComplexStateMachineConfig.java similarity index 99% rename from src/main/java/click/kamil/springstatemachineexporter/statemachine/ComplexStateMachineConfig.java rename to src/main/java/click/kamil/examples/statemachine/complex/ComplexStateMachineConfig.java index 1f17caf..622c1dd 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/statemachine/ComplexStateMachineConfig.java +++ b/src/main/java/click/kamil/examples/statemachine/complex/ComplexStateMachineConfig.java @@ -1,4 +1,4 @@ -package click.kamil.springstatemachineexporter.statemachine; +package click.kamil.examples.statemachine.complex; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.action.Action; @@ -156,4 +156,4 @@ public class ComplexStateMachineConfig extends StateMachineConfigurerAdapter logExitAction(String msg) { return context -> System.out.println(msg); } -} \ No newline at end of file +} diff --git a/src/main/java/click/kamil/springstatemachineexporter/statemachine/DynamicStateMachineExample.java b/src/main/java/click/kamil/examples/statemachine/dynamic/DynamicStateMachineExample.java similarity index 95% rename from src/main/java/click/kamil/springstatemachineexporter/statemachine/DynamicStateMachineExample.java rename to src/main/java/click/kamil/examples/statemachine/dynamic/DynamicStateMachineExample.java index cebace5..6b0d02a 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/statemachine/DynamicStateMachineExample.java +++ b/src/main/java/click/kamil/examples/statemachine/dynamic/DynamicStateMachineExample.java @@ -1,4 +1,5 @@ -package click.kamil.springstatemachineexporter.statemachine; +package click.kamil.examples.statemachine.dynamic; + import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.config.StateMachineBuilder; @@ -45,4 +46,4 @@ public class DynamicStateMachineExample { sm.sendEvent(Events.APPROVE); System.out.println("After APPROVE: " + sm.getState().getId()); } -} \ No newline at end of file +} diff --git a/src/main/java/click/kamil/springstatemachineexporter/statemachine/KamilEnumStateMachineConfiguration.java b/src/main/java/click/kamil/examples/statemachine/enumstate/KamilEnumStateMachineConfiguration.java similarity index 96% rename from src/main/java/click/kamil/springstatemachineexporter/statemachine/KamilEnumStateMachineConfiguration.java rename to src/main/java/click/kamil/examples/statemachine/enumstate/KamilEnumStateMachineConfiguration.java index 7f0a84b..cc2b48c 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/statemachine/KamilEnumStateMachineConfiguration.java +++ b/src/main/java/click/kamil/examples/statemachine/enumstate/KamilEnumStateMachineConfiguration.java @@ -1,4 +1,4 @@ -package click.kamil.springstatemachineexporter.statemachine; +package click.kamil.examples.statemachine.enumstate; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -35,12 +35,11 @@ class KamilEnumStateMachineConfiguration extends StateMachineConfigurerAdapter config) throws Exception { StateMachineListenerAdapter listenerAdapter = new StateMachineListenerAdapter<>() { @@ -90,4 +90,4 @@ class KamilEnumStateMachineConfiguration extends StateMachineConfigurerAdapter { + + protected abstract void addAdditionalStates(StateConfigurer states); + + protected abstract void addAdditionalTransitions(ExternalTransitionConfigurer transitions) throws Exception; + + @Override + public void configure(StateMachineConfigurationConfigurer config) throws Exception { + config + .withConfiguration() + .autoStartup(true); + } + + @Override + public void configure(StateMachineStateConfigurer states) throws Exception { + StateConfigurer end = states + .withStates() + .initial(States.STATE1) + .state(States.STATE2) + .state(States.STATE3) + .state(States.STATE4) + .state(States.STATE5) + .state(States.STATE6) + .state(States.STATE7) + .state(States.STATE8) + .state(States.STATE9) + .state(States.STATE10) + .state(States.STATE11) + .state(States.STATE12) + .state(States.STATE13) + .state(States.STATE14) + .state(States.STATE15) + .state(States.STATE16) + .state(States.STATE17) + .state(States.STATE18) + .state(States.STATE19) + .state(States.STATE20) + .state(States.STATEX) + .choice(States.STATEY) + .end(States.STATEZ); + addAdditionalStates(end); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) throws Exception { + + // External transitions + ExternalTransitionConfigurer t1 = transitions + .withExternal().source(States.STATE1).target(States.STATE2).event(Events.EVENT1) + .and() + .withExternal().source(States.STATE2).target(States.STATE3).event(Events.EVENT2) + .and() + .withExternal().source(States.STATE3).target(States.STATE4).event(Events.EVENT3) + .and() + .withExternal().source(States.STATE4).target(States.STATE5).event(Events.EVENT4) + .and() + .withExternal().source(States.STATE5).target(States.STATE6).event(Events.EVENT5) + .and() + .withExternal().source(States.STATE6).target(States.STATE7).event(Events.EVENT6) + .and() + .withExternal().source(States.STATE7).target(States.STATE8).event(Events.EVENT7) + .and() + .withExternal().source(States.STATE8).target(States.STATE9).event(Events.EVENT8) + .and() + .withExternal().source(States.STATE9).target(States.STATE10).event(Events.EVENT9) + .and() + .withExternal().source(States.STATE10).target(States.STATE11).event(Events.EVENT10) + .and() + .withExternal().source(States.STATE11).target(States.STATE12).event(Events.EVENT11) + .and() + .withExternal().source(States.STATE12).target(States.STATE13).event(Events.EVENT12) + .and() + .withExternal().source(States.STATE13).target(States.STATE14).event(Events.EVENT13) + .and() + .withExternal().source(States.STATE14).target(States.STATE15).event(Events.EVENT14) + .and() + .withExternal().source(States.STATE15).target(States.STATE16).event(Events.EVENT15); + + // EXTRA CHOICE + + transitions.withChoice().source(States.STATEY).first(States.STATEX, guardVarEquals("value1")).last(States.STATEZ); + + // Choice transitions (at least 10) + transitions + .withChoice() + .source(States.STATE16) + .first(States.STATE17, guardVarEquals("value1")) + .then(States.STATE18, guardVarEquals("value2")) + .last(States.STATE19) + .and() + .withChoice() + .source(States.STATE17) + .first(States.STATE20, guardEventHeaderEquals("header1", "foo")) + .last(States.STATE16) + .and() + .withChoice() + .source(States.STATE18) + .first(States.STATE19, guardVarEquals("value3")) + .last(States.STATE20) + .and() + .withChoice() + .source(States.STATE19) + .first(States.STATE1, guardVarEquals("reset")) + .last(States.STATE20) + .and() + .withChoice() + .source(States.STATE20) + .first(States.STATE5, guardEventHeaderEquals("header2", "bar")) + .last(States.STATE1) + .and() + .withChoice() + .source(States.STATE11) + .first(States.STATE13, guardVarEquals("goTo13")) + .then(States.STATE14, guardVarEquals("goTo14")) + .last(States.STATE15) + .and() + .withChoice() + .source(States.STATE12) + .first(States.STATE10, guardVarEquals("goBack10")) + .last(States.STATE11) + .and() + .withChoice() + .source(States.STATE14) + .first(States.STATE12, guardVarEquals("loop12")) + .last(States.STATE16) + .and() + .withChoice() + .source(States.STATE9) + .first(States.STATE8, guardVarEquals("stepBack")) + .then(States.STATE7, guardVarEquals("stepBackMore")) + .last(States.STATE6) + .and() + .withChoice() + .source(States.STATE8) + .first(States.STATE9, guardVarEquals("forward9")) + .last(States.STATE10); + + addAdditionalTransitions(t1); + } + + private Guard guardVarEquals(String expected) { + return context -> { + Object var = context.getExtendedState().getVariables().get("var"); + return expected.equals(var); + }; + } + + private Guard guardEventHeaderEquals(String headerName, String expected) { + return context -> { + Object header = context.getMessageHeader(headerName); + return expected.equals(header); + }; + } + + private Action logEntryAction(String msg) { + return context -> System.out.println(msg); + } + + private Action logExitAction(String msg) { + return context -> System.out.println(msg); + } +} diff --git a/src/main/java/click/kamil/examples/statemachine/inheritancestate/AbstractStateMachineConfiguration.java b/src/main/java/click/kamil/examples/statemachine/inheritancestate/AbstractStateMachineConfiguration.java new file mode 100644 index 0000000..894cb21 --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/inheritancestate/AbstractStateMachineConfiguration.java @@ -0,0 +1,6 @@ +package click.kamil.examples.statemachine.inheritancestate; + +import org.springframework.statemachine.config.StateMachineConfigurerAdapter; + +class AbstractStateMachineConfiguration extends StateMachineConfigurerAdapter { +} diff --git a/src/main/java/click/kamil/examples/statemachine/inheritancestate/Events.java b/src/main/java/click/kamil/examples/statemachine/inheritancestate/Events.java new file mode 100644 index 0000000..27da2bf --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/inheritancestate/Events.java @@ -0,0 +1,8 @@ +package click.kamil.examples.statemachine.inheritancestate; + +public enum Events { + EVENT1, EVENT2, EVENT3, EVENT4, EVENT5, + EVENT6, EVENT7, EVENT8, EVENT9, EVENT10, + EVENT11, EVENT12, EVENT13, EVENT14, EVENT15, + EVENTX, EVENTY, EVENTZ +} diff --git a/src/main/java/click/kamil/examples/statemachine/inheritancestate/OneStateMachineConfiguration.java b/src/main/java/click/kamil/examples/statemachine/inheritancestate/OneStateMachineConfiguration.java new file mode 100644 index 0000000..f1f7ad7 --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/inheritancestate/OneStateMachineConfiguration.java @@ -0,0 +1,20 @@ +package click.kamil.examples.statemachine.inheritancestate; + +import org.springframework.statemachine.config.configurers.ExternalTransitionConfigurer; +import org.springframework.statemachine.config.configurers.StateConfigurer; + +class OneStateMachineConfiguration extends AbstractOneStateMachineConfiguration { + @Override + protected void addAdditionalStates(StateConfigurer states) { + states.state(States.STATE_EXTRA_1); + } + + @Override + protected void addAdditionalTransitions(ExternalTransitionConfigurer transitions) throws Exception { + transitions + .and() + .withExternal().event(Events.EVENTX) + .source(States.STATE5) + .target(States.STATE_EXTRA_1); + } +} diff --git a/src/main/java/click/kamil/examples/statemachine/inheritancestate/States.java b/src/main/java/click/kamil/examples/statemachine/inheritancestate/States.java new file mode 100644 index 0000000..6b88f87 --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/inheritancestate/States.java @@ -0,0 +1,9 @@ +package click.kamil.examples.statemachine.inheritancestate; + +public enum States { + STATE1, STATE2, STATE3, STATE4, STATE5, + STATE6, STATE7, STATE8, STATE9, STATE10, + STATE11, STATE12, STATE13, STATE14, STATE15, + STATE16, STATE17, STATE18, STATE19, STATE20, + STATEX, STATEY, STATEZ, STATE_EXTRA_1 +} diff --git a/src/main/java/click/kamil/examples/statemachine/simple/OrderEvents.java b/src/main/java/click/kamil/examples/statemachine/simple/OrderEvents.java new file mode 100644 index 0000000..ef7ee41 --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/simple/OrderEvents.java @@ -0,0 +1,7 @@ +package click.kamil.examples.statemachine.simple; + +public enum OrderEvents { + FULFILL, PAY, CANCEL, + + ABCD, NOPE, IGNORE +} diff --git a/src/main/java/click/kamil/examples/statemachine/simple/OrderStates.java b/src/main/java/click/kamil/examples/statemachine/simple/OrderStates.java new file mode 100644 index 0000000..37fca61 --- /dev/null +++ b/src/main/java/click/kamil/examples/statemachine/simple/OrderStates.java @@ -0,0 +1,5 @@ +package click.kamil.examples.statemachine.simple; + +public enum OrderStates { + SUBMITTED, PAID, FULFILLED, CANCELED, PAID1, PAID2, PAID3, INVALID, HAPPEN, SKIPPED, NEVER +} diff --git a/src/main/java/click/kamil/springstatemachineexporter/statemachine/SimpleEnumStateMachineConfiguration.java b/src/main/java/click/kamil/examples/statemachine/simple/SimpleEnumStateMachineConfiguration.java similarity index 98% rename from src/main/java/click/kamil/springstatemachineexporter/statemachine/SimpleEnumStateMachineConfiguration.java rename to src/main/java/click/kamil/examples/statemachine/simple/SimpleEnumStateMachineConfiguration.java index 3f827cd..9e03dfc 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/statemachine/SimpleEnumStateMachineConfiguration.java +++ b/src/main/java/click/kamil/examples/statemachine/simple/SimpleEnumStateMachineConfiguration.java @@ -1,4 +1,4 @@ -package click.kamil.springstatemachineexporter.statemachine; +package click.kamil.examples.statemachine.simple; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -35,7 +35,6 @@ class SimpleEnumStateMachineConfiguration extends StateMachineConfigurerAdapter< .and() .withExternal().source(OrderStates.PAID).target(OrderStates.CANCELED).event(OrderEvents.CANCEL) - .and() .withExternal().source(OrderStates.SUBMITTED).event(OrderEvents.ABCD) // it needs to have target specified to get added to .transitions collections @@ -88,6 +87,7 @@ class SimpleEnumStateMachineConfiguration extends StateMachineConfigurerAdapter< .end(OrderStates.FULFILLED) .end(OrderStates.CANCELED); } + @Override public void configure(StateMachineConfigurationConfigurer config) throws Exception { StateMachineListenerAdapter listenerAdapter = new StateMachineListenerAdapter<>() { @@ -100,4 +100,4 @@ class SimpleEnumStateMachineConfiguration extends StateMachineConfigurerAdapter< .autoStartup(false) .listener(listenerAdapter); } -} \ No newline at end of file +} diff --git a/src/main/java/click/kamil/springstatemachineexporter/ast/Main.java b/src/main/java/click/kamil/springstatemachineexporter/Main.java similarity index 99% rename from src/main/java/click/kamil/springstatemachineexporter/ast/Main.java rename to src/main/java/click/kamil/springstatemachineexporter/Main.java index f898d97..4d69148 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/ast/Main.java +++ b/src/main/java/click/kamil/springstatemachineexporter/Main.java @@ -1,4 +1,4 @@ -package click.kamil.springstatemachineexporter.ast; +package click.kamil.springstatemachineexporter; import click.kamil.springstatemachineexporter.ast.app.AstTransitionParser; import click.kamil.springstatemachineexporter.ast.app.StateMachineStateConfigurationMethodFinder; diff --git a/src/main/java/click/kamil/springstatemachineexporter/StatemachinedemoApplication.java b/src/main/java/click/kamil/springstatemachineexporter/StatemachinedemoApplication.java index d578580..33ea61c 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/StatemachinedemoApplication.java +++ b/src/main/java/click/kamil/springstatemachineexporter/StatemachinedemoApplication.java @@ -1,11 +1,13 @@ -package click.kamil.springstatemachineexporter; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class StatemachinedemoApplication { - public static void main(String[] args) { - SpringApplication.run(StatemachinedemoApplication.class, args); - } -} \ No newline at end of file +//package click.kamil.springstatemachineexporter; +// +//import org.springframework.boot.SpringApplication; +//import org.springframework.boot.autoconfigure.SpringBootApplication; +//import org.springframework.context.annotation.ComponentScan; +// +//@SpringBootApplication +//@ComponentScan(basePackages = {"click.kamil.examples"}) +//public class StatemachinedemoApplication { +// public static void main(String[] args) { +// SpringApplication.run(StatemachinedemoApplication.class, args); +// } +//} diff --git a/src/main/java/click/kamil/springstatemachineexporter/springbased/SpringExporter.java b/src/main/java/click/kamil/springstatemachineexporter/springbased/SpringExporter.java index 72663a6..9459377 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/springbased/SpringExporter.java +++ b/src/main/java/click/kamil/springstatemachineexporter/springbased/SpringExporter.java @@ -1,7 +1,7 @@ package click.kamil.springstatemachineexporter.springbased; -import click.kamil.springstatemachineexporter.statemachine.OrderEvents; -import click.kamil.springstatemachineexporter.statemachine.OrderStates; +import click.kamil.examples.statemachine.simple.OrderEvents; +import click.kamil.examples.statemachine.simple.OrderStates; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -46,10 +46,10 @@ class Runner implements ApplicationRunner { } abstract class BaseExporter { - @Qualifier("simpleEnumStateMachineFactory") + protected final StateMachineFactory factory; - protected BaseExporter(StateMachineFactory factory) { + protected BaseExporter(@Qualifier("simpleEnumStateMachineFactory") StateMachineFactory factory) { this.factory = factory; } diff --git a/src/main/java/click/kamil/springstatemachineexporter/statemachine/OrderStates.java b/src/main/java/click/kamil/springstatemachineexporter/statemachine/OrderStates.java deleted file mode 100644 index 845a2b6..0000000 --- a/src/main/java/click/kamil/springstatemachineexporter/statemachine/OrderStates.java +++ /dev/null @@ -1,6 +0,0 @@ -package click.kamil.springstatemachineexporter.statemachine; - -public enum OrderStates { - SUBMITTED, PAID, FULFILLED, CANCELED - ,PAID1,PAID2, PAID3, INVALID, HAPPEN, SKIPPED, NEVER -} \ No newline at end of file