private static boolean isAvailable(String packageName, String classPrefix) { try { Class<?> clazz = loadClass(Object.class, packageName, classPrefix, null); return invokeIsAvailable(clazz); } catch (ClassNotFoundException e) { LOGGER.debug("{} was not found", packageName); return false; } catch (Exception e) { LOGGER.debug("{} failed to load", packageName, e); return false; } }
NativeTransport(String packageName, String classPrefix) { String property = "ratpack." + classPrefix.toLowerCase() + ".disable"; boolean disabled = Boolean.getBoolean(property); if (disabled || !isAvailable(packageName, classPrefix)) { this.impl = null; } else { this.impl = loadImpl(packageName, classPrefix); } }
private static Transport determineTransport() { Transport transport = new NativeTransport("io.netty.channel.epoll", "Epoll"); if (transport.isAvailable()) { LOGGER.debug("Using epoll transport"); return transport; } transport = new NativeTransport("io.netty.channel.kqueue", "KQueue"); if (transport.isAvailable()) { LOGGER.debug("Using kqueue transport"); return transport; } LOGGER.debug("Using nio transport"); return new NioTransport(); }
private static NativeTransportImpl loadImpl(String packageName, String classPrefix) { try { Class<? extends ServerSocketChannel> serverSocketChannelClass = loadClass(ServerSocketChannel.class, packageName, classPrefix, ServerSocketChannel.class.getSimpleName()); Class<? extends SocketChannel> socketChannelClass = loadClass(SocketChannel.class, packageName, classPrefix, SocketChannel.class.getSimpleName()); Class<? extends EventLoopGroup> eventLoopGroupClass = loadClass(EventLoopGroup.class, packageName, classPrefix, EventLoopGroup.class.getSimpleName()); Constructor<? extends EventLoopGroup> constructor = eventLoopGroupClass.getConstructor(int.class, ThreadFactory.class); return new NativeTransportImpl(serverSocketChannelClass, socketChannelClass, constructor); } catch (ReflectiveOperationException e) { LOGGER.debug("Failed to load {}", classPrefix, e); return null; } }