From 4fc75a534e3de3253ce84260e15f52ae60c2348e Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Sun, 13 Jul 2025 16:47:10 +0200 Subject: [PATCH] refactoring --- .../statemachinedemo/AstFileFinder.java | 50 -- .../example/statemachinedemo/ExportUtils.java | 426 ------------------ .../com/example/statemachinedemo/Main.java | 78 ++-- .../StateMachineConfigureMethodFinder.java | 101 ----- .../example/statemachinedemo/StateUtils.java | 64 --- .../example/statemachinedemo/Transition.java | 26 -- .../statemachinedemo/TransitionParser.java | 203 --------- .../app/AstTransitionParser.java | 157 +++++++ ...achineStateConfigurationMethodFinder.java} | 94 ++-- ...neTransitionConfigurationMethodFinder.java | 81 ++++ .../app/TransitionStateUtils.java | 42 ++ .../app/domain/Transition.java | 26 ++ .../statemachinedemo/common/FileUtils.java | 18 + .../statemachinedemo/in/AstFileFinder.java | 36 ++ .../com/example/statemachinedemo/out/Dot.java | 168 +++++++ .../statemachinedemo/out/PlantUml.java | 184 ++++++++ .../example/statemachinedemo/out/Scxml.java | 112 +++++ .../out/StateMachineExporter.java | 21 + .../notgoodspringbased/SpringExporter.java | 30 +- .../ComplexStateMachineConfig.java | 8 +- .../ForkJoinStateMachineConfig.java | 9 +- .../{ => z}/statemachine/OrderEvents.java | 2 +- .../{ => z}/statemachine/OrderStates.java | 2 +- .../SimpleEnumStateMachineConfiguration.java | 4 +- .../StatemachinedemoApplicationTests.java | 2 +- statemachine.1.dot | 38 -- statemachine.2.dot | 33 -- statemachine.2.png | Bin 73308 -> 0 bytes statemachine.3.xml | 58 --- statemachine.dot | 14 - statemachine.png | Bin 125422 -> 0 bytes statemachine.uml.dot | 11 - 32 files changed, 953 insertions(+), 1145 deletions(-) delete mode 100644 src/main/java/com/example/statemachinedemo/AstFileFinder.java delete mode 100644 src/main/java/com/example/statemachinedemo/ExportUtils.java delete mode 100644 src/main/java/com/example/statemachinedemo/StateMachineConfigureMethodFinder.java delete mode 100644 src/main/java/com/example/statemachinedemo/StateUtils.java delete mode 100644 src/main/java/com/example/statemachinedemo/Transition.java delete mode 100644 src/main/java/com/example/statemachinedemo/TransitionParser.java create mode 100644 src/main/java/com/example/statemachinedemo/app/AstTransitionParser.java rename src/main/java/com/example/statemachinedemo/{AstStateUtils.java => app/StateMachineStateConfigurationMethodFinder.java} (55%) create mode 100644 src/main/java/com/example/statemachinedemo/app/StateMachineTransitionConfigurationMethodFinder.java create mode 100644 src/main/java/com/example/statemachinedemo/app/TransitionStateUtils.java create mode 100644 src/main/java/com/example/statemachinedemo/app/domain/Transition.java create mode 100644 src/main/java/com/example/statemachinedemo/common/FileUtils.java create mode 100644 src/main/java/com/example/statemachinedemo/in/AstFileFinder.java create mode 100644 src/main/java/com/example/statemachinedemo/out/Dot.java create mode 100644 src/main/java/com/example/statemachinedemo/out/PlantUml.java create mode 100644 src/main/java/com/example/statemachinedemo/out/Scxml.java create mode 100644 src/main/java/com/example/statemachinedemo/out/StateMachineExporter.java rename src/main/java/com/example/statemachinedemo/{ => z}/notgoodspringbased/SpringExporter.java (87%) rename src/main/java/com/example/statemachinedemo/{ => z}/statemachine/ComplexStateMachineConfig.java (95%) rename src/main/java/com/example/statemachinedemo/{ => z}/statemachine/ForkJoinStateMachineConfig.java (95%) rename src/main/java/com/example/statemachinedemo/{ => z}/statemachine/OrderEvents.java (59%) rename src/main/java/com/example/statemachinedemo/{ => z}/statemachine/OrderStates.java (70%) rename src/main/java/com/example/statemachinedemo/{ => z}/statemachine/SimpleEnumStateMachineConfiguration.java (97%) delete mode 100644 statemachine.1.dot delete mode 100644 statemachine.2.dot delete mode 100644 statemachine.2.png delete mode 100644 statemachine.3.xml delete mode 100644 statemachine.dot delete mode 100644 statemachine.png delete mode 100644 statemachine.uml.dot diff --git a/src/main/java/com/example/statemachinedemo/AstFileFinder.java b/src/main/java/com/example/statemachinedemo/AstFileFinder.java deleted file mode 100644 index 7fffb58..0000000 --- a/src/main/java/com/example/statemachinedemo/AstFileFinder.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.statemachinedemo; -import org.eclipse.jdt.core.dom.*; -import java.io.*; -import java.nio.file.*; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class AstFileFinder { - - public static List findJavaFiles(Path startDir, String extension) throws IOException { - try (Stream paths = Files.walk(startDir)) { - return paths - .filter(p -> Files.isRegularFile(p) && p.toString().endsWith(extension)) - .collect(Collectors.toList()); - } - } - - public static boolean hasClassWithAnnotation(String source, String annotationName) { - ASTParser parser = ASTParser.newParser(AST.JLS17); - parser.setSource(source.toCharArray()); - parser.setKind(ASTParser.K_COMPILATION_UNIT); - parser.setResolveBindings(false); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - - final boolean[] found = {false}; - - cu.accept(new ASTVisitor() { - @Override - public boolean visit(TypeDeclaration node) { - if (node.isInterface()) return true; - - for (Object modifier : node.modifiers()) { - if (modifier instanceof Annotation) { - Annotation annotation = (Annotation) modifier; - String name = annotation.getTypeName().getFullyQualifiedName(); - if (name.equals(annotationName)) { - found[0] = true; - return false; - } - } - } - return true; - } - }); - - return found[0]; - } -} diff --git a/src/main/java/com/example/statemachinedemo/ExportUtils.java b/src/main/java/com/example/statemachinedemo/ExportUtils.java deleted file mode 100644 index b2cb83b..0000000 --- a/src/main/java/com/example/statemachinedemo/ExportUtils.java +++ /dev/null @@ -1,426 +0,0 @@ -package com.example.statemachinedemo; - -import java.util.*; - -public class ExportUtils { - - public static String generatePlantUML(List transitions, - Set startStates, - Set endStates, - boolean useLambdaGuards) { - StringBuilder sb = new StringBuilder(); - sb.append("@startuml\n"); - sb.append("skinparam state {\n"); - sb.append(" BackgroundColor<> LightYellow\n"); - sb.append("}\n\n"); - - // 1. Print start states - for (String start : startStates) { - sb.append("[*] --> ").append(simplify(start)).append("\n"); - } - sb.append("\n"); - - // 2. Find all states that have choice transitions originating from them - Set statesWithChoice = new HashSet<>(); - for (Transition t : transitions) { - if ("withChoice".equals(t.type)) { - for (String source : t.sourceStates) { - statesWithChoice.add(simplify(source)); - } - } - } - - // 3. Declare choice pseudostates & connect from original state - for (String state : statesWithChoice) { - String choiceState = state + "_choice"; - sb.append("state ").append(choiceState).append(" <>\n"); - sb.append(state).append(" --> ").append(choiceState).append("\n"); - } - sb.append("\n"); - - // Palette of colors for choice states (NO leading '#') - List choiceColors = List.of("FF6347", "4682B4", "32CD32", "FFD700", "6A5ACD", "FF69B4"); - - // Assign a color per withChoice source state cycling through palette - Map choiceStateColorMap = new HashMap<>(); - int colorIndex = 0; - for (String state : statesWithChoice) { - choiceStateColorMap.put(state, choiceColors.get(colorIndex % choiceColors.size())); - colorIndex++; - } - - Set transitionLines = new HashSet<>(); - - // Helper to get color for non-choice transitions (NO leading '#') - java.util.function.Function getTransitionColor = (type) -> switch (type) { - case "withExternal" -> "1E90FF"; // DodgerBlue - case "withInternal" -> "32CD32"; // LimeGreen - case "withLocal" -> "FFA500"; // Orange - case "withJunction" -> "FF69B4"; // HotPink - case "withJoin" -> "8A2BE2"; // BlueViolet - case "withFork" -> "20B2AA"; // LightSeaGreen - default -> "000000"; // Black fallback - }; - // 4. Output transitions - for (Transition t : transitions) { - if (t.sourceStates == null || t.sourceStates.isEmpty()) continue; - - boolean allowNoTarget = "withJoin".equals(t.type) || "withFork".equals(t.type); - - List targets; - if (t.targetStates == null || t.targetStates.isEmpty()) { - if (!allowNoTarget) { - // Use sourceStates as targets (self-loop) - targets = t.sourceStates; - } else { - // withJoin or withFork with no targets => skip emitting transitions - continue; - } - } else { - targets = t.targetStates; - } - - for (String rawSource : t.sourceStates) { - String source = simplify(rawSource); - - for (String rawTarget : targets) { - String target = simplify(rawTarget); - - String transitionSource = source; - - // Reroute choice transitions through pseudostate - if ("withChoice".equals(t.type) && statesWithChoice.contains(source)) { - transitionSource = source + "_choice"; - } - - // Prepare guard text - String guardText = ""; - if (t.guard != null && !t.guard.isBlank()) { - if (useLambdaGuards && t.isLambdaGuard) { - guardText = "lambda"; - } else { - guardText = t.guard.replaceAll("[\\n\\r]+", " ").replaceAll("\\s{2,}", " ").trim(); - } - } - - // Prepare actions text (comma separated) - String actionsText = ""; - if (t.actions != null && !t.actions.isEmpty()) { - StringBuilder actionBuilder = new StringBuilder(); - for (int i = 0; i < t.actions.size(); i++) { - if (i > 0) actionBuilder.append(", "); - String action = t.actions.get(i); - boolean isLambda = t.isLambdaActions.get(i); - if (useLambdaGuards && isLambda) { - actionBuilder.append("lambda"); - } else { - actionBuilder.append(action); - } - } - actionsText = actionBuilder.toString(); - } - - // Build label with event, guard, and actions - StringBuilder label = new StringBuilder(); - if (t.event != null && !t.event.isBlank()) { - label.append(simplify(t.event)); - } - if (!guardText.isBlank()) { - if (label.length() > 0) label.append(" "); - label.append("[").append(guardText).append("]"); - } - if (!actionsText.isBlank()) { - if (label.length() > 0) label.append(" / "); - label.append(actionsText); - } - - // Add order info for choice/junction transitions - if (("withChoice".equals(t.type) || "withJunction".equals(t.type)) && t.order != null) { - if (label.length() > 0) label.append(" "); - label.append("(order=").append(t.order).append(")"); - } - - // Determine color for this transition - String color; - if ("withChoice".equals(t.type)) { - color = choiceStateColorMap.getOrDefault(source, "000000"); - } else { - color = getTransitionColor.apply(t.type); - } - - // Add color with single '#' prefix - String line = transitionSource + " -[#"+color+",bold]-> " + target + (label.isEmpty() ? "" : (" : " + label)); - - // Skip duplicates - if (transitionLines.add(line)) { - sb.append(line).append("\n"); - } - } - } - } - - sb.append("\n"); - - // 5. Mark end states with transition to [*] - for (String end : endStates) { - sb.append(simplify(end)).append(" --> [*]\n"); - } - - sb.append("@enduml\n"); - return sb.toString(); -} - - - public static String generateDot(List transitions, - Set startStates, - Set endStates, - boolean useLambdaGuards) { - StringBuilder sb = new StringBuilder(); - sb.append("digraph stateMachine {\n"); - sb.append(" rankdir=LR;\n"); - sb.append(" node [shape=circle, style=filled, fillcolor=lightgray];\n\n"); - - // 1. Fake start node - sb.append(" start [shape=point, label=\"\"];\n"); - - // 2. Find states with choice transitions - Set statesWithChoice = new HashSet<>(); - for (Transition t : transitions) { - if ("withChoice".equals(t.type)) { - for (String source : t.sourceStates) { - statesWithChoice.add(simplify(source)); - } - } - } - - // 3. Declare normal states and choice pseudostates - Set allStates = new HashSet<>(); - for (Transition t : transitions) { - if (t.sourceStates != null) { - for (String s : t.sourceStates) allStates.add(simplify(s)); - } - if (t.targetStates != null) { - for (String tgt : t.targetStates) allStates.add(simplify(tgt)); - } - } - - // Print all normal states (except choice pseudostates for now) - for (String state : allStates) { - if (!statesWithChoice.contains(state + "_choice")) { - String shape = endStates.contains(state) ? "doublecircle" : "circle"; - sb.append(" ").append(state) - .append(" [shape=").append(shape).append(", fillcolor=lightgray];\n"); - } - } - sb.append("\n"); - - // Declare choice pseudostates as diamonds - for (String state : statesWithChoice) { - String choiceNode = state + "_choice"; - sb.append(" ").append(choiceNode) - .append(" [shape=diamond, label=\"\", fillcolor=lightyellow];\n"); - } - sb.append("\n"); - - // 4. Connect start node(s) to start states - for (String start : startStates) { - sb.append(" start -> ").append(simplify(start)).append(";\n"); - } - sb.append("\n"); - - // 5. Connect normal states to their choice pseudostates - for (String state : statesWithChoice) { - String choiceNode = state + "_choice"; - sb.append(" ").append(state).append(" -> ").append(choiceNode).append(";\n"); - } - sb.append("\n"); - - // 6. Transitions: reroute withChoice transitions via choice pseudostate - for (Transition t : transitions) { - if (t.sourceStates == null || t.sourceStates.isEmpty()) continue; - - boolean allowNoTarget = "withJoin".equals(t.type) || "withFork".equals(t.type); - - List targets; - if (t.targetStates == null || t.targetStates.isEmpty()) { - if (!allowNoTarget) { - // self-loop: targets = sources - targets = t.sourceStates; - } else { - // withJoin/withFork with no targets: skip - continue; - } - } else { - targets = t.targetStates; - } - - for (String rawSource : t.sourceStates) { - String source = simplify(rawSource); - - for (String rawTarget : targets) { - String target = simplify(rawTarget); - String edgeSource = source; - - if ("withChoice".equals(t.type) && statesWithChoice.contains(source)) { - edgeSource = source + "_choice"; - } - - // Prepare guard text - String guardText = ""; - if (t.guard != null && !t.guard.isBlank()) { - if (useLambdaGuards && t.isLambdaGuard) { - guardText = "lambda"; - } else { - guardText = t.guard.replaceAll("[\\n\\r]+", " ").replaceAll("\\s{2,}", " ").trim(); - } - } - - // Prepare actions text - String actionsText = ""; - if (t.actions != null && !t.actions.isEmpty()) { - StringBuilder actionBuilder = new StringBuilder(); - for (int i = 0; i < t.actions.size(); i++) { - if (i > 0) actionBuilder.append(", "); - String action = t.actions.get(i); - boolean isLambda = t.isLambdaActions.get(i); - if (useLambdaGuards && isLambda) { - actionBuilder.append("lambda"); - } else { - actionBuilder.append(action); - } - } - actionsText = actionBuilder.toString(); - } - - // Build label with event, guard, and actions - StringBuilder label = new StringBuilder(); - if (t.event != null && !t.event.isBlank()) { - label.append(simplify(t.event)); - } - if (!guardText.isBlank()) { - if (label.length() > 0) label.append(" "); - label.append("[").append(guardText).append("]"); - } - if (!actionsText.isBlank()) { - if (label.length() > 0) label.append(" / "); - label.append(actionsText); - } - - // Add order info for choice/junction transitions - if (("withChoice".equals(t.type) || "withJunction".equals(t.type)) && t.order != null) { - if (label.length() > 0) label.append(" "); - label.append("(order=").append(t.order).append(")"); - } - - String edgeLabel = label.length() > 0 ? " [label=\"" + label.toString() + "\"]" : ""; - - sb.append(" ").append(edgeSource).append(" -> ").append(target).append(edgeLabel).append(";\n"); - } - } - } - - sb.append("}\n"); - return sb.toString(); - } - - public static String exportToSCXML(List transitions, - Set startStates, - Set endStates, - boolean useLambdaGuards) { - StringBuilder sb = new StringBuilder(); - sb.append("\n"); - sb.append("\n\n"); - - // 1. Collect all states - Set allStates = new HashSet<>(); - for (Transition t : transitions) { - if (t.sourceStates != null) { - for (String s : t.sourceStates) allStates.add(s); - } - if (t.targetStates != null) { - for (String tState : t.targetStates) allStates.add(tState); - } - } - - // 2. Output elements with transitions - for (String state : allStates) { - String simpleState = simplify(state); - sb.append(" \n"); - - // If this state is a start state, add and transition to it - if (startStates.contains(state)) { - sb.append(" \n"); - sb.append(" \n"); - sb.append(" \n"); - } - - // Add transitions from this state - for (Transition t : transitions) { - if (t.sourceStates == null || !t.sourceStates.contains(state)) continue; - - boolean allowNoTarget = "withJoin".equals(t.type) || "withFork".equals(t.type); - - List targets; - if (t.targetStates == null || t.targetStates.isEmpty()) { - if (!allowNoTarget) { - // self-loop target = source - targets = List.of(state); - } else { - // withJoin/withFork with no target: skip - continue; - } - } else { - targets = t.targetStates; - } - - for (String rawTarget : targets) { - String target = simplify(rawTarget); - if (target == null || target.isEmpty()) continue; - - String event = t.event != null ? simplify(t.event) : null; - String guard = null; - if (t.guard != null && !t.guard.isBlank()) { - if (useLambdaGuards && t.isLambdaGuard) { - guard = "lambda"; - } else { - guard = t.guard.replaceAll("[\\n\\r]+", " ").trim(); - } - } - - sb.append(" \n"); - sb.append(" \n"); - sb.append(" \n"); - } else { - sb.append("/>\n"); - } - } - } - - sb.append(" \n\n"); - } - - sb.append("\n"); - return sb.toString(); - } - - // Helper: extract last enum part - private static String simplify(String full) { - if (full == null) return ""; - int dot = full.lastIndexOf('.'); - return dot >= 0 ? full.substring(dot + 1) : full; - } - - private static String escapeXml(String s) { - if (s == null) return ""; - return s.replace("&", "&").replace("<", "<").replace(">", ">") - .replace("\"", """).replace("'", "'"); - } - -} diff --git a/src/main/java/com/example/statemachinedemo/Main.java b/src/main/java/com/example/statemachinedemo/Main.java index ebb5fa1..0898f1d 100644 --- a/src/main/java/com/example/statemachinedemo/Main.java +++ b/src/main/java/com/example/statemachinedemo/Main.java @@ -1,5 +1,16 @@ package com.example.statemachinedemo; +import com.example.statemachinedemo.app.AstTransitionParser; +import com.example.statemachinedemo.app.StateMachineStateConfigurationMethodFinder; +import com.example.statemachinedemo.app.StateMachineTransitionConfigurationMethodFinder; +import com.example.statemachinedemo.app.TransitionStateUtils; +import com.example.statemachinedemo.app.domain.Transition; +import com.example.statemachinedemo.common.FileUtils; +import com.example.statemachinedemo.in.AstFileFinder; +import com.example.statemachinedemo.out.Dot; +import com.example.statemachinedemo.out.PlantUml; +import com.example.statemachinedemo.out.Scxml; +import com.example.statemachinedemo.out.StateMachineExporter; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -12,75 +23,66 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import static com.example.statemachinedemo.AstFileFinder.hasClassWithAnnotation; -import static com.example.statemachinedemo.ExportUtils.*; - public class Main { private static final String START_DIR = "."; private static final String EXTENSION = ".java"; private static final String TARGET_ANNOTATION = "EnableStateMachineFactory"; public static void main(String[] args) throws IOException { - List javaFiles = AstFileFinder.findJavaFiles(Paths.get(START_DIR), EXTENSION); + List javaFiles = FileUtils.findFilesWithExtension(Paths.get(START_DIR), EXTENSION); + + // List of output handlers + List outputs = List.of( + new PlantUml(), + new Dot(), + new Scxml() + ); for (Path javaFile : javaFiles) { String source = Files.readString(javaFile); + AstFileFinder finder = new AstFileFinder(source); - // Check for annotation (optional) - if (hasClassWithAnnotation(source, TARGET_ANNOTATION)) { + if (finder.hasClassWithAnnotation(source, TARGET_ANNOTATION)) { System.out.println("Found annotation in: " + javaFile.toAbsolutePath()); } - // Find configure method using the reusable finder - MethodDeclaration configureMethod = StateMachineConfigureMethodFinder.findConfigureMethod(source); + MethodDeclaration configureMethod = new StateMachineTransitionConfigurationMethodFinder(source).findConfigureMethod(); if (configureMethod != null) { System.out.println("Found configure method in: " + javaFile.toAbsolutePath()); - - // Print method body System.out.println("Method body:\n" + configureMethod.getBody()); - // Parse transitions - List transitions = TransitionParser.parseTransitions(configureMethod); + List transitions = AstTransitionParser.parseTransitions(configureMethod); for (Transition t : transitions) { System.out.println(t); } - // Find start and end states - Set startStatesTransitions = StateUtils.findStartStates(transitions); - Set endStatesTransitions = StateUtils.findEndStates(transitions); + Set startStatesTransitions = TransitionStateUtils.findStartStates(transitions); + Set endStatesTransitions = TransitionStateUtils.findEndStates(transitions); - - CompilationUnit cu = AstStateUtils.parse(source); - AstStateUtils.StateConfigurerVisitor visitor = new AstStateUtils.StateConfigurerVisitor(); + CompilationUnit cu = StateMachineStateConfigurationMethodFinder.parse(source); + StateMachineStateConfigurationMethodFinder.StateConfigurerVisitor visitor = new StateMachineStateConfigurationMethodFinder.StateConfigurerVisitor(); cu.accept(visitor); + System.out.println("Start States Ast: " + visitor.getInitialStates()); System.out.println("End States Ast: " + visitor.getEndStates()); - System.out.println("Start States: " + startStatesTransitions); System.out.println("End States: " + endStatesTransitions); - Set startStates = new HashSet<>(startStatesTransitions); // copy set1 - startStates.addAll(visitor.getInitialStates()); // add all from set2 - Set endStates = new HashSet<>(endStatesTransitions); // copy set1 - endStates.addAll(visitor.getEndStates()); // add all from set2 + Set startStates = new HashSet<>(startStatesTransitions); + startStates.addAll(visitor.getInitialStates()); + + Set endStates = new HashSet<>(endStatesTransitions); + endStates.addAll(visitor.getEndStates()); - // Derive output base name from input file name String baseName = javaFile.getFileName().toString().replaceFirst("[.][^.]+$", ""); - // Export outputs using dynamic file names - String plantUML = generatePlantUML(transitions, startStates, endStates, true); - try (PrintWriter out = new PrintWriter(baseName + ".plantuml.dot")) { - out.println(plantUML); - } - - String dot = generateDot(transitions, startStates, endStates, true); - try (PrintWriter out = new PrintWriter(baseName + ".dot")) { - out.println(dot); - } - - String scxml = exportToSCXML(transitions, startStates, endStates, true); - try (PrintWriter out = new PrintWriter(baseName + ".scxml.xml")) { - out.println(scxml); + // Iterate over outputs and generate files dynamically + for (StateMachineExporter output : outputs) { + String content = output.export(transitions, startStates, endStates, true); + String fileName = baseName + output.getFileExtension(); + try (PrintWriter out = new PrintWriter(fileName)) { + out.println(content); + } } } } diff --git a/src/main/java/com/example/statemachinedemo/StateMachineConfigureMethodFinder.java b/src/main/java/com/example/statemachinedemo/StateMachineConfigureMethodFinder.java deleted file mode 100644 index dec2c5a..0000000 --- a/src/main/java/com/example/statemachinedemo/StateMachineConfigureMethodFinder.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.example.statemachinedemo; - -import org.eclipse.jdt.core.dom.*; - -import java.util.List; - -public class StateMachineConfigureMethodFinder { - /** - * Parses source code and returns the MethodDeclaration for - * `public void configure(StateMachineTransitionConfigurer transitions) throws Exception` - * in a class extending StateMachineConfigurerAdapter. - * - * @param source Java source code string - * @return MethodDeclaration of configure or null if not found - */ - public static MethodDeclaration findConfigureMethod(String source) { - ASTParser parser = ASTParser.newParser(AST.JLS17); - parser.setSource(source.toCharArray()); - parser.setKind(ASTParser.K_COMPILATION_UNIT); - parser.setResolveBindings(false); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - - ConfigureMethodVisitor visitor = new ConfigureMethodVisitor(); - cu.accept(visitor); - - return visitor.getConfigureMethod(); - } - - private static class ConfigureMethodVisitor extends ASTVisitor { - private MethodDeclaration configureMethod = null; - - @Override - public boolean visit(TypeDeclaration node) { - // Check if class extends StateMachineConfigurerAdapter - if (!node.isInterface() && extendsStateMachineConfigurerAdapter(node)) { - // Look for configure method inside this class - for (MethodDeclaration method : node.getMethods()) { - if (isConfigureMethod(method)) { - configureMethod = method; - return false; // Found, stop visiting further - } - } - } - return true; - } - - private boolean extendsStateMachineConfigurerAdapter(TypeDeclaration node) { - Type superclass = node.getSuperclassType(); - if (superclass == null) return false; - - // Superclass can be parameterized type - if (superclass.isParameterizedType()) { - ParameterizedType pt = (ParameterizedType) superclass; - String superName = pt.getType().toString(); - return superName.equals("StateMachineConfigurerAdapter"); - } else { - return superclass.toString().equals("StateMachineConfigurerAdapter"); - } - } - - private boolean isConfigureMethod(MethodDeclaration method) { - if (!method.getName().getIdentifier().equals("configure")) return false; - - // Must be public void - if (!Modifier.isPublic(method.getModifiers())) return false; - if (!(method.getReturnType2() != null && method.getReturnType2().isPrimitiveType())) return false; - if (!"void".equals(method.getReturnType2().toString())) return false; - - // Exactly one parameter of type StateMachineTransitionConfigurer - List params = method.parameters(); - if (params.size() != 1) return false; - - SingleVariableDeclaration param = (SingleVariableDeclaration) params.get(0); - Type paramType = param.getType(); - - String paramTypeStr = paramType.toString(); - - // Since generic params, just check starts with StateMachineTransitionConfigurer - if (!paramTypeStr.startsWith("StateMachineTransitionConfigurer")) return false; - - // Check throws Exception using thrownExceptionTypes() - @SuppressWarnings("unchecked") - List thrownExceptions = method.thrownExceptionTypes(); - boolean throwsExceptionFound = false; - for (Type excType : thrownExceptions) { - if (excType.toString().equals("Exception")) { - throwsExceptionFound = true; - break; - } - } - if (!throwsExceptionFound) return false; - - return true; - } - - public MethodDeclaration getConfigureMethod() { - return configureMethod; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/example/statemachinedemo/StateUtils.java b/src/main/java/com/example/statemachinedemo/StateUtils.java deleted file mode 100644 index 7869ef8..0000000 --- a/src/main/java/com/example/statemachinedemo/StateUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.example.statemachinedemo; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class StateUtils { - - public static Set findStartStates(List transitions) { - Set sources = new HashSet<>(); - Set targets = new HashSet<>(); - - for (Transition t : transitions) { - // Add all source states after stripping quotes - for (String sourceState : t.sourceStates) { - String source = stripQuotes(sourceState); - if (source != null) sources.add(source); - } - - // Add all target states after stripping quotes, - // but only if not equal to any of the sources of this transition (to allow self-targets) - for (String targetState : t.targetStates) { - String target = stripQuotes(targetState); - if (target != null && !t.sourceStates.stream().map(StateUtils::stripQuotes).anyMatch(s -> s.equals(target))) { - targets.add(target); - } - } - } - - // Start states = sources that are not targets - sources.removeAll(targets); - return sources; - } - - public static Set findEndStates(List transitions) { - Set targets = new HashSet<>(); - Set sources = new HashSet<>(); - - for (Transition t : transitions) { - // Add all target states - for (String targetState : t.targetStates) { - String target = stripQuotes(targetState); - if (target != null) targets.add(target); - } - - // Add all source states, but exclude ones equal to any target of this transition (self-source allowed) - for (String sourceState : t.sourceStates) { - String source = stripQuotes(sourceState); - if (source != null && !t.targetStates.stream().map(StateUtils::stripQuotes).anyMatch(tgt -> tgt.equals(source))) { - sources.add(source); - } - } - } - - // End states = targets that are not sources - targets.removeAll(sources); - return targets; - } - - private static String stripQuotes(String s) { - if (s == null) return null; - return s.replaceAll("^\"|\"$", ""); - } -} diff --git a/src/main/java/com/example/statemachinedemo/Transition.java b/src/main/java/com/example/statemachinedemo/Transition.java deleted file mode 100644 index 6b4a884..0000000 --- a/src/main/java/com/example/statemachinedemo/Transition.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.statemachinedemo; - -import lombok.ToString; - -import java.util.ArrayList; -import java.util.List; - -/** - * Parses Spring State Machine transitions from configure method AST. - */ -@ToString -public class Transition { - public String type; // withExternal, withChoice, withInternal, etc. - public List sourceStates = new ArrayList<>(); - public List targetStates = new ArrayList<>(); - public String event; - - public String guard; - public boolean isLambdaGuard = false; - - public List actions = new ArrayList<>(); - public List isLambdaActions = new ArrayList<>(); - - public Integer order = null; // optional order for withChoice or withJunction - -} \ No newline at end of file diff --git a/src/main/java/com/example/statemachinedemo/TransitionParser.java b/src/main/java/com/example/statemachinedemo/TransitionParser.java deleted file mode 100644 index 16fda5e..0000000 --- a/src/main/java/com/example/statemachinedemo/TransitionParser.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.example.statemachinedemo; - -import org.eclipse.jdt.core.dom.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -public class TransitionParser { - - public static List parseTransitions(MethodDeclaration method) { - List transitions = new ArrayList<>(); - - Block body = method.getBody(); - if (body == null) return transitions; - - for (Object stmtObj : body.statements()) { - if (!(stmtObj instanceof ExpressionStatement)) continue; - - ExpressionStatement stmt = (ExpressionStatement) stmtObj; - Expression expr = stmt.getExpression(); - if (!(expr instanceof MethodInvocation)) continue; - - transitions.addAll(parseTransitionsFromExpression((MethodInvocation) expr)); - } - - return transitions; - } - - private static List parseTransitionsFromExpression(MethodInvocation rootCall) { - List transitions = new ArrayList<>(); - - // Step 1: Unroll method chain into ordered list - List calls = new ArrayList<>(); - Expression current = rootCall; - while (current instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation) current; - calls.add(0, mi); - current = mi.getExpression(); - } - - // Step 2: Split into segments by .and() - List> segments = new ArrayList<>(); - List currentSegment = new ArrayList<>(); - for (MethodInvocation call : calls) { - if ("and".equals(call.getName().getIdentifier())) { - if (!currentSegment.isEmpty()) { - segments.add(currentSegment); - currentSegment = new ArrayList<>(); - } - } else { - currentSegment.add(call); - } - } - if (!currentSegment.isEmpty()) { - segments.add(currentSegment); - } - - // Step 3: Parse each segment - for (List segment : segments) { - boolean isChoice = segment.stream() - .anyMatch(mi -> "withChoice".equals(mi.getName().getIdentifier())); - - boolean isJunction = segment.stream() - .anyMatch(mi -> "withJunction".equals(mi.getName().getIdentifier())); - - if (isChoice || isJunction) { - transitions.addAll(parseChoiceOrJunctionTransitions(segment, isChoice ? "withChoice" : "withJunction")); - } else { - transitions.add(parseStandardTransition(segment)); - } - } - - return transitions; - } - - private static List parseChoiceOrJunctionTransitions(List segment, String type) { - List transitions = new ArrayList<>(); - String sourceState = null; - int orderCounter = 0; - - for (MethodInvocation call : segment) { - String name = call.getName().getIdentifier(); - - if ("source".equals(name) && !call.arguments().isEmpty()) { - sourceState = call.arguments().get(0).toString(); - } - } - - for (MethodInvocation call : segment) { - String name = call.getName().getIdentifier(); - List args = call.arguments(); - - if ("first".equals(name) || "then".equals(name) || "last".equals(name)) { - if (args.isEmpty()) continue; - - Transition t = new Transition(); - t.type = type; - t.sourceStates.add(sourceState); - t.targetStates.add(args.get(0).toString()); - t.event = null; - - // guard is optional second argument - if (args.size() > 1) { - Expression guardExpr = (Expression) args.get(1); - t.guard = guardExpr.toString(); - t.isLambdaGuard = isLambdaOrAnonymous(guardExpr); - } - - // action is optional third argument (only for .then()) - if ("then".equals(name) && args.size() > 2) { - Expression actionExpr = (Expression) args.get(2); - t.actions.add(actionExpr.toString()); - t.isLambdaActions.add(isLambdaOrAnonymous(actionExpr)); - } - - t.order = orderCounter++; - transitions.add(t); - } - } - - return transitions; - } - - public static boolean isLambdaOrAnonymous(Expression expr) { - if (expr == null) return false; - - // Lambda expressions - if (expr instanceof LambdaExpression) { - return true; - } - - // Anonymous class creation - if (expr instanceof ClassInstanceCreation) { - ClassInstanceCreation cic = (ClassInstanceCreation) expr; - if (cic.getAnonymousClassDeclaration() != null) { - return true; - } - } - - return false; - } - - private static final Set SUPPORTED_TRANSITION_TYPES = Set.of( - "withExternal", - "withInternal", - "withLocal", - "withFork", - "withJoin", - "withChoice", - "withJunction" - ); - - private static Transition parseStandardTransition(List segment) { - Transition t = new Transition(); - - for (MethodInvocation call : segment) { - String name = call.getName().getIdentifier(); - List args = call.arguments(); - - if (SUPPORTED_TRANSITION_TYPES.contains(name)) { - t.type = name; - continue; - } - - switch (name) { - case "source": - // Collect all source arguments (for withJoin typically) - for (Object argObj : args) { - Expression argExpr = (Expression) argObj; - t.sourceStates.add(argExpr.toString()); - } - break; - case "target": - // Collect all target arguments (for withFork typically) - for (Object argObj : args) { - Expression argExpr = (Expression) argObj; - t.targetStates.add(argExpr.toString()); - } - break; - case "event": - if (!args.isEmpty()) t.event = args.get(0).toString(); - break; - case "guard": - if (!args.isEmpty()) { - Expression guardExpr = (Expression) args.get(0); - t.guard = guardExpr.toString(); - t.isLambdaGuard = isLambdaOrAnonymous(guardExpr); - } - break; - case "action": - if (!args.isEmpty()) { - Expression actionExpr = (Expression) args.get(0); - t.actions.add(actionExpr.toString()); - t.isLambdaActions.add(isLambdaOrAnonymous(actionExpr)); - } - break; - } - } - - return t; - } -} diff --git a/src/main/java/com/example/statemachinedemo/app/AstTransitionParser.java b/src/main/java/com/example/statemachinedemo/app/AstTransitionParser.java new file mode 100644 index 0000000..d4951b2 --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/app/AstTransitionParser.java @@ -0,0 +1,157 @@ +package com.example.statemachinedemo.app; + +import com.example.statemachinedemo.app.domain.Transition; +import org.eclipse.jdt.core.dom.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +public class AstTransitionParser { + private static final Set SUPPORTED_TRANSITION_TYPES = Set.of( + "withExternal", "withInternal", "withLocal", "withFork", "withJoin", "withChoice", "withJunction" + ); + + public static List parseTransitions(MethodDeclaration method) { + List transitions = new ArrayList<>(); + Optional.ofNullable(method) + .map(MethodDeclaration::getBody) + .ifPresent(body -> { + for (Object stmt : body.statements()) { + if (stmt instanceof ExpressionStatement es + && es.getExpression() instanceof MethodInvocation mi) { + transitions.addAll(parseTransitionsFromExpression(mi)); + } + } + }); + return transitions; + } + + private static List parseTransitionsFromExpression(MethodInvocation rootCall) { + List transitions = new ArrayList<>(); + + // Step 1: Unroll method chain + List calls = new ArrayList<>(); + Expression current = rootCall; + while (current instanceof MethodInvocation mi) { + calls.addFirst(mi); + current = mi.getExpression(); + } + + // Step 2: Split by .and() + List> segments = new ArrayList<>(); + List currentSegment = new ArrayList<>(); + for (MethodInvocation call : calls) { + if ("and".equals(call.getName().getIdentifier())) { + if (!currentSegment.isEmpty()) { + segments.add(currentSegment); + currentSegment = new ArrayList<>(); + } + } else { + currentSegment.add(call); + } + } + if (!currentSegment.isEmpty()) segments.add(currentSegment); + + // Step 3: Parse each segment + for (List segment : segments) { + boolean isChoice = segment.stream().anyMatch(mi -> "withChoice".equals(mi.getName().getIdentifier())); + boolean isJunction = segment.stream().anyMatch(mi -> "withJunction".equals(mi.getName().getIdentifier())); + + if (isChoice || isJunction) { + transitions.addAll(parseChoiceOrJunctionTransitions(segment, isChoice ? "withChoice" : "withJunction")); + } else { + transitions.add(parseStandardTransition(segment)); + } + } + + return transitions; + } + + private static List parseChoiceOrJunctionTransitions(List segment, String type) { + List transitions = new ArrayList<>(); + String sourceState = null; + int orderCounter = 0; + + // Extract source state once + for (MethodInvocation call : segment) { + if ("source".equals(call.getName().getIdentifier()) && !call.arguments().isEmpty()) { + sourceState = call.arguments().getFirst().toString(); + break; // only take the first occurrence + } + } + + for (MethodInvocation call : segment) { + String methodName = call.getName().getIdentifier(); + List args = call.arguments(); + if (!List.of("first", "then", "last").contains(methodName) || args.isEmpty()) { + continue; + } + Transition t = new Transition(); + t.setType(type); + if (sourceState != null) { + t.getSourceStates().add(sourceState); + } + t.getTargetStates().add(args.get(0).toString()); + if (args.size() > 1) { + parseGuard(args.get(1), t); + } + if ("then".equals(methodName) && args.size() > 2) { + parseAction(args.get(2), t); + } + t.setOrder(orderCounter++); + transitions.add(t); + } + return transitions; + } + + + private static Transition parseStandardTransition(List segment) { + Transition t = new Transition(); + for (MethodInvocation call : segment) { + String methodName = call.getName().getIdentifier(); + List args = call.arguments(); + + if (SUPPORTED_TRANSITION_TYPES.contains(methodName)) { + t.setType(methodName); + continue; + } + if (args.isEmpty()) { + continue; + } + + switch (methodName) { + case "source" -> args.forEach(arg -> t.getSourceStates().add(arg.toString())); + case "target" -> args.forEach(arg -> t.getTargetStates().add(arg.toString())); + case "event" -> t.setEvent(args.getFirst().toString()); + case "guard" -> parseGuard(args.getFirst(), t); + case "action" -> parseAction(args.getFirst(), t); + } + } + return t; + } + + private static void parseGuard(Object arg, Transition t) { + if (arg instanceof Expression expr) { + t.setGuard(expr.toString()); + t.setLambdaGuard(isLambdaOrAnonymous(expr)); + } + } + + private static void parseAction(Object arg, Transition t) { + if (arg instanceof Expression expr) { + t.getActions().add(expr.toString()); + t.getIsLambdaActions().add(isLambdaOrAnonymous(expr)); + } + } + + public static boolean isLambdaOrAnonymous(Expression expr) { + return switch (expr) { + case null -> false; + case LambdaExpression le -> true; + case ClassInstanceCreation cic -> cic.getAnonymousClassDeclaration() != null; + default -> false; + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/statemachinedemo/AstStateUtils.java b/src/main/java/com/example/statemachinedemo/app/StateMachineStateConfigurationMethodFinder.java similarity index 55% rename from src/main/java/com/example/statemachinedemo/AstStateUtils.java rename to src/main/java/com/example/statemachinedemo/app/StateMachineStateConfigurationMethodFinder.java index e91fa43..1f36a61 100644 --- a/src/main/java/com/example/statemachinedemo/AstStateUtils.java +++ b/src/main/java/com/example/statemachinedemo/app/StateMachineStateConfigurationMethodFinder.java @@ -1,23 +1,28 @@ -package com.example.statemachinedemo; +package com.example.statemachinedemo.app; +import lombok.Getter; import org.eclipse.jdt.core.dom.*; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; -public class AstStateUtils { +public class StateMachineStateConfigurationMethodFinder { + public static CompilationUnit parse(String source) { + ASTParser parser = ASTParser.newParser(AST.getJLSLatest()); + parser.setSource(source.toCharArray()); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + parser.setResolveBindings(false); + return (CompilationUnit) parser.createAST(null); + } + + @Getter public static class StateConfigurerVisitor extends ASTVisitor { - private Set initialStates = new HashSet<>(); - private Set endStates = new HashSet<>(); - - public Set getInitialStates() { - return initialStates; - } - - public Set getEndStates() { - return endStates; - } + private final Set initialStates = new HashSet<>(); + private final Set endStates = new HashSet<>(); @Override public boolean visit(MethodDeclaration node) { @@ -31,13 +36,9 @@ public class AstStateUtils { // Traverse statements inside configure method for (Object stmtObj : body.statements()) { - if (!(stmtObj instanceof ExpressionStatement)) continue; - - ExpressionStatement exprStmt = (ExpressionStatement) stmtObj; + if (!(stmtObj instanceof ExpressionStatement exprStmt)) continue; Expression expr = exprStmt.getExpression(); - - if (expr instanceof MethodInvocation) { - MethodInvocation rootCall = (MethodInvocation) expr; + if (expr instanceof MethodInvocation rootCall) { // Check if this chain starts with "withStates" if (isWithStatesChain(rootCall)) { @@ -50,26 +51,24 @@ public class AstStateUtils { private boolean isWithStatesChain(MethodInvocation mi) { MethodInvocation current = mi; - while (current != null) { + while (true) { + Expression expr = current.getExpression(); if ("withStates".equals(current.getName().getIdentifier())) { return true; } - Expression expr = current.getExpression(); - if (expr instanceof MethodInvocation) { - current = (MethodInvocation) expr; + if (expr instanceof MethodInvocation next) { + current = next; } else { - break; + return false; } } - return false; } private boolean isInsideRegionOrFork(MethodInvocation mi) { Expression expr = mi.getExpression(); - while (expr instanceof MethodInvocation) { - MethodInvocation parent = (MethodInvocation) expr; - String name = parent.getName().getIdentifier(); - if ("fork".equals(name) || "region".equals(name)) { + while (expr instanceof MethodInvocation parent) { + String methodName = parent.getName().getIdentifier(); + if (List.of("fork", "region").contains(methodName)) { return true; } expr = parent.getExpression(); @@ -80,37 +79,28 @@ public class AstStateUtils { private void parseMethodChain(MethodInvocation mi) { List chain = new ArrayList<>(); Expression current = mi; - while (current instanceof MethodInvocation) { - MethodInvocation m = (MethodInvocation) current; - chain.add(0, m); + while (current instanceof MethodInvocation m) { + chain.addFirst(m); current = m.getExpression(); } for (MethodInvocation call : chain) { String methodName = call.getName().getIdentifier(); List args = call.arguments(); - if (args.isEmpty()) continue; - - if ("initial".equals(methodName)) { - if (!isInsideRegionOrFork(call)) { - Expression arg = (Expression) args.get(0); - initialStates.add(arg.toString()); - } - } else if ("end".equals(methodName)) { - Expression arg = (Expression) args.get(0); - endStates.add(arg.toString()); + if (args.isEmpty()) { + continue; + } + Expression arg = (Expression) args.getFirst(); + switch (methodName) { + case "initial" -> { + if (!isInsideRegionOrFork(call)) { + initialStates.add(arg.toString()); + } + } + case "end" -> endStates.add(arg.toString()); + // ignore others } - // ignore other calls for extraction } } } - - public static CompilationUnit parse(String source) { - ASTParser parser = ASTParser.newParser(AST.JLS21); - parser.setSource(source.toCharArray()); - parser.setKind(ASTParser.K_COMPILATION_UNIT); - parser.setResolveBindings(false); - - return (CompilationUnit) parser.createAST(null); - } } diff --git a/src/main/java/com/example/statemachinedemo/app/StateMachineTransitionConfigurationMethodFinder.java b/src/main/java/com/example/statemachinedemo/app/StateMachineTransitionConfigurationMethodFinder.java new file mode 100644 index 0000000..5424a3d --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/app/StateMachineTransitionConfigurationMethodFinder.java @@ -0,0 +1,81 @@ +package com.example.statemachinedemo.app; + +import lombok.Getter; +import org.eclipse.jdt.core.dom.*; + +import java.util.List; + +public class StateMachineTransitionConfigurationMethodFinder { + private final CompilationUnit cu; + private final ConfigureMethodVisitor visitor = new ConfigureMethodVisitor(); + + public StateMachineTransitionConfigurationMethodFinder(String source) { + ASTParser parser = ASTParser.newParser(AST.getJLSLatest()); + parser.setSource(source.toCharArray()); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + parser.setResolveBindings(false); + + this.cu = (CompilationUnit) parser.createAST(null); + } + + public MethodDeclaration findConfigureMethod() { + this.cu.accept(visitor); + return visitor.getConfigureMethod(); + } + + @Getter + private static class ConfigureMethodVisitor extends ASTVisitor { + private MethodDeclaration configureMethod = null; + + @Override + public boolean visit(TypeDeclaration node) { + if (!node.isInterface() && extendsStateMachineConfigurerAdapter(node)) { + for (MethodDeclaration method : node.getMethods()) { + if (isConfigureMethod(method)) { + configureMethod = method; + return false; // Found, stop visiting further + } + } + } + return true; + } + + private boolean extendsStateMachineConfigurerAdapter(TypeDeclaration node) { + Type superclass = node.getSuperclassType(); + if (superclass == null) + return false; + + if (superclass.isParameterizedType()) { + ParameterizedType pt = (ParameterizedType) superclass; + return pt.getType().toString().equals("StateMachineConfigurerAdapter"); + } + return superclass.toString().equals("StateMachineConfigurerAdapter"); + } + + private boolean isConfigureMethod(MethodDeclaration method) { + if (!method.getName().getIdentifier().equals("configure")) return false; + + if (!Modifier.isPublic(method.getModifiers())) return false; + Type returnType = method.getReturnType2(); + if (returnType == null || !returnType.isPrimitiveType() || !"void".equals(returnType.toString())) + return false; + + @SuppressWarnings("unchecked") + List params = method.parameters(); + if (params.size() != 1) + return false; + + if (!params.getFirst().getType().toString().startsWith("StateMachineTransitionConfigurer")) + return false; + + @SuppressWarnings("unchecked") + List thrownExceptions = method.thrownExceptionTypes(); + for (Type excType : thrownExceptions) { + if (excType.toString().equals("Exception")) { + return true; + } + } + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/statemachinedemo/app/TransitionStateUtils.java b/src/main/java/com/example/statemachinedemo/app/TransitionStateUtils.java new file mode 100644 index 0000000..a8a6294 --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/app/TransitionStateUtils.java @@ -0,0 +1,42 @@ +package com.example.statemachinedemo.app; + +import com.example.statemachinedemo.app.domain.Transition; + +import java.util.Collection; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class TransitionStateUtils { + public static Set findStartStates(Collection transitions) { + Set allTargetStates = transitions.stream() + .flatMap(t -> normalizeStates(t.getTargetStates())) + .collect(Collectors.toSet()); + return transitions.stream() + .flatMap(t -> normalizeStates(t.getSourceStates())) + .filter(state -> !allTargetStates.contains(state)) + .collect(Collectors.toSet()); + } + + public static Set findEndStates(Collection transitions) { + Set allSourceStates = transitions.stream() + .flatMap(t -> normalizeStates(t.getSourceStates())) + .collect(Collectors.toSet()); + return transitions.stream() + .flatMap(t -> normalizeStates(t.getTargetStates())) + .filter(state -> !allSourceStates.contains(state)) + .collect(Collectors.toSet()); + } + + private static Stream normalizeStates(Collection states) { + return states.stream() + .map(TransitionStateUtils::stripQuotes) + .filter(Objects::nonNull); + } + + private static String stripQuotes(String s) { + if (s == null) return null; + return s.replaceAll("^\"|\"$", ""); + } +} diff --git a/src/main/java/com/example/statemachinedemo/app/domain/Transition.java b/src/main/java/com/example/statemachinedemo/app/domain/Transition.java new file mode 100644 index 0000000..317c7bf --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/app/domain/Transition.java @@ -0,0 +1,26 @@ +package com.example.statemachinedemo.app.domain; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.ArrayList; +import java.util.List; + +@ToString +@Getter +@Setter +public class Transition { + private String type; // withExternal, withChoice, withInternal, etc. + private List sourceStates = new ArrayList<>(); + private List targetStates = new ArrayList<>(); + private String event; + + private String guard; + private boolean isLambdaGuard = false; + + private List actions = new ArrayList<>(); + private List isLambdaActions = new ArrayList<>(); + + private Integer order = null; // optional order for withChoice or withJunction +} diff --git a/src/main/java/com/example/statemachinedemo/common/FileUtils.java b/src/main/java/com/example/statemachinedemo/common/FileUtils.java new file mode 100644 index 0000000..397e2d9 --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/common/FileUtils.java @@ -0,0 +1,18 @@ +package com.example.statemachinedemo.common; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FileUtils { + public static List findFilesWithExtension(Path startDir, String extension) throws IOException { + try (Stream paths = Files.walk(startDir)) { + return paths + .filter(p -> Files.isRegularFile(p) && p.toString().endsWith(extension)) + .collect(Collectors.toList()); + } + } +} diff --git a/src/main/java/com/example/statemachinedemo/in/AstFileFinder.java b/src/main/java/com/example/statemachinedemo/in/AstFileFinder.java new file mode 100644 index 0000000..0f442fe --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/in/AstFileFinder.java @@ -0,0 +1,36 @@ +package com.example.statemachinedemo.in; + +import org.eclipse.jdt.core.dom.*; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class AstFileFinder { + private final CompilationUnit cu; + + public AstFileFinder(String source) { + ASTParser parser = ASTParser.newParser(AST.getJLSLatest()); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + parser.setResolveBindings(false); + parser.setSource(source.toCharArray()); + this.cu = (CompilationUnit) parser.createAST(null); + } + + public boolean hasClassWithAnnotation(String source, String annotationName) { + AtomicBoolean found = new AtomicBoolean(false); + cu.accept(new ASTVisitor() { + @Override + public boolean visit(TypeDeclaration node) { + if (node.isInterface()) return true; + for (Object modifier : node.modifiers()) { + if (modifier instanceof Annotation annotation && + annotation.getTypeName().getFullyQualifiedName().equals(annotationName)) { + found.set(true); + return false; + } + } + return true; + } + }); + return found.get(); + } +} diff --git a/src/main/java/com/example/statemachinedemo/out/Dot.java b/src/main/java/com/example/statemachinedemo/out/Dot.java new file mode 100644 index 0000000..494b5a8 --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/out/Dot.java @@ -0,0 +1,168 @@ +package com.example.statemachinedemo.out; + +import com.example.statemachinedemo.app.domain.Transition; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Dot implements StateMachineExporter { + + @Override + public String export(List transitions, + Set startStates, + Set endStates, + boolean useLambdaGuards) { + StringBuilder sb = new StringBuilder(); + sb.append("digraph stateMachine {\n"); + sb.append(" rankdir=LR;\n"); + sb.append(" node [shape=circle, style=filled, fillcolor=lightgray];\n\n"); + + // 1. Fake start node + sb.append(" start [shape=point, label=\"\"];\n"); + + // 2. Find states with choice transitions + Set statesWithChoice = new HashSet<>(); + for (Transition t : transitions) { + if ("withChoice".equals(t.getType())) { + for (String source : t.getSourceStates()) { + statesWithChoice.add(simplify(source)); + } + } + } + + // 3. Declare normal states and choice pseudostates + Set allStates = new HashSet<>(); + for (Transition t : transitions) { + if (t.getSourceStates() != null) { + for (String s : t.getSourceStates()) allStates.add(simplify(s)); + } + if (t.getTargetStates() != null) { + for (String tgt : t.getTargetStates()) allStates.add(simplify(tgt)); + } + } + + // Print all normal states (except choice pseudostates for now) + for (String state : allStates) { + if (!statesWithChoice.contains(state + "_choice")) { + String shape = endStates.contains(state) ? "doublecircle" : "circle"; + sb.append(" ").append(state) + .append(" [shape=").append(shape).append(", fillcolor=lightgray];\n"); + } + } + sb.append("\n"); + + // Declare choice pseudostates as diamonds + for (String state : statesWithChoice) { + String choiceNode = state + "_choice"; + sb.append(" ").append(choiceNode) + .append(" [shape=diamond, label=\"\", fillcolor=lightyellow];\n"); + } + sb.append("\n"); + + // 4. Connect start node(s) to start states + for (String start : startStates) { + sb.append(" start -> ").append(simplify(start)).append(";\n"); + } + sb.append("\n"); + + // 5. Connect normal states to their choice pseudostates + for (String state : statesWithChoice) { + String choiceNode = state + "_choice"; + sb.append(" ").append(state).append(" -> ").append(choiceNode).append(";\n"); + } + sb.append("\n"); + + // 6. Transitions: reroute withChoice transitions via choice pseudostate + for (Transition t : transitions) { + if (t.getSourceStates() == null || t.getSourceStates().isEmpty()) continue; + + boolean allowNoTarget = "withJoin".equals(t.getType()) || "withFork".equals(t.getType()); + + List targets; + if (t.getTargetStates() == null || t.getTargetStates().isEmpty()) { + if (!allowNoTarget) { + // self-loop: targets = sources + targets = t.getSourceStates(); + } else { + // withJoin/withFork with no targets: skip + continue; + } + } else { + targets = t.getTargetStates(); + } + + for (String rawSource : t.getSourceStates()) { + String source = simplify(rawSource); + + for (String rawTarget : targets) { + String target = simplify(rawTarget); + String edgeSource = source; + + if ("withChoice".equals(t.getType()) && statesWithChoice.contains(source)) { + edgeSource = source + "_choice"; + } + + // Prepare guard text + String guardText = ""; + if (t.getGuard() != null && !t.getGuard().isBlank()) { + if (useLambdaGuards && t.isLambdaGuard()) { + guardText = "lambda"; + } else { + guardText = t.getGuard().replaceAll("[\\n\\r]+", " ").replaceAll("\\s{2,}", " ").trim(); + } + } + + // Prepare actions text + String actionsText = ""; + if (t.getActions() != null && !t.getActions().isEmpty()) { + StringBuilder actionBuilder = new StringBuilder(); + for (int i = 0; i < t.getActions().size(); i++) { + if (i > 0) actionBuilder.append(", "); + String action = t.getActions().get(i); + boolean isLambda = t.getIsLambdaActions().get(i); + if (useLambdaGuards && isLambda) { + actionBuilder.append("lambda"); + } else { + actionBuilder.append(action); + } + } + actionsText = actionBuilder.toString(); + } + + // Build label with event, guard, and actions + StringBuilder label = new StringBuilder(); + if (t.getEvent() != null && !t.getEvent().isBlank()) { + label.append(simplify(t.getEvent())); + } + if (!guardText.isBlank()) { + if (!label.isEmpty()) label.append(" "); + label.append("[").append(guardText).append("]"); + } + if (!actionsText.isBlank()) { + if (!label.isEmpty()) label.append(" / "); + label.append(actionsText); + } + + // Add order info for choice/junction transitions + if (("withChoice".equals(t.getType()) || "withJunction".equals(t.getType())) && t.getOrder() != null) { + if (!label.isEmpty()) label.append(" "); + label.append("(order=").append(t.getOrder()).append(")"); + } + + String edgeLabel = !label.isEmpty() ? " [label=\"" + label.toString() + "\"]" : ""; + + sb.append(" ").append(edgeSource).append(" -> ").append(target).append(edgeLabel).append(";\n"); + } + } + } + + sb.append("}\n"); + return sb.toString(); + } + + @Override + public String getFileExtension() { + return ".dot"; + } +} diff --git a/src/main/java/com/example/statemachinedemo/out/PlantUml.java b/src/main/java/com/example/statemachinedemo/out/PlantUml.java new file mode 100644 index 0000000..066938f --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/out/PlantUml.java @@ -0,0 +1,184 @@ +package com.example.statemachinedemo.out; + +import com.example.statemachinedemo.app.domain.Transition; +import io.micrometer.common.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class PlantUml implements StateMachineExporter { + + @Override + public String export(List transitions, + Set startStates, + Set endStates, + boolean useLambdaGuards) { + StringBuilder sb = new StringBuilder(); + sb.append("@startuml\n"); + sb.append("skinparam state {\n"); + sb.append(" BackgroundColor<> LightYellow\n"); + sb.append("}\n\n"); + + // 1. Print start states + for (String start : startStates) { + sb.append("[*] --> ").append(simplify(start)).append("\n"); + } + sb.append("\n"); + + // 2. Find all states that have choice transitions originating from them + Set statesWithChoice = new HashSet<>(); + for (Transition t : transitions) { + if ("withChoice".equals(t.getType())) { + for (String source : t.getSourceStates()) { + statesWithChoice.add(simplify(source)); + } + } + } + + // 3. Declare choice pseudostates & connect from original state + for (String state : statesWithChoice) { + String choiceState = state + "_choice"; + sb.append("state ").append(choiceState).append(" <>\n"); + sb.append(state).append(" --> ").append(choiceState).append("\n"); + } + sb.append("\n"); + + // Color palette for choices + List choiceColors = List.of("FF6347", "4682B4", "32CD32", "FFD700", "6A5ACD", "FF69B4"); + + // Assign color to each choice state + Map choiceStateColorMap = new HashMap<>(); + int colorIndex = 0; + for (String state : statesWithChoice) { + choiceStateColorMap.put(state, choiceColors.get(colorIndex % choiceColors.size())); + colorIndex++; + } + + Set transitionLines = new HashSet<>(); + + // 4. Output transitions + for (Transition t : transitions) { + if (t.getSourceStates() == null || t.getSourceStates().isEmpty()) continue; + + boolean allowNoTarget = "withJoin".equals(t.getType()) || "withFork".equals(t.getType()); + + List targets; + if (t.getTargetStates() == null || t.getTargetStates().isEmpty()) { + if (!allowNoTarget) { + targets = t.getSourceStates(); // Self-loop + } else { + continue; + } + } else { + targets = t.getTargetStates(); + } + + for (String rawSource : t.getSourceStates()) { + String source = simplify(rawSource); + + for (String rawTarget : targets) { + String target = simplify(rawTarget); + String transitionSource = "withChoice".equals(t.getType()) && statesWithChoice.contains(source) + ? source + "_choice" + : source; + + String label = buildLabel(t, useLambdaGuards); + String color = getColor(t, source, choiceStateColorMap); + String line = transitionSource + " -[#"+color+",bold]-> " + target + (label.isEmpty() ? "" : (" : " + label)); + + if (transitionLines.add(line)) { + sb.append(line).append("\n"); + } + } + } + } + + sb.append("\n"); + + // 5. Mark end states + for (String end : endStates) { + sb.append(simplify(end)).append(" --> [*]\n"); + } + + sb.append("@enduml\n"); + return sb.toString(); + } + + @Override + public String getFileExtension() { + return ".plantuml.dot"; + } + + private String getGuardText(Transition t, boolean useLambdaGuards) { + String guard = t.getGuard(); + if (StringUtils.isBlank(guard)) { + return ""; + } + if (useLambdaGuards && t.isLambdaGuard()) { + return "lambda"; + } + return guard + .replaceAll("[\\n\\r]+", " ") + .replaceAll("\\s{2,}", " ") + .trim(); + } + + private String getActionsText(Transition t, boolean useLambdaGuards) { + if (t.getActions() == null || t.getActions().isEmpty()) { + return ""; + } + + List actions = t.getActions(); + List isLambdaFlags = t.getIsLambdaActions(); + + // Defensive: ensure lists are same size to avoid IndexOutOfBoundsException + int size = Math.min(actions.size(), isLambdaFlags.size()); + + return IntStream.range(0, size) + .mapToObj(i -> (useLambdaGuards && isLambdaFlags.get(i)) ? "lambda" : actions.get(i)) + .collect(Collectors.joining(", ")); + } + + private String buildLabel(Transition t, boolean useLambdaGuards) { + List parts = new ArrayList<>(); + Optional.ofNullable(t.getEvent()) + .filter(e -> !e.isBlank()) + .map(this::simplify) + .ifPresent(parts::add); + Optional.of(getGuardText(t, useLambdaGuards)) + .filter(g -> !g.isBlank()) + .map(g -> "[" + g + "]") + .ifPresent(parts::add); + Optional.of(getActionsText(t, useLambdaGuards)) + .filter(a -> !a.isBlank()) + .ifPresent(actions -> { + if (!parts.isEmpty()) { + int lastIndex = parts.size() - 1; + String last = parts.get(lastIndex); + parts.set(lastIndex, last + " / " + actions); + } else { + parts.add(actions); + } + }); + Optional.ofNullable(t.getOrder()) + .filter(order -> List.of("withChoice", "withJunction").contains(t.getType())) + .map(order -> "(order=" + order + ")") + .ifPresent(parts::add); + + return String.join(" ", parts); + } + + private String getColor(Transition t, String source, Map choiceStateColorMap) { + return switch (t.getType()) { + case "withChoice" -> choiceStateColorMap.getOrDefault(source, "000000"); + case "withExternal" -> "1E90FF"; + case "withInternal" -> "32CD32"; + case "withLocal" -> "FFA500"; + case "withJunction" -> "FF69B4"; + case "withJoin" -> "8A2BE2"; + case "withFork" -> "20B2AA"; + default -> "000000"; + }; + } +} diff --git a/src/main/java/com/example/statemachinedemo/out/Scxml.java b/src/main/java/com/example/statemachinedemo/out/Scxml.java new file mode 100644 index 0000000..3a4b10f --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/out/Scxml.java @@ -0,0 +1,112 @@ +package com.example.statemachinedemo.out; + +import com.example.statemachinedemo.app.domain.Transition; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Scxml implements StateMachineExporter { + + @Override + public String export(List transitions, + Set startStates, + Set endStates, + boolean useLambdaGuards) { + + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + sb.append("\n\n"); + + // 1. Collect all states + Set allStates = new HashSet<>(); + for (Transition t : transitions) { + if (t.getSourceStates() != null) allStates.addAll(t.getSourceStates()); + if (t.getTargetStates() != null) allStates.addAll(t.getTargetStates()); + } + + // 2. Emit elements + for (String state : allStates) { + String simpleState = simplify(state); + sb.append(" \n"); + + if (startStates.contains(state)) { + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + } + + for (Transition t : transitions) { + if (t.getSourceStates() == null || !t.getSourceStates().contains(state)) continue; + + boolean allowNoTarget = "withJoin".equals(t.getType()) || "withFork".equals(t.getType()); + List targets; + + if (t.getTargetStates() == null || t.getTargetStates().isEmpty()) { + if (!allowNoTarget) { + targets = List.of(state); // self-loop + } else { + continue; + } + } else { + targets = t.getTargetStates(); + } + + for (String rawTarget : targets) { + String target = simplify(rawTarget); + if (target.isEmpty()) continue; + + sb.append(renderTransition(t, target, useLambdaGuards)); + } + } + + sb.append(" \n\n"); + } + + sb.append("\n"); + return sb.toString(); + } + + @Override + public String getFileExtension() { + return ".scxml.xml"; + } + + private static String getGuardText(Transition t, boolean useLambdaGuards) { + if (t.getGuard() == null || t.getGuard().isBlank()) return ""; + if (useLambdaGuards && t.isLambdaGuard()) return "lambda"; + return t.getGuard().replaceAll("[\\n\\r]+", " ").replaceAll("\\s{2,}", " ").trim(); + } + + private static String escapeXml(String s) { + if (s == null) return ""; + return s.replace("&", "&").replace("<", "<").replace(">", ">") + .replace("\"", """).replace("'", "'"); + } + + private String renderTransition(Transition t, String target, boolean useLambdaGuards) { + StringBuilder sb = new StringBuilder(" \n"); + sb.append(" \n"); + sb.append(" \n"); + } else { + sb.append("/>\n"); + } + + return sb.toString(); + } +} diff --git a/src/main/java/com/example/statemachinedemo/out/StateMachineExporter.java b/src/main/java/com/example/statemachinedemo/out/StateMachineExporter.java new file mode 100644 index 0000000..3ee15d1 --- /dev/null +++ b/src/main/java/com/example/statemachinedemo/out/StateMachineExporter.java @@ -0,0 +1,21 @@ +package com.example.statemachinedemo.out; + +import com.example.statemachinedemo.app.domain.Transition; + +import java.util.List; +import java.util.Set; + +public interface StateMachineExporter { + String export(List transitions, + Set startStates, + Set endStates, + boolean useLambdaGuards); + + // Helper: extract last enum part + default String simplify(String full) { + if (full == null) return ""; + int dot = full.lastIndexOf('.'); + return dot >= 0 ? full.substring(dot + 1) : full; + } + String getFileExtension(); // e.g. ".dot", ".plantuml.dot", ".scxml.xml" +} diff --git a/src/main/java/com/example/statemachinedemo/notgoodspringbased/SpringExporter.java b/src/main/java/com/example/statemachinedemo/z/notgoodspringbased/SpringExporter.java similarity index 87% rename from src/main/java/com/example/statemachinedemo/notgoodspringbased/SpringExporter.java rename to src/main/java/com/example/statemachinedemo/z/notgoodspringbased/SpringExporter.java index 373fccb..978dc9c 100644 --- a/src/main/java/com/example/statemachinedemo/notgoodspringbased/SpringExporter.java +++ b/src/main/java/com/example/statemachinedemo/z/notgoodspringbased/SpringExporter.java @@ -1,9 +1,10 @@ -package com.example.statemachinedemo.notgoodspringbased; +package com.example.statemachinedemo.z.notgoodspringbased; -import com.example.statemachinedemo.statemachine.OrderEvents; -import com.example.statemachinedemo.statemachine.OrderStates; +import com.example.statemachinedemo.z.statemachine.OrderEvents; +import com.example.statemachinedemo.z.statemachine.OrderStates; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.statemachine.StateMachine; @@ -34,8 +35,7 @@ public class SpringExporter { @Slf4j @RequiredArgsConstructor class Runner implements ApplicationRunner { - private final StateMachineFactory factory; - // +// private final StateMachineFactory simpleEnumStateMachineConfiguration; // @Override // public void run(ApplicationArguments args) throws Exception { // StateMachine stateMachine = factory.getStateMachine("order"); @@ -51,7 +51,7 @@ class Runner implements ApplicationRunner { public void run(ApplicationArguments args) throws Exception { c.a(); c2.a(); -// c3.exportToSCXML(); + c3.exportToSCXML(); } } @@ -126,13 +126,13 @@ class StateMachinePlantUMLExporter { } } - @Component @RequiredArgsConstructor class Config1 { - private final StateMachineFactory factory; + @Qualifier("simpleEnumStateMachineFactory") + private final StateMachineFactory simpleEnumStateMachineConfiguration; public void a() throws FileNotFoundException { - StateMachine stateMachine = factory.getStateMachine("order"); + StateMachine stateMachine = simpleEnumStateMachineConfiguration.getStateMachine("order"); StateMachineDotExporter exporter = new StateMachineDotExporter(); try (PrintWriter out = new PrintWriter("statemachine.dot")) { @@ -144,9 +144,10 @@ class Config1 { @Component @RequiredArgsConstructor class Config2 { - private final StateMachineFactory factory; + @Qualifier("simpleEnumStateMachineFactory") + private final StateMachineFactory simpleEnumStateMachineConfiguration; public void a() throws FileNotFoundException { - StateMachine stateMachine = factory.getStateMachine("order"); + StateMachine stateMachine = simpleEnumStateMachineConfiguration.getStateMachine("order"); try (PrintWriter out = new PrintWriter("statemachine.uml.dot")) { StateMachinePlantUMLExporter.export(stateMachine, out); @@ -156,12 +157,13 @@ class Config2 { @Component @RequiredArgsConstructor class Config3 { - private final StateMachineFactory factory; + @Qualifier("simpleEnumStateMachineFactory") + private final StateMachineFactory simpleEnumStateMachineConfiguration; public void exportToSCXML() throws Exception { - StateMachine stateMachine = factory.getStateMachine("order"); + StateMachine stateMachine = simpleEnumStateMachineConfiguration.getStateMachine("order"); SCXMLExporter exporter = new SCXMLExporter(); - File file = new File("statemachine.scxml"); + File file = new File("statemachine.scxml.xml"); exporter.exportToSCXML(stateMachine); } } diff --git a/src/main/java/com/example/statemachinedemo/statemachine/ComplexStateMachineConfig.java b/src/main/java/com/example/statemachinedemo/z/statemachine/ComplexStateMachineConfig.java similarity index 95% rename from src/main/java/com/example/statemachinedemo/statemachine/ComplexStateMachineConfig.java rename to src/main/java/com/example/statemachinedemo/z/statemachine/ComplexStateMachineConfig.java index ff58919..8515819 100644 --- a/src/main/java/com/example/statemachinedemo/statemachine/ComplexStateMachineConfig.java +++ b/src/main/java/com/example/statemachinedemo/z/statemachine/ComplexStateMachineConfig.java @@ -1,13 +1,9 @@ -package com.example.statemachinedemo.statemachine; +package com.example.statemachinedemo.z.statemachine; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.statemachine.StateContext; import org.springframework.statemachine.action.Action; -import org.springframework.statemachine.config.EnableStateMachine; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; -import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; @@ -15,7 +11,7 @@ import org.springframework.statemachine.guard.Guard; import java.util.EnumSet; @Configuration -@EnableStateMachineFactory +@EnableStateMachineFactory(name = "complexStateMachineFactory") public class ComplexStateMachineConfig extends StateMachineConfigurerAdapter { public enum States { diff --git a/src/main/java/com/example/statemachinedemo/statemachine/ForkJoinStateMachineConfig.java b/src/main/java/com/example/statemachinedemo/z/statemachine/ForkJoinStateMachineConfig.java similarity index 95% rename from src/main/java/com/example/statemachinedemo/statemachine/ForkJoinStateMachineConfig.java rename to src/main/java/com/example/statemachinedemo/z/statemachine/ForkJoinStateMachineConfig.java index f0a8f83..bd027f8 100644 --- a/src/main/java/com/example/statemachinedemo/statemachine/ForkJoinStateMachineConfig.java +++ b/src/main/java/com/example/statemachinedemo/z/statemachine/ForkJoinStateMachineConfig.java @@ -1,19 +1,16 @@ -package com.example.statemachinedemo.statemachine; +package com.example.statemachinedemo.z.statemachine; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.action.Action; -import org.springframework.statemachine.config.EnableStateMachine; +import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; -import org.springframework.statemachine.state.EnumState; import org.springframework.statemachine.guard.Guard; -import java.util.EnumSet; - @Configuration -@EnableStateMachine +@EnableStateMachineFactory(name = "forkJoinStateMachineFactory") public class ForkJoinStateMachineConfig extends StateMachineConfigurerAdapter { public enum States { diff --git a/src/main/java/com/example/statemachinedemo/statemachine/OrderEvents.java b/src/main/java/com/example/statemachinedemo/z/statemachine/OrderEvents.java similarity index 59% rename from src/main/java/com/example/statemachinedemo/statemachine/OrderEvents.java rename to src/main/java/com/example/statemachinedemo/z/statemachine/OrderEvents.java index 9cf826b..60f7402 100644 --- a/src/main/java/com/example/statemachinedemo/statemachine/OrderEvents.java +++ b/src/main/java/com/example/statemachinedemo/z/statemachine/OrderEvents.java @@ -1,4 +1,4 @@ -package com.example.statemachinedemo.statemachine; +package com.example.statemachinedemo.z.statemachine; public enum OrderEvents { FULFILL, PAY, CANCEL, diff --git a/src/main/java/com/example/statemachinedemo/statemachine/OrderStates.java b/src/main/java/com/example/statemachinedemo/z/statemachine/OrderStates.java similarity index 70% rename from src/main/java/com/example/statemachinedemo/statemachine/OrderStates.java rename to src/main/java/com/example/statemachinedemo/z/statemachine/OrderStates.java index 5d30ed3..fc78ddf 100644 --- a/src/main/java/com/example/statemachinedemo/statemachine/OrderStates.java +++ b/src/main/java/com/example/statemachinedemo/z/statemachine/OrderStates.java @@ -1,4 +1,4 @@ -package com.example.statemachinedemo.statemachine; +package com.example.statemachinedemo.z.statemachine; public enum OrderStates { SUBMITTED, PAID, FULFILLED, CANCELED diff --git a/src/main/java/com/example/statemachinedemo/statemachine/SimpleEnumStateMachineConfiguration.java b/src/main/java/com/example/statemachinedemo/z/statemachine/SimpleEnumStateMachineConfiguration.java similarity index 97% rename from src/main/java/com/example/statemachinedemo/statemachine/SimpleEnumStateMachineConfiguration.java rename to src/main/java/com/example/statemachinedemo/z/statemachine/SimpleEnumStateMachineConfiguration.java index 006c8ea..f90df8e 100644 --- a/src/main/java/com/example/statemachinedemo/statemachine/SimpleEnumStateMachineConfiguration.java +++ b/src/main/java/com/example/statemachinedemo/z/statemachine/SimpleEnumStateMachineConfiguration.java @@ -1,4 +1,4 @@ -package com.example.statemachinedemo.statemachine; +package com.example.statemachinedemo.z.statemachine; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -14,7 +14,7 @@ import org.springframework.statemachine.listener.StateMachineListenerAdapter; import org.springframework.statemachine.state.State; @Configuration -@EnableStateMachineFactory +@EnableStateMachineFactory(name = "simpleEnumStateMachineFactory") @Slf4j class SimpleEnumStateMachineConfiguration extends StateMachineConfigurerAdapter { @Override diff --git a/src/test/java/com/example/statemachinedemo/StatemachinedemoApplicationTests.java b/src/test/java/com/example/statemachinedemo/StatemachinedemoApplicationTests.java index 41ff069..570c043 100644 --- a/src/test/java/com/example/statemachinedemo/StatemachinedemoApplicationTests.java +++ b/src/test/java/com/example/statemachinedemo/StatemachinedemoApplicationTests.java @@ -3,7 +3,7 @@ package com.example.statemachinedemo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -//@SpringBootTest +@SpringBootTest class StatemachinedemoApplicationTests { @Test diff --git a/statemachine.1.dot b/statemachine.1.dot deleted file mode 100644 index 0b411cb..0000000 --- a/statemachine.1.dot +++ /dev/null @@ -1,38 +0,0 @@ -digraph stateMachine { - rankdir=LR; - node [shape=circle, style=filled, fillcolor=lightgray]; - - start [shape=point, label=""]; - FULFILLED [shape=circle, fillcolor=lightgray]; - PAID1 [shape=circle, fillcolor=lightgray]; - PAID3 [shape=circle, fillcolor=lightgray]; - PAID2 [shape=circle, fillcolor=lightgray]; - HAPPEN [shape=circle, fillcolor=lightgray]; - CANCELED [shape=circle, fillcolor=lightgray]; - PAID [shape=circle, fillcolor=lightgray]; - SUBMITTED [shape=circle, fillcolor=lightgray]; - - PAID_choice [shape=diamond, label="", fillcolor=lightyellow]; - SUBMITTED_choice [shape=diamond, label="", fillcolor=lightyellow]; - - start -> SUBMITTED; - - PAID -> PAID_choice; - SUBMITTED -> SUBMITTED_choice; - - SUBMITTED -> PAID [label="PAY"]; - PAID -> FULFILLED [label="FULFILL"]; - SUBMITTED -> CANCELED [label="CANCEL [lambda]"]; - PAID -> CANCELED [label="CANCEL"]; - SUBMITTED -> SUBMITTED [label="ABCD"]; - SUBMITTED_choice -> PAID2 [label="[lambda] (order=0)"]; - SUBMITTED_choice -> PAID3 [label="(order=1)"]; - PAID_choice -> PAID1 [label="[lambda] (order=0)"]; - PAID_choice -> PAID2 [label="[guard1] (order=1)"]; - PAID_choice -> HAPPEN [label="[lambda] (order=2)"]; - PAID_choice -> PAID3 [label="(order=3)"]; - PAID2 -> CANCELED; - PAID3 -> CANCELED; - PAID1 -> PAID1 [label="ABCD / lambda, action2"]; -} - diff --git a/statemachine.2.dot b/statemachine.2.dot deleted file mode 100644 index fa3c4a1..0000000 --- a/statemachine.2.dot +++ /dev/null @@ -1,33 +0,0 @@ -@startuml -skinparam state { - BackgroundColor<> LightYellow -} - -[*] --> SUBMITTED - -state PAID_choice <> -PAID --> PAID_choice -state SUBMITTED_choice <> -SUBMITTED --> SUBMITTED_choice - -SUBMITTED -[#1E90FF,bold]-> PAID : PAY -PAID -[#1E90FF,bold]-> FULFILLED : FULFILL -SUBMITTED -[#1E90FF,bold]-> CANCELED : CANCEL [lambda] -PAID -[#1E90FF,bold]-> CANCELED : CANCEL -SUBMITTED -[#1E90FF,bold]-> SUBMITTED : ABCD -SUBMITTED_choice -[#4682B4,bold]-> PAID2 : [lambda] (order=0) -SUBMITTED_choice -[#4682B4,bold]-> PAID3 : (order=1) -PAID_choice -[#FF6347,bold]-> PAID1 : [lambda] (order=0) -PAID_choice -[#FF6347,bold]-> PAID2 : [guard1] (order=1) -PAID_choice -[#FF6347,bold]-> HAPPEN : [lambda] (order=2) -PAID_choice -[#FF6347,bold]-> PAID3 : (order=3) -PAID2 -[#1E90FF,bold]-> CANCELED -PAID3 -[#1E90FF,bold]-> CANCELED -PAID1 -[#1E90FF,bold]-> PAID1 : ABCD / lambda, action2 - -PAID1 --> [*] -CANCELED --> [*] -FULFILLED --> [*] -HAPPEN --> [*] -@enduml - diff --git a/statemachine.2.png b/statemachine.2.png deleted file mode 100644 index 5e6dbeb8c3b4652c1529ccf688553bea580c7734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73308 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 U;;qPw - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/statemachine.dot b/statemachine.dot deleted file mode 100644 index d6e5604..0000000 --- a/statemachine.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph stateMachine { - SUBMITTED; - CANCELED; - PAID; - FULFILLED; - PAID2; - PAID3; - SUBMITTED -> PAID [label="PAY"]; - PAID -> FULFILLED [label="FULFILL"]; - SUBMITTED -> CANCELED [label="CANCEL"]; - PAID -> CANCELED [label="CANCEL"]; - PAID2 -> CANCELED [label=""]; - PAID3 -> CANCELED [label=""]; -} diff --git a/statemachine.png b/statemachine.png deleted file mode 100644 index 46961a4d6bc8314ff7b89bd5cf8e4ec5513c6b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125422 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

J9M;7^@`JUG)G3MH6RG@p&Xvro4s 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 SUBMITTED -SUBMITTED --> PAID : PAY -PAID --> FULFILLED : FULFILL -SUBMITTED --> CANCELED : CANCEL [guard] -PAID --> CANCELED : CANCEL -PAID2 --> CANCELED -PAID3 --> CANCELED -CANCELED --> [*] -FULFILLED --> [*] -@enduml