diff --git a/README.md b/README.md index 7a83f09..be7c238 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ HTML-specific options: | `--no-diamonds` | Render choice pseudostates as normal nodes | | `--debug` | Same diagnostic mode as the core exporter | | `--include-generated-sources` | Same generated-source scanning as the core exporter | +| `--no-inline-accessors` | Disable accessor indexing/inlining (enabled by default) | | `-p, --profiles` | Spring profiles for property resolution | ## Business Flows diff --git a/state_machine_exporter/scripts/audit_golden_json.py b/state_machine_exporter/scripts/audit_golden_json.py new file mode 100644 index 0000000..a685415 --- /dev/null +++ b/state_machine_exporter/scripts/audit_golden_json.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +"""Deep audit of golden JSON analysis exports.""" +import json +import re +from collections import defaultdict +from pathlib import Path + +GOLDEN = Path(__file__).resolve().parent.parent / "src/test/resources/golden" +PH = re.compile(r"\$\{") + + +def fn_form(identifier): + if not identifier: + return identifier + last = identifier.rfind(".") + if last <= 0: + return identifier + prev = identifier.rfind(".", 0, last) + return identifier[prev + 1 :] if prev > 0 else identifier + + +def sid(st): + if isinstance(st, dict): + return st.get("fullIdentifier") or st.get("rawName") + return st + + +def eid(ev): + if isinstance(ev, dict): + return ev.get("fullIdentifier") or ev.get("rawName") + return ev + + +def audit_file(path, data): + name = data.get("name", path.stem) + issues = [] + st_fqn = data.get("stateTypeFqn") + ev_fqn = data.get("eventTypeFqn") + transitions = data.get("transitions") or [] + starts = list(data.get("startStates") or []) + ends = list(data.get("endStates") or []) + states = data.get("states") or [] + meta = data.get("metadata") or {} + + is_pkg_enum = st_fqn and "." in st_fqn and st_fqn not in ("String", "java.lang.String") + is_string = st_fqn in (None, "String", "java.lang.String") or ( + not st_fqn and not ev_fqn + ) + + if PH.search(json.dumps(data)): + issues.append("BUG: unresolved ${placeholder} in export") + + # Duplicate fullIdentifiers in states[] + by_full = defaultdict(list) + for s in states: + by_full[sid(s)].append(s.get("rawName")) + for fid, raws in by_full.items(): + if fid and len(raws) > 1 and len(set(raws)) > 1: + issues.append(f"NOISE: duplicate state entry {fid!r} with rawNames {raws}") + + # Collect transition state/event ids + t_events, t_sources, t_targets = set(), set(), set() + for t in transitions: + if eid(t.get("event")): + t_events.add(eid(t.get("event"))) + for s in t.get("sourceStates") or []: + t_sources.add(sid(s)) + for s in t.get("targetStates") or []: + t_targets.add(sid(s)) + + graph = t_sources | t_targets + + # startStates canonical consistency + for ss in starts: + if is_string and ss and not ss.startswith("String."): + if any(x.startswith("String.") for x in graph): + issues.append(f"BUG: startStates {ss!r} bare but transitions use String.* form") + if ss not in graph and fn_form(ss) not in {fn_form(x) for x in graph}: + issues.append(f"WARN: startStates {ss!r} not in transition graph") + + # endStates + for es in ends: + if es not in graph and fn_form(es) not in {fn_form(x) for x in graph}: + issues.append(f"WARN: endStates {es!r} not in transition graph") + + # Enum canonical fullIdentifiers + if is_pkg_enum: + for i, t in enumerate(transitions): + for side in ("sourceStates", "targetStates"): + for s in t.get(side) or []: + fid = sid(s) + if fid and not fid.startswith(st_fqn + ".") and not fid.startswith('"'): + if "." in fid and not fid.startswith("<"): + issues.append(f"BUG: transitions[{i}].{side} {fid!r} not under {st_fqn}") + ev = eid(t.get("event")) + if ev and ev_fqn and "." in ev_fqn and not ev.startswith("<") and not ev.startswith(ev_fqn + "."): + if ev not in ("event",) and "." in ev and not ev.startswith(ev_fqn): + issues.append(f"BUG: transitions[{i}].event {ev!r} not under {ev_fqn}") + for i, tr in enumerate(meta.get("triggers") or []): + for field in ("event", "sourceState"): + val = tr.get(field) + if not val or val in ("event", "payload", "customMessage", "eventProvider"): + continue + type_fqn = ev_fqn if field == "event" else st_fqn + if type_fqn and "." in val and not val.startswith("<") and not val.startswith(type_fqn + "."): + if field == "sourceState" and val not in graph and fn_form(val) not in {fn_form(x) for x in graph}: + issues.append(f"BUG: triggers[{i}].sourceState {val!r} not a machine state") + elif field == "event" and type_fqn and val.isupper() is False and "." not in val and not val.startswith("<"): + if val not in ("event", "payload", "customMessage", "eventProvider", "true", "false"): + issues.append(f"INFO: triggers[{i}].event dynamic {val!r}") + + # matchedTransitions + for i, chain in enumerate(meta.get("callChains") or []): + for j, mt in enumerate(chain.get("matchedTransitions") or []): + me, ms, mtgt = mt.get("event"), mt.get("sourceState"), mt.get("targetState") + ok = False + for t in transitions: + if fn_form(eid(t.get("event"))) != fn_form(me): + continue + srcs = [sid(s) for s in t.get("sourceStates") or []] + tgts = [sid(s) for s in t.get("targetStates") or []] + if (not ms or any(fn_form(x) == fn_form(ms) for x in srcs)) and ( + not mtgt or any(fn_form(x) == fn_form(mtgt) for x in tgts) + ): + ok = True + break + if not ok: + issues.append( + f"BUG: callChains[{i}].matchedTransitions[{j}] ({ms!r},{me!r},{mtgt!r}) no transition" + ) + + # String machine: mixed NEW vs String.NEW + if is_string or st_fqn == "String": + all_ids = set(graph) | set(starts) | set(ends) | {sid(s) for s in states} + for x in list(all_ids): + if not x: + continue + bare = x.strip('"') + if bare and "." not in bare and f"String.{bare}" in all_ids: + issues.append(f"BUG: mixed bare {x!r} and String.{bare}") + + # stateTypeFqn missing on enum machine + if is_pkg_enum and not st_fqn: + issues.append("BUG: enum machine missing stateTypeFqn") + + return name, issues + + +def main(): + total = 0 + for path in sorted(GOLDEN.rglob("*.json")): + data = json.loads(path.read_text()) + machine, issues = audit_file(path, data) + rel = path.relative_to(GOLDEN) + bugs = [i for i in issues if i.startswith("BUG")] + warns = [i for i in issues if i.startswith("WARN")] + noise = [i for i in issues if i.startswith("NOISE")] + info = [i for i in issues if i.startswith("INFO")] + if bugs or warns: + print(f"\n{'='*70}\n{rel}\n machine: {machine}") + for i in bugs + warns + noise + info: + print(f" [{i.split(':')[0]}] {i.split(': ', 1)[-1]}") + total += len(bugs) + len(warns) + print(f"\nTotal BUG+WARN: {total}") + + +if __name__ == "__main__": + main() diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java index 6736c9d..fcef81a 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java @@ -4,6 +4,7 @@ import click.kamil.springstatemachineexporter.analysis.model.AnalysisResult; import click.kamil.springstatemachineexporter.analysis.model.CallChain; import click.kamil.springstatemachineexporter.analysis.model.CodebaseMetadata; import click.kamil.springstatemachineexporter.analysis.model.EntryPoint; +import click.kamil.springstatemachineexporter.analysis.model.LifecycleTriggerMarkers; import click.kamil.springstatemachineexporter.analysis.model.MatchedTransition; import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; import click.kamil.springstatemachineexporter.analysis.service.CodebaseIntelligenceProvider; @@ -42,6 +43,11 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { continue; } + if (LifecycleTriggerMarkers.isLifecycle(tp.getEvent())) { + updatedChains.add(chain); + continue; + } + String triggerEvent = simplify(tp.getEvent()); String triggerSource = tp.getSourceState() != null ? simplify(tp.getSourceState()) : null; diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java index 080ab7b..be3abd1 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/StrictFqnMatchingEngine.java @@ -12,6 +12,11 @@ public class StrictFqnMatchingEngine implements EventMatchingEngine { return false; } + if (click.kamil.springstatemachineexporter.analysis.model.LifecycleTriggerMarkers + .isLifecycle(triggerPoint.getEvent())) { + return false; + } + String smEventRaw = stateMachineEvent.fullIdentifier() != null ? stateMachineEvent.fullIdentifier() : stateMachineEvent.rawName(); String rawTriggerEvent = triggerPoint.getEvent(); diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkers.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkers.java new file mode 100644 index 0000000..d0c0a69 --- /dev/null +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkers.java @@ -0,0 +1,36 @@ +package click.kamil.springstatemachineexporter.analysis.model; + +/** + * Synthetic trigger markers for persistence/lifecycle operations that do not fire + * {@code sendEvent} transitions (e.g. {@code StateMachinePersister.restore(...)}). + */ +public final class LifecycleTriggerMarkers { + + public static final String PREFIX = "[LIFECYCLE:"; + + private LifecycleTriggerMarkers() { + } + + public static boolean isLifecycle(String event) { + return event != null && event.startsWith(PREFIX) && event.endsWith("]"); + } + + public static String lifecycleType(String event) { + if (!isLifecycle(event)) { + return null; + } + return event.substring(PREFIX.length(), event.length() - 1); + } + + public static String displayLabel(String event) { + String type = lifecycleType(event); + if (type == null) { + return event; + } + return switch (type.toUpperCase()) { + case "RESTORE" -> "Restore persisted state"; + case "RESET" -> "Reset state machine"; + default -> "Lifecycle: " + type.toLowerCase(); + }; + } +} diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/EnrichmentService.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/EnrichmentService.java index bb8a4b5..4765821 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/EnrichmentService.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/EnrichmentService.java @@ -1,17 +1,77 @@ package click.kamil.springstatemachineexporter.analysis.service; import click.kamil.springstatemachineexporter.analysis.enricher.AnalysisEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.CallChainEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.EntryPointEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.PropertyEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.TriggerCanonicalizationEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.TriggerEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.TransitionLinkerEnricher; +import click.kamil.springstatemachineexporter.analysis.enricher.path.ForwardPathEstimationEnricher; import click.kamil.springstatemachineexporter.analysis.model.AnalysisResult; import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; -import lombok.RequiredArgsConstructor; import java.util.List; -@RequiredArgsConstructor public class EnrichmentService { - private final List enrichers; + private final List prePropertyEnrichers; + private final List postPropertyEnrichers; + + /** Single-phase pipeline (all enrichers run together; used by focused tests). */ + public EnrichmentService(List enrichers) { + this(enrichers, List.of()); + } + + public EnrichmentService( + List prePropertyEnrichers, + List postPropertyEnrichers) { + this.prePropertyEnrichers = prePropertyEnrichers; + this.postPropertyEnrichers = postPropertyEnrichers; + } + + public static EnrichmentService createDefault() { + return new EnrichmentService( + List.of( + new TriggerEnricher(), + new EntryPointEnricher(), + new PropertyEnricher()), + List.of( + new CallChainEnricher(), + new ForwardPathEstimationEnricher(), + new TriggerCanonicalizationEnricher(), + new TransitionLinkerEnricher())); + } public void enrich(AnalysisResult result, CodebaseContext context, CodebaseIntelligenceProvider intelligence) { + enrichPreProperty(result, context, intelligence); + enrichPostProperty(result, context, intelligence); + } + + public void enrichPreProperty( + AnalysisResult result, CodebaseContext context, CodebaseIntelligenceProvider intelligence) { + runEnrichers(prePropertyEnrichers, result, context, intelligence); + } + + public void enrichPostProperty( + AnalysisResult result, CodebaseContext context, CodebaseIntelligenceProvider intelligence) { + runEnrichers(postPropertyEnrichers, result, context, intelligence); + } + + /** Re-runs transition linking after property resolution without rebuilding call chains. */ + public void relinkAfterPropertyResolution( + AnalysisResult result, CodebaseContext context, CodebaseIntelligenceProvider intelligence) { + runEnrichers( + List.of(new TriggerCanonicalizationEnricher(), new TransitionLinkerEnricher()), + result, + context, + intelligence); + } + + private static void runEnrichers( + List enrichers, + AnalysisResult result, + CodebaseContext context, + CodebaseIntelligenceProvider intelligence) { for (AnalysisEnricher enricher : enrichers) { enricher.enrich(result, context, intelligence); } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java index 07b3247..932e759 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetector.java @@ -11,6 +11,7 @@ import org.eclipse.jdt.core.dom.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; @Slf4j @RequiredArgsConstructor @@ -19,6 +20,17 @@ public class GenericEventDetector { private final ConstantResolver constantResolver; private final List hints; + /** Parameter names that route to a machine, not SM state enum constants. */ + private static final Set ROUTING_PARAMETER_NAMES = Set.of( + "machineType", + "machineId", + "machineName", + "domain", + "type", + "action", + "eventString", + "version"); + public List detect(CompilationUnit cu) { List triggers = new ArrayList<>(); String fileName = "unknown"; @@ -296,8 +308,10 @@ public class GenericEventDetector { String state = extractStateFromSiblings(current, block.statements()); if (state != null) return state; } else if (parent instanceof SwitchStatement switchStmt) { - String state = extractStateFromSiblings(current, switchStmt.statements()); - if (state != null) return state; + if (!isRoutingParameter(switchStmt.getExpression())) { + String state = extractStateFromSiblings(current, switchStmt.statements()); + if (state != null) return state; + } } current = parent; @@ -354,6 +368,10 @@ public class GenericEventDetector { if (left instanceof NullLiteral || right instanceof NullLiteral) { return null; } + + if (isRoutingParameter(left) || isRoutingParameter(right)) { + return null; + } // Usually one is a method call like getState() or a variable like `state` // and the other is the constant enum like `OrderState.PENDING` or `"PENDING"` @@ -374,6 +392,10 @@ public class GenericEventDetector { if (("equals".equals(methodName) || "equalsIgnoreCase".equals(methodName)) && !mi.arguments().isEmpty()) { Expression receiver = mi.getExpression(); Expression arg = (Expression) mi.arguments().get(0); + + if (isRoutingParameter(receiver) || isRoutingParameter(arg)) { + return null; + } // If receiver is null (e.g., implicit this), fall back to arg if (receiver == null) { @@ -395,6 +417,13 @@ public class GenericEventDetector { return null; } + private boolean isRoutingParameter(Expression expr) { + if (expr instanceof SimpleName sn) { + return ROUTING_PARAMETER_NAMES.contains(sn.getIdentifier()); + } + return false; + } + private String getSimpleNameString(Expression expr) { if (expr instanceof QualifiedName qn) { return qn.getName().getIdentifier(); diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtils.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtils.java index 59ce3b1..87f717e 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtils.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtils.java @@ -45,20 +45,44 @@ public class TransitionStateUtils { } public static Set findAllStates(Collection transitions, Set initialStates, Set endStates) { - Set allStates = new java.util.HashSet<>(); + java.util.Map byFullIdentifier = new java.util.LinkedHashMap<>(); if (transitions != null) { transitions.forEach(t -> { - if (t.getSourceStates() != null) allStates.addAll(t.getSourceStates()); - if (t.getTargetStates() != null) allStates.addAll(t.getTargetStates()); + mergeState(byFullIdentifier, t.getSourceStates()); + mergeState(byFullIdentifier, t.getTargetStates()); }); } if (initialStates != null) { - initialStates.forEach(s -> allStates.add(State.of(s))); + initialStates.forEach(label -> mergeState(byFullIdentifier, State.of(label))); } if (endStates != null) { - endStates.forEach(s -> allStates.add(State.of(s))); + endStates.forEach(label -> mergeState(byFullIdentifier, State.of(label))); } - return allStates; + return new java.util.LinkedHashSet<>(byFullIdentifier.values()); + } + + private static void mergeState(java.util.Map map, State state) { + if (state == null) { + return; + } + String key = stateKey(state); + map.putIfAbsent(key, state); + } + + private static void mergeState(java.util.Map map, java.util.Collection states) { + if (states == null) { + return; + } + for (State state : states) { + mergeState(map, state); + } + } + + private static String stateKey(State state) { + if (state.fullIdentifier() != null && !state.fullIdentifier().isBlank()) { + return state.fullIdentifier(); + } + return state.rawName(); } private static Stream normalizeStates(Collection states) { diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java index 55206cd..43b7f48 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java @@ -28,6 +28,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class CodebaseContext { private final Map classes = new HashMap<>(); + private final Map recordDeclarations = new HashMap<>(); private final Map classPaths = new HashMap<>(); private final Map simpleNameToFqn = new HashMap<>(); private final Set ambiguousSimpleNames = new HashSet<>(); @@ -317,6 +318,7 @@ public class CodebaseContext { // Treat as a class since it is a type classes.put(fqn, (CompilationUnit) rd.getRoot()); classPaths.put(fqn, javaFile); + recordDeclarations.put(fqn, rd); if (simpleNameToFqn.containsKey(simpleName)) { String existingFqn = simpleNameToFqn.get(simpleName); @@ -645,6 +647,21 @@ public class CodebaseContext { return null; } + public org.eclipse.jdt.core.dom.RecordDeclaration getRecordDeclaration(String fqn) { + if (fqn == null || fqn.isEmpty()) { + return null; + } + org.eclipse.jdt.core.dom.RecordDeclaration indexed = recordDeclarations.get(fqn); + if (indexed != null) { + return indexed; + } + AbstractTypeDeclaration abstractType = getAbstractTypeDeclaration(fqn); + if (abstractType instanceof org.eclipse.jdt.core.dom.RecordDeclaration recordDeclaration) { + return recordDeclaration; + } + return null; + } + public AbstractTypeDeclaration getAbstractTypeDeclaration(String name) { // Try exact FQN match first CompilationUnit cu = classes.get(name); diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java index df85a97..f4a1bf5 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java @@ -745,11 +745,7 @@ public class JdtDataFlowModel implements DataFlowModel { } private org.eclipse.jdt.core.dom.RecordDeclaration findRecordDeclaration(String fqn) { - org.eclipse.jdt.core.dom.AbstractTypeDeclaration abstractType = context.getAbstractTypeDeclaration(fqn); - if (abstractType instanceof org.eclipse.jdt.core.dom.RecordDeclaration recordDeclaration) { - return recordDeclaration; - } - return null; + return context.getRecordDeclaration(fqn); } private void inlineAccessorSetter( diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/service/ExportService.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/service/ExportService.java index b1139b6..9bf4f7b 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/service/ExportService.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/service/ExportService.java @@ -1,11 +1,7 @@ package click.kamil.springstatemachineexporter.service; -import click.kamil.springstatemachineexporter.analysis.enricher.CallChainEnricher; import click.kamil.springstatemachineexporter.analysis.resolver.MachineEnumCanonicalizer; import click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver; -import click.kamil.springstatemachineexporter.analysis.enricher.EntryPointEnricher; -import click.kamil.springstatemachineexporter.analysis.enricher.PropertyEnricher; -import click.kamil.springstatemachineexporter.analysis.enricher.TriggerEnricher; import click.kamil.springstatemachineexporter.analysis.model.AnalysisResult; import click.kamil.springstatemachineexporter.analysis.model.BusinessFlow; import click.kamil.springstatemachineexporter.analysis.service.AnalysisResultFinalizer; @@ -44,15 +40,7 @@ public class ExportService { } public ExportService(List exporters) { - this(exporters, new EnrichmentService(List.of( - new TriggerEnricher(), - new EntryPointEnricher(), - new PropertyEnricher(), - new CallChainEnricher(), - new click.kamil.springstatemachineexporter.analysis.enricher.path.ForwardPathEstimationEnricher(), - new click.kamil.springstatemachineexporter.analysis.enricher.TriggerCanonicalizationEnricher(), - new click.kamil.springstatemachineexporter.analysis.enricher.TransitionLinkerEnricher() - ))); + this(exporters, EnrichmentService.createDefault()); } private static final List TARGET_ANNOTATIONS = List.of("EnableStateMachineFactory", "EnableStateMachine"); @@ -195,6 +183,8 @@ public class ExportService { log.info("JSON re-export: no source project found; using embedded machine types if present"); } + enrichmentService.relinkAfterPropertyResolution(result, context, null); + StateMachineTypeResolver.MachineTypes machineTypes = click.kamil.springstatemachineexporter.analysis.service.JsonExportContextFactory.resolveMachineTypes( result.getName(), @@ -295,9 +285,9 @@ public class ExportService { .flows(flows) .build(); - enrichmentService.enrich(result, context, intelligence); - + enrichmentService.enrichPreProperty(result, context, intelligence); resolveProperties(result, activeProfiles); + enrichmentService.enrichPostProperty(result, context, intelligence); AnalysisResultFinalizer.finalizeResult(result, context); generateOutputs(outputDir, result, selectedFormats, eventFormat, stateFormat); @@ -337,9 +327,9 @@ public class ExportService { .flows(flows) .build(); - enrichmentService.enrich(result, context, intelligence); - + enrichmentService.enrichPreProperty(result, context, intelligence); resolveProperties(result, activeProfiles); + enrichmentService.enrichPostProperty(result, context, intelligence); AnalysisResultFinalizer.finalizeResult(result, context); generateOutputs(outputDir, result, selectedFormats, eventFormat, stateFormat); diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenJsonAuditTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenJsonAuditTest.java new file mode 100644 index 0000000..f5a8511 --- /dev/null +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenJsonAuditTest.java @@ -0,0 +1,50 @@ +package click.kamil.springstatemachineexporter; + +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Runs the golden JSON consistency audit script as a regression gate. + */ +class GoldenJsonAuditTest { + + private static Path findProjectRoot() { + Path current = Path.of(".").toAbsolutePath(); + while (current != null && !current.resolve("settings.gradle").toFile().exists()) { + current = current.getParent(); + } + return current; + } + + @Test + void goldenJsonExportsShouldPassConsistencyAudit() throws Exception { + Path moduleRoot = findProjectRoot().resolve("state_machine_exporter"); + Path script = moduleRoot.resolve("scripts/audit_golden_json.py"); + assertThat(script).exists(); + + Process process = new ProcessBuilder("python3", script.toString()) + .directory(moduleRoot.toFile()) + .redirectErrorStream(true) + .start(); + + String output; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + output = reader.lines().collect(Collectors.joining("\n")); + } + + assertThat(process.waitFor(60, TimeUnit.SECONDS)) + .as("audit script timed out\n%s", output) + .isTrue(); + assertThat(process.exitValue()) + .as("audit script failed\n%s", output) + .isZero(); + assertThat(output).contains("Total BUG+WARN: 0"); + } +} diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenUpdater.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenUpdater.java index 2cb3a9b..19a30ea 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenUpdater.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/GoldenUpdater.java @@ -1,6 +1,5 @@ package click.kamil.springstatemachineexporter; -import click.kamil.springstatemachineexporter.analysis.service.EnrichmentService; import click.kamil.springstatemachineexporter.exporter.Dot; import click.kamil.springstatemachineexporter.exporter.JsonExporter; import click.kamil.springstatemachineexporter.exporter.PlantUml; @@ -17,7 +16,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; import java.util.List; public class GoldenUpdater { @@ -33,7 +31,16 @@ public class GoldenUpdater { System.out.println("Updating golden files for: " + scenario.name()); Path tempDir = Files.createTempDirectory("golden-update-"); try { - exportService.runExporter(scenario.inputPath(), tempDir, List.of("puml", "dot", "scxml", "json"), true); + exportService.runExporter( + scenario.inputPath(), + tempDir, + List.of("puml", "dot", "scxml", "json"), + true, + scenario.activeProfiles(), + null, + null, + click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, + click.kamil.springstatemachineexporter.exporter.EnumFormat.fn); List generatedDirs; try (var stream = Files.list(tempDir)) { @@ -159,12 +166,73 @@ public class GoldenUpdater { Path.of("src/test/resources/golden/G2StateMachineConfiguration"), "G2StateMachineConfiguration" ), + new TestScenario( + "Extended Analysis Sample", + Path.of("state_machines/extended_analysis_sample"), + Path.of("src/test/resources/golden/ExtendedStateMachineConfig"), + "ExtendedStateMachineConfig" + ), + new TestScenario( + "Extended Analysis Sample (PROD)", + Path.of("state_machines/extended_analysis_sample"), + Path.of("src/test/resources/golden/ExtendedStateMachineConfig_PROD"), + "ExtendedStateMachineConfig", + List.of("prod") + ), + new TestScenario( + "Inheritance Sample", + Path.of("state_machines/inheritance_sample"), + Path.of("src/test/resources/golden/InheritanceStateMachineConfig"), + "InheritanceStateMachineConfig" + ), + new TestScenario( + "Enterprise Order System", + Path.of("state_machines/enterprise_order_system"), + Path.of("src/test/resources/golden/EnterpriseStateMachineConfig"), + "EnterpriseStateMachineConfig" + ), new TestScenario( "Enterprise Order State Machine", Path.of("state_machines/state_machine_enterprise"), Path.of("src/test/resources/golden/OrderStateMachineConfiguration"), "OrderStateMachineConfiguration" ), + new TestScenario( + "Multi-Module Sample", + Path.of("state_machines/multi_module_sample/core-module"), + Path.of("src/test/resources/golden/OrderStateMachineConfig"), + "OrderStateMachineConfig" + ), + new TestScenario( + "Maven Multi-Module Sample", + Path.of("state_machines/maven_multi_module/core-module"), + Path.of("src/test/resources/golden/MavenOrderStateMachine"), + "MavenOrderStateMachine" + ), + new TestScenario( + "Complex Multi-Module Sample", + Path.of("state_machines/complex_multi_module_sm"), + Path.of("src/test/resources/golden/StateMachineConfig"), + "StateMachineConfig" + ), + new TestScenario( + "Polymorphic Events Sample", + Path.of("state_machines/polymorphic_events_sample"), + Path.of("src/test/resources/golden/PolymorphicStateMachineConfiguration"), + "PolymorphicStateMachineConfiguration" + ), + new TestScenario( + "Layered Dispatcher (Order)", + Path.of("state_machines/layered_dispatcher_sample"), + Path.of("src/test/resources/golden/StandardOrderStateMachineConfiguration"), + "StandardOrderStateMachineConfiguration" + ), + new TestScenario( + "Layered Dispatcher (Document)", + Path.of("state_machines/layered_dispatcher_sample"), + Path.of("src/test/resources/golden/StandardDocumentStateMachineConfiguration"), + "StandardDocumentStateMachineConfiguration" + ), new TestScenario( "Enterprise Document State Machine", Path.of("state_machines/state_machine_enterprise"), diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/RegressionTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/RegressionTest.java index 68b7a5d..e11641b 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/RegressionTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/RegressionTest.java @@ -173,6 +173,18 @@ public class RegressionTest { root.resolve("state_machines/layered_dispatcher_sample"), Path.of("src/test/resources/golden/StandardDocumentStateMachineConfiguration"), "StandardDocumentStateMachineConfiguration" + ), + new TestScenario( + "Enterprise Document State Machine", + root.resolve("state_machines/state_machine_enterprise"), + Path.of("src/test/resources/golden/DocumentStateMachineConfiguration"), + "DocumentStateMachineConfiguration" + ), + new TestScenario( + "Enterprise User State Machine", + root.resolve("state_machines/state_machine_enterprise"), + Path.of("src/test/resources/golden/UserStateMachineConfiguration"), + "UserStateMachineConfiguration" ) ); } diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkersTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkersTest.java new file mode 100644 index 0000000..3197f7c --- /dev/null +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/model/LifecycleTriggerMarkersTest.java @@ -0,0 +1,23 @@ +package click.kamil.springstatemachineexporter.analysis.model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class LifecycleTriggerMarkersTest { + + @Test + void shouldRecognizeLifecycleMarkers() { + assertThat(LifecycleTriggerMarkers.isLifecycle("[LIFECYCLE:RESTORE]")).isTrue(); + assertThat(LifecycleTriggerMarkers.isLifecycle("[LIFECYCLE:RESET]")).isTrue(); + assertThat(LifecycleTriggerMarkers.isLifecycle("OrderEvent.PAY")).isFalse(); + } + + @Test + void shouldFormatDisplayLabels() { + assertThat(LifecycleTriggerMarkers.displayLabel("[LIFECYCLE:RESTORE]")) + .isEqualTo("Restore persisted state"); + assertThat(LifecycleTriggerMarkers.displayLabel("[LIFECYCLE:RESET]")) + .isEqualTo("Reset state machine"); + } +} diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorControlFlowTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorControlFlowTest.java index 824c444..5338bac 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorControlFlowTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/GenericEventDetectorControlFlowTest.java @@ -129,4 +129,33 @@ class GenericEventDetectorControlFlowTest { TriggerPoint shipTrigger = triggers.stream().filter(t -> t.getEvent().equals("OrderEvent.SHIP")).findFirst().get(); assertThat(shipTrigger.getSourceState()).isEqualTo("PAID"); } + + @Test + void shouldNotTreatMachineTypeDiscriminatorAsSourceState(@TempDir Path tempDir) throws IOException { + String source = """ + package com.example; + public class Dispatcher { + private StateMachine sm; + public void dispatch(String machineType, String eventString) { + if ("ORDER".equalsIgnoreCase(machineType)) { + sm.sendEvent("event"); + } + } + } + class StateMachine { + public void sendEvent(String e) {} + } + """; + Files.writeString(tempDir.resolve("Dispatcher.java"), source); + + CodebaseContext context = new CodebaseContext(); + context.scan(tempDir); + + GenericEventDetector detector = new GenericEventDetector(context, new ConstantResolver(), Collections.emptyList()); + List triggers = detector.detect( + (org.eclipse.jdt.core.dom.CompilationUnit) context.getTypeDeclaration("com.example.Dispatcher").getRoot()); + + assertThat(triggers).hasSize(1); + assertThat(triggers.get(0).getSourceState()).isNull(); + } } diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/LifecycleDetectorTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/LifecycleDetectorTest.java new file mode 100644 index 0000000..b2b0a4e --- /dev/null +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/LifecycleDetectorTest.java @@ -0,0 +1,52 @@ +package click.kamil.springstatemachineexporter.analysis.service; + +import click.kamil.springstatemachineexporter.analysis.model.LifecycleTriggerMarkers; +import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint; +import click.kamil.springstatemachineexporter.ast.common.CodebaseContext; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class LifecycleDetectorTest { + + @Test + void shouldDetectPersisterRestoreCalls(@TempDir Path tempDir) throws Exception { + String source = """ + package com.example; + import org.springframework.statemachine.StateMachine; + import org.springframework.statemachine.persist.StateMachinePersister; + public class OrderService { + private final StateMachine stateMachine; + private final StateMachinePersister persister; + OrderService(StateMachine sm, StateMachinePersister p) { + this.stateMachine = sm; + this.persister = p; + } + public void resume(String id) throws Exception { + persister.restore(stateMachine, id); + } + } + """; + Files.writeString(tempDir.resolve("OrderService.java"), source); + + CodebaseContext context = new CodebaseContext(); + context.setResolveBindings(true); + context.scan(tempDir); + + LifecycleDetector detector = new LifecycleDetector(context); + org.eclipse.jdt.core.dom.TypeDeclaration td = context.getTypeDeclaration("com.example.OrderService"); + org.eclipse.jdt.core.dom.CompilationUnit cu = + (org.eclipse.jdt.core.dom.CompilationUnit) td.getRoot(); + + List triggers = detector.detect(cu); + assertThat(triggers).hasSize(1); + assertThat(triggers.get(0).getEvent()).isEqualTo("[LIFECYCLE:RESTORE]"); + assertThat(triggers.get(0).getMethodName()).isEqualTo("resume"); + assertThat(LifecycleTriggerMarkers.lifecycleType(triggers.get(0).getEvent())).isEqualTo("RESTORE"); + } +} diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtilsTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtilsTest.java index c7f6b67..a9f3938 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtilsTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/app/TransitionStateUtilsTest.java @@ -217,6 +217,24 @@ class TransitionStateUtilsTest { assertThat(endStates).containsExactlyInAnyOrder("DELIVERED", "REFUNDED"); } + @Test + void shouldDeduplicateStatesByFullIdentifier() { + Transition transition = new Transition(); + transition.getSourceStates().add(State.of("\"NEW\"", "String.NEW")); + transition.getTargetStates().add(State.of("\"PAID\"", "String.PAID")); + + Set allStates = TransitionStateUtils.findAllStates( + List.of(transition), + Set.of("String.NEW"), + Set.of("String.PAID")); + + assertThat(allStates).hasSize(2); + assertThat(allStates).extracting(State::fullIdentifier) + .containsExactlyInAnyOrder("String.NEW", "String.PAID"); + assertThat(allStates).extracting(State::rawName) + .containsExactlyInAnyOrder("\"NEW\"", "\"PAID\""); + } + private Transition createTransition(String source, String target) { Transition transition = new Transition(); if (source != null) { diff --git a/state_machine_exporter/src/test/resources/golden/ComplexStateMachineConfig/ComplexStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ComplexStateMachineConfig/ComplexStateMachineConfig.json index b953c9e..1903b50 100644 --- a/state_machine_exporter/src/test/resources/golden/ComplexStateMachineConfig/ComplexStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ComplexStateMachineConfig/ComplexStateMachineConfig.json @@ -30,9 +30,6 @@ }, { "rawName" : "States.STATE20", "fullIdentifier" : "ComplexStateMachineConfig.States.STATE20" - }, { - "rawName" : "ComplexStateMachineConfig.States.STATE1", - "fullIdentifier" : "ComplexStateMachineConfig.States.STATE1" }, { "rawName" : "States.STATE1", "fullIdentifier" : "ComplexStateMachineConfig.States.STATE1" diff --git a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json index 97082e8..ad84eca 100644 --- a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.json @@ -1,33 +1,76 @@ { + "name" : "click.kamil.enterprise.machines.document.DocumentStateMachineConfiguration", + "states" : [ { + "rawName" : "DocumentState.IN_REVIEW", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW" + }, { + "rawName" : "DocumentState.DRAFT", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT" + }, { + "rawName" : "DocumentState.APPROVED", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.APPROVED" + } ], + "transitions" : [ { + "type" : "EXTERNAL", + "sourceStates" : [ { + "rawName" : "DocumentState.DRAFT", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT" + } ], + "targetStates" : [ { + "rawName" : "DocumentState.IN_REVIEW", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW" + } ], + "event" : { + "rawName" : "DocumentEvent.SUBMIT", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT" + }, + "guards" : [ ], + "actions" : [ ], + "order" : null + }, { + "type" : "EXTERNAL", + "sourceStates" : [ { + "rawName" : "DocumentState.IN_REVIEW", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW" + } ], + "targetStates" : [ { + "rawName" : "DocumentState.APPROVED", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.APPROVED" + } ], + "event" : { + "rawName" : "DocumentEvent.APPROVE", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE" + }, + "guards" : [ ], + "actions" : [ ], + "order" : null + }, { + "type" : "EXTERNAL", + "sourceStates" : [ { + "rawName" : "DocumentState.IN_REVIEW", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW" + } ], + "targetStates" : [ { + "rawName" : "DocumentState.DRAFT", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT" + } ], + "event" : { + "rawName" : "DocumentEvent.REJECT", + "fullIdentifier" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT" + }, + "guards" : [ ], + "actions" : [ ], + "order" : null + } ], + "startStates" : [ "click.kamil.enterprise.machines.document.DocumentState.DRAFT" ], + "endStates" : [ "click.kamil.enterprise.machines.document.DocumentState.APPROVED" ], + "renderChoicesAsDiamonds" : true, + "flows" : [ ], + "stateTypeFqn" : "click.kamil.enterprise.machines.document.DocumentState", + "eventTypeFqn" : "click.kamil.enterprise.machines.document.DocumentEvent", "metadata" : { "triggers" : [ { - "event" : "OrderEvent.PAY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 30, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "OrderEvent.SHIP", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 37, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "DocumentEvent.SUBMIT", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "submitDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -40,7 +83,7 @@ "constraint" : null, "ambiguous" : false }, { - "event" : "DocumentEvent.APPROVE", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "approveDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -53,7 +96,7 @@ "constraint" : null, "ambiguous" : false }, { - "event" : "DocumentEvent.REJECT", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "rejectDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -65,32 +108,6 @@ "external" : false, "constraint" : null, "ambiguous" : false - }, { - "event" : "UserEvent.VERIFY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "verifyUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 65, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "UserEvent.SUSPEND", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "suspendUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 72, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false }, { "event" : "event", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", @@ -98,145 +115,14 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "ORDER", - "lineNumber" : 81, - "polymorphicEvents" : null, - "external" : false, - "constraint" : "\"ORDER\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, { - "event" : "event", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "DOCUMENT", + "sourceState" : null, "lineNumber" : 87, "polymorphicEvents" : null, "external" : false, "constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && \"DOCUMENT\".equalsIgnoreCase(machineType)", "ambiguous" : false - }, { - "event" : "event", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "USER", - "lineNumber" : 93, - "polymorphicEvents" : null, - "external" : false, - "constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && !(\"DOCUMENT\".equalsIgnoreCase(machineType)) && \"USER\".equalsIgnoreCase(machineType)", - "ambiguous" : false } ], "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/machine/order/pay", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/pay", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/order/ship", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/ship", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/submit", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "submitDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/approve", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "approveDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/approve", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/reject", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "rejectDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/reject", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/user/verify", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "verifyUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/verify", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/user/suspend", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "suspendUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/suspend", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { "type" : "REST", "name" : "POST /api/machine/{machineType}/transition/{event}", "className" : "click.kamil.enterprise.web.StateMachineController", @@ -261,74 +147,6 @@ } ] } ], "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/order/pay", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/pay", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.payOrder", "click.kamil.enterprise.web.StateMachineDispatcher.payOrder" ], - "triggerPoint" : { - "event" : "OrderEvent.PAY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 30, - "polymorphicEvents" : [ "OrderEvent.PAY" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/order/ship", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/ship", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.shipOrder", "click.kamil.enterprise.web.StateMachineDispatcher.shipOrder" ], - "triggerPoint" : { - "event" : "OrderEvent.SHIP", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 37, - "polymorphicEvents" : [ "OrderEvent.SHIP" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { "entryPoint" : { "type" : "REST", "name" : "POST /api/machine/document/submit", @@ -347,7 +165,7 @@ }, "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.submitDocument", "click.kamil.enterprise.web.StateMachineDispatcher.submitDocument" ], "triggerPoint" : { - "event" : "DocumentEvent.SUBMIT", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "submitDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -355,16 +173,16 @@ "stateMachineId" : null, "sourceState" : null, "lineNumber" : 44, - "polymorphicEvents" : [ "DocumentEvent.SUBMIT" ], + "polymorphicEvents" : [ "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT" ], "external" : false, "constraint" : null, "ambiguous" : false }, "contextMachineId" : null, "matchedTransitions" : [ { - "sourceState" : "DocumentState.DRAFT", - "targetState" : "DocumentState.IN_REVIEW", - "event" : "DocumentEvent.SUBMIT" + "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT", + "targetState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT" } ] }, { "entryPoint" : { @@ -385,7 +203,7 @@ }, "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.approveDocument", "click.kamil.enterprise.web.StateMachineDispatcher.approveDocument" ], "triggerPoint" : { - "event" : "DocumentEvent.APPROVE", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "approveDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -393,16 +211,16 @@ "stateMachineId" : null, "sourceState" : null, "lineNumber" : 51, - "polymorphicEvents" : [ "DocumentEvent.APPROVE" ], + "polymorphicEvents" : [ "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE" ], "external" : false, "constraint" : null, "ambiguous" : false }, "contextMachineId" : null, "matchedTransitions" : [ { - "sourceState" : "DocumentState.IN_REVIEW", - "targetState" : "DocumentState.APPROVED", - "event" : "DocumentEvent.APPROVE" + "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", + "targetState" : "click.kamil.enterprise.machines.document.DocumentState.APPROVED", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE" } ] }, { "entryPoint" : { @@ -423,7 +241,7 @@ }, "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.rejectDocument", "click.kamil.enterprise.web.StateMachineDispatcher.rejectDocument" ], "triggerPoint" : { - "event" : "DocumentEvent.REJECT", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "rejectDocument", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -431,85 +249,17 @@ "stateMachineId" : null, "sourceState" : null, "lineNumber" : 58, - "polymorphicEvents" : [ "DocumentEvent.REJECT" ], + "polymorphicEvents" : [ "click.kamil.enterprise.machines.document.DocumentEvent.REJECT" ], "external" : false, "constraint" : null, "ambiguous" : false }, "contextMachineId" : null, "matchedTransitions" : [ { - "sourceState" : "DocumentState.IN_REVIEW", - "targetState" : "DocumentState.DRAFT", - "event" : "DocumentEvent.REJECT" + "sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW", + "targetState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT", + "event" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT" } ] - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/user/verify", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "verifyUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/verify", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.verifyUser", "click.kamil.enterprise.web.StateMachineDispatcher.verifyUser" ], - "triggerPoint" : { - "event" : "UserEvent.VERIFY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "verifyUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 65, - "polymorphicEvents" : [ "UserEvent.VERIFY" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/user/suspend", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "suspendUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/suspend", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.suspendUser", "click.kamil.enterprise.web.StateMachineDispatcher.suspendUser" ], - "triggerPoint" : { - "event" : "UserEvent.SUSPEND", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "suspendUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 72, - "polymorphicEvents" : [ "UserEvent.SUSPEND" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null }, { "entryPoint" : { "type" : "REST", @@ -543,49 +293,7 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "ORDER", - "lineNumber" : 81, - "polymorphicEvents" : [ "", "", "" ], - "external" : true, - "constraint" : "\"ORDER\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/{machineType}/transition/{event}", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "transition", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/{machineType}/transition/{event}", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "machineType", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "event", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.transition", "click.kamil.enterprise.web.StateMachineDispatcher.dispatch" ], - "triggerPoint" : { - "event" : "true ? OrderEvent.valueOf(eventString.toUpperCase()) : true ? DocumentEvent.valueOf(eventString.toUpperCase()) : UserEvent.valueOf(eventString.toUpperCase())", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "DOCUMENT", + "sourceState" : null, "lineNumber" : 87, "polymorphicEvents" : [ "", "", "" ], "external" : true, @@ -594,107 +302,9 @@ }, "contextMachineId" : null, "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/{machineType}/transition/{event}", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "transition", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/{machineType}/transition/{event}", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "machineType", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "event", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.transition", "click.kamil.enterprise.web.StateMachineDispatcher.dispatch" ], - "triggerPoint" : { - "event" : "true ? OrderEvent.valueOf(eventString.toUpperCase()) : true ? DocumentEvent.valueOf(eventString.toUpperCase()) : UserEvent.valueOf(eventString.toUpperCase())", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "USER", - "lineNumber" : 93, - "polymorphicEvents" : [ "", "", "" ], - "external" : true, - "constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && !(\"DOCUMENT\".equalsIgnoreCase(machineType)) && \"USER\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null } ], "properties" : { "default" : { } } - }, - "name" : "click.kamil.enterprise.machines.document.DocumentStateMachineConfiguration", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "DocumentState.DRAFT" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "DocumentState.DRAFT", - "fullIdentifier" : "DocumentState.DRAFT" - } ], - "targetStates" : [ { - "rawName" : "DocumentState.IN_REVIEW", - "fullIdentifier" : "DocumentState.IN_REVIEW" - } ], - "event" : { - "rawName" : "DocumentEvent.SUBMIT", - "fullIdentifier" : "DocumentEvent.SUBMIT" - }, - "guards" : [ ], - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "DocumentState.IN_REVIEW", - "fullIdentifier" : "DocumentState.IN_REVIEW" - } ], - "targetStates" : [ { - "rawName" : "DocumentState.APPROVED", - "fullIdentifier" : "DocumentState.APPROVED" - } ], - "event" : { - "rawName" : "DocumentEvent.APPROVE", - "fullIdentifier" : "DocumentEvent.APPROVE" - }, - "guards" : [ ], - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "DocumentState.IN_REVIEW", - "fullIdentifier" : "DocumentState.IN_REVIEW" - } ], - "targetStates" : [ { - "rawName" : "DocumentState.DRAFT", - "fullIdentifier" : "DocumentState.DRAFT" - } ], - "event" : { - "rawName" : "DocumentEvent.REJECT", - "fullIdentifier" : "DocumentEvent.REJECT" - }, - "guards" : [ ], - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "DocumentState.APPROVED" ] + } } diff --git a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.puml b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.puml index f93ba9d..4172381 100644 --- a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.puml +++ b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.puml @@ -21,13 +21,13 @@ skinparam ArrowThickness 1 skinparam dpi 110 skinparam svgLinkTarget _self -[*] --> DocumentState.DRAFT +[*] --> click.kamil.enterprise.machines.document.DocumentState.DRAFT DocumentState.DRAFT -[#1E90FF,bold]-> DocumentState.IN_REVIEW <> : DocumentEvent.SUBMIT DocumentState.IN_REVIEW -[#1E90FF,bold]-> DocumentState.APPROVED <> : DocumentEvent.APPROVE DocumentState.IN_REVIEW -[#1E90FF,bold]-> DocumentState.DRAFT <> : DocumentEvent.REJECT -DocumentState.APPROVED --> [*] +click.kamil.enterprise.machines.document.DocumentState.APPROVED --> [*] @enduml diff --git a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.scxml.xml b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.scxml.xml index c71ad83..38fb03a 100644 --- a/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.scxml.xml +++ b/state_machine_exporter/src/test/resources/golden/DocumentStateMachineConfiguration/DocumentStateMachineConfiguration.scxml.xml @@ -9,5 +9,9 @@ + + + + diff --git a/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json index 7191c74..a7d8693 100644 --- a/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/EnterpriseStateMachineConfig/EnterpriseStateMachineConfig.json @@ -1,9 +1,6 @@ { "name" : "click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig", "states" : [ { - "rawName" : "String.CANCELLED", - "fullIdentifier" : "String.CANCELLED" - }, { "rawName" : "\"NEW\"", "fullIdentifier" : "String.NEW" }, { @@ -18,24 +15,15 @@ }, { "rawName" : "\"PAID\"", "fullIdentifier" : "String.PAID" - }, { - "rawName" : "String.DELIVERED", - "fullIdentifier" : "String.DELIVERED" }, { "rawName" : "\"CHECK_AVAILABILITY\"", "fullIdentifier" : "String.CHECK_AVAILABILITY" }, { "rawName" : "\"DELIVERED\"", "fullIdentifier" : "String.DELIVERED" - }, { - "rawName" : "String.NEW", - "fullIdentifier" : "String.NEW" }, { "rawName" : "\"RETURNED\"", "fullIdentifier" : "String.RETURNED" - }, { - "rawName" : "String.RETURNED", - "fullIdentifier" : "String.RETURNED" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json index 39f204b..49f351a 100644 --- a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json @@ -12,9 +12,6 @@ }, { "rawName" : "\"START\"", "fullIdentifier" : "String.START" - }, { - "rawName" : "String.START", - "fullIdentifier" : "String.START" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json index 39f204b..49f351a 100644 --- a/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig_PROD/ExtendedStateMachineConfig.json @@ -12,9 +12,6 @@ }, { "rawName" : "\"START\"", "fullIdentifier" : "String.START" - }, { - "rawName" : "String.START", - "fullIdentifier" : "String.START" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/F1StateMachineConfiguration/F1StateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/F1StateMachineConfiguration/F1StateMachineConfiguration.json index 7cedbca..69302f4 100644 --- a/state_machine_exporter/src/test/resources/golden/F1StateMachineConfiguration/F1StateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/F1StateMachineConfiguration/F1StateMachineConfiguration.json @@ -21,9 +21,6 @@ }, { "rawName" : "States.STATE_EXTRA_2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_2" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" }, { "rawName" : "States.STATE11", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE11" @@ -66,9 +63,6 @@ }, { "rawName" : "States.STATE_EXTRA_3", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_3" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" }, { "rawName" : "States.CANCEL", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.CANCEL" diff --git a/state_machine_exporter/src/test/resources/golden/F2StateMachineConfiguration/F2StateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/F2StateMachineConfiguration/F2StateMachineConfiguration.json index d1a4771..bcc889a 100644 --- a/state_machine_exporter/src/test/resources/golden/F2StateMachineConfiguration/F2StateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/F2StateMachineConfiguration/F2StateMachineConfiguration.json @@ -24,9 +24,6 @@ }, { "rawName" : "States.STATEY", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEY" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" }, { "rawName" : "States.STATE11", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE11" @@ -69,9 +66,6 @@ }, { "rawName" : "States.STATE_EXTRA_1", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" }, { "rawName" : "States.CANCEL", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.CANCEL" diff --git a/state_machine_exporter/src/test/resources/golden/ForkJoinStateMachineConfig/ForkJoinStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/ForkJoinStateMachineConfig/ForkJoinStateMachineConfig.json index 60f8ee4..78a5e62 100644 --- a/state_machine_exporter/src/test/resources/golden/ForkJoinStateMachineConfig/ForkJoinStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/ForkJoinStateMachineConfig/ForkJoinStateMachineConfig.json @@ -21,15 +21,9 @@ }, { "rawName" : "States.END", "fullIdentifier" : "ForkJoinStateMachineConfig.States.END" - }, { - "rawName" : "ForkJoinStateMachineConfig.States.END", - "fullIdentifier" : "ForkJoinStateMachineConfig.States.END" }, { "rawName" : "States.FORK", "fullIdentifier" : "ForkJoinStateMachineConfig.States.FORK" - }, { - "rawName" : "ForkJoinStateMachineConfig.States.START", - "fullIdentifier" : "ForkJoinStateMachineConfig.States.START" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/G1StateMachineConfiguration/G1StateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/G1StateMachineConfiguration/G1StateMachineConfiguration.json index 14e74a3..e7d153a 100644 --- a/state_machine_exporter/src/test/resources/golden/G1StateMachineConfiguration/G1StateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/G1StateMachineConfiguration/G1StateMachineConfiguration.json @@ -21,9 +21,6 @@ }, { "rawName" : "States.STATE_EXTRA_2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_2" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" }, { "rawName" : "States.STATE2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE2" @@ -45,9 +42,6 @@ }, { "rawName" : "States.STATE_EXTRA_3", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_3" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" }, { "rawName" : "States.CANCEL", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.CANCEL" diff --git a/state_machine_exporter/src/test/resources/golden/G2StateMachineConfiguration/G2StateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/G2StateMachineConfiguration/G2StateMachineConfiguration.json index 1dfd657..d6e32df 100644 --- a/state_machine_exporter/src/test/resources/golden/G2StateMachineConfiguration/G2StateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/G2StateMachineConfiguration/G2StateMachineConfiguration.json @@ -21,9 +21,6 @@ }, { "rawName" : "States.STATE_EXTRA_2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_2" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" }, { "rawName" : "States.STATE2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE2" @@ -45,9 +42,6 @@ }, { "rawName" : "States.STATE_EXTRA_1", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" }, { "rawName" : "States.CANCEL", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.CANCEL" diff --git a/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json index d6e6d0e..07a2349 100644 --- a/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/InheritanceStateMachineConfig/InheritanceStateMachineConfig.json @@ -6,9 +6,6 @@ }, { "rawName" : "\"START\"", "fullIdentifier" : "String.START" - }, { - "rawName" : "String.START", - "fullIdentifier" : "String.START" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/KamilEnumStateMachineConfiguration/KamilEnumStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/KamilEnumStateMachineConfiguration/KamilEnumStateMachineConfiguration.json index f1a30f4..4d58632 100644 --- a/state_machine_exporter/src/test/resources/golden/KamilEnumStateMachineConfiguration/KamilEnumStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/KamilEnumStateMachineConfiguration/KamilEnumStateMachineConfiguration.json @@ -9,9 +9,6 @@ }, { "rawName" : "OrderStates.FULFILLED", "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED" - }, { - "rawName" : "click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED", - "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED" }, { "rawName" : "OrderStates.PAID1", "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.PAID1" @@ -24,12 +21,6 @@ }, { "rawName" : "OrderStates.PAID", "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.PAID" - }, { - "rawName" : "click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED", - "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED" - }, { - "rawName" : "click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED", - "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED" }, { "rawName" : "OrderStates.HAPPEN", "fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.HAPPEN" diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json index 0fc35bd..315c8ae 100644 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json +++ b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/MavenOrderStateMachine.json @@ -3,18 +3,12 @@ "states" : [ { "rawName" : "\"DONE\"", "fullIdentifier" : "String.DONE" - }, { - "rawName" : "String.INIT", - "fullIdentifier" : "String.INIT" }, { "rawName" : "\"INIT\"", "fullIdentifier" : "String.INIT" }, { "rawName" : "\"BUSY\"", "fullIdentifier" : "String.BUSY" - }, { - "rawName" : "String.DONE", - "fullIdentifier" : "String.DONE" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html deleted file mode 100644 index 8ac4b01..0000000 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.html +++ /dev/null @@ -1,679 +0,0 @@ - - - - - - State Machine Explorer - click.kamil.maven.core.MavenOrderStateMachine - - - - - - - - - - - - - - - - -
- - -
- - - - - - diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json deleted file mode 100644 index 9556b89..0000000 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "ORDER_EVENT", - "className" : "click.kamil.maven.core.OrderService", - "methodName" : "onMessage", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 34 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /reactive/order", - "className" : "click.kamil.maven.api.ReactiveOrderApi", - "methodName" : "orderRoutes", - "metadata" : { - "path" : "/reactive/order", - "verb" : "POST", - "style" : "WebFlux Functional" - }, - "parameters" : [ ] - }, { - "type" : "JMS", - "name" : "JMS: order.queue", - "className" : "click.kamil.maven.api.JmsOrderListener", - "methodName" : "onMessage", - "metadata" : { - "protocol" : "JMS", - "destination" : "order.queue" - }, - "parameters" : [ { - "name" : "message", - "type" : "String", - "annotations" : [ ] - } ] - } ], - "callChains" : [ ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.maven.core.MavenOrderStateMachine", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "INIT" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"INIT\"", - "fullIdentifier" : "INIT" - } ], - "targetStates" : [ { - "rawName" : "\"BUSY\"", - "fullIdentifier" : "BUSY" - } ], - "event" : "ORDER_EVENT", - "guard" : null, - "actions" : [ { - "expression" : "loggingAction()", - "isLambda" : false, - "internalLogic" : "context -> {\n System.out.println(\"LOG: State transition in progress...\");\n}\n", - "lineNumber" : 23 - } ], - "order" : null - } ], - "endStates" : [ "DONE" ] -} diff --git a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml b/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml deleted file mode 100644 index 98f60a8..0000000 --- a/state_machine_exporter/src/test/resources/golden/MavenOrderStateMachine/click.kamil.maven.core.MavenOrderStateMachine.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -!pragma layout smetana -set separator none -hide empty description -hide stereotype -skinparam state { - BackgroundColor white - BorderColor #94a3b8 - BorderThickness 1 - FontName Inter - FontSize 9 - FontStyle bold - RoundCorner 20 - Padding 1 -} -skinparam shadowing false -skinparam ArrowFontName JetBrains Mono -skinparam ArrowFontSize 8 -skinparam ArrowColor #cbd5e1 -skinparam ArrowThickness 1 -skinparam dpi 110 -skinparam svgLinkTarget _self - -[*] --> INIT - - -INIT -[#1E90FF,bold]-> BUSY <> <> : ORDER_EVENT / loggingAction() - -DONE --> [*] -@enduml - diff --git a/state_machine_exporter/src/test/resources/golden/OneStateMachineConfiguration/OneStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/OneStateMachineConfiguration/OneStateMachineConfiguration.json index 5ad0810..872364c 100644 --- a/state_machine_exporter/src/test/resources/golden/OneStateMachineConfiguration/OneStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/OneStateMachineConfiguration/OneStateMachineConfiguration.json @@ -18,9 +18,6 @@ }, { "rawName" : "States.STATE20", "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE20" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritancestate.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATEZ" }, { "rawName" : "States.STATE2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE2" @@ -54,9 +51,6 @@ }, { "rawName" : "States.STATE18", "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE18" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritancestate.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE1" }, { "rawName" : "States.STATE_EXTRA_1", "fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE_EXTRA_1" diff --git a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/OrderStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/OrderStateMachineConfig.json index 94b9e7f..5769f3a 100644 --- a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/OrderStateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/OrderStateMachineConfig.json @@ -9,12 +9,6 @@ }, { "rawName" : "\"PROCESSING\"", "fullIdentifier" : "String.PROCESSING" - }, { - "rawName" : "String.COMPLETED", - "fullIdentifier" : "String.COMPLETED" - }, { - "rawName" : "String.NEW", - "fullIdentifier" : "String.NEW" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json deleted file mode 100644 index b0c7a90..0000000 --- a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfig/click.kamil.multi.core.OrderStateMachineConfig.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "metadata" : { - "triggers" : [ { - "event" : "SUBMIT", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } ], - "entryPoints" : [ { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.api.OrderApi", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - } ], - "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /orders/submit", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "metadata" : { - "path" : "/orders/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "orderId", - "type" : "String", - "annotations" : [ "RequestBody" ] - } ] - }, - "methodChain" : [ "click.kamil.multi.core.OrderController.submitOrder" ], - "triggerPoint" : { - "event" : "SUBMIT", - "className" : "click.kamil.multi.core.OrderController", - "methodName" : "submitOrder", - "sourceModule" : null, - "stateMachineId" : null, - "lineNumber" : 18 - } - } ], - "properties" : { - "default" : { } - } - }, - "name" : "click.kamil.multi.core.OrderStateMachineConfig", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "NEW" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"NEW\"", - "fullIdentifier" : "NEW" - } ], - "targetStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "event" : "SUBMIT", - "guard" : null, - "actions" : [ { - "expression" : "processAction()", - "isLambda" : false, - "internalLogic" : "@Override default void execute(StateContext context){\n System.out.println(\"Processing order: \" + context.getMessageHeader(\"orderId\"));\n}\n", - "lineNumber" : 31 - } ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "\"PROCESSING\"", - "fullIdentifier" : "PROCESSING" - } ], - "targetStates" : [ { - "rawName" : "\"COMPLETED\"", - "fullIdentifier" : "COMPLETED" - } ], - "event" : "FINISH", - "guard" : null, - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "COMPLETED" ] -} diff --git a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json index 3672374..dded150 100644 --- a/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json @@ -9,12 +9,6 @@ }, { "rawName" : "OrderState.SHIPPED", "fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED" - }, { - "rawName" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED", - "fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED" - }, { - "rawName" : "click.kamil.enterprise.machines.order.OrderState.NEW", - "fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.NEW" } ], "transitions" : [ { "type" : "EXTERNAL", @@ -98,7 +92,7 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "click.kamil.enterprise.machines.order.OrderState.ORDER", + "sourceState" : null, "lineNumber" : 81, "polymorphicEvents" : null, "external" : false, @@ -238,7 +232,7 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "click.kamil.enterprise.machines.order.OrderState.ORDER", + "sourceState" : null, "lineNumber" : 81, "polymorphicEvents" : [ "", "", "" ], "external" : true, diff --git a/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json index 3550bad..641b555 100644 --- a/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/PolymorphicStateMachineConfiguration/PolymorphicStateMachineConfiguration.json @@ -1,9 +1,6 @@ { "name" : "click.kamil.examples.statemachine.polymorphic.PolymorphicStateMachineConfiguration", "states" : [ { - "rawName" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED", - "fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED" - }, { "rawName" : "OrderStates.CANCELED", "fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED" }, { diff --git a/state_machine_exporter/src/test/resources/golden/SimpleEnumStateMachineConfiguration/SimpleEnumStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/SimpleEnumStateMachineConfiguration/SimpleEnumStateMachineConfiguration.json index 1d701a7..2055e91 100644 --- a/state_machine_exporter/src/test/resources/golden/SimpleEnumStateMachineConfiguration/SimpleEnumStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/SimpleEnumStateMachineConfiguration/SimpleEnumStateMachineConfiguration.json @@ -12,15 +12,6 @@ }, { "rawName" : "OrderStates.PAID1", "fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.PAID1" - }, { - "rawName" : "click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED", - "fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED" - }, { - "rawName" : "click.kamil.examples.statemachine.simple.OrderStates.FULFILLED", - "fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.FULFILLED" - }, { - "rawName" : "click.kamil.examples.statemachine.simple.OrderStates.CANCELED", - "fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.CANCELED" }, { "rawName" : "OrderStates.SUBMITTED", "fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED" diff --git a/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json index ce4d2f9..8dea469 100644 --- a/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/StandardDocumentStateMachineConfiguration/StandardDocumentStateMachineConfiguration.json @@ -3,9 +3,6 @@ "states" : [ { "rawName" : "DocumentState.REJECTED", "fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED" - }, { - "rawName" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT", - "fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT" }, { "rawName" : "DocumentState.DRAFT", "fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT" diff --git a/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json index 06b27c7..c03ee85 100644 --- a/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/StandardOrderStateMachineConfiguration/StandardOrderStateMachineConfiguration.json @@ -12,9 +12,6 @@ }, { "rawName" : "OrderState.NEW", "fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW" - }, { - "rawName" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW", - "fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW" } ], "transitions" : [ { "type" : "EXTERNAL", diff --git a/state_machine_exporter/src/test/resources/golden/StateMachineConfig/StateMachineConfig.json b/state_machine_exporter/src/test/resources/golden/StateMachineConfig/StateMachineConfig.json index 84f639a..02a6065 100644 --- a/state_machine_exporter/src/test/resources/golden/StateMachineConfig/StateMachineConfig.json +++ b/state_machine_exporter/src/test/resources/golden/StateMachineConfig/StateMachineConfig.json @@ -3,9 +3,6 @@ "states" : [ { "rawName" : "OrderState.NEW", "fullIdentifier" : "click.kamil.domain.OrderState.NEW" - }, { - "rawName" : "click.kamil.domain.OrderState.NEW", - "fullIdentifier" : "click.kamil.domain.OrderState.NEW" }, { "rawName" : "OrderState.CANCELLED", "fullIdentifier" : "click.kamil.domain.OrderState.CANCELLED" diff --git a/state_machine_exporter/src/test/resources/golden/ThreeStateMachineConfiguration/ThreeStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/ThreeStateMachineConfiguration/ThreeStateMachineConfiguration.json index a3e8203..2c40519 100644 --- a/state_machine_exporter/src/test/resources/golden/ThreeStateMachineConfiguration/ThreeStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/ThreeStateMachineConfiguration/ThreeStateMachineConfiguration.json @@ -21,9 +21,6 @@ }, { "rawName" : "States.STATE_EXTRA_3", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE_EXTRA_3" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1" }, { "rawName" : "States.STATE2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE2" @@ -66,9 +63,6 @@ }, { "rawName" : "States.STATE_EXTRA_2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE_EXTRA_2" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ" }, { "rawName" : "States.STATE1", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1" diff --git a/state_machine_exporter/src/test/resources/golden/TwoStateMachineExtraFunctionsConfiguration/TwoStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/TwoStateMachineExtraFunctionsConfiguration/TwoStateMachineConfiguration.json index 7742198..f132e19 100644 --- a/state_machine_exporter/src/test/resources/golden/TwoStateMachineExtraFunctionsConfiguration/TwoStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/TwoStateMachineExtraFunctionsConfiguration/TwoStateMachineConfiguration.json @@ -1,9 +1,6 @@ { "name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.TwoStateMachineConfiguration", "states" : [ { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1" - }, { "rawName" : "States.STATE1", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1" }, { @@ -39,9 +36,6 @@ }, { "rawName" : "States.STATE20", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE20" - }, { - "rawName" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ", - "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ" }, { "rawName" : "States.STATE2", "fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE2" diff --git a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json index 4c4966d..2853656 100644 --- a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json +++ b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.json @@ -1,72 +1,59 @@ { + "name" : "click.kamil.enterprise.machines.user.UserStateMachineConfiguration", + "states" : [ { + "rawName" : "UserState.GUEST", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.GUEST" + }, { + "rawName" : "UserState.REGISTERED", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.REGISTERED" + }, { + "rawName" : "UserState.VERIFIED", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.VERIFIED" + } ], + "transitions" : [ { + "type" : "EXTERNAL", + "sourceStates" : [ { + "rawName" : "UserState.GUEST", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.GUEST" + } ], + "targetStates" : [ { + "rawName" : "UserState.REGISTERED", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.REGISTERED" + } ], + "event" : { + "rawName" : "UserEvent.REGISTER", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserEvent.REGISTER" + }, + "guards" : [ ], + "actions" : [ ], + "order" : null + }, { + "type" : "EXTERNAL", + "sourceStates" : [ { + "rawName" : "UserState.REGISTERED", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.REGISTERED" + } ], + "targetStates" : [ { + "rawName" : "UserState.VERIFIED", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserState.VERIFIED" + } ], + "event" : { + "rawName" : "UserEvent.VERIFY", + "fullIdentifier" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY" + }, + "guards" : [ ], + "actions" : [ ], + "order" : null + } ], + "startStates" : [ "click.kamil.enterprise.machines.user.UserState.GUEST" ], + "endStates" : [ "click.kamil.enterprise.machines.user.UserState.VERIFIED" ], + "renderChoicesAsDiamonds" : true, + "flows" : [ ], + "stateTypeFqn" : "click.kamil.enterprise.machines.user.UserState", + "eventTypeFqn" : "click.kamil.enterprise.machines.user.UserEvent", "metadata" : { "triggers" : [ { - "event" : "OrderEvent.PAY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 30, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "OrderEvent.SHIP", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 37, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "DocumentEvent.SUBMIT", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "submitDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 44, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "DocumentEvent.APPROVE", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "approveDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 51, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "DocumentEvent.REJECT", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "rejectDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 58, - "polymorphicEvents" : null, - "external" : false, - "constraint" : null, - "ambiguous" : false - }, { - "event" : "UserEvent.VERIFY", + "event" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "verifyUser", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -79,7 +66,7 @@ "constraint" : null, "ambiguous" : false }, { - "event" : "UserEvent.SUSPEND", + "event" : "click.kamil.enterprise.machines.user.UserEvent.SUSPEND", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "suspendUser", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -98,33 +85,7 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "ORDER", - "lineNumber" : 81, - "polymorphicEvents" : null, - "external" : false, - "constraint" : "\"ORDER\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, { - "event" : "event", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "DOCUMENT", - "lineNumber" : 87, - "polymorphicEvents" : null, - "external" : false, - "constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && \"DOCUMENT\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, { - "event" : "event", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "USER", + "sourceState" : null, "lineNumber" : 93, "polymorphicEvents" : null, "external" : false, @@ -132,111 +93,6 @@ "ambiguous" : false } ], "entryPoints" : [ { - "type" : "REST", - "name" : "POST /api/machine/order/pay", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/pay", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/order/ship", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/ship", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/submit", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "submitDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/approve", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "approveDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/approve", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/document/reject", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "rejectDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/reject", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/user/verify", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "verifyUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/verify", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { - "type" : "REST", - "name" : "POST /api/machine/user/suspend", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "suspendUser", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/user/suspend", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, { "type" : "REST", "name" : "POST /api/machine/{machineType}/transition/{event}", "className" : "click.kamil.enterprise.web.StateMachineController", @@ -261,176 +117,6 @@ } ] } ], "callChains" : [ { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/order/pay", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/pay", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.payOrder", "click.kamil.enterprise.web.StateMachineDispatcher.payOrder" ], - "triggerPoint" : { - "event" : "OrderEvent.PAY", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "payOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 30, - "polymorphicEvents" : [ "OrderEvent.PAY" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/order/ship", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/order/ship", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.shipOrder", "click.kamil.enterprise.web.StateMachineDispatcher.shipOrder" ], - "triggerPoint" : { - "event" : "OrderEvent.SHIP", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "shipOrder", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 37, - "polymorphicEvents" : [ "OrderEvent.SHIP" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/document/submit", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "submitDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/submit", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.submitDocument", "click.kamil.enterprise.web.StateMachineDispatcher.submitDocument" ], - "triggerPoint" : { - "event" : "DocumentEvent.SUBMIT", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "submitDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 44, - "polymorphicEvents" : [ "DocumentEvent.SUBMIT" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/document/approve", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "approveDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/approve", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.approveDocument", "click.kamil.enterprise.web.StateMachineDispatcher.approveDocument" ], - "triggerPoint" : { - "event" : "DocumentEvent.APPROVE", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "approveDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 51, - "polymorphicEvents" : [ "DocumentEvent.APPROVE" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/document/reject", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "rejectDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/document/reject", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.rejectDocument", "click.kamil.enterprise.web.StateMachineDispatcher.rejectDocument" ], - "triggerPoint" : { - "event" : "DocumentEvent.REJECT", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "rejectDocument", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : null, - "lineNumber" : 58, - "polymorphicEvents" : [ "DocumentEvent.REJECT" ], - "external" : false, - "constraint" : null, - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { "entryPoint" : { "type" : "REST", "name" : "POST /api/machine/user/verify", @@ -449,7 +135,7 @@ }, "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.verifyUser", "click.kamil.enterprise.web.StateMachineDispatcher.verifyUser" ], "triggerPoint" : { - "event" : "UserEvent.VERIFY", + "event" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "verifyUser", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -457,16 +143,16 @@ "stateMachineId" : null, "sourceState" : null, "lineNumber" : 65, - "polymorphicEvents" : [ "UserEvent.VERIFY" ], + "polymorphicEvents" : [ "click.kamil.enterprise.machines.user.UserEvent.VERIFY" ], "external" : false, "constraint" : null, "ambiguous" : false }, "contextMachineId" : null, "matchedTransitions" : [ { - "sourceState" : "UserState.REGISTERED", - "targetState" : "UserState.VERIFIED", - "event" : "UserEvent.VERIFY" + "sourceState" : "click.kamil.enterprise.machines.user.UserState.REGISTERED", + "targetState" : "click.kamil.enterprise.machines.user.UserState.VERIFIED", + "event" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY" } ] }, { "entryPoint" : { @@ -487,7 +173,7 @@ }, "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.suspendUser", "click.kamil.enterprise.web.StateMachineDispatcher.suspendUser" ], "triggerPoint" : { - "event" : "UserEvent.SUSPEND", + "event" : "click.kamil.enterprise.machines.user.UserEvent.SUSPEND", "className" : "click.kamil.enterprise.web.StateMachineDispatcher", "methodName" : "suspendUser", "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", @@ -495,7 +181,7 @@ "stateMachineId" : null, "sourceState" : null, "lineNumber" : 72, - "polymorphicEvents" : [ "UserEvent.SUSPEND" ], + "polymorphicEvents" : [ "click.kamil.enterprise.machines.user.UserEvent.SUSPEND" ], "external" : false, "constraint" : null, "ambiguous" : false @@ -535,91 +221,7 @@ "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", "sourceModule" : null, "stateMachineId" : null, - "sourceState" : "ORDER", - "lineNumber" : 81, - "polymorphicEvents" : [ "", "", "" ], - "external" : true, - "constraint" : "\"ORDER\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/{machineType}/transition/{event}", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "transition", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/{machineType}/transition/{event}", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "machineType", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "event", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.transition", "click.kamil.enterprise.web.StateMachineDispatcher.dispatch" ], - "triggerPoint" : { - "event" : "true ? OrderEvent.valueOf(eventString.toUpperCase()) : true ? DocumentEvent.valueOf(eventString.toUpperCase()) : UserEvent.valueOf(eventString.toUpperCase())", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "DOCUMENT", - "lineNumber" : 87, - "polymorphicEvents" : [ "", "", "" ], - "external" : true, - "constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && \"DOCUMENT\".equalsIgnoreCase(machineType)", - "ambiguous" : false - }, - "contextMachineId" : null, - "matchedTransitions" : null - }, { - "entryPoint" : { - "type" : "REST", - "name" : "POST /api/machine/{machineType}/transition/{event}", - "className" : "click.kamil.enterprise.web.StateMachineController", - "methodName" : "transition", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineController.java", - "metadata" : { - "path" : "/api/machine/{machineType}/transition/{event}", - "verb" : "POST" - }, - "parameters" : [ { - "name" : "machineType", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "event", - "type" : "String", - "annotations" : [ "PathVariable" ] - }, { - "name" : "userId", - "type" : "String", - "annotations" : [ "RequestParam" ] - } ] - }, - "methodChain" : [ "click.kamil.enterprise.web.StateMachineController.transition", "click.kamil.enterprise.web.StateMachineDispatcher.dispatch" ], - "triggerPoint" : { - "event" : "true ? OrderEvent.valueOf(eventString.toUpperCase()) : true ? DocumentEvent.valueOf(eventString.toUpperCase()) : UserEvent.valueOf(eventString.toUpperCase())", - "className" : "click.kamil.enterprise.web.StateMachineDispatcher", - "methodName" : "dispatch", - "sourceFile" : "src/main/java/click/kamil/enterprise/web/StateMachineDispatcher.java", - "sourceModule" : null, - "stateMachineId" : null, - "sourceState" : "USER", + "sourceState" : null, "lineNumber" : 93, "polymorphicEvents" : [ "", "", "" ], "external" : true, @@ -632,44 +234,5 @@ "properties" : { "default" : { } } - }, - "name" : "click.kamil.enterprise.machines.user.UserStateMachineConfiguration", - "renderChoicesAsDiamonds" : true, - "startStates" : [ "UserState.GUEST" ], - "transitions" : [ { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "UserState.GUEST", - "fullIdentifier" : "UserState.GUEST" - } ], - "targetStates" : [ { - "rawName" : "UserState.REGISTERED", - "fullIdentifier" : "UserState.REGISTERED" - } ], - "event" : { - "rawName" : "UserEvent.REGISTER", - "fullIdentifier" : "UserEvent.REGISTER" - }, - "guards" : [ ], - "actions" : [ ], - "order" : null - }, { - "type" : "EXTERNAL", - "sourceStates" : [ { - "rawName" : "UserState.REGISTERED", - "fullIdentifier" : "UserState.REGISTERED" - } ], - "targetStates" : [ { - "rawName" : "UserState.VERIFIED", - "fullIdentifier" : "UserState.VERIFIED" - } ], - "event" : { - "rawName" : "UserEvent.VERIFY", - "fullIdentifier" : "UserEvent.VERIFY" - }, - "guards" : [ ], - "actions" : [ ], - "order" : null - } ], - "endStates" : [ "UserState.VERIFIED" ] + } } diff --git a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.puml b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.puml index 366ce20..113b1bd 100644 --- a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.puml +++ b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.puml @@ -21,12 +21,12 @@ skinparam ArrowThickness 1 skinparam dpi 110 skinparam svgLinkTarget _self -[*] --> UserState.GUEST +[*] --> click.kamil.enterprise.machines.user.UserState.GUEST UserState.GUEST -[#1E90FF,bold]-> UserState.REGISTERED <> : UserEvent.REGISTER UserState.REGISTERED -[#1E90FF,bold]-> UserState.VERIFIED <> : UserEvent.VERIFY -UserState.VERIFIED --> [*] +click.kamil.enterprise.machines.user.UserState.VERIFIED --> [*] @enduml diff --git a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.scxml.xml b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.scxml.xml index b70b364..7090f43 100644 --- a/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.scxml.xml +++ b/state_machine_exporter/src/test/resources/golden/UserStateMachineConfiguration/UserStateMachineConfiguration.scxml.xml @@ -8,5 +8,9 @@
+ + + + diff --git a/state_machine_exporter_html/src/main/java/click/kamil/springstatemachineexporter/html/command/HtmlExporterCommand.java b/state_machine_exporter_html/src/main/java/click/kamil/springstatemachineexporter/html/command/HtmlExporterCommand.java index 2a52129..9d73792 100644 --- a/state_machine_exporter_html/src/main/java/click/kamil/springstatemachineexporter/html/command/HtmlExporterCommand.java +++ b/state_machine_exporter_html/src/main/java/click/kamil/springstatemachineexporter/html/command/HtmlExporterCommand.java @@ -65,6 +65,9 @@ public class HtmlExporterCommand implements Callable { @Option(names = {"--include-generated-sources"}, description = "Scan existing Maven target/ and Gradle build/ trees for pre-generated .java sources. Does not run Maven or Gradle.", negatable = true, defaultValue = "true", fallbackValue = "true") private boolean includeGeneratedSources = true; + @Option(names = {"--inline-accessors"}, description = "Index trivial JavaBean/record accessors at scan time and inline them during call-chain and constant resolution.", negatable = true, defaultValue = "true", fallbackValue = "true") + private boolean inlineAccessors = true; + @Override public Integer call() throws Exception { var out = spec.commandLine().getOut(); @@ -100,7 +103,7 @@ public class HtmlExporterCommand implements Callable { exportService.runJsonExporter(jsonFile, outputDir, formats, profiles, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, inputDir); } else { boolean renderChoicesAsDiamonds = !noDiamonds; - exportService.runExporter(inputDir, outputDir, formats, renderChoicesAsDiamonds, profiles, flowsFile, machineFilter, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, includeGeneratedSources); + exportService.runExporter(inputDir, outputDir, formats, renderChoicesAsDiamonds, profiles, flowsFile, machineFilter, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, click.kamil.springstatemachineexporter.exporter.EnumFormat.fn, includeGeneratedSources, inlineAccessors); } System.clearProperty("html.hideMetadataPane"); diff --git a/state_machine_exporter_html/src/main/resources/html/template.html b/state_machine_exporter_html/src/main/resources/html/template.html index f39bafe..a94c714 100644 --- a/state_machine_exporter_html/src/main/resources/html/template.html +++ b/state_machine_exporter_html/src/main/resources/html/template.html @@ -356,19 +356,35 @@ }); } + function isLifecycleChain(c) { + const ev = c.triggerPoint && c.triggerPoint.event; + return ev && ev.startsWith('[LIFECYCLE:'); + } + + function formatLifecycleLabel(event) { + const m = event && event.match(/^\[LIFECYCLE:(\w+)\]$/); + if (!m) return event; + const type = m[1].toUpperCase(); + if (type === 'RESTORE') return 'Restore persisted state'; + if (type === 'RESET') return 'Reset state machine'; + return 'Lifecycle: ' + m[1].toLowerCase(); + } + + function chainsForEntryPoint(ep) { + return (metadata.metadata.callChains || []).filter(c => + c.entryPoint.className === ep.className && + c.entryPoint.methodName === ep.methodName && + ((c.matchedTransitions && c.matchedTransitions.length > 0) || isLifecycleChain(c)) + ); + } + function populateSidebar() { const list = document.getElementById('ep-list'); if (!list) return; const entryPoints = metadata.metadata.entryPoints || []; entryPoints.forEach(ep => { - // Quality Filter: Hide if it doesn't trigger a machine event - const chains = (metadata.metadata.callChains || []).filter(c => - c.entryPoint.className === ep.className && - c.entryPoint.methodName === ep.methodName && - c.matchedTransitions && c.matchedTransitions.length > 0 - ); - + const chains = chainsForEntryPoint(ep); if (chains.length === 0) return; const card = document.createElement('div'); @@ -381,18 +397,24 @@ ${sourceHint} `; - // Add tags for matched events - let triggersHtml = '
Triggers: '; - const addedEvents = new Set(); - chains.forEach(c => { - c.matchedTransitions.forEach(t => { - const evName = t.event || ""; - if (!addedEvents.has(evName)) { - addedEvents.add(evName); - triggersHtml += `${evName} `; - } + let triggersHtml = '
'; + const lifecycleChain = chains.find(isLifecycleChain); + if (lifecycleChain) { + const label = formatLifecycleLabel(lifecycleChain.triggerPoint.event); + triggersHtml += `${label}`; + } else { + triggersHtml += 'Triggers: '; + const addedEvents = new Set(); + chains.forEach(c => { + c.matchedTransitions.forEach(t => { + const evName = t.event || ""; + if (!addedEvents.has(evName)) { + addedEvents.add(evName); + triggersHtml += `${evName} `; + } + }); }); - }); + } triggersHtml += '
'; card.innerHTML += triggersHtml; @@ -427,20 +449,18 @@ function highlightEntryPoint(ep) { clearHighlights(); - const chains = metadata.metadata.callChains || []; + const chains = chainsForEntryPoint(ep); const seen = new Set(); let steps = []; chains.forEach(c => { - if (c.entryPoint.className === ep.className && c.entryPoint.methodName === ep.methodName) { - if (c.matchedTransitions && c.matchedTransitions.length > 0) { - c.matchedTransitions.forEach(t => { - const key = buildLinkKey(t.sourceState, t.event); - if (!key || seen.has(key)) return; - seen.add(key); - steps.push({ event: t.event, source: t.sourceState, ambiguous: c.triggerPoint && c.triggerPoint.ambiguous }); - }); - } + if (c.matchedTransitions && c.matchedTransitions.length > 0) { + c.matchedTransitions.forEach(t => { + const key = buildLinkKey(t.sourceState, t.event); + if (!key || seen.has(key)) return; + seen.add(key); + steps.push({ event: t.event, source: t.sourceState, ambiguous: c.triggerPoint && c.triggerPoint.ambiguous }); + }); } }); @@ -667,11 +687,14 @@ if (chains && chains.length > 0) { html += `
Triggered by
`; chains.forEach(c => { + const triggerEvent = c.triggerPoint && c.triggerPoint.event; + const lifecycleLabel = triggerEvent && triggerEvent.startsWith('[LIFECYCLE:') + ? formatLifecycleLabel(triggerEvent) : null; const triggerInfo = c.triggerPoint.sourceFile ? ` (${c.triggerPoint.sourceFile}:${c.triggerPoint.lineNumber})` : ''; const ambiguousLabel = c.triggerPoint.ambiguous ? `
⚠️ Ambiguous Resolution (Over-approximated)
` : ''; html += `
${c.entryPoint.name}
-
Trigger: ${c.triggerPoint.methodName}${triggerInfo}
+
${lifecycleLabel ? 'Lifecycle: ' + lifecycleLabel : 'Trigger: ' + c.triggerPoint.methodName}${triggerInfo}
${ambiguousLabel} ${renderParameters(c.entryPoint.parameters)}
diff --git a/state_machine_exporter_html/src/test/java/click/kamil/springstatemachineexporter/html/ExtendedStateMachineLifecycleHtmlTest.java b/state_machine_exporter_html/src/test/java/click/kamil/springstatemachineexporter/html/ExtendedStateMachineLifecycleHtmlTest.java new file mode 100644 index 0000000..04ee997 --- /dev/null +++ b/state_machine_exporter_html/src/test/java/click/kamil/springstatemachineexporter/html/ExtendedStateMachineLifecycleHtmlTest.java @@ -0,0 +1,38 @@ +package click.kamil.springstatemachineexporter.html; + +import click.kamil.springstatemachineexporter.html.exporter.HtmlExporter; +import click.kamil.springstatemachineexporter.service.ExportService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class ExtendedStateMachineLifecycleHtmlTest { + + private static final Path EXTENDED_GOLDEN_JSON = Path.of( + "../state_machine_exporter/src/test/resources/golden/ExtendedStateMachineConfig/ExtendedStateMachineConfig.json") + .toAbsolutePath() + .normalize(); + + @Test + void shouldShowLifecycleRestoreEndpointsInSidebar(@TempDir Path tempDir) throws Exception { + assertThat(EXTENDED_GOLDEN_JSON).exists(); + + ExportService exportService = new ExportService(List.of(new HtmlExporter())); + exportService.runJsonExporter(EXTENDED_GOLDEN_JSON, tempDir, List.of("html"), List.of()); + + Path machineDir = tempDir.resolve("click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig"); + Path htmlFile = machineDir.resolve("click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig.html"); + assertThat(htmlFile).exists(); + + String html = Files.readString(htmlFile); + assertThat(html).contains("function formatLifecycleLabel"); + assertThat(html).contains("POST /api/orders/resume"); + assertThat(html).contains("Restore persisted state"); + assertThat(html).contains("[LIFECYCLE:RESTORE]"); + } +}