blob: bbd2c20ea746f07c58830a58e268bc5f728bf970 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Org.Apache.Rocketmq
{
public class Message
{
internal static readonly Regex TopicRegex = new Regex("^[%a-zA-Z0-9_-]+$");
private Message(string topic, byte[] body, string tag, List<string> keys,
Dictionary<string, string> properties, DateTime? deliveryTimestamp, string messageGroup)
{
Topic = topic;
Tag = tag;
Keys = keys;
Body = body;
Properties = properties;
DeliveryTimestamp = deliveryTimestamp;
MessageGroup = messageGroup;
}
internal Message(Message message)
{
Topic = message.Topic;
Tag = message.Tag;
Keys = message.Keys;
Body = message.Body;
Properties = message.Properties;
MessageGroup = message.MessageGroup;
DeliveryTimestamp = message.DeliveryTimestamp;
}
public string Topic { get; }
public byte[] Body { get; }
public string Tag { get; }
public List<string> Keys { get; }
public Dictionary<string, string> Properties { get; }
public DateTime? DeliveryTimestamp { get; }
public string MessageGroup { get; }
public override string ToString()
{
return
$"{nameof(Topic)}: {Topic}, {nameof(Tag)}: {Tag}, {nameof(Keys)}: {string.Join(", ", Keys)}, {nameof(Properties)}: " +
$"{string.Join(", ", Properties.Select(kvp => kvp.ToString()))}, {nameof(DeliveryTimestamp)}: {DeliveryTimestamp}, {nameof(MessageGroup)}: " +
$"{MessageGroup}";
}
public class Builder
{
private string _topic;
private byte[] _body;
private string _tag;
private List<string> _keys = new List<string>();
private readonly Dictionary<string, string> _properties = new Dictionary<string, string>();
private DateTime? _deliveryTimestamp;
private string _messageGroup;
public Builder SetTopic(string topic)
{
Preconditions.CheckArgument(null != topic, "topic should not be null");
Preconditions.CheckArgument(topic != null && TopicRegex.Match(topic).Success,
$"topic does not match the regex {TopicRegex}");
_topic = topic;
return this;
}
public Builder SetBody(byte[] body)
{
Preconditions.CheckArgument(null != body, "body should not be null");
_body = body;
return this;
}
public Builder SetTag(string tag)
{
Preconditions.CheckArgument(!string.IsNullOrWhiteSpace(tag), "tag should not be null or white space");
Preconditions.CheckArgument(tag != null && !tag.Contains("|"), "tag should not contain \"|\"");
_tag = tag;
return this;
}
public Builder SetKeys(params string[] keys)
{
_keys = new List<string>();
foreach (var key in keys)
{
Preconditions.CheckArgument(!string.IsNullOrWhiteSpace(key),
"key should not be null or white space");
_keys.Add(key);
}
return this;
}
public Builder AddProperty(string key, string value)
{
Preconditions.CheckArgument(!string.IsNullOrWhiteSpace(key),
"key should not be null or white space");
Preconditions.CheckArgument(!string.IsNullOrWhiteSpace(value),
"value should not be null or white space");
_properties[key!] = value;
return this;
}
public Builder SetDeliveryTimestamp(DateTime deliveryTimestamp)
{
Preconditions.CheckArgument(null == _messageGroup,
"deliveryTimestamp and messageGroup should not be set at same time");
_deliveryTimestamp = DateTimeKind.Utc == deliveryTimestamp.Kind
? TimeZoneInfo.ConvertTimeFromUtc(deliveryTimestamp, TimeZoneInfo.Local)
: deliveryTimestamp;
return this;
}
public Builder SetMessageGroup(string messageGroup)
{
Preconditions.CheckArgument(!string.IsNullOrWhiteSpace(messageGroup),
"messageGroup should not be null or white space");
Preconditions.CheckArgument(null == _deliveryTimestamp,
"messageGroup and deliveryTimestamp should not be set at same time");
_messageGroup = messageGroup;
return this;
}
public Message Build()
{
Preconditions.CheckArgument(null != _topic, "topic has not been set yet");
Preconditions.CheckArgument(null != _body, "body has not been set yet");
return new Message(_topic, _body, _tag, _keys, _properties, _deliveryTimestamp, _messageGroup);
}
}
}
}