Skip to content

Commit fe9ff3f

Browse files
authored
Merge pull request #1045 from dddjava/agent/context-trim
図の描画におけるコンテキスト依存性を低減する
2 parents f40cd51 + bafc1a5 commit fe9ff3f

File tree

2 files changed

+32
-47
lines changed

2 files changed

+32
-47
lines changed

jig-core/src/main/resources/templates/assets/package.js

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
// 状態/DOMヘルパー
2+
// contextは「UI状態・設定値など長期的に保持する値」に限定する。
3+
// 一時的な中間データはcontextに保存せず、関数内のローカル変数で扱う。
24
const packageContext = {
35
packageSummaryCache: null,
46
diagramNodeIdToFqn: new Map(),
57
aggregationDepth: 0,
6-
diagramElement: null,
7-
pendingDiagramRender: null,
8-
lastDiagramSource: '',
9-
lastDiagramEdgeCount: 0,
10-
DEFAULT_MAX_EDGES: 500,
118
packageFilterFqn: null,
129
relatedFilterMode: 'direct',
1310
relatedFilterFqn: null,
@@ -16,6 +13,7 @@ const packageContext = {
1613
};
1714

1815
const DIAGRAM_CLICK_HANDLER_NAME = 'filterPackageDiagram';
16+
const DEFAULT_MAX_EDGES = 500;
1917

2018
const dom = {
2119
getRelatedFilterTarget: () => document.getElementById('related-filter-target'),
@@ -881,8 +879,7 @@ function getOrCreateDiagramErrorBox(diagram) {
881879
return dom.createDiagramErrorBox(diagram);
882880
}
883881

884-
function showDiagramErrorMessage(message, withAction, err, hash, context) {
885-
const diagram = context.diagramElement;
882+
function showDiagramErrorMessage(diagram, message, pendingRender, err, hash) {
886883
if (!diagram) return;
887884
console.error(message);
888885
if (err) {
@@ -896,12 +893,11 @@ function showDiagramErrorMessage(message, withAction, err, hash, context) {
896893
const actionNode = dom.getDiagramErrorActionNode();
897894
dom.setNodeTextContent(messageNode, message);
898895
if (actionNode) {
899-
dom.setNodeDisplay(actionNode, withAction ? '' : 'none');
900-
if (withAction) {
896+
const hasAction = Boolean(pendingRender);
897+
dom.setNodeDisplay(actionNode, hasAction ? '' : 'none');
898+
if (hasAction) {
901899
dom.setNodeOnClick(actionNode, function () {
902-
if (!context.pendingDiagramRender) return;
903-
renderDiagramWithMermaid(context.pendingDiagramRender.text, context.pendingDiagramRender.maxEdges, context);
904-
context.pendingDiagramRender = null;
900+
renderDiagramWithMermaid(diagram, pendingRender.text, pendingRender.maxEdges);
905901
});
906902
} else {
907903
dom.setNodeOnClick(actionNode, null);
@@ -922,8 +918,7 @@ function hideDiagramErrorMessage(diagram) {
922918
dom.setDiagramElementDisplay(diagram, '');
923919
}
924920

925-
function renderDiagramWithMermaid(text, maxEdges, context) {
926-
const diagram = context.diagramElement;
921+
function renderDiagramWithMermaid(diagram, text, maxEdges) {
927922
if (!diagram || !window.mermaid) return;
928923
hideDiagramErrorMessage(diagram);
929924
dom.removeDiagramAttribute(diagram, 'data-processed');
@@ -933,10 +928,10 @@ function renderDiagramWithMermaid(text, maxEdges, context) {
933928
}
934929

935930
// 描画/更新
936-
function renderMutualDependencyList(mutualPairs, causeRelationEvidence, context) {
931+
function renderMutualDependencyList(mutualPairs, causeRelationEvidence, aggregationDepth) {
937932
const container = dom.getMutualDependencyList();
938933
if (!container) return;
939-
const items = buildMutualDependencyItems(mutualPairs, causeRelationEvidence, context.aggregationDepth);
934+
const items = buildMutualDependencyItems(mutualPairs, causeRelationEvidence, aggregationDepth);
940935
if (items.length === 0) {
941936
container.style.display = 'none';
942937
container.innerHTML = '';
@@ -970,13 +965,12 @@ function renderMutualDependencyList(mutualPairs, causeRelationEvidence, context)
970965
function renderPackageDiagram(context, packageFilterFqn, relatedFilterFqn) {
971966
const diagram = dom.getDiagram();
972967
if (!diagram) return;
973-
context.diagramElement = diagram;
974968

975969
const renderPlan = buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn);
976970
applyDiagramRenderPlan(context, renderPlan);
977-
if (shouldSkipDiagramRenderByEdgeLimit(context)) return;
978-
setDiagramSource(diagram, context.lastDiagramSource);
979-
renderDiagramWithMermaidIfAvailable(context);
971+
if (shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context)) return;
972+
setDiagramSource(diagram, renderPlan.source);
973+
renderDiagramWithMermaidIfAvailable(diagram, renderPlan, context);
980974
}
981975

982976
function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) {
@@ -1013,20 +1007,19 @@ function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) {
10131007

10141008
function applyDiagramRenderPlan(context, renderPlan) {
10151009
context.diagramNodeIdToFqn = renderPlan.nodeIdToFqn;
1016-
renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context);
1017-
context.lastDiagramSource = renderPlan.source;
1018-
context.lastDiagramEdgeCount = renderPlan.uniqueRelations.length;
1010+
renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context.aggregationDepth);
10191011
}
10201012

1021-
function shouldSkipDiagramRenderByEdgeLimit(context) {
1022-
if (context.lastDiagramEdgeCount <= context.DEFAULT_MAX_EDGES) return false;
1023-
context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount};
1013+
function shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context) {
1014+
const edgeCount = renderPlan.uniqueRelations.length;
1015+
if (edgeCount <= DEFAULT_MAX_EDGES) return false;
1016+
const pendingRender = {text: renderPlan.source, maxEdges: edgeCount};
10241017
const message = [
10251018
'関連数が多すぎるため描画を省略しました。',
1026-
`エッジ数: ${context.lastDiagramEdgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`,
1019+
`エッジ数: ${edgeCount}(上限: ${DEFAULT_MAX_EDGES})`,
10271020
'描画する場合はボタンを押してください。',
10281021
].join('\n');
1029-
showDiagramErrorMessage(message, true, null, null, context);
1022+
showDiagramErrorMessage(diagram, message, pendingRender, null, null);
10301023
return true;
10311024
}
10321025

@@ -1035,22 +1028,21 @@ function setDiagramSource(diagram, source) {
10351028
diagram.textContent = source;
10361029
}
10371030

1038-
function renderDiagramWithMermaidIfAvailable(context) {
1031+
function renderDiagramWithMermaidIfAvailable(diagram, renderPlan, context) {
10391032
if (!window.mermaid) return;
1040-
ensureMermaidParseErrorHandler(context);
1041-
renderDiagramWithMermaid(context.lastDiagramSource, context.DEFAULT_MAX_EDGES, context);
1033+
ensureMermaidParseErrorHandler(diagram, renderPlan, context);
1034+
renderDiagramWithMermaid(diagram, renderPlan.source, DEFAULT_MAX_EDGES);
10421035
}
10431036

1044-
function ensureMermaidParseErrorHandler(context) {
1045-
if (mermaid.parseError) return;
1037+
function ensureMermaidParseErrorHandler(diagram, renderPlan, context) {
10461038
mermaid.parseError = function (err, hash) {
10471039
const message = err && err.message ? err.message : String(err);
10481040
const location = hash ? `\nLine: ${hash.line} Column: ${hash.loc}` : '';
10491041
const isEdgeLimit = message.includes('Edge limit exceeded');
1050-
if (isEdgeLimit) {
1051-
context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount};
1052-
}
1053-
showDiagramErrorMessage(`Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context);
1042+
const pendingRender = isEdgeLimit
1043+
? {text: renderPlan.source, maxEdges: renderPlan.uniqueRelations.length}
1044+
: null;
1045+
showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, pendingRender, err, hash);
10541046
};
10551047
}
10561048

jig-core/src/test/js/package.test.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ function setupDiagramEnvironment(doc, context) {
231231
const diagram = doc.createElement('div');
232232
diagram.id = 'package-relation-diagram';
233233
container.appendChild(diagram);
234-
context.diagramElement = diagram;
235234
const mutual = doc.createElement('div');
236235
mutual.id = 'mutual-dependency-list';
237236
doc.elementsById.set('mutual-dependency-list', mutual);
@@ -254,11 +253,6 @@ test.describe('package.js', () => {
254253
packageSummaryCache: null,
255254
diagramNodeIdToFqn: new Map(),
256255
aggregationDepth: 0,
257-
diagramElement: null,
258-
pendingDiagramRender: null,
259-
lastDiagramSource: '',
260-
lastDiagramEdgeCount: 0,
261-
DEFAULT_MAX_EDGES: 500,
262256
packageFilterFqn: null,
263257
relatedFilterMode: 'direct',
264258
relatedFilterFqn: null,
@@ -872,7 +866,7 @@ test.describe('package.js', () => {
872866
{from: 'app.alpha.A', to: 'app.beta.B'},
873867
{from: 'app.beta.B', to: 'app.alpha.A'},
874868
],
875-
testContext
869+
testContext.aggregationDepth
876870
);
877871

878872
assert.equal(container.style.display, '');
@@ -906,9 +900,8 @@ test.describe('package.js', () => {
906900

907901
test('renderPackageDiagram: エッジ数超過時は保留/エラー表示する', () => {
908902
const doc = setupDocument();
909-
// setupDiagramEnvironmentはtestContext.diagramElementを設定する。
910-
// そのdiagramElementがdomヘルパーによって操作されることをモックする。
911-
const diagramMock = setupDiagramEnvironment(doc, testContext); // testContext.diagramElementも設定される
903+
// setupDiagramEnvironmentが作るdiagramをdomヘルパーが操作することをモックする。
904+
const diagramMock = setupDiagramEnvironment(doc, testContext);
912905

913906
// Mock dom helpers used by showDiagramErrorMessage internally
914907
const errorBoxMock = { style: { display: 'none' } };

0 commit comments

Comments
 (0)