package com.tacitknowledge.slowlight.proxyserver.server; import com.tacitknowledge.slowlight.proxyserver.config.ConfigBuilder; import com.tacitknowledge.slowlight.proxyserver.config.ServerConfig; import com.tacitknowledge.slowlight.proxyserver.config.SlowlightConfig; import com.tacitknowledge.slowlight.proxyserver.config.json.JSONConfigBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationTargetException; /** * Slowlight server main class. Use this class to start an instance of slow-light server. * * @author Alexandr Donciu (adonciu@tacitknowledge.com) */ public class SlowlightServer { private static final Logger LOG = LoggerFactory.getLogger(SlowlightServer.class); private ConfigBuilder configBuilder; public static void main(String[] args) throws Exception { final SlowlightServer slowlightServer = new SlowlightServer(); slowlightServer.setConfigBuilder(new JSONConfigBuilder()); slowlightServer.start(args); } public void start(final String[] args) throws Exception { validateArguments(args); final SlowlightConfig config = configBuilder.getConfig(args[0]); for (ServerConfig serverConfig : config.getServers()) { try { final Server server = instantiateServer(config, serverConfig); server.start(); } catch (final Exception e) { LOG.error("Cannot create server [{}]", serverConfig.getId(), e); throw e; } } } protected Server instantiateServer(final SlowlightConfig config, final ServerConfig serverConfig) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { final Class<?> serverClass = Class.forName(config.getServerTypes().get(serverConfig.getType())); return (Server) serverClass.getConstructor(ServerConfig.class).newInstance(serverConfig); } private void validateArguments(final String[] args) { if (args.length < 1) { throw new IllegalArgumentException("Usage: " + SlowlightServer.class.getSimpleName() + " <config_file>"); } } public void setConfigBuilder(final ConfigBuilder configBuilder) { this.configBuilder = configBuilder; } }