Example #1
0
  /**
   * Creates a read-only buffer which disallows any modification operations on the specified {@code
   * buffer}. The new buffer has the same {@code readerIndex} and {@code writerIndex} with the
   * specified {@code buffer}.
   */
  public static ByteBuf unmodifiableBuffer(ByteBuf buffer) {
    ByteOrder endianness = buffer.order();
    if (endianness == BIG_ENDIAN) {
      return new ReadOnlyByteBuf(buffer);
    }

    return new ReadOnlyByteBuf(buffer.order(BIG_ENDIAN)).order(LITTLE_ENDIAN);
  }
 @Test
 public void shouldHaveSameByteOrder() {
   ByteBuf buf = Unpooled.buffer(1);
   assertSame(Unpooled.BIG_ENDIAN, Unpooled.unmodifiableBuffer(buf).order());
   buf = buf.order(LITTLE_ENDIAN);
   assertSame(Unpooled.LITTLE_ENDIAN, Unpooled.unmodifiableBuffer(buf).order());
 }
 @Override
 protected ByteBuf newBuffer(int length) {
   buffer = PooledByteBufAllocator.DEFAULT.directBuffer(length).order(ByteOrder.LITTLE_ENDIAN);
   assertSame(ByteOrder.LITTLE_ENDIAN, buffer.order());
   assertEquals(0, buffer.writerIndex());
   return buffer;
 }
  private int addComponent0(int cIndex, ByteBuf buffer, boolean addedBySelf) {
    checkComponentIndex(cIndex);

    if (buffer == null) {
      throw new NullPointerException("buffer");
    }

    if (buffer instanceof Iterable) {
      @SuppressWarnings("unchecked")
      Iterable<ByteBuf> composite = (Iterable<ByteBuf>) buffer;
      return addComponents0(cIndex, composite);
    }

    int readableBytes = buffer.readableBytes();
    if (readableBytes == 0) {
      return cIndex;
    }

    // No need to consolidate - just add a component to the list.
    Component c = new Component(buffer.order(ByteOrder.BIG_ENDIAN).slice(), addedBySelf);
    if (cIndex == components.size()) {
      components.add(c);
      if (cIndex == 0) {
        c.endOffset = readableBytes;
      } else {
        Component prev = components.get(cIndex - 1);
        c.offset = prev.endOffset;
        c.endOffset = c.offset + readableBytes;
      }
    } else {
      components.add(cIndex, c);
      updateComponentOffsets(cIndex);
    }
    return cIndex;
  }
  @Override
  public void addComponent(int cIndex, ByteBuf buffer) {
    checkComponentIndex(cIndex);

    if (buffer == null) {
      throw new NullPointerException("buffer");
    }

    if (buffer instanceof Iterable) {
      @SuppressWarnings("unchecked")
      Iterable<ByteBuf> composite = (Iterable<ByteBuf>) buffer;
      addComponents(cIndex, composite);
      return;
    }

    int readableBytes = buffer.readableBytes();
    if (readableBytes == 0) {
      return;
    }

    // Consolidate if the number of components will exceed the allowed maximum by the current
    // operation.
    final int numComponents = components.size();
    if (numComponents >= maxNumComponents) {
      final int capacity = components.get(numComponents - 1).endOffset + readableBytes;

      ByteBuf consolidated = buffer.unsafe().newBuffer(capacity);
      for (int i = 0; i < numComponents; i++) {
        ByteBuf b = components.get(i).buf;
        consolidated.writeBytes(b);
        b.unsafe().release();
      }
      consolidated.writeBytes(buffer, buffer.readerIndex(), readableBytes);

      Component c = new Component(consolidated);
      c.endOffset = c.length;
      components.clear();
      components.add(c);
      return;
    }

    // No need to consolidate - just add a component to the list.
    Component c = new Component(buffer.order(ByteOrder.BIG_ENDIAN).slice());
    if (cIndex == components.size()) {
      components.add(c);
      if (cIndex == 0) {
        c.endOffset = readableBytes;
      } else {
        Component prev = components.get(cIndex - 1);
        c.offset = prev.endOffset;
        c.endOffset = c.offset + readableBytes;
      }
    } else {
      components.add(cIndex, c);
      updateComponentOffsets(cIndex);
    }
  }
Example #6
0
  /**
   * Creates a new buffer whose content is a merged copy of the specified {@code buffers}' readable
   * bytes. The new buffer's {@code readerIndex} and {@code writerIndex} are {@code 0} and the sum
   * of all buffers' {@code readableBytes} respectively.
   *
   * @throws IllegalArgumentException if the specified buffers' endianness are different from each
   *     other
   */
  public static ByteBuf copiedBuffer(ByteBuf... buffers) {
    switch (buffers.length) {
      case 0:
        return EMPTY_BUFFER;
      case 1:
        return copiedBuffer(buffers[0]);
    }

    // Merge the specified buffers into one buffer.
    ByteOrder order = null;
    int length = 0;
    for (ByteBuf b : buffers) {
      int bLen = b.readableBytes();
      if (bLen <= 0) {
        continue;
      }
      if (Integer.MAX_VALUE - length < bLen) {
        throw new IllegalArgumentException("The total length of the specified buffers is too big.");
      }
      length += bLen;
      if (order != null) {
        if (!order.equals(b.order())) {
          throw new IllegalArgumentException("inconsistent byte order");
        }
      } else {
        order = b.order();
      }
    }

    if (length == 0) {
      return EMPTY_BUFFER;
    }

    byte[] mergedArray = new byte[length];
    for (int i = 0, j = 0; i < buffers.length; i++) {
      ByteBuf b = buffers[i];
      int bLen = b.readableBytes();
      b.getBytes(b.readerIndex(), mergedArray, j, bLen);
      j += bLen;
    }

    return wrappedBuffer(mergedArray).order(order);
  }
  @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);
  }
Example #8
0
 @Override
 public ByteBuf order(ByteOrder endianness) {
   return buf.order(endianness);
 }
Example #9
0
 @Override
 public ByteOrder order() {
   return buf.order();
 }