Pavel Zhigalov hace 5 días
padre
commit
0d85fbafd5

+ 41 - 15
src/index.ts

@@ -1,21 +1,47 @@
-import { readFileSync } from "node:fs";
-import DZWFDeserializer from "./v1/io/deserialize/dzwf/DZWFDeserializer.js";
+import { readFileSync, writeFileSync } from "node:fs";
+import BPMNError from "./v1/errors/BPMNError.js";
+import Edge from "./v1/graph/Edge.js";
+import Graph from "./v1/graph/Graph.js";
+import Node from "./v1/graph/Node.js";
+import Deserializer from "./v1/io/deserialize/Deserializer.js";
+import DefaultJsonDeserializer from "./v1/io/deserialize/json/DefaultJsonDeserializer.js";
+import Serializer from "./v1/io/serialize/Serializer.js";
+import DefaultJsonSerializer from "./v1/io/serialize/json/DefaultJsonSerializer.js";
+import CoordinateAssignmentStep from "./v1/optimizer/siguiyama/CoordinateAssignmentStep.js";
 import CycleRemoveStep from "./v1/optimizer/siguiyama/CycleRemoveStep.js";
 import LayerAssignmentStep from "./v1/optimizer/siguiyama/LayerAssignmentStep.js";
-import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
 import NodeOrderingStep from "./v1/optimizer/siguiyama/NodeOrderingStep.js";
-import CoordinateAssignmentStep from "./v1/optimizer/siguiyama/CoordinateAssignmentStep.js";
-import DZWFJsonSerializer from "./v1/io/serialize/dzwf/JointJsonSerializer.js";
+import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
+import { SiguiyamaContext } from "./v1/optimizer/siguiyama/SiguiyamaContext.js";
+
+class BPMNOptimizer {
+	private _optimizationAlgorithm?: SiguiyamaAlgorithm;
+
+	public setOptimizationAlgorithm(algorithm: SiguiyamaAlgorithm) : this {
+		this._optimizationAlgorithm = algorithm;
+		return this;
+	}
+
+	public run(graph: Graph<Node, Edge<Node>>) : SiguiyamaContext {
+		if(!this._optimizationAlgorithm)
+			throw new BPMNError("Optimization algorithm not found, call \"setOptimizationAlgorithm\" method first!");
+		return this._optimizationAlgorithm.run(graph);
+	}
+}
+
+function getDeserializer() : Deserializer<string, Graph<Node, Edge<Node>>> {
+	return new DefaultJsonDeserializer();
+}
+
+function getSerializer() : Serializer<Graph<Node, Edge<Node>>, string> {
+	return new DefaultJsonSerializer();
+}
 
-const deserializer = new DZWFDeserializer();
-const { graph, dzwfData } = deserializer.deserialize(String(readFileSync("./data/bpmn.json")));
-const optimizer = new SiguiyamaAlgorithm()
-	.addStep(new CycleRemoveStep())
-	.addStep(new LayerAssignmentStep())
-	.addStep(new NodeOrderingStep(20))
-	.addStep(new CoordinateAssignmentStep());
+const algorithm = new SiguiyamaAlgorithm().addStep(new CycleRemoveStep()).addStep(new LayerAssignmentStep()).addStep(new NodeOrderingStep()).addStep(new CoordinateAssignmentStep());
+const optimizer = new BPMNOptimizer().setOptimizationAlgorithm(algorithm);
 
-optimizer.run(graph);
+const data = readFileSync("./data/graph.json").toString();
+const graph = getDeserializer().deserialize(data);
+const result = optimizer.run(graph);
 
-const serializer = new DZWFJsonSerializer(dzwfData);
-serializer.serialize(graph);
+writeFileSync(`./data/graph-${Date.now()}.json`, getSerializer().serialize(result.graph));

+ 22 - 0
src/v1/io/deserialize/json/DefaultJsonDeserializer.ts

@@ -0,0 +1,22 @@
+import { InferOutput, parse } from "valibot";
+import DeserializerError from "../../../errors/DeserializerError.js";
+import Edge from "../../../graph/Edge.js";
+import Graph, { GraphSchema } from "../../../graph/Graph.js";
+import Node from "../../../graph/Node.js";
+import { JsonDeserializer } from "./JsonDeserializer.js";
+
+export default class DefaultJsonDeserializer implements JsonDeserializer<Graph<Node, Edge<Node>>> {
+	deserialize(input: string): Graph<Node, Edge<Node>> {
+		const json = JSON.parse(input);
+
+		let graph: InferOutput<typeof GraphSchema>;
+		try {
+			graph = parse(GraphSchema, json);
+		// eslint-disable-next-line @typescript-eslint/no-explicit-any
+		} catch (e: any) {
+			throw new DeserializerError(e.message);
+		}
+
+		return new Graph(graph.nodes, graph.edges);
+	}
+}

+ 11 - 0
src/v1/io/serialize/json/DefaultJsonSerializer.ts

@@ -0,0 +1,11 @@
+import Edge from "../../../graph/Edge.js";
+import Graph from "../../../graph/Graph.js";
+import Node from "../../../graph/Node.js";
+import { JsonSerializer } from "./JsonSerializer.js";
+
+export default class DefaultJsonSerializer implements JsonSerializer<Graph<Node, Edge<Node>>> {
+	serialize(data: Graph<Node, Edge<Node>>): string {
+		const nodes = data.getNodes(), edges = data.getEdges();
+		return JSON.stringify({ nodes, edges }, null, 2);
+	}
+}