001package com.mybatisflex.core.datasource.processor; 002 003import com.mybatisflex.core.exception.FlexAssert; 004 005import java.lang.reflect.Method; 006import java.util.ArrayList; 007import java.util.Arrays; 008import java.util.List; 009 010/** 011 * DataSourceProcessor 委托扩展类,对 DataSourceProcessor 结构进行扩大和增强 012 * 如果多个实例化,建议通过 DelegatingDataSourceProcessor.with(多个解析处理器实例) 方式进行实例化。 013 * 需要注意的是委托解析处理器之间有先后顺序,一旦排列前面的解析处理器正常处理后,将直接返回处理值,不再往下传递处理 014 * 015 * @author Alay 016 * @since 2024-12-07 15:38 017 */ 018public class DelegatingDataSourceProcessor implements DataSourceProcessor { 019 /** 020 * 多个处理器委托集合(使用时请注意 DataSourceProcessor 的顺序) 021 */ 022 private final List<DataSourceProcessor> delegates; 023 024 025 private DelegatingDataSourceProcessor(List<DataSourceProcessor> delegates) { 026 this.delegates = delegates; 027 } 028 029 /** 030 * @param processors 使用时请注意 DataSourceProcessor 的顺序 031 */ 032 public static DelegatingDataSourceProcessor with(DataSourceProcessor... processors) { 033 FlexAssert.notEmpty(processors, "datasource processors"); 034 List<DataSourceProcessor> dataSourceProcessors = new ArrayList<>(Arrays.asList(processors)); 035 return new DelegatingDataSourceProcessor(dataSourceProcessors); 036 } 037 038 /** 039 * @param processors 使用时请注意 DataSourceProcessor 的顺序 040 */ 041 public static DelegatingDataSourceProcessor with(List<DataSourceProcessor> processors) { 042 FlexAssert.notEmpty(processors, "datasource processors"); 043 return new DelegatingDataSourceProcessor(processors); 044 } 045 046 047 @Override 048 public String process(String dataSourceKey, Object mapper, Method method, Object[] arguments) { 049 for (DataSourceProcessor delegate : delegates) { 050 // 使用时请注意 DataSourceProcessor 的顺序,一旦匹配到处理器将进行终止处理链,并返回当前处理结果 051 String returnKey = delegate.process(dataSourceKey, mapper, method, arguments); 052 if (null != returnKey) return returnKey; 053 } 054 // 无可用的处理器策略,返回原始值 055 return dataSourceKey; 056 } 057 058}