ServerAutoConfigurationRegistrar.java

package sprout.server;

import sprout.beans.BeanDefinition;
import sprout.beans.ConstructorBeanDefinition;
import sprout.beans.InfrastructureBean;
import sprout.beans.annotation.Bean;
import sprout.beans.annotation.Component;
import sprout.beans.processor.BeanDefinitionRegistrar;
import sprout.config.AppConfig;
import sprout.context.ContextPropagator;
import sprout.mvc.dispatcher.RequestDispatcher;
import sprout.mvc.http.parser.HttpRequestParser;
import sprout.server.builtins.BioHttpProtocolHandler;
import sprout.server.builtins.NioHttpProtocolHandler;
import sprout.server.builtins.RequestExecutorPoolService;
import sprout.server.builtins.VirtualRequestExecutorService;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

// FIX : 사용 x, Registrar 순회 시점에 주입 불가
// ServerConfiguration 에서 처리
@Deprecated
public class ServerAutoConfigurationRegistrar implements BeanDefinitionRegistrar {

    private final AppConfig appConfig;

    public ServerAutoConfigurationRegistrar(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    @Override
    public Collection<BeanDefinition> registerAdditionalBeanDefinitions(Collection<BeanDefinition> existingDefs) throws NoSuchMethodException {
        String executionMode = appConfig.getStringProperty("server.execution-mode", "hybrid");
        if (executionMode.equals("hybrid")) {
            return registerHybridServerBeans(existingDefs);
        }
        return registerNioServerBeans(existingDefs);
    }

    private Collection<BeanDefinition> registerHybridServerBeans(Collection<BeanDefinition> existingDefs) throws NoSuchMethodException {
        Constructor<?> constructor = BioHttpProtocolHandler.class.getConstructor(RequestDispatcher.class, HttpRequestParser.class, RequestExecutorService.class);
        return List.of(registerThreadTypeBean(existingDefs), createBeanDefinition("httpProtocolHandler", BioHttpProtocolHandler.class, constructor));
    }

    private Collection<BeanDefinition> registerNioServerBeans(Collection<BeanDefinition> existingDefs) throws NoSuchMethodException {
        Constructor<?> constructor = NioHttpProtocolHandler.class.getConstructor(RequestDispatcher.class, HttpRequestParser.class, RequestExecutorService.class);
        return List.of(registerThreadTypeBean(existingDefs), createBeanDefinition("httpProtocolHandler", NioHttpProtocolHandler.class, constructor));
    }

    private BeanDefinition registerThreadTypeBean(Collection<BeanDefinition> existingDefs) throws NoSuchMethodException {
        String threadType = appConfig.getStringProperty("server.thread-type", "virtual");
        if (threadType.equals("virtual")) {
            Constructor<?> constructor = VirtualRequestExecutorService.class.getConstructor(List.class);
            return createBeanDefinition("requestExecutorService", VirtualRequestExecutorService.class, constructor);
        } else {
            Constructor<?> constructor = RequestExecutorPoolService.class.getConstructor(int.class);
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            Object[] constructorArguments = new Object[]{appConfig.getIntProperty("server.thread-pool-size", 100)};
            return createBeanDefinition("requestExecutorService", RequestExecutorPoolService.class, constructor, parameterTypes, constructorArguments);
        }
    }

    private BeanDefinition createBeanDefinition(String beanName, Class<?> beanClass, Constructor<?> constructor) throws NoSuchMethodException {
        Class<?>[] parameterTypes = constructor.getParameterTypes();
        return new ConstructorBeanDefinition(beanName, beanClass, constructor, parameterTypes);
    }

    private BeanDefinition createBeanDefinition(String beanName, Class<?> beanClass, Constructor<?> constructor, Class<?>[] parameterTypes, Object[] constructorArguments) {
        return new ConstructorBeanDefinition(beanName, beanClass, constructor, parameterTypes, constructorArguments);
    }
}