private static ByteBuffer toNioBuffer(ByteBuf buf, int index, int length) {
   if (buf.nioBufferCount() == 1) {
     return buf.nioBuffer(index, length);
   } else {
     return buf.copy(index, length).nioBuffer(0, length);
   }
 }
  @Override
  public ByteBuffer[] nioBuffers(int index, int length) {
    if (index + length > capacity()) {
      throw new IndexOutOfBoundsException(
          "Too many bytes to convert - Needs" + (index + length) + ", maximum is " + capacity());
    }
    if (index < 0) {
      throw new IndexOutOfBoundsException("index must be >= 0");
    }
    if (length == 0) {
      return EMPTY_NIOBUFFERS;
    }
    int componentId = toComponentIndex(index);

    List<ByteBuffer> buffers = new ArrayList<ByteBuffer>(components.size());

    int i = componentId;
    while (length > 0) {
      Component c = components.get(i);
      ByteBuf s = c.buf;
      int adjustment = c.offset;
      int localLength = Math.min(length, s.capacity() - (index - adjustment));
      buffers.add(s.nioBuffer(index - adjustment, localLength));
      index += localLength;
      length -= localLength;
      i++;
    }

    return buffers.toArray(new ByteBuffer[buffers.size()]);
  }
  @Test
  public void shouldForwardReadCallsBlindly() throws Exception {
    ByteBuf buf = createStrictMock(ByteBuf.class);
    expect(buf.order()).andReturn(BIG_ENDIAN).anyTimes();
    expect(buf.maxCapacity()).andReturn(65536).anyTimes();
    expect(buf.readerIndex()).andReturn(0).anyTimes();
    expect(buf.writerIndex()).andReturn(0).anyTimes();
    expect(buf.capacity()).andReturn(0).anyTimes();

    expect(buf.getBytes(1, (GatheringByteChannel) null, 2)).andReturn(3);
    expect(buf.getBytes(4, (OutputStream) null, 5)).andReturn(buf);
    expect(buf.getBytes(6, (byte[]) null, 7, 8)).andReturn(buf);
    expect(buf.getBytes(9, (ByteBuf) null, 10, 11)).andReturn(buf);
    expect(buf.getBytes(12, (ByteBuffer) null)).andReturn(buf);
    expect(buf.getByte(13)).andReturn(Byte.valueOf((byte) 14));
    expect(buf.getShort(15)).andReturn(Short.valueOf((short) 16));
    expect(buf.getUnsignedMedium(17)).andReturn(18);
    expect(buf.getInt(19)).andReturn(20);
    expect(buf.getLong(21)).andReturn(22L);

    ByteBuffer bb = ByteBuffer.allocate(100);

    expect(buf.nioBuffer(23, 24)).andReturn(bb);
    expect(buf.capacity()).andReturn(27);

    replay(buf);

    ByteBuf roBuf = unmodifiableBuffer(buf);
    assertEquals(3, roBuf.getBytes(1, (GatheringByteChannel) null, 2));
    roBuf.getBytes(4, (OutputStream) null, 5);
    roBuf.getBytes(6, (byte[]) null, 7, 8);
    roBuf.getBytes(9, (ByteBuf) null, 10, 11);
    roBuf.getBytes(12, (ByteBuffer) null);
    assertEquals((byte) 14, roBuf.getByte(13));
    assertEquals((short) 16, roBuf.getShort(15));
    assertEquals(18, roBuf.getUnsignedMedium(17));
    assertEquals(20, roBuf.getInt(19));
    assertEquals(22L, roBuf.getLong(21));

    ByteBuffer roBB = roBuf.nioBuffer(23, 24);
    assertEquals(100, roBB.capacity());
    assertTrue(roBB.isReadOnly());

    assertEquals(27, roBuf.capacity());

    verify(buf);
  }
Exemple #4
0
 @Override
 public ByteBuffer nioBuffer(int index, int length) {
   return buf.nioBuffer(index, length);
 }
Exemple #5
0
 @Override
 public ByteBuffer nioBuffer() {
   return buf.nioBuffer();
 }