Make JSON a self-contained analysis interchange for downstream exporters.

Persist machine types, finalize on JSON import, resolve @Value placeholders, and canonicalize String states so HTML and other consumers can import JSON without source re-analysis.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-12 05:33:27 +02:00
parent 0aca0aade9
commit 4f13c9449c
45 changed files with 2349 additions and 849 deletions

View File

@@ -35,6 +35,11 @@ public class AnalysisResult {
@Builder.Default
private List<BusinessFlow> flows = java.util.Collections.emptyList();
/** Resolved {@code StateMachineConfigurerAdapter<S,E>} state type; persisted for JSON round-trip. */
private String stateTypeFqn;
/** Resolved {@code StateMachineConfigurerAdapter<S,E>} event type; persisted for JSON round-trip. */
private String eventTypeFqn;
@Builder.Default
private CodebaseMetadata metadata = CodebaseMetadata.empty();
@@ -56,7 +61,9 @@ public class AnalysisResult {
// 2. Resolve states (State record is immutable, so recreate)
if (states != null) {
this.states = states.stream()
.map(s -> click.kamil.springstatemachineexporter.model.State.of(s.rawName(), resolver.resolveValue(s.fullIdentifier(), properties)))
.map(s -> click.kamil.springstatemachineexporter.model.State.of(
resolver.resolveValue(s.rawName(), properties),
resolver.resolveValue(s.fullIdentifier(), properties)))
.collect(java.util.stream.Collectors.toSet());
}

View File

@@ -1037,9 +1037,19 @@ public class ConstantResolver {
}
if (valueExpr instanceof StringLiteral sl) {
return sl.getLiteralValue();
String literal = sl.getLiteralValue();
if (literal != null && literal.contains("${")) {
return click.kamil.springstatemachineexporter.analysis.util.PlaceholderResolver.resolve(
literal, java.util.Collections.emptyMap());
}
return literal;
}
return valueExpr != null ? valueExpr.toString().replaceAll("^\"|\"$", "") : null;
String raw = valueExpr != null ? valueExpr.toString().replaceAll("^\"|\"$", "") : null;
if (raw != null && raw.contains("${")) {
return click.kamil.springstatemachineexporter.analysis.util.PlaceholderResolver.resolve(
raw, java.util.Collections.emptyMap());
}
return raw;
}
private TypeDeclaration findEnclosingType(ASTNode node) {

View File

@@ -190,13 +190,26 @@ public final class MachineEnumCanonicalizer {
if (state == null || enumTypeFqn == null || enumTypeFqn.isBlank()) {
return state;
}
String canonical = canonicalizeLabel(
state.fullIdentifier() != null ? state.fullIdentifier() : state.rawName(),
enumTypeFqn);
if (canonical.equals(state.fullIdentifier())) {
String raw = resolvePlaceholder(state.rawName());
String full = resolvePlaceholder(
state.fullIdentifier() != null ? state.fullIdentifier() : state.rawName());
String canonical = canonicalizeLabel(full, enumTypeFqn);
if (canonical.equals(state.fullIdentifier()) && raw.equals(state.rawName())) {
return state;
}
return State.of(state.rawName(), canonical);
if (isStringOrPrimitiveType(enumTypeFqn) && canonical.startsWith(enumTypeFqn + ".")) {
String constant = canonical.substring(enumTypeFqn.length() + 1);
raw = "\"" + constant + "\"";
}
return State.of(raw, canonical);
}
private static String resolvePlaceholder(String value) {
if (value == null || !value.contains("${")) {
return value;
}
return click.kamil.springstatemachineexporter.analysis.util.PlaceholderResolver.resolve(
value, java.util.Collections.emptyMap());
}
public static boolean isMachineEnumReference(String value, String enumTypeFqn) {
@@ -230,6 +243,10 @@ public final class MachineEnumCanonicalizer {
if (value == null || value.isBlank() || enumTypeFqn == null || enumTypeFqn.isBlank()) {
return value;
}
value = resolvePlaceholder(value);
if (value == null || value.isBlank()) {
return value;
}
if (value.length() >= 2 && value.startsWith("\"") && value.endsWith("\"")) {
return stripQuotes(value);
}

View File

@@ -23,17 +23,50 @@ public final class AnalysisResultFinalizer {
}
public static void finalizeResult(AnalysisResult result, CodebaseContext context) {
if (result == null || context == null) {
if (result == null) {
return;
}
StateMachineTypeResolver.MachineTypes machineTypes = JsonExportContextFactory.resolveMachineTypes(
result.getName(),
result.getStateTypeFqn(),
result.getEventTypeFqn(),
context);
finalizeResult(result, context, machineTypes);
}
public static void finalizeResult(
AnalysisResult result,
CodebaseContext context,
StateMachineTypeResolver.MachineTypes machineTypes) {
if (result == null || machineTypes == null) {
return;
}
StateMachineTypeResolver.MachineTypes machineTypes =
StateMachineTypeResolver.resolveTypes(result.getName(), context);
persistMachineTypes(result, machineTypes);
applyCanonicalization(result, machineTypes);
if (context != null) {
AnalysisCanonicalFormValidator.enforce(result, context);
} else {
AnalysisCanonicalFormValidator.enforceWithMachineTypes(result, machineTypes);
}
}
private static void persistMachineTypes(
AnalysisResult result,
StateMachineTypeResolver.MachineTypes machineTypes) {
result.setStateTypeFqn(machineTypes.stateTypeFqn());
result.setEventTypeFqn(machineTypes.eventTypeFqn());
}
private static void applyCanonicalization(
AnalysisResult result,
StateMachineTypeResolver.MachineTypes machineTypes) {
MachineEnumCanonicalizer.canonicalizeTransitions(result.getTransitions(), machineTypes);
if (result.getStates() != null) {
result.setStates(MachineEnumCanonicalizer.canonicalizeStates(result.getStates(), machineTypes.stateTypeFqn()));
result.setStates(MachineEnumCanonicalizer.canonicalizeStates(
result.getStates(), machineTypes.stateTypeFqn()));
}
result.setStartStates(MachineEnumCanonicalizer.canonicalizeStateLabels(
result.getStartStates(), machineTypes.stateTypeFqn()));
@@ -51,8 +84,6 @@ public final class AnalysisResultFinalizer {
.properties(metadata.getProperties())
.build());
}
AnalysisCanonicalFormValidator.enforce(result, context);
}
private static List<TriggerPoint> canonicalizeTriggers(

View File

@@ -0,0 +1,73 @@
package click.kamil.springstatemachineexporter.analysis.service;
import click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver;
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
/** Builds a minimal {@link CodebaseContext} for JSON re-export when sources are available. */
@Slf4j
public final class JsonExportContextFactory {
private JsonExportContextFactory() {
}
public static Path findProjectRoot(Path start) {
Path current = start != null ? start.toAbsolutePath().normalize() : null;
while (current != null) {
if (Files.exists(current.resolve("settings.gradle"))
|| Files.exists(current.resolve("pom.xml"))
|| Files.exists(current.resolve("build.gradle"))) {
return current;
}
current = current.getParent();
}
return null;
}
public static CodebaseContext scanProjectRoot(Path projectRoot, List<String> activeProfiles) throws IOException {
CodebaseContext context = new CodebaseContext();
if (activeProfiles != null) {
context.setActiveProfiles(activeProfiles);
}
context.setProjectRoot(projectRoot);
context.setResolveBindings(true);
Path mainJava = projectRoot.resolve("src/main/java");
if (Files.isDirectory(mainJava)) {
context.setSourcepath(List.of(mainJava.toString()));
context.scan(projectRoot);
return context;
}
click.kamil.springstatemachineexporter.analysis.resolver.SiblingDependencyResolver siblingResolver =
new click.kamil.springstatemachineexporter.analysis.resolver.SiblingDependencyResolver();
var projectGraph = siblingResolver.analyzeProject(projectRoot);
var scanPaths = projectGraph.resolveScanPaths(projectRoot, false);
context.scan(scanPaths, java.util.Collections.emptySet());
return context;
}
public static StateMachineTypeResolver.MachineTypes resolveMachineTypes(
String machineName,
String embeddedStateTypeFqn,
String embeddedEventTypeFqn,
CodebaseContext context) {
if (context != null && machineName != null) {
StateMachineTypeResolver.MachineTypes resolved =
StateMachineTypeResolver.resolveTypes(machineName, context);
if (resolved.stateTypeFqn() != null || resolved.eventTypeFqn() != null) {
return resolved;
}
}
return new StateMachineTypeResolver.MachineTypes(embeddedStateTypeFqn, embeddedEventTypeFqn);
}
private static boolean hasPackageQualifiedType(String typeFqn) {
return typeFqn != null && typeFqn.contains(".");
}
}

View File

@@ -49,6 +49,46 @@ public final class AnalysisCanonicalFormValidator {
return violations;
}
validateFields(result, machineTypes, violations);
return violations;
}
public static List<Violation> validateWithMachineTypes(
AnalysisResult result,
StateMachineTypeResolver.MachineTypes machineTypes) {
List<Violation> violations = new ArrayList<>();
if (result == null || machineTypes == null) {
return violations;
}
if (!hasPackageQualifiedEnumType(machineTypes.stateTypeFqn())
&& !hasPackageQualifiedEnumType(machineTypes.eventTypeFqn())) {
return violations;
}
validateFields(result, machineTypes, violations);
return violations;
}
public static void enforce(AnalysisResult result, CodebaseContext context) {
List<Violation> violations = validate(result, context);
if (!violations.isEmpty()) {
throw new AnalysisCanonicalFormException(violations);
}
}
public static void enforceWithMachineTypes(
AnalysisResult result,
StateMachineTypeResolver.MachineTypes machineTypes) {
List<Violation> violations = validateWithMachineTypes(result, machineTypes);
if (!violations.isEmpty()) {
throw new AnalysisCanonicalFormException(violations);
}
}
private static void validateFields(
AnalysisResult result,
StateMachineTypeResolver.MachineTypes machineTypes,
List<Violation> violations) {
validateTransitions(result.getTransitions(), machineTypes, violations);
validateStateCollection(result.getStates(), machineTypes.stateTypeFqn(), "states", violations);
validateStateLabels(result.getStartStates(), machineTypes.stateTypeFqn(), "startStates", violations);
@@ -58,15 +98,6 @@ public final class AnalysisCanonicalFormValidator {
validateTriggers(result.getMetadata().getTriggers(), machineTypes, violations);
validateCallChains(result.getMetadata().getCallChains(), machineTypes, violations);
}
return violations;
}
public static void enforce(AnalysisResult result, CodebaseContext context) {
List<Violation> violations = validate(result, context);
if (!violations.isEmpty()) {
throw new AnalysisCanonicalFormException(violations);
}
}
private static String describeTypes(StateMachineTypeResolver.MachineTypes machineTypes) {

View File

@@ -69,17 +69,26 @@ public class StateResolver {
}
private String extractAnnotationValue(Annotation ann) {
String raw;
if (ann instanceof SingleMemberAnnotation sma) {
return stripQuotes(sma.getValue().toString());
raw = stripQuotes(sma.getValue().toString());
} else if (ann instanceof NormalAnnotation na) {
raw = null;
for (Object pairObj : na.values()) {
MemberValuePair pair = (MemberValuePair) pairObj;
if ("value".equals(pair.getName().getIdentifier())) {
return stripQuotes(pair.getValue().toString());
raw = stripQuotes(pair.getValue().toString());
break;
}
}
} else {
return null;
}
return null;
if (raw != null && raw.contains("${")) {
return click.kamil.springstatemachineexporter.analysis.util.PlaceholderResolver.resolve(
raw, java.util.Collections.emptyMap());
}
return raw;
}
private String stripQuotes(String s) {

View File

@@ -30,7 +30,7 @@ public class ExporterCommand implements Callable<Integer> {
@CommandLine.Spec
CommandLine.Model.CommandSpec spec;
@Option(names = {"-i", "--input"}, description = "Input directory containing the Spring Boot project source code.")
@Option(names = {"-i", "--input"}, description = "Input directory containing the Spring Boot project source code. With -j, optionally rescans sources to resolve machine enum types.")
private Path inputDir;
@Option(names = {"-j", "--json"}, description = "Input JSON file containing the state machine definition.")
@@ -91,7 +91,7 @@ public class ExporterCommand implements Callable<Integer> {
try {
List<String> profiles = activeProfiles != null ? activeProfiles : java.util.Collections.emptyList();
if (jsonFile != null) {
exportService.runJsonExporter(jsonFile, outputDir, selectedFormats, profiles, eventFormat, stateFormat);
exportService.runJsonExporter(jsonFile, outputDir, selectedFormats, profiles, eventFormat, stateFormat, inputDir);
} else {
exportService.runExporter(inputDir, outputDir, selectedFormats, renderChoicesAsDiamonds, profiles, null, null, eventFormat, stateFormat, includeGeneratedSources, inlineAccessors);
}

View File

@@ -20,15 +20,9 @@ public class JsonExporter implements StateMachineExporter {
@Override
public String export(click.kamil.springstatemachineexporter.analysis.model.AnalysisResult result, ExportOptions options) {
try {
java.util.Map<String, Object> output = new java.util.HashMap<>();
output.put("name", result.getName());
output.put("transitions", result.getTransitions());
output.put("startStates", result.getStartStates());
output.put("endStates", result.getEndStates());
output.put("renderChoicesAsDiamonds", options.isRenderChoicesAsDiamonds());
output.put("metadata", result.getMetadata());
return objectMapper.writeValueAsString(output);
// Full AnalysisResult serialization: self-contained interchange format for downstream
// exporters (HTML, etc.) without requiring source code re-analysis.
return objectMapper.writeValueAsString(result);
} catch (Exception e) {
throw new RuntimeException("Failed to export to JSON", e);
}

View File

@@ -172,12 +172,37 @@ public class ExportService {
}
public void runJsonExporter(Path jsonFile, Path outputDir, List<String> selectedFormats, List<String> activeProfiles, click.kamil.springstatemachineexporter.exporter.EnumFormat eventFormat, click.kamil.springstatemachineexporter.exporter.EnumFormat stateFormat) throws IOException {
runJsonExporter(jsonFile, outputDir, selectedFormats, activeProfiles, eventFormat, stateFormat, null);
}
public void runJsonExporter(Path jsonFile, Path outputDir, List<String> selectedFormats, List<String> activeProfiles, click.kamil.springstatemachineexporter.exporter.EnumFormat eventFormat, click.kamil.springstatemachineexporter.exporter.EnumFormat stateFormat, Path optionalSourceDir) throws IOException {
JsonImportService jsonImportService = new JsonImportService();
AnalysisResult result = jsonImportService.importAnalysisResult(jsonFile);
// Apply property resolution pass if placeholders exist
resolveProperties(result, activeProfiles);
CodebaseContext context = null;
Path sourceRoot = optionalSourceDir;
if (sourceRoot == null) {
sourceRoot = click.kamil.springstatemachineexporter.analysis.service.JsonExportContextFactory
.findProjectRoot(jsonFile.toAbsolutePath().getParent());
}
if (sourceRoot != null) {
log.info("JSON re-export: scanning source project at {}", sourceRoot);
context = click.kamil.springstatemachineexporter.analysis.service.JsonExportContextFactory
.scanProjectRoot(sourceRoot, activeProfiles);
} else {
log.info("JSON re-export: no source project found; using embedded machine types if present");
}
StateMachineTypeResolver.MachineTypes machineTypes =
click.kamil.springstatemachineexporter.analysis.service.JsonExportContextFactory.resolveMachineTypes(
result.getName(),
result.getStateTypeFqn(),
result.getEventTypeFqn(),
context);
AnalysisResultFinalizer.finalizeResult(result, context, machineTypes);
generateOutputs(outputDir, result, selectedFormats, eventFormat, stateFormat);
}

View File

@@ -0,0 +1,36 @@
package click.kamil.springstatemachineexporter;
import click.kamil.springstatemachineexporter.exporter.JsonExporter;
import click.kamil.springstatemachineexporter.service.ExportService;
import click.kamil.springstatemachineexporter.service.JsonImportService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
class EnterpriseInitialStateExportTest {
@Test
void shouldExportCanonicalInitialStateForValuePlaceholder(@TempDir Path outputDir) throws Exception {
Path inputDir = Path.of("../state_machines/enterprise_order_system").toAbsolutePath().normalize();
ExportService exportService = new ExportService(List.of(new JsonExporter()));
exportService.runExporter(inputDir, outputDir, List.of("json"), true, List.of());
Path jsonFile = outputDir.resolve("click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig")
.resolve("click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig.json");
var result = new JsonImportService().importAnalysisResult(jsonFile);
assertThat(result.getStateTypeFqn()).isEqualTo("String");
assertThat(result.getStartStates()).containsExactly("String.NEW");
assertThat(result.getStates())
.anyMatch(s -> "String.NEW".equals(s.fullIdentifier())
&& !s.rawName().contains("${"));
assertThat(result.getStates())
.noneMatch(s -> s.rawName().contains("${order.initial.state"));
}
}

View File

@@ -0,0 +1,30 @@
package click.kamil.springstatemachineexporter.analysis.resolver;
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
import org.junit.jupiter.api.Test;
import java.nio.file.Path;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
class EnterpriseStringMachineTypeTest {
@Test
void shouldResolveStringTypesForEnterpriseConfig() throws Exception {
Path projectRoot = Path.of("../state_machines/enterprise_order_system").toAbsolutePath().normalize();
Path javaRoot = projectRoot.resolve("src/main/java");
CodebaseContext context = new CodebaseContext();
context.setSourcepath(List.of(javaRoot.toString()));
context.scan(javaRoot);
StateMachineTypeResolver.MachineTypes types = StateMachineTypeResolver.resolveTypes(
"click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig", context);
assertThat(types.stateTypeFqn()).isEqualTo("String");
assertThat(types.eventTypeFqn()).isEqualTo("String");
assertThat(MachineEnumCanonicalizer.canonicalizeLabel("NEW", types.stateTypeFqn()))
.isEqualTo("String.NEW");
}
}

View File

@@ -58,6 +58,36 @@ class AnalysisResultFinalizerTest {
.containsExactly("com.example.order.OrderState.NEW");
assertThat(result.getMetadata().getTriggers().get(0).getPolymorphicEvents())
.containsExactly("com.example.order.OrderEvent.PAY");
assertThat(result.getStateTypeFqn()).isEqualTo("com.example.order.OrderState");
assertThat(result.getEventTypeFqn()).isEqualTo("com.example.order.OrderEvent");
}
@Test
void shouldCanonicalizeUsingEmbeddedMachineTypesWithoutContext() {
Transition transition = new Transition();
transition.setEvent(Event.of("OrderEvent.PAY", "OrderEvent.PAY"));
transition.setSourceStates(List.of(State.of("OrderState.NEW", "OrderState.NEW")));
transition.setTargetStates(List.of(State.of("OrderState.PAID", "OrderState.PAID")));
AnalysisResult result = AnalysisResult.builder()
.name("com.example.config.OrderStateMachineConfiguration")
.stateTypeFqn("com.example.order.OrderState")
.eventTypeFqn("com.example.order.OrderEvent")
.transitions(List.of(transition))
.startStates(Set.of("OrderState.NEW"))
.build();
AnalysisResultFinalizer.finalizeResult(
result,
null,
new click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver.MachineTypes(
"com.example.order.OrderState",
"com.example.order.OrderEvent"));
assertThat(result.getTransitions().get(0).getEvent().fullIdentifier())
.isEqualTo("com.example.order.OrderEvent.PAY");
assertThat(result.getStartStates())
.containsExactly("com.example.order.OrderState.NEW");
}
@Test

View File

@@ -0,0 +1,139 @@
package click.kamil.springstatemachineexporter.analysis.service;
import click.kamil.springstatemachineexporter.analysis.model.AnalysisResult;
import click.kamil.springstatemachineexporter.analysis.model.CodebaseMetadata;
import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint;
import click.kamil.springstatemachineexporter.exporter.ExportOptions;
import click.kamil.springstatemachineexporter.exporter.JsonExporter;
import click.kamil.springstatemachineexporter.model.Event;
import click.kamil.springstatemachineexporter.model.State;
import click.kamil.springstatemachineexporter.model.Transition;
import click.kamil.springstatemachineexporter.service.ExportService;
import click.kamil.springstatemachineexporter.service.JsonImportService;
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 java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
class JsonRoundTripCanonicalizationTest {
@Test
void shouldCanonicalizeOnJsonReExportUsingEmbeddedMachineTypes(@TempDir Path tempDir) throws Exception {
writeSampleProject(tempDir);
AnalysisResult shortForm = AnalysisResult.builder()
.name("com.example.config.OrderStateMachineConfiguration")
.stateTypeFqn("com.example.order.OrderState")
.eventTypeFqn("com.example.order.OrderEvent")
.transitions(List.of(shortTransition(
"OrderEvent.PAY",
"OrderState.NEW",
"OrderState.PAID")))
.startStates(Set.of("OrderState.NEW"))
.metadata(CodebaseMetadata.builder()
.triggers(List.of(TriggerPoint.builder()
.event("OrderEvent.PAY")
.polymorphicEvents(List.of("OrderEvent.PAY"))
.className("com.example.web.OrderController")
.methodName("pay")
.sourceFile("OrderController.java")
.build()))
.build())
.build();
Path jsonFile = tempDir.resolve("machine.json");
Files.writeString(jsonFile, new JsonExporter().export(shortForm, ExportOptions.builder().build()));
Path outputDir = tempDir.resolve("out");
ExportService exportService = new ExportService(List.of(new JsonExporter()));
exportService.runJsonExporter(jsonFile, outputDir, List.of("json"));
AnalysisResult roundTripped = new JsonImportService().importAnalysisResult(
outputDir.resolve("com.example.config.OrderStateMachineConfiguration")
.resolve("com.example.config.OrderStateMachineConfiguration.json"));
assertThat(roundTripped.getStateTypeFqn()).isEqualTo("com.example.order.OrderState");
assertThat(roundTripped.getEventTypeFqn()).isEqualTo("com.example.order.OrderEvent");
assertThat(roundTripped.getTransitions().get(0).getEvent().fullIdentifier())
.isEqualTo("com.example.order.OrderEvent.PAY");
assertThat(roundTripped.getStartStates())
.containsExactly("com.example.order.OrderState.NEW");
assertThat(roundTripped.getMetadata().getTriggers().get(0).getPolymorphicEvents())
.containsExactly("com.example.order.OrderEvent.PAY");
}
@Test
void shouldResolveMachineTypesFromSourceProjectWhenJsonLacksEmbeddedTypes(@TempDir Path tempDir) throws Exception {
writeSampleProject(tempDir.resolve("project"));
Path projectRoot = tempDir.resolve("project");
AnalysisResult shortForm = AnalysisResult.builder()
.name("com.example.config.OrderStateMachineConfiguration")
.transitions(List.of(shortTransition(
"OrderEvent.PAY",
"OrderState.NEW",
"OrderState.PAID")))
.build();
Path jsonFile = tempDir.resolve("legacy.json");
Files.writeString(jsonFile, new JsonExporter().export(shortForm, ExportOptions.builder().build()));
Path outputDir = tempDir.resolve("out");
ExportService exportService = new ExportService(List.of(new JsonExporter()));
exportService.runJsonExporter(jsonFile, outputDir, List.of("json"), List.of(), null, null, projectRoot);
AnalysisResult roundTripped = new JsonImportService().importAnalysisResult(
outputDir.resolve("com.example.config.OrderStateMachineConfiguration")
.resolve("com.example.config.OrderStateMachineConfiguration.json"));
assertThat(roundTripped.getTransitions().get(0).getEvent().fullIdentifier())
.isEqualTo("com.example.order.OrderEvent.PAY");
}
@Test
void shouldFindProjectRootFromJsonDirectory(@TempDir Path tempDir) throws Exception {
Path projectRoot = tempDir.resolve("my-app");
writeSampleProject(projectRoot);
Path nestedJsonDir = projectRoot.resolve("build/export");
Files.createDirectories(nestedJsonDir);
assertThat(JsonExportContextFactory.findProjectRoot(nestedJsonDir))
.isEqualTo(projectRoot.toAbsolutePath().normalize());
}
private static Transition shortTransition(String event, String source, String target) {
Transition transition = new Transition();
transition.setEvent(Event.of(event, event));
transition.setSourceStates(List.of(State.of(source, source)));
transition.setTargetStates(List.of(State.of(target, target)));
return transition;
}
private static void writeSampleProject(Path projectRoot) throws Exception {
Path javaRoot = projectRoot.resolve("src/main/java");
Path orderPkg = javaRoot.resolve("com/example/order");
Path configPkg = javaRoot.resolve("com/example/config");
Files.createDirectories(orderPkg);
Files.createDirectories(configPkg);
Files.writeString(projectRoot.resolve("build.gradle"), "plugins { id 'java' }");
Files.writeString(orderPkg.resolve("OrderState.java"),
"package com.example.order; public enum OrderState { NEW, PAID }");
Files.writeString(orderPkg.resolve("OrderEvent.java"),
"package com.example.order; public enum OrderEvent { PAY }");
Files.writeString(configPkg.resolve("OrderStateMachineConfiguration.java"),
"""
package com.example.config;
import com.example.order.OrderEvent;
import com.example.order.OrderState;
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
public class OrderStateMachineConfiguration
extends EnumStateMachineConfigurerAdapter<OrderState, OrderEvent> {
}
""");
}
}

View File

@@ -0,0 +1,56 @@
package click.kamil.springstatemachineexporter.exporter;
import click.kamil.springstatemachineexporter.analysis.model.AnalysisResult;
import click.kamil.springstatemachineexporter.analysis.model.BusinessFlow;
import click.kamil.springstatemachineexporter.analysis.model.CodebaseMetadata;
import click.kamil.springstatemachineexporter.model.Event;
import click.kamil.springstatemachineexporter.model.State;
import click.kamil.springstatemachineexporter.model.Transition;
import click.kamil.springstatemachineexporter.service.JsonImportService;
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 java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
class JsonInterchangeContractTest {
@Test
void shouldExportCompleteSelfContainedAnalysisResult(@TempDir Path tempDir) throws Exception {
Transition transition = new Transition();
transition.setEvent(Event.of("OrderEvent.PAY", "com.example.order.OrderEvent.PAY"));
transition.setSourceStates(List.of(State.of("OrderState.NEW", "com.example.order.OrderState.NEW")));
transition.setTargetStates(List.of(State.of("OrderState.PAID", "com.example.order.OrderState.PAID")));
AnalysisResult original = AnalysisResult.builder()
.name("com.example.config.OrderStateMachineConfiguration")
.stateTypeFqn("com.example.order.OrderState")
.eventTypeFqn("com.example.order.OrderEvent")
.states(Set.of(State.of("OrderState.NEW", "com.example.order.OrderState.NEW")))
.transitions(List.of(transition))
.startStates(Set.of("com.example.order.OrderState.NEW"))
.endStates(Set.of("com.example.order.OrderState.PAID"))
.renderChoicesAsDiamonds(true)
.flows(List.of(BusinessFlow.builder().name("Pay flow").steps(List.of("PAY")).build()))
.metadata(CodebaseMetadata.empty())
.build();
Path jsonFile = tempDir.resolve("machine.json");
Files.writeString(jsonFile, new JsonExporter().export(original, ExportOptions.builder().build()));
AnalysisResult imported = new JsonImportService().importAnalysisResult(jsonFile);
assertThat(imported.getName()).isEqualTo(original.getName());
assertThat(imported.getStateTypeFqn()).isEqualTo("com.example.order.OrderState");
assertThat(imported.getEventTypeFqn()).isEqualTo("com.example.order.OrderEvent");
assertThat(imported.getStates()).hasSize(1);
assertThat(imported.getFlows()).extracting(BusinessFlow::getName).containsExactly("Pay flow");
assertThat(imported.isRenderChoicesAsDiamonds()).isTrue();
assertThat(imported.getTransitions().get(0).getEvent().fullIdentifier())
.isEqualTo("com.example.order.OrderEvent.PAY");
}
}

View File

@@ -1,17 +1,69 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.complex.ComplexStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "ComplexStateMachineConfig.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE2",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE2"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE8"
}, {
"rawName" : "States.STATE11",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE11"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE19"
}, {
"rawName" : "States.STATE20",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE20"
}, {
"rawName" : "ComplexStateMachineConfig.States.STATE1",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE1"
}, {
"rawName" : "States.STATE1",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE9"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE16"
}, {
"rawName" : "States.STATE18",
"fullIdentifier" : "ComplexStateMachineConfig.States.STATE18"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -681,5 +733,20 @@
"actions" : [ ],
"order" : 1
} ],
"endStates" : [ ]
"startStates" : [ "ComplexStateMachineConfig.States.STATE1" ],
"endStates" : [ ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "ComplexStateMachineConfig.States",
"eventTypeFqn" : "ComplexStateMachineConfig.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,70 +1,42 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ {
"type" : "CUSTOM",
"name" : "INTERCEPTOR: SecurityInterceptor.preHandle",
"className" : "click.kamil.examples.enterprise.api.SecurityInterceptor",
"methodName" : "preHandle",
"sourceFile" : null,
"metadata" : {
"interceptorType" : "Spring MVC Interceptor"
},
"parameters" : [ ]
}, {
"type" : "REST",
"name" : "POST /api/enterprise/payments",
"className" : "click.kamil.examples.enterprise.api.ReactivePaymentController",
"methodName" : "pay",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/api/ReactivePaymentController.java",
"metadata" : {
"path" : "/api/enterprise/payments",
"verb" : "POST"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ "RequestBody" ]
} ]
}, {
"type" : "JMS",
"name" : "JMS: shipping.queue",
"className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener",
"methodName" : "onShippingReady",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/messaging/ShippingJmsListener.java",
"metadata" : {
"protocol" : "JMS",
"destination" : "shipping.queue"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ ]
} ]
}, {
"type" : "RABBIT",
"name" : "RABBIT: returns.queue",
"className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener",
"methodName" : "onReturn",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/messaging/ReturnsRabbitListener.java",
"metadata" : {
"protocol" : "RABBIT",
"destination" : "returns.queue"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ ]
} ]
} ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.examples.enterprise.config.EnterpriseStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.NEW" ],
"states" : [ {
"rawName" : "String.CANCELLED",
"fullIdentifier" : "String.CANCELLED"
}, {
"rawName" : "\"NEW\"",
"fullIdentifier" : "String.NEW"
}, {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
}, {
"rawName" : "\"PENDING_PAYMENT\"",
"fullIdentifier" : "String.PENDING_PAYMENT"
}, {
"rawName" : "\"SHIPPED\"",
"fullIdentifier" : "String.SHIPPED"
}, {
"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",
"sourceStates" : [ {
@@ -203,5 +175,85 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.CANCELLED", "String.RETURNED", "String.DELIVERED" ]
"startStates" : [ "String.NEW" ],
"endStates" : [ "String.CANCELLED", "String.RETURNED", "String.DELIVERED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ {
"name" : "Success Path (Order to Shipment)",
"description" : "The standard customer journey: Order Placement -> Availability Check -> Payment -> Shipment.",
"steps" : [ "PLACE_ORDER", "CHECK_AVAILABILITY->PENDING_PAYMENT", "PAY_ORDER", "SHIP_ORDER" ]
}, {
"name" : "Immediate Cancellation",
"description" : "User cancels the order immediately after payment.",
"steps" : [ "PLACE_ORDER", "CHECK_AVAILABILITY->PENDING_PAYMENT", "PAY_ORDER", "CANCEL_ORDER" ]
}, {
"name" : "Stock Out Flow",
"description" : "Order is cancelled because items are out of stock.",
"steps" : [ "PLACE_ORDER", "CHECK_AVAILABILITY->CANCELLED" ]
} ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ {
"type" : "CUSTOM",
"name" : "INTERCEPTOR: SecurityInterceptor.preHandle",
"className" : "click.kamil.examples.enterprise.api.SecurityInterceptor",
"methodName" : "preHandle",
"sourceFile" : null,
"metadata" : {
"interceptorType" : "Spring MVC Interceptor"
},
"parameters" : [ ]
}, {
"type" : "REST",
"name" : "POST /api/enterprise/payments",
"className" : "click.kamil.examples.enterprise.api.ReactivePaymentController",
"methodName" : "pay",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/api/ReactivePaymentController.java",
"metadata" : {
"path" : "/api/enterprise/payments",
"verb" : "POST"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ "RequestBody" ]
} ]
}, {
"type" : "JMS",
"name" : "JMS: shipping.queue",
"className" : "click.kamil.examples.enterprise.messaging.ShippingJmsListener",
"methodName" : "onShippingReady",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/messaging/ShippingJmsListener.java",
"metadata" : {
"protocol" : "JMS",
"destination" : "shipping.queue"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ ]
} ]
}, {
"type" : "RABBIT",
"name" : "RABBIT: returns.queue",
"className" : "click.kamil.examples.enterprise.messaging.ReturnsRabbitListener",
"methodName" : "onReturn",
"sourceFile" : "src/main/java/click/kamil/examples/enterprise/messaging/ReturnsRabbitListener.java",
"metadata" : {
"protocol" : "RABBIT",
"destination" : "returns.queue"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ ]
} ]
} ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
}
}

