/**
* Copyright 2014 Ricardo Padilha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.dsys.snio.impl.channel;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.annotation.Nonnull;
import javax.net.ssl.SSLContext;
import net.dsys.commons.api.lang.BinaryUnit;
import net.dsys.commons.api.lang.Factory;
import net.dsys.snio.api.buffer.MessageBufferConsumer;
import net.dsys.snio.api.buffer.MessageBufferProvider;
import net.dsys.snio.api.channel.MessageServerChannel;
import net.dsys.snio.api.codec.MessageCodec;
import net.dsys.snio.api.limit.RateLimiter;
import net.dsys.snio.api.pool.KeyAcceptor;
import net.dsys.snio.api.pool.SelectorPool;
import net.dsys.snio.impl.channel.builder.ChannelConfig;
import net.dsys.snio.impl.channel.builder.SSLConfig;
import net.dsys.snio.impl.channel.builder.ServerConfig;
/**
* Helper class to create {@link MessageServerChannel} instances.
*
* @author Ricardo Padilha
*/
public final class MessageServerChannels {
private MessageServerChannels() {
// no instantiation
}
@Nonnull
public static MessageServerChannel<ByteBuffer> openTCPServerChannel(
@Nonnull final ChannelConfig<ByteBuffer> common,
@Nonnull final ServerConfig server) throws IOException {
if (common == null) {
throw new NullPointerException("common == null");
}
if (server == null) {
throw new NullPointerException("server == null");
}
final Factory<MessageCodec> codecs = server.getMessageCodecs();
final Factory<RateLimiter> limiters = server.getRateLimiters();
final Factory<ByteBuffer> factory = common.getFactory(codecs.newInstance().getBodyLength());
final Factory<MessageBufferProvider<ByteBuffer>> provider = common.getProviderFactory(factory);
final SelectorPool pool = common.getPool();
final KeyAcceptor<ByteBuffer> acceptor = new TCPAcceptor(pool, codecs, limiters, provider,
common.getSendBufferSize(), common.getReceiveBufferSize());
final TCPServerChannel<ByteBuffer> channel = new TCPServerChannel<>(pool, acceptor);
channel.open();
return channel;
}
@Nonnull
public static MessageServerChannel<ByteBuffer> openSSLServerChannel(
@Nonnull final ChannelConfig<ByteBuffer> common,
@Nonnull final ServerConfig server,
@Nonnull final SSLConfig ssl) throws IOException {
if (common == null) {
throw new NullPointerException("common == null");
}
if (server == null) {
throw new NullPointerException("server == null");
}
if (ssl == null) {
throw new NullPointerException("ssl == null");
}
final Factory<MessageCodec> codecs = server.getMessageCodecs();
final Factory<RateLimiter> limiters = server.getRateLimiters();
final Factory<ByteBuffer> factory = common.getFactory(codecs.newInstance().getBodyLength());
final Factory<MessageBufferProvider<ByteBuffer>> provider = common.getProviderFactory(factory);
final SelectorPool pool = common.getPool();
final KeyAcceptor<ByteBuffer> acceptor = new SSLAcceptor(pool, codecs, limiters, provider,
common.getSendBufferSize(), common.getReceiveBufferSize(), ssl.getContext());
final TCPServerChannel<ByteBuffer> channel = new TCPServerChannel<>(pool, acceptor);
channel.open();
return channel;
}
public static TCPServerChannelBuilder newTCPServerChannel() {
return new TCPServerChannelBuilder();
}
public static SSLServerChannelBuilder newSSLServerChannel() {
return new SSLServerChannelBuilder();
}
/**
* @author Ricardo Padilha
*/
public static final class TCPServerChannelBuilder {
private final ChannelConfig<ByteBuffer> common;
private final ServerConfig server;
TCPServerChannelBuilder() {
this.common = new ChannelConfig<>();
this.server = new ServerConfig();
}
/**
* @see ChannelConfig#setPool(SelectorPool)
*/
public TCPServerChannelBuilder setPool(final SelectorPool pool) {
common.setPool(pool);
return this;
}
/**
* @see ChannelConfig#setBufferCapacity(int)
*/
public TCPServerChannelBuilder setBufferCapacity(final int capacity) {
common.setBufferCapacity(capacity);
return this;
}
/**
* @see ChannelConfig#setSendBufferSize(int)
*/
public TCPServerChannelBuilder setSendBufferSize(final int sendBufferSize) {
common.setSendBufferSize(sendBufferSize);
return this;
}
/**
* @see ChannelConfig#setReceiveBufferSize(int)
*/
public TCPServerChannelBuilder setReceiveBufferSize(final int receiveBufferSize) {
common.setReceiveBufferSize(receiveBufferSize);
return this;
}
/**
* @see ChannelConfig#useDirectBuffer()
*/
public TCPServerChannelBuilder useDirectBuffer() {
common.useDirectBuffer();
return this;
}
/**
* @see ChannelConfig#useHeapBuffer()
*/
public TCPServerChannelBuilder useHeapBuffer() {
common.useHeapBuffer();
return this;
}
/**
* @see ChannelConfig#useRingBuffer()
*/
public TCPServerChannelBuilder useRingBuffer() {
common.useRingBuffer();
return this;
}
/**
* @see ChannelConfig#useBlockingQueue()
*/
public TCPServerChannelBuilder useBlockingQueue() {
common.useBlockingQueue();
return this;
}
/**
* @see ChannelConfig#useSingleInputBuffer()
*/
public TCPServerChannelBuilder useSingleInputBuffer() {
common.useSingleInputBuffer();
return this;
}
/**
* @see ChannelConfig#useSingleInputBuffer(net.dsys.snio.api.buffer.MessageBufferConsumer)
*/
public TCPServerChannelBuilder useSingleInputBuffer(final MessageBufferConsumer<ByteBuffer> consumer) {
common.useSingleInputBuffer(consumer);
return this;
}
/**
* @see ChannelConfig#useMultipleInputBuffers()
*/
public TCPServerChannelBuilder useMultipleInputBuffers() {
common.useMultipleInputBuffers();
return this;
}
/**
* @see ServerConfig#setMessageCodec(Factory)
*/
public TCPServerChannelBuilder setMessageCodec(final Factory<MessageCodec> codecs) {
server.setMessageCodec(codecs);
return this;
}
/**
* @see ServerConfig#setMessageLength(int)
*/
public TCPServerChannelBuilder setMessageLength(final int length) {
server.setMessageLength(length);
return this;
}
/**
* @see ServerConfig#setRateLimiter(Factory)
*/
public TCPServerChannelBuilder setRateLimiter(final Factory<RateLimiter> limiters) {
server.setRateLimiter(limiters);
return this;
}
/**
* @see ServerConfig#setRateLimit(long, BinaryUnit)
*/
public TCPServerChannelBuilder setRateLimit(final long value, final BinaryUnit unit) {
server.setRateLimit(value, unit);
return this;
}
public MessageServerChannel<ByteBuffer> open() throws IOException {
return openTCPServerChannel(common, server);
}
}
/**
* @author Ricardo Padilha
*/
public static final class SSLServerChannelBuilder {
private final ChannelConfig<ByteBuffer> common;
private final ServerConfig server;
private final SSLConfig ssl;
SSLServerChannelBuilder() {
this.common = new ChannelConfig<>();
this.server = new ServerConfig();
this.ssl = new SSLConfig();
}
/**
* @see ChannelConfig#setPool(SelectorPool)
*/
public SSLServerChannelBuilder setPool(final SelectorPool pool) {
common.setPool(pool);
return this;
}
/**
* @see ChannelConfig#setBufferCapacity(int)
*/
public SSLServerChannelBuilder setBufferCapacity(final int capacity) {
common.setBufferCapacity(capacity);
return this;
}
/**
* @see ChannelConfig#setSendBufferSize(int)
*/
public SSLServerChannelBuilder setSendBufferSize(final int sendBufferSize) {
common.setSendBufferSize(sendBufferSize);
return this;
}
/**
* @see ChannelConfig#setReceiveBufferSize(int)
*/
public SSLServerChannelBuilder setReceiveBufferSize(final int receiveBufferSize) {
common.setReceiveBufferSize(receiveBufferSize);
return this;
}
/**
* @see ChannelConfig#useDirectBuffer()
*/
public SSLServerChannelBuilder useDirectBuffer() {
common.useDirectBuffer();
return this;
}
/**
* @see ChannelConfig#useHeapBuffer()
*/
public SSLServerChannelBuilder useHeapBuffer() {
common.useHeapBuffer();
return this;
}
/**
* @see ChannelConfig#useRingBuffer()
*/
public SSLServerChannelBuilder useRingBuffer() {
common.useRingBuffer();
return this;
}
/**
* @see ChannelConfig#useBlockingQueue()
*/
public SSLServerChannelBuilder useBlockingQueue() {
common.useBlockingQueue();
return this;
}
/**
* @see ChannelConfig#useSingleInputBuffer()
*/
public SSLServerChannelBuilder useSingleInputBuffer() {
common.useSingleInputBuffer();
return this;
}
/**
* @see ChannelConfig#useSingleInputBuffer(net.dsys.snio.api.buffer.MessageBufferConsumer)
*/
public SSLServerChannelBuilder useSingleInputBuffer(final MessageBufferConsumer<ByteBuffer> consumer) {
common.useSingleInputBuffer(consumer);
return this;
}
/**
* @see ChannelConfig#useMultipleInputBuffers()
*/
public SSLServerChannelBuilder useMultipleInputBuffers() {
common.useMultipleInputBuffers();
return this;
}
/**
* @see ServerConfig#setMessageCodec(Factory)
*/
public SSLServerChannelBuilder setMessageCodec(final Factory<MessageCodec> codecs) {
server.setMessageCodec(codecs);
return this;
}
/**
* @see ServerConfig#setMessageLength(int)
*/
public SSLServerChannelBuilder setMessageLength(final int length) {
server.setMessageLength(length);
return this;
}
/**
* @see ServerConfig#setRateLimiter(Factory)
*/
public SSLServerChannelBuilder setRateLimiter(final Factory<RateLimiter> limiters) {
server.setRateLimiter(limiters);
return this;
}
/**
* @see ServerConfig#setRateLimit(long, BinaryUnit)
*/
public SSLServerChannelBuilder setRateLimit(final long value, final BinaryUnit unit) {
server.setRateLimit(value, unit);
return this;
}
/**
* @see SSLConfig#setContext(SSLContext)
*/
public SSLServerChannelBuilder setContext(final SSLContext context) {
ssl.setContext(context);
return this;
}
public MessageServerChannel<ByteBuffer> open() throws IOException {
return openSSLServerChannel(common, server, ssl);
}
}
}