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&lt;CommandResult&gt; 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}