View File

@@ -4,7 +4,7 @@ digraph statemachine {
edge [fontname="Arial", fontsize=10];
_start [shape=circle, label="", fillcolor=black, width=0.1];
_start -> INIT_STATE;
_start -> START;
CANCELLED [fillcolor=lightgray];
COMPLETED [fillcolor=lightgray];
START -> PROCESSING [label="String.SUBMIT_EVENT", style="solid", color="black"];

View File

@@ -1,4 +1,130 @@
{
"name" : "click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig",
"states" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
}, {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
}, {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
}, {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
}, {
"rawName" : "String.START",
"fullIdentifier" : "String.START"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "MyEvents.SUBMIT",
"fullIdentifier" : "String.SUBMIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
} ],
"event" : {
"rawName" : "\"FINISH\"",
"fullIdentifier" : "String.FINISH"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
} ],
"event" : {
"rawName" : "MyEvents.CANCEL",
"fullIdentifier" : "String.CANCEL_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"REACTIVE_EVENT\"",
"fullIdentifier" : "String.REACTIVE_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"event" : {
"rawName" : "\"AUDIT_EVENT\"",
"fullIdentifier" : "String.AUDIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"EXTERNAL_TRIGGER\"",
"fullIdentifier" : "String.EXTERNAL_TRIGGER"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "String.START" ],
"endStates" : [ "String.CANCELLED", "String.COMPLETED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ {
"event" : "[LIFECYCLE:RESTORE]",
@@ -135,112 +261,5 @@
"app.states.initial" : "PROD_INITIAL"
}
}
},
"name" : "click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.INIT_STATE" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "MyEvents.SUBMIT",
"fullIdentifier" : "String.SUBMIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
} ],
"event" : {
"rawName" : "\"FINISH\"",
"fullIdentifier" : "String.FINISH"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
} ],
"event" : {
"rawName" : "MyEvents.CANCEL",
"fullIdentifier" : "String.CANCEL_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"REACTIVE_EVENT\"",
"fullIdentifier" : "String.REACTIVE_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"event" : {
"rawName" : "\"AUDIT_EVENT\"",
"fullIdentifier" : "String.AUDIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"EXTERNAL_TRIGGER\"",
"fullIdentifier" : "String.EXTERNAL_TRIGGER"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.CANCELLED", "String.COMPLETED" ]
}
}

