From ec24cdc38d77acbecff6d608f2ec48998681ba21 Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Sun, 13 Jul 2025 22:24:40 +0200 Subject: [PATCH] different versions of defining a state machine --- src/TODO.md | 52 +++++++++++++++++++ .../springstatemachineexporter/ast/Main.java | 4 +- .../ast/in/AstFileFinder.java | 5 +- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/TODO.md diff --git a/src/TODO.md b/src/TODO.md new file mode 100644 index 0000000..17d7b6c --- /dev/null +++ b/src/TODO.md @@ -0,0 +1,52 @@ +1. extract state machines from this as well + +```java + +import org.springframework.statemachine.StateMachine; +import org.springframework.statemachine.config.builders.StateMachineBuilder; + +import java.util.EnumSet; + +public class DynamicStateMachineExample { + + public enum States { + DRAFT, REVIEW, APPROVED + } + + public enum Events { + SUBMIT, APPROVE + } + + public static StateMachine buildStateMachine() throws Exception { + StateMachineBuilder.Builder builder = StateMachineBuilder.builder(); + + builder.configureStates() + .withStates() + .initial(States.DRAFT) + .states(EnumSet.allOf(States.class)); + + builder.configureTransitions() + .withExternal() + .source(States.DRAFT).target(States.REVIEW).event(Events.SUBMIT) + .and() + .withExternal() + .source(States.REVIEW).target(States.APPROVED).event(Events.APPROVE); + + return builder.build(); + } + + public static void main(String[] args) throws Exception { + StateMachine sm = buildStateMachine(); + + sm.start(); + System.out.println("Current State: " + sm.getState().getId()); + + sm.sendEvent(Events.SUBMIT); + System.out.println("After SUBMIT: " + sm.getState().getId()); + + 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/ast/Main.java b/src/main/java/click/kamil/springstatemachineexporter/ast/Main.java index 16d5a60..a29dcf7 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/ast/Main.java +++ b/src/main/java/click/kamil/springstatemachineexporter/ast/Main.java @@ -26,7 +26,7 @@ import java.util.Set; public class Main { private static final String START_DIR = "."; private static final String EXTENSION = ".java"; - private static final String TARGET_ANNOTATION = "EnableStateMachineFactory"; + private static final List TARGET_ANNOTATIONS = List.of("EnableStateMachineFactory", "EnableStateMachine"); public static void main(String[] args) throws IOException { List javaFiles = FileUtils.findFilesWithExtension(Paths.get(START_DIR), EXTENSION); @@ -42,7 +42,7 @@ public class Main { String source = Files.readString(javaFile); AstFileFinder finder = new AstFileFinder(source); - if (finder.hasClassWithAnnotation(source, TARGET_ANNOTATION)) { + if (finder.hasClassWithAnnotation(source, TARGET_ANNOTATIONS)) { System.out.println("Found annotation in: " + javaFile.toAbsolutePath()); } diff --git a/src/main/java/click/kamil/springstatemachineexporter/ast/in/AstFileFinder.java b/src/main/java/click/kamil/springstatemachineexporter/ast/in/AstFileFinder.java index acb627e..0616184 100644 --- a/src/main/java/click/kamil/springstatemachineexporter/ast/in/AstFileFinder.java +++ b/src/main/java/click/kamil/springstatemachineexporter/ast/in/AstFileFinder.java @@ -2,6 +2,7 @@ package click.kamil.springstatemachineexporter.ast.in; import org.eclipse.jdt.core.dom.*; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; public class AstFileFinder { @@ -15,7 +16,7 @@ public class AstFileFinder { this.cu = (CompilationUnit) parser.createAST(null); } - public boolean hasClassWithAnnotation(String source, String annotationName) { + public boolean hasClassWithAnnotation(String source, List annotationNames) { AtomicBoolean found = new AtomicBoolean(false); cu.accept(new ASTVisitor() { @Override @@ -23,7 +24,7 @@ public class AstFileFinder { if (node.isInterface()) return true; for (Object modifier : node.modifiers()) { if (modifier instanceof Annotation annotation && - annotation.getTypeName().getFullyQualifiedName().equals(annotationName)) { + annotationNames.contains(annotation.getTypeName().getFullyQualifiedName())) { found.set(true); return false; }