Fix HTML export states, endpoint linking, and dynamic trigger event validation.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -42,6 +42,35 @@ class TransitionLinkerEnricherTest {
|
||||
assertThat(result.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldLinkWhenSymbolicPolymorphicEventsExpandToMachineEnumConstants() {
|
||||
Transition payT = new Transition();
|
||||
payT.setSourceStates(List.of(
|
||||
State.of("OrderState.NEW", "com.example.order.OrderState.NEW")));
|
||||
payT.setTargetStates(List.of(
|
||||
State.of("OrderState.PAID", "com.example.order.OrderState.PAID")));
|
||||
payT.setEvent(Event.of("OrderEvent.PAY", "com.example.order.OrderEvent.PAY"));
|
||||
|
||||
CallChain chain = CallChain.builder()
|
||||
.triggerPoint(TriggerPoint.builder()
|
||||
.event("eventString")
|
||||
.polymorphicEvents(List.of("com.example.order.OrderEvent.PAY"))
|
||||
.constraint("\"ORDER\".equalsIgnoreCase(machineType)")
|
||||
.build())
|
||||
.build();
|
||||
|
||||
AnalysisResult result = AnalysisResult.builder()
|
||||
.name("com.example.config.OrderStateMachineConfiguration")
|
||||
.eventTypeFqn("com.example.order.OrderEvent")
|
||||
.transitions(List.of(payT))
|
||||
.metadata(CodebaseMetadata.builder().callChains(List.of(chain)).build())
|
||||
.build();
|
||||
|
||||
enricher.enrich(result, null, null);
|
||||
|
||||
assertThat(result.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldRespectDispatcherBranchConstraintForMachineDomain() {
|
||||
Transition payT = new Transition();
|
||||
|
||||
@@ -167,6 +167,50 @@ class MachineEnumCanonicalizerTest {
|
||||
assertThat(canonical.rawName()).isEqualTo("OrderState.NEW");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldNotPackageCanonicalizeDynamicValueOfTriggerExpression() {
|
||||
String dynamic = "MyEvent.valueOf(event)";
|
||||
assertThat(MachineEnumCanonicalizer.classifyTriggerEvent(dynamic))
|
||||
.isEqualTo(MachineEnumCanonicalizer.TriggerEventKind.DYNAMIC_EXPRESSION);
|
||||
assertThat(MachineEnumCanonicalizer.canonicalizeLabel(
|
||||
dynamic, "com.abcd.aaa.MyEvent"))
|
||||
.isEqualTo("MyEvent.valueOf(event)");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldDenormalizeCorruptedPackageValueOfTriggerExpression() {
|
||||
String corrupted = "com.abcd.aaa.MyEvent.valueOf(event)";
|
||||
assertThat(MachineEnumCanonicalizer.denormalizeCorruptedDynamicEvent(corrupted))
|
||||
.isEqualTo("MyEvent.valueOf(event)");
|
||||
assertThat(MachineEnumCanonicalizer.hasCorruptedPackageDynamicEvent(corrupted)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldClassifyConcreteEnumTriggerEvents() {
|
||||
assertThat(MachineEnumCanonicalizer.classifyTriggerEvent("com.example.order.OrderEvent.PAY"))
|
||||
.isEqualTo(MachineEnumCanonicalizer.TriggerEventKind.CANONICAL_ENUM);
|
||||
assertThat(MachineEnumCanonicalizer.classifyTriggerEvent("event.getType()"))
|
||||
.isEqualTo(MachineEnumCanonicalizer.TriggerEventKind.DYNAMIC_EXPRESSION);
|
||||
assertThat(MachineEnumCanonicalizer.classifyTriggerEvent("<SYMBOLIC: OrderEvent.*>"))
|
||||
.isEqualTo(MachineEnumCanonicalizer.TriggerEventKind.SYMBOLIC);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldExpandSymbolicPolymorphicEventsForMatchingMachineType(@TempDir Path tempDir) throws IOException {
|
||||
writeSampleConfig(tempDir);
|
||||
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
|
||||
List<String> expanded = MachineEnumCanonicalizer.expandSymbolicPolymorphicEvents(
|
||||
List.of("<SYMBOLIC: OrderEvent.*>", "<SYMBOLIC: DocumentEvent.*>"),
|
||||
"com.example.order.OrderEvent",
|
||||
context);
|
||||
|
||||
assertThat(expanded).containsExactly(
|
||||
"com.example.order.OrderEvent.PAY");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldDedupeStatesByCanonicalFullIdentifier(@TempDir Path tempDir) throws IOException {
|
||||
writeSampleConfig(tempDir);
|
||||
|
||||
@@ -105,10 +105,49 @@ class ExportPipelineIdentifierConsistencyTest {
|
||||
}
|
||||
AnalysisResult result = new JsonImportService().importAnalysisResult(json);
|
||||
assertNoMixedEnumIdentifiers(result);
|
||||
assertTriggerEventForms(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void assertTriggerEventForms(AnalysisResult result) {
|
||||
if (result.getMetadata() == null) {
|
||||
return;
|
||||
}
|
||||
if (result.getMetadata().getTriggers() != null) {
|
||||
for (TriggerPoint trigger : result.getMetadata().getTriggers()) {
|
||||
assertTriggerEventForm(trigger.getEvent());
|
||||
}
|
||||
}
|
||||
if (result.getMetadata().getCallChains() != null) {
|
||||
for (CallChain chain : result.getMetadata().getCallChains()) {
|
||||
if (chain.getTriggerPoint() != null) {
|
||||
assertTriggerEventForm(chain.getTriggerPoint().getEvent());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertTriggerEventForm(String event) {
|
||||
if (event == null || event.isBlank()) {
|
||||
return;
|
||||
}
|
||||
MachineEnumCanonicalizer.TriggerEventKind kind = MachineEnumCanonicalizer.classifyTriggerEvent(event);
|
||||
assertThat(kind)
|
||||
.as("triggerPoint.event must be canonical enum, dynamic expression, symbolic, or lifecycle: %s", event)
|
||||
.isIn(
|
||||
MachineEnumCanonicalizer.TriggerEventKind.CANONICAL_ENUM,
|
||||
MachineEnumCanonicalizer.TriggerEventKind.DYNAMIC_EXPRESSION,
|
||||
MachineEnumCanonicalizer.TriggerEventKind.SYMBOLIC,
|
||||
MachineEnumCanonicalizer.TriggerEventKind.LIFECYCLE);
|
||||
assertThat(MachineEnumCanonicalizer.hasCorruptedPackageDynamicEvent(event))
|
||||
.as("dynamic trigger event must not be package-prefixed: %s", event)
|
||||
.isFalse();
|
||||
if (kind == MachineEnumCanonicalizer.TriggerEventKind.CANONICAL_ENUM) {
|
||||
assertThat(event).contains(".").doesNotContain("(");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void propertyResolutionShouldCanonicalizeCallChainTriggersBeforeRelink(@TempDir Path tempDir) throws Exception {
|
||||
writeSampleProject(tempDir);
|
||||
|
||||
@@ -120,6 +120,57 @@ class AnalysisCanonicalFormValidatorTest {
|
||||
.anyMatch(path -> path.contains("matchedTransitions[0].sourceState"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldFailWhenTriggerEventHasCorruptedPackageValueOfForm() {
|
||||
AnalysisResult result = AnalysisResult.builder()
|
||||
.name("com.example.config.OrderStateMachineConfiguration")
|
||||
.stateTypeFqn("com.example.order.OrderState")
|
||||
.eventTypeFqn("com.example.order.OrderEvent")
|
||||
.metadata(CodebaseMetadata.builder()
|
||||
.triggers(List.of(TriggerPoint.builder()
|
||||
.event("com.example.order.OrderEvent.valueOf(eventString)")
|
||||
.className("com.example.web.OrderController")
|
||||
.methodName("dispatch")
|
||||
.sourceFile("OrderController.java")
|
||||
.build()))
|
||||
.build())
|
||||
.build();
|
||||
|
||||
List<AnalysisCanonicalFormValidator.Violation> violations =
|
||||
AnalysisCanonicalFormValidator.validateWithMachineTypes(
|
||||
result,
|
||||
new click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver.MachineTypes(
|
||||
"com.example.order.OrderState", "com.example.order.OrderEvent"));
|
||||
|
||||
assertThat(violations)
|
||||
.extracting(AnalysisCanonicalFormValidator.Violation::path)
|
||||
.contains("metadata.triggers[0].event");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldAllowDynamicDispatcherExpressionWithoutPackagePrefix() {
|
||||
AnalysisResult result = AnalysisResult.builder()
|
||||
.name("com.example.config.OrderStateMachineConfiguration")
|
||||
.stateTypeFqn("com.example.order.OrderState")
|
||||
.eventTypeFqn("com.example.order.OrderEvent")
|
||||
.metadata(CodebaseMetadata.builder()
|
||||
.triggers(List.of(TriggerPoint.builder()
|
||||
.event("OrderEvent.valueOf(eventString.toUpperCase())")
|
||||
.className("com.example.web.OrderController")
|
||||
.methodName("dispatch")
|
||||
.sourceFile("OrderController.java")
|
||||
.polymorphicEvents(List.of("com.example.order.OrderEvent.PAY"))
|
||||
.build()))
|
||||
.build())
|
||||
.build();
|
||||
|
||||
assertThat(AnalysisCanonicalFormValidator.validateWithMachineTypes(
|
||||
result,
|
||||
new click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver.MachineTypes(
|
||||
"com.example.order.OrderState", "com.example.order.OrderEvent")))
|
||||
.noneMatch(v -> v.path().contains(".event"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldSkipValidationForStringStateMachines(@TempDir Path tempDir) throws IOException {
|
||||
Path configPkg = tempDir.resolve("com/example/config");
|
||||
|
||||
@@ -52,4 +52,30 @@ class PlantUmlTest {
|
||||
assertThat(result).contains("[list.size() < 5]");
|
||||
assertThat(result).contains("new int[]{1, 2}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldFormatPackageCanonicalStartAndEndStatesLikeTransitionNodes() {
|
||||
PlantUml plantUml = new PlantUml();
|
||||
ExportOptions options = ExportOptions.builder().build();
|
||||
|
||||
State stateA = State.of("State.A", "com.abcd.aaa.State.A");
|
||||
State stateB = State.of("State.B", "com.abcd.aaa.State.B");
|
||||
|
||||
Transition t = new Transition();
|
||||
t.setType(TransitionType.EXTERNAL);
|
||||
t.setSourceStates(List.of(stateA));
|
||||
t.setTargetStates(List.of(stateB));
|
||||
|
||||
String result = plantUml.export(
|
||||
"TestMachine",
|
||||
List.of(t),
|
||||
Set.of("com.abcd.aaa.State.A"),
|
||||
Set.of("com.abcd.aaa.State.B"),
|
||||
options);
|
||||
|
||||
assertThat(result).contains("[*] --> State.A");
|
||||
assertThat(result).contains("State.B --> [*]");
|
||||
assertThat(result).doesNotContain("com.abcd.aaa.State.A");
|
||||
assertThat(result).doesNotContain("abcd.aaa.State.A");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> ComplexStateMachineConfig.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATE16 <<choice>>
|
||||
state States.STATE17 <<choice>>
|
||||
|
||||
@@ -124,7 +124,5 @@
|
||||
<!-- order=1 -->
|
||||
</transition>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -181,13 +181,25 @@
|
||||
"stateMachineId" : null,
|
||||
"sourceState" : null,
|
||||
"lineNumber" : 87,
|
||||
"polymorphicEvents" : [ "<SYMBOLIC: OrderEvent.*>", "<SYMBOLIC: DocumentEvent.*>", "<SYMBOLIC: UserEvent.*>" ],
|
||||
"polymorphicEvents" : [ "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT", "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE", "click.kamil.enterprise.machines.document.DocumentEvent.REJECT" ],
|
||||
"external" : true,
|
||||
"constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && \"DOCUMENT\".equalsIgnoreCase(machineType)",
|
||||
"ambiguous" : false
|
||||
},
|
||||
"contextMachineId" : null,
|
||||
"matchedTransitions" : null
|
||||
"matchedTransitions" : [ {
|
||||
"sourceState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT",
|
||||
"targetState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW",
|
||||
"event" : "click.kamil.enterprise.machines.document.DocumentEvent.SUBMIT"
|
||||
}, {
|
||||
"sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW",
|
||||
"targetState" : "click.kamil.enterprise.machines.document.DocumentState.APPROVED",
|
||||
"event" : "click.kamil.enterprise.machines.document.DocumentEvent.APPROVE"
|
||||
}, {
|
||||
"sourceState" : "click.kamil.enterprise.machines.document.DocumentState.IN_REVIEW",
|
||||
"targetState" : "click.kamil.enterprise.machines.document.DocumentState.DRAFT",
|
||||
"event" : "click.kamil.enterprise.machines.document.DocumentEvent.REJECT"
|
||||
} ]
|
||||
} ],
|
||||
"properties" : {
|
||||
"default" : { }
|
||||
|
||||
@@ -21,13 +21,13 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.enterprise.machines.document.DocumentState.DRAFT
|
||||
[*] --> DocumentState.DRAFT
|
||||
|
||||
|
||||
DocumentState.DRAFT -[#1E90FF,bold]-> DocumentState.IN_REVIEW <<external>> : DocumentEvent.SUBMIT
|
||||
DocumentState.IN_REVIEW -[#1E90FF,bold]-> DocumentState.APPROVED <<external>> : DocumentEvent.APPROVE
|
||||
DocumentState.IN_REVIEW -[#1E90FF,bold]-> DocumentState.DRAFT <<external>> : DocumentEvent.REJECT
|
||||
|
||||
click.kamil.enterprise.machines.document.DocumentState.APPROVED --> [*]
|
||||
DocumentState.APPROVED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -9,9 +9,5 @@
|
||||
</state>
|
||||
<state id="APPROVED">
|
||||
</state>
|
||||
<state id="DRAFT">
|
||||
</state>
|
||||
<state id="APPROVED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE16 <<choice>>
|
||||
@@ -89,6 +89,6 @@ States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.STATE_EXTRA_3 <<external>> : Event
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
States.STATE_EXTRA_2 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -160,9 +160,5 @@
|
||||
<state id="STATE_EXTRA_2">
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL_2"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE16 <<choice>>
|
||||
@@ -90,6 +90,6 @@ States.STATE_EXTRA_1_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVE
|
||||
States.STATE_EXTRA_1_2 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -163,9 +163,5 @@
|
||||
<state id="STATE_EXTRA_1">
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL_2"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> ForkJoinStateMachineConfig.States.START
|
||||
[*] --> States.START
|
||||
|
||||
|
||||
States.START -[#1E90FF,bold]-> States.FORK <<external>> : Events.TO_FORK
|
||||
@@ -33,6 +33,6 @@ States.REGION1_STATE2 -[#8A2BE2,bold]-> States.JOIN <<join>>
|
||||
States.REGION2_STATE2 -[#8A2BE2,bold]-> States.JOIN <<join>>
|
||||
States.JOIN -[#1E90FF,bold]-> States.END <<external>> : Events.TO_END
|
||||
|
||||
ForkJoinStateMachineConfig.States.END --> [*]
|
||||
States.END --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -24,9 +24,5 @@
|
||||
</state>
|
||||
<state id="END">
|
||||
</state>
|
||||
<state id="START">
|
||||
</state>
|
||||
<state id="END">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE9 <<choice>>
|
||||
@@ -53,6 +53,6 @@ States.STATE3 -[#1E90FF,bold]-> States.STATE_EXTRA_2 <<external>> : Events.EVENT
|
||||
States.STATE_EXTRA_2 -[#1E90FF,bold]-> States.STATE_EXTRA_3 <<external>> : Events.EVENT_1_2
|
||||
States.STATE_EXTRA_3 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -71,9 +71,5 @@
|
||||
<state id="STATE_EXTRA_3">
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE9 <<choice>>
|
||||
@@ -54,6 +54,6 @@ States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.STATE_EXTRA_2 <<external>> : Event
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL
|
||||
States.STATE_EXTRA_2 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate3.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -72,9 +72,5 @@
|
||||
<state id="STATE_EXTRA_2">
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.enumstate.OrderStates.SUBMITTED
|
||||
[*] --> OrderStates.SUBMITTED
|
||||
|
||||
state OrderStates.PAID1 <<choice>>
|
||||
|
||||
@@ -39,7 +39,7 @@ OrderStates.PAID2 -[#1E90FF,bold]-> OrderStates.CANCELED <<external>>
|
||||
OrderStates.PAID3 -[#1E90FF,bold]-> OrderStates.CANCELED <<external>>
|
||||
OrderStates.PAID2 -[#1E90FF,bold]-> OrderStates.PAID2 <<external>> : OrderEvents.ABCD / λ, action2
|
||||
|
||||
click.kamil.examples.statemachine.enumstate.OrderStates.CANCELED --> [*]
|
||||
click.kamil.examples.statemachine.enumstate.OrderStates.FULFILLED --> [*]
|
||||
OrderStates.CANCELED --> [*]
|
||||
OrderStates.FULFILLED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -37,11 +37,5 @@
|
||||
</state>
|
||||
<state id="HAPPEN">
|
||||
</state>
|
||||
<state id="SUBMITTED">
|
||||
</state>
|
||||
<state id="CANCELED">
|
||||
</state>
|
||||
<state id="FULFILLED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritancestate.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE16 <<choice>>
|
||||
@@ -78,6 +78,6 @@ States.STATE8 -[#FF6347,bold]-> States.STATE9 <<choice_type>> : [guardVarEquals(
|
||||
States.STATE8 -[#FF6347,bold]-> States.STATE10 <<choice_type>> : (order=1)
|
||||
States.STATE5 -[#1E90FF,bold]-> States.STATE_EXTRA_1 <<external>> : Events.EVENTX
|
||||
|
||||
click.kamil.examples.statemachine.inheritancestate.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -140,9 +140,5 @@
|
||||
</state>
|
||||
<state id="STATE_EXTRA_1">
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -158,13 +158,21 @@
|
||||
"stateMachineId" : null,
|
||||
"sourceState" : null,
|
||||
"lineNumber" : 81,
|
||||
"polymorphicEvents" : [ "<SYMBOLIC: OrderEvent.*>", "<SYMBOLIC: DocumentEvent.*>", "<SYMBOLIC: UserEvent.*>" ],
|
||||
"polymorphicEvents" : [ "click.kamil.enterprise.machines.order.OrderEvent.PAY", "click.kamil.enterprise.machines.order.OrderEvent.SHIP" ],
|
||||
"external" : true,
|
||||
"constraint" : "\"ORDER\".equalsIgnoreCase(machineType)",
|
||||
"ambiguous" : false
|
||||
},
|
||||
"contextMachineId" : null,
|
||||
"matchedTransitions" : null
|
||||
"matchedTransitions" : [ {
|
||||
"sourceState" : "click.kamil.enterprise.machines.order.OrderState.NEW",
|
||||
"targetState" : "click.kamil.enterprise.machines.order.OrderState.PENDING",
|
||||
"event" : "click.kamil.enterprise.machines.order.OrderEvent.PAY"
|
||||
}, {
|
||||
"sourceState" : "click.kamil.enterprise.machines.order.OrderState.PENDING",
|
||||
"targetState" : "click.kamil.enterprise.machines.order.OrderState.SHIPPED",
|
||||
"event" : "click.kamil.enterprise.machines.order.OrderEvent.SHIP"
|
||||
} ]
|
||||
} ],
|
||||
"properties" : {
|
||||
"default" : { }
|
||||
|
||||
@@ -21,12 +21,12 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.enterprise.machines.order.OrderState.NEW
|
||||
[*] --> OrderState.NEW
|
||||
|
||||
|
||||
OrderState.NEW -[#1E90FF,bold]-> OrderState.PENDING <<external>> : OrderEvent.PAY / λ
|
||||
OrderState.PENDING -[#1E90FF,bold]-> OrderState.SHIPPED <<external>> : OrderEvent.SHIP
|
||||
|
||||
click.kamil.enterprise.machines.order.OrderState.SHIPPED --> [*]
|
||||
OrderState.SHIPPED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -8,9 +8,5 @@
|
||||
</state>
|
||||
<state id="SHIPPED">
|
||||
</state>
|
||||
<state id="NEW">
|
||||
</state>
|
||||
<state id="SHIPPED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.polymorphic.OrderStates.SUBMITTED
|
||||
[*] --> OrderStates.SUBMITTED
|
||||
|
||||
|
||||
OrderStates.SUBMITTED -[#1E90FF,bold]-> OrderStates.PAID <<external>> : OrderEvents.PAY
|
||||
@@ -29,7 +29,7 @@ OrderStates.PAID -[#1E90FF,bold]-> OrderStates.FULFILLED <<external>> : OrderEve
|
||||
OrderStates.SUBMITTED -[#1E90FF,bold]-> OrderStates.CANCELED <<external>> : OrderEvents.CANCEL
|
||||
OrderStates.PAID -[#1E90FF,bold]-> OrderStates.CANCELED <<external>> : OrderEvents.ABCD
|
||||
|
||||
click.kamil.examples.statemachine.polymorphic.OrderStates.CANCELED --> [*]
|
||||
click.kamil.examples.statemachine.polymorphic.OrderStates.FULFILLED --> [*]
|
||||
OrderStates.CANCELED --> [*]
|
||||
OrderStates.FULFILLED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -12,11 +12,5 @@
|
||||
</state>
|
||||
<state id="CANCELED">
|
||||
</state>
|
||||
<state id="SUBMITTED">
|
||||
</state>
|
||||
<state id="CANCELED">
|
||||
</state>
|
||||
<state id="FULFILLED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.simple.OrderStates.SUBMITTED
|
||||
[*] --> OrderStates.SUBMITTED
|
||||
|
||||
state OrderStates.SUBMITTED <<choice>>
|
||||
state OrderStates.PAID <<choice>>
|
||||
@@ -41,7 +41,7 @@ OrderStates.PAID2 -[#1E90FF,bold]-> OrderStates.CANCELED <<external>>
|
||||
OrderStates.PAID3 -[#1E90FF,bold]-> OrderStates.CANCELED <<external>>
|
||||
OrderStates.PAID1 -[#1E90FF,bold]-> OrderStates.PAID1 <<external>> : OrderEvents.ABCD / λ, action2
|
||||
|
||||
click.kamil.examples.statemachine.simple.OrderStates.CANCELED --> [*]
|
||||
click.kamil.examples.statemachine.simple.OrderStates.FULFILLED --> [*]
|
||||
OrderStates.CANCELED --> [*]
|
||||
OrderStates.FULFILLED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -42,11 +42,5 @@
|
||||
</state>
|
||||
<state id="HAPPEN">
|
||||
</state>
|
||||
<state id="SUBMITTED">
|
||||
</state>
|
||||
<state id="CANCELED">
|
||||
</state>
|
||||
<state id="FULFILLED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,14 +21,14 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.layered.document.DocumentState.DRAFT
|
||||
[*] --> DocumentState.DRAFT
|
||||
|
||||
|
||||
DocumentState.DRAFT -[#1E90FF,bold]-> DocumentState.SUBMITTED <<external>> : DocumentTransitionEvent.SUBMIT
|
||||
DocumentState.SUBMITTED -[#1E90FF,bold]-> DocumentState.APPROVED <<external>> : DocumentTransitionEvent.APPROVE
|
||||
DocumentState.SUBMITTED -[#1E90FF,bold]-> DocumentState.REJECTED <<external>> : DocumentTransitionEvent.REJECT
|
||||
|
||||
click.kamil.examples.statemachine.layered.document.DocumentState.REJECTED --> [*]
|
||||
click.kamil.examples.statemachine.layered.document.DocumentState.APPROVED --> [*]
|
||||
DocumentState.REJECTED --> [*]
|
||||
DocumentState.APPROVED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -11,11 +11,5 @@
|
||||
</state>
|
||||
<state id="REJECTED">
|
||||
</state>
|
||||
<state id="DRAFT">
|
||||
</state>
|
||||
<state id="REJECTED">
|
||||
</state>
|
||||
<state id="APPROVED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,14 +21,14 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.layered.order.OrderState.NEW
|
||||
[*] --> OrderState.NEW
|
||||
|
||||
|
||||
OrderState.NEW -[#1E90FF,bold]-> OrderState.PAID <<external>> : OrderTransitionEvent.PAY
|
||||
OrderState.PAID -[#1E90FF,bold]-> OrderState.SHIPPED <<external>> : OrderTransitionEvent.SHIP
|
||||
OrderState.PAID -[#1E90FF,bold]-> OrderState.CANCELLED <<external>> : OrderTransitionEvent.CANCEL
|
||||
|
||||
click.kamil.examples.statemachine.layered.order.OrderState.SHIPPED --> [*]
|
||||
click.kamil.examples.statemachine.layered.order.OrderState.CANCELLED --> [*]
|
||||
OrderState.SHIPPED --> [*]
|
||||
OrderState.CANCELLED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -11,11 +11,5 @@
|
||||
</state>
|
||||
<state id="CANCELLED">
|
||||
</state>
|
||||
<state id="NEW">
|
||||
</state>
|
||||
<state id="SHIPPED">
|
||||
</state>
|
||||
<state id="CANCELLED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.domain.OrderState.NEW
|
||||
[*] --> OrderState.NEW
|
||||
|
||||
|
||||
OrderState.NEW -[#1E90FF,bold]-> OrderState.PROCESSING <<external>> : OrderEvent.PROCESS
|
||||
@@ -29,7 +29,7 @@ OrderState.PROCESSING -[#1E90FF,bold]-> OrderState.COMPLETED <<external>> : Orde
|
||||
OrderState.NEW -[#1E90FF,bold]-> OrderState.CANCELLED <<external>> : OrderEvent.CANCEL
|
||||
OrderState.PROCESSING -[#1E90FF,bold]-> OrderState.CANCELLED <<external>> : OrderEvent.CANCEL
|
||||
|
||||
click.kamil.domain.OrderState.COMPLETED --> [*]
|
||||
click.kamil.domain.OrderState.CANCELLED --> [*]
|
||||
OrderState.COMPLETED --> [*]
|
||||
OrderState.CANCELLED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -12,11 +12,5 @@
|
||||
</state>
|
||||
<state id="CANCELLED">
|
||||
</state>
|
||||
<state id="NEW">
|
||||
</state>
|
||||
<state id="COMPLETED">
|
||||
</state>
|
||||
<state id="CANCELLED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE16 <<choice>>
|
||||
@@ -89,6 +89,6 @@ States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.STATE_EXTRA_3 <<external>> : Event
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
States.STATE_EXTRA_2 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate2.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -160,9 +160,5 @@
|
||||
<state id="STATE_EXTRA_2">
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL_2"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATE1
|
||||
[*] --> States.STATE1
|
||||
|
||||
state States.STATEY <<choice>>
|
||||
state States.STATE16 <<choice>>
|
||||
@@ -85,6 +85,6 @@ States.STATE5 -[#1E90FF,bold]-> States.STATE_EXTRA_1 <<external>> : Events.EVENT
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL
|
||||
States.STATE_EXTRA_1 -[#1E90FF,bold]-> States.CANCEL <<external>> : Events.EVENT_CANCEL_2
|
||||
|
||||
click.kamil.examples.statemachine.inheritanceextrafunctionsstate.States.STATEZ --> [*]
|
||||
States.STATEZ --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -149,9 +149,5 @@
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL"/>
|
||||
<transition target="CANCEL" event="Events.EVENT_CANCEL_2"/>
|
||||
</state>
|
||||
<state id="STATE1">
|
||||
</state>
|
||||
<state id="STATEZ">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
@@ -151,13 +151,21 @@
|
||||
"stateMachineId" : null,
|
||||
"sourceState" : null,
|
||||
"lineNumber" : 93,
|
||||
"polymorphicEvents" : [ "<SYMBOLIC: OrderEvent.*>", "<SYMBOLIC: DocumentEvent.*>", "<SYMBOLIC: UserEvent.*>" ],
|
||||
"polymorphicEvents" : [ "click.kamil.enterprise.machines.user.UserEvent.REGISTER", "click.kamil.enterprise.machines.user.UserEvent.VERIFY", "click.kamil.enterprise.machines.user.UserEvent.SUSPEND" ],
|
||||
"external" : true,
|
||||
"constraint" : "!(\"ORDER\".equalsIgnoreCase(machineType)) && !(\"DOCUMENT\".equalsIgnoreCase(machineType)) && \"USER\".equalsIgnoreCase(machineType)",
|
||||
"ambiguous" : false
|
||||
},
|
||||
"contextMachineId" : null,
|
||||
"matchedTransitions" : null
|
||||
"matchedTransitions" : [ {
|
||||
"sourceState" : "click.kamil.enterprise.machines.user.UserState.GUEST",
|
||||
"targetState" : "click.kamil.enterprise.machines.user.UserState.REGISTERED",
|
||||
"event" : "click.kamil.enterprise.machines.user.UserEvent.REGISTER"
|
||||
}, {
|
||||
"sourceState" : "click.kamil.enterprise.machines.user.UserState.REGISTERED",
|
||||
"targetState" : "click.kamil.enterprise.machines.user.UserState.VERIFIED",
|
||||
"event" : "click.kamil.enterprise.machines.user.UserEvent.VERIFY"
|
||||
} ]
|
||||
} ],
|
||||
"properties" : {
|
||||
"default" : { }
|
||||
|
||||
@@ -21,12 +21,12 @@ skinparam ArrowThickness 1
|
||||
skinparam dpi 110
|
||||
skinparam svgLinkTarget _self
|
||||
|
||||
[*] --> click.kamil.enterprise.machines.user.UserState.GUEST
|
||||
[*] --> UserState.GUEST
|
||||
|
||||
|
||||
UserState.GUEST -[#1E90FF,bold]-> UserState.REGISTERED <<external>> : UserEvent.REGISTER
|
||||
UserState.REGISTERED -[#1E90FF,bold]-> UserState.VERIFIED <<external>> : UserEvent.VERIFY
|
||||
|
||||
click.kamil.enterprise.machines.user.UserState.VERIFIED --> [*]
|
||||
UserState.VERIFIED --> [*]
|
||||
@enduml
|
||||
|
||||
|
||||
@@ -8,9 +8,5 @@
|
||||
</state>
|
||||
<state id="VERIFIED">
|
||||
</state>
|
||||
<state id="GUEST">
|
||||
</state>
|
||||
<state id="VERIFIED">
|
||||
</state>
|
||||
</scxml>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user