View File

@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
skinparam dpi 110
skinparam svgLinkTarget _self
[*] --> String.INIT_STATE
[*] --> String.START
String.START -[#1E90FF,bold]-> String.PROCESSING <<external>> : String.SUBMIT_EVENT

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="INIT_STATE">
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="START">
<state id="START">
<transition target="PROCESSING" event="String.SUBMIT_EVENT"/>
<transition target="PROCESSING" event="String.REACTIVE_EVENT"/>
@@ -14,7 +14,5 @@
</state>
<state id="CANCELLED">
</state>
<state id="INIT_STATE">
</state>
</scxml>

View File

@@ -4,7 +4,7 @@ digraph statemachine {
edge [fontname="Arial", fontsize=10];
_start [shape=circle, label="", fillcolor=black, width=0.1];
_start -> PROD_INITIAL;
_start -> START;
CANCELLED [fillcolor=lightgray];
COMPLETED [fillcolor=lightgray];
START -> PROCESSING [label="String.SUBMIT_EVENT", style="solid", color="black"];

View File

@@ -1,4 +1,130 @@
{
"name" : "click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig",
"states" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
}, {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
}, {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
}, {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
}, {
"rawName" : "String.START",
"fullIdentifier" : "String.START"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "MyEvents.SUBMIT",
"fullIdentifier" : "String.SUBMIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
} ],
"event" : {
"rawName" : "\"FINISH\"",
"fullIdentifier" : "String.FINISH"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
} ],
"event" : {
"rawName" : "MyEvents.CANCEL",
"fullIdentifier" : "String.CANCEL_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"REACTIVE_EVENT\"",
"fullIdentifier" : "String.REACTIVE_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"event" : {
"rawName" : "\"AUDIT_EVENT\"",
"fullIdentifier" : "String.AUDIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"EXTERNAL_TRIGGER\"",
"fullIdentifier" : "String.EXTERNAL_TRIGGER"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "String.START" ],
"endStates" : [ "String.CANCELLED", "String.COMPLETED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ {
"event" : "[LIFECYCLE:RESTORE]",
@@ -135,112 +261,5 @@
"app.states.initial" : "PROD_INITIAL"
}
}
},
"name" : "click.kamil.examples.statemachine.extended.config.ExtendedStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.PROD_INITIAL" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "MyEvents.SUBMIT",
"fullIdentifier" : "String.SUBMIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
} ],
"event" : {
"rawName" : "\"FINISH\"",
"fullIdentifier" : "String.FINISH"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "\"CANCELLED\"",
"fullIdentifier" : "String.CANCELLED"
} ],
"event" : {
"rawName" : "MyEvents.CANCEL",
"fullIdentifier" : "String.CANCEL_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"REACTIVE_EVENT\"",
"fullIdentifier" : "String.REACTIVE_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"event" : {
"rawName" : "\"AUDIT_EVENT\"",
"fullIdentifier" : "String.AUDIT_EVENT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
} ],
"targetStates" : [ {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
} ],
"event" : {
"rawName" : "\"EXTERNAL_TRIGGER\"",
"fullIdentifier" : "String.EXTERNAL_TRIGGER"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.CANCELLED", "String.COMPLETED" ]
}
}

View File

@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
skinparam dpi 110
skinparam svgLinkTarget _self
[*] --> String.PROD_INITIAL
[*] --> String.START
String.START -[#1E90FF,bold]-> String.PROCESSING <<external>> : String.SUBMIT_EVENT

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="PROD_INITIAL">
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="START">
<state id="START">
<transition target="PROCESSING" event="String.SUBMIT_EVENT"/>
<transition target="PROCESSING" event="String.REACTIVE_EVENT"/>
@@ -14,7 +14,5 @@
</state>
<state id="CANCELLED">
</state>
<state id="PROD_INITIAL">
</state>
</scxml>

View File

@@ -1,17 +1,93 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.F1StateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEY"
}, {
"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"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE19"
}, {
"rawName" : "States.STATE20",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE20"
}, {
"rawName" : "States.STATE2",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE2"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ"
}, {
"rawName" : "States.STATE_EXTRA_1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1"
}, {
"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"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE16"
}, {
"rawName" : "States.STATE18",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE18"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -921,5 +997,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,17 +1,96 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.F2StateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE_EXTRA_1_1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1_1"
}, {
"rawName" : "States.STATE_EXTRA_1_3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1_3"
}, {
"rawName" : "States.STATE1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE9"
}, {
"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"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE19"
}, {
"rawName" : "States.STATE20",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE20"
}, {
"rawName" : "States.STATE_EXTRA_1_2",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE_EXTRA_1_2"
}, {
"rawName" : "States.STATE2",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE2"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ"
}, {
"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"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE16"
}, {
"rawName" : "States.STATE18",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE18"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -938,5 +1017,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,17 +1,36 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.forkjoin.ForkJoinStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "ForkJoinStateMachineConfig.States.START" ],
"states" : [ {
"rawName" : "States.REGION2_STATE1",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.REGION2_STATE1"
}, {
"rawName" : "States.REGION2_STATE2",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.REGION2_STATE2"
}, {
"rawName" : "States.JOIN",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.JOIN"
}, {
"rawName" : "States.START",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.START"
}, {
"rawName" : "States.REGION1_STATE1",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.REGION1_STATE1"
}, {
"rawName" : "States.REGION1_STATE2",
"fullIdentifier" : "ForkJoinStateMachineConfig.States.REGION1_STATE2"
}, {
"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",
"sourceStates" : [ {
@@ -115,5 +134,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "ForkJoinStateMachineConfig.States.END" ]
"startStates" : [ "ForkJoinStateMachineConfig.States.START" ],
"endStates" : [ "ForkJoinStateMachineConfig.States.END" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "ForkJoinStateMachineConfig.States",
"eventTypeFqn" : "ForkJoinStateMachineConfig.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,17 +1,60 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.G1StateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEY"
}, {
"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"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ"
}, {
"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"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE10"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -445,5 +488,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,17 +1,60 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.G2StateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEY"
}, {
"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"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ"
}, {
"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"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE10"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -462,5 +505,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,15 +1,15 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.examples.statemachine.inheritance.config.InheritanceStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.START" ],
"states" : [ {
"rawName" : "\"WORKING\"",
"fullIdentifier" : "String.WORKING"
}, {
"rawName" : "\"START\"",
"fullIdentifier" : "String.START"
}, {
"rawName" : "String.START",
"fullIdentifier" : "String.START"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -28,5 +28,18 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.WORKING" ]
"startStates" : [ "String.START" ],
"endStates" : [ "String.WORKING" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
}
}

View File

@@ -1,17 +1,39 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.enumstate.KamilEnumStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED" ],
"states" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED"
}, {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED"
}, {
"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"
}, {
"rawName" : "OrderStates.PAID2",
"fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.PAID2"
}, {
"rawName" : "OrderStates.PAID3",
"fullIdentifier" : "click.kamil.examples.statemachine.enumstate.OrderStates.PAID3"
}, {
"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"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -252,5 +274,20 @@
} ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED", "click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED" ]
"startStates" : [ "click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED" ],
"endStates" : [ "click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED", "click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.enumstate.OrderStates",
"eventTypeFqn" : "click.kamil.examples.statemachine.enumstate.OrderEvents",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,15 +1,21 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.maven.core.MavenOrderStateMachine",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.INIT" ],
"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",
"sourceStates" : [ {
@@ -52,5 +58,18 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.DONE" ]
"startStates" : [ "String.INIT" ],
"endStates" : [ "String.DONE" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
}
}

View File

@@ -1,17 +1,84 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritancestate.OneStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritancestate.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE11",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE11"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE19"
}, {
"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"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATEZ"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE16"
}, {
"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"
}, {
"rawName" : "States.STATE1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE1"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritancestate.States.STATEY"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -750,5 +817,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritancestate.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritancestate.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritancestate.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritancestate.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritancestate.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,45 +1,21 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ {
"type" : "REST",
"name" : "POST /orders/submit",
"className" : "click.kamil.multi.core.OrderController",
"methodName" : "submitOrder",
"sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java",
"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",
"sourceFile" : "api-module/src/main/java/click/kamil/multi/api/OrderApi.java",
"metadata" : {
"path" : "/orders/submit",
"verb" : "POST"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ "RequestBody" ]
} ]
} ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.multi.core.OrderStateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "String.NEW" ],
"states" : [ {
"rawName" : "\"COMPLETED\"",
"fullIdentifier" : "String.COMPLETED"
}, {
"rawName" : "\"NEW\"",
"fullIdentifier" : "String.NEW"
}, {
"rawName" : "\"PROCESSING\"",
"fullIdentifier" : "String.PROCESSING"
}, {
"rawName" : "String.COMPLETED",
"fullIdentifier" : "String.COMPLETED"
}, {
"rawName" : "String.NEW",
"fullIdentifier" : "String.NEW"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -82,5 +58,48 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "String.COMPLETED" ]
"startStates" : [ "String.NEW" ],
"endStates" : [ "String.COMPLETED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "String",
"eventTypeFqn" : "String",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ {
"type" : "REST",
"name" : "POST /orders/submit",
"className" : "click.kamil.multi.core.OrderController",
"methodName" : "submitOrder",
"sourceFile" : "core-module/src/main/java/click/kamil/multi/core/OrderController.java",
"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",
"sourceFile" : "api-module/src/main/java/click/kamil/multi/api/OrderApi.java",
"metadata" : {
"path" : "/orders/submit",
"verb" : "POST"
},
"parameters" : [ {
"name" : "orderId",
"type" : "String",
"annotations" : [ "RequestBody" ]
} ]
} ],
"callChains" : [ ],
"properties" : {
"default" : { }
}
}
}

