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}