/*
* Copyright 2012 The Netty Project
*
* The Netty Project licenses this file to you 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 org.greencheek.elasticacheconfig.server;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Handler implementation for the echo server.
*/
@Sharable
public class StringBasedServerHandler extends SimpleChannelInboundHandler<String> {
private final ByteBuf[] msg;
private final TimeUnit delayUnit;
private final long delay;
private final AtomicInteger index = new AtomicInteger(0);
private final boolean sendAll;
public StringBasedServerHandler(String[] msg,TimeUnit unit,long delay, boolean sendAllMessages) {
ByteBuf b;
this.msg = new ByteBuf[msg.length];
for(int i =0;i<msg.length;i++) {
this.msg[i] = createMessage(msg[i]);
}
this.delayUnit = unit;
this.delay = delay;
this.sendAll = sendAllMessages;
}
private ByteBuf createMessage(String message) {
try {
return Unpooled.wrappedBuffer(message.getBytes("UTF-8"));
} catch(UnsupportedEncodingException e) {
return Unpooled.wrappedBuffer(message.getBytes());
}
}
@Override
public void channelRead0(final ChannelHandlerContext ctx, String msg) {
if(sendAll) {
sendAll(ctx);
} else {
sendOne(ctx);
}
}
private void sendAll(final ChannelHandlerContext ctx) {
long delayFor = delay;
for(ByteBuf message : this.msg) {
ByteBuf messageCopy = message.copy();
String messageCopyStr = messageCopy.toString(Charset.forName("UTF-8"));
if (messageCopyStr.contains("${REMOTE_ADDR}")) {
messageCopyStr = messageCopyStr.replace("${REMOTE_ADDR}", ctx.channel().remoteAddress().toString());
}
final ByteBuf messageToSend = stringToByteBuf(messageCopyStr);
if (delay < 1) {
ctx.writeAndFlush(messageToSend);
} else {
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
ctx.writeAndFlush(messageToSend);
}
}, delayFor, delayUnit);
}
delayFor+=delay;
}
}
private void sendOne(final ChannelHandlerContext ctx) {
final ByteBuf message = this.msg[index.getAndIncrement()%this.msg.length];
ByteBuf messageCopy = message.copy();
String messageCopyStr = messageCopy.toString(Charset.forName("UTF-8"));
if(messageCopyStr.contains("${REMOTE_ADDR}")) {
messageCopyStr = messageCopyStr.replace("${REMOTE_ADDR}",ctx.channel().remoteAddress().toString());
}
final ByteBuf messageToSend = stringToByteBuf(messageCopyStr);
if(delay<1) {
ctx.writeAndFlush(messageToSend);
}
else {
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
ctx.writeAndFlush(messageToSend);
}
},delay,delayUnit);
}
}
private ByteBuf stringToByteBuf(String string) {
try {
return Unpooled.wrappedBuffer(string.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
return Unpooled.wrappedBuffer(string.getBytes());
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// Close the connection when an exception is raised.
cause.printStackTrace();
ctx.close();
}
}