/* * 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. */ 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); } }