/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure.net; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.SocketImpl; import java.net.SocketImplFactory; import nginx.clojure.Coroutine; import nginx.clojure.logger.LoggerService; import nginx.clojure.logger.TinyLogService; public class NginxClojureSocketFactory implements SocketImplFactory { protected static LoggerService log; public NginxClojureSocketFactory() { if (log == null) { log = TinyLogService.createDefaultTinyLogService(); } } @Override public SocketImpl createSocketImpl() { if (Coroutine.getActiveCoroutine() == null) { log.warn("we are not in coroutine so we turn to java build-in socket implement!"); try { Class<?> socketImpClz = Thread.currentThread().getContextClassLoader().loadClass("java.net.SocksSocketImpl"); @SuppressWarnings("unchecked") Constructor<SocketImpl> socketConstructor = (Constructor<SocketImpl>) socketImpClz.getDeclaredConstructor(); socketConstructor.setAccessible(true); return socketConstructor.newInstance(); } catch (InvocationTargetException e) { throw new RuntimeException(e.getCause()); } catch (Throwable e) { throw new RuntimeException(e); } } return new NginxClojureSocketImpl(); } }