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}