package org.caudexorigo.netty;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.UnpooledByteBufAllocator;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.ServerChannel;
import io.netty.channel.epoll.Epoll;
import io.netty.channel.epoll.EpollDatagramChannel;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.epoll.EpollServerSocketChannel;
import io.netty.channel.epoll.EpollSocketChannel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
public class DefaultNettyContext implements NettyContext
{
private static final DefaultNettyContext instance = new DefaultNettyContext();
private final ByteBufAllocator _allocator;
private final Class<? extends ServerChannel> _serverChannelClass;
private final Class<? extends Channel> _channelClass;
private final Class<? extends DatagramChannel> _datagramChannelClass;
private final EventLoopGroup _bossEventLoopGroup;
private final EventLoopGroup _workerEventLoopGroup;
private DefaultNettyContext()
{
super();
String os_arch = System.getProperty("os.arch");
boolean isARM = contains(os_arch, "arm");
if (isARM)
{
_allocator = UnpooledByteBufAllocator.DEFAULT;
}
else
{
_allocator = PooledByteBufAllocator.DEFAULT;
}
if (Epoll.isAvailable())
{
_bossEventLoopGroup = new EpollEventLoopGroup();
_workerEventLoopGroup = new EpollEventLoopGroup();
_serverChannelClass = EpollServerSocketChannel.class;
_channelClass = EpollSocketChannel.class;
_datagramChannelClass = EpollDatagramChannel.class;
}
else
{
_bossEventLoopGroup = new NioEventLoopGroup();
_workerEventLoopGroup = new NioEventLoopGroup();
_serverChannelClass = NioServerSocketChannel.class;
_channelClass = NioSocketChannel.class;
_datagramChannelClass = NioDatagramChannel.class;
}
}
@Override
public ByteBufAllocator getAllocator()
{
return _allocator;
}
@Override
public Class<? extends ServerChannel> getServerChannelClass()
{
return _serverChannelClass;
}
@Override
public Class<? extends Channel> getChannelClass()
{
return _channelClass;
}
@Override
public EventLoopGroup getBossEventLoopGroup()
{
return _bossEventLoopGroup;
}
@Override
public EventLoopGroup getWorkerEventLoopGroup()
{
return _workerEventLoopGroup;
}
@Override
public Class<? extends DatagramChannel> getDatagramChannelClass()
{
return _datagramChannelClass;
}
private static final boolean contains(String instr, String searchstr)
{
if ((instr != null) && (instr.trim().length() > 0))
{
return instr.contains(searchstr);
}
else
{
return false;
}
}
public static final NettyContext get()
{
return instance;
}
}