/*
 * Copyright 2016 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 io.netty.example.redis;

import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.CodecException;
import io.netty.handler.codec.redis.ArrayRedisMessage;
import io.netty.handler.codec.redis.ErrorRedisMessage;
import io.netty.handler.codec.redis.FullBulkStringRedisMessage;
import io.netty.handler.codec.redis.IntegerRedisMessage;
import io.netty.handler.codec.redis.RedisMessage;
import io.netty.handler.codec.redis.SimpleStringRedisMessage;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

import java.util.ArrayList;
import java.util.List;

An example Redis client handler. This handler read input from STDIN and write output to STDOUT.
/** * An example Redis client handler. This handler read input from STDIN and write output to STDOUT. */
public class RedisClientHandler extends ChannelDuplexHandler { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { String[] commands = ((String) msg).split("\\s+"); List<RedisMessage> children = new ArrayList<RedisMessage>(commands.length); for (String cmdString : commands) { children.add(new FullBulkStringRedisMessage(ByteBufUtil.writeUtf8(ctx.alloc(), cmdString))); } RedisMessage request = new ArrayRedisMessage(children); ctx.write(request, promise); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { RedisMessage redisMessage = (RedisMessage) msg; printAggregatedRedisResponse(redisMessage); ReferenceCountUtil.release(redisMessage); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { System.err.print("exceptionCaught: "); cause.printStackTrace(System.err); ctx.close(); } private static void printAggregatedRedisResponse(RedisMessage msg) { if (msg instanceof SimpleStringRedisMessage) { System.out.println(((SimpleStringRedisMessage) msg).content()); } else if (msg instanceof ErrorRedisMessage) { System.out.println(((ErrorRedisMessage) msg).content()); } else if (msg instanceof IntegerRedisMessage) { System.out.println(((IntegerRedisMessage) msg).value()); } else if (msg instanceof FullBulkStringRedisMessage) { System.out.println(getString((FullBulkStringRedisMessage) msg)); } else if (msg instanceof ArrayRedisMessage) { for (RedisMessage child : ((ArrayRedisMessage) msg).children()) { printAggregatedRedisResponse(child); } } else { throw new CodecException("unknown message type: " + msg); } } private static String getString(FullBulkStringRedisMessage msg) { if (msg.isNull()) { return "(null)"; } return msg.content().toString(CharsetUtil.UTF_8); } }