001package com.streamconverter.controller; 002 003import com.streamconverter.command.CommandConfig; 004import com.streamconverter.command.impl.analysis.PmdXmlToCsvCommand; 005import com.streamconverter.command.impl.analysis.PmdXmlToJsonCommand; 006import com.streamconverter.command.impl.analysis.PmdXmlToMarkdownCommand; 007 008/** 009 * PMD解析レポート変換のためのController 010 * 011 * <p>StreamConverterアーキテクチャの Controller層 実装例として、 PMD XMLレポートを複数形式(Markdown, CSV, JSON)に変換する処理を 012 * 統一インターフェースで提供します。 013 * 014 * <p><strong>アーキテクチャ例証:</strong> 015 * 016 * <ul> 017 * <li>Controller層: 複雑な設定ルールの隠蔽 018 * <li>StreamConverter層: パイプライン管理と並行処理 019 * <li>Command層: 純粋な変換処理の実装 020 * </ul> 021 * 022 * <p><strong>提供形式:</strong> 023 * 024 * <ul> 025 * <li><strong>Markdown</strong>: AI可読性重視の要約レポート 026 * <li><strong>CSV</strong>: スプレッドシート分析用詳細データ 027 * <li><strong>JSON</strong>: プログラム解析用構造化データ 028 * </ul> 029 * 030 * <p><strong>使用例:</strong> 031 * 032 * <pre> 033 * PmdAnalysisController controller = PmdAnalysisController.forMarkdownConversion(); 034 * try (FileInputStream xmlInput = new FileInputStream("pmd-report.xml"); 035 * FileOutputStream mdOutput = new FileOutputStream("analysis.md")) { 036 * List<CommandResult> results = controller.process(xmlInput, mdOutput); 037 * // 処理結果の確認... 038 * } 039 * </pre> 040 */ 041public class PmdAnalysisController extends AbstractStreamController { 042 043 private final ConversionFormat targetFormat; 044 045 /** 変換対象フォーマット */ 046 public enum ConversionFormat { 047 /** Markdown AI-readable analysis report. */ 048 MARKDOWN("Markdown AI-readable analysis report"), 049 /** CSV spreadsheet-compatible data. */ 050 CSV("CSV spreadsheet-compatible data"), 051 /** JSON structured analysis data. */ 052 JSON("JSON structured analysis data"); 053 054 private final String description; 055 056 ConversionFormat(String description) { 057 this.description = description; 058 } 059 060 /** 061 * Gets the human-readable description. 062 * 063 * @return description text 064 */ 065 public String getDescription() { 066 return description; 067 } 068 } 069 070 private PmdAnalysisController(ConversionFormat format) { 071 this.targetFormat = format; 072 } 073 074 /** 075 * Markdown形式変換用のControllerを作成 076 * 077 * @return AI可読Markdown形式に変換するController 078 */ 079 public static PmdAnalysisController forMarkdownConversion() { 080 return new PmdAnalysisController(ConversionFormat.MARKDOWN); 081 } 082 083 /** 084 * CSV形式変換用のControllerを作成 085 * 086 * @return スプレッドシート分析用CSV形式に変換するController 087 */ 088 public static PmdAnalysisController forCsvConversion() { 089 return new PmdAnalysisController(ConversionFormat.CSV); 090 } 091 092 /** 093 * JSON形式変換用のControllerを作成 094 * 095 * @return 構造化JSON形式に変換するController 096 */ 097 public static PmdAnalysisController forJsonConversion() { 098 return new PmdAnalysisController(ConversionFormat.JSON); 099 } 100 101 @Override 102 protected CommandConfig[] configureCommands() { 103 return new CommandConfig[] {createCommandConfig()}; 104 } 105 106 /** 指定フォーマットに対応するCommandConfigを生成 */ 107 private CommandConfig createCommandConfig() { 108 return switch (targetFormat) { 109 case MARKDOWN -> 110 new CommandConfig(PmdXmlToMarkdownCommand.class, "PMD XML to Markdown conversion"); 111 case CSV -> new CommandConfig(PmdXmlToCsvCommand.class, "PMD XML to CSV conversion"); 112 case JSON -> new CommandConfig(PmdXmlToJsonCommand.class, "PMD XML to JSON conversion"); 113 }; 114 } 115 116 @Override 117 public String getConfigurationDescription() { 118 return String.format( 119 "PMD Analysis Controller configured for %s format conversion: %s", 120 targetFormat.name().toLowerCase(), targetFormat.getDescription()); 121 } 122 123 @Override 124 public String getInputDataType() { 125 return "PMD_XML_REPORT"; 126 } 127 128 @Override 129 public String getOutputDataType() { 130 return "PMD_" + targetFormat.name() + "_ANALYSIS"; 131 } 132}