View File

@@ -1,4 +1,69 @@
{
"name" : "click.kamil.enterprise.machines.order.OrderStateMachineConfiguration",
"states" : [ {
"rawName" : "OrderState.PENDING",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.PENDING"
}, {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.NEW"
}, {
"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",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PENDING",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.PENDING"
} ],
"event" : {
"rawName" : "OrderEvent.PAY",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderEvent.PAY"
},
"guards" : [ ],
"actions" : [ {
"expression" : "context -> System.out.println(\"Payment processed.\")",
"isLambda" : true,
"internalLogic" : "context -> System.out.println(\"Payment processed.\")",
"lineNumber" : 28,
"className" : "click.kamil.enterprise.machines.order.OrderStateMachineConfiguration",
"sourceFile" : "src/main/java/click/kamil/enterprise/machines/order/OrderStateMachineConfiguration.java"
} ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PENDING",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.PENDING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.SHIPPED",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED"
} ],
"event" : {
"rawName" : "OrderEvent.SHIP",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderEvent.SHIP"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "click.kamil.enterprise.machines.order.OrderState.NEW" ],
"endStates" : [ "click.kamil.enterprise.machines.order.OrderState.SHIPPED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.enterprise.machines.order.OrderState",
"eventTypeFqn" : "click.kamil.enterprise.machines.order.OrderEvent",
"metadata" : {
"triggers" : [ {
"event" : "click.kamil.enterprise.machines.order.OrderEvent.PAY",
@@ -186,51 +251,5 @@
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.enterprise.machines.order.OrderStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.enterprise.machines.order.OrderState.NEW" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PENDING",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.PENDING"
} ],
"event" : {
"rawName" : "OrderEvent.PAY",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderEvent.PAY"
},
"guards" : [ ],
"actions" : [ {
"expression" : "context -> System.out.println(\"Payment processed.\")",
"isLambda" : true,
"internalLogic" : "context -> System.out.println(\"Payment processed.\")",
"lineNumber" : 28,
"className" : "click.kamil.enterprise.machines.order.OrderStateMachineConfiguration",
"sourceFile" : "src/main/java/click/kamil/enterprise/machines/order/OrderStateMachineConfiguration.java"
} ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PENDING",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.PENDING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.SHIPPED",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED"
} ],
"event" : {
"rawName" : "OrderEvent.SHIP",
"fullIdentifier" : "click.kamil.enterprise.machines.order.OrderEvent.SHIP"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.enterprise.machines.order.OrderState.SHIPPED" ]
}
}

View File

@@ -1,4 +1,96 @@
{
"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"
}, {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED"
}, {
"rawName" : "OrderStates.FULFILLED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED"
}, {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"event" : {
"rawName" : "OrderEvents.PAY",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.FULFILLED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED"
} ],
"event" : {
"rawName" : "OrderEvents.FULFILL",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.FULFILL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED"
} ],
"event" : {
"rawName" : "OrderEvents.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED"
} ],
"event" : {
"rawName" : "OrderEvents.ABCD",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.ABCD"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED" ],
"endStates" : [ "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED", "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.polymorphic.OrderStates",
"eventTypeFqn" : "click.kamil.examples.statemachine.polymorphic.OrderEvents",
"metadata" : {
"triggers" : [ {
"event" : "event",
@@ -603,78 +695,5 @@
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.polymorphic.PolymorphicStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"event" : {
"rawName" : "OrderEvents.PAY",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.PAY"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.FULFILLED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED"
} ],
"event" : {
"rawName" : "OrderEvents.FULFILL",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.FULFILL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED"
} ],
"event" : {
"rawName" : "OrderEvents.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED"
} ],
"event" : {
"rawName" : "OrderEvents.ABCD",
"fullIdentifier" : "click.kamil.examples.statemachine.polymorphic.OrderEvents.ABCD"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED", "click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED" ]
}
}

View File

@@ -1,17 +1,39 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.simple.SimpleEnumStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED" ],
"states" : [ {
"rawName" : "OrderStates.CANCELED",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.CANCELED"
}, {
"rawName" : "OrderStates.PAID2",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.PAID2"
}, {
"rawName" : "OrderStates.PAID3",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.PAID3"
}, {
"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"
}, {
"rawName" : "OrderStates.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.PAID"
}, {
"rawName" : "OrderStates.FULFILLED",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.FULFILLED"
}, {
"rawName" : "OrderStates.HAPPEN",
"fullIdentifier" : "click.kamil.examples.statemachine.simple.OrderStates.HAPPEN"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -270,5 +292,20 @@
} ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.simple.OrderStates.CANCELED", "click.kamil.examples.statemachine.simple.OrderStates.FULFILLED" ]
"startStates" : [ "click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED" ],
"endStates" : [ "click.kamil.examples.statemachine.simple.OrderStates.CANCELED", "click.kamil.examples.statemachine.simple.OrderStates.FULFILLED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.simple.OrderStates",
"eventTypeFqn" : "click.kamil.examples.statemachine.simple.OrderEvents",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,4 +1,79 @@
{
"name" : "click.kamil.examples.statemachine.layered.document.config.StandardDocumentStateMachineConfiguration",
"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"
}, {
"rawName" : "DocumentState.APPROVED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED"
}, {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.DRAFT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.SUBMIT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.SUBMIT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.APPROVED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.APPROVE",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.APPROVE"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.REJECTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.REJECT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.REJECT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT" ],
"endStates" : [ "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED", "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.layered.document.DocumentState",
"eventTypeFqn" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent",
"metadata" : {
"triggers" : [ {
"event" : "event",
@@ -250,61 +325,5 @@
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.examples.statemachine.layered.document.config.StandardDocumentStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.DRAFT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.SUBMIT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.SUBMIT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.APPROVED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.APPROVE",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.APPROVE"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "DocumentState.SUBMITTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.SUBMITTED"
} ],
"targetStates" : [ {
"rawName" : "DocumentState.REJECTED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED"
} ],
"event" : {
"rawName" : "DocumentTransitionEvent.REJECT",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.document.DocumentTransitionEvent.REJECT"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED", "click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED" ]
}
}

View File

@@ -1,4 +1,79 @@
{
"name" : "click.kamil.examples.statemachine.layered.order.config.StandardOrderStateMachineConfiguration",
"states" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED"
}, {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
}, {
"rawName" : "OrderState.SHIPPED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED"
}, {
"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",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.PAY",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderState.SHIPPED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.SHIP",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "click.kamil.examples.statemachine.layered.order.OrderState.NEW" ],
"endStates" : [ "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.layered.order.OrderState",
"eventTypeFqn" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent",
"metadata" : {
"triggers" : [ {
"event" : "event",
@@ -386,61 +461,5 @@
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.examples.statemachine.layered.order.config.StandardOrderStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.layered.order.OrderState.NEW" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.PAY",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.PAY"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderState.SHIPPED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.SHIP",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.SHIP"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PAID",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.PAID"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderTransitionEvent.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.layered.order.OrderTransitionEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED", "click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED" ]
}
}

View File

@@ -1,4 +1,96 @@
{
"name" : "click.kamil.domain.StateMachineConfig",
"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"
}, {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
}, {
"rawName" : "OrderState.COMPLETED",
"fullIdentifier" : "click.kamil.domain.OrderState.COMPLETED"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.domain.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"event" : {
"rawName" : "OrderEvent.PROCESS",
"fullIdentifier" : "click.kamil.domain.OrderEvent.PROCESS"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.COMPLETED",
"fullIdentifier" : "click.kamil.domain.OrderState.COMPLETED"
} ],
"event" : {
"rawName" : "OrderEvent.COMPLETE",
"fullIdentifier" : "click.kamil.domain.OrderEvent.COMPLETE"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.domain.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.domain.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderEvent.CANCEL",
"fullIdentifier" : "click.kamil.domain.OrderEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.domain.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderEvent.CANCEL",
"fullIdentifier" : "click.kamil.domain.OrderEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"startStates" : [ "click.kamil.domain.OrderState.NEW" ],
"endStates" : [ "click.kamil.domain.OrderState.COMPLETED", "click.kamil.domain.OrderState.CANCELLED" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.domain.OrderState",
"eventTypeFqn" : "click.kamil.domain.OrderEvent",
"metadata" : {
"triggers" : [ {
"event" : "event",
@@ -344,78 +436,5 @@
"properties" : {
"default" : { }
}
},
"name" : "click.kamil.domain.StateMachineConfig",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.domain.OrderState.NEW" ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.domain.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"event" : {
"rawName" : "OrderEvent.PROCESS",
"fullIdentifier" : "click.kamil.domain.OrderEvent.PROCESS"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.COMPLETED",
"fullIdentifier" : "click.kamil.domain.OrderState.COMPLETED"
} ],
"event" : {
"rawName" : "OrderEvent.COMPLETE",
"fullIdentifier" : "click.kamil.domain.OrderEvent.COMPLETE"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.NEW",
"fullIdentifier" : "click.kamil.domain.OrderState.NEW"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.domain.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderEvent.CANCEL",
"fullIdentifier" : "click.kamil.domain.OrderEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
}, {
"type" : "EXTERNAL",
"sourceStates" : [ {
"rawName" : "OrderState.PROCESSING",
"fullIdentifier" : "click.kamil.domain.OrderState.PROCESSING"
} ],
"targetStates" : [ {
"rawName" : "OrderState.CANCELLED",
"fullIdentifier" : "click.kamil.domain.OrderState.CANCELLED"
} ],
"event" : {
"rawName" : "OrderEvent.CANCEL",
"fullIdentifier" : "click.kamil.domain.OrderEvent.CANCEL"
},
"guards" : [ ],
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.domain.OrderState.COMPLETED", "click.kamil.domain.OrderState.CANCELLED" ]
}
}

View File

@@ -1,17 +1,93 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.ThreeStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1" ],
"states" : [ {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE16"
}, {
"rawName" : "States.STATE18",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE18"
}, {
"rawName" : "States.STATE_EXTRA_1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE_EXTRA_1"
}, {
"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"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ"
}, {
"rawName" : "States.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.CANCEL"
}, {
"rawName" : "States.STATE11",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE11"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE19"
}, {
"rawName" : "States.STATE20",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE20"
}, {
"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"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEY"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -921,5 +997,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -1,17 +1,87 @@
{
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
},
"name" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.TwoStateMachineConfiguration",
"renderChoicesAsDiamonds" : true,
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1" ],
"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"
}, {
"rawName" : "States.STATE3",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE3"
}, {
"rawName" : "States.STATE5",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE5"
}, {
"rawName" : "States.STATE7",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE7"
}, {
"rawName" : "States.STATE9",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE9"
}, {
"rawName" : "States.STATEY",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEY"
}, {
"rawName" : "States.STATE11",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE11"
}, {
"rawName" : "States.STATE13",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE13"
}, {
"rawName" : "States.STATE15",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE15"
}, {
"rawName" : "States.STATE17",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE17"
}, {
"rawName" : "States.STATE19",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE19"
}, {
"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"
}, {
"rawName" : "States.STATE4",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE4"
}, {
"rawName" : "States.STATE6",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE6"
}, {
"rawName" : "States.STATE8",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE8"
}, {
"rawName" : "States.STATEX",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEX"
}, {
"rawName" : "States.STATEZ",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ"
}, {
"rawName" : "States.STATE_EXTRA_1",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE_EXTRA_1"
}, {
"rawName" : "States.STATE10",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE10"
}, {
"rawName" : "States.STATE12",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE12"
}, {
"rawName" : "States.STATE14",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE14"
}, {
"rawName" : "States.STATE16",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE16"
}, {
"rawName" : "States.STATE18",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE18"
}, {
"rawName" : "States.CANCEL",
"fullIdentifier" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.CANCEL"
} ],
"transitions" : [ {
"type" : "EXTERNAL",
"sourceStates" : [ {
@@ -869,5 +939,20 @@
"actions" : [ ],
"order" : null
} ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ" ]
"startStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1" ],
"endStates" : [ "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ" ],
"renderChoicesAsDiamonds" : true,
"flows" : [ ],
"stateTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States",
"eventTypeFqn" : "click.kamil.examples.statemachine.inheritanceextrafunctionsstate.Events",
"metadata" : {
"triggers" : [ ],
"entryPoints" : [ ],
"callChains" : [ ],
"properties" : {
"default" : {
"spring.application.name" : "statemachinedemo"
}
}
}
}

View File

@@ -32,7 +32,7 @@ public class HtmlExporterCommand implements Callable<Integer> {
@CommandLine.Spec
CommandLine.Model.CommandSpec spec;
@Option(names = {"-i", "--input"}, description = "Input directory containing the Spring Boot project source code.")
@Option(names = {"-i", "--input"}, description = "Input directory containing the Spring Boot project source code. Optional with -j when JSON already contains machine types and canonical identifiers.")
private Path inputDir;
@Option(names = {"-j", "--json"}, description = "Input JSON file containing the state machine definition.")
@@ -97,7 +97,7 @@ public class HtmlExporterCommand implements Callable<Integer> {
}
if (jsonFile != null) {
exportService.runJsonExporter(jsonFile, outputDir, formats, profiles);
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);

View File

@@ -0,0 +1,46 @@
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;
/**
* Verifies that a finalized JSON export alone is sufficient for the HTML portal —
* no source directory required when machine types and canonical identifiers are present.
*/
class JsonToHtmlInterchangeTest {
private static final Path ORDER_GOLDEN_JSON = Path.of(
"../state_machine_exporter/src/test/resources/golden/OrderStateMachineConfiguration/OrderStateMachineConfiguration.json")
.toAbsolutePath()
.normalize();
@Test
void shouldGenerateInteractiveHtmlFromJsonOnly(@TempDir Path tempDir) throws Exception {
assertThat(ORDER_GOLDEN_JSON).exists();
ExportService exportService = new ExportService(List.of(new HtmlExporter()));
exportService.runJsonExporter(ORDER_GOLDEN_JSON, tempDir, List.of("html"), List.of());
Path machineDir = tempDir.resolve("click.kamil.enterprise.machines.order.OrderStateMachineConfiguration");
Path htmlFile = machineDir.resolve("click.kamil.enterprise.machines.order.OrderStateMachineConfiguration.html");
assertThat(htmlFile).exists();
String html = Files.readString(htmlFile);
assertThat(html).contains("<!DOCTYPE html>");
assertThat(html).contains("click.kamil.enterprise.machines.order.OrderStateMachineConfiguration");
// SVG link IDs derive from fn-formatted enum labels; matchedTransitions use package-canonical values.
assertThat(html).contains("OrderState_NEW__OrderEvent_PAY");
assertThat(html).contains("click.kamil.enterprise.machines.order.OrderEvent.PAY");
assertThat(html).contains("POST /api/machine/order/pay");
assertThat(html).contains("\"stateTypeFqn\" : \"click.kamil.enterprise.machines.order.OrderState\"");
}
}