Refactor methods accessing binary data
--------------------------------------

                 Key: THRIFT-1039
                 URL: https://issues.apache.org/jira/browse/THRIFT-1039
             Project: Thrift
          Issue Type: Improvement
          Components: Java - Compiler
         Environment: All
            Reporter: Mathias Herberts
            Priority: Minor


Since THRIFT-830, binary fields are implemented using ByteBuffer.

struct A {
  1: binary bin_field,
}

will generate a method 'byte[] getBin_field()' which will optionally resize the 
underlying ByteBuffer so it has a capacity of 'remaining()' and return the 
backing array of this new ByteBuffer.

This has several implications.

First the ByteBuffer in 'bin_field' might be modified, thus misleading users 
into thinking that the call to 'getBin_field()' had no effect on the underlying 
structure.

Thus the following will fail:

byte[] b = new byte[2];
b[0] = 0x01;
A a = new A();
a.setBin_field(ByteBuffer.wrap(b, 0, 1));
byte[] bb = a.getBin_field();
b[0] = 0x02;
Assert.assertEquals(0x02, bb[0]);

Second it creates a singularity in the getters as all other getters involving 
containers of binary data will return collections of ByteBuffer.

I suggest we refactor to something more in the line of what HADOOP-6298 has 
done, i.e. provide a copyBytes() method which copies the bytes in a ByteBuffer 
and returns a correctly sized array.

Such a method could be generated for each structure, with the following 
signature:

public byte[] copyBytes(ByteBuffer b);

This method would basically do what the current 'getBin_field' type methods do 
(allocate a byte array and fill it with the ByteBuffer's data), except it would 
not modify the structure's internal ByteBuffers.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to