public ProtonCompositeBuffer append()

in protonj2/src/main/java/org/apache/qpid/protonj2/buffer/impl/ProtonCompositeBufferImpl.java [471:519]


    public ProtonCompositeBuffer append(ProtonBuffer buffer) {
        final ProtonBuffer extension = Objects.requireNonNull(buffer, "Buffer to append cannot be null.").transfer();
        if (isClosed()) {
            extension.close();
            throw ProtonBufferUtils.genericBufferIsClosed(this);
        }
        if (extension.isReadOnly() != isReadOnly() && buffers.length > 0) {
            extension.close();
            throw new IllegalArgumentException("Appended buffer read-only state must match this buffers state");
        }

        try {
            ProtonBufferUtils.checkBufferCanGrowTo(capacity, extension.capacity());
        } catch (Exception e) {
            extension.close();
            throw e;
        }

        if (extension.capacity() == 0) {
            extension.close();
            return this;
        }

        if (buffers.length == 0 && !extension.isComposite()) {
            appendBuffer(extension);
            readOnly = extension.isReadOnly();
            readOffset = extension.getReadOffset();
            writeOffset = extension.getWriteOffset();
        } else if (writeOffset == capacity() && extension.getReadOffset() == 0 && !extension.isComposite()) {
            // Either more readable bytes or additional writable space which either way doesn't
            // disrupt this buffer's current state.
            appendBuffer(extension);
            writeOffset += extension.getWriteOffset();
        } else {
            final ProtonBuffer[] appendedChain = buildChainFromBuffers(new ProtonBuffer[] { extension });
            if (appendedChain.length > 0) {
                final ProtonBuffer[] newChain = new ProtonBuffer[appendedChain.length + buffers.length];

                // Fill the new buffer chain
                System.arraycopy(buffers, 0, newChain, 0, buffers.length);
                System.arraycopy(appendedChain, 0, newChain, buffers.length, appendedChain.length);

                buffers = filterCompositeBufferChain(newChain, readOnly);
                fullRecomputeOfChunkIndexAndOffsetValues();
            }
        }

        return this;
    }