Skip to content

Instantly share code, notes, and snippets.

@wolframite
Last active February 29, 2024 17:22
Show Gist options
  • Save wolframite/78afb9b6891fe2815252d300020731dd to your computer and use it in GitHub Desktop.
Save wolframite/78afb9b6891fe2815252d300020731dd to your computer and use it in GitHub Desktop.
package org.entrego.lms.api.service;
import static guru.nidi.graphviz.model.Factory.mutGraph;
import static guru.nidi.graphviz.model.Factory.node;
import static guru.nidi.graphviz.model.Link.to;
import guru.nidi.graphviz.attribute.Label;
import guru.nidi.graphviz.attribute.Shape;
import guru.nidi.graphviz.engine.Format;
import guru.nidi.graphviz.engine.Graphviz;
import guru.nidi.graphviz.model.MutableGraph;
import guru.nidi.graphviz.model.Node;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import lombok.Data;
import org.entrego.lms.api.config.fsm.Events;
import org.entrego.lms.api.config.fsm.States;
import org.springframework.http.MediaType;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoService {
private final StateMachineFactory<States, Events> stateMachineFactory;
private Graphviz graphviz;
public DemoService(
StateMachineFactory<States, Events> stateMachineFactory) {
this.stateMachineFactory = stateMachineFactory;
}
@PostConstruct
public void init() throws Exception {
StateMachine<States, Events> stateMachine = stateMachineFactory.getStateMachine();
MutableGraph graph = mutGraph("Order State Machine").setDirected(true);
Map<String, Set<GraphVizLink>> graphMap = new HashMap<>();
stateMachine.getStates().forEach(
s -> graphMap.put(s.getId().name(), new HashSet<>())
);
stateMachine.getTransitions().forEach(t -> {
graphMap.get(t.getSource().getId().name()).add(
new GraphVizLink(t.getTarget().getId().name(), t.getTrigger().getEvent().name())
);
});
graphMap.forEach((key, targetSet) -> {
Node node = node(key).with(Shape.RECTANGLE);
targetSet.forEach(l -> graph.add(
node.link(to(node(l.getTarget())).with(Label.of(l.getLabel().toLowerCase())))
));
});
this.graphviz = Graphviz.fromGraph(graph);
}
@ResponseBody
@RequestMapping(value = "/visualize", consumes = MediaType.ALL_VALUE, produces = "image/svg+xml")
public String renderSVG() {
return graphviz.render(Format.SVG).toString();
}
@Data
private static class GraphVizLink {
private final String target;
private final String label;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment