Useful dump of FSM definitions. @return multiline string
()
| 303 | * @return multiline string |
| 304 | */ |
| 305 | public String dumpFSM() { |
| 306 | StringWriter writer = new StringWriter(); |
| 307 | PrintWriter pw = new PrintWriter(writer); |
| 308 | |
| 309 | List<State<E>> statesInOrder = states.values().stream().sorted().collect(Collectors.toList()); |
| 310 | int stateWidth = statesInOrder.stream().mapToInt(s -> s.name.length()).max().orElse(1); |
| 311 | int maxEventWidth = Arrays.stream(eventClass.getEnumConstants()).mapToInt(e -> e.name().length()).max().orElse("N/A".length()); |
| 312 | pw.println("SimpleFSM: " + name + " EventClass: " + eventClass.getCanonicalName()); |
| 313 | pw.println(); |
| 314 | pw.print(" " + String.format("%-" + (stateWidth + "State: ".length()) + "s ", "")); |
| 315 | for (E e : events) { |
| 316 | pw.print(center(e.name(), maxEventWidth) + " "); |
| 317 | } |
| 318 | pw.println(); |
| 319 | statesInOrder.forEach(st -> { |
| 320 | pw.print(" " + String.format("State: %" + stateWidth + "s ", st.name)); |
| 321 | for (E e : events) { |
| 322 | pw.print(center(st.dispatch[e.ordinal()] != null ? "X" : "", maxEventWidth) + " "); |
| 323 | } |
| 324 | pw.println(); |
| 325 | }); |
| 326 | pw.flush(); |
| 327 | return writer.toString(); |
| 328 | } |
| 329 | |
| 330 | private static String center(String text, int total) { |
| 331 | int skip = (total - text.length()) / 2; |