Skip to main content

rocketmq_common/common/message/
message_ext_broker_inner.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::any::Any;
16use std::collections::HashMap;
17use std::fmt;
18use std::fmt::Debug;
19use std::fmt::Display;
20use std::fmt::Formatter;
21use std::net::SocketAddr;
22
23use bytes::Bytes;
24use cheetah_string::CheetahString;
25use rocketmq_rust::ArcMut;
26
27use crate::common::hasher::string_hasher::JavaStringHasher;
28use crate::common::message::message_decoder::message_properties_to_string;
29use crate::common::message::message_ext::MessageExt;
30use crate::common::message::message_single::Message;
31use crate::common::message::MessageTrait;
32use crate::common::message::MessageVersion;
33use crate::common::TopicFilterType;
34use crate::MessageUtils;
35
36#[derive(Default)]
37pub struct MessageExtBrokerInner {
38    pub message_ext_inner: MessageExt,
39    pub properties_string: CheetahString,
40    pub tags_code: i64,
41    pub encoded_buff: Option<bytes::BytesMut>,
42    pub encode_completed: bool,
43    pub version: MessageVersion,
44}
45
46impl MessageExtBrokerInner {
47    const VERSION: MessageVersion = MessageVersion::V1;
48
49    #[inline]
50    pub fn delete_property(&mut self, name: impl Into<CheetahString>) {
51        let name = name.into();
52        self.message_ext_inner.message.clear_property(name.as_str());
53        self.properties_string = CheetahString::from_string(MessageUtils::delete_property(
54            self.properties_string.as_str(),
55            name.as_str(),
56        ));
57    }
58
59    #[inline]
60    pub fn with_version(&mut self, version: MessageVersion) {
61        self.version = version;
62    }
63
64    #[inline]
65    pub fn version(&self) -> MessageVersion {
66        self.version
67    }
68
69    #[inline]
70    pub fn topic(&self) -> &CheetahString {
71        self.message_ext_inner.topic()
72    }
73
74    #[inline]
75    pub fn get_topic(&self) -> &CheetahString {
76        self.message_ext_inner.topic()
77    }
78
79    #[inline]
80    pub fn born_host(&self) -> SocketAddr {
81        self.message_ext_inner.born_host()
82    }
83
84    #[inline]
85    pub fn store_host(&self) -> SocketAddr {
86        self.message_ext_inner.store_host()
87    }
88
89    #[inline]
90    pub fn with_born_host_v6_flag(&mut self) {
91        self.message_ext_inner.with_born_host_v6_flag()
92    }
93
94    #[inline]
95    pub fn with_store_host_v6_flag(&mut self) {
96        self.message_ext_inner.with_store_host_v6_flag()
97    }
98
99    #[inline]
100    pub fn body(&self) -> Option<bytes::Bytes> {
101        self.message_ext_inner.body()
102    }
103
104    #[inline]
105    pub fn sys_flag(&self) -> i32 {
106        self.message_ext_inner.sys_flag()
107    }
108
109    #[inline]
110    pub fn body_crc(&self) -> u32 {
111        self.message_ext_inner.body_crc()
112    }
113
114    #[inline]
115    pub fn queue_id(&self) -> i32 {
116        self.message_ext_inner.queue_id()
117    }
118
119    #[inline]
120    pub fn flag(&self) -> i32 {
121        self.message_ext_inner.flag()
122    }
123
124    #[inline]
125    pub fn born_timestamp(&self) -> i64 {
126        self.message_ext_inner.born_timestamp()
127    }
128
129    #[inline]
130    pub fn store_timestamp(&self) -> i64 {
131        self.message_ext_inner.store_timestamp()
132    }
133
134    #[inline]
135    pub fn born_host_bytes(&self) -> bytes::Bytes {
136        self.message_ext_inner.born_host_bytes()
137    }
138
139    #[inline]
140    pub fn store_host_bytes(&self) -> bytes::Bytes {
141        self.message_ext_inner.born_store_bytes()
142    }
143
144    #[inline]
145    pub fn reconsume_times(&self) -> i32 {
146        self.message_ext_inner.reconsume_times()
147    }
148
149    #[inline]
150    pub fn prepared_transaction_offset(&self) -> i64 {
151        self.message_ext_inner.prepared_transaction_offset()
152    }
153
154    #[inline]
155    pub fn property(&self, name: &str) -> Option<CheetahString> {
156        self.message_ext_inner.properties().get(name).cloned()
157    }
158
159    #[inline]
160    pub fn properties_string(&self) -> &str {
161        self.properties_string.as_str()
162    }
163
164    #[inline]
165    pub fn queue_offset(&self) -> i64 {
166        self.message_ext_inner.queue_offset()
167    }
168
169    #[inline]
170    pub fn tags_string2tags_code(_filter: &TopicFilterType, tags: &str) -> i64 {
171        if tags.is_empty() {
172            return 0;
173        }
174        JavaStringHasher::hash_str(tags) as i64
175    }
176
177    #[inline]
178    pub fn tags_string_to_tags_code(tags: &str) -> i64 {
179        if tags.is_empty() {
180            return 0;
181        }
182        JavaStringHasher::hash_str(tags) as i64
183    }
184
185    #[inline]
186    pub fn get_tags(&self) -> Option<CheetahString> {
187        self.message_ext_inner.get_tags()
188    }
189
190    #[inline]
191    pub fn get_transaction_id(&self) -> Option<&CheetahString> {
192        self.message_ext_inner.get_transaction_id()
193    }
194
195    #[inline]
196    pub fn is_wait_store_msg_ok(&self) -> bool {
197        self.message_ext_inner.message.is_wait_store_msg_ok()
198    }
199
200    #[inline]
201    pub fn body_len(&self) -> usize {
202        self.message_ext_inner.message.body_slice().len()
203    }
204}
205
206impl fmt::Display for MessageExtBrokerInner {
207    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208        let encoded_buff_str = match &self.encoded_buff {
209            Some(encoded_buff) =>
210            /* format!("Some({:?})", encoded_buff) */
211            {
212                "****".to_string()
213            }
214            None => "None".to_string(),
215        };
216
217        write!(
218            f,
219            "MessageExtBrokerInner {{ message_ext_inner: {}, properties_string: {}, tags_code: {}, encoded_buff: {}, \
220             encode_completed: {}, version: {} }}",
221            self.message_ext_inner,
222            self.properties_string,
223            self.tags_code,
224            encoded_buff_str,
225            self.encode_completed,
226            self.version
227        )
228    }
229}
230
231impl Debug for MessageExtBrokerInner {
232    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
233        let encoded_buff_str = match &self.encoded_buff {
234            Some(encoded_buff) =>
235            /* format!("Some({:?})", encoded_buff) */
236            {
237                "****".to_string()
238            }
239            None => "None".to_string(),
240        };
241
242        write!(
243            f,
244            "MessageExtBrokerInner {{ message_ext_inner: {:?}, properties_string: {}, tags_code: {}, encoded_buff: \
245             {}, encode_completed: {}, version: {} }}",
246            self.message_ext_inner,
247            self.properties_string,
248            self.tags_code,
249            encoded_buff_str,
250            self.encode_completed,
251            self.version
252        )
253    }
254}
255
256impl MessageTrait for MessageExtBrokerInner {
257    #[inline]
258    fn put_property(&mut self, key: CheetahString, value: CheetahString) {
259        self.message_ext_inner.put_property(key, value);
260        self.properties_string = message_properties_to_string(self.message_ext_inner.get_properties());
261    }
262
263    #[inline]
264    fn clear_property(&mut self, name: &str) {
265        self.delete_property(name);
266    }
267
268    #[inline]
269    fn property(&self, name: &CheetahString) -> Option<CheetahString> {
270        self.message_ext_inner.property(name)
271    }
272
273    fn property_ref(&self, name: &CheetahString) -> Option<&CheetahString> {
274        self.message_ext_inner.property_ref(name)
275    }
276
277    #[inline]
278    fn topic(&self) -> &CheetahString {
279        self.message_ext_inner.topic()
280    }
281
282    #[inline]
283    fn set_topic(&mut self, topic: CheetahString) {
284        self.message_ext_inner.set_topic(topic);
285    }
286
287    #[inline]
288    fn get_flag(&self) -> i32 {
289        self.message_ext_inner.get_flag()
290    }
291
292    #[inline]
293    fn set_flag(&mut self, flag: i32) {
294        self.message_ext_inner.set_flag(flag);
295    }
296
297    #[inline]
298    fn get_body(&self) -> Option<&Bytes> {
299        self.message_ext_inner.get_body()
300    }
301
302    #[inline]
303    fn set_body(&mut self, body: Bytes) {
304        self.message_ext_inner.set_body(body);
305    }
306
307    #[inline]
308    fn get_properties(&self) -> &HashMap<CheetahString, CheetahString> {
309        self.message_ext_inner.get_properties()
310    }
311
312    #[inline]
313    fn set_properties(&mut self, properties: HashMap<CheetahString, CheetahString>) {
314        self.message_ext_inner.set_properties(properties.clone());
315        self.properties_string = message_properties_to_string(&properties);
316    }
317
318    #[inline]
319    fn transaction_id(&self) -> Option<&CheetahString> {
320        self.message_ext_inner.transaction_id()
321    }
322
323    #[inline]
324    fn set_transaction_id(&mut self, transaction_id: CheetahString) {
325        self.message_ext_inner.set_transaction_id(transaction_id);
326    }
327
328    #[inline]
329    fn get_compressed_body_mut(&mut self) -> Option<&mut Bytes> {
330        self.message_ext_inner.get_compressed_body_mut()
331    }
332
333    #[inline]
334    fn get_compressed_body(&self) -> Option<&Bytes> {
335        self.message_ext_inner.get_compressed_body()
336    }
337
338    #[inline]
339    fn set_compressed_body_mut(&mut self, compressed_body: Bytes) {
340        self.message_ext_inner.set_compressed_body_mut(compressed_body);
341    }
342
343    #[inline]
344    fn take_body(&mut self) -> Option<Bytes> {
345        self.message_ext_inner.take_body()
346    }
347
348    #[inline]
349    fn as_any(&self) -> &dyn Any {
350        self
351    }
352
353    #[inline]
354    fn as_any_mut(&mut self) -> &mut dyn Any {
355        self
356    }
357}
358
359// Conversion to new BrokerMessage type
360impl From<MessageExtBrokerInner> for crate::common::message::broker_message::BrokerMessage {
361    fn from(inner: MessageExtBrokerInner) -> Self {
362        use crate::common::message::broker_message::BrokerMessage;
363        use crate::common::message::message_envelope::MessageEnvelope;
364
365        let envelope = MessageEnvelope::from(inner.message_ext_inner);
366
367        BrokerMessage::new(envelope, inner.tags_code, inner.properties_string, inner.version)
368    }
369}
370
371// Conversion from new BrokerMessage type
372impl From<crate::common::message::broker_message::BrokerMessage> for MessageExtBrokerInner {
373    fn from(broker_msg: crate::common::message::broker_message::BrokerMessage) -> Self {
374        use crate::common::message::message_ext::MessageExt;
375
376        let message_ext_inner = MessageExt::from(broker_msg.envelope().clone());
377
378        Self {
379            message_ext_inner,
380            properties_string: CheetahString::from_string(broker_msg.properties_string().to_string()),
381            tags_code: broker_msg.tags_code(),
382            encoded_buff: broker_msg.encoded_buff().cloned(),
383            encode_completed: broker_msg.is_encode_completed(),
384            version: broker_msg.version(),
385        }
386    }
387}
388
389#[cfg(test)]
390mod tests {
391    use std::collections::HashMap;
392
393    use super::MessageExtBrokerInner;
394    use crate::common::message::message_decoder::string_to_message_properties;
395    use crate::common::message::MessageTrait;
396    use cheetah_string::CheetahString;
397
398    #[test]
399    fn message_ext_broker_inner_get_transaction_id_delegates_to_inner_message() {
400        let mut message = MessageExtBrokerInner::default();
401        MessageTrait::set_transaction_id(&mut message, CheetahString::from("tx-123"));
402
403        assert_eq!(message.get_transaction_id(), Some(&CheetahString::from("tx-123")));
404    }
405
406    #[test]
407    fn message_ext_broker_inner_put_property_updates_properties_string() {
408        let mut message = MessageExtBrokerInner::default();
409
410        message.put_property(CheetahString::from("k"), CheetahString::from("v"));
411
412        let decoded = string_to_message_properties(Some(&CheetahString::from(message.properties_string())));
413        assert_eq!(decoded.get("k").map(CheetahString::as_str), Some("v"));
414    }
415
416    #[test]
417    fn message_ext_broker_inner_set_properties_updates_properties_string() {
418        let mut message = MessageExtBrokerInner::default();
419        let properties = HashMap::from([(CheetahString::from("k"), CheetahString::from("v"))]);
420
421        message.set_properties(properties);
422
423        let decoded = string_to_message_properties(Some(&CheetahString::from(message.properties_string())));
424        assert_eq!(decoded.get("k").map(CheetahString::as_str), Some("v"));
425    }
426
427    #[test]
428    fn message_ext_broker_inner_body_len_returns_zero_for_empty_body() {
429        let message = MessageExtBrokerInner::default();
430
431        assert_eq!(message.body_len(), 0);
432    }
433}