View Javadoc

    1   /*
    2    * Copyright 2012 The Netty Project
    3    *
    4    * The Netty Project licenses this file to you under the Apache License,
    5    * version 2.0 (the "License"); you may not use this file except in compliance
    6    * with the License. You may obtain a copy of the License at:
    7    *
    8    *   http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    13   * License for the specific language governing permissions and limitations
    14   * under the License.
    15   */
    16  package org.jboss.netty.example.factorial;
    17
    18  import java.math.BigInteger;
    19
    20  import org.jboss.netty.buffer.ChannelBuffer;
    21  import org.jboss.netty.buffer.ChannelBuffers;
    22  import org.jboss.netty.channel.Channel;
    23  import org.jboss.netty.channel.ChannelHandlerContext;
    24  import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
    25
    26  /**
    27   * Encodes a {@link Number} into the binary representation prepended with
    28   * a magic number ('F' or 0x46) and a 32-bit length prefix.  For example, 42
    29   * will be encoded to { 'F', 0, 0, 0, 1, 42 }.
    30   */
    31  public class NumberEncoder extends OneToOneEncoder {
    32
    33      @Override
    34      protected Object encode(
    35              ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
    36          if (!(msg instanceof Number)) {
    37              // Ignore what this encoder can't encode.
    38              return msg;
    39          }
    40
    41          // Convert to a BigInteger first for easier implementation.
    42          BigInteger v;
    43          if (msg instanceof BigInteger) {
    44              v = (BigInteger) msg;
    45          } else {
    46              v = new BigInteger(String.valueOf(msg));
    47          }
    48
    49          // Convert the number into a byte array.
    50          byte[] data = v.toByteArray();
    51          int dataLength = data.length;
    52
    53          // Construct a message.
    54          ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
    55          buf.writeByte((byte) 'F'); // magic number
    56          buf.writeInt(dataLength);  // data length
    57          buf.writeBytes(data);      // data
    58
    59          // Return the constructed message.
    60          return buf;
    61      }
    62  }