All Downloads are FREE. Search and download functionalities are using the official Maven repository.

live.xu.simplehttp.core.SimpleHttpContext Maven / Gradle / Ivy

package live.xu.simplehttp.core;

import live.xu.simplehttp.core.convert.ResultObjectConvert;
import live.xu.simplehttp.core.convert.ResultObjectConverts;
import live.xu.simplehttp.core.executor.MethodExecutors;
import live.xu.simplehttp.core.executor.http.HttpExecutor;
import live.xu.simplehttp.core.executor.http.RedirectHttpExecutor;
import live.xu.simplehttp.core.executor.http.WrapperHttpExecutor;
import live.xu.simplehttp.core.executor.http.httpclient.HttpClientExecutor;
import live.xu.simplehttp.core.interceptor.HttpExecutorInterceptor;
import live.xu.simplehttp.core.proxy.factory.JdkProxyFactory;
import live.xu.simplehttp.core.proxy.factory.ProxyFactory;
import live.xu.simplehttp.core.service.ServiceResolver;
import live.xu.simplehttp.core.service.impl.MemoryServiceResolver;
import lombok.extern.slf4j.Slf4j;

import java.io.Closeable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 应用上下文
 * Create by xsg at 2023/07/24 10:50.
 */
@Slf4j
public class SimpleHttpContext implements Closeable {
    //全局配置
    private final ProxyFactory proxyFactory;
    //服务名称解析器
    private final ServiceResolver serviceResolver;
    //执行器包装类
    private final WrapperHttpExecutor wrapperHttpExecutor;
    //结果对象转换器
    private final ResultObjectConverts resultObjectConverts = new ResultObjectConverts();
    //方法执行器
    private final MethodExecutors methodExecutors;

    public SimpleHttpContext() {
        this(new HttpClientExecutor(), new ArrayList<>(), new MemoryServiceResolver(), null);
    }

    public SimpleHttpContext(ServiceResolver serviceResolver) {
        this(new HttpClientExecutor(), new ArrayList<>(), serviceResolver, null);
    }

    public SimpleHttpContext(HttpExecutor httpExecutor) {
        this(httpExecutor, new ArrayList<>(), new MemoryServiceResolver(), null);
    }

    public SimpleHttpContext(HttpExecutor httpExecutor, List listeners) {
        this(httpExecutor, new ArrayList<>(), new MemoryServiceResolver(), listeners);
    }

    public SimpleHttpContext(List customResultObjectConverts) {
        this(new HttpClientExecutor(), customResultObjectConverts, new MemoryServiceResolver(), null);
    }

    public SimpleHttpContext(HttpExecutor httpExecutor,
                             List resultObjectConvertList,
                             ServiceResolver serviceResolver,
                             List httpExecutorInterceptor) {
        this.serviceResolver = serviceResolver;
        this.resultObjectConverts.addAll(resultObjectConvertList);  //添加自定义结果对象转换

        //http执行器
        this.wrapperHttpExecutor = new WrapperHttpExecutor(httpExecutor);
        this.wrapperHttpExecutor.addListener(httpExecutorInterceptor);

        //重定向执行器
        RedirectHttpExecutor redirectHttpExecutor = new RedirectHttpExecutor(wrapperHttpExecutor);

        //方法执行器
        this.methodExecutors = new MethodExecutors(redirectHttpExecutor, resultObjectConverts);  // http方法执行器
        this.proxyFactory = new JdkProxyFactory(this.methodExecutors, this.serviceResolver);
    }


    /**
     * 获取接口的代理实现
     * @param clazz http远程调用声明式接口
     * @param  接口类型
     * @return 返回代理对象
     */
    public  T get(Class clazz) {
        if (!clazz.isInterface()) {
            throw new IllegalArgumentException("clazz必须是接口");
        }

        return this.proxyFactory.createProxy(clazz);
    }

    /**
     * 获取服务域名解析器
     * @return 服务域名解析器
     */
    public ServiceResolver getServiceResolver() {
        return serviceResolver;
    }

    /**
     * 添加拦截器
     * @param httpExecutorInterceptor 拦截器
     */
    public void addHttpExecutorInterceptor(HttpExecutorInterceptor httpExecutorInterceptor) {
        if (httpExecutorInterceptor != null) {
            this.wrapperHttpExecutor.addListener(Collections.singletonList(httpExecutorInterceptor));
        }
    }

    /**
     * 添加结果转换器
     * @param resultObjectConvert 结果转换器
     */
    public void addResultObjectConvert(ResultObjectConvert resultObjectConvert) {
        if (resultObjectConvert != null) {
            this.resultObjectConverts.add(resultObjectConvert);
        }
    }

    /**
     * 关闭环境
     */
    @Override
    public void close() {
        try {
            this.wrapperHttpExecutor.close();
        } catch (Exception e) {
            log.error("删除http执行器异常", e);
        }
        try {
            this.methodExecutors.close();
        } catch (Exception e) {
            log.error("删除方法执行器异常", e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy