Example usage for org.apache.thrift.protocol TBinaryProtocol readI32

List of usage examples for org.apache.thrift.protocol TBinaryProtocol readI32

Introduction

In this page you can find the example usage for org.apache.thrift.protocol TBinaryProtocol readI32.

Prototype

@Override
    public int readI32() throws TException 

Source Link

Usage

From source file:com.alibaba.dubbo.rpc.protocol.thrift.ThriftCodec.java

License:Open Source License

public Object decode(Channel channel, InputStream input) throws IOException {

    int available = input.available();

    if (available < MESSAGE_SHORTEST_LENGTH) {

        return Codec.NEED_MORE_INPUT;

    } else {//from  www.  ja  va2 s  .c om

        TIOStreamTransport transport = new TIOStreamTransport(input);

        TBinaryProtocol protocol = new TBinaryProtocol(transport);

        short magic;
        int messageLength;

        try {
            //                protocol.readI32(); // skip the first message length
            byte[] bytes = new byte[4];
            transport.read(bytes, 0, 4);
            magic = protocol.readI16();
            messageLength = protocol.readI32();

        } catch (TException e) {
            throw new IOException(e.getMessage(), e);
        }

        if (MAGIC != magic) {
            throw new IOException(new StringBuilder(32).append("Unknown magic code ").append(magic).toString());
        }

        if (available < messageLength) {
            return NEED_MORE_INPUT;
        }

        return decode(protocol);

    }

}

From source file:com.alibaba.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Open Source License

@Test
public void testEncodeRequest() throws Exception {

    Request request = createRequest();

    ByteArrayOutputStream output = new ByteArrayOutputStream(1024);

    codec.encode(channel, output, request);

    byte[] bytes = output.toByteArray();

    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

    TTransport transport = new TIOStreamTransport(bis);

    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    // frame//from w w w.j a  va  2 s .c  om
    byte[] length = new byte[4];
    transport.read(length, 0, 4);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    // magic
    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());

    // message length
    int messageLength = protocol.readI32();
    Assert.assertEquals(messageLength + 4, bytes.length);

    // header length
    short headerLength = protocol.readI16();
    // version
    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    // service name
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    // dubbo request id
    Assert.assertEquals(request.getId(), protocol.readI64());

    // test message header length
    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();

    Demo.echoString_args args = new Demo.echoString_args();

    args.read(protocol);

    protocol.readMessageEnd();

    Assert.assertEquals("echoString", message.name);

    Assert.assertEquals(TMessageType.CALL, message.type);

    Assert.assertEquals("Hello, World!", args.getArg());

}

From source file:com.alibaba.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Open Source License

@Test
public void testEncodeReplyResponse() throws Exception {

    URL url = URL.valueOf(ThriftProtocol.NAME + "://127.0.0.1:40880/" + Demo.Iface.class.getName());

    Channel channel = new MockedChannel(url);

    Request request = createRequest();

    RpcResult rpcResult = new RpcResult();
    rpcResult.setResult("Hello, World!");

    Response response = new Response();
    response.setResult(rpcResult);// w w  w.  j a v a2 s  .  com
    response.setId(request.getId());
    RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);

    ThriftCodec.RequestData rd = ThriftCodec.RequestData.create(ThriftCodec.getSeqId(),
            Demo.Iface.class.getName(), "echoString");
    ThriftCodec.cachedRequest.putIfAbsent(request.getId(), rd);
    codec.encode(channel, bos, response);

    byte[] buf = new byte[bos.size() - 4];
    System.arraycopy(bos.toByteArray(), 4, buf, 0, bos.size() - 4);

    ByteArrayInputStream bis = new ByteArrayInputStream(buf);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    TIOStreamTransport transport = new TIOStreamTransport(bis);
    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());
    Assert.assertEquals(protocol.readI32() + 4, bos.toByteArray().length);
    int headerLength = protocol.readI16();

    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    Assert.assertEquals(request.getId(), protocol.readI64());

    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();
    Assert.assertEquals("echoString", message.name);
    Assert.assertEquals(TMessageType.REPLY, message.type);
    Assert.assertEquals(ThriftCodec.getSeqId(), message.seqid);
    Demo.echoString_result result = new Demo.echoString_result();
    result.read(protocol);
    protocol.readMessageEnd();

    Assert.assertEquals(rpcResult.getResult(), result.getSuccess());
}

From source file:com.alibaba.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Open Source License

