public class CoreMessage extends RefCountMessage implements ICoreMessage
Modifier and Type | Field and Description |
---|---|
protected SimpleString |
address |
static int |
BODY_OFFSET |
protected io.netty.buffer.ByteBuf |
buffer
That is the readInto for the whole message, including properties..
|
static int |
BUFFER_HEADER_SPACE |
protected boolean |
durable |
protected int |
endOfBodyPosition |
protected long |
messageID |
protected int |
messageIDPosition |
protected byte |
priority |
protected TypedProperties |
properties |
protected long |
timestamp |
protected byte |
type |
protected ResetLimitWrappedActiveMQBuffer |
writableBuffer |
BYTES_TYPE, DEFAULT_TYPE, EMBEDDED_TYPE, HDR_ACTUAL_EXPIRY_TIME, HDR_BRIDGE_DUPLICATE_ID, HDR_CONTENT_TYPE, HDR_DUPLICATE_DETECTION_ID, HDR_GROUP_ID, HDR_GROUP_SEQUENCE, HDR_LARGE_BODY_SIZE, HDR_LARGE_COMPRESSED, HDR_LAST_VALUE_NAME, HDR_ORIG_MESSAGE_ID, HDR_ORIGINAL_ADDRESS, HDR_ORIGINAL_QUEUE, HDR_PREFIX, HDR_ROUTE_TO_ACK_IDS, HDR_ROUTE_TO_IDS, HDR_ROUTING_TYPE, HDR_SCALEDOWN_TO_IDS, HDR_SCHEDULED_DELIVERY_TIME, HDR_VALIDATED_USER, INTERNAL_PROPERTY_NAMES_PREDICATE, LARGE_EMBEDDED_TYPE, MAP_TYPE, memoryOffset, OBJECT_TYPE, STREAM_TYPE, TEXT_TYPE
Modifier | Constructor and Description |
---|---|
|
CoreMessage() |
protected |
CoreMessage(CoreMessage other) |
|
CoreMessage(CoreMessageObjectPools coreMessageObjectPools) |
protected |
CoreMessage(CoreMessage other,
TypedProperties copyProperties) |
|
CoreMessage(long id,
int bufferSize) |
|
CoreMessage(long id,
int bufferSize,
CoreMessageObjectPools coreMessageObjectPools) |
Modifier and Type | Method and Description |
---|---|
protected void |
checkEncode() |
void |
clearInternalProperties() |
boolean |
containsProperty(SimpleString key) |
boolean |
containsProperty(String key) |
Message |
copy()
It will generate a new instance of the message encode, being a deep copy, new properties, new everything
|
Message |
copy(long newID)
It will generate a new instance of the message encode, being a deep copy, new properties, new everything
|
void |
decodeHeadersAndProperties(io.netty.buffer.ByteBuf buffer) |
CoreMessage |
encode() |
void |
encodeHeadersAndProperties(io.netty.buffer.ByteBuf buffer) |
String |
getAddress() |
SimpleString |
getAddressSimpleString() |
Object |
getAnnotation(SimpleString key)
On core there's no delivery annotation
|
ActiveMQBuffer |
getBodyBuffer()
The body used for this message.
|
int |
getBodyBufferSize()
Returns the length in bytes of the body buffer.
|
InputStream |
getBodyInputStream() |
Boolean |
getBooleanProperty(SimpleString key) |
Boolean |
getBooleanProperty(String key) |
io.netty.buffer.ByteBuf |
getBuffer() |
Byte |
getByteProperty(SimpleString key) |
Byte |
getByteProperty(String key) |
byte[] |
getBytesProperty(SimpleString key) |
byte[] |
getBytesProperty(String key) |
Object |
getCorrelationID() |
ActiveMQBuffer |
getDataBuffer()
This will return the proper buffer to represent the data of the Message.
|
Double |
getDoubleProperty(SimpleString key) |
Double |
getDoubleProperty(String key) |
Object |
getDuplicateProperty() |
int |
getEncodeSize()
Returns the size of the encoded message.
|
int |
getEndOfBodyPosition() |
long |
getExpiration()
Returns the expiration time of this message.
|
Float |
getFloatProperty(SimpleString key) |
Float |
getFloatProperty(String key) |
SimpleString |
getGroupID() |
int |
getGroupSequence() |
int |
getHeadersAndPropertiesEncodeSize() |
Integer |
getIntProperty(SimpleString key) |
Integer |
getIntProperty(String key) |
LargeBodyReader |
getLargeBodyReader() |
SimpleString |
getLastValueProperty() |
Long |
getLongProperty(SimpleString key) |
Long |
getLongProperty(String key) |
int |
getMemoryEstimate() |
long |
getMessageID()
Returns the messageID.
|
Object |
getObjectProperty(SimpleString key) |
Object |
getObjectProperty(String key) |
long |
getPersistentSize()
This is the size of the message when persisted on disk which is used for metrics tracking
Note that even if the message itself is not persisted on disk (ie non-durable) this value is
still used for metrics tracking
If a normal message it will be the encoded message size
If a large message it will be encoded message size + large message body size
|
Persister<Message> |
getPersister() |
int |
getPersistSize() |
byte |
getPriority()
Returns the message priority.
|
TypedProperties |
getProperties()
I am keeping this synchronized as the decode of the Properties is lazy
|
Set<SimpleString> |
getPropertyNames()
Returns all the names of the properties for this message.
|
ActiveMQBuffer |
getReadOnlyBodyBuffer()
Returns a new Buffer slicing the current Body.
|
SimpleString |
getReplyTo() |
RoutingType |
getRoutingType() |
Long |
getScheduledDeliveryTime()
Used to calculate what is the delivery time.
|
Short |
getShortProperty(SimpleString key) |
Short |
getShortProperty(String key) |
SimpleString |
getSimpleStringProperty(SimpleString key) |
SimpleString |
getSimpleStringProperty(String key) |
String |
getStringProperty(SimpleString key) |
String |
getStringProperty(String key) |
long |
getTimestamp() |
byte |
getType()
Return the type of the message
|
UUID |
getUserID()
This represents historically the JMSMessageID.
|
String |
getValidatedUserID() |
boolean |
hasScheduledDeliveryTime()
Search for the existence of the property: an implementor can save
the message to be decoded, if possible.
|
CoreMessage |
initBuffer(int initialMessageBufferSize) |
protected void |
internalSetMessageID(long messageID)
This method serves as a purpose of extension.
|
boolean |
isDurable()
Returns whether this message is durable or not.
|
boolean |
isLargeMessage() |
boolean |
isServerMessage()
We are really interested if this is a LargeServerMessage.
|
void |
messageChanged()
WARNING: Calling this method on a AMQPMessage will allow the non mutable part of the message to be modified.
|
void |
moveHeadersAndProperties(Message msg)
Used on large messages treatment.
|
void |
persist(ActiveMQBuffer targetRecord) |
CoreMessage |
putBooleanProperty(SimpleString key,
boolean value) |
CoreMessage |
putBooleanProperty(String key,
boolean value) |
CoreMessage |
putByteProperty(SimpleString key,
byte value) |
CoreMessage |
putByteProperty(String key,
byte value) |
CoreMessage |
putBytesProperty(SimpleString key,
byte[] value) |
CoreMessage |
putBytesProperty(String key,
byte[] value) |
CoreMessage |
putCharProperty(SimpleString key,
char value) |
CoreMessage |
putCharProperty(String key,
char value) |
CoreMessage |
putDoubleProperty(SimpleString key,
double value) |
CoreMessage |
putDoubleProperty(String key,
double value) |
CoreMessage |
putFloatProperty(SimpleString key,
float value) |
CoreMessage |
putFloatProperty(String key,
float value) |
CoreMessage |
putIntProperty(SimpleString key,
int value) |
CoreMessage |
putIntProperty(String key,
int value) |
CoreMessage |
putLongProperty(SimpleString key,
long value) |
CoreMessage |
putLongProperty(String key,
long value) |
CoreMessage |
putObjectProperty(SimpleString key,
Object value) |
CoreMessage |
putObjectProperty(String key,
Object value) |
CoreMessage |
putShortProperty(SimpleString key,
short value) |
CoreMessage |
putShortProperty(String key,
short value) |
CoreMessage |
putStringProperty(SimpleString key,
SimpleString value) |
CoreMessage |
putStringProperty(SimpleString key,
String value) |
CoreMessage |
putStringProperty(String key,
String value)
Puts a String property in this message.
|
void |
receiveBuffer_1X(io.netty.buffer.ByteBuf buffer)
This will fix the incoming body of 1.x messages
|
void |
receiveBuffer(io.netty.buffer.ByteBuf buffer)
Used to receive this message from an encoded medium buffer
|
void |
reloadPersistence(ActiveMQBuffer record,
CoreMessageObjectPools pools) |
Object |
removeAnnotation(SimpleString key)
On core there's no delivery annotation
|
Object |
removeProperty(SimpleString key) |
Object |
removeProperty(String key) |
boolean |
searchProperty(SimpleString key)
Differently from
containsProperty(SimpleString) , this method can save decoding the message,
performing a search of the key property and falling back to containsProperty(SimpleString)
if not possible or if already decoded. |
void |
sendBuffer_1X(io.netty.buffer.ByteBuf sendBuffer)
Recast the message as an 1.4 message
|
void |
sendBuffer(io.netty.buffer.ByteBuf sendBuffer,
int deliveryCount)
Used to send this message to an encoded medium buffer.
|
CoreMessage |
setAddress(SimpleString address)
This will set the address on CoreMessage.
|
CoreMessage |
setAddress(String address)
Look at
Message.setAddress(SimpleString) for the doc. |
CoreMessage |
setBuffer(io.netty.buffer.ByteBuf buffer)
The buffer will belong to this message, until release is called.
|
Message |
setCorrelationID(Object correlationID) |
CoreMessage |
setDurable(boolean durable)
Sets whether this message is durable or not.
|
CoreMessage |
setExpiration(long expiration)
Sets the expiration of this message.
|
CoreMessage |
setGroupID(SimpleString groupId) |
CoreMessage |
setGroupID(String groupId) |
CoreMessage |
setGroupSequence(int sequence) |
Message |
setLastValueProperty(SimpleString lastValueName) |
CoreMessage |
setMessageID(long messageID) |
CoreMessage |
setPriority(byte priority)
Sets the message priority.
|
CoreMessage |
setReplyTo(SimpleString address) |
Message |
setRoutingType(RoutingType routingType) |
CoreMessage |
setScheduledDeliveryTime(Long time) |
CoreMessage |
setTimestamp(long timestamp) |
CoreMessage |
setType(byte type)
the type of the message
|
CoreMessage |
setUserID(Object uuid) |
CoreMessage |
setUserID(UUID userID) |
CoreMessage |
setValidatedUserID(String validatedUserID) |
CoreMessage |
toCore()
This should make you convert your message into Core format.
|
CoreMessage |
toCore(CoreMessageObjectPools coreMessageObjectPools)
This should make you convert your message into Core format.
|
String |
toString() |
debugRefs, debugString, durableDown, durableUp, getDurableCount, getParentRef, getRefCount, getUsage, refDown, refUp, releaseComplete, setParentRef, usageDown, usageUp
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
toMap
acceptsConsumer, copy, durableDown, durableUp, getAnnotationString, getBrokerProperty, getConnectionID, getDuplicateIDBytes, getDurableCount, getExtraBytesProperty, getObjectPropertyForFilter, getRefCount, getUsage, getWholeMessageSize, isExpired, putExtraBytesProperty, reencode, refDown, referenceOriginalMessage, refUp, rejectConsumer, releaseBuffer, removeExtraBytesProperty, setAnnotation, setBrokerProperty, setConnectionID, toPropertyMap, usageDown, usageUp
public static final int BUFFER_HEADER_SPACE
public static final int BODY_OFFSET
protected io.netty.buffer.ByteBuf buffer
protected volatile ResetLimitWrappedActiveMQBuffer writableBuffer
protected int endOfBodyPosition
protected int messageIDPosition
protected long messageID
protected SimpleString address
protected byte type
protected boolean durable
protected long timestamp
protected byte priority
protected volatile TypedProperties properties
public CoreMessage(CoreMessageObjectPools coreMessageObjectPools)
public CoreMessage()
protected CoreMessage(CoreMessage other)
public CoreMessage(long id, int bufferSize)
public CoreMessage(long id, int bufferSize, CoreMessageObjectPools coreMessageObjectPools)
protected CoreMessage(CoreMessage other, TypedProperties copyProperties)
public Object getAnnotation(SimpleString key)
getAnnotation
in interface Message
public Object removeAnnotation(SimpleString key)
removeAnnotation
in interface Message
public void clearInternalProperties()
clearInternalProperties
in interface Message
public Persister<Message> getPersister()
getPersister
in interface Message
public CoreMessage initBuffer(int initialMessageBufferSize)
public SimpleString getReplyTo()
getReplyTo
in interface Message
public RoutingType getRoutingType()
getRoutingType
in interface Message
public Message setRoutingType(RoutingType routingType)
setRoutingType
in interface Message
public CoreMessage setReplyTo(SimpleString address)
setReplyTo
in interface Message
public void receiveBuffer(io.netty.buffer.ByteBuf buffer)
Message
receiveBuffer
in interface Message
public void receiveBuffer_1X(io.netty.buffer.ByteBuf buffer)
receiveBuffer_1X
in interface ICoreMessage
public ActiveMQBuffer getReadOnlyBodyBuffer()
ICoreMessage
getReadOnlyBodyBuffer
in interface ICoreMessage
public int getBodyBufferSize()
ICoreMessage
getBodyBufferSize
in interface ICoreMessage
public ActiveMQBuffer getDataBuffer()
getDataBuffer
in interface ICoreMessage
public SimpleString getGroupID()
getGroupID
in interface Message
public CoreMessage setGroupID(SimpleString groupId)
setGroupID
in interface Message
public CoreMessage setGroupID(String groupId)
setGroupID
in interface Message
public int getGroupSequence()
getGroupSequence
in interface Message
public CoreMessage setGroupSequence(int sequence)
setGroupSequence
in interface Message
public Object getCorrelationID()
getCorrelationID
in interface Message
public Message setCorrelationID(Object correlationID)
setCorrelationID
in interface Message
public void sendBuffer(io.netty.buffer.ByteBuf sendBuffer, int deliveryCount)
Message
sendBuffer
in interface Message
sendBuffer
- deliveryCount
- Some protocols (AMQP) will have this as part of the message. ignored on corepublic void sendBuffer_1X(io.netty.buffer.ByteBuf sendBuffer)
sendBuffer_1X
in interface ICoreMessage
protected void checkEncode()
public Long getScheduledDeliveryTime()
Message
getScheduledDeliveryTime
in interface Message
public CoreMessage setScheduledDeliveryTime(Long time)
setScheduledDeliveryTime
in interface Message
public InputStream getBodyInputStream()
getBodyInputStream
in interface ICoreMessage
getBodyInputStream
in interface Message
public ActiveMQBuffer getBodyBuffer()
getBodyBuffer
in interface ICoreMessage
getBodyBuffer
in interface Message
public int getEndOfBodyPosition()
getEndOfBodyPosition
in interface ICoreMessage
public void messageChanged()
Message
messageChanged
in interface Message
protected void internalSetMessageID(long messageID)
public void moveHeadersAndProperties(Message msg)
ICoreMessage
moveHeadersAndProperties
in interface ICoreMessage
public Message copy()
Message
public Message copy(long newID)
Message
public long getExpiration()
Message
getExpiration
in interface Message
public long getTimestamp()
getTimestamp
in interface Message
public CoreMessage setTimestamp(long timestamp)
setTimestamp
in interface Message
public long getMessageID()
Message
getMessageID
in interface Message
public byte getPriority()
Message
Values range from 0 (less priority) to 9 (more priority) inclusive.
getPriority
in interface Message
public UUID getUserID()
Message
public CoreMessage setUserID(Object uuid)
public String getValidatedUserID()
getValidatedUserID
in interface Message
public CoreMessage setValidatedUserID(String validatedUserID)
setValidatedUserID
in interface Message
public CoreMessage setMessageID(long messageID)
setMessageID
in interface Message
public CoreMessage setAddress(SimpleString address)
Message
setAddress
in interface Message
public SimpleString getAddressSimpleString()
getAddressSimpleString
in interface Message
public CoreMessage setExpiration(long expiration)
Message
setExpiration
in interface Message
expiration
- expiration timepublic CoreMessage setPriority(byte priority)
Message
Value must be between 0 and 9 inclusive.
setPriority
in interface Message
priority
- the new message prioritypublic CoreMessage setUserID(UUID userID)
public final TypedProperties getProperties()
public int getMemoryEstimate()
getMemoryEstimate
in interface Message
public boolean isServerMessage()
ICoreMessage
isServerMessage
in interface ICoreMessage
public byte getType()
ICoreMessage
getType
in interface ICoreMessage
getType
in interface Message
public CoreMessage setType(byte type)
ICoreMessage
setType
in interface ICoreMessage
setType
in interface Message
public void decodeHeadersAndProperties(io.netty.buffer.ByteBuf buffer)
public CoreMessage encode()
public void encodeHeadersAndProperties(io.netty.buffer.ByteBuf buffer)
public int getHeadersAndPropertiesEncodeSize()
getHeadersAndPropertiesEncodeSize
in interface ICoreMessage
public Object getDuplicateProperty()
getDuplicateProperty
in interface Message
public SimpleString getLastValueProperty()
getLastValueProperty
in interface Message
public Message setLastValueProperty(SimpleString lastValueName)
setLastValueProperty
in interface Message
public int getEncodeSize()
Message
getEncodeSize
in interface Message
public boolean isLargeMessage()
isLargeMessage
in interface Message
public String getAddress()
getAddress
in interface Message
public CoreMessage setAddress(String address)
Message
Message.setAddress(SimpleString)
for the doc.setAddress
in interface Message
public CoreMessage setBuffer(io.netty.buffer.ByteBuf buffer)
Message
public boolean isDurable()
Message
public CoreMessage setDurable(boolean durable)
Message
setDurable
in interface Message
durable
- true
to flag this message as durable, false
elsepublic CoreMessage putBooleanProperty(String key, boolean value)
putBooleanProperty
in interface Message
public CoreMessage putBooleanProperty(SimpleString key, boolean value)
putBooleanProperty
in interface Message
public Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException
getBooleanProperty
in interface Message
ActiveMQPropertyConversionException
public Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException
getBooleanProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putByteProperty(SimpleString key, byte value)
putByteProperty
in interface Message
public CoreMessage putByteProperty(String key, byte value)
putByteProperty
in interface Message
public Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException
getByteProperty
in interface Message
ActiveMQPropertyConversionException
public Byte getByteProperty(String key) throws ActiveMQPropertyConversionException
getByteProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putBytesProperty(SimpleString key, byte[] value)
putBytesProperty
in interface Message
public CoreMessage putBytesProperty(String key, byte[] value)
putBytesProperty
in interface Message
public byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException
getBytesProperty
in interface Message
ActiveMQPropertyConversionException
public byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException
getBytesProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putCharProperty(SimpleString key, char value)
putCharProperty
in interface Message
public CoreMessage putCharProperty(String key, char value)
putCharProperty
in interface Message
public CoreMessage putShortProperty(SimpleString key, short value)
putShortProperty
in interface Message
public CoreMessage putShortProperty(String key, short value)
putShortProperty
in interface Message
public CoreMessage putIntProperty(SimpleString key, int value)
putIntProperty
in interface Message
public CoreMessage putIntProperty(String key, int value)
putIntProperty
in interface Message
public Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException
getIntProperty
in interface Message
ActiveMQPropertyConversionException
public Integer getIntProperty(String key) throws ActiveMQPropertyConversionException
getIntProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putLongProperty(SimpleString key, long value)
putLongProperty
in interface Message
public CoreMessage putLongProperty(String key, long value)
putLongProperty
in interface Message
public Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException
getLongProperty
in interface Message
ActiveMQPropertyConversionException
public Long getLongProperty(String key) throws ActiveMQPropertyConversionException
getLongProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putFloatProperty(SimpleString key, float value)
putFloatProperty
in interface Message
public CoreMessage putFloatProperty(String key, float value)
putFloatProperty
in interface Message
public CoreMessage putDoubleProperty(SimpleString key, double value)
putDoubleProperty
in interface Message
public CoreMessage putDoubleProperty(String key, double value)
putDoubleProperty
in interface Message
public Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException
getDoubleProperty
in interface Message
ActiveMQPropertyConversionException
public Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException
getDoubleProperty
in interface Message
ActiveMQPropertyConversionException
public CoreMessage putStringProperty(SimpleString key, SimpleString value)
putStringProperty
in interface Message
public CoreMessage putStringProperty(SimpleString key, String value)
putStringProperty
in interface Message
public CoreMessage putStringProperty(String key, String value)
Message
putStringProperty
in interface Message
key
- property namevalue
- property valuepublic CoreMessage putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException
putObjectProperty
in interface Message
ActiveMQPropertyConversionException
public Object getObjectProperty(String key)
getObjectProperty
in interface Message
public Object getObjectProperty(SimpleString key)
getObjectProperty
in interface Message
public CoreMessage putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException
putObjectProperty
in interface Message
ActiveMQPropertyConversionException
public Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException
getShortProperty
in interface Message
ActiveMQPropertyConversionException
public Short getShortProperty(String key) throws ActiveMQPropertyConversionException
getShortProperty
in interface Message
ActiveMQPropertyConversionException
public Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException
getFloatProperty
in interface Message
ActiveMQPropertyConversionException
public Float getFloatProperty(String key) throws ActiveMQPropertyConversionException
getFloatProperty
in interface Message
ActiveMQPropertyConversionException
public String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException
getStringProperty
in interface Message
ActiveMQPropertyConversionException
public String getStringProperty(String key) throws ActiveMQPropertyConversionException
getStringProperty
in interface Message
ActiveMQPropertyConversionException
public SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException
getSimpleStringProperty
in interface Message
ActiveMQPropertyConversionException
public SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException
getSimpleStringProperty
in interface Message
ActiveMQPropertyConversionException
public Object removeProperty(SimpleString key)
removeProperty
in interface Message
public Object removeProperty(String key)
removeProperty
in interface Message
public boolean hasScheduledDeliveryTime()
Message
hasScheduledDeliveryTime
in interface Message
public boolean searchProperty(SimpleString key)
containsProperty(SimpleString)
, this method can save decoding the message,
performing a search of the key
property and falling back to containsProperty(SimpleString)
if not possible or if already decoded.public boolean containsProperty(SimpleString key)
containsProperty
in interface Message
public boolean containsProperty(String key)
containsProperty
in interface Message
public Set<SimpleString> getPropertyNames()
Message
getPropertyNames
in interface Message
public LargeBodyReader getLargeBodyReader() throws ActiveMQException
getLargeBodyReader
in interface ICoreMessage
ActiveMQException
public int getPersistSize()
getPersistSize
in interface Message
public void persist(ActiveMQBuffer targetRecord)
public void reloadPersistence(ActiveMQBuffer record, CoreMessageObjectPools pools)
reloadPersistence
in interface Message
public CoreMessage toCore()
Message
public CoreMessage toCore(CoreMessageObjectPools coreMessageObjectPools)
Message
public long getPersistentSize() throws ActiveMQException
Message
getPersistentSize
in interface Message
ActiveMQException
Copyright © 2021 JBoss by Red Hat. All rights reserved.