From 847cc8384ae0878323e13ce44862072aae78a00d Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 22:51:29 +0900 Subject: [PATCH 1/6] feat: add list output html for controllers --- .../jig/adapter/JigDocumentGenerator.java | 4 +- .../adapter/thymeleaf/ListOutputAdapter.java | 91 ++++++++++++ .../documents/documentformat/JigDocument.java | 8 ++ .../resources/templates/assets/list-output.js | 129 ++++++++++++++++++ .../src/main/resources/templates/index.html | 8 +- .../main/resources/templates/list-output.html | 62 +++++++++ jig-core/src/test/js/list-output.test.js | 94 +++++++++++++ 7 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java create mode 100644 jig-core/src/main/resources/templates/assets/list-output.js create mode 100644 jig-core/src/main/resources/templates/list-output.html create mode 100644 jig-core/src/test/js/list-output.test.js diff --git a/jig-core/src/main/java/org/dddjava/jig/adapter/JigDocumentGenerator.java b/jig-core/src/main/java/org/dddjava/jig/adapter/JigDocumentGenerator.java index fabbe6e96..d14935a4f 100644 --- a/jig-core/src/main/java/org/dddjava/jig/adapter/JigDocumentGenerator.java +++ b/jig-core/src/main/java/org/dddjava/jig/adapter/JigDocumentGenerator.java @@ -68,6 +68,7 @@ public JigDocumentGenerator(JigDocumentContext jigDocumentContext, JigService ji compositeAdapter.register(new SummaryAdapter(jigService, new ThymeleafSummaryWriter(templateEngine, jigDocumentContext))); compositeAdapter.register(new InsightAdapter(jigService, templateEngine, jigDocumentContext)); compositeAdapter.register(new RepositorySummaryAdapter(jigService, templateEngine, jigDocumentContext)); + compositeAdapter.register(new ListOutputAdapter(jigService, templateEngine, jigDocumentContext)); } public JigResult generate(JigRepository jigRepository) { @@ -131,7 +132,7 @@ HandleResult generateDocument(JigDocument jigDocument, Path outputDirectory, Jig case DomainSummary, ApplicationSummary, UsecaseSummary, EntrypointSummary, PackageRelationDiagram, BusinessRuleRelationDiagram, CategoryDiagram, CategoryUsageDiagram, ServiceMethodCallHierarchyDiagram, - BusinessRuleList, ApplicationList, + BusinessRuleList, ApplicationList, ListOutput, RepositorySummary, Insight, Sequence -> compositeAdapter.invoke(jigDocument, jigRepository); }; @@ -165,6 +166,7 @@ private void generateAssets() { copyAsset("package.js", assetsPath); copyAsset("glossary.js", assetsPath); copyAsset("insight.js", assetsPath); + copyAsset("list-output.js", assetsPath); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java new file mode 100644 index 000000000..797e0cfdd --- /dev/null +++ b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java @@ -0,0 +1,91 @@ +package org.dddjava.jig.adapter.thymeleaf; + +import org.dddjava.jig.adapter.HandleDocument; +import org.dddjava.jig.adapter.JigDocumentWriter; +import org.dddjava.jig.application.JigService; +import org.dddjava.jig.domain.model.data.members.fields.JigFieldId; +import org.dddjava.jig.domain.model.data.types.TypeId; +import org.dddjava.jig.domain.model.documents.documentformat.JigDocument; +import org.dddjava.jig.domain.model.documents.stationery.JigDocumentContext; +import org.dddjava.jig.domain.model.information.JigRepository; +import org.dddjava.jig.domain.model.information.inputs.Entrypoint; +import org.dddjava.jig.domain.model.information.inputs.InputAdapters; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +import java.nio.file.Path; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.joining; + +@HandleDocument +public class ListOutputAdapter { + + private static final Collector STREAM_COLLECTOR = joining(", ", "[", "]"); + + private final JigService jigService; + private final TemplateEngine templateEngine; + private final JigDocumentContext jigDocumentContext; + + public ListOutputAdapter(JigService jigService, TemplateEngine templateEngine, JigDocumentContext jigDocumentContext) { + this.jigService = jigService; + this.templateEngine = templateEngine; + this.jigDocumentContext = jigDocumentContext; + } + + @HandleDocument(JigDocument.ListOutput) + public List invoke(JigRepository repository, JigDocument jigDocument) { + InputAdapters inputAdapters = jigService.inputAdapters(repository); + String controllerJson = inputAdapters.listEntrypoint().stream() + .map(this::formatControllerJson) + .collect(Collectors.joining(",", "[", "]")); + + String listJson = """ + {"controllers": %s} + """.formatted(controllerJson); + + JigDocumentWriter jigDocumentWriter = new JigDocumentWriter(jigDocument, jigDocumentContext.outputDirectory()); + Map contextMap = Map.of( + "title", jigDocumentWriter.jigDocument().label(), + "listJson", listJson + ); + + Context context = new Context(Locale.ROOT, contextMap); + String template = jigDocumentWriter.jigDocument().fileName(); + + jigDocumentWriter.writeTextAs(".html", + writer -> templateEngine.process(template, context, writer)); + return jigDocumentWriter.outputFilePaths(); + } + + private String formatControllerJson(Entrypoint entrypoint) { + String usingFieldTypes = entrypoint.jigMethod().usingFields().jigFieldIds().stream() + .map(JigFieldId::declaringTypeId) + .map(TypeId::asSimpleText) + .sorted() + .collect(STREAM_COLLECTOR); + return """ + {"packageName": "%s", "typeName": "%s", "methodSignature": "%s", "returnType": "%s", "typeLabel": "%s", "usingFieldTypes": "%s", "cyclomaticComplexity": %d, "path": "%s"} + """.formatted( + escape(entrypoint.packageId().asText()), + escape(entrypoint.typeId().asSimpleText()), + escape(entrypoint.jigMethod().simpleMethodSignatureText()), + escape(entrypoint.jigMethod().returnType().simpleName()), + escape(entrypoint.jigType().label()), + escape(usingFieldTypes), + entrypoint.jigMethod().instructions().cyclomaticComplexity(), + escape(entrypoint.fullPathText())); + } + + private String escape(String string) { + return string + .replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\r", "\\r") + .replace("\n", "\\n"); + } +} diff --git a/jig-core/src/main/java/org/dddjava/jig/domain/model/documents/documentformat/JigDocument.java b/jig-core/src/main/java/org/dddjava/jig/domain/model/documents/documentformat/JigDocument.java index 62f7549a9..678010d6b 100644 --- a/jig-core/src/main/java/org/dddjava/jig/domain/model/documents/documentformat/JigDocument.java +++ b/jig-core/src/main/java/org/dddjava/jig/domain/model/documents/documentformat/JigDocument.java @@ -77,6 +77,14 @@ public enum JigDocument { ApplicationList( JigDocumentLabel.of("機能一覧", "ApplicationList"), "application"), + /** + * 一覧出力 + * + * 一覧をHTMLで出力する。 + */ + ListOutput( + JigDocumentLabel.of("一覧出力", "ListOutput"), + "list-output"), /** * サービスメソッド呼び出し図 diff --git a/jig-core/src/main/resources/templates/assets/list-output.js b/jig-core/src/main/resources/templates/assets/list-output.js new file mode 100644 index 000000000..5a6e063bd --- /dev/null +++ b/jig-core/src/main/resources/templates/assets/list-output.js @@ -0,0 +1,129 @@ +function getListData() { + const jsonText = document.getElementById("list-data")?.textContent || "{}"; + /** @type {{controllers?: Array<{ + * packageName: string, + * typeName: string, + * methodSignature: string, + * returnType: string, + * typeLabel: string, + * usingFieldTypes: string, + * cyclomaticComplexity: number, + * path: string + * }>} | Array<{ + * packageName: string, + * typeName: string, + * methodSignature: string, + * returnType: string, + * typeLabel: string, + * usingFieldTypes: string, + * cyclomaticComplexity: number, + * path: string + * }>} */ + const listData = JSON.parse(jsonText); + if (Array.isArray(listData)) { + return listData; + } + return listData.controllers ?? []; +} + +function escapeCsvValue(value) { + const text = String(value ?? "") + .replace(/\r\n/g, "\n") + .replace(/\r/g, "\n"); + return `"${text.replace(/"/g, "\"\"")}"`; +} + +function buildControllerCsv(items) { + const header = [ + "パッケージ名", + "クラス名", + "メソッドシグネチャ", + "メソッド戻り値の型", + "クラス別名", + "使用しているフィールドの型", + "循環的複雑度", + "パス", + ]; + const rows = items.map(item => [ + item.packageName ?? "", + item.typeName ?? "", + item.methodSignature ?? "", + item.returnType ?? "", + item.typeLabel ?? "", + item.usingFieldTypes ?? "", + item.cyclomaticComplexity ?? "", + item.path ?? "", + ]); + const lines = [header, ...rows].map(row => row.map(escapeCsvValue).join(",")); + return lines.join("\r\n"); +} + +function downloadCsv(text, filename) { + const blob = new Blob([text], {type: "text/csv;charset=utf-8;"}); + const url = URL.createObjectURL(blob); + const anchor = document.createElement("a"); + anchor.href = url; + anchor.download = filename; + document.body.appendChild(anchor); + anchor.click(); + anchor.remove(); + URL.revokeObjectURL(url); +} + +function renderControllerTable(items) { + const tableBody = document.querySelector("#controller-list tbody"); + if (!tableBody) return; + tableBody.innerHTML = ""; + + const fragment = document.createDocumentFragment(); + items.forEach(item => { + const row = document.createElement("tr"); + const values = [ + item.packageName, + item.typeName, + item.methodSignature, + item.returnType, + item.typeLabel, + item.usingFieldTypes, + item.cyclomaticComplexity, + item.path, + ]; + values.forEach((value, index) => { + const cell = document.createElement("td"); + if (index === 6) { + cell.className = "number"; + } + cell.textContent = value ?? ""; + row.appendChild(cell); + }); + fragment.appendChild(row); + }); + + tableBody.appendChild(fragment); +} + +if (typeof document !== "undefined") { + document.addEventListener("DOMContentLoaded", function () { + if (!document.body.classList.contains("list-output")) return; + const items = getListData(); + renderControllerTable(items); + + const exportButton = document.getElementById("export-csv"); + if (exportButton) { + exportButton.addEventListener("click", () => { + const csvText = buildControllerCsv(items); + downloadCsv(csvText, "list-output.csv"); + }); + } + }); +} + +// Nodeのテスト用エクスポート。ブラウザでは無視される。 +if (typeof module !== "undefined" && module.exports) { + module.exports = { + getListData, + escapeCsvValue, + buildControllerCsv, + renderControllerTable, + }; +} diff --git a/jig-core/src/main/resources/templates/index.html b/jig-core/src/main/resources/templates/index.html index 6fd20cf9e..f1b0d7404 100644 --- a/jig-core/src/main/resources/templates/index.html +++ b/jig-core/src/main/resources/templates/index.html @@ -27,6 +27,12 @@

概要: HTML

  • インサイト (incubate)
  • +
    +

    一覧: HTML

    + +

    一覧: Excel

      @@ -51,4 +57,4 @@

      XXX

      - \ No newline at end of file + diff --git a/jig-core/src/main/resources/templates/list-output.html b/jig-core/src/main/resources/templates/list-output.html new file mode 100644 index 000000000..489fcd39f --- /dev/null +++ b/jig-core/src/main/resources/templates/list-output.html @@ -0,0 +1,62 @@ + + + + + + + + 一覧出力 + + +
      たいとる
      +
      +

      一覧出力

      + +
      +

      CONTROLLER

      +
      + +
      + + + + + + + + + + + + + + +
      パッケージ名クラス名メソッドシグネチャメソッド戻り値の型クラス別名使用しているフィールドの型循環的複雑度パス
      +
      +
      + + + + + + + + + + + diff --git a/jig-core/src/test/js/list-output.test.js b/jig-core/src/test/js/list-output.test.js new file mode 100644 index 000000000..1f79c55ed --- /dev/null +++ b/jig-core/src/test/js/list-output.test.js @@ -0,0 +1,94 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const listOutput = require('../../main/resources/templates/assets/list-output.js'); + +class Element { + constructor(tagName) { + this.tagName = tagName; + this.children = []; + this.textContent = ''; + this.innerHTML = ''; + this.className = ''; + this.parentElement = null; + } + + appendChild(child) { + child.parentElement = this; + this.children.push(child); + return child; + } +} + +class DocumentStub { + constructor() { + this.elementsById = new Map(); + } + + createElement(tagName) { + return new Element(tagName); + } + + createDocumentFragment() { + return new Element('fragment'); + } + + getElementById(id) { + return this.elementsById.get(id) || null; + } +} + +function setupDocument() { + const doc = new DocumentStub(); + global.document = doc; + return doc; +} + +test.describe('list-output.js CSV', () => { + test('CSV値はクォートし、改行とダブルクォートを処理する', () => { + const value = '"a"\r\nline'; + + const escaped = listOutput.escapeCsvValue(value); + + assert.equal(escaped, '"""a""\nline"'); + }); + + test('CSVにヘッダーと行を出力する', () => { + const items = [ + { + packageName: 'com.example', + typeName: 'ExampleController', + methodSignature: 'getExample()', + returnType: 'Example', + typeLabel: '例', + usingFieldTypes: '[ExampleRepository]', + cyclomaticComplexity: 2, + path: 'GET /example', + }, + ]; + + const csv = listOutput.buildControllerCsv(items); + + assert.equal( + csv, + '"パッケージ名","クラス名","メソッドシグネチャ","メソッド戻り値の型","クラス別名","使用しているフィールドの型","循環的複雑度","パス"\r\n' + + '"com.example","ExampleController","getExample()","Example","例","[ExampleRepository]","2","GET /example"' + ); + }); +}); + +test.describe('list-output.js データ読み込み', () => { + test('list-dataから一覧を取得する', () => { + const doc = setupDocument(); + const dataElement = new Element('script'); + dataElement.textContent = JSON.stringify({ + controllers: [{typeName: 'ExampleController'}], + }); + doc.elementsById.set('list-data', dataElement); + + const items = listOutput.getListData(); + + assert.equal(items.length, 1); + assert.equal(items[0].typeName, 'ExampleController'); + }); +}); From 4f11ab592d7c26d0fbae5e828fd1b32edf2c4c85 Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 22:53:16 +0900 Subject: [PATCH 2/6] fix missing branch --- jig-core/src/main/java/org/dddjava/jig/HandleResultImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/HandleResultImpl.java b/jig-core/src/main/java/org/dddjava/jig/HandleResultImpl.java index 6c375a30b..eac86d985 100644 --- a/jig-core/src/main/java/org/dddjava/jig/HandleResultImpl.java +++ b/jig-core/src/main/java/org/dddjava/jig/HandleResultImpl.java @@ -54,7 +54,8 @@ public boolean isOutputDiagram() { Insight, Sequence, Glossary, - PackageSummary -> false; + PackageSummary, + ListOutput -> false; }; } From 4d4ca8f66a854de894c04bcf3498459e24af2d1a Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 22:59:57 +0900 Subject: [PATCH 3/6] fix: prevent list output header wrapping --- jig-core/src/main/resources/templates/assets/style.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jig-core/src/main/resources/templates/assets/style.css b/jig-core/src/main/resources/templates/assets/style.css index c6894979f..8ab1513e7 100644 --- a/jig-core/src/main/resources/templates/assets/style.css +++ b/jig-core/src/main/resources/templates/assets/style.css @@ -465,6 +465,11 @@ label { display: none; } +/* 一覧出力のヘッダは折り返さない */ +.list-output table thead th { + white-space: nowrap; +} + /* テーブルの行をゼブラスタイルにする */ table.zebra tbody tr:nth-child(odd) { background-color: #f9f9f9; From eb31392d83b92e8bba951f989f9f1b26c67129e1 Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 23:02:33 +0900 Subject: [PATCH 4/6] docs: mark list output as incubate --- jig-core/src/main/resources/templates/index.html | 2 +- jig-core/src/main/resources/templates/list-output.html | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/jig-core/src/main/resources/templates/index.html b/jig-core/src/main/resources/templates/index.html index f1b0d7404..dc960c104 100644 --- a/jig-core/src/main/resources/templates/index.html +++ b/jig-core/src/main/resources/templates/index.html @@ -30,7 +30,7 @@

      概要: HTML

      一覧: HTML

      diff --git a/jig-core/src/main/resources/templates/list-output.html b/jig-core/src/main/resources/templates/list-output.html index 489fcd39f..722c95a4a 100644 --- a/jig-core/src/main/resources/templates/list-output.html +++ b/jig-core/src/main/resources/templates/list-output.html @@ -12,6 +12,10 @@

      一覧出力

      + +

      CONTROLLER

      From cd9cf4d922cefc69277f3d14911c805910a8c367 Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 23:08:53 +0900 Subject: [PATCH 5/6] feat: keep list output field types as array --- .../adapter/thymeleaf/ListOutputAdapter.java | 10 ++++++---- .../resources/templates/assets/list-output.js | 17 +++++++++++++---- .../main/resources/templates/list-output.html | 2 +- jig-core/src/test/js/list-output.test.js | 12 ++++++++++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java index 797e0cfdd..2f7a1671a 100644 --- a/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java +++ b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java @@ -63,20 +63,22 @@ public List invoke(JigRepository repository, JigDocument jigDocument) { } private String formatControllerJson(Entrypoint entrypoint) { - String usingFieldTypes = entrypoint.jigMethod().usingFields().jigFieldIds().stream() + String usingFieldTypesJson = entrypoint.jigMethod().usingFields().jigFieldIds().stream() .map(JigFieldId::declaringTypeId) .map(TypeId::asSimpleText) .sorted() - .collect(STREAM_COLLECTOR); + .map(this::escape) + .map(value -> "\"" + value + "\"") + .collect(Collectors.joining(",", "[", "]")); return """ - {"packageName": "%s", "typeName": "%s", "methodSignature": "%s", "returnType": "%s", "typeLabel": "%s", "usingFieldTypes": "%s", "cyclomaticComplexity": %d, "path": "%s"} + {"packageName": "%s", "typeName": "%s", "methodSignature": "%s", "returnType": "%s", "typeLabel": "%s", "usingFieldTypes": %s, "cyclomaticComplexity": %d, "path": "%s"} """.formatted( escape(entrypoint.packageId().asText()), escape(entrypoint.typeId().asSimpleText()), escape(entrypoint.jigMethod().simpleMethodSignatureText()), escape(entrypoint.jigMethod().returnType().simpleName()), escape(entrypoint.jigType().label()), - escape(usingFieldTypes), + usingFieldTypesJson, entrypoint.jigMethod().instructions().cyclomaticComplexity(), escape(entrypoint.fullPathText())); } diff --git a/jig-core/src/main/resources/templates/assets/list-output.js b/jig-core/src/main/resources/templates/assets/list-output.js index 5a6e063bd..c76a4e43e 100644 --- a/jig-core/src/main/resources/templates/assets/list-output.js +++ b/jig-core/src/main/resources/templates/assets/list-output.js @@ -6,7 +6,7 @@ function getListData() { * methodSignature: string, * returnType: string, * typeLabel: string, - * usingFieldTypes: string, + * usingFieldTypes: string[], * cyclomaticComplexity: number, * path: string * }>} | Array<{ @@ -15,7 +15,7 @@ function getListData() { * methodSignature: string, * returnType: string, * typeLabel: string, - * usingFieldTypes: string, + * usingFieldTypes: string[], * cyclomaticComplexity: number, * path: string * }>} */ @@ -33,6 +33,14 @@ function escapeCsvValue(value) { return `"${text.replace(/"/g, "\"\"")}"`; } +function formatFieldTypes(fieldTypes) { + if (!fieldTypes) return ""; + if (Array.isArray(fieldTypes)) { + return fieldTypes.join("\n"); + } + return String(fieldTypes); +} + function buildControllerCsv(items) { const header = [ "パッケージ名", @@ -50,7 +58,7 @@ function buildControllerCsv(items) { item.methodSignature ?? "", item.returnType ?? "", item.typeLabel ?? "", - item.usingFieldTypes ?? "", + formatFieldTypes(item.usingFieldTypes), item.cyclomaticComplexity ?? "", item.path ?? "", ]); @@ -84,7 +92,7 @@ function renderControllerTable(items) { item.methodSignature, item.returnType, item.typeLabel, - item.usingFieldTypes, + formatFieldTypes(item.usingFieldTypes), item.cyclomaticComplexity, item.path, ]; @@ -123,6 +131,7 @@ if (typeof module !== "undefined" && module.exports) { module.exports = { getListData, escapeCsvValue, + formatFieldTypes, buildControllerCsv, renderControllerTable, }; diff --git a/jig-core/src/main/resources/templates/list-output.html b/jig-core/src/main/resources/templates/list-output.html index 722c95a4a..fc72dbe0b 100644 --- a/jig-core/src/main/resources/templates/list-output.html +++ b/jig-core/src/main/resources/templates/list-output.html @@ -48,7 +48,7 @@

      CONTROLLER

      "methodSignature": "getExample()", "returnType": "Example", "typeLabel": "例", - "usingFieldTypes": "[ExampleRepository]", + "usingFieldTypes": ["ExampleRepository"], "cyclomaticComplexity": 1, "path": "GET /example" } diff --git a/jig-core/src/test/js/list-output.test.js b/jig-core/src/test/js/list-output.test.js index 1f79c55ed..f0a3e2a67 100644 --- a/jig-core/src/test/js/list-output.test.js +++ b/jig-core/src/test/js/list-output.test.js @@ -61,7 +61,7 @@ test.describe('list-output.js CSV', () => { methodSignature: 'getExample()', returnType: 'Example', typeLabel: '例', - usingFieldTypes: '[ExampleRepository]', + usingFieldTypes: ['ExampleRepository', 'AnotherType'], cyclomaticComplexity: 2, path: 'GET /example', }, @@ -72,7 +72,7 @@ test.describe('list-output.js CSV', () => { assert.equal( csv, '"パッケージ名","クラス名","メソッドシグネチャ","メソッド戻り値の型","クラス別名","使用しているフィールドの型","循環的複雑度","パス"\r\n' + - '"com.example","ExampleController","getExample()","Example","例","[ExampleRepository]","2","GET /example"' + '"com.example","ExampleController","getExample()","Example","例","ExampleRepository\nAnotherType","2","GET /example"' ); }); }); @@ -92,3 +92,11 @@ test.describe('list-output.js データ読み込み', () => { assert.equal(items[0].typeName, 'ExampleController'); }); }); + +test.describe('list-output.js 表示用整形', () => { + test('使用フィールド型を改行で連結する', () => { + const formatted = listOutput.formatFieldTypes(['A', 'B']); + + assert.equal(formatted, 'A\nB'); + }); +}); From 44fdfe7ca0e21160f8e00bbbb7e89991133dc128 Mon Sep 17 00:00:00 2001 From: irof Date: Sun, 1 Feb 2026 23:12:33 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8BCollector=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java index 2f7a1671a..4869f6b37 100644 --- a/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java +++ b/jig-core/src/main/java/org/dddjava/jig/adapter/thymeleaf/ListOutputAdapter.java @@ -17,16 +17,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.stream.Collector; import java.util.stream.Collectors; -import static java.util.stream.Collectors.joining; - @HandleDocument public class ListOutputAdapter { - private static final Collector STREAM_COLLECTOR = joining(", ", "[", "]"); - private final JigService jigService; private final TemplateEngine templateEngine; private final JigDocumentContext jigDocumentContext;