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;
}