private byte[] copyContents(ReadableBuffer buffer) { byte[] copy = new byte[buffer.remaining()]; if (buffer.hasArray()) { System.arraycopy(buffer.array(), buffer.arrayOffset() + buffer.position(), copy, 0, buffer.remaining()); buffer.position(buffer.limit()); } else { buffer.get(copy, 0, buffer.remaining()); } return copy; }
@Override public org.apache.activemq.artemis.api.core.Message copy() { checkBuffer(); ReadableBuffer view = data.duplicate(); byte[] newData = new byte[view.remaining() - (messagePaylodStart - headerEnds)]; view.position(0).limit(headerEnds); view.get(newData, 0, headerEnds); view.clear(); view.position(messagePaylodStart); view.get(newData, headerEnds, view.remaining()); AMQPMessage newEncode = new AMQPMessage(this.messageFormat, newData, extraProperties, coreMessageObjectPools); newEncode.setDurable(isDurable()).setMessageID(this.getMessageID()); return newEncode; }
@Override public void put(ReadableBuffer buffer) { if (buffer.hasArray()) { nettyBuffer.writeBytes(buffer.array(), buffer.arrayOffset(), buffer.remaining()); } else { while (buffer.hasRemaining()) { nettyBuffer.writeByte(buffer.get()); } } } }
void afterSend() { if (_dataView != null) { _dataView.reclaimRead(); if (!_dataView.hasRemaining()) { _dataView = _dataBuffer; } } }
@Override public void put(ReadableBuffer buffer) { buffer.get(this); } }
@Override public void put(ReadableBuffer buffer) { if (buffer.hasArray()) { nettyBuffer.writeBytes(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); } else { nettyBuffer.writeBytes(buffer.byteBuffer()); } } }
final int count; byte encodingCode = buffer.get(); size = buffer.get() & 0xFF; count = buffer.get() & 0xFF; break; case EncodingCodes.MAP32: size = buffer.getInt(); count = buffer.getInt(); break; case EncodingCodes.NULL: if (count > buffer.remaining()) { throw new IllegalArgumentException("Map element count " + count + " is specified to be greater than the " + "amount of data available ("+ buffer.remaining() + ")"); byte code = buffer.get(buffer.position()); switch (code)
private ReadableBuffer createCopyWithoutDeliveryAnnotations() { assert headerEnds != messagePaylodStart; // The original message had delivery annotations and so we must copy into a new // buffer skipping the delivery annotations section as that is not meant to survive // beyond this hop. ReadableBuffer duplicate = data.duplicate(); final ByteBuf result = PooledByteBufAllocator.DEFAULT.heapBuffer(getEncodeSize()); result.writeBytes(duplicate.limit(headerEnds).byteBuffer()); duplicate.clear(); duplicate.position(messagePaylodStart); result.writeBytes(duplicate.byteBuffer()); return new NettyReadable(result); }
@Override public org.apache.activemq.artemis.api.core.Message copy() { ensureDataIsValid(); ReadableBuffer view = data.duplicate().rewind(); byte[] newData = new byte[view.remaining()]; // Copy the full message contents with delivery annotations as they will // be trimmed on send and may become useful on the broker at a later time. view.get(newData); AMQPMessage newEncode = new AMQPMessage(this.messageFormat, newData, extraProperties, coreMessageObjectPools); newEncode.setMessageID(this.getMessageID()); return newEncode; }
@Override public Data readValue() { ReadableBuffer buffer = getDecoder().getBuffer(); byte encodingCode = buffer.get(); int size = 0; switch (encodingCode) { case EncodingCodes.VBIN8: size = buffer.get() & 0xFF; break; case EncodingCodes.VBIN32: size = buffer.getInt(); break; case EncodingCodes.NULL: return new Data(null); default: throw new ProtonException("Expected Binary type but found encoding: " + encodingCode); } if (size > buffer.remaining()) { throw new IllegalArgumentException("Binary data size " + size + " is specified to be greater than the " + "amount of data available ("+ buffer.remaining()+")"); } byte[] data = new byte[size]; buffer.get(data, 0, size); return new Data(new Binary(data)); }
@Override public int getByteBufferRemaining() { return _buffer.remaining(); } }
private synchronized void scanMessageData() { DecoderImpl decoder = TLSEncode.getDecoder(); decoder.setBuffer(data.rewind()); while (data.hasRemaining()) { int constructorPos = data.position(); TypeConstructor<?> constructor = decoder.readConstructor(); if (Header.class.equals(constructor.getTypeClass())) { header = (Header) constructor.readValue(); headerPosition = constructorPos; encodedHeaderSize = data.position(); if (header.getTtl() != null) { expiration = System.currentTimeMillis() + header.getTtl().intValue(); encodedDeliveryAnnotationsSize = data.position() - constructorPos; } else if (MessageAnnotations.class.equals(constructor.getTypeClass())) { messageAnnotationsPosition = constructorPos; remainingBodyPosition = data.hasRemaining() ? data.position() : VALUE_NOT_PRESENT; break; } else { data.rewind();
@SuppressWarnings({ "unchecked", "rawtypes" }) private <T> T scanForMessageSection(int scanStartPosition, Class...targetTypes) { ensureMessageDataScanned(); // In cases where we parsed out enough to know the value is not encoded in the message // we can exit without doing any reads or buffer hopping. if (scanStartPosition == VALUE_NOT_PRESENT) { return null; } ReadableBuffer buffer = data.duplicate().position(0); final DecoderImpl decoder = TLSEncode.getDecoder(); buffer.position(scanStartPosition); T section = null; decoder.setBuffer(buffer); try { while (buffer.hasRemaining()) { TypeConstructor<?> constructor = decoder.readConstructor(); for (Class<?> type : targetTypes) { if (type.equals(constructor.getTypeClass())) { section = (T) constructor.readValue(); return section; } } constructor.skipValue(); } } finally { decoder.setBuffer(null); } return section; }
@Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof ReadableBuffer)) { return false; } ReadableBuffer readable = (ReadableBuffer) other; if (this.remaining() != readable.remaining()) { return false; } return buffer.nioBuffer().equals(readable.byteBuffer()); } }
int sendNoCopy(ReadableBuffer buffer) { int length = buffer.remaining(); if (_dataView == null || !_dataView.hasRemaining()) { _dataView = buffer; } else { consolidateSendBuffers(buffer); } addToTransportWorkList(); return length; }
@Override public Accepted readValue() { DecoderImpl decoder = getDecoder(); byte typeCode = decoder.getBuffer().get(); switch (typeCode) { case EncodingCodes.LIST0: break; case EncodingCodes.LIST8: decoder.getBuffer().get(); decoder.getBuffer().get(); break; case EncodingCodes.LIST32: decoder.getBuffer().getInt(); decoder.getBuffer().getInt(); break; default: throw new DecodeException("Incorrect type found in Accepted type encoding: " + typeCode); } return Accepted.getInstance(); }