@Test
public void testEncodeExceptionResponse() throws Exception {

    URL url = URL.valueOf(ThriftProtocol.NAME + "://127.0.0.1:40880/" + Demo.Iface.class.getName());

    Channel channel = new MockedChannel(url);

    Request request = createRequest();

    RpcResult rpcResult = new RpcResult();
    String exceptionMessage = "failed";
    rpcResult.setException(new RuntimeException(exceptionMessage));

    Response response = new Response();
    response.setResult(rpcResult);/*  w  w  w.ja  v  a 2  s.c  o  m*/
    response.setId(request.getId());
    RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);

    ThriftCodec.RequestData rd = ThriftCodec.RequestData.create(ThriftCodec.getSeqId(),
            Demo.Iface.class.getName(), "echoString");
    ThriftCodec.cachedRequest.put(request.getId(), rd);
    codec.encode(channel, bos, response);

    byte[] buf = new byte[bos.size() - 4];
    System.arraycopy(bos.toByteArray(), 4, buf, 0, bos.size() - 4);
    ByteArrayInputStream bis = new ByteArrayInputStream(buf);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    TIOStreamTransport transport = new TIOStreamTransport(bis);
    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());
    Assert.assertEquals(protocol.readI32() + 4, bos.toByteArray().length);
    int headerLength = protocol.readI16();

    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    Assert.assertEquals(request.getId(), protocol.readI64());

    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();
    Assert.assertEquals("echoString", message.name);
    Assert.assertEquals(TMessageType.EXCEPTION, message.type);
    Assert.assertEquals(ThriftCodec.getSeqId(), message.seqid);
    TApplicationException exception = TApplicationException.read(protocol);
    protocol.readMessageEnd();

    Assert.assertEquals(exceptionMessage, exception.getMessage());

}

From source file:org.apache.dubbo.rpc.protocol.thrift.ThriftCodec.java

License:Apache License

@Override
public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {

    int available = buffer.readableBytes();

    if (available < MESSAGE_SHORTEST_LENGTH) {

        return DecodeResult.NEED_MORE_INPUT;

    } else {//w  w  w  .  jav  a 2 s  .c o  m

        TIOStreamTransport transport = new TIOStreamTransport(new ChannelBufferInputStream(buffer));

        TBinaryProtocol protocol = new TBinaryProtocol(transport);

        short magic;
        int messageLength;

        try {
            //                protocol.readI32(); // skip the first message length
            byte[] bytes = new byte[4];
            transport.read(bytes, 0, 4);
            magic = protocol.readI16();
            messageLength = protocol.readI32();

        } catch (TException e) {
            throw new IOException(e.getMessage(), e);
        }

        if (MAGIC != magic) {
            throw new IOException("Unknown magic code " + magic);
        }

        if (available < messageLength) {
            return DecodeResult.NEED_MORE_INPUT;
        }

        return decode(protocol);

    }

}

From source file:org.apache.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Apache License

@Test
public void testEncodeRequest() throws Exception {

    Request request = createRequest();

    ChannelBuffer output = ChannelBuffers.dynamicBuffer(1024);

    codec.encode(channel, output, request);

    byte[] bytes = new byte[output.readableBytes()];
    output.readBytes(bytes);/*from w  w  w  . j  av  a 2s.  c o m*/

    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

    TTransport transport = new TIOStreamTransport(bis);

    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    // frame
    byte[] length = new byte[4];
    transport.read(length, 0, 4);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    // magic
    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());

    // message length
    int messageLength = protocol.readI32();
    Assert.assertEquals(messageLength + 4, bytes.length);

    // header length
    short headerLength = protocol.readI16();
    // version
    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    // service name
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    // dubbo request id
    Assert.assertEquals(request.getId(), protocol.readI64());

    // test message header length
    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();

    Demo.echoString_args args = new Demo.echoString_args();

    args.read(protocol);

    protocol.readMessageEnd();

    Assert.assertEquals("echoString", message.name);

    Assert.assertEquals(TMessageType.CALL, message.type);

    Assert.assertEquals("Hello, World!", args.getArg());

}

From source file:org.apache.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Apache License

@Test
public void testEncodeReplyResponse() throws Exception {

    URL url = URL.valueOf(ThriftProtocol.NAME + "://127.0.0.1:40880/" + Demo.Iface.class.getName());

    Channel channel = new MockedChannel(url);

    Request request = createRequest();

    RpcResult rpcResult = new RpcResult();
    rpcResult.setResult("Hello, World!");

    Response response = new Response();
    response.setResult(rpcResult);//  ww  w  .  ja v a2 s.  com
    response.setId(request.getId());
    ChannelBuffer bos = ChannelBuffers.dynamicBuffer(1024);

    ThriftCodec.RequestData rd = ThriftCodec.RequestData.create(ThriftCodec.getSeqId(),
            Demo.Iface.class.getName(), "echoString");
    ThriftCodec.cachedRequest.putIfAbsent(request.getId(), rd);
    codec.encode(channel, bos, response);

    byte[] buf = new byte[bos.writerIndex() - 4];
    System.arraycopy(bos.array(), 4, buf, 0, bos.writerIndex() - 4);

    ByteArrayInputStream bis = new ByteArrayInputStream(buf);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    TIOStreamTransport transport = new TIOStreamTransport(bis);
    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());
    Assert.assertEquals(protocol.readI32() + 4, bos.writerIndex());
    int headerLength = protocol.readI16();

    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    Assert.assertEquals(request.getId(), protocol.readI64());

    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();
    Assert.assertEquals("echoString", message.name);
    Assert.assertEquals(TMessageType.REPLY, message.type);
    Assert.assertEquals(ThriftCodec.getSeqId(), message.seqid);
    Demo.echoString_result result = new Demo.echoString_result();
    result.read(protocol);
    protocol.readMessageEnd();

    Assert.assertEquals(rpcResult.getValue(), result.getSuccess());
}

From source file:org.apache.dubbo.rpc.protocol.thrift.ThriftCodecTest.java

License:Apache License

@Test
public void testEncodeExceptionResponse() throws Exception {

    URL url = URL.valueOf(ThriftProtocol.NAME + "://127.0.0.1:40880/" + Demo.Iface.class.getName());

    Channel channel = new MockedChannel(url);

    Request request = createRequest();

    RpcResult rpcResult = new RpcResult();
    String exceptionMessage = "failed";
    rpcResult.setException(new RuntimeException(exceptionMessage));

    Response response = new Response();
    response.setResult(rpcResult);/*from   www  .jav a  2 s  . c o m*/
    response.setId(request.getId());
    ChannelBuffer bos = ChannelBuffers.dynamicBuffer(1024);

    ThriftCodec.RequestData rd = ThriftCodec.RequestData.create(ThriftCodec.getSeqId(),
            Demo.Iface.class.getName(), "echoString");
    ThriftCodec.cachedRequest.put(request.getId(), rd);
    codec.encode(channel, bos, response);

    byte[] buf = new byte[bos.writerIndex() - 4];
    System.arraycopy(bos.array(), 4, buf, 0, bos.writerIndex() - 4);
    ByteArrayInputStream bis = new ByteArrayInputStream(buf);

    if (bis.markSupported()) {
        bis.mark(0);
    }

    TIOStreamTransport transport = new TIOStreamTransport(bis);
    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    Assert.assertEquals(ThriftCodec.MAGIC, protocol.readI16());
    Assert.assertEquals(protocol.readI32() + 4, bos.writerIndex());
    int headerLength = protocol.readI16();

    Assert.assertEquals(ThriftCodec.VERSION, protocol.readByte());
    Assert.assertEquals(Demo.Iface.class.getName(), protocol.readString());
    Assert.assertEquals(request.getId(), protocol.readI64());

    if (bis.markSupported()) {
        bis.reset();
        bis.skip(headerLength);
    }

    TMessage message = protocol.readMessageBegin();
    Assert.assertEquals("echoString", message.name);
    Assert.assertEquals(TMessageType.EXCEPTION, message.type);
    Assert.assertEquals(ThriftCodec.getSeqId(), message.seqid);
    TApplicationException exception = TApplicationException.read(protocol);
    protocol.readMessageEnd();

    Assert.assertEquals(exceptionMessage, exception.getMessage());

}

From source file:zipkin.reporter.libthrift.InternalScribeCodec.java

License:Apache License

static boolean parseResponse(TBinaryProtocol iprot) throws TException {
    iprot.readStructBegin();//from  w  ww  .  ja v a2 s .c  o m
    TField schemeField;
    while ((schemeField = iprot.readFieldBegin()).type != TType.STOP) {
        if (schemeField.id == 0 /* SUCCESS */ && schemeField.type == TType.I32) {
            return iprot.readI32() == 0;
        } else {
            TProtocolUtil.skip(iprot, schemeField.type);
        }
    }
    throw new TApplicationException(MISSING_RESULT, "Log failed: unknown result");
}