001package com.streamconverter.examples;
002
003import com.streamconverter.StreamConverter;
004import com.streamconverter.command.IStreamCommand;
005import com.streamconverter.command.impl.SampleStreamCommand;
006import com.streamconverter.command.impl.csv.CsvValidateCommand;
007import java.io.ByteArrayInputStream;
008import java.io.ByteArrayOutputStream;
009import java.io.IOException;
010import java.nio.charset.StandardCharsets;
011import org.slf4j.Logger;
012import org.slf4j.LoggerFactory;
013
014/**
015 * 複数コマンドを束にした複雑なパイプライン処理の例
016 *
017 * <p>以下のような処理フローを実装します: 1. バリデータコマンド(入力データ検証) 2. DB変換コマンド(データベース変換処理) 3. 通信コマンド(外部API呼び出し) 4.
018 * バリデータコマンド(レスポンス検証) 5. DB逆変換コマンド(逆変換処理)
019 */
020public class ComplexPipelineExample {
021  private static final Logger logger = LoggerFactory.getLogger(ComplexPipelineExample.class);
022
023  /**
024   * メインメソッド
025   *
026   * @param args コマンドライン引数
027   */
028  public static void main(String[] args) {
029    logger.info("🔧 Complex Pipeline Processing Example");
030    logger.info("=====================================\n");
031
032    try {
033      demonstrateComplexPipeline();
034    } catch (Exception e) {
035      logger.error("Complex pipeline demonstration failed: {}", e.getMessage(), e);
036    }
037  }
038
039  /** 複雑なパイプライン処理のデモンストレーション */
040  private static void demonstrateComplexPipeline() throws IOException {
041    // サンプル入力データ(CSV形式)
042    String inputCsvData =
043        """
044        id,name,email,department
045        1,John Doe,john@example.com,Engineering
046        2,Jane Smith,jane@example.com,Marketing
047        3,Bob Johnson,bob@example.com,Sales
048        """;
049
050    logger.info("📋 Input Data:");
051    logger.info(inputCsvData);
052
053    // 複数コマンドを束にしたパイプライン構築
054    IStreamCommand[] complexPipeline = {
055      // 1. 入力バリデータコマンド
056      createInputValidator(),
057
058      // 2. DB変換コマンド(データベース変換処理)
059      createDbTransformCommand(),
060
061      // 3. 通信コマンド(外部API呼び出し)
062      createCommunicationCommand(),
063
064      // 4. レスポンスバリデータコマンド
065      createResponseValidator(),
066
067      // 5. DB逆変換コマンド
068      createDbReverseTransformCommand()
069    };
070
071    // パイプライン実行
072    StreamConverter converter = StreamConverter.create(complexPipeline);
073
074    ByteArrayInputStream inputStream =
075        new ByteArrayInputStream(inputCsvData.getBytes(StandardCharsets.UTF_8));
076    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
077
078    logger.info("🚀 Executing complex pipeline with {} commands...", complexPipeline.length);
079
080    long startTime = System.currentTimeMillis();
081    converter.run(inputStream, outputStream);
082    long endTime = System.currentTimeMillis();
083
084    // 結果出力
085    String result = outputStream.toString(StandardCharsets.UTF_8);
086    logger.info("✅ Pipeline completed successfully in {} ms", endTime - startTime);
087    logger.info("📤 Final Result:");
088    logger.info(result);
089
090    logger.info("\n" + "=".repeat(60));
091  }
092
093  /** 入力バリデータコマンドを作成 */
094  private static IStreamCommand createInputValidator() {
095    logger.info("🔍 Creating input validator command");
096
097    // CSV必須カラムを定義
098    String[] requiredColumns = {"id", "name", "email", "department"};
099
100    // CsvValidateCommandを使用して入力検証
101    return new CsvValidateCommand(requiredColumns);
102  }
103
104  /** DB変換コマンドを作成 */
105  private static IStreamCommand createDbTransformCommand() {
106    logger.info("🔄 Creating DB transform command");
107
108    return new SampleStreamCommand("db-transform") {
109      @Override
110      public void executeInternal(
111          java.io.InputStream inputStream, java.io.OutputStream outputStream) throws IOException {
112        logger.info("Executing database transformation");
113
114        // 実際のDB変換処理をシミュレート
115        super.executeInternal(inputStream, outputStream);
116
117        logger.info("Database transformation completed");
118      }
119    };
120  }
121
122  /** 通信コマンドを作成 */
123  private static IStreamCommand createCommunicationCommand() {
124    logger.info("🌐 Creating communication command");
125
126    return new SampleStreamCommand("http-communication") {
127      @Override
128      public void executeInternal(
129          java.io.InputStream inputStream, java.io.OutputStream outputStream) throws IOException {
130        logger.info("Executing external API communication");
131
132        // 実際のHTTP通信をシミュレート
133        // 本来であればSendHttpCommandを使用
134        super.executeInternal(inputStream, outputStream);
135
136        logger.info("External API communication completed");
137      }
138    };
139  }
140
141  /** レスポンスバリデータコマンドを作成 */
142  private static IStreamCommand createResponseValidator() {
143    logger.info("✅ Creating response validator command");
144
145    return new SampleStreamCommand("response-validator") {
146      @Override
147      public void executeInternal(
148          java.io.InputStream inputStream, java.io.OutputStream outputStream) throws IOException {
149        logger.info("Validating API response");
150
151        // レスポンスバリデーション処理をシミュレート
152        super.executeInternal(inputStream, outputStream);
153
154        logger.info("Response validation completed");
155      }
156    };
157  }
158
159  /** DB逆変換コマンドを作成 */
160  private static IStreamCommand createDbReverseTransformCommand() {
161    logger.info("🔙 Creating DB reverse transform command");
162
163    return new SampleStreamCommand("db-reverse-transform") {
164      @Override
165      public void executeInternal(
166          java.io.InputStream inputStream, java.io.OutputStream outputStream) throws IOException {
167        logger.info("Executing database reverse transformation");
168
169        // DB逆変換処理をシミュレート
170        super.executeInternal(inputStream, outputStream);
171
172        logger.info("Database reverse transformation completed");
173      }
174    };
175  }
176}