digraph ClassDiagram { // Graph attributes graph [ rankdir="BT", splines=ortho, fontname="Arial" ]; node [ fontname="Arial", fontsize=10, shape=record, style=filled, fillcolor=lightyellow ]; edge [ fontname="Arial", fontsize=9 ]; // --- Clusters for Packages --- subgraph cluster_edu_inventorym { label="edu.inventorym"; style=filled; color=lightgrey; node [style=filled, color=white]; Api [ label="{class Api|+ main(String[]): void\l+ callerInterface(): void\l}" ]; App [ label="{class App|+ main(String[]): void\l- routing(HttpRouting.Builder): void\l}" ]; RpcDeserializer [ label="{class RpcDeserializer|+ main(String[]): void\l+ mapJsonToObjectList(String, Class): List\l}" ]; } subgraph cluster_edu_inventorym_model { label="edu.inventorym.model"; style=filled; color=lightgrey; node [style=filled, color=white]; InventoryPiece [ // Inferred from RpcDeserializer.java label="{interface\n«InventoryPiece»|+ getId(): int\l}" ]; Drawing [ // Inferred from RpcDeserializer.java label="{class Drawing|+ getId(): int\l}" ]; } // --- Relationships --- // Inheritance (Drawing implements InventoryPiece) InventoryPiece -> Drawing [ arrowhead=empty, style=dashed, label="implements" ]; // Associations (Dependencies) RpcDeserializer -> Drawing [ arrowhead=vee, style=dashed, label="uses" ]; RpcDeserializer -> InventoryPiece [ arrowhead=vee, style=dashed, label="uses" ]; }