From 5256a576e6088e1588d6cc9f0ebb53976099dcdb Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 18:10:47 +0100 Subject: [PATCH 01/12] move helper and create compilable code --- src/Common/Common.csproj | 2 + .../Helpers/QueueServiceBusPurger.cs | 0 src/Common/Helpers/ServiceBusHelper.cs | 9 +- src/Common/Helpers/ServiceBusHelper2.cs | 748 ++++++++++++++++++ src/Common/Helpers/ServiceBusNamespace.cs | 2 +- src/Common/Helpers/ServiceBusNamespace2.cs | 588 ++++++++++++++ .../Helpers/ServiceBusPurger.cs | 0 .../TopicSubscriptionServiceBusPurger.cs | 0 src/ServiceBus/Helpers/ServiceBusHelper2.cs | 67 -- src/ServiceBusExplorer/Forms/MainForm.cs | 26 +- 10 files changed, 1357 insertions(+), 85 deletions(-) rename src/{ServiceBus => Common}/Helpers/QueueServiceBusPurger.cs (100%) create mode 100644 src/Common/Helpers/ServiceBusHelper2.cs create mode 100644 src/Common/Helpers/ServiceBusNamespace2.cs rename src/{ServiceBus => Common}/Helpers/ServiceBusPurger.cs (100%) rename src/{ServiceBus => Common}/Helpers/TopicSubscriptionServiceBusPurger.cs (100%) delete mode 100644 src/ServiceBus/Helpers/ServiceBusHelper2.cs diff --git a/src/Common/Common.csproj b/src/Common/Common.csproj index f7637910..85a496c1 100644 --- a/src/Common/Common.csproj +++ b/src/Common/Common.csproj @@ -16,6 +16,8 @@ + + diff --git a/src/ServiceBus/Helpers/QueueServiceBusPurger.cs b/src/Common/Helpers/QueueServiceBusPurger.cs similarity index 100% rename from src/ServiceBus/Helpers/QueueServiceBusPurger.cs rename to src/Common/Helpers/QueueServiceBusPurger.cs diff --git a/src/Common/Helpers/ServiceBusHelper.cs b/src/Common/Helpers/ServiceBusHelper.cs index 62a8cee0..c0758809 100644 --- a/src/Common/Helpers/ServiceBusHelper.cs +++ b/src/Common/Helpers/ServiceBusHelper.cs @@ -53,7 +53,6 @@ namespace ServiceBusExplorer // ReSharper restore CheckNamespace { using System.IO.Compression; - using System.Web.UI.WebControls; using Abstractions; using ServiceBusConnectionStringBuilder = Microsoft.ServiceBus.ServiceBusConnectionStringBuilder; @@ -5337,12 +5336,12 @@ public string GetAddressRelativeToNamespace(string address) public ServiceBusHelper2 GetServiceBusHelper2() { - var serviceBusHelper2 = new ServiceBusHelper2(); - serviceBusHelper2.ConnectionString = ConnectionString; - serviceBusHelper2.TransportType = UseAmqpWebSockets + var ServiceBusHelper2 = new ServiceBusHelper2(writeToLog); + ServiceBusHelper2.ConnectionString = ConnectionString; + ServiceBusHelper2.TransportType = UseAmqpWebSockets ? Azure.Messaging.ServiceBus.ServiceBusTransportType.AmqpWebSockets : Azure.Messaging.ServiceBus.ServiceBusTransportType.AmqpTcp; - return serviceBusHelper2; + return ServiceBusHelper2; } public async Task GetQueueProperties(QueueDescription oldQueueDescription) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs new file mode 100644 index 00000000..f3f27909 --- /dev/null +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -0,0 +1,748 @@ +#region Copyright +//======================================================================================= +// Microsoft Azure Customer Advisory Team +// +// This sample is supplemental to the technical guidance published on my personal +// blog at http://blogs.msdn.com/b/paolos/. +// +// Author: Paolo Salvatori +//======================================================================================= +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE +// FILES 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. +//======================================================================================= +#endregion + +#region Using Directives +using System.Threading.Tasks; +using Azure.Messaging.ServiceBus; +using Azure.Messaging.ServiceBus.Administration; + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Azure.Identity; +using ServiceBusExplorer.Helpers; +#endregion + +// ReSharper disable CheckNamespace +namespace ServiceBusExplorer.ServiceBus.Helpers +// ReSharper restore CheckNamespace +{ + + using Utilities.Helpers; + using System.IO.Compression; + using System.Text; + using Abstractions; + using Enums; + + + public enum BodyType + { + Stream, + String, + Wcf, + ByteArray + } + + public class ServiceBusHelper2 + { + + #region Private Constants + //*************************** + // Constants + //*************************** + private const string DefaultScheme = "sb"; + private const string MessageNumber = "MessageNumber"; + private const string StringType = "String"; + private const string DeadLetterQueue = "$DeadLetterQueue"; + private const string NullValue = "NULL"; + private const string CloudServiceBusPostfix = ".servicebus.windows.net"; + private const string GermanyServiceBusPostfix = ".servicebus.cloudapi.de"; + private const string ChinaServiceBusPostfix = ".servicebus.chinacloudapi.cn"; + private const string TestServiceBusPostFix = ".servicebus.int7.windows-int.net"; + private const int MaxBufferSize = 262144; // 256 KB + + + //*************************** + // Messages + //*************************** + private const string ServiceBusConnectionStringCannotBeNull = "The connection string argument cannot be null."; + private const string ServiceBusUriArgumentCannotBeNull = "The uri argument cannot be null."; + private const string ServiceBusNamespaceArgumentCannotBeNull = "The nameSpace argument cannot be null."; + private const string ServiceBusIssuerNameArgumentCannotBeNull = "The issuerName argument cannot be null."; + private const string ServiceBusIssuerSecretArgumentCannotBeNull = "The issuerSecret argument cannot be null."; + private const string serviceBusAdministrationClientCannotBeNull = "The namespace manager argument cannot be null."; + private const string QueueDescriptionCannotBeNull = "The queue description argument cannot be null."; + private const string TopicDescriptionCannotBeNull = "The topic decsription argument cannot be null."; + private const string SubscriptionDescriptionCannotBeNull = "The subscription description argument cannot be null."; + private const string RuleDescriptionCannotBeNull = "The rule description argument cannot be null."; + private const string EventHubDescriptionCannotBeNull = "The event hub description argument cannot be null."; + private const string ConsumerGroupCannotBeNull = "The consumerGroup argument cannot be null or empty."; + private const string PartitionDescriptionCannotBeNull = "The partition description argument cannot be null."; + private const string ConsumerGroupDescriptionCannotBeNull = "The consumer group description argument cannot be null."; + private const string NotificationHubDescriptionCannotBeNull = "The notification hub description argument cannot be null."; + private const string RuleCannotBeNull = "The rule argument cannot be null."; + private const string PathCannotBeNull = "The path argument cannot be null or empty."; + private const string NewPathCannotBeNull = "The new path argument cannot be null or empty."; + private const string NameCannotBeNull = "The name argument cannot be null or empty."; + private const string DescriptionCannotBeNull = "The description argument cannot be null."; + private const string ServiceBusIsDisconnected = "The application is now disconnected from any service bus namespace."; + private const string ServiceBusIsConnected = "The application is now connected to the {0} service bus namespace."; + private const string QueueCreated = "The queue {0} has been successfully created."; + private const string QueueDeleted = "The queue {0} has been successfully deleted."; + private const string QueueRenamed = "The queue {0} has been successfully renamed to {1}."; + private const string QueueUpdated = "The queue {0} has been successfully updated."; + private const string TopicCreated = "The topic {0} has been successfully created."; + private const string TopicDeleted = "The topic {0} has been successfully deleted."; + private const string TopicRenamed = "The topic {0} has been successfully renamed to {1}."; + private const string TopicUpdated = "The topic {0} has been successfully updated."; + private const string SubscriptionCreated = "The {0} subscription for the {1} topic has been successfully created."; + private const string SubscriptionDeleted = "The {0} subscription for the {1} topic has been successfully deleted."; + private const string SubscriptionUpdated = "The {0} subscription for the {1} topic has been successfully updated."; + private const string RuleCreated = "The {0} rule for the {1} subscription has been successfully created."; + private const string RuleDeleted = "The {0} rule for the {1} subscription has been successfully deleted."; + private const string RelayCreated = "The relay {0} has been successfully created."; + private const string RelayDeleted = "The relay {0} has been successfully deleted."; + private const string RelayUpdated = "The relay {0} has been successfully updated."; + private const string EventHubCreated = "The event hub {0} has been successfully created."; + private const string EventHubDeleted = "The event hub {0} has been successfully deleted."; + private const string EventHubUpdated = "The event hub {0} has been successfully updated."; + private const string ConsumerGroupCreated = "The consumer group {0} has been successfully created."; + private const string ConsumerGroupDeleted = "The consumer group {0} has been successfully deleted."; + private const string ConsumerGroupUpdated = "The consumer group {0} has been successfully updated."; + private const string NotificationHubCreated = "The notification hub {0} has been successfully created."; + private const string NotificationHubDeleted = "The notification hub {0} has been successfully deleted."; + private const string NotificationHubUpdated = "The notification hub {0} has been successfully updated."; + private const string WarningHeader = "The following validations failed:"; + private const string WarningFormat = "\n\r - {0}"; + private const string PropertyConversionError = "{0} property conversion error: {1}"; + private const string PropertyValueCannotBeNull = "The value of the {0} property cannot be null."; + private const string MessageSuccessfullySent = "Sender[{0}]: Message sent. MessageId=[{1}] SessionId=[{2}] Label=[{3}] Size=[{4}]"; + private const string MessageSuccessfullyReceived = "Receiver[{0}]: Message received. MessageId=[{1}] SessionId=[{2}] Label=[{3}] Size=[{4}] DeliveryCount[{5}]"; + private const string MessagePeekedButNotConsumed = "Receiver[{0}]: Message peeked, but not consumed. MessageId=[{1}] SessionId=[{2}] Label=[{3}] Size=[{4}]"; + private const string MessageSuccessfullyReceivedNoTask = "Message {0}: MessageId=[{1}] SessionId=[{2}] Label=[{3}] Size=[{4}] DeliveryCount[{5}]"; + private const string EventDataSuccessfullySent = "Sender[{0}]: EventData sent. MessageNumber=[{1}] PartitionKey=[{2}]"; + private const string ReceiverStatisticsLineNoTask = "Messages {0}: Count=[{1}]"; + private const string SentMessagePropertiesHeader = "Properties:"; + private const string ReceivedMessagePropertiesHeader = "Properties:"; + private const string SentMessagePayloadHeader = "Payload:"; + private const string ReceivedMessagePayloadHeader = "Payload:"; + private const string MessageTextFormat = "{0}"; + private const string MessagePropertyFormat = " - Key=[{0}] Value=[{1}]"; + private const string MessageDeferred = " - The message was deferred."; + private const string ReadMessageDeferred = " - Read deferred message."; + private const string MessageMovedToDeadLetterQueue = " - The message was moved to the Dead-letter queue."; + private const string MessageReadFromDeadLetterQueue = " - The message was read from the Dead-letter queue."; + private const string NoMessageWasReceived = "Receiver[{0}]: no message was received."; + private const string SenderStatisticsHeader = "Sender[{0}]:"; + private const string SenderStatisticsLine1 = " - Message Count=[{0}] Messages Sent/Sec=[{1:F1}] Total Elapsed Time (ms)=[{2}]"; + private const string SenderStatisticsLine2 = " - Average Send Time (ms)=[{0}] Minimum Send Time (ms)=[{1}] Maximum Send Time (ms)=[{2}] "; + private const string ReceiverStatisticsHeader = "Receiver[{0}]:"; + private const string ReceiverStatisticsLine1 = " - Message Count=[{0}] Messages Read/Sec=[{1:F1}] Total Elapsed Time (ms)=[{2}]"; + private const string ReceiverStatisticsWithCompleteLine1 = " - Message Count=[{0}] Messages Read/Sec=[{1:F1}] Total Receive Elapsed Time (ms)=[{2}] Total Complete Elapsed Time (ms)=[{3}]"; + private const string ReceiverStatisticsLine2 = " - Average Receive Time (ms)=[{0}] Minimum Receive Time (ms)=[{1}] Maximum Receive Time (ms)=[{2}] "; + private const string ReceiverStatisticsLine3 = " - Average Complete Time (ms)=[{0}] Minimum Complete Time (ms)=[{1}] Maximum Complete Time (ms)=[{2}] "; + private const string ExceptionOccurred = " - Exception occurred: {0}"; + private const string UnableToReadMessageBody = "Unable to read the message body."; + private const string EventHubClientCannotBeNull = "The EventHubClient parameter cannot be null."; + private const string EventHubSenderCannotBeNull = "The EventHubSender parameter cannot be null."; + private const string MessageSenderCannotBeNull = "The MessageSender parameter cannot be null."; + private const string MessageReceiverCannotBeNull = "The MessageReceiver parameter cannot be null."; + private const string BrokeredMessageCannotBeNull = "The BrokeredMessage parameter cannot be null."; + private const string EventDataCannotBeNull = "The EventData parameter cannot be null."; + private const string EventDataTemplateEnumerableCannotBeNull = "The eventDataTemplateEnumerable parameter cannot be null."; + private const string CancellationTokenSourceCannotBeNull = "The CancellationTokenSource parameter cannot be null."; + private const string MessageIsNotXmlOrJson = "The message is not in XML or JSON format."; + private const string MessageFactorySuccessfullyCreated = "MessagingFactory successfully created."; + private const string SleepingFor = "Sleeping for [{0}] milliseconds..."; + private const string Read = "read"; + private const string Peeked = "peeked"; + #endregion + + + #region Private Fields + private Type messageDeferProviderType = typeof(InMemoryMessageDeferProvider); + private ServiceBusAdministrationClient serviceBusAdministrationClient; + //private AzureNotificationHubs.serviceBusAdministrationClient notificationHubserviceBusAdministrationClient; + private bool traceEnabled; + private string scheme = DefaultScheme; + //private Microsoft.ServiceBus.TokenProvider tokenProvider; + //private AzureNotificationHubs.TokenProvider notificationHubTokenProvider; + private Uri namespaceUri; + private ServiceBusNamespaceType connectionStringType; + private Uri atomFeedUri; + private string ns; + private string servicePath; + private string connectionString; + //private List brokeredMessageList; + private readonly WriteToLogDelegate writeToLog; + private string currentSharedAccessKeyName; + private string currentSharedAccessKey; + private ServiceBusTransportType currentTransportType; + private ServiceBusNamespace2 serviceBusNamespaceInstance; + #endregion + + #region Private Static Fields + //private static EncodingType encodingType = EncodingType.ASCII; + #endregion + + #region Public Constructors + + /// + /// Initializes a new instance of the ServiceBusHelper class. + /// + /// WriteToLog method. + public ServiceBusHelper2(WriteToLogDelegate writeToLog) + { + this.writeToLog = writeToLog; + traceEnabled = true; + } + + /// + /// Initializes a new instance of the ServiceBusHelper class. + /// + /// WriteToLog method. + /// A boolean value indicating whether tracing is enabled. + public ServiceBusHelper2(WriteToLogDelegate writeToLog, bool traceEnabled) + { + this.writeToLog = writeToLog; + this.traceEnabled = traceEnabled; + } + + /// + /// Initializes a new instance of the ServiceBusHelper class. + /// + /// WriteToLog method. + /// Base ServiceBusHelper. + public ServiceBusHelper2(WriteToLogDelegate writeToLog, ServiceBusHelper2 serviceBusHelper) + { + this.writeToLog = writeToLog; + AtomFeedUri = serviceBusHelper.AtomFeedUri; + MessageDeferProviderType = serviceBusHelper.MessageDeferProviderType; + ConnectionString = serviceBusHelper.ConnectionString; + //namespaceManager = serviceBusHelper.NamespaceManager; + //notificationHubNamespaceManager = serviceBusHelper.NotificationHubNamespaceManager; + //MessagingFactory = serviceBusHelper.MessagingFactory; + Namespace = serviceBusHelper.Namespace; + NamespaceUri = serviceBusHelper.NamespaceUri; + MessageDeferProviderType = serviceBusHelper.MessageDeferProviderType; + Scheme = serviceBusHelper.Scheme; + ServiceBusNamespaces = serviceBusHelper.ServiceBusNamespaces; + BrokeredMessageInspectors = serviceBusHelper.BrokeredMessageInspectors; + EventDataInspectors = serviceBusHelper.EventDataInspectors; + BrokeredMessageGenerators = serviceBusHelper.BrokeredMessageGenerators; + EventDataGenerators = serviceBusHelper.EventDataGenerators; + ServicePath = serviceBusHelper.ServicePath; + //TokenProvider = serviceBusHelper.TokenProvider; + //notificationHubTokenProvider = serviceBusHelper.notificationHubTokenProvider; + TraceEnabled = serviceBusHelper.TraceEnabled; + SharedAccessKey = serviceBusHelper.SharedAccessKey; + SharedAccessKeyName = serviceBusHelper.SharedAccessKeyName; + TransportType = serviceBusHelper.TransportType; + } + #endregion + + #region Public Instance Properties + + /// + /// Gets a boolean that indicates if the current namespace is a cloud namespace. + /// + public bool IsCloudNamespace + { + get + { + string uri; + return connectionStringType == ServiceBusNamespaceType.Cloud || + (namespaceUri != null && + !string.IsNullOrWhiteSpace(uri = namespaceUri.ToString()) && + (uri.Contains(CloudServiceBusPostfix) || + uri.Contains(TestServiceBusPostFix) || + uri.Contains(GermanyServiceBusPostfix) || + uri.Contains(ChinaServiceBusPostfix))); + } + } + + /// + /// Gets or sets the type of the message defer provider + /// + public Type MessageDeferProviderType + { + get + { + lock (this) + { + return messageDeferProviderType; + } + } + set + { + lock (this) + { + if (value.GetInterfaces().Contains(typeof(IMessageDeferProvider))) + { + messageDeferProviderType = value; + } + } + } + } + + /// + /// Gets or sets a boolean value indicating whether tracing is enabled. + /// + public bool TraceEnabled + { + get + { + lock (this) + { + return traceEnabled; + } + } + set + { + lock (this) + { + traceEnabled = value; + } + } + } + + /// + /// Gets or sets the scheme of the URI. + /// + public string Scheme + { + get + { + lock (this) + { + return scheme; + } + } + set + { + lock (this) + { + scheme = value; + } + } + } + + /// + /// Gets or sets the current namespace. + /// + public string Namespace + { + get + { + lock (this) + { + return ns; + } + } + set + { + lock (this) + { + ns = value; + } + } + } + + /// + /// Gets or sets the current service name. + /// + public string ServicePath + { + get + { + lock (this) + { + return servicePath ?? string.Empty; + } + } + set + { + lock (this) + { + servicePath = value; + if (!string.IsNullOrWhiteSpace(servicePath) && + servicePath[servicePath.Length - 1] != '/') + { + servicePath = servicePath + '/'; + } + } + } + } + + /*public string ConnectionStringWithoutEntityPath + { + get + { + var builder = new ServiceBusConnectionStringBuilder(connectionString) + { + EntityPath = string.Empty + }; + + return builder.ToString(); + } + }*/ + + /// + /// Gets or sets the connection string. + /// + public string ConnectionString + { + get + { + lock (this) + { + return connectionString; + } + } + set + { + lock (this) + { + connectionString = value; + } + } + } + + + /// + /// Gets or sets the shared access key name. + /// + public string SharedAccessKeyName + { + get + { + lock (this) + { + return currentSharedAccessKeyName; + } + } + set + { + lock (this) + { + currentSharedAccessKeyName = value; + } + } + } + + /// + /// Gets or sets the shared access key. + /// + public string SharedAccessKey + { + get + { + lock (this) + { + return currentSharedAccessKey; + } + } + set + { + lock (this) + { + currentSharedAccessKey = value; + } + } + } + + /// + /// Gets or sets the transport type. + /// + public ServiceBusTransportType TransportType + { + get + { + lock (this) + { + return currentTransportType; + } + } + set + { + lock (this) + { + currentTransportType = value; + } + } + } + + /// + /// Gets or sets the URI of the current service bus namespace. + /// + public Uri NamespaceUri + { + get + { + lock (this) + { + return namespaceUri; + } + } + set + { + lock (this) + { + namespaceUri = value; + } + } + } + + /// + /// Gets or sets the URI of the atom feed for the current namespace. + /// + public Uri AtomFeedUri + { + get + { + lock (this) + { + return atomFeedUri; + } + } + set + { + lock (this) + { + atomFeedUri = value; + } + } + } + + /// + /// Gets or sets the dictionary containing serviceBus accounts. + /// + public Dictionary ServiceBusNamespaces { get; set; } + + /// + /// Gets or sets the dictionary containing BrokeredMessage inspectors. + /// + public Dictionary BrokeredMessageInspectors { get; set; } + + /// + /// Gets or sets the dictionary containing EventData inspectors. + /// + public Dictionary EventDataInspectors { get; set; } + + /// + /// Gets or sets the dictionary containing BrokeredMessage generators. + /// + public Dictionary BrokeredMessageGenerators { get; set; } + + /// + /// Gets or sets the dictionary containing EventData generators. + /// + public Dictionary EventDataGenerators { get; set; } + + public bool ConnectionStringContainsEntityPath() + { + var connectionStringProperties = ServiceBusConnectionStringProperties.Parse(ConnectionString); + + if (connectionStringProperties?.EntityPath != null) + { + return true; + } + + return false; + } + + public async Task IsPremiumNamespace() + { + var administrationClient = new ServiceBusAdministrationClient(ConnectionString); + NamespaceProperties namespaceProperties = await administrationClient.GetNamespacePropertiesAsync().ConfigureAwait(false); + + return namespaceProperties.MessagingSku == MessagingSku.Premium; + } + + public async Task IsQueue(string name) + { + var administrationClient = new ServiceBusAdministrationClient(ConnectionString); + return await administrationClient.QueueExistsAsync(name).ConfigureAwait(false); + } + + public async Task IsTopic(string name) + { + var administrationClient = new ServiceBusAdministrationClient(ConnectionString); + return await administrationClient.TopicExistsAsync(name).ConfigureAwait(false); + } + + #endregion + + #region Public Static Properties + + /// + /// Gets or sets the connectivity mode when connecting to namespaces + /// + public static Microsoft.ServiceBus.ConnectivityMode ConnectivityMode + { + get + { + return Microsoft.ServiceBus.ServiceBusEnvironment.SystemConnectivity.Mode; + } + set + { + Microsoft.ServiceBus.ServiceBusEnvironment.SystemConnectivity.Mode = value; + } + } + + public static bool UseAmqpWebSockets { get; set; } + + /*/// + /// Gets or sets the encodingType of sent messages + /// + public static Enums.EncodingType EncodingType + { + get + { + return encodingType; + } + set + { + encodingType = value; + } + }*/ + #endregion + + public delegate void UpdateStatisticsDelegate(long messageNumber, long elapsedMilliseconds, DirectionType direction); + + #region Public Events + public delegate void EventHandler(ServiceBusHelperEventArgs args); + //public event EventHandler OnDelete; + //public event EventHandler OnCreate; + #endregion + + + #region Public Methods + + + /// + /// Connects the ServiceBusHelper object to service bus namespace contained in the ServiceBusNamespaces dictionary. + /// + /// The Service Bus namespace. + /// True if the operation succeeds, false otherwise. + public bool Connect(ServiceBusNamespace2 serviceBusNamespace) + { + this.serviceBusNamespaceInstance = serviceBusNamespace; + + if (string.IsNullOrWhiteSpace(serviceBusNamespace?.ConnectionString)) + { + throw new ArgumentException(ServiceBusConnectionStringCannotBeNull); + } + + if (!TestNamespaceHostIsContactable(serviceBusNamespace)) + { + throw new Exception($"Could not contact host in connection string: { serviceBusNamespace.ConnectionString }."); + } + + var func = (() => + { + connectionString = serviceBusNamespace.ConnectionString; + currentSharedAccessKey = serviceBusNamespace.SharedAccessKey; + currentSharedAccessKeyName = serviceBusNamespace.SharedAccessKeyName; + currentTransportType = serviceBusNamespace.TransportType; + + // The serviceBusAdministrationClient class can be used for managing entities, + // such as queues, topics, subscriptions, and rules, in your service namespace. + // You must provide service namespace address and access credentials in order + // to manage your service namespace. + serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.Namespace + "servicebus.windows.net", new DefaultAzureCredential()); + + //todo moet retry policy geset worden? + + + try + { + // todo notificationhub nodig hier? + } + catch (Exception) + { + // ignored + } + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, ServiceBusIsConnected, connectionString)); + var namespaceProperties = serviceBusAdministrationClient.GetNamespacePropertiesAsync().Result; + namespaceUri = new Uri(namespaceProperties.Value.Name); + connectionStringType = serviceBusNamespace.ConnectionStringType; + ns = IsCloudNamespace ? namespaceUri.Host.Split('.')[0] : namespaceUri.Segments[namespaceUri.Segments.Length - 1]; + atomFeedUri = new Uri($"{Uri.UriSchemeHttp}://{namespaceUri.Host}"); + + return true; + }); + return RetryHelper.RetryFunc(func, writeToLog); + } + + // TODO rest van public methods + + #endregion + + private void WriteToLog(string message) + { + if (writeToLog != null && + !string.IsNullOrWhiteSpace(message)) + { + writeToLog(message); + } + } + + private void WriteToLogIf(bool condition, string message, bool async = false) + { + if (condition && + writeToLog != null && + !string.IsNullOrWhiteSpace(message)) + { + writeToLog(message, async); + } + } + + /*private static Encoding GetEncoding() + { + switch (encodingType) + { + case EncodingType.ASCII: + return Encoding.ASCII; + case EncodingType.UTF7: + return Encoding.UTF7; + case EncodingType.UTF8: + return Encoding.UTF8; + case EncodingType.UTF32: + return Encoding.UTF32; + case EncodingType.Unicode: + return Encoding.Unicode; + default: + return Encoding.UTF8; + } + }*/ + + private static bool TestNamespaceHostIsContactable(ServiceBusNamespace2 serviceBusNamespace) + { + if (!Uri.TryCreate(serviceBusNamespace.Uri, UriKind.Absolute, out var namespaceUri)) + { + return false; + } + + try + { + System.Net.Dns.GetHostEntry(namespaceUri.Host); + } + catch + { + return false; + } + + return true; + } + } +} diff --git a/src/Common/Helpers/ServiceBusNamespace.cs b/src/Common/Helpers/ServiceBusNamespace.cs index c560a699..e959250b 100644 --- a/src/Common/Helpers/ServiceBusNamespace.cs +++ b/src/Common/Helpers/ServiceBusNamespace.cs @@ -141,7 +141,7 @@ public ServiceBusNamespace(ServiceBusNamespaceType connectionStringType, { ConnectionStringType = connectionStringType; Uri = string.IsNullOrWhiteSpace(uri) ? - ServiceBusEnvironment.CreateServiceUri("sb", ns, servicePath).ToString() : + ("sb", ns, servicePath).ToString() : uri; ConnectionString = connectionString; diff --git a/src/Common/Helpers/ServiceBusNamespace2.cs b/src/Common/Helpers/ServiceBusNamespace2.cs new file mode 100644 index 00000000..4cf2270b --- /dev/null +++ b/src/Common/Helpers/ServiceBusNamespace2.cs @@ -0,0 +1,588 @@ +#region Copyright +//======================================================================================= +// Microsoft Azure Customer Advisory Team +// +// This sample is supplemental to the technical guidance published on my personal +// blog at http://blogs.msdn.com/b/paolos/. +// +// Author: Paolo Salvatori +//======================================================================================= +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE +// FILES 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. +//======================================================================================= +#endregion + +#region Using Directives + +using System; +using System.Text.RegularExpressions; +using Azure.Messaging.ServiceBus; +using System.Globalization; +using System.Linq; +using System.Collections.Generic; +using ServiceBusExplorer.Utilities.Helpers; + +#endregion + +namespace ServiceBusExplorer.Helpers +{ + using Microsoft.ServiceBus; + + public enum ServiceBusNamespaceType2 + { + Custom, + Cloud, + OnPremises + } + + /// + /// This class represents a service bus namespace address and authentication credentials + /// + public class ServiceBusNamespace2 + { + #region Private Constants + //*************************** + // Constants for accessing configuration files + //*************************** + const string ServiceBusNamespaces = "serviceBusNamespaces"; + + //*************************** + // Messages + //*************************** + const string ServiceBusNamespacesNotConfigured = "Service bus accounts have not been properly configured in the configuration file."; + const string ServiceBusNamespaceIsNullOrEmpty = "The connection string for service bus entry {0} is null or empty."; + const string ServiceBusNamespaceIsWrong = "The connection string for service bus namespace {0} is in the wrong format."; + const string ServiceBusNamespaceEndpointIsNullOrEmpty = "The endpoint for the service bus namespace {0} is null or empty."; + const string ServiceBusNamespaceEndpointPrefixedWithSb = "The endpoint for the service bus namespace {0} is being automatically prefixed with \"sb://\"."; + const string ServiceBusNamespaceStsEndpointIsNullOrEmpty = "The sts endpoint for the service bus namespace {0} is null or empty."; + const string ServiceBusNamespaceRuntimePortIsNullOrEmpty = "The runtime port for the service bus namespace {0} is null or empty."; + const string ServiceBusNamespaceManagementPortIsNullOrEmpty = "The management port for the service bus namespace {0} is null or empty."; + const string ServiceBusNamespaceEndpointUriIsInvalid = "The endpoint URI for the service bus namespace {0} is invalid."; + const string ServiceBusNamespaceSharedAccessKeyNameIsInvalid = "The SharedAccessKeyName for the service bus namespace {0} is invalid."; + const string ServiceBusNamespaceSharedAccessKeyIsInvalid = "The SharedAccessKey for the service bus namespace {0} is invalid."; + + //*************************** + // Parameters + //*************************** + const string ConnectionStringEndpoint = "endpoint"; + const string ConnectionStringSharedAccessKeyName = "sharedaccesskeyname"; + const string ConnectionStringSharedAccessKey = "sharedaccesskey"; + const string ConnectionStringStsEndpoint = "stsendpoint"; + const string ConnectionStringRuntimePort = "runtimeport"; + const string ConnectionStringManagementPort = "managementport"; + const string ConnectionStringWindowsUsername = "windowsusername"; + const string ConnectionStringWindowsDomain = "windowsdomain"; + const string ConnectionStringWindowsPassword = "windowspassword"; + const string ConnectionStringTransportType = "transporttype"; + const string ConnectionStringEntityPath = "entitypath"; + + #endregion + + #region Public Constants + //*************************** + // Formats + //*************************** + public const string SasConnectionStringFormat = "Endpoint={0};SharedAccessKeyName={1};SharedAccessKey={2};TransportType={3}"; + public const string SasConnectionStringEntityPathFormat = "Endpoint={0};SharedAccessKeyName={1};SharedAccessKey={2};TransportType={3};EntityPath={4}"; + #endregion + + #region Public Constructors + /// + /// Initializes a new instance of the ServiceBusHelper class. + /// + public ServiceBusNamespace2() + { + ConnectionStringType = ServiceBusNamespaceType.Cloud; + ConnectionString = default(string); + Uri = default(string); + Namespace = default(string); + ServicePath = default(string); + StsEndpoint = default(string); + RuntimePort = default(string); + ManagementPort = default(string); + WindowsDomain = default(string); + WindowsUserName = default(string); + WindowsPassword = default(string); + } + + /// + /// Initializes a new instance of the ServiceBusNamespace class. + /// + /// The service bus namespace connection string type. + /// The service bus namespace connection string. + /// The full address of the service bus namespace. + /// The service bus namespace. + /// The issuer name of the shared secret credentials. + /// The issuer secret of the shared secret credentials. + /// The service path that follows the host name section of the URI. + /// The sts endpoint of the service bus namespace. + /// The transport type to use to access the namespace. + /// True is is SAS connection string, false otherwise. + /// Entity path connection string scoped to. Otherwise a default. + public ServiceBusNamespace2(ServiceBusNamespaceType connectionStringType, + string connectionString, + string uri, + string ns, + string servicePath, + string name, + string key, + string stsEndpoint, + ServiceBusTransportType transportType, + bool isSas = false, + string entityPath = "", + bool isUserCreated = false) + { + ConnectionStringType = connectionStringType; + if (string.IsNullOrWhiteSpace(uri)) + { + if (isSas) + { + ServiceBusConnectionStringBuilder.CreateUsingSharedSecret(new Uri(ConnectionString), name, key); + } + // todo expand + } + else + { + Uri = uri; + } + + ConnectionString = connectionString; + Namespace = ns; + + if (isSas) + { + SharedAccessKeyName = name; + SharedAccessKey = key; + } + else + { + ServicePath = servicePath; + } + + TransportType = transportType; + StsEndpoint = stsEndpoint; + RuntimePort = default(string); + ManagementPort = default(string); + WindowsDomain = default(string); + WindowsUserName = default(string); + WindowsPassword = default(string); + EntityPath = entityPath; + UserCreated = isUserCreated; + } + + /// + /// Initializes a new instance of the ServiceBusNamespace class for an on-premises namespace. + /// + /// The service bus namespace connection string. + /// The endpoint of the service bus namespace. + /// The sts endpoint of the service bus namespace. + /// The runtime port. + /// The management port. + /// The Windows domain or machine name. + /// The Windows user name. + /// The Windows user password. + /// The service bus namespace. + /// The transport type to use to access the namespace. + public ServiceBusNamespace2(string connectionString, + string endpoint, + string stsEndpoint, + string runtimePort, + string managementPort, + string windowsDomain, + string windowsUsername, + string windowsPassword, + string ns, + ServiceBusTransportType transportType, + bool isUserCreated = false) + { + ConnectionStringType = ServiceBusNamespaceType.OnPremises; + ConnectionString = connectionString; + Uri = endpoint; + var uri = new Uri(endpoint); + + + if (string.IsNullOrWhiteSpace(endpoint)) + { + Uri = ServiceBusEnvironment.CreateServiceUri(uri.Scheme, ns, null).ToString(); + } + + Namespace = ns; + TransportType = ServiceBusTransportType.AmqpTcp; + StsEndpoint = stsEndpoint; + RuntimePort = runtimePort; + ManagementPort = managementPort; + WindowsDomain = windowsDomain; + WindowsUserName = windowsUsername; + WindowsPassword = windowsPassword; + TransportType = transportType; + UserCreated = isUserCreated; + } + #endregion + + #region Public methods + public static ServiceBusNamespace2 GetServiceBusNamespace(string key, string connectionString, + WriteToLogDelegate staticWriteToLog) + { + + if (string.IsNullOrWhiteSpace(connectionString)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, ServiceBusNamespaceIsNullOrEmpty, key)); + return null; + } + + var isUserCreated = !(key == "CustomConnectionString" || key == "SASConnectionString"); + var toLower = connectionString.ToLower(); + var parameters = connectionString.Split(';').ToDictionary(s => s.Substring(0, s.IndexOf('=')).ToLower(), s => s.Substring(s.IndexOf('=') + 1)); + + if (toLower.Contains(ConnectionStringEndpoint) && + toLower.Contains(ConnectionStringSharedAccessKeyName) && + toLower.Contains(ConnectionStringSharedAccessKey)) + { + return GetServiceBusNamespaceUsingSAS(key, connectionString, staticWriteToLog, + isUserCreated, parameters); + } + + if (toLower.Contains(ConnectionStringRuntimePort) || + toLower.Contains(ConnectionStringManagementPort) || + toLower.Contains(ConnectionStringWindowsUsername) || + toLower.Contains(ConnectionStringWindowsDomain) || + toLower.Contains(ConnectionStringWindowsPassword)) + { + return GetServiceBusNamespaceUsingWindows(key, connectionString, staticWriteToLog, + isUserCreated, toLower, parameters); + } + + return null; + } + + public static Dictionary GetMessagingNamespaces + (TwoFilesConfiguration configuration, WriteToLogDelegate writeToLog) + { + var hashtable = configuration.GetHashtableFromSection(ServiceBusNamespaces); + + if (hashtable == null || hashtable.Count == 0) + { + writeToLog(ServiceBusNamespacesNotConfigured); + } + + var serviceBusNamespaces = new Dictionary(); + + if (hashtable == null) + { + return serviceBusNamespaces; + } + + var e = hashtable.GetEnumerator(); + + while (e.MoveNext()) + { + if (!(e.Key is string) || !(e.Value is string)) + { + continue; + } + + var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace((string)e.Key, (string)e.Value, writeToLog); + + if (serviceBusNamespace != null) + { + serviceBusNamespaces.Add((string)e.Key, serviceBusNamespace); + } + } + + var microsoftServiceBusConnectionString = + configuration.GetStringValue(ConfigurationParameters.MicrosoftServiceBusConnectionString); + + if (!string.IsNullOrWhiteSpace(microsoftServiceBusConnectionString)) + { + var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace(ConfigurationParameters.MicrosoftServiceBusConnectionString, microsoftServiceBusConnectionString, writeToLog); + + if (serviceBusNamespace != null) + { + serviceBusNamespaces. + Add(ConfigurationParameters.MicrosoftServiceBusConnectionString, serviceBusNamespace); + } + } + + return serviceBusNamespaces; + } + + public static void SaveConnectionString(TwoFilesConfiguration configuration, + string key, string value, WriteToLogDelegate staticWriteToLog) + { + configuration.AddEntryToDictionarySection(ServiceBusNamespaces, key, value); + } + #endregion + + #region Public Properties + + /// + /// Gets or sets the service bus namespace type. + /// + public ServiceBusNamespaceType ConnectionStringType { get; set; } + + /// + /// Get or set if this is a connection string added by the user + /// + public bool UserCreated { get; set; } + + /// + /// Gets or sets the service bus namespace connection string. + /// + public string ConnectionString { get; set; } + + /// + /// Gets or sets the service bus namespace connection string without transport type. + /// + public string ConnectionStringWithoutTransportType + { + get + { + var regex = new Regex(@";TransportType=\w*;?"); + var connectionString = regex.Replace(ConnectionString, string.Empty); + return connectionString; + } + } + + /// + /// Gets or sets the full address of the service bus namespace. + /// + public string Uri { get; set; } + + /// + /// Gets or sets the service bus namespace. + /// + public string Namespace { get; set; } + + /// + /// Gets or sets the service path that follows the host name section of the URI. + /// + public string ServicePath { get; set; } + + /// + /// Gets or sets the transport type to use to access the namespace. + /// + public ServiceBusTransportType TransportType { get; set; } + + /// + /// Gets or sets the URL of the sts endpoint. + /// + public string StsEndpoint { get; set; } + + /// + /// Gets or sets the runtime port. + /// + public string RuntimePort { get; set; } + + /// + /// Gets or sets the management port. + /// + public string ManagementPort { get; set; } + + /// + /// Gets or sets the windows domain. + /// + public string WindowsDomain { get; set; } + + /// + /// Gets or sets the Windows user name. + /// + public string WindowsUserName { get; set; } + + /// + /// Gets or sets the Windows user password. + /// + public string WindowsPassword { get; set; } + + /// + /// Gets or sets the SharedAccessKeyName. + /// + public string SharedAccessKeyName { get; set; } + + /// + /// Gets or sets the SharedAccessKey. + /// + public string SharedAccessKey { get; set; } + + /// + /// Gets or sets the EntityPath + /// + public string EntityPath { get; set; } + #endregion + + #region Private Methods + + static ServiceBusNamespace2 GetServiceBusNamespaceUsingWindows(string key, string connectionString, + WriteToLogDelegate staticWriteToLog, bool isUserCreated, string toLower, + Dictionary parameters) + { + if (!toLower.Contains(ConnectionStringEndpoint) || + !toLower.Contains(ConnectionStringStsEndpoint) || + !toLower.Contains(ConnectionStringRuntimePort) || + !toLower.Contains(ConnectionStringManagementPort)) + { + return null; + } + + var endpoint = parameters.ContainsKey(ConnectionStringEndpoint) ? + parameters[ConnectionStringEndpoint] : + null; + + if (string.IsNullOrWhiteSpace(endpoint)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceEndpointIsNullOrEmpty, key)); + return null; + } + + string ns = GetNamespaceNameFromEndpoint(endpoint, staticWriteToLog, key); + + var stsEndpoint = parameters.ContainsKey(ConnectionStringStsEndpoint) ? + parameters[ConnectionStringStsEndpoint] : + null; + + if (string.IsNullOrWhiteSpace(stsEndpoint)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceStsEndpointIsNullOrEmpty, key)); + return null; + } + + var runtimePort = parameters.ContainsKey(ConnectionStringRuntimePort) ? + parameters[ConnectionStringRuntimePort] : + null; + + if (string.IsNullOrWhiteSpace(runtimePort)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceRuntimePortIsNullOrEmpty, key)); + return null; + } + + var managementPort = parameters.ContainsKey(ConnectionStringManagementPort) ? + parameters[ConnectionStringManagementPort] : + null; + + if (string.IsNullOrWhiteSpace(managementPort)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, ServiceBusNamespaceManagementPortIsNullOrEmpty, key)); + return null; + } + + var windowsDomain = parameters.ContainsKey(ConnectionStringWindowsDomain) ? + parameters[ConnectionStringWindowsDomain] : + null; + + var windowsUsername = parameters.ContainsKey(ConnectionStringWindowsUsername) ? + parameters[ConnectionStringWindowsUsername] : + null; + + var windowsPassword = parameters.ContainsKey(ConnectionStringWindowsPassword) ? + parameters[ConnectionStringWindowsPassword] : + null; + + var transportType = ServiceBusTransportType.AmqpTcp; + + if (parameters.ContainsKey(ConnectionStringTransportType)) + { + Enum.TryParse(parameters[ConnectionStringTransportType], true, out transportType); + } + + return new ServiceBusNamespace2(connectionString, endpoint, stsEndpoint, runtimePort, managementPort, windowsDomain, windowsUsername, windowsPassword, ns, transportType, isUserCreated); + } + + static ServiceBusNamespace2 GetServiceBusNamespaceUsingSAS(string key, string connectionString, + WriteToLogDelegate staticWriteToLog, bool isUserCreated, Dictionary parameters) + { + if (parameters.Count < 3) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, ServiceBusNamespaceIsWrong, key)); + return null; + } + + var endpoint = parameters.ContainsKey(ConnectionStringEndpoint) ? + parameters[ConnectionStringEndpoint] : + null; + + if (string.IsNullOrWhiteSpace(endpoint)) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceEndpointIsNullOrEmpty, key)); + return null; + } + + if (!endpoint.Contains("://")) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceEndpointPrefixedWithSb, endpoint)); + endpoint = "sb://" + endpoint; + } + + var stsEndpoint = parameters.ContainsKey(ConnectionStringStsEndpoint) ? + parameters[ConnectionStringStsEndpoint] : + null; + + string ns = GetNamespaceNameFromEndpoint(endpoint, staticWriteToLog, key); + + if (!parameters.ContainsKey(ConnectionStringSharedAccessKeyName) || + string.IsNullOrWhiteSpace(parameters[ConnectionStringSharedAccessKeyName])) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, ServiceBusNamespaceSharedAccessKeyNameIsInvalid, key)); + } + + var sharedAccessKeyName = parameters[ConnectionStringSharedAccessKeyName]; + + if (!parameters.ContainsKey(ConnectionStringSharedAccessKey) || string.IsNullOrWhiteSpace(parameters[ConnectionStringSharedAccessKey])) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceSharedAccessKeyIsInvalid, key)); + } + + var sharedAccessKey = parameters[ConnectionStringSharedAccessKey]; + var transportType = ServiceBusTransportType.AmqpTcp; + + if (parameters.ContainsKey(ConnectionStringTransportType)) + { + Enum.TryParse(parameters[ConnectionStringTransportType], true, out transportType); + } + + string entityPath = string.Empty; + + if (parameters.ContainsKey(ConnectionStringEntityPath)) + { + entityPath = parameters[ConnectionStringEntityPath]; + } + + return new ServiceBusNamespace2(ServiceBusNamespaceType.Cloud, connectionString, endpoint, ns, null, + sharedAccessKeyName, sharedAccessKey, stsEndpoint, transportType, true, + entityPath, isUserCreated); + } + + static string GetNamespaceNameFromEndpoint(string endpoint, WriteToLogDelegate staticWriteToLog, + string key) + { + Uri uri; + + try + { + uri = new Uri(endpoint); + } + catch (Exception) + { + staticWriteToLog(string.Format(CultureInfo.CurrentCulture, + ServiceBusNamespaceEndpointUriIsInvalid, key)); + return null; + } + + return uri.Host.Split('.')[0]; + } + + #endregion + } +} diff --git a/src/ServiceBus/Helpers/ServiceBusPurger.cs b/src/Common/Helpers/ServiceBusPurger.cs similarity index 100% rename from src/ServiceBus/Helpers/ServiceBusPurger.cs rename to src/Common/Helpers/ServiceBusPurger.cs diff --git a/src/ServiceBus/Helpers/TopicSubscriptionServiceBusPurger.cs b/src/Common/Helpers/TopicSubscriptionServiceBusPurger.cs similarity index 100% rename from src/ServiceBus/Helpers/TopicSubscriptionServiceBusPurger.cs rename to src/Common/Helpers/TopicSubscriptionServiceBusPurger.cs diff --git a/src/ServiceBus/Helpers/ServiceBusHelper2.cs b/src/ServiceBus/Helpers/ServiceBusHelper2.cs deleted file mode 100644 index 468fafd0..00000000 --- a/src/ServiceBus/Helpers/ServiceBusHelper2.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Copyright -//======================================================================================= -// Microsoft Azure Customer Advisory Team -// -// This sample is supplemental to the technical guidance published on my personal -// blog at http://blogs.msdn.com/b/paolos/. -// -// Author: Paolo Salvatori -//======================================================================================= -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE -// FILES 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. -//======================================================================================= -#endregion - -using System.Threading.Tasks; -using Azure.Messaging.ServiceBus; -using Azure.Messaging.ServiceBus.Administration; - -// ReSharper disable CheckNamespace -namespace ServiceBusExplorer.ServiceBus.Helpers -// ReSharper restore CheckNamespace -{ - public class ServiceBusHelper2 - { - public string ConnectionString { get; set; } - public ServiceBusTransportType TransportType { get; set; } - - public bool ConnectionStringContainsEntityPath() - { - var connectionStringProperties = ServiceBusConnectionStringProperties.Parse(ConnectionString); - - if (connectionStringProperties?.EntityPath != null) - { - return true; - } - - return false; - } - - public async Task IsPremiumNamespace() - { - var administrationClient = new ServiceBusAdministrationClient(ConnectionString); - NamespaceProperties namespaceProperties = await administrationClient.GetNamespacePropertiesAsync().ConfigureAwait(false); - - return namespaceProperties.MessagingSku == MessagingSku.Premium; - } - - public async Task IsQueue(string name) - { - var administrationClient = new ServiceBusAdministrationClient(ConnectionString); - return await administrationClient.QueueExistsAsync(name).ConfigureAwait(false); - } - - public async Task IsTopic(string name) - { - var administrationClient = new ServiceBusAdministrationClient(ConnectionString); - return await administrationClient.TopicExistsAsync(name).ConfigureAwait(false); - } - } -} diff --git a/src/ServiceBusExplorer/Forms/MainForm.cs b/src/ServiceBusExplorer/Forms/MainForm.cs index 2c2d3e83..dfd48a81 100644 --- a/src/ServiceBusExplorer/Forms/MainForm.cs +++ b/src/ServiceBusExplorer/Forms/MainForm.cs @@ -204,6 +204,7 @@ public partial class MainForm : Form #region Private Instance Fields private readonly ServiceBusHelper serviceBusHelper; + private readonly ServiceBusHelper2 serviceBusHelper2; private TreeNode rootNode; private TreeNode currentNode; private readonly FieldInfo eventClickFieldInfo; @@ -265,6 +266,7 @@ public MainForm(string logMessage) Trace.Listeners.Add(new LogTraceListener(MainForm.StaticWriteToLog)); mainSingletonMainForm = this; serviceBusHelper = new ServiceBusHelper(WriteToLog); + serviceBusHelper2 = serviceBusHelper.GetServiceBusHelper2(); serviceBusHelper.OnCreate += serviceBusHelper_OnCreate; serviceBusHelper.OnDelete += serviceBusHelper_OnDelete; serviceBusTreeView.TreeViewNodeSorter = new TreeViewHelper(); @@ -313,9 +315,9 @@ private void UpdateSavedConnectionsMenu() Keys.Control | Keys.D5 }; - foreach (var namespaceKey in serviceBusHelper.ServiceBusNamespaces.Keys.OrderBy(k => k)) + foreach (var namespaceKey in serviceBusHelper2.ServiceBusNamespaces.Keys.OrderBy(k => k)) { - if (serviceBusHelper.ServiceBusNamespaces[namespaceKey].UserCreated) + if (serviceBusHelper2.ServiceBusNamespaces[namespaceKey].UserCreated) { var shortcutKey = allowedShortCutKeys.Count > 0 ? allowedShortCutKeys.First() : Keys.None; if (allowedShortCutKeys.Count > 0) allowedShortCutKeys.RemoveAt(0); @@ -340,8 +342,8 @@ private void UpdateSavedConnectionsMenu() private async void SavedConnectionToolStripMenuItem_Click(object sender, EventArgs e) { - var serviceBusNamespace = serviceBusHelper.ServiceBusNamespaces[(sender as ToolStripMenuItem).Tag.ToString()]; - serviceBusHelper.Connect(serviceBusNamespace); + var serviceBusNamespace = serviceBusHelper2.ServiceBusNamespaces[(sender as ToolStripMenuItem).Tag.ToString()]; + serviceBusHelper2.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); foreach (var userControl in panelMain.Controls.OfType()) @@ -1384,9 +1386,9 @@ private async void connectToolStripMenuItem_Click(object sender, EventArgs e) SelectedEntities = connectForm.SelectedEntities; ServiceBusHelper.ConnectivityMode = connectForm.ConnectivityMode; ServiceBusHelper.UseAmqpWebSockets = connectForm.UseAmqpWebSockets; - var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace(connectForm.Key ?? "Manual", + var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace(connectForm.Key ?? "Manual", connectForm.ConnectionString, StaticWriteToLog); - serviceBusHelper.Connect(serviceBusNamespace); + serviceBusHelper2.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); foreach (var userControl in panelMain.Controls.OfType()) @@ -3549,8 +3551,8 @@ private void GetServiceBusNamespacesFromConfiguration() try { var configuration = TwoFilesConfiguration.Create(configFileUse, WriteToLog); - serviceBusHelper.ServiceBusNamespaces = - ServiceBusNamespace.GetMessagingNamespaces(configuration, WriteToLog); + serviceBusHelper2.ServiceBusNamespaces = + ServiceBusNamespace2.GetMessagingNamespaces(configuration, WriteToLog); } catch (Exception ex) { @@ -6485,16 +6487,16 @@ private async void MainForm_Shown(object sender, EventArgs e) var ns = item.Value; if (ns != null) { - var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace(item.Key, ns.ConnectionString, StaticWriteToLog); - serviceBusHelper.Connect(serviceBusNamespace); + var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace(item.Key, ns.ConnectionString, StaticWriteToLog); + serviceBusHelper2.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); } } if (string.Compare(argumentName, "/c", StringComparison.InvariantCultureIgnoreCase) == 0 || string.Compare(argumentName, "-c", StringComparison.InvariantCultureIgnoreCase) == 0) { - var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace("Manual", argumentValue, StaticWriteToLog); - serviceBusHelper.Connect(serviceBusNamespace); + var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace("Manual", argumentValue, StaticWriteToLog); + serviceBusHelper2.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); } panelMain.Controls.Clear(); From a7f3c23afc2a8137028fbef8ed872217eaa29139 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 18:22:05 +0100 Subject: [PATCH 02/12] fix stuck ui --- src/Common/Helpers/ServiceBusHelper2.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index f3f27909..1a53ce04 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -673,11 +673,11 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) // ignored } WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, ServiceBusIsConnected, connectionString)); - var namespaceProperties = serviceBusAdministrationClient.GetNamespacePropertiesAsync().Result; - namespaceUri = new Uri(namespaceProperties.Value.Name); + //var namespaceProperties = serviceBusAdministrationClient.GetNamespacePropertiesAsync().Result; + //namespaceUri = new Uri(namespaceProperties.Value.Name); connectionStringType = serviceBusNamespace.ConnectionStringType; - ns = IsCloudNamespace ? namespaceUri.Host.Split('.')[0] : namespaceUri.Segments[namespaceUri.Segments.Length - 1]; - atomFeedUri = new Uri($"{Uri.UriSchemeHttp}://{namespaceUri.Host}"); + //ns = IsCloudNamespace ? namespaceUri.Host.Split('.')[0] : namespaceUri.Segments[namespaceUri.Segments.Length - 1]; + //atomFeedUri = new Uri($"{Uri.UriSchemeHttp}://{namespaceUri.Host}"); return true; }); From d88773f934934176690f3f7a30e73ed2fa449f3b Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 19:53:52 +0100 Subject: [PATCH 03/12] createnode --- src/Common/Helpers/ServiceBusHelper2.cs | 84 ++++++++++++++++++- src/ServiceBusExplorer/Forms/MainForm.cs | 101 ++++++++++++----------- 2 files changed, 135 insertions(+), 50 deletions(-) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index 1a53ce04..28315186 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -621,8 +621,8 @@ public static Enums.EncodingType EncodingType #region Public Events public delegate void EventHandler(ServiceBusHelperEventArgs args); - //public event EventHandler OnDelete; - //public event EventHandler OnCreate; + public event EventHandler OnDelete; + public event EventHandler OnCreate; #endregion @@ -686,6 +686,86 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) // TODO rest van public methods + + /// + /// Retrieves an enumerable collection of all queues in the service bus namespace. + /// + /// OData filter. + /// Returns an IEnumerable collection of all queues in the service namespace. + /// Returns an empty collection if no queue exists in this service namespace. + public async Task> GetQueuesAsync(string filter, int timeoutInSeconds) + { + if (serviceBusAdministrationClient != null) + { + if (string.IsNullOrEmpty(serviceBusNamespaceInstance.EntityPath)) + { + var taskList = new List(); + //Documentation states AND is the only logical clause allowed in the filter (And FYI a maximum of only 3 filter expressions allowed) + //https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.namespacemanager.getqueuesasync?view=azure-dotnet#Microsoft_ServiceBus_NamespaceManager_GetQueuesAsync_System_String_ + //Split on ' OR ' and combine queues returned + + var queuesListingResult = /*string.IsNullOrWhiteSpace(filter) ?*/ serviceBusAdministrationClient.GetQueuesAsync() /*: serviceBusAdministrationClient.GetQueuesAsync(/*splitFilter#1#)*/; + + IList queues = new List(); + + await foreach (var item in queuesListingResult) + { + queues.Add(item); + } + + //todo add filtering? + return queues; + } + + return new List { + GetQueueUsingEntityPath(timeoutInSeconds) + }; + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + + /// + /// Retrieves a queue in the service bus namespace that matches the entity path. + /// + private QueueProperties GetQueueUsingEntityPath(int timeoutInSeconds) + { + var taskList = new List(); + var getQueueTask = serviceBusAdministrationClient.GetQueueAsync(serviceBusNamespaceInstance.EntityPath); + taskList.Add(getQueueTask); + taskList.Add(Task.Delay(TimeSpan.FromSeconds(timeoutInSeconds))); + Task.WaitAny(taskList.ToArray()); + if (getQueueTask.IsCompleted) + { + try + { + return getQueueTask.Result; + } + catch (AggregateException ex) + { + throw ex.InnerExceptions.First(); + } + } + throw new TimeoutException(); + } + + /// + /// Retrieves the queue from the service namespace. + /// + /// Path of the queue relative to the service namespace base address. + /// A QueueDescription handle to the queue, or null if the queue does not exist in the service namespace. + public QueueProperties GetQueue(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException(PathCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + return RetryHelper.RetryFunc(() => serviceBusAdministrationClient.GetQueueAsync(path).Result.Value, writeToLog); + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + #endregion private void WriteToLog(string message) diff --git a/src/ServiceBusExplorer/Forms/MainForm.cs b/src/ServiceBusExplorer/Forms/MainForm.cs index dfd48a81..ee4a4a88 100644 --- a/src/ServiceBusExplorer/Forms/MainForm.cs +++ b/src/ServiceBusExplorer/Forms/MainForm.cs @@ -20,6 +20,7 @@ #endregion #region Using Directives +using Azure.Messaging.ServiceBus.Administration; using Microsoft.Azure.NotificationHubs; using Microsoft.ServiceBus.Messaging; using ServiceBusExplorer.Controls; @@ -269,6 +270,8 @@ public MainForm(string logMessage) serviceBusHelper2 = serviceBusHelper.GetServiceBusHelper2(); serviceBusHelper.OnCreate += serviceBusHelper_OnCreate; serviceBusHelper.OnDelete += serviceBusHelper_OnDelete; + serviceBusHelper2.OnCreate += serviceBusHelper_OnCreate; + serviceBusHelper2.OnDelete += serviceBusHelper_OnDelete; serviceBusTreeView.TreeViewNodeSorter = new TreeViewHelper(); eventClickFieldInfo = typeof(ToolStripItem).GetField(EventClick, BindingFlags.NonPublic | BindingFlags.Static); eventsPropertyInfo = typeof(Component).GetProperty(EventsProperty, BindingFlags.NonPublic | BindingFlags.Instance); @@ -1099,15 +1102,15 @@ void serviceBusHelper_OnCreate(ServiceBusHelperEventArgs args) { subscriptionsNode = topicNode.Nodes.Add(SubscriptionEntities, SubscriptionEntities, - wrapper.SubscriptionDescription.Status == EntityStatus.Active ? SubscriptionListIconIndex : GreySubscriptionIconIndex, - wrapper.SubscriptionDescription.Status == EntityStatus.Active ? SubscriptionListIconIndex : GreySubscriptionIconIndex); + wrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionListIconIndex : GreySubscriptionIconIndex, + wrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionListIconIndex : GreySubscriptionIconIndex); subscriptionsNode.ContextMenuStrip = subscriptionsContextMenuStrip; subscriptionsNode.Tag = new SubscriptionWrapper(null, wrapper.TopicDescription, FilterExpressionHelper.SubscriptionFilterExpression); } var subscriptionNode = subscriptionsNode.Nodes.Add(wrapper.SubscriptionDescription.Name, GetNameAndMessageCountText(wrapper.SubscriptionDescription.Name, wrapper.SubscriptionDescription.MessageCountDetails), - wrapper.SubscriptionDescription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, - wrapper.SubscriptionDescription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); + wrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, + wrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); subscriptionNode.ContextMenuStrip = subscriptionContextMenuStrip; subscriptionNode.Tag = new SubscriptionWrapper(wrapper.SubscriptionDescription, wrapper.TopicDescription); subscriptionsNode.Expand(); @@ -1760,8 +1763,8 @@ private void RefreshIndividualTopic(TreeNode selectedNode) { var subscriptionNode = subscriptionsNode.Nodes.Add(subscriptionDescription.Name, GetNameAndMessageCountText(subscriptionDescription.Name, subscriptionDescription.MessageCountDetails), - subscriptionDescription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, - subscriptionDescription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); + subscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, + subscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); subscriptionNode.ContextMenuStrip = subscriptionContextMenuStrip; subscriptionNode.Tag = new SubscriptionWrapper(subscriptionDescription, topicDescription); if (topicDescription != null) @@ -2401,7 +2404,7 @@ private void changeStatusQueueMenuItem_DropDownOpening(object sender, EventArgs foreach (var dropDownItem in changeStatusQueueMenuItem.DropDownItems) { var dropDownMenuItem = dropDownItem as ToolStripMenuItem; - dropDownMenuItem.Checked = (EntityStatus)dropDownMenuItem.Tag == status; + dropDownMenuItem.Checked = (Microsoft.ServiceBus.Messaging.EntityStatus)dropDownMenuItem.Tag == status; } } else @@ -2425,12 +2428,12 @@ private async void changeStatusQueue_Click(object sender, ToolStripItemClickedEv { if (serviceBusTreeView.SelectedNode.Tag is QueueDescription queueDescription) { - var desiredStatus = (EntityStatus)e.ClickedItem.Tag; + var desiredStatus = (Microsoft.ServiceBus.Messaging.EntityStatus)e.ClickedItem.Tag; using (var changeStatusForm = new ChangeStatusForm(queueDescription.Path, QueueEntity.ToLower(), desiredStatus)) { if (changeStatusForm.ShowDialog() == DialogResult.OK) { - queueDescription.Status = (EntityStatus)e.ClickedItem.Tag; + queueDescription.Status = (Microsoft.ServiceBus.Messaging.EntityStatus)e.ClickedItem.Tag; serviceBusHelper.NamespaceManager.UpdateQueue(queueDescription); await RefreshSelectedEntity(); } @@ -2477,9 +2480,9 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) // Topic Node if (serviceBusTreeView.SelectedNode.Tag is TopicDescription topicDescription) { - var desiredStatus = topicDescription.Status == EntityStatus.Active - ? EntityStatus.Disabled - : EntityStatus.Active; + var desiredStatus = topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active + ? Microsoft.ServiceBus.Messaging.EntityStatus.Disabled + : Microsoft.ServiceBus.Messaging.EntityStatus.Active; using (var changeStatusForm = new ChangeStatusForm(topicDescription.Path, TopicEntity.ToLower(), desiredStatus)) { if (changeStatusForm.ShowDialog() == DialogResult.OK) @@ -2487,7 +2490,7 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) topicDescription.Status = desiredStatus; await serviceBusHelper.NamespaceManager.UpdateTopicAsync(topicDescription); await RefreshSelectedEntity(); - changeStatusTopicMenuItem.Text = topicDescription.Status == EntityStatus.Active + changeStatusTopicMenuItem.Text = topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableTopic : EnableTopic; var item = actionsToolStripMenuItem.DropDownItems[ChangeStatusTopicMenuItem]; @@ -2506,9 +2509,9 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) if (subscriptionWrapper.TopicDescription != null && subscriptionWrapper.SubscriptionDescription != null) { - var desiredStatus = subscriptionWrapper.SubscriptionDescription.Status = subscriptionWrapper.SubscriptionDescription.Status == EntityStatus.Active - ? EntityStatus.Disabled - : EntityStatus.Active; + var desiredStatus = subscriptionWrapper.SubscriptionDescription.Status = subscriptionWrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active + ? Microsoft.ServiceBus.Messaging.EntityStatus.Disabled + : Microsoft.ServiceBus.Messaging.EntityStatus.Active; using (var changeStatusForm = new ChangeStatusForm(subscriptionWrapper.SubscriptionDescription.Name, SubscriptionEntity.ToLower(), desiredStatus)) { if (changeStatusForm.ShowDialog() == DialogResult.OK) @@ -2516,7 +2519,7 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) subscriptionWrapper.SubscriptionDescription.Status = desiredStatus; await serviceBusHelper.NamespaceManager.UpdateSubscriptionAsync(subscriptionWrapper.SubscriptionDescription); await RefreshSelectedEntity(); - changeStatusSubscriptionMenuItem.Text = subscriptionWrapper.SubscriptionDescription.Status == EntityStatus.Active + changeStatusSubscriptionMenuItem.Text = subscriptionWrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableSubscription : EnableSubscription; var item = actionsToolStripMenuItem.DropDownItems[ChangeStatusSubscriptionMenuItem]; @@ -2532,9 +2535,9 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) // Event Hub if (serviceBusTreeView.SelectedNode.Tag is EventHubDescription eventHubDescription) { - var desiredStatus = eventHubDescription.Status = eventHubDescription.Status == EntityStatus.Active - ? EntityStatus.Disabled - : EntityStatus.Active; + var desiredStatus = eventHubDescription.Status = eventHubDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active + ? Microsoft.ServiceBus.Messaging.EntityStatus.Disabled + : Microsoft.ServiceBus.Messaging.EntityStatus.Active; using (var changeStatusForm = new ChangeStatusForm(eventHubDescription.Path, EventHubEntity.ToLower(), desiredStatus)) { if (changeStatusForm.ShowDialog() == DialogResult.OK) @@ -2542,7 +2545,7 @@ private async void changeStatusEntity_Click(object sender, EventArgs e) eventHubDescription.Status = desiredStatus; await serviceBusHelper.NamespaceManager.UpdateEventHubAsync(eventHubDescription); await RefreshSelectedEntity(); - changeStatusEventHubMenuItem.Text = eventHubDescription.Status == EntityStatus.Active + changeStatusEventHubMenuItem.Text = eventHubDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableEventHub : EnableEventHub; var item = actionsToolStripMenuItem.DropDownItems[ChangeStatusEventHubMenuItem]; @@ -2953,7 +2956,7 @@ public async Task RefreshSelectedEntity() if (serviceBusTreeView.SelectedNode.Tag is EventHubDescription) { var eventHubDescription = serviceBusHelper.GetEventHub(((EventHubDescription)serviceBusTreeView.SelectedNode.Tag).Path); - if (eventHubDescription.Status == EntityStatus.Active) + if (eventHubDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active) { serviceBusTreeView.SelectedNode.ImageIndex = EventHubIconIndex; serviceBusTreeView.SelectedNode.SelectedImageIndex = EventHubIconIndex; @@ -3044,8 +3047,8 @@ public async Task RefreshSelectedEntity() { var subscriptionNode = subscriptionsNode.Nodes.Add(subscription.Name, GetNameAndMessageCountText(subscription.Name, subscription.MessageCountDetails), - subscription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, - subscription.Status == EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); + subscription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, + subscription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); subscriptionNode.ContextMenuStrip = subscriptionContextMenuStrip; subscriptionNode.Tag = new SubscriptionWrapper(subscription, wrapper.TopicDescription); WriteToLog(string.Format(CultureInfo.CurrentCulture, SubscriptionRetrievedFormat, subscription.Name, wrapper.TopicDescription.Path), false); @@ -3099,7 +3102,7 @@ public async Task RefreshSelectedEntity() { var subscriptionDescription = serviceBusHelper.GetSubscription(subWrapper.SubscriptionDescription.TopicPath, subWrapper.SubscriptionDescription.Name); subWrapper = new SubscriptionWrapper(subscriptionDescription, subWrapper.TopicDescription); - if (subscriptionDescription.Status == EntityStatus.Active) + if (subscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active) { serviceBusTreeView.SelectedNode.ImageIndex = SubscriptionIconIndex; serviceBusTreeView.SelectedNode.SelectedImageIndex = SubscriptionIconIndex; @@ -3434,7 +3437,7 @@ private void HandleNodeMouseClick(TreeNode node) // Topic Node if (node.Tag is TopicDescription topicDescription) { - changeStatusTopicMenuItem.Text = topicDescription.Status == EntityStatus.Active ? DisableTopic : EnableTopic; + changeStatusTopicMenuItem.Text = topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableTopic : EnableTopic; var list = CloneItems(topicContextMenuStrip.Items); AddImportAndSeparatorMenuItems(list); actionsToolStripMenuItem.DropDownItems.AddRange(list.ToArray()); @@ -3461,7 +3464,7 @@ private void HandleNodeMouseClick(TreeNode node) // EventHub Node if (node.Tag is EventHubDescription eventHubDescription) { - changeStatusEventHubMenuItem.Text = eventHubDescription.Status == EntityStatus.Active ? DisableEventHub : EnableEventHub; + changeStatusEventHubMenuItem.Text = eventHubDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableEventHub : EnableEventHub; var list = CloneItems(eventHubContextMenuStrip.Items); AddImportAndSeparatorMenuItems(list); actionsToolStripMenuItem.DropDownItems.AddRange(list.ToArray()); @@ -3511,7 +3514,7 @@ private void HandleNodeMouseClick(TreeNode node) // Subscription Node if (node.Tag is SubscriptionWrapper subscriptionWrapper) { - changeStatusSubscriptionMenuItem.Text = subscriptionWrapper.SubscriptionDescription.Status == EntityStatus.Active ? DisableSubscription : EnableSubscription; + changeStatusSubscriptionMenuItem.Text = subscriptionWrapper.SubscriptionDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? DisableSubscription : EnableSubscription; getSubscriptionMessageSessionsMenuItem.Visible = subscriptionWrapper.SubscriptionDescription.RequiresSession; getSubscriptionMessageSessionsSeparator.Visible = subscriptionWrapper.SubscriptionDescription.RequiresSession; subReceiveMessagesMenuItem.Visible = string.IsNullOrWhiteSpace(subscriptionWrapper.SubscriptionDescription.ForwardTo); @@ -3973,7 +3976,7 @@ private void ReadEventHubPartitionCheckpointFile() private void RefreshQueueNode(TreeNode node, QueueDescription queueDescription) { - if (queueDescription.Status == EntityStatus.Active) + if (queueDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active) { node.ImageIndex = QueueIconIndex; node.SelectedImageIndex = QueueIconIndex; @@ -3990,7 +3993,7 @@ private void RefreshQueueNode(TreeNode node, QueueDescription queueDescription) private void RefreshTopicNode(TreeNode node, TopicDescription topicDescription) { - if (topicDescription.Status == EntityStatus.Active) + if (topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active) { node.ImageIndex = TopicIconIndex; node.SelectedImageIndex = TopicIconIndex; @@ -4204,7 +4207,7 @@ private async Task ShowEntities(EntityType entityType) try { - if (serviceBusHelper != null && serviceBusHelper.NamespaceUri != null) + if (serviceBusHelper != null && serviceBusHelper2.NamespaceUri != null) { Cursor.Current = Cursors.WaitCursor; serviceBusTreeView.SuspendDrawing(); @@ -4219,7 +4222,7 @@ private async Task ShowEntities(EntityType entityType) if (entityType == EntityType.All) { serviceBusTreeView.Nodes.Clear(); - rootNode = serviceBusTreeView.Nodes.Add(serviceBusHelper.NamespaceUri.AbsoluteUri, serviceBusHelper.NamespaceUri.AbsoluteUri, AzureIconIndex, AzureIconIndex); + rootNode = serviceBusTreeView.Nodes.Add(serviceBusHelper2.NamespaceUri.AbsoluteUri, serviceBusHelper2.NamespaceUri.AbsoluteUri, AzureIconIndex, AzureIconIndex); rootNode.ContextMenuStrip = rootContextMenuStrip; if (SelectedEntities.Contains(Constants.QueueEntities)) { @@ -4233,7 +4236,7 @@ private async Task ShowEntities(EntityType entityType) } // NOTE: Relays are not actually supported by Service Bus for Windows Server - if (serviceBusHelper.IsCloudNamespace) + if (serviceBusHelper2.IsCloudNamespace) { if (SelectedEntities.Contains(Constants.EventHubEntities)) { @@ -4253,7 +4256,7 @@ private async Task ShowEntities(EntityType entityType) } } updating = true; - if (serviceBusHelper.IsCloudNamespace) + if (serviceBusHelper2.IsCloudNamespace) { if (SelectedEntities.Contains(Constants.EventHubEntities) && (entityType == EntityType.All || @@ -4348,6 +4351,7 @@ private async Task ShowEntities(EntityType entityType) { try { + //todo getrelays var relayServices = serviceBusHelper.GetRelays(MainForm.SingletonMainForm.ServerTimeout); relayServiceListNode.Text = Constants.RelayEntities; @@ -4389,7 +4393,7 @@ private async Task ShowEntities(EntityType entityType) { try { - var queues = serviceBusHelper.GetQueues(FilterExpressionHelper.QueueFilterExpression, + var queues = await serviceBusHelper2.GetQueuesAsync(FilterExpressionHelper.QueueFilterExpression, MainForm.SingletonMainForm.ServerTimeout); queueListNode.Text = string.IsNullOrWhiteSpace(FilterExpressionHelper.QueueFilterExpression) ? Constants.QueueEntities @@ -4400,11 +4404,11 @@ private async Task ShowEntities(EntityType entityType) { foreach (var queue in queues) { - if (string.IsNullOrWhiteSpace(queue.Path)) + if (string.IsNullOrWhiteSpace(queue.Name)) { continue; } - CreateNode(queue.Path, queue, queueListNode, true); + CreateNode(queue.Name, queue, queueListNode, true); } } if (entityType == EntityType.Queue) @@ -4430,6 +4434,7 @@ private async Task ShowEntities(EntityType entityType) { try { + //todo get topics var topics = serviceBusHelper.GetTopics(FilterExpressionHelper.TopicFilterExpression, MainForm.SingletonMainForm.ServerTimeout); topicListNode.Text = string.IsNullOrWhiteSpace(FilterExpressionHelper.TopicFilterExpression) @@ -4559,10 +4564,10 @@ private void LazyLoadNode(TreeNode entityNode) { var subscriptionNode = subscriptionsNode.Nodes.Add(subscription.Name, GetNameAndMessageCountText(subscription.Name, subscription.MessageCountDetails), - subscription.Status == EntityStatus.Active + subscription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex, - subscription.Status == EntityStatus.Active + subscription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? SubscriptionIconIndex : GreySubscriptionIconIndex); subscriptionNode.ContextMenuStrip = subscriptionContextMenuStrip; @@ -5627,7 +5632,7 @@ private TreeNode CreateNode(string path, UrlSegmentIconIndex, UrlSegmentIconIndex); var entityType = EntityType.Queue; - if (tag is QueueDescription) + if (tag is QueueProperties) { entityNode.ContextMenuStrip = queueFolderContextMenuStrip; } @@ -5646,20 +5651,20 @@ private TreeNode CreateNode(string path, } else { - if (tag is QueueDescription) + if (tag is QueueProperties) { - var queueDescription = tag as QueueDescription; + var queueProperties = tag as QueueProperties; entityNode = entityNode.Nodes.Add(segments[i], - GetNameAndMessageCountText(segments[i], queueDescription.MessageCountDetails), - queueDescription.Status == EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex, - queueDescription.Status == EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex); + "GetNameAndMessageCountShouldBeFixed",//GetNameAndMessageCountText(segments[i], queueProperties.MessageCountDetails), + queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex, + queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex); entityNode.ContextMenuStrip = queueContextMenuStrip; entityNode.Tag = tag; ApplyColor(entityNode, true); if (log) { - WriteToLog(string.Format(CultureInfo.CurrentCulture, QueueRetrievedFormat, queueDescription.Path), false); + WriteToLog(string.Format(CultureInfo.CurrentCulture, QueueRetrievedFormat, queueProperties.Name), false); } return entityNode; } @@ -5668,8 +5673,8 @@ private TreeNode CreateNode(string path, var topicDescription = tag as TopicDescription; entityNode = entityNode.Nodes.Add(segments[i], segments[i], - topicDescription.Status == EntityStatus.Active ? TopicIconIndex : GreyTopicIconIndex, - topicDescription.Status == EntityStatus.Active ? TopicIconIndex : GreyTopicIconIndex); + topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? TopicIconIndex : GreyTopicIconIndex, + topicDescription.Status == Microsoft.ServiceBus.Messaging.EntityStatus.Active ? TopicIconIndex : GreyTopicIconIndex); entityNode.ContextMenuStrip = topicContextMenuStrip; entityNode.Tag = tag; ApplyColor(entityNode, true); From 92efc6a938047ee6ea54a59cb8a0265bf450049e Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 21:05:47 +0100 Subject: [PATCH 04/12] get queues working --- src/Common/Helpers/ServiceBusHelper2.cs | 9 +++++-- src/ServiceBusExplorer/Forms/MainForm.cs | 33 ++++++++++++++++-------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index 28315186..44c8c8ff 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -659,10 +659,15 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) // such as queues, topics, subscriptions, and rules, in your service namespace. // You must provide service namespace address and access credentials in order // to manage your service namespace. - serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.Namespace + "servicebus.windows.net", new DefaultAzureCredential()); + if (!string.IsNullOrEmpty(serviceBusNamespace.SharedAccessKey) && !string.IsNullOrEmpty(serviceBusNamespace.SharedAccessKey)){ + serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.ConnectionString); + } else + { + serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.Namespace + "servicebus.windows.net", new DefaultAzureCredential()); + } //todo moet retry policy geset worden? - + try { diff --git a/src/ServiceBusExplorer/Forms/MainForm.cs b/src/ServiceBusExplorer/Forms/MainForm.cs index ee4a4a88..f351dbac 100644 --- a/src/ServiceBusExplorer/Forms/MainForm.cs +++ b/src/ServiceBusExplorer/Forms/MainForm.cs @@ -345,8 +345,10 @@ private void UpdateSavedConnectionsMenu() private async void SavedConnectionToolStripMenuItem_Click(object sender, EventArgs e) { - var serviceBusNamespace = serviceBusHelper2.ServiceBusNamespaces[(sender as ToolStripMenuItem).Tag.ToString()]; - serviceBusHelper2.Connect(serviceBusNamespace); + var serviceBusNamespace2 = serviceBusHelper2.ServiceBusNamespaces[(sender as ToolStripMenuItem).Tag.ToString()]; + serviceBusHelper2.Connect(serviceBusNamespace2); + var serviceBusNamespace = serviceBusHelper.ServiceBusNamespaces[(sender as ToolStripMenuItem).Tag.ToString()]; + serviceBusHelper.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); foreach (var userControl in panelMain.Controls.OfType()) @@ -1389,10 +1391,13 @@ private async void connectToolStripMenuItem_Click(object sender, EventArgs e) SelectedEntities = connectForm.SelectedEntities; ServiceBusHelper.ConnectivityMode = connectForm.ConnectivityMode; ServiceBusHelper.UseAmqpWebSockets = connectForm.UseAmqpWebSockets; - var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace(connectForm.Key ?? "Manual", + var serviceBusNamespace2 = ServiceBusNamespace2.GetServiceBusNamespace(connectForm.Key ?? "Manual", connectForm.ConnectionString, StaticWriteToLog); - serviceBusHelper2.Connect(serviceBusNamespace); - SetTitle(serviceBusNamespace.Namespace); + var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace(connectForm.Key ?? "Manual", + connectForm.ConnectionString, StaticWriteToLog); + serviceBusHelper2.Connect(serviceBusNamespace2); + serviceBusHelper.Connect(serviceBusNamespace); + SetTitle(serviceBusNamespace2.Namespace); foreach (var userControl in panelMain.Controls.OfType()) { @@ -3556,6 +3561,8 @@ private void GetServiceBusNamespacesFromConfiguration() var configuration = TwoFilesConfiguration.Create(configFileUse, WriteToLog); serviceBusHelper2.ServiceBusNamespaces = ServiceBusNamespace2.GetMessagingNamespaces(configuration, WriteToLog); + serviceBusHelper.ServiceBusNamespaces = + ServiceBusNamespace.GetMessagingNamespaces(configuration, WriteToLog); } catch (Exception ex) { @@ -4207,7 +4214,7 @@ private async Task ShowEntities(EntityType entityType) try { - if (serviceBusHelper != null && serviceBusHelper2.NamespaceUri != null) + if (serviceBusHelper != null && serviceBusHelper2 != null) { Cursor.Current = Cursors.WaitCursor; serviceBusTreeView.SuspendDrawing(); @@ -4222,7 +4229,7 @@ private async Task ShowEntities(EntityType entityType) if (entityType == EntityType.All) { serviceBusTreeView.Nodes.Clear(); - rootNode = serviceBusTreeView.Nodes.Add(serviceBusHelper2.NamespaceUri.AbsoluteUri, serviceBusHelper2.NamespaceUri.AbsoluteUri, AzureIconIndex, AzureIconIndex); + rootNode = serviceBusTreeView.Nodes.Add("tobefilled" /*serviceBusHelper.NamespaceUri.AbsoluteUri*/, "tobefilled" /*serviceBusHelper2..NamespaceUri.AbsoluteUri*/, AzureIconIndex, AzureIconIndex); rootNode.ContextMenuStrip = rootContextMenuStrip; if (SelectedEntities.Contains(Constants.QueueEntities)) { @@ -6492,16 +6499,20 @@ private async void MainForm_Shown(object sender, EventArgs e) var ns = item.Value; if (ns != null) { - var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace(item.Key, ns.ConnectionString, StaticWriteToLog); - serviceBusHelper2.Connect(serviceBusNamespace); + var serviceBusNamespace2 = ServiceBusNamespace2.GetServiceBusNamespace(item.Key, ns.ConnectionString, StaticWriteToLog); + serviceBusHelper2.Connect(serviceBusNamespace2); + var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace(item.Key, ns.ConnectionString, StaticWriteToLog); + serviceBusHelper.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); } } if (string.Compare(argumentName, "/c", StringComparison.InvariantCultureIgnoreCase) == 0 || string.Compare(argumentName, "-c", StringComparison.InvariantCultureIgnoreCase) == 0) { - var serviceBusNamespace = ServiceBusNamespace2.GetServiceBusNamespace("Manual", argumentValue, StaticWriteToLog); - serviceBusHelper2.Connect(serviceBusNamespace); + var serviceBusNamespace2 = ServiceBusNamespace2.GetServiceBusNamespace("Manual", argumentValue, StaticWriteToLog); + serviceBusHelper2.Connect(serviceBusNamespace2); + var serviceBusNamespace = ServiceBusNamespace.GetServiceBusNamespace("Manual", argumentValue, StaticWriteToLog); + serviceBusHelper.Connect(serviceBusNamespace); SetTitle(serviceBusNamespace.Namespace); } panelMain.Controls.Clear(); From e03e765f25dd8358358c110d9b909e9e3996fe4d Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 21:43:42 +0100 Subject: [PATCH 05/12] messagecount details working with workaround --- src/Common/Helpers/ServiceBusHelper2.cs | 15 +++++++------ src/ServiceBusExplorer/Forms/MainForm.cs | 28 +++++++++++++++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index 44c8c8ff..66da4c54 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -698,7 +698,7 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) /// OData filter. /// Returns an IEnumerable collection of all queues in the service namespace. /// Returns an empty collection if no queue exists in this service namespace. - public async Task> GetQueuesAsync(string filter, int timeoutInSeconds) + public async Task> GetQueuesAsync(string filter, int timeoutInSeconds) { if (serviceBusAdministrationClient != null) { @@ -709,20 +709,21 @@ public async Task> GetQueuesAsync(string filter, in //https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.namespacemanager.getqueuesasync?view=azure-dotnet#Microsoft_ServiceBus_NamespaceManager_GetQueuesAsync_System_String_ //Split on ' OR ' and combine queues returned - var queuesListingResult = /*string.IsNullOrWhiteSpace(filter) ?*/ serviceBusAdministrationClient.GetQueuesAsync() /*: serviceBusAdministrationClient.GetQueuesAsync(/*splitFilter#1#)*/; + var queuesListingResult = /*string.IsNullOrWhiteSpace(filter) ?*/ serviceBusAdministrationClient.GetQueuesRuntimePropertiesAsync() /*: serviceBusAdministrationClient.GetQueuesAsync(/*splitFilter#1#)*/; - IList queues = new List(); + + // Todo client side filtering + IList queues = new List(); await foreach (var item in queuesListingResult) { queues.Add(item); } - //todo add filtering? return queues; } - return new List { + return new List { GetQueueUsingEntityPath(timeoutInSeconds) }; } @@ -732,10 +733,10 @@ public async Task> GetQueuesAsync(string filter, in /// /// Retrieves a queue in the service bus namespace that matches the entity path. /// - private QueueProperties GetQueueUsingEntityPath(int timeoutInSeconds) + private QueueRuntimeProperties GetQueueUsingEntityPath(int timeoutInSeconds) { var taskList = new List(); - var getQueueTask = serviceBusAdministrationClient.GetQueueAsync(serviceBusNamespaceInstance.EntityPath); + var getQueueTask = serviceBusAdministrationClient.GetQueueRuntimePropertiesAsync(serviceBusNamespaceInstance.EntityPath); taskList.Add(getQueueTask); taskList.Add(Task.Delay(TimeSpan.FromSeconds(timeoutInSeconds))); Task.WaitAny(taskList.ToArray()); diff --git a/src/ServiceBusExplorer/Forms/MainForm.cs b/src/ServiceBusExplorer/Forms/MainForm.cs index f351dbac..275e0644 100644 --- a/src/ServiceBusExplorer/Forms/MainForm.cs +++ b/src/ServiceBusExplorer/Forms/MainForm.cs @@ -5639,7 +5639,7 @@ private TreeNode CreateNode(string path, UrlSegmentIconIndex, UrlSegmentIconIndex); var entityType = EntityType.Queue; - if (tag is QueueProperties) + if (tag is QueueRuntimeProperties) { entityNode.ContextMenuStrip = queueFolderContextMenuStrip; } @@ -5658,13 +5658,14 @@ private TreeNode CreateNode(string path, } else { - if (tag is QueueProperties) + if (tag is QueueRuntimeProperties) { - var queueProperties = tag as QueueProperties; + var queueProperties = tag as QueueRuntimeProperties; entityNode = entityNode.Nodes.Add(segments[i], - "GetNameAndMessageCountShouldBeFixed",//GetNameAndMessageCountText(segments[i], queueProperties.MessageCountDetails), - queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex, - queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex); + GetNameAndMessageCountText(segments[i], queueProperties), + QueueIconIndex, QueueIconIndex + /*queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex, + queueProperties.Status == Azure.Messaging.ServiceBus.Administration.EntityStatus.Active ? QueueIconIndex : GreyQueueIconIndex*/); entityNode.ContextMenuStrip = queueContextMenuStrip; entityNode.Tag = tag; ApplyColor(entityNode, true); @@ -5750,6 +5751,21 @@ private TreeNode CreateNode(string path, return null; } + private string GetNameAndMessageCountText(string name, QueueRuntimeProperties details) + { + MessageCountDetails messageCountDetails = new MessageCountDetails(details.ActiveMessageCount, details.DeadLetterMessageCount, details.ScheduledMessageCount, details.TransferMessageCount, details.TransferDeadLetterMessageCount); + var sb = new StringBuilder(); + sb.Append(name); + if (showMessageCount && SelectedMessageCounts.Any()) + { + sb.Append(" ("); + var counts = SelectedMessageCounts.Select(smc => messageCountRetriever[smc](messageCountDetails)); + sb.Append(string.Join(", ", counts)); + sb.Append(")"); + } + return sb.ToString(); + } + private string GetNameAndMessageCountText(string name, MessageCountDetails details) { var sb = new StringBuilder(); From 36e4b02873c973c849766dace53bf98df70e1611 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Thu, 9 Nov 2023 22:15:03 +0100 Subject: [PATCH 06/12] rider workaround --- src/ServiceBusExplorer/ServiceBusExplorer.csproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ServiceBusExplorer/ServiceBusExplorer.csproj b/src/ServiceBusExplorer/ServiceBusExplorer.csproj index 2e596a8d..9eb98e19 100644 --- a/src/ServiceBusExplorer/ServiceBusExplorer.csproj +++ b/src/ServiceBusExplorer/ServiceBusExplorer.csproj @@ -40,6 +40,13 @@ https://github.com/paolosalvatori/ServiceBusExplorer/releases servicebusexplorer azure azureservicebus servicebus explorer eventhub queue subscription relay notificationhub + + true + + + + + AnyCPU full From fc75d2f192ca0bfe2e4f5ebd71a1dba0da6f95d7 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Mon, 13 Nov 2023 18:59:28 +0100 Subject: [PATCH 07/12] queue methods filled --- src/Common/Helpers/ServiceBusHelper2.cs | 255 +++++++++++++++++++++--- 1 file changed, 225 insertions(+), 30 deletions(-) diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index 66da4c54..8265a257 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -171,6 +171,7 @@ public class ServiceBusHelper2 #region Private Fields private Type messageDeferProviderType = typeof(InMemoryMessageDeferProvider); private ServiceBusAdministrationClient serviceBusAdministrationClient; + private ServiceBusClient serviceBusClient; //private AzureNotificationHubs.serviceBusAdministrationClient notificationHubserviceBusAdministrationClient; private bool traceEnabled; private string scheme = DefaultScheme; @@ -191,7 +192,7 @@ public class ServiceBusHelper2 #endregion #region Private Static Fields - //private static EncodingType encodingType = EncodingType.ASCII; + private static Encoding encodingType = Encoding.ASCII; #endregion #region Public Constructors @@ -383,18 +384,18 @@ public string ServicePath } } - /*public string ConnectionStringWithoutEntityPath + public string ConnectionStringWithoutEntityPath { get { - var builder = new ServiceBusConnectionStringBuilder(connectionString) - { - EntityPath = string.Empty - }; + var builder = ServiceBusConnectionStringProperties .Parse(connectionString); + + // Todo find a way to remove entity path + //builder.EntityPath = string.Empty; return builder.ToString(); } - }*/ + } /// /// Gets or sets the connection string. @@ -601,10 +602,10 @@ public static Microsoft.ServiceBus.ConnectivityMode ConnectivityMode public static bool UseAmqpWebSockets { get; set; } - /*/// + /// /// Gets or sets the encodingType of sent messages /// - public static Enums.EncodingType EncodingType + public static Encoding EncodingType { get { @@ -614,15 +615,17 @@ public static Enums.EncodingType EncodingType { encodingType = value; } - }*/ + } #endregion public delegate void UpdateStatisticsDelegate(long messageNumber, long elapsedMilliseconds, DirectionType direction); #region Public Events public delegate void EventHandler(ServiceBusHelperEventArgs args); +#pragma warning disable CS0067 // Event is never used public event EventHandler OnDelete; public event EventHandler OnCreate; +#pragma warning restore CS0067 // Event is never used #endregion @@ -661,9 +664,11 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) // to manage your service namespace. if (!string.IsNullOrEmpty(serviceBusNamespace.SharedAccessKey) && !string.IsNullOrEmpty(serviceBusNamespace.SharedAccessKey)){ serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.ConnectionString); + serviceBusClient = new ServiceBusClient(serviceBusNamespace.ConnectionString); } else { serviceBusAdministrationClient = new ServiceBusAdministrationClient(serviceBusNamespace.Namespace + "servicebus.windows.net", new DefaultAzureCredential()); + serviceBusClient = new ServiceBusClient(serviceBusNamespace.Namespace + "servicebus.windows.net", new DefaultAzureCredential()); } //todo moet retry policy geset worden? @@ -689,13 +694,16 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) return RetryHelper.RetryFunc(func, writeToLog); } - // TODO rest van public methods + // TODO rest van public methods + #region queuecontrol + /// /// Retrieves an enumerable collection of all queues in the service bus namespace. /// /// OData filter. + /// /// Returns an IEnumerable collection of all queues in the service namespace. /// Returns an empty collection if no queue exists in this service namespace. public async Task> GetQueuesAsync(string filter, int timeoutInSeconds) @@ -704,7 +712,9 @@ public async Task> GetQueuesAsync(string fil { if (string.IsNullOrEmpty(serviceBusNamespaceInstance.EntityPath)) { + /* var taskList = new List(); + */ //Documentation states AND is the only logical clause allowed in the filter (And FYI a maximum of only 3 filter expressions allowed) //https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.namespacemanager.getqueuesasync?view=azure-dotnet#Microsoft_ServiceBus_NamespaceManager_GetQueuesAsync_System_String_ //Split on ' OR ' and combine queues returned @@ -753,7 +763,7 @@ private QueueRuntimeProperties GetQueueUsingEntityPath(int timeoutInSeconds) } throw new TimeoutException(); } - + /// /// Retrieves the queue from the service namespace. /// @@ -772,6 +782,204 @@ public QueueProperties GetQueue(string path) throw new ApplicationException(ServiceBusIsDisconnected); } + /// . + /// Creates a new queue in the service namespace with the given name. + /// + /// Path of the queue relative to the service namespace base address. + /// Returns a newly-created QueueDescription object. + public QueueProperties CreateQueue(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException(PathCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + var queue = RetryHelper.RetryFunc(() => serviceBusAdministrationClient.CreateQueueAsync(path).Result.Value, writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueCreated, path)); + OnCreate?.Invoke(new ServiceBusHelperEventArgs(queue, EntityType.Queue)); + return queue; + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + + /// + /// Creates a new queue in the service namespace with the given name. + /// + /// A QueueDescription object describing the attributes with which the new queue will be created. + /// Returns a newly-created QueueDescription object. + public QueueProperties CreateQueue(QueueProperties description) + { + if (description == null) + { + throw new ArgumentException(DescriptionCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + var queue = RetryHelper.RetryFunc(() => serviceBusAdministrationClient.CreateQueueAsync(description.Name).Result.Value, writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueCreated, description.Name)); + OnCreate?.Invoke(new ServiceBusHelperEventArgs(queue, EntityType.Queue)); + return queue; + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + + /// + /// Updates a queue in the service namespace with the given name. + /// + /// A QueueDescription object describing the attributes with which the new queue will be updated. + /// Returns an updated QueueDescription object. + public QueueProperties UpdateQueue(QueueProperties description) + { + if (description == null) + { + throw new ArgumentException(DescriptionCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + var queue = RetryHelper.RetryFunc(() => serviceBusAdministrationClient.UpdateQueueAsync(description).Result.Value, writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueUpdated, description.Name)); + OnCreate?.Invoke(new ServiceBusHelperEventArgs(queue, EntityType.Queue)); + return queue; + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + + /// + /// Deletes all the queues in the list. + /// A list of queues to delete. + /// + public async Task DeleteQueues(IEnumerable queues) + { + if (queues == null) + { + return; + } + + await Task.WhenAll(queues.Select(DeleteQueue)); + } + + /// + /// Deletes the queue described by the relative name of the service namespace base address. + /// + /// Path of the queue relative to the service namespace base address. + public async Task DeleteQueue(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException(PathCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + await RetryHelper.RetryActionAsync(() => serviceBusAdministrationClient.DeleteQueueAsync(path), writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueDeleted, path)); + OnDelete?.Invoke(new ServiceBusHelperEventArgs(path, EntityType.Queue)); + } + else + { + throw new ApplicationException(ServiceBusIsDisconnected); + } + } + + /// + /// Deletes the queue passed as a argument. + /// + /// The queue to delete. + public async Task DeleteQueue(QueueProperties queueDescription) + { + if (queueDescription == null) + { + throw new ArgumentException(QueueDescriptionCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + await RetryHelper.RetryActionAsync(() => serviceBusAdministrationClient.DeleteQueueAsync(queueDescription.Name), writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueDeleted, queueDescription.Name)); + OnDelete?.Invoke(new ServiceBusHelperEventArgs(queueDescription, EntityType.Queue)); + } + else + { + throw new ApplicationException(ServiceBusIsDisconnected); + } + } + + /* + /// + /// Renames a queue inside a namespace. + /// + /// The path to an existing queue. + /// The new path to the renamed queue. + /// Returns a QueueDescription with the new name. + public QueueProperties RenameQueue(string path, string newPath) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException(PathCannotBeNull); + } + if (string.IsNullOrWhiteSpace(newPath)) + { + throw new ArgumentException(NewPathCannotBeNull); + } + if (serviceBusAdministrationClient != null) + { + var queueDescription = RetryHelper.RetryFunc(() => serviceBusAdministrationClient.RenameQueue(path, newPath), writeToLog); + WriteToLogIf(traceEnabled, string.Format(CultureInfo.CurrentCulture, QueueRenamed, path, newPath)); + OnDelete?.Invoke(new ServiceBusHelperEventArgs(new QueueProperties(path), EntityType.Queue)); + OnCreate?.Invoke(new ServiceBusHelperEventArgs(queueDescription, EntityType.Queue)); + return queueDescription; + } + throw new ApplicationException(ServiceBusIsDisconnected); + } + */ + + #endregion + + /*/// + /// Retrieves an enumerable collection of all message sessions for the queue passed as argument. + /// + /// The queue for which to search message sessions. + /// The time the session was last updated. + /// Returns an IEnumerable collection of message sessions. + public IEnumerable GetMessageSessions(string path, DateTime? dateTime) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException(PathCannotBeNull); + } + if (serviceBusAdministrationClient == null) + { + throw new ApplicationException(ServiceBusIsDisconnected); + + } + var queueClient = serviceBusClient.CreateSessionProcessor(path); + return RetryHelper.RetryFunc(() => dateTime != null ? queueClient.GetMessageSessions(dateTime.Value) : queueClient.GetMessageSessions(), writeToLog); + } + + /// + /// Retrieves an enumerable collection of all message sessions for the queue passed as argument. + /// + /// The queue for which to search message sessions. + /// The time the session was last updated. + /// Returns an IEnumerable collection of message sessions. + public IEnumerable GetMessageSessions(QueueDescription queue, DateTime? dateTime) + { + if (queue == null) + { + throw new ArgumentException(QueueDescriptionCannotBeNull); + } + if (messagingFactory == null) + { + throw new ApplicationException(ServiceBusIsDisconnected); + + } + var queueClient = messagingFactory.CreateQueueClient(queue.Path); + return RetryHelper.RetryFunc(() => dateTime != null ? queueClient.GetMessageSessions(dateTime.Value) : queueClient.GetMessageSessions(), writeToLog); + } + */ + + + + #endregion private void WriteToLog(string message) @@ -793,24 +1001,11 @@ private void WriteToLogIf(bool condition, string message, bool async = false) } } - /*private static Encoding GetEncoding() - { - switch (encodingType) - { - case EncodingType.ASCII: - return Encoding.ASCII; - case EncodingType.UTF7: - return Encoding.UTF7; - case EncodingType.UTF8: - return Encoding.UTF8; - case EncodingType.UTF32: - return Encoding.UTF32; - case EncodingType.Unicode: - return Encoding.Unicode; - default: - return Encoding.UTF8; - } - }*/ + private static Encoding GetEncoding() + { + // Todo can possibly go + return encodingType; + } private static bool TestNamespaceHostIsContactable(ServiceBusNamespace2 serviceBusNamespace) { From 6598ad8139c9dfd0d440477880d3aedafb1edabd Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Mon, 13 Nov 2023 19:24:51 +0100 Subject: [PATCH 08/12] authorization wrapper and first changes to generic code --- .../Helpers/AuthorizationRuleWrapper.cs | 52 +--- .../Helpers/DeadLetterMessageHandler.cs | 22 +- src/Common/Helpers/ServiceBusHelper2.cs | 18 ++ .../Controls/HandleQueueControl.cs | 284 +++++++++--------- src/ServiceBusExplorer/Forms/MainForm.cs | 10 +- src/ServiceBusExplorer/Forms/MessageForm.cs | 34 ++- .../Forms/SelectEntityForm.cs | 18 +- 7 files changed, 216 insertions(+), 222 deletions(-) diff --git a/src/Common/Helpers/AuthorizationRuleWrapper.cs b/src/Common/Helpers/AuthorizationRuleWrapper.cs index fb42c825..2f34c730 100644 --- a/src/Common/Helpers/AuthorizationRuleWrapper.cs +++ b/src/Common/Helpers/AuthorizationRuleWrapper.cs @@ -23,7 +23,7 @@ using System; using System.Linq; -using Microsoft.ServiceBus.Messaging; +using Azure.Messaging.ServiceBus.Administration; #endregion @@ -39,8 +39,6 @@ public class AuthorizationRuleWrapper private string keyName; private string primaryKey; private string secondaryKey; - private string claimType; - private string claimValue; private string issuerName; #endregion @@ -61,10 +59,7 @@ public AuthorizationRuleWrapper(AuthorizationRule rule) Manage = rule.Rights.Contains(AccessRights.Manage); Send = rule.Rights.Contains(AccessRights.Send); Listen = rule.Rights.Contains(AccessRights.Listen); - ClaimType = rule.ClaimType; - ClaimValue = rule.ClaimValue; - IssuerName = rule.IssuerName; - Revision = rule.Revision; + IssuerName = rule.KeyName; CreatedTime = rule.CreatedTime; ModifiedTime = rule.ModifiedTime; AuthorizationRule = rule; @@ -122,38 +117,6 @@ public string SecondaryKey } } - public string ClaimType - { - get - { - return claimType; - } - set - { - claimType = value; - if (AuthorizationRule != null) - { - AuthorizationRule.ClaimType = value; - } - } - } - - public string ClaimValue - { - get - { - return claimValue; - } - set - { - claimValue = value; - if (AuthorizationRule != null) - { - AuthorizationRule.ClaimValue = value; - } - } - } - public string IssuerName { get @@ -165,15 +128,14 @@ public string IssuerName issuerName = value; if (AuthorizationRule != null) { - AuthorizationRule.IssuerName = value; + AuthorizationRule.KeyName = value; } } } - public DateTime CreatedTime { get; private set; } - public DateTime ModifiedTime { get; private set; } - public long Revision { get; private set; } - public AuthorizationRule AuthorizationRule { get; private set; } + public DateTimeOffset CreatedTime { get; private set; } + public DateTimeOffset ModifiedTime { get; private set; } + public AuthorizationRule AuthorizationRule { get; } public bool Manage { @@ -193,7 +155,7 @@ public bool Manage if (AuthorizationRule != null && !AuthorizationRule.Rights.Contains(AccessRights.Manage)) { - AuthorizationRule.Rights = new[] {AccessRights.Manage, AccessRights.Send, AccessRights.Listen}; + AuthorizationRule.Rights = new[] {AccessRights.Manage, AccessRights.Send, AccessRights.Listen}.ToList(); } } } diff --git a/src/Common/Helpers/DeadLetterMessageHandler.cs b/src/Common/Helpers/DeadLetterMessageHandler.cs index a86cfd5e..f22e54b9 100644 --- a/src/Common/Helpers/DeadLetterMessageHandler.cs +++ b/src/Common/Helpers/DeadLetterMessageHandler.cs @@ -33,6 +33,8 @@ namespace ServiceBusExplorer.Helpers { + using Azure.Messaging.ServiceBus.Administration; + public class DeletedDlqMessagesResult { #region Public constructor @@ -52,8 +54,8 @@ public DeletedDlqMessagesResult(bool timedOut, List deletedSequenceNumbers public class DeadLetterMessageHandler { #region Private Fields - // Either queueDescription or subscriptionWrapper is used - but never both. - readonly QueueDescription sourceQueueDescription; + // Either queueProperties or subscriptionWrapper is used - but never both. + readonly QueueProperties sourceQueueProperties; readonly SubscriptionWrapper sourceSubscriptionWrapper; readonly int receiveTimeoutInSeconds; readonly ServiceBusHelper serviceBusHelper; @@ -62,10 +64,10 @@ public class DeadLetterMessageHandler #region Public Constructors public DeadLetterMessageHandler(WriteToLogDelegate writeToLog, ServiceBusHelper serviceBusHelper, - int receiveTimeoutInSeconds, QueueDescription queueDescription) + int receiveTimeoutInSeconds, QueueProperties queueProperties) : this(writeToLog, serviceBusHelper, receiveTimeoutInSeconds) { - sourceQueueDescription = queueDescription; + sourceQueueProperties = queueProperties; } public DeadLetterMessageHandler(WriteToLogDelegate writeToLog, ServiceBusHelper serviceBusHelper, @@ -335,9 +337,9 @@ public string GetFailureExplanation(DeletedDlqMessagesResult result, int targetM #region Private methods private double GetLockDurationInSeconds() { - if (sourceQueueDescription != null) + if (sourceQueueProperties != null) { - return sourceQueueDescription.LockDuration.TotalSeconds; + return sourceQueueProperties.LockDuration.TotalSeconds; } return sourceSubscriptionWrapper.SubscriptionDescription.LockDuration.TotalSeconds; @@ -348,9 +350,9 @@ private int GetMaxOperationTimeInSeconds() // Allocate three seconds for final operations; const int FinalActionsTime = 3; - if (sourceQueueDescription != null) + if (sourceQueueProperties != null) { - return (int)sourceQueueDescription.LockDuration.TotalSeconds - FinalActionsTime; + return (int)sourceQueueProperties.LockDuration.TotalSeconds - FinalActionsTime; } return (int)sourceSubscriptionWrapper.SubscriptionDescription.LockDuration.TotalSeconds @@ -359,9 +361,9 @@ private int GetMaxOperationTimeInSeconds() string GetDlqEntityPath() { - if (sourceQueueDescription != null) + if (sourceQueueProperties != null) { - return QueueClient.FormatDeadLetterPath(sourceQueueDescription.Path); + return QueueClient.FormatDeadLetterPath(sourceQueueProperties.Name); } return SubscriptionClient.FormatDeadLetterPath( diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index 8265a257..a94da0f3 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -699,6 +699,24 @@ public bool Connect(ServiceBusNamespace2 serviceBusNamespace) #region queuecontrol + public async Task GetQueueProperties(QueueProperties oldQueueDescription) + { + return (await this.GetQueueProperties(new List() { oldQueueDescription }).ConfigureAwait(false)).FirstOrDefault(); + } + + public async Task> GetQueueProperties(List oldQueueDescriptions) + { + var administrationClient = new ServiceBusAdministrationClient(connectionString); + var result = new List(); + + foreach(QueueProperties oldQueueDescription in oldQueueDescriptions) + { + result.Add(await administrationClient.GetQueueAsync(oldQueueDescription.Name).ConfigureAwait(false)); + } + + return result; + } + /// /// Retrieves an enumerable collection of all queues in the service bus namespace. /// diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs index 48c644fe..eedbee0f 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs @@ -50,6 +50,11 @@ namespace ServiceBusExplorer.Controls { + using Azure.Messaging.ServiceBus.Administration; + using AccessRights = Microsoft.ServiceBus.Messaging.AccessRights; + using EntityStatus = Microsoft.ServiceBus.Messaging.EntityStatus; + using SharedAccessAuthorizationRule = Microsoft.ServiceBus.Messaging.SharedAccessAuthorizationRule; + public partial class HandleQueueControl : UserControl { #region Private Constants @@ -233,8 +238,9 @@ public partial class HandleQueueControl : UserControl #region Private Fields - private QueueDescription queueDescription = default!; + private QueueProperties queueProperties = default!; private readonly ServiceBusHelper serviceBusHelper = default!; + private readonly ServiceBusHelper2 serviceBusHelper2 = default!; private readonly WriteToLogDelegate writeToLog = default!; private readonly string path = default!; private readonly List hiddenPages = new List(); @@ -292,12 +298,13 @@ public partial class HandleQueueControl : UserControl #region Public Constructors public HandleQueueControl(WriteToLogDelegate writeToLog, ServiceBusHelper serviceBusHelper, - QueueDescription queueDescription, string path, bool duplicateQueue) + QueueProperties queueProperties, string path, bool duplicateQueue) { this.writeToLog = writeToLog; this.serviceBusHelper = serviceBusHelper; + this.serviceBusHelper2 = serviceBusHelper.GetServiceBusHelper2(); this.path = path; - this.queueDescription = queueDescription; + this.queueProperties = queueProperties; var serviceBusHelper2 = serviceBusHelper.GetServiceBusHelper2(); if (!serviceBusHelper2.ConnectionStringContainsEntityPath()) @@ -326,7 +333,7 @@ public void GetMessages() { using ( var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromQueue, MainForm.SingletonMainForm.TopCount, - serviceBusHelper.BrokeredMessageInspectors.Keys, queueDescription.RequiresSession)) + serviceBusHelper.BrokeredMessageInspectors.Keys, queueProperties.RequiresSession)) { if (receiveModeForm.ShowDialog() == DialogResult.OK) { @@ -339,7 +346,7 @@ public void GetMessages() ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) as IBrokeredMessageInspector : null; - if (queueDescription.EnablePartitioning) + if (queueProperties.EnablePartitioning) { ReadMessagesOneAtTheTime(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber, receiveModeForm.FromSession); @@ -354,7 +361,7 @@ as IBrokeredMessageInspector public void PurgeMessages(int numberOfMessages) { - if (queueDescription.EnablePartitioning) + if (queueProperties.EnablePartitioning) { ReadMessagesOneAtTheTime(false, true, numberOfMessages, null); } @@ -366,18 +373,18 @@ public void PurgeMessages(int numberOfMessages) public async Task PurgeMessagesAsync() { - await this.DoPurge(PurgeStrategies.Messages, $"Would you like to purge the {queueDescription.Path} queue?"); + await this.DoPurge(PurgeStrategies.Messages, $"Would you like to purge the {queueProperties.Name} queue?"); } public async Task PurgeDeadletterQueueMessagesAsync() { - await this.DoPurge(PurgeStrategies.DeadletteredMessages, $"Would you like to purge the dead-letter queue of the {queueDescription.Path} queue?"); + await this.DoPurge(PurgeStrategies.DeadletteredMessages, $"Would you like to purge the dead-letter queue of the {queueProperties.Name} queue?"); } public async Task PurgeAllMessagesAsync() { - await this.DoPurge(PurgeStrategies.All, $"Would you like to purge all (messages and dead-lettered messages) from the {queueDescription.Path} queue?"); + await this.DoPurge(PurgeStrategies.All, $"Would you like to purge all (messages and dead-lettered messages) from the {queueProperties.Name} queue?"); } private async Task DoPurge(PurgeStrategies purgeStrategy, string deleteConfirmation) @@ -392,7 +399,7 @@ private async Task DoPurge(PurgeStrategies purgeStrategy, string deleteConfirmat QueueServiceBusPurger purger = new QueueServiceBusPurger(this.serviceBusHelper.GetServiceBusHelper2()); purger.PurgeFailed += (o, e) => this.HandleException(e.Exception); purger.PurgeCompleted += (o, e) => writeToLog($"[{e.TotalMessagesPurged}] messages have been purged from the{(e.IsDeadLetterQueue ? " dead-letter queue of the" : "")} [{e.EntityPath}] queue in [{e.ElapsedMilliseconds / 1000}] seconds."); - await purger.Purge(purgeStrategy, await this.serviceBusHelper.GetQueueProperties(queueDescription)); + await purger.Purge(purgeStrategy, await this.serviceBusHelper2.GetQueueProperties(queueProperties)); await MainForm.SingletonMainForm.RefreshSelectedEntity(); Application.UseWaitCursor = false; @@ -412,7 +419,7 @@ public void GetDeadletterMessages() var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(receiveModeForm.Inspector) ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) as IBrokeredMessageInspector : null; - if (queueDescription.EnablePartitioning) + if (queueProperties.EnablePartitioning) { ReadDeadletterMessagesOneAtTheTime(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); } @@ -437,7 +444,7 @@ public void GetTransferDeadletterMessages() var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(receiveModeForm.Inspector) ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) as IBrokeredMessageInspector : null; - if (queueDescription.EnablePartitioning) + if (queueProperties.EnablePartitioning) { ReadTransferDeadletterMessagesOneAtTheTime(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); } @@ -448,11 +455,11 @@ public void GetTransferDeadletterMessages() } } - public void RefreshData(QueueDescription queue) + public void RefreshData(QueueProperties queue) { try { - queueDescription = queue; + queueProperties = queue; InitializeData(); } catch (Exception ex) @@ -470,7 +477,7 @@ public void GetMessageSessions() tabPageSessions.SuspendDrawing(); tabPageSessions.SuspendLayout(); - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueDescription.Path, + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueProperties.Name, ReceiveMode.PeekLock); var sessionEnumerable = queueClient.GetMessageSessions(); if (sessionEnumerable == null) @@ -490,7 +497,7 @@ public void GetMessageSessions() AllowNew = false, AllowRemove = false }; - writeToLog(string.Format(SessionsGotFromTheQueue, sessionBindingList.Count, queueDescription.Path)); + writeToLog(string.Format(SessionsGotFromTheQueue, sessionBindingList.Count, queueProperties.Name)); sessionsBindingSource.DataSource = sessionBindingList; sessionsDataGridView.DataSource = sessionsBindingSource; @@ -679,7 +686,7 @@ private void InitializeControls(bool initialCall) } - if (queueDescription != null) + if (queueProperties != null) { if (duplicateQueue) { @@ -1049,8 +1056,9 @@ private void ConfigureDuplicateUserInterface() // special handling for max size if partitioning is enabled trackBarMaxQueueSize.Maximum = serviceBusHelper.IsCloudNamespace ? 5 : 11; - trackBarMaxQueueSize.Value = queueDescription.EnablePartitioning ? queueDescription.MaxSizeInGigabytes() / 16 - : queueDescription.MaxSizeInGigabytes(); + trackBarMaxQueueSize.Value = (int)(queueProperties.EnablePartitioning + ? queueProperties.MaxSizeInMegabytes / 16 + : queueProperties.MaxSizeInMegabytes); ConfigureCreateUserInterface(); } @@ -1096,14 +1104,14 @@ private void bindingList_ListChanged(object sender, ListChangedEventArgs e) { if (e.ListChangedType == ListChangedType.ItemDeleted) { - if (queueDescription != null && - queueDescription.Authorization.Count > 0 && - queueDescription.Authorization.Count > e.NewIndex) + if (queueProperties != null && + queueProperties.AuthorizationRules.Count > 0 && + queueProperties.AuthorizationRules.Count > e.NewIndex) { - var rule = queueDescription.Authorization.ElementAt(e.NewIndex); + var rule = queueProperties.AuthorizationRules.ElementAt(e.NewIndex); if (rule != null) { - queueDescription.Authorization.Remove(rule); + queueProperties.AuthorizationRules.Remove(rule); } } } @@ -1118,7 +1126,7 @@ private void InitializeData() btnRefresh.Visible = true; btnChangeStatus.Visible = true; btnMessages.Visible = true; - btnSessions.Visible = queueDescription.RequiresSession; + btnSessions.Visible = queueProperties.RequiresSession; if (btnMessages.Visible && !btnSessions.Visible && !buttonsMoved) { @@ -1130,9 +1138,9 @@ private void InitializeData() // Authorization Rules BindingList bindingList; - if (queueDescription.Authorization.Count > 0) + if (queueProperties.AuthorizationRules.Count > 0) { - var enumerable = queueDescription.Authorization.Select(r => new AuthorizationRuleWrapper(r)); + var enumerable = queueProperties.AuthorizationRules.Select(r => new AuthorizationRuleWrapper(r)); bindingList = new BindingList(enumerable.ToList()) { AllowEdit = true, @@ -1159,40 +1167,40 @@ private void InitializeData() propertyList.AddRange(new[] { - new[] {Status, queueDescription.Status.ToString()}, - new[] {IsReadOnly, queueDescription.IsReadOnly.ToString()}, - new[] {SizeInBytes, queueDescription.SizeInBytes.ToString("N0")}, - new[] {CreatedAt, queueDescription.CreatedAt.ToString(CultureInfo.CurrentCulture)}, - new[] {AccessedAt, queueDescription.AccessedAt.ToString(CultureInfo.CurrentCulture)}, - new[] {UpdatedAt, queueDescription.UpdatedAt.ToString(CultureInfo.CurrentCulture)}, + new[] {Status, queueProperties.Status.ToString()}, + new[] {IsReadOnly, queueProperties.IsReadOnly.ToString()}, + new[] {SizeInBytes, queueProperties.SizeInBytes.ToString("N0")}, + new[] {CreatedAt, queueProperties.CreatedAt.ToString(CultureInfo.CurrentCulture)}, + new[] {AccessedAt, queueProperties.AccessedAt.ToString(CultureInfo.CurrentCulture)}, + new[] {UpdatedAt, queueProperties.UpdatedAt.ToString(CultureInfo.CurrentCulture)}, new[] { ActiveMessageCount, - queueDescription.MessageCountDetails.ActiveMessageCount.ToString("N0", CultureInfo.CurrentCulture) + queueProperties.MessageCountDetails.ActiveMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, new[] { DeadLetterCount, - queueDescription.MessageCountDetails.DeadLetterMessageCount.ToString("N0", + queueProperties.MessageCountDetails.DeadLetterMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, new[] { ScheduledMessageCount, - queueDescription.MessageCountDetails.ScheduledMessageCount.ToString("N0", CultureInfo.CurrentCulture) + queueProperties.MessageCountDetails.ScheduledMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, new[] { TransferMessageCount, - queueDescription.MessageCountDetails.TransferMessageCount.ToString("N0", CultureInfo.CurrentCulture) + queueProperties.MessageCountDetails.TransferMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, new[] { TransferDeadLetterMessageCount, - queueDescription.MessageCountDetails.TransferDeadLetterMessageCount.ToString("N0", + queueProperties.MessageCountDetails.TransferDeadLetterMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, - new[] {MessageCount, queueDescription.MessageCount.ToString("N0", CultureInfo.CurrentCulture)} + new[] {MessageCount, queueProperties.MessageCount.ToString("N0", CultureInfo.CurrentCulture)} }); propertyListView.Items.Clear(); @@ -1202,103 +1210,103 @@ private void InitializeData() } // Path - if (!string.IsNullOrWhiteSpace(queueDescription.Path)) + if (!string.IsNullOrWhiteSpace(queueProperties.Name)) { - txtPath.Text = queueDescription.Path; + txtPath.Text = queueProperties.Name; } // UserMetadata - if (!string.IsNullOrWhiteSpace(queueDescription.UserMetadata)) + if (!string.IsNullOrWhiteSpace(queueProperties.UserMetadata)) { - txtUserMetadata.Text = queueDescription.UserMetadata; + txtUserMetadata.Text = queueProperties.UserMetadata; } // ForwardTo - if (!string.IsNullOrWhiteSpace(queueDescription.ForwardTo)) + if (!string.IsNullOrWhiteSpace(queueProperties.ForwardTo)) { - txtForwardTo.Text = serviceBusHelper.GetAddressRelativeToNamespace(queueDescription.ForwardTo); + txtForwardTo.Text = serviceBusHelper.GetAddressRelativeToNamespace(queueProperties.ForwardTo); } // ForwardDeadLetteredMessagesTo - if (!string.IsNullOrWhiteSpace(queueDescription.ForwardDeadLetteredMessagesTo)) + if (!string.IsNullOrWhiteSpace(queueProperties.ForwardDeadLetteredMessagesTo)) { - txtForwardDeadLetteredMessagesTo.Text = serviceBusHelper.GetAddressRelativeToNamespace(queueDescription.ForwardDeadLetteredMessagesTo); + txtForwardDeadLetteredMessagesTo.Text = serviceBusHelper.GetAddressRelativeToNamespace(queueProperties.ForwardDeadLetteredMessagesTo); } // MaxQueueSizeInBytes trackBarMaxQueueSize.Value = serviceBusHelper.IsCloudNamespace - ? queueDescription.MaxSizeInGigabytes() - : queueDescription.MaxSizeInMegabytes == SeviceBusForWindowsServerMaxQueueSize - ? 11 : queueDescription.MaxSizeInGigabytes(); + ? queueProperties.MaxSizeInGigabytes() + : queueProperties.MaxSizeInMegabytes == SeviceBusForWindowsServerMaxQueueSize + ? 11 : queueProperties.MaxSizeInGigabytes(); // Update maximum and value if Maximum size is more than 5 Gigs (either premium or partitioned) - if (queueDescription.MaxSizeInGigabytes() > 5) + if (queueProperties.MaxSizeInGigabytes() > 5) { - trackBarMaxQueueSize.Maximum = queueDescription.MaxSizeInGigabytes(); - trackBarMaxQueueSize.Value = queueDescription.MaxSizeInGigabytes(); + trackBarMaxQueueSize.Maximum = queueProperties.MaxSizeInGigabytes(); + trackBarMaxQueueSize.Value = queueProperties.MaxSizeInGigabytes(); } // MaxDeliveryCount - txtMaxDeliveryCount.Text = queueDescription.MaxDeliveryCount.ToString(CultureInfo.InvariantCulture); + txtMaxDeliveryCount.Text = queueProperties.MaxDeliveryCount.ToString(CultureInfo.InvariantCulture); // DefaultMessageTimeToLive - tsDefaultMessageTimeToLive.TimeSpanValue = queueDescription.DefaultMessageTimeToLive; + tsDefaultMessageTimeToLive.TimeSpanValue = queueProperties.DefaultMessageTimeToLive; // DuplicateDetectionHistoryTimeWindow - tsDuplicateDetectionHistoryTimeWindow.TimeSpanValue = queueDescription.DuplicateDetectionHistoryTimeWindow; + tsDuplicateDetectionHistoryTimeWindow.TimeSpanValue = queueProperties.DuplicateDetectionHistoryTimeWindow; // LockDuration - tsLockDuration.TimeSpanValue = queueDescription.LockDuration; + tsLockDuration.TimeSpanValue = queueProperties.LockDuration; // AutoDeleteOnIdle - tsAutoDeleteOnIdle.TimeSpanValue = queueDescription.AutoDeleteOnIdle; + tsAutoDeleteOnIdle.TimeSpanValue = queueProperties.AutoDeleteOnIdle; // EnableBatchedOperations checkedListBox.SetItemChecked(EnableBatchedOperationsItemText, - queueDescription.EnableBatchedOperations); + queueProperties.EnableBatchedOperations); // EnableDeadLetteringOnMessageExpiration checkedListBox.SetItemChecked(EnableDeadLetteringOnMessageExpirationItemText, - queueDescription.EnableDeadLetteringOnMessageExpiration); + queueProperties.EnableDeadLetteringOnMessageExpiration); if (serviceBusHelper.IsCloudNamespace && !this.premiumNamespace) { // EnablePartitioning - checkedListBox.SetItemChecked(EnablePartitioningItemText, queueDescription.EnablePartitioning); + checkedListBox.SetItemChecked(EnablePartitioningItemText, queueProperties.EnablePartitioning); // EnableExpress - checkedListBox.SetItemChecked(EnableExpressItemText, queueDescription.EnableExpress); + checkedListBox.SetItemChecked(EnableExpressItemText, queueProperties.EnableExpress); } // RequiresDuplicateDetection checkedListBox.SetItemChecked(RequiresDuplicateDetectionItemText, - queueDescription.RequiresDuplicateDetection); + queueProperties.RequiresDuplicateDetection); // RequiresSession checkedListBox.SetItemChecked(RequiresSessionItemText, - queueDescription.RequiresSession); + queueProperties.RequiresSession); // SupportOrdering checkedListBox.SetItemChecked(SupportOrderingItemText, - queueDescription.SupportOrdering); + queueProperties.SupportOrdering); // IsAnonymousAccessible if (!serviceBusHelper.IsCloudNamespace) { checkedListBox.SetItemChecked(IsAnonymousAccessibleItemText, - queueDescription.IsAnonymousAccessible); + queueProperties.IsAnonymousAccessible); } } private MessageReceiver BuildMessageReceiver(ReceiveMode receiveMode, string? fromSession = null) { - if (fromSession == null && !queueDescription.RequiresSession) + if (fromSession == null && !queueProperties.RequiresSession) { - return serviceBusHelper.MessagingFactory.CreateMessageReceiver(queueDescription.Path, receiveMode); + return serviceBusHelper.MessagingFactory.CreateMessageReceiver(queueProperties.Name, receiveMode); } - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueDescription.Path, receiveMode); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueProperties.Name, receiveMode); var sessionAcceptTimeout = TimeSpan.FromSeconds(MainForm.SingletonMainForm.ReceiveTimeout); if (fromSession != null) { @@ -1351,7 +1359,7 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect break; } } - writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1376,7 +1384,7 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); } messageBindingList = new SortableBindingList(brokeredMessages) { @@ -1411,7 +1419,7 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect { writeToLog(string.Format(NoMessageReceivedFromTheQueue, MainForm.SingletonMainForm.ReceiveTimeout, - queueDescription.Path)); + queueProperties.Name)); } catch (NotSupportedException) { @@ -1462,7 +1470,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM brokeredMessages.Add(message); } } - writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1487,7 +1495,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); } messageBindingList = new SortableBindingList(brokeredMessages) { @@ -1520,7 +1528,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM { writeToLog(string.Format(NoMessageReceivedFromTheQueue, MainForm.SingletonMainForm.ReceiveTimeout, - queueDescription.Path)); + queueProperties.Name)); } catch (Exception e) { @@ -1540,7 +1548,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess Cursor.Current = Cursors.WaitCursor; var brokeredMessages = new List(); - var queuePath = QueueClient.FormatDeadLetterPath(queueDescription.Path); + var queuePath = QueueClient.FormatDeadLetterPath(queueProperties.Name); if (peek) { var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); @@ -1574,7 +1582,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1598,7 +1606,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - //if (!queueDescription.EnablePartitioning) + //if (!queueProperties.EnablePartitioning) //{ // queueClient.CompleteBatch(brokeredMessages.Select(bm => bm.LockToken)); //} @@ -1611,7 +1619,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess // brokeredMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); // } //} - writeToLog(string.Format(MessagesReceivedFromTheDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesReceivedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } deadletterBindingList = new SortableBindingList(brokeredMessages) @@ -1645,7 +1653,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess } catch (TimeoutException) { - writeToLog(string.Format(NoMessageReceivedFromTheDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueDescription.Path)); + writeToLog(string.Format(NoMessageReceivedFromTheDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueProperties.Name)); } catch (NotSupportedException) { @@ -1677,7 +1685,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok Cursor.Current = Cursors.WaitCursor; var brokeredMessages = new List(); - var queuePath = QueueClient.FormatTransferDeadLetterPath(queueDescription.Path); + var queuePath = QueueClient.FormatTransferDeadLetterPath(queueProperties.Name); if (peek) { var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); @@ -1711,7 +1719,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1735,7 +1743,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - //if (!queueDescription.EnablePartitioning) + //if (!queueProperties.EnablePartitioning) //{ // queueClient.CompleteBatch(brokeredMessages.Select(bm => bm.LockToken)); //} @@ -1748,7 +1756,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok // brokeredMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); // } //} - writeToLog(string.Format(MessagesReceivedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesReceivedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } transferDeadletterBindingList = new SortableBindingList(brokeredMessages) @@ -1782,7 +1790,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok } catch (TimeoutException) { - writeToLog(string.Format(NoMessageReceivedFromTheTransferDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueDescription.Path)); + writeToLog(string.Format(NoMessageReceivedFromTheTransferDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueProperties.Name)); } catch (NotSupportedException) { @@ -1807,7 +1815,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, try { var brokeredMessages = new List(); - var queuePath = QueueClient.FormatDeadLetterPath(queueDescription.Path); + var queuePath = QueueClient.FormatDeadLetterPath(queueProperties.Name); if (peek) { @@ -1835,7 +1843,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, } brokeredMessages.Add(message); } - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1858,7 +1866,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } deadletterBindingList = new SortableBindingList(brokeredMessages) { @@ -1890,7 +1898,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, } catch (TimeoutException) { - writeToLog(string.Format(NoMessageReceivedFromTheDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueDescription.Path)); + writeToLog(string.Format(NoMessageReceivedFromTheDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueProperties.Name)); } catch (Exception e) { @@ -1903,7 +1911,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int try { var brokeredMessages = new List(); - var queuePath = QueueClient.FormatTransferDeadLetterPath(queueDescription.Path); + var queuePath = QueueClient.FormatTransferDeadLetterPath(queueProperties.Name); if (peek) { @@ -1931,7 +1939,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int } brokeredMessages.Add(message); } - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } else { @@ -1954,7 +1962,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueDescription.Path)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); } transferDeadletterBindingList = new SortableBindingList(brokeredMessages) { @@ -1984,7 +1992,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int } catch (TimeoutException) { - writeToLog(string.Format(NoMessageReceivedFromTheTransferDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueDescription.Path)); + writeToLog(string.Format(NoMessageReceivedFromTheTransferDeadletterQueue, MainForm.SingletonMainForm.ReceiveTimeout, queueProperties.Name)); } catch (Exception e) { @@ -2002,7 +2010,7 @@ private async void btnCreateDelete_Click(object sender, EventArgs e) } if (btnCreateDelete.Text == DeleteText) { - using (var deleteForm = new DeleteForm(queueDescription.Path, QueueEntity.ToLower())) + using (var deleteForm = new DeleteForm(queueProperties.Name, QueueEntity.ToLower())) { var configuration = TwoFilesConfiguration.Create(TwoFilesConfiguration.GetCurrentConfigFileUse(), writeToLog); @@ -2012,12 +2020,12 @@ private async void btnCreateDelete_Click(object sender, EventArgs e) if (!disableAccidentalDeletionPrevention) { - deleteForm.ShowAccidentalDeletionPreventionCheck(configuration, $"Delete {queueDescription.Path} {QueueEntity.ToLower()}"); + deleteForm.ShowAccidentalDeletionPreventionCheck(configuration, $"Delete {queueProperties.Name} {QueueEntity.ToLower()}"); } if (deleteForm.ShowDialog() == DialogResult.OK) { - await serviceBusHelper.DeleteQueue(queueDescription); + await serviceBusHelper.DeleteQueue(queueProperties); } } } @@ -2046,7 +2054,7 @@ private async void btnCreateDelete_Click(object sender, EventArgs e) return; } - var description = new QueueDescription(txtPath.Text) + var description = new QueueProperties(txtPath.Text) { UserMetadata = txtUserMetadata.Text, ForwardTo = txtForwardTo.Text, @@ -2197,7 +2205,7 @@ private async void btnCreateDelete_Click(object sender, EventArgs e) } - queueDescription = serviceBusHelper.CreateQueue(description); + queueProperties = serviceBusHelper.CreateQueue(description); InitializeControls(initialCall: false); } } @@ -2222,25 +2230,25 @@ private void HandleException(Exception? ex) private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) { - if (queueDescription == null) + if (queueProperties == null) { return; } if (e.Index == checkedListBox.Items.IndexOf(EnablePartitioningItemText)) { - e.NewValue = queueDescription.EnablePartitioning ? CheckState.Checked : CheckState.Unchecked; + e.NewValue = queueProperties.EnablePartitioning ? CheckState.Checked : CheckState.Unchecked; } if (e.Index == checkedListBox.Items.IndexOf(RequiresSessionItemText)) { - e.NewValue = queueDescription.RequiresSession ? CheckState.Checked : CheckState.Unchecked; + e.NewValue = queueProperties.RequiresSession ? CheckState.Checked : CheckState.Unchecked; } if (e.Index == checkedListBox.Items.IndexOf(RequiresDuplicateDetectionItemText)) { - e.NewValue = queueDescription.RequiresDuplicateDetection ? CheckState.Checked : CheckState.Unchecked; + e.NewValue = queueProperties.RequiresDuplicateDetection ? CheckState.Checked : CheckState.Unchecked; } if (e.Index == checkedListBox.Items.IndexOf(IsAnonymousAccessibleItemText)) { - e.NewValue = queueDescription.IsAnonymousAccessible ? CheckState.Checked : CheckState.Unchecked; + e.NewValue = queueProperties.IsAnonymousAccessible ? CheckState.Checked : CheckState.Unchecked; } } @@ -2270,9 +2278,9 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) return; } - queueDescription.UserMetadata = txtUserMetadata.Text; - queueDescription.ForwardTo = string.IsNullOrWhiteSpace(txtForwardTo.Text) ? null : txtForwardTo.Text; - queueDescription.ForwardDeadLetteredMessagesTo = + queueProperties.UserMetadata = txtUserMetadata.Text; + queueProperties.ForwardTo = string.IsNullOrWhiteSpace(txtForwardTo.Text) ? null : txtForwardTo.Text; + queueProperties.ForwardDeadLetteredMessagesTo = string.IsNullOrWhiteSpace(txtForwardDeadLetteredMessagesTo.Text) ? null : txtForwardDeadLetteredMessagesTo.Text; @@ -2281,7 +2289,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) { if (int.TryParse(txtMaxDeliveryCount.Text, out var value)) { - queueDescription.MaxDeliveryCount = value; + queueProperties.MaxDeliveryCount = value; } else { @@ -2294,7 +2302,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) { if (tsDefaultMessageTimeToLive.TimeSpanValue.HasValue) { - queueDescription.DefaultMessageTimeToLive = tsDefaultMessageTimeToLive.TimeSpanValue.Value; + queueProperties.DefaultMessageTimeToLive = tsDefaultMessageTimeToLive.TimeSpanValue.Value; } else { @@ -2307,7 +2315,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) { if (tsDuplicateDetectionHistoryTimeWindow.TimeSpanValue.HasValue) { - queueDescription.DuplicateDetectionHistoryTimeWindow = tsDuplicateDetectionHistoryTimeWindow.TimeSpanValue.Value; + queueProperties.DuplicateDetectionHistoryTimeWindow = tsDuplicateDetectionHistoryTimeWindow.TimeSpanValue.Value; } else { @@ -2320,7 +2328,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) { if (tsAutoDeleteOnIdle.TimeSpanValue.HasValue) { - queueDescription.AutoDeleteOnIdle = tsAutoDeleteOnIdle.TimeSpanValue.Value; + queueProperties.AutoDeleteOnIdle = tsAutoDeleteOnIdle.TimeSpanValue.Value; } else { @@ -2333,7 +2341,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) { if (tsLockDuration.TimeSpanValue.HasValue) { - queueDescription.LockDuration = tsLockDuration.TimeSpanValue.Value; + queueProperties.LockDuration = tsLockDuration.TimeSpanValue.Value; } else { @@ -2342,14 +2350,14 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) } } - queueDescription.EnableBatchedOperations = + queueProperties.EnableBatchedOperations = checkedListBox.GetItemChecked(EnableBatchedOperationsItemText); - queueDescription.EnableExpress = checkedListBox.GetItemChecked(EnableExpressItemText, defaultValue: false); - queueDescription.EnableDeadLetteringOnMessageExpiration = + queueProperties.EnableExpress = checkedListBox.GetItemChecked(EnableExpressItemText, defaultValue: false); + queueProperties.EnableDeadLetteringOnMessageExpiration = checkedListBox.GetItemChecked(EnableDeadLetteringOnMessageExpirationItemText); - queueDescription.SupportOrdering = checkedListBox.GetItemChecked(SupportOrderingItemText); + queueProperties.SupportOrdering = checkedListBox.GetItemChecked(SupportOrderingItemText); - queueDescription.IsAnonymousAccessible = + queueProperties.IsAnonymousAccessible = checkedListBox.GetItemChecked(IsAnonymousAccessibleItemText, defaultValue: false); var bindingList = @@ -2390,18 +2398,18 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) if (string.IsNullOrWhiteSpace(rule.PrimaryKey) && string.IsNullOrWhiteSpace(rule.SecondaryKey)) { - queueDescription.Authorization.Add(new SharedAccessAuthorizationRule(rule.KeyName, + queueProperties.AuthorizationRules.Add(new SharedAccessAuthorizationRule(rule.KeyName, rightList)); } else if (string.IsNullOrWhiteSpace(rule.SecondaryKey)) { - queueDescription.Authorization.Add(new SharedAccessAuthorizationRule(rule.KeyName, + queueProperties.AuthorizationRules.Add(new SharedAccessAuthorizationRule(rule.KeyName, rule.PrimaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(), rightList)); } else { - queueDescription.Authorization.Add(new SharedAccessAuthorizationRule(rule.KeyName, + queueProperties.AuthorizationRules.Add(new SharedAccessAuthorizationRule(rule.KeyName, rule.PrimaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(), rule.SecondaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(), rightList)); @@ -2409,7 +2417,7 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) } else { - queueDescription.Authorization.Add(new AllowRule(rule.IssuerName, + queueProperties.AuthorizationRules.Add(new AllowRule(rule.IssuerName, rule.ClaimType, rule.ClaimValue, rightList)); @@ -2417,18 +2425,18 @@ private void btnCancelUpdate_Click(object sender, EventArgs e) } } - queueDescription.Status = EntityStatus.Disabled; - serviceBusHelper.UpdateQueue(queueDescription); + queueProperties.Status = EntityStatus.Disabled; + serviceBusHelper.UpdateQueue(queueProperties); } catch (Exception ex) { HandleException(ex); - queueDescription = serviceBusHelper.GetQueue(queueDescription.Path); + queueProperties = serviceBusHelper.GetQueue(queueProperties.Name); } finally { - queueDescription.Status = EntityStatus.Active; - queueDescription = serviceBusHelper.NamespaceManager.UpdateQueue(queueDescription); + queueProperties.Status = EntityStatus.Active; + queueProperties = serviceBusHelper2.UpdateQueue(queueProperties); InitializeData(); } } @@ -2508,18 +2516,18 @@ private SelectEntityForm creteSelectEntityFormForPath(string path) { if (!string.IsNullOrWhiteSpace(path)) { - QueueDescription queueDescriptionSource = default!; + QueueProperties queuePropertiesSource = default!; try { - queueDescriptionSource = serviceBusHelper.GetQueue(path); + queuePropertiesSource = serviceBusHelper2.GetQueue(path); } catch (Exception) { // we might have found a topic, and the sdk will throw with an indistinguishable MessagingException error. } - if (queueDescriptionSource != null) + if (queuePropertiesSource != null) { - return new SelectEntityForm(SelectEntityDialogTitle, SelectEntityGrouperTitle, SelectEntityLabelText, queueDescriptionSource); + return new SelectEntityForm(SelectEntityDialogTitle, SelectEntityGrouperTitle, SelectEntityLabelText, queuePropertiesSource); } TopicDescription topicDescriptionSource = default!; try @@ -3171,7 +3179,7 @@ private void messagesDataGridView_CellDoubleClick(object sender, DataGridViewCel { return; } - using (var messageForm = new MessageForm(queueDescription, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) + using (var messageForm = new MessageForm(queueProperties, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) { messageForm.ShowDialog(); } @@ -3188,7 +3196,7 @@ private void deadletterDataGridView_CellDoubleClick(object sender, DataGridViewC { return; } - using (var messageForm = new MessageForm(queueDescription, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) + using (var messageForm = new MessageForm(queueProperties, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) { messageForm.ShowDialog(); @@ -3218,7 +3226,7 @@ private void transferDeadletterDataGridView_CellDoubleClick(object sender, DataG { return; } - using (var messageForm = new MessageForm(queueDescription, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) + using (var messageForm = new MessageForm(queueProperties, bindingList[e.RowIndex], serviceBusHelper, writeToLog)) { messageForm.ShowDialog(); } @@ -3362,7 +3370,7 @@ private void ResubmitSelectedMessages() return; } - using (var form = new MessageForm(queueDescription, messagesDataGridView.SelectedRows.Cast() + using (var form = new MessageForm(queueProperties, messagesDataGridView.SelectedRows.Cast() .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); @@ -3394,12 +3402,12 @@ async void deleteSelectedMessagesToolStripMenuItem_Click(object sender, EventArg if (messages.Count() == 1) { confirmationText = "Are you sure you want to delete the selected message from the " + - $"dead-letter subqueue for the {queueDescription.Path} queue?"; + $"dead-letter subqueue for the {queueProperties.Name} queue?"; } else { confirmationText = $"Are you sure you want to delete {messages.Count()} messages from the " + - $"dead-letter subqueue for {queueDescription.Path} queue?"; + $"dead-letter subqueue for {queueProperties.Name} queue?"; } using (var deleteForm = new DeleteForm(confirmationText)) @@ -3412,7 +3420,7 @@ async void deleteSelectedMessagesToolStripMenuItem_Click(object sender, EventArg var sequenceNumbersToDelete = messages.Select(s => s?.SequenceNumber).ToList(); var deadLetterMessageHandler = new DeadLetterMessageHandler(writeToLog, serviceBusHelper, - MainForm.SingletonMainForm.ReceiveTimeout, queueDescription); + MainForm.SingletonMainForm.ReceiveTimeout, queueProperties); try { @@ -3512,7 +3520,7 @@ async Task ResubmitSelectedDeadletterMessages() return; } - using (var form = new MessageForm(queueDescription, deadletterDataGridView.SelectedRows.Cast() + using (var form = new MessageForm(queueProperties, deadletterDataGridView.SelectedRows.Cast() .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); @@ -3548,7 +3556,7 @@ private void resubmitSelectedTransferDeadletterMessagesInBatchModeToolStripMenuI { return; } - using (var form = new MessageForm(queueDescription, transferDeadletterDataGridView.SelectedRows.Cast() + using (var form = new MessageForm(queueProperties, transferDeadletterDataGridView.SelectedRows.Cast() .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); diff --git a/src/ServiceBusExplorer/Forms/MainForm.cs b/src/ServiceBusExplorer/Forms/MainForm.cs index 275e0644..c80935c1 100644 --- a/src/ServiceBusExplorer/Forms/MainForm.cs +++ b/src/ServiceBusExplorer/Forms/MainForm.cs @@ -1679,7 +1679,7 @@ private void renameEntity_Click(object sender, EventArgs e) { return; } - serviceBusHelper.RenameQueue(queueDescription.Path, parameterForm.ParameterValues[0]); + serviceBusHelper2.RenameQueue(queueDescription.Path, parameterForm.ParameterValues[0]); return; } } @@ -2160,7 +2160,7 @@ private async void deleteEntity_Click(object sender, EventArgs e) if (deleteForm.ShowDialog() == DialogResult.OK) { - await serviceBusHelper.DeleteQueue(queueDescription); + await serviceBusHelper2.DeleteQueue(queueDescription); } } return; @@ -2404,7 +2404,7 @@ private void changeStatusQueueMenuItem_DropDownOpening(object sender, EventArgs if (tag != null) { // Put a check against the item that reflects the current status of the queue - var queueDescription = serviceBusHelper.GetQueue(tag.Path); + var queueDescription = serviceBusHelper2.GetQueue(tag.Path); var status = queueDescription.Status; foreach (var dropDownItem in changeStatusQueueMenuItem.DropDownItems) { @@ -2439,7 +2439,7 @@ private async void changeStatusQueue_Click(object sender, ToolStripItemClickedEv if (changeStatusForm.ShowDialog() == DialogResult.OK) { queueDescription.Status = (Microsoft.ServiceBus.Messaging.EntityStatus)e.ClickedItem.Tag; - serviceBusHelper.NamespaceManager.UpdateQueue(queueDescription); + serviceBusHelper2.UpdateQueue(queueDescription); await RefreshSelectedEntity(); } } @@ -2834,7 +2834,7 @@ public async Task RefreshSelectedEntity() var tag = serviceBusTreeView.SelectedNode.Tag as QueueDescription; if (tag != null) { - var queueDescription = serviceBusHelper.GetQueue(tag.Path); + var queueDescription = serviceBusHelper2.GetQueue(tag.Path); RefreshQueueNode(serviceBusTreeView.SelectedNode, queueDescription); // Update the right view diff --git a/src/ServiceBusExplorer/Forms/MessageForm.cs b/src/ServiceBusExplorer/Forms/MessageForm.cs index 0a7ff931..703b9da3 100644 --- a/src/ServiceBusExplorer/Forms/MessageForm.cs +++ b/src/ServiceBusExplorer/Forms/MessageForm.cs @@ -41,6 +41,8 @@ namespace ServiceBusExplorer.Forms { + using Azure.Messaging.ServiceBus.Administration; + public partial class MessageForm : Form { #region Private Constants @@ -87,7 +89,7 @@ public partial class MessageForm : Form readonly ServiceBusHelper serviceBusHelper; readonly WriteToLogDelegate writeToLog; readonly BindingSource bindingSource = new BindingSource(); - readonly QueueDescription queueDescription; // Might be null + readonly QueueProperties queueProperties; // Might be null readonly SubscriptionWrapper subscriptionWrapper; // Might be null #endregion @@ -209,11 +211,11 @@ public MessageForm(BrokeredMessage brokeredMessage, ServiceBusHelper serviceBusH } } - public MessageForm(QueueDescription queueDescription, BrokeredMessage brokeredMessage, + public MessageForm(QueueProperties queueProperties, BrokeredMessage brokeredMessage, ServiceBusHelper serviceBusHelper, WriteToLogDelegate writeToLog) : this(brokeredMessage, serviceBusHelper, writeToLog) { - this.queueDescription = queueDescription; + this.queueProperties = queueProperties; } public MessageForm(SubscriptionWrapper subscriptionWrapper, BrokeredMessage brokeredMessage, @@ -260,11 +262,11 @@ public MessageForm(IEnumerable brokeredMessages, ServiceBusHelp } } - public MessageForm(QueueDescription queueDescription, IEnumerable brokeredMessages, + public MessageForm(QueueProperties queueProperties, IEnumerable brokeredMessages, ServiceBusHelper serviceBusHelper, WriteToLogDelegate writeToLog) : this(brokeredMessages, serviceBusHelper, writeToLog) { - this.queueDescription = queueDescription; + this.queueProperties = queueProperties; } public MessageForm(SubscriptionWrapper subscriptionWrapper, IEnumerable brokeredMessages, @@ -305,7 +307,7 @@ private void MessageForm_Load(object sender, EventArgs e) txtMessageText.Focus(); txtMessageText.SelectionLength = 0; - if (queueDescription != null || subscriptionWrapper != null) + if (queueProperties != null || subscriptionWrapper != null) { chkRemove.Visible = true; } @@ -507,11 +509,11 @@ private async void btnSubmit_Click(object sender, EventArgs e) messageSender.Path, stopwatch.ElapsedMilliseconds)); } - if (null != queueDescription) + if (null != queueProperties) { - if (!messageSender.Path.Equals(queueDescription.Path, StringComparison.InvariantCultureIgnoreCase)) + if (!messageSender.Path.Equals(queueProperties.Name, StringComparison.InvariantCultureIgnoreCase)) { - await MainForm.SingletonMainForm.RefreshServiceBusEntityNode(queueDescription.Path); + await MainForm.SingletonMainForm.RefreshServiceBusEntityNode(queueProperties.Name); } } else if (null != subscriptionWrapper?.SubscriptionDescription?.TopicPath) @@ -563,16 +565,16 @@ private async void btnSubmit_Click(object sender, EventArgs e) DeadLetterMessageHandler CreateDeadLetterMessageHandler() { - if (queueDescription != null) + if (queueProperties != null) { if (subscriptionWrapper != null) { throw new ArgumentException( - "At least one of the arguments queueDescription and subscriptionWrapper must be null."); + "At least one of the arguments queueProperties and subscriptionWrapper must be null."); } return new DeadLetterMessageHandler(writeToLog, serviceBusHelper, - MainForm.SingletonMainForm.ReceiveTimeout, queueDescription); + MainForm.SingletonMainForm.ReceiveTimeout, queueProperties); } if (subscriptionWrapper != null) @@ -581,21 +583,21 @@ DeadLetterMessageHandler CreateDeadLetterMessageHandler() MainForm.SingletonMainForm.ReceiveTimeout, subscriptionWrapper); } - throw new ArgumentException("queueDescription or subscriptionWrapper must be set."); + throw new ArgumentException("queueProperties or subscriptionWrapper must be set."); } SelectEntityForm CreateSelectEntityForm() { - if (queueDescription != null) + if (queueProperties != null) { if (subscriptionWrapper != null) { throw new ArgumentException( - "At least one of the arguments queueDescription and subscriptionWrapper must be null."); + "At least one of the arguments queueProperties and subscriptionWrapper must be null."); } return new SelectEntityForm(SelectEntityDialogTitle, SelectEntityGrouperTitle, - SelectEntityLabelText, queueDescription); + SelectEntityLabelText, queueProperties); } if (subscriptionWrapper != null) diff --git a/src/ServiceBusExplorer/Forms/SelectEntityForm.cs b/src/ServiceBusExplorer/Forms/SelectEntityForm.cs index d987ad6b..3411b6e8 100644 --- a/src/ServiceBusExplorer/Forms/SelectEntityForm.cs +++ b/src/ServiceBusExplorer/Forms/SelectEntityForm.cs @@ -32,6 +32,8 @@ namespace ServiceBusExplorer.Forms { + using Azure.Messaging.ServiceBus.Administration; + public partial class SelectEntityForm : Form { #region Private Constants @@ -66,7 +68,7 @@ public partial class SelectEntityForm : Form readonly bool includeEventHubs; readonly bool includeNotificationHubs; readonly bool includeRelays; - readonly QueueDescription queueDescriptionSource; // Might be null + readonly QueueProperties queuePropertiesSource; // Might be null readonly TopicDescription topicDescriptionSource; // Might be null #endregion @@ -122,7 +124,7 @@ public SelectEntityForm(string dialogTitle, public SelectEntityForm(string dialogTitle, string groupTitle, string labelText, - QueueDescription queueDescriptionSource, + QueueProperties queuePropertiesSource, bool subscriptions = false, bool eventHubs = false, bool notificationHubs = false, @@ -134,7 +136,7 @@ public SelectEntityForm(string dialogTitle, notificationHubs, relays) { - this.queueDescriptionSource = queueDescriptionSource; + this.queuePropertiesSource = queuePropertiesSource; } public SelectEntityForm(string dialogTitle, @@ -185,7 +187,7 @@ bool FocusNodeIfMatching(TreeNode treeNode, Func getPath, string s } // Select the queue where it is coming from since that is likely where it will go - if (queueDescriptionSource != null) + if (queuePropertiesSource != null) { foreach (TreeNode rootNode in serviceBusTreeView.Nodes) { @@ -193,7 +195,7 @@ bool FocusNodeIfMatching(TreeNode treeNode, Func getPath, string s { if (level1Node.Text == QueueEntities || level1Node.Text == FilteredQueueEntities) { - if (FocusNodeIfMatching(level1Node, qd => qd.Path, queueDescriptionSource.Path)) + if (FocusNodeIfMatching(level1Node, qd => qd.Name, queuePropertiesSource.Name)) { return; } @@ -265,10 +267,10 @@ public override sealed string Text #region Private Methods void SetTextAndType(TreeNode node) { - var queueTag = node.Tag as QueueDescription; + var queueTag = node.Tag as QueueProperties; if (queueTag != null) { - txtEntity.Text = queueTag.Path; + txtEntity.Text = queueTag.Name; Type = QueueEntity; return; } @@ -334,7 +336,7 @@ private void CloneNode(TreeNode node, TreeNode parent) parent.Nodes.Add(node.Text, node.Text, node.ImageIndex, node.SelectedImageIndex); if (node.Tag != null) { - if (node.Tag is QueueDescription || + if (node.Tag is QueueProperties || node.Tag is TopicDescription || (includeSubscriptions && node.Tag is SubscriptionWrapper && ((SubscriptionWrapper)node.Tag).SubscriptionDescription != null) || (includeEventHubs && (node.Tag is EventHubDescription || node.Tag is ConsumerGroupDescription)) || From 79765a6700f949c4923a6affbf573e8b70cad482 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Mon, 13 Nov 2023 19:36:42 +0100 Subject: [PATCH 09/12] fix handle queue control --- .../Controls/HandleQueueControl.cs | 294 +++++++++--------- 1 file changed, 148 insertions(+), 146 deletions(-) diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs index eedbee0f..ca2938a9 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs @@ -24,7 +24,7 @@ #region Using Directives #nullable enable -using Microsoft.ServiceBus.Messaging; +using Azure.Messaging.ServiceBus.Administration; using ServiceBusExplorer.Forms; using ServiceBusExplorer.Helpers; @@ -50,6 +50,7 @@ namespace ServiceBusExplorer.Controls { + using Azure.Messaging.ServiceBus; using Azure.Messaging.ServiceBus.Administration; using AccessRights = Microsoft.ServiceBus.Messaging.AccessRights; using EntityStatus = Microsoft.ServiceBus.Messaging.EntityStatus; @@ -222,8 +223,8 @@ public partial class HandleQueueControl : UserControl private const string TxtExtension = "txt"; private const string JsonFilter = "JSON Files|*.json|Text Documents|*.txt"; private const string AllFilesFilter = "Text Documents|*.txt|JSON Files|*.json|XML Files|*.xml|All Files (*.*)|*.*"; - private const string MessageFileFormat = "BrokeredMessage_{0}_{1}.json"; - private const string MessageFileFormatAutoRecognize = "BrokeredMessage_{0}_{1}.txt"; + private const string MessageFileFormat = "ServiceBusMessage_{0}_{1}.json"; + private const string MessageFileFormatAutoRecognize = "ServiceBusMessage_{0}_{1}.txt"; //*************************** // Pages @@ -245,9 +246,9 @@ public partial class HandleQueueControl : UserControl private readonly string path = default!; private readonly List hiddenPages = new List(); private readonly bool premiumNamespace; - private BrokeredMessage brokeredMessage = default!; - private BrokeredMessage deadletterMessage = default!; - private BrokeredMessage transferDeadletterMessage = default!; + private ServiceBusMessage ServiceBusMessage = default!; + private ServiceBusMessage deadletterMessage = default!; + private ServiceBusMessage transferDeadletterMessage = default!; private int currentMessageRowIndex = default!; private int currentDeadletterMessageRowIndex = default!; private int currentTransferDeadletterMessageRowIndex = default!; @@ -258,9 +259,9 @@ public partial class HandleQueueControl : UserControl private DateTime? messagesFilterToDate = default!; private DateTime? deadletterFilterFromDate = default!; private DateTime? deadletterFilterToDate = default!; - private SortableBindingList messageBindingList = default!; - private SortableBindingList deadletterBindingList = default!; - private SortableBindingList transferDeadletterBindingList = default!; + private SortableBindingList messageBindingList = default!; + private SortableBindingList deadletterBindingList = default!; + private SortableBindingList transferDeadletterBindingList = default!; private SortableBindingList sessionBindingList = default!; private bool buttonsMoved; private readonly bool duplicateQueue; @@ -333,7 +334,7 @@ public void GetMessages() { using ( var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromQueue, MainForm.SingletonMainForm.TopCount, - serviceBusHelper.BrokeredMessageInspectors.Keys, queueProperties.RequiresSession)) + serviceBusHelper.ServiceBusMessageInspectors.Keys, queueProperties.RequiresSession)) { if (receiveModeForm.ShowDialog() == DialogResult.OK) { @@ -341,10 +342,10 @@ public void GetMessages() messageCustomPropertyGrid.SelectedObject = null; messagePropertyGrid.SelectedObject = null; var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && - serviceBusHelper.BrokeredMessageInspectors.ContainsKey( + serviceBusHelper.ServiceBusMessageInspectors.ContainsKey( receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) - as IBrokeredMessageInspector + ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) + as IServiceBusMessageInspector : null; if (queueProperties.EnablePartitioning) { @@ -407,7 +408,7 @@ private async Task DoPurge(PurgeStrategies purgeStrategy, string deleteConfirmat public void GetDeadletterMessages() { - using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.BrokeredMessageInspectors.Keys)) + using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.ServiceBusMessageInspectors.Keys)) { if (receiveModeForm.ShowDialog() != DialogResult.OK) { @@ -416,8 +417,8 @@ public void GetDeadletterMessages() txtDeadletterText.Text = string.Empty; deadletterCustomPropertyGrid.SelectedObject = null; deadletterPropertyGrid.SelectedObject = null; - var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) as IBrokeredMessageInspector + var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.ServiceBusMessageInspectors.ContainsKey(receiveModeForm.Inspector) + ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) as IServiceBusMessageInspector : null; if (queueProperties.EnablePartitioning) { @@ -432,7 +433,7 @@ public void GetDeadletterMessages() public void GetTransferDeadletterMessages() { - using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromTransferDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.BrokeredMessageInspectors.Keys)) + using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromTransferDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.ServiceBusMessageInspectors.Keys)) { if (receiveModeForm.ShowDialog() != DialogResult.OK) { @@ -441,8 +442,8 @@ public void GetTransferDeadletterMessages() txtTransferDeadletterText.Text = string.Empty; transferDeadletterCustomPropertyGrid.SelectedObject = null; transferDeadletterPropertyGrid.SelectedObject = null; - var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) as IBrokeredMessageInspector + var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.ServiceBusMessageInspectors.ContainsKey(receiveModeForm.Inspector) + ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) as IServiceBusMessageInspector : null; if (queueProperties.EnablePartitioning) { @@ -1168,7 +1169,7 @@ private void InitializeData() propertyList.AddRange(new[] { new[] {Status, queueProperties.Status.ToString()}, - new[] {IsReadOnly, queueProperties.IsReadOnly.ToString()}, + /*new[] {IsReadOnly, queueProperties.IsReadOnly.ToString()}, new[] {SizeInBytes, queueProperties.SizeInBytes.ToString("N0")}, new[] {CreatedAt, queueProperties.CreatedAt.ToString(CultureInfo.CurrentCulture)}, new[] {AccessedAt, queueProperties.AccessedAt.ToString(CultureInfo.CurrentCulture)}, @@ -1200,7 +1201,7 @@ private void InitializeData() queueProperties.MessageCountDetails.TransferDeadLetterMessageCount.ToString("N0", CultureInfo.CurrentCulture) }, - new[] {MessageCount, queueProperties.MessageCount.ToString("N0", CultureInfo.CurrentCulture)} + new[] {MessageCount, queueProperties.MessageCount.ToString("N0", CultureInfo.CurrentCulture)}*/ }); propertyListView.Items.Clear(); @@ -1234,16 +1235,16 @@ private void InitializeData() } // MaxQueueSizeInBytes - trackBarMaxQueueSize.Value = serviceBusHelper.IsCloudNamespace - ? queueProperties.MaxSizeInGigabytes() + trackBarMaxQueueSize.Value = (int)(serviceBusHelper.IsCloudNamespace + ? queueProperties.MaxSizeInMegabytes : queueProperties.MaxSizeInMegabytes == SeviceBusForWindowsServerMaxQueueSize - ? 11 : queueProperties.MaxSizeInGigabytes(); + ? 11 : queueProperties.MaxSizeInMegabytes); // Update maximum and value if Maximum size is more than 5 Gigs (either premium or partitioned) - if (queueProperties.MaxSizeInGigabytes() > 5) + if (queueProperties.MaxSizeInMegabytes > 5) { - trackBarMaxQueueSize.Maximum = queueProperties.MaxSizeInGigabytes(); - trackBarMaxQueueSize.Value = queueProperties.MaxSizeInGigabytes(); + trackBarMaxQueueSize.Maximum = (int)queueProperties.MaxSizeInMegabytes; + trackBarMaxQueueSize.Value = (int)queueProperties.MaxSizeInMegabytes; } // MaxDeliveryCount @@ -1267,7 +1268,7 @@ private void InitializeData() // EnableDeadLetteringOnMessageExpiration checkedListBox.SetItemChecked(EnableDeadLetteringOnMessageExpirationItemText, - queueProperties.EnableDeadLetteringOnMessageExpiration); + queueProperties.DeadLetteringOnMessageExpiration); if (serviceBusHelper.IsCloudNamespace && !this.premiumNamespace) @@ -1315,7 +1316,7 @@ private MessageReceiver BuildMessageReceiver(ReceiveMode receiveMode, string? fr return queueClient.AcceptMessageSession(sessionAcceptTimeout); } - private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) + private void GetMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) { try { @@ -1325,7 +1326,7 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect tabPageMessages.SuspendLayout(); Cursor.Current = Cursors.WaitCursor; - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); if (peek) { var totalRetrieved = 0; @@ -1333,7 +1334,7 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect var receiver = BuildMessageReceiver(ReceiveMode.PeekLock, fromSession); while (totalRetrieved < count) { - IEnumerable messageEnumerable; + IEnumerable messageEnumerable; if (totalRetrieved == 0 && fromSequenceNumber.HasValue) { @@ -1348,18 +1349,18 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect { break; } - var messageArray = messageEnumerable as BrokeredMessage[] ?? messageEnumerable.ToArray(); + var messageArray = messageEnumerable as ServiceBusMessage[] ?? messageEnumerable.ToArray(); var partialList = messageInspector != null ? messageArray.Select(b => messageInspector.AfterReceiveMessage(b)).ToList() - : new List(messageArray); - brokeredMessages.AddRange(partialList); + : new List(messageArray); + ServiceBusMessages.AddRange(partialList); totalRetrieved += partialList.Count; if (partialList.Count == 0) { break; } } - writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1373,20 +1374,20 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect ? MainForm.SingletonMainForm.TopCount : count - totalRetrieved, TimeSpan.FromSeconds(MainForm.SingletonMainForm.ReceiveTimeout)); - var enumerable = messages as BrokeredMessage[] ?? messages.ToArray(); + var enumerable = messages as ServiceBusMessage[] ?? messages.ToArray(); retrieved = enumerable.Length; if (retrieved == 0) { continue; } totalRetrieved += retrieved; - brokeredMessages.AddRange(messageInspector != null + ServiceBusMessages.AddRange(messageInspector != null ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesReceivedFromTheQueue, ServiceBusMessages.Count, queueProperties.Name)); } - messageBindingList = new SortableBindingList(brokeredMessages) + messageBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -1439,18 +1440,18 @@ private void GetMessages(bool peek, bool all, int count, IBrokeredMessageInspect } } - private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) + private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) { try { - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); if (peek) { var messageReceiver = BuildMessageReceiver(ReceiveMode.PeekLock, fromSession); for (var i = 0; i < count; i++) { - BrokeredMessage message; + ServiceBusMessage message; if (i == 0 && fromSequenceNumber.HasValue) { @@ -1467,10 +1468,10 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM { message = messageInspector.AfterReceiveMessage(message); } - brokeredMessages.Add(message); + ServiceBusMessages.Add(message); } } - writeToLog(string.Format(MessagesPeekedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1490,14 +1491,14 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM totalRetrieved += retrieved; if (message != null) { - brokeredMessages.Add(messageInspector != null + ServiceBusMessages.Add(messageInspector != null ? messageInspector.AfterReceiveMessage(message) : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesReceivedFromTheQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesReceivedFromTheQueue, ServiceBusMessages.Count, queueProperties.Name)); } - messageBindingList = new SortableBindingList(brokeredMessages) + messageBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -1536,7 +1537,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredM } } - private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) + private void GetDeadletterMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1546,7 +1547,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess tabPageDeadletter.SuspendLayout(); Cursor.Current = Cursors.WaitCursor; - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); var queuePath = QueueClient.FormatDeadLetterPath(queueProperties.Name); if (peek) @@ -1556,7 +1557,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess var retrieved = 0; do { - IEnumerable messages; + IEnumerable messages; if (retrieved == 0 && fromSequenceNumber.HasValue) { @@ -1571,18 +1572,18 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess : count - totalRetrieved); } - var enumerable = messages as BrokeredMessage[] ?? messages.ToArray(); + var enumerable = messages as ServiceBusMessage[] ?? messages.ToArray(); retrieved = enumerable.Length; if (retrieved == 0) { continue; } totalRetrieved += retrieved; - brokeredMessages.AddRange(messageInspector != null + ServiceBusMessages.AddRange(messageInspector != null ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1595,34 +1596,34 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess ? MainForm.SingletonMainForm.TopCount : count - totalRetrieved, TimeSpan.FromSeconds(MainForm.SingletonMainForm.ReceiveTimeout)); - var enumerable = messages as BrokeredMessage[] ?? messages.ToArray(); + var enumerable = messages as ServiceBusMessage[] ?? messages.ToArray(); retrieved = enumerable.Length; if (retrieved == 0) { continue; } totalRetrieved += retrieved; - brokeredMessages.AddRange(messageInspector != null + ServiceBusMessages.AddRange(messageInspector != null ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); //if (!queueProperties.EnablePartitioning) //{ - // queueClient.CompleteBatch(brokeredMessages.Select(bm => bm.LockToken)); + // queueClient.CompleteBatch(ServiceBusMessages.Select(bm => bm.LockToken)); //} //else //{ - // foreach (var partitionKey in brokeredMessages.Select(bm => bm.PartitionKey).Distinct()) + // foreach (var partitionKey in ServiceBusMessages.Select(bm => bm.PartitionKey).Distinct()) // { // var key = partitionKey; // queueClient.CompleteBatch( - // brokeredMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); + // ServiceBusMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); // } //} - writeToLog(string.Format(MessagesReceivedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesReceivedFromTheDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } - deadletterBindingList = new SortableBindingList(brokeredMessages) + deadletterBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -1673,7 +1674,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMess } } - private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) + private void GetTransferDeadletterMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1683,7 +1684,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok tabPageTransferDeadletter.SuspendLayout(); Cursor.Current = Cursors.WaitCursor; - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); var queuePath = QueueClient.FormatTransferDeadLetterPath(queueProperties.Name); if (peek) @@ -1693,7 +1694,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok var retrieved = 0; do { - IEnumerable messages; + IEnumerable messages; if (retrieved == 0 && fromSequenceNumber.HasValue) { @@ -1708,18 +1709,18 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok : count - totalRetrieved); } - var enumerable = messages as BrokeredMessage[] ?? messages.ToArray(); + var enumerable = messages as ServiceBusMessage[] ?? messages.ToArray(); retrieved = enumerable.Length; if (retrieved == 0) { continue; } totalRetrieved += retrieved; - brokeredMessages.AddRange(messageInspector != null + ServiceBusMessages.AddRange(messageInspector != null ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1732,34 +1733,34 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok ? MainForm.SingletonMainForm.TopCount : count - totalRetrieved, TimeSpan.FromSeconds(MainForm.SingletonMainForm.ReceiveTimeout)); - var enumerable = messages as BrokeredMessage[] ?? messages.ToArray(); + var enumerable = messages as ServiceBusMessage[] ?? messages.ToArray(); retrieved = enumerable.Length; if (retrieved == 0) { continue; } totalRetrieved += retrieved; - brokeredMessages.AddRange(messageInspector != null + ServiceBusMessages.AddRange(messageInspector != null ? enumerable.Select(b => messageInspector.AfterReceiveMessage(b)) : enumerable); } while (retrieved > 0 && (all || count > totalRetrieved)); //if (!queueProperties.EnablePartitioning) //{ - // queueClient.CompleteBatch(brokeredMessages.Select(bm => bm.LockToken)); + // queueClient.CompleteBatch(ServiceBusMessages.Select(bm => bm.LockToken)); //} //else //{ - // foreach (var partitionKey in brokeredMessages.Select(bm => bm.PartitionKey).Distinct()) + // foreach (var partitionKey in ServiceBusMessages.Select(bm => bm.PartitionKey).Distinct()) // { // var key = partitionKey; // queueClient.CompleteBatch( - // brokeredMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); + // ServiceBusMessages.Where(bm => bm.PartitionKey == key).Select(bm => bm.LockToken)); // } //} - writeToLog(string.Format(MessagesReceivedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesReceivedFromTheTransferDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } - transferDeadletterBindingList = new SortableBindingList(brokeredMessages) + transferDeadletterBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -1810,11 +1811,11 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrok } } - private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) + private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) { try { - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); var queuePath = QueueClient.FormatDeadLetterPath(queueProperties.Name); if (peek) @@ -1822,7 +1823,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); for (var i = 0; i < count; i++) { - BrokeredMessage message; + ServiceBusMessage message; if (i == 0 && fromSequenceNumber.HasValue) { @@ -1841,9 +1842,9 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, { message = messageInspector.AfterReceiveMessage(message); } - brokeredMessages.Add(message); + ServiceBusMessages.Add(message); } - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1861,14 +1862,14 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, totalRetrieved += retrieved; if (message != null) { - brokeredMessages.Add(messageInspector != null + ServiceBusMessages.Add(messageInspector != null ? messageInspector.AfterReceiveMessage(message) : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } - deadletterBindingList = new SortableBindingList(brokeredMessages) + deadletterBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -1906,11 +1907,11 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, } } - private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) + private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) { try { - var brokeredMessages = new List(); + var ServiceBusMessages = new List(); var queuePath = QueueClient.FormatTransferDeadLetterPath(queueProperties.Name); if (peek) @@ -1918,7 +1919,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); for (var i = 0; i < count; i++) { - BrokeredMessage message; + ServiceBusMessage message; if (i == 0 && fromSequenceNumber.HasValue) { @@ -1937,9 +1938,9 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int { message = messageInspector.AfterReceiveMessage(message); } - brokeredMessages.Add(message); + ServiceBusMessages.Add(message); } - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } else { @@ -1957,14 +1958,14 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int totalRetrieved += retrieved; if (message != null) { - brokeredMessages.Add(messageInspector != null + ServiceBusMessages.Add(messageInspector != null ? messageInspector.AfterReceiveMessage(message) : message); } } while (retrieved > 0 && (all || count > totalRetrieved)); - writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, brokeredMessages.Count, queueProperties.Name)); + writeToLog(string.Format(MessagesPeekedFromTheTransferDeadletterQueue, ServiceBusMessages.Count, queueProperties.Name)); } - transferDeadletterBindingList = new SortableBindingList(brokeredMessages) + transferDeadletterBindingList = new SortableBindingList(ServiceBusMessages) { AllowEdit = false, AllowNew = false, @@ -2182,7 +2183,7 @@ private async void btnCreateDelete_Click(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(rule.SecondaryKey)) { - description.Authorization.Add(new SharedAccessAuthorizationRule(rule.KeyName, + description.AuthorizationRules.Add(new SharedAccessAuthorizationRule(rule.KeyName, rule.PrimaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(), rightList)); } @@ -2248,7 +2249,8 @@ private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) } if (e.Index == checkedListBox.Items.IndexOf(IsAnonymousAccessibleItemText)) { - e.NewValue = queueProperties.IsAnonymousAccessible ? CheckState.Checked : CheckState.Unchecked; + // todo missing public get + e.NewValue = /*queueProperties.IsAnonymousAccessible*/false ? CheckState.Checked : CheckState.Unchecked; } } @@ -2884,22 +2886,22 @@ private void messagesDataGridView_RowEnter(object sender, DataGridViewCellEventA { try { - var bindingList = messagesBindingSource.DataSource as BindingList; + var bindingList = messagesBindingSource.DataSource as BindingList; currentMessageRowIndex = e.RowIndex; if (bindingList == null) { return; } - if (brokeredMessage == bindingList[e.RowIndex]) + if (ServiceBusMessage == bindingList[e.RowIndex]) { return; } - brokeredMessage = bindingList[e.RowIndex]; + ServiceBusMessage = bindingList[e.RowIndex]; - LanguageDetector.SetFormattedMessage(serviceBusHelper, brokeredMessage, txtMessageText); + LanguageDetector.SetFormattedMessage(serviceBusHelper, ServiceBusMessage, txtMessageText); - messageCustomPropertyGrid.SelectedObject = new DictionaryPropertyGridAdapter(brokeredMessage.Properties); - messagePropertyGrid.SelectedObject = brokeredMessage; + messageCustomPropertyGrid.SelectedObject = new DictionaryPropertyGridAdapter(ServiceBusMessage.Properties); + messagePropertyGrid.SelectedObject = ServiceBusMessage; } // ReSharper disable once EmptyGeneralCatchClause catch (Exception) @@ -3017,7 +3019,7 @@ private void btnTransferDlq_Click(object sender, EventArgs e) private void deadletterDataGridView_RowEnter(object sender, DataGridViewCellEventArgs e) { - var bindingList = deadletterBindingSource.DataSource as BindingList; + var bindingList = deadletterBindingSource.DataSource as BindingList; currentDeadletterMessageRowIndex = e.RowIndex; if (bindingList == null) { @@ -3037,7 +3039,7 @@ private void deadletterDataGridView_RowEnter(object sender, DataGridViewCellEven private void transferDeadletterDataGridView_RowEnter(object sender, DataGridViewCellEventArgs e) { - var bindingList = transferDeadletterBindingSource.DataSource as BindingList; + var bindingList = transferDeadletterBindingSource.DataSource as BindingList; currentTransferDeadletterMessageRowIndex = e.RowIndex; if (bindingList == null) { @@ -3174,7 +3176,7 @@ private void messagesDataGridView_CellDoubleClick(object sender, DataGridViewCel { return; } - var bindingList = messagesBindingSource.DataSource as BindingList; + var bindingList = messagesBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -3191,7 +3193,7 @@ private void deadletterDataGridView_CellDoubleClick(object sender, DataGridViewC { return; } - var bindingList = deadletterBindingSource.DataSource as BindingList; + var bindingList = deadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -3221,7 +3223,7 @@ private void transferDeadletterDataGridView_CellDoubleClick(object sender, DataG { return; } - var bindingList = transferDeadletterBindingSource.DataSource as BindingList; + var bindingList = transferDeadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -3371,7 +3373,7 @@ private void ResubmitSelectedMessages() } using (var form = new MessageForm(queueProperties, messagesDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (ServiceBusMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); } @@ -3395,7 +3397,7 @@ async void deleteSelectedMessagesToolStripMenuItem_Click(object sender, EventArg } var messages = deadletterDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); + .Select(r => r.DataBoundItem as ServiceBusMessage); string confirmationText; @@ -3521,7 +3523,7 @@ async Task ResubmitSelectedDeadletterMessages() } using (var form = new MessageForm(queueProperties, deadletterDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (ServiceBusMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); if (form.RemovedSequenceNumbers != null && form.RemovedSequenceNumbers.Any()) @@ -3557,7 +3559,7 @@ private void resubmitSelectedTransferDeadletterMessagesInBatchModeToolStripMenuI return; } using (var form = new MessageForm(queueProperties, transferDeadletterDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (ServiceBusMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); } @@ -3632,7 +3634,7 @@ private void pictFindMessagesByDate_Click(object sender, EventArgs e) } } - private static bool IsWithinDateTimeRange(BrokeredMessage message, DateTime? fromDateTime, DateTime? toDateTime) + private static bool IsWithinDateTimeRange(ServiceBusMessage message, DateTime? fromDateTime, DateTime? toDateTime) { if (message.EnqueuedTimeUtc < (fromDateTime ?? DateTime.MinValue)) { @@ -3647,7 +3649,7 @@ private static bool IsWithinDateTimeRange(BrokeredMessage message, DateTime? fro private void FilterMessages() { - var bindingList = new SortableBindingList(); + var bindingList = new SortableBindingList(); try { if (messagesFilterFromDate == null && messagesFilterToDate == null && string.IsNullOrWhiteSpace(messagesFilterExpression)) @@ -3684,7 +3686,7 @@ private void FilterMessages() filteredList = filteredList.Where(msg => IsWithinDateTimeRange(msg, messagesFilterFromDate, messagesFilterToDate)).ToList(); } - bindingList = new SortableBindingList(filteredList) + bindingList = new SortableBindingList(filteredList) { AllowEdit = false, AllowNew = false, @@ -3707,7 +3709,7 @@ private void FilterMessages() { if (messagesDataGridView.Rows.Count > 0) { - brokeredMessage = default!; + ServiceBusMessage = default!; messagesDataGridView_RowEnter(this, new DataGridViewCellEventArgs(0, 0)); } } @@ -3716,7 +3718,7 @@ private void FilterMessages() private void FilterDeadletters() { - var bindingList = new SortableBindingList(); + var bindingList = new SortableBindingList(); try { if (deadletterFilterFromDate == null && deadletterFilterToDate == null && string.IsNullOrWhiteSpace(deadletterFilterExpression)) @@ -3753,7 +3755,7 @@ private void FilterDeadletters() filteredList = filteredList.Where(msg => IsWithinDateTimeRange(msg, deadletterFilterFromDate, deadletterFilterToDate)).ToList(); } - bindingList = new SortableBindingList(filteredList) + bindingList = new SortableBindingList(filteredList) { AllowEdit = false, AllowNew = false, @@ -3958,7 +3960,7 @@ private void saveSelectedMessageToolStripMenuItem_Click(object sender, EventArgs { return; } - var bindingList = messagesBindingSource.DataSource as BindingList; + var bindingList = messagesBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4001,7 +4003,7 @@ void saveSelectedMessageBodyAsFileToolStripMenuItem_Click(object sender, EventAr return; } - var bindingList = messagesBindingSource.DataSource as BindingList; + var bindingList = messagesBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4050,9 +4052,9 @@ private void saveSelectedMessagesToolStripMenuItem_Click(object sender, EventArg } var messages = messagesDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage?[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage?[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4072,9 +4074,9 @@ private void saveSelectedMessagesToolStripMenuItem_Click(object sender, EventArg } using (var writer = new StreamWriter(saveFileDialog.FileName)) { - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); - writer.Write(MessageSerializationHelper.Serialize(brokeredMessages, bodies, doNotSerializeBody: true)); + writer.Write(MessageSerializationHelper.Serialize(ServiceBusMessages, bodies, doNotSerializeBody: true)); } } catch (Exception ex) @@ -4094,9 +4096,9 @@ void saveSelectedMessagesBodyAsFileToolStripMenuItem_Click(object sender, EventA var messages = messagesDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4112,7 +4114,7 @@ void saveSelectedMessagesBodyAsFileToolStripMenuItem_Click(object sender, EventA return; } - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); var count = 0; foreach (var body in bodies) @@ -4148,7 +4150,7 @@ private void saveSelectedDeadletteredMessageToolStripMenuItem_Click(object sende { return; } - var bindingList = deadletterBindingSource.DataSource as BindingList; + var bindingList = deadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4191,7 +4193,7 @@ void saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem_Click(object sen return; } - var bindingList = deadletterBindingSource.DataSource as BindingList; + var bindingList = deadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4238,9 +4240,9 @@ private void saveSelectedDeadletteredMessagesToolStripMenuItem_Click(object send return; } var messages = deadletterDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4260,9 +4262,9 @@ private void saveSelectedDeadletteredMessagesToolStripMenuItem_Click(object send } using (var writer = new StreamWriter(saveFileDialog.FileName)) { - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); - writer.Write(MessageSerializationHelper.Serialize(brokeredMessages, bodies, doNotSerializeBody: true)); + writer.Write(MessageSerializationHelper.Serialize(ServiceBusMessages, bodies, doNotSerializeBody: true)); } } catch (Exception ex) @@ -4281,9 +4283,9 @@ void saveSelectedDeadletteredMessagesBodyAsFileToolStripMenuItem_Click(object se } var messages = deadletterDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4299,7 +4301,7 @@ void saveSelectedDeadletteredMessagesBodyAsFileToolStripMenuItem_Click(object se return; } - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); var count = 0; foreach (var body in bodies) @@ -4335,7 +4337,7 @@ private void saveSelectedTransferDeadletteredMessageToolStripMenuItem_Click(obje { return; } - var bindingList = transferDeadletterBindingSource.DataSource as BindingList; + var bindingList = transferDeadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4379,7 +4381,7 @@ void saveSelectedTransferDeadletteredMessageBodyAsFileToolStripMenuItem_Click(ob return; } - var bindingList = transferDeadletterBindingSource.DataSource as BindingList; + var bindingList = transferDeadletterBindingSource.DataSource as BindingList; if (bindingList == null) { return; @@ -4426,9 +4428,9 @@ private void saveSelectedTransferDeadletteredMessagesToolStripMenuItem_Click(obj return; } var messages = transferDeadletterDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4448,9 +4450,9 @@ private void saveSelectedTransferDeadletteredMessagesToolStripMenuItem_Click(obj } using (var writer = new StreamWriter(saveFileDialog.FileName)) { - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); - writer.Write(MessageSerializationHelper.Serialize(brokeredMessages, bodies, doNotSerializeBody: true)); + writer.Write(MessageSerializationHelper.Serialize(ServiceBusMessages, bodies, doNotSerializeBody: true)); } } catch (Exception ex) @@ -4469,9 +4471,9 @@ void saveSelectedTransferDeadletteredMessagesBodyAsFileToolStripMenuItem_Click(o } var messages = transferDeadletterDataGridView.SelectedRows.Cast() - .Select(r => r.DataBoundItem as BrokeredMessage); - IEnumerable brokeredMessages = messages as BrokeredMessage[] ?? messages.ToArray(); - if (!brokeredMessages.Any()) + .Select(r => r.DataBoundItem as ServiceBusMessage); + IEnumerable ServiceBusMessages = messages as ServiceBusMessage[] ?? messages.ToArray(); + if (!ServiceBusMessages.Any()) { return; } @@ -4487,7 +4489,7 @@ void saveSelectedTransferDeadletteredMessagesBodyAsFileToolStripMenuItem_Click(o return; } - var bodies = brokeredMessages.Select(bm => serviceBusHelper.GetMessageText(bm, + var bodies = ServiceBusMessages.Select(bm => serviceBusHelper.GetMessageText(bm, MainForm.SingletonMainForm.UseAscii, out _)); var count = 0; foreach (var body in bodies) @@ -4547,7 +4549,7 @@ void RemoveDeadletterDataGridRows(IEnumerable sequenceNumbersToRemove) foreach (DataGridViewRow row in deadletterDataGridView.Rows) { - var message = (BrokeredMessage)row.DataBoundItem; + var message = (ServiceBusMessage)row.DataBoundItem; if (sequenceNumbersToRemove.Contains(message.SequenceNumber)) { From 2c065bfb8aa743a78e1de24d30519ede03039669 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Mon, 13 Nov 2023 19:42:21 +0100 Subject: [PATCH 10/12] authorization wrapper2 --- .../Helpers/AuthorizationRuleWrapper2.cs | 210 ++++++++++++++++++ .../Controls/HandleQueueControl.cs | 2 +- 2 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 src/Common/Helpers/AuthorizationRuleWrapper2.cs diff --git a/src/Common/Helpers/AuthorizationRuleWrapper2.cs b/src/Common/Helpers/AuthorizationRuleWrapper2.cs new file mode 100644 index 00000000..dfc4da91 --- /dev/null +++ b/src/Common/Helpers/AuthorizationRuleWrapper2.cs @@ -0,0 +1,210 @@ +#region Copyright +//======================================================================================= +// Microsoft Azure Customer Advisory Team +// +// This sample is supplemental to the technical guidance published on my personal +// blog at http://blogs.msdn.com/b/paolos/. +// +// Author: Paolo Salvatori +//======================================================================================= +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE +// FILES 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. +//======================================================================================= +#endregion + +#region Using Directives + +using System; +using System.Linq; +using Azure.Messaging.ServiceBus.Administration; + +#endregion + + +namespace ServiceBusExplorer.Helpers +{ + public class AuthorizationRuleWrapper2 + { + #region Private Fields + private bool manage; + private bool send; + private bool listen; + private string keyName; + private string primaryKey; + private string secondaryKey; + private string issuerName; + #endregion + + #region Public Constructor + public AuthorizationRuleWrapper2() + { + } + + public AuthorizationRuleWrapper2(AuthorizationRule rule) + { + KeyName = rule.KeyName; + if (rule is SharedAccessAuthorizationRule) + { + var sharedAccessAuthorizationRule = rule as SharedAccessAuthorizationRule; + PrimaryKey = sharedAccessAuthorizationRule.PrimaryKey; + SecondaryKey = sharedAccessAuthorizationRule.SecondaryKey; + } + Manage = rule.Rights.Contains(AccessRights.Manage); + Send = rule.Rights.Contains(AccessRights.Send); + Listen = rule.Rights.Contains(AccessRights.Listen); + IssuerName = rule.KeyName; + CreatedTime = rule.CreatedTime; + ModifiedTime = rule.ModifiedTime; + AuthorizationRule = rule; + } + #endregion + + #region Public Properties + public string KeyName + { + get + { + return keyName; + } + set + { + keyName = value; + if (AuthorizationRule != null) + { + AuthorizationRule.KeyName = value; + } + } + } + + public string PrimaryKey + { + get + { + return primaryKey; + } + set + { + primaryKey = value; + var rule = AuthorizationRule as SharedAccessAuthorizationRule; + if (rule != null) + { + rule.PrimaryKey = value; + } + } + } + + public string SecondaryKey + { + get + { + return secondaryKey; + } + set + { + secondaryKey = value; + var rule = AuthorizationRule as SharedAccessAuthorizationRule; + if (rule != null) + { + rule.SecondaryKey = value; + } + } + } + + public string IssuerName + { + get + { + return issuerName; + } + set + { + issuerName = value; + if (AuthorizationRule != null) + { + AuthorizationRule.KeyName = value; + } + } + } + + public DateTimeOffset CreatedTime { get; private set; } + public DateTimeOffset ModifiedTime { get; private set; } + public AuthorizationRule AuthorizationRule { get; } + + public bool Manage + { + get + { + return manage; + } + set + { + manage = value; + if (!value) + { + return; + } + Send = true; + Listen = true; + if (AuthorizationRule != null && + !AuthorizationRule.Rights.Contains(AccessRights.Manage)) + { + AuthorizationRule.Rights = new[] {AccessRights.Manage, AccessRights.Send, AccessRights.Listen}.ToList(); + } + } + } + + public bool Send + { + get + { + return send; + } + set + { + send = value; + if (!value && manage) + { + Manage = false; + } + if (AuthorizationRule == null || AuthorizationRule.Rights.Contains(AccessRights.Send)) + { + return; + } + var list = AuthorizationRule.Rights.ToList(); + list.Add(AccessRights.Send); + AuthorizationRule.Rights = list; + } + } + + public bool Listen + { + get + { + return listen; + } + set + { + listen = value; + if (!value && manage) + { + Manage = false; + } + if (AuthorizationRule == null || AuthorizationRule.Rights.Contains(AccessRights.Listen)) + { + return; + } + var list = AuthorizationRule.Rights.ToList(); + list.Add(AccessRights.Listen); + AuthorizationRule.Rights = list; + } + } + #endregion + } +} diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs index ca2938a9..fd7500da 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs @@ -262,7 +262,7 @@ public partial class HandleQueueControl : UserControl private SortableBindingList messageBindingList = default!; private SortableBindingList deadletterBindingList = default!; private SortableBindingList transferDeadletterBindingList = default!; - private SortableBindingList sessionBindingList = default!; + private SortableBindingList sessionBindingList = default!; private bool buttonsMoved; private readonly bool duplicateQueue; From 2e436409984590884d01c455383f99fb25b21585 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Mon, 13 Nov 2023 19:43:58 +0100 Subject: [PATCH 11/12] revert authorization rule wrapper --- .../Helpers/AuthorizationRuleWrapper.cs | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/src/Common/Helpers/AuthorizationRuleWrapper.cs b/src/Common/Helpers/AuthorizationRuleWrapper.cs index 2f34c730..fb42c825 100644 --- a/src/Common/Helpers/AuthorizationRuleWrapper.cs +++ b/src/Common/Helpers/AuthorizationRuleWrapper.cs @@ -23,7 +23,7 @@ using System; using System.Linq; -using Azure.Messaging.ServiceBus.Administration; +using Microsoft.ServiceBus.Messaging; #endregion @@ -39,6 +39,8 @@ public class AuthorizationRuleWrapper private string keyName; private string primaryKey; private string secondaryKey; + private string claimType; + private string claimValue; private string issuerName; #endregion @@ -59,7 +61,10 @@ public AuthorizationRuleWrapper(AuthorizationRule rule) Manage = rule.Rights.Contains(AccessRights.Manage); Send = rule.Rights.Contains(AccessRights.Send); Listen = rule.Rights.Contains(AccessRights.Listen); - IssuerName = rule.KeyName; + ClaimType = rule.ClaimType; + ClaimValue = rule.ClaimValue; + IssuerName = rule.IssuerName; + Revision = rule.Revision; CreatedTime = rule.CreatedTime; ModifiedTime = rule.ModifiedTime; AuthorizationRule = rule; @@ -117,6 +122,38 @@ public string SecondaryKey } } + public string ClaimType + { + get + { + return claimType; + } + set + { + claimType = value; + if (AuthorizationRule != null) + { + AuthorizationRule.ClaimType = value; + } + } + } + + public string ClaimValue + { + get + { + return claimValue; + } + set + { + claimValue = value; + if (AuthorizationRule != null) + { + AuthorizationRule.ClaimValue = value; + } + } + } + public string IssuerName { get @@ -128,14 +165,15 @@ public string IssuerName issuerName = value; if (AuthorizationRule != null) { - AuthorizationRule.KeyName = value; + AuthorizationRule.IssuerName = value; } } } - public DateTimeOffset CreatedTime { get; private set; } - public DateTimeOffset ModifiedTime { get; private set; } - public AuthorizationRule AuthorizationRule { get; } + public DateTime CreatedTime { get; private set; } + public DateTime ModifiedTime { get; private set; } + public long Revision { get; private set; } + public AuthorizationRule AuthorizationRule { get; private set; } public bool Manage { @@ -155,7 +193,7 @@ public bool Manage if (AuthorizationRule != null && !AuthorizationRule.Rights.Contains(AccessRights.Manage)) { - AuthorizationRule.Rights = new[] {AccessRights.Manage, AccessRights.Send, AccessRights.Listen}.ToList(); + AuthorizationRule.Rights = new[] {AccessRights.Manage, AccessRights.Send, AccessRights.Listen}; } } } From 2186a5a185eff307ce3118df21ca637ae5301b07 Mon Sep 17 00:00:00 2001 From: Merlijn Vermeer Date: Tue, 14 Nov 2023 07:47:47 +0100 Subject: [PATCH 12/12] halfway done converting inspectors --- .../Helpers/IReceivedMessageInspector.cs | 31 +++ .../Helpers/LogReceivedMessageInspector.cs | 218 ++++++++++++++++++ src/Common/Helpers/ServiceBusHelper2.cs | 17 +- .../Controls/HandleQueueControl.cs | 118 +++++----- .../Forms/SelectEntityForm.cs | 16 +- 5 files changed, 332 insertions(+), 68 deletions(-) create mode 100644 src/Common/Helpers/IReceivedMessageInspector.cs create mode 100644 src/Common/Helpers/LogReceivedMessageInspector.cs diff --git a/src/Common/Helpers/IReceivedMessageInspector.cs b/src/Common/Helpers/IReceivedMessageInspector.cs new file mode 100644 index 00000000..bf60733f --- /dev/null +++ b/src/Common/Helpers/IReceivedMessageInspector.cs @@ -0,0 +1,31 @@ +#region Copyright +//======================================================================================= +// Microsoft Azure Customer Advisory Team +// +// This sample is supplemental to the technical guidance published on my personal +// blog at http://blogs.msdn.com/b/paolos/. +// +// Author: Paolo Salvatori +//======================================================================================= +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE +// FILES 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. +//======================================================================================= +#endregion + +namespace ServiceBusExplorer.Helpers +{ + using Azure.Messaging.ServiceBus; + + public interface IReceivedMessageInspector + { + ServiceBusReceivedMessage BeforeSendMessage(ServiceBusReceivedMessage message); + ServiceBusReceivedMessage AfterReceiveMessage(ServiceBusReceivedMessage message); + } +} diff --git a/src/Common/Helpers/LogReceivedMessageInspector.cs b/src/Common/Helpers/LogReceivedMessageInspector.cs new file mode 100644 index 00000000..179f45b9 --- /dev/null +++ b/src/Common/Helpers/LogReceivedMessageInspector.cs @@ -0,0 +1,218 @@ +#region Copyright +//======================================================================================= +// Microsoft Azure Customer Advisory Team +// +// This sample is supplemental to the technical guidance published on my personal +// blog at http://blogs.msdn.com/b/paolos/. +// +// Author: Paolo Salvatori +//======================================================================================= +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE +// FILES 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. +//======================================================================================= +#endregion + +#region Using Directives + +using System; +using System.Collections.Concurrent; +using System.Globalization; +using System.IO; +using System.Linq; +using System.ServiceModel.Channels; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using Microsoft.ServiceBus.Messaging; + +#endregion + +namespace ServiceBusExplorer.Helpers +{ + using Azure.Messaging.ServiceBus; + using Enums; + + public class LogReceivedMessageInspector : IReceivedMessageInspector, IDisposable + { + #region Private Constants + //*************************** + // Constants + //*************************** + private const string DateFormat = "<{0,2:00}:{1,2:00}:{2,2:00}> {3}"; + private const string MessageSuccessfullySent = "Message Sent. MessageId=[{0}] SessionId=[{1}] Label=[{2}] Size=[{3}]"; + private const string MessageSuccessfullyReceived = "Message Received. MessageId=[{0}] SessionId=[{1}] Label=[{2}] Size=[{3}]"; + private const string UnableToReadMessageBody = "Unable to read the message body."; + private const string NullValue = "NULL"; + private const string MessagePropertiesHeader = "Properties:"; + private const string MessagePayloadHeader = "Payload:"; + private const string MessageTextFormat = "{0}"; + private const string MessagePropertyFormat = " - Key=[{0}] Value=[{1}]"; + private const string LogFileNameFormat = "ReceivedMessage {0}.txt"; + private const int MaxBufferSize = 262144; // 256 KB + #endregion + + #region Private Instance Fields + private readonly Task writeTask = Task.Run( + () => + { + messageCollection = new BlockingCollection>(int.MaxValue); + writer = new StreamWriter(new FileStream(Path.Combine(Environment.CurrentDirectory, + string.Format(LogFileNameFormat, + DateTime.Now.ToString(CultureInfo.InvariantCulture).Replace('/', '-').Replace(':', '-'))), + FileMode.Append, + FileAccess.Write, + FileShare.ReadWrite)); + WriteToLog(); + }); + #endregion + + #region Private Static Fields + private static BlockingCollection> messageCollection; + private static StreamWriter writer; + private static readonly string line = new string('-', 100); + #endregion + + #region IReceivedMessageInspector Methods + public ServiceBusReceivedMessage BeforeSendMessage(ServiceBusReceivedMessage message) + { + return LogMessage(MessageDirection.Send, message); + } + + public ServiceBusReceivedMessage AfterReceiveMessage(ServiceBusReceivedMessage message) + { + return LogMessage(MessageDirection.Receive, message); + } + #endregion + + #region IDisposable Methods + public void Dispose() + { + messageCollection.CompleteAdding(); + writeTask.Wait(); + writer.Dispose(); + } + #endregion + + #region Private Static Methods + private static ServiceBusReceivedMessage LogMessage(MessageDirection direction, ServiceBusReceivedMessage message) + { + try + { + if (message != null) + { + messageCollection.TryAdd(new Tuple(direction, message)); + } + } + // ReSharper disable once EmptyGeneralCatchClause + catch (Exception) + { + } + return message; + } + + /// + /// Reads the content of the ReceivedMessage passed as argument. + /// + /// The ReceivedMessage to read. + /// The content of the ReceivedMessage. + private static string GetMessageText(ServiceBusReceivedMessage messageToRead) + { + string messageText; + + if (messageToRead?.Body == null) + { + return null; + } + + try + { + messageText = messageToRead.Body.ToString(); + } + catch (Exception) + { + messageText = UnableToReadMessageBody; + } + return messageText; + } + + private async static void WriteToLog() + { + try + { + foreach (var tuple in messageCollection.GetConsumingEnumerable()) + { + await Task.Delay(TimeSpan.FromMilliseconds(50)); + if (tuple != null && tuple.Item2 != null) + { + try + { + var direction = tuple.Item1; + var message = tuple.Item2; + var now = DateTime.Now; + var builder = new StringBuilder(); + builder.AppendLine(string.Format(DateFormat, + now.Hour, + now.Minute, + now.Second, + line)); + builder.AppendLine(string.Format(CultureInfo.CurrentCulture, + direction == MessageDirection.Send + ? MessageSuccessfullySent + : MessageSuccessfullyReceived, + string.IsNullOrWhiteSpace(message.MessageId) ? NullValue : message.MessageId, + string.IsNullOrWhiteSpace(message.SessionId) ? NullValue : message.SessionId, + /*string.IsNullOrWhiteSpace(message.Label) ? */NullValue/* : message.Label, + message.Size*/)); + builder.AppendLine(MessagePayloadHeader); + var messageText = GetMessageText(message); + builder.AppendLine(string.Format(MessageTextFormat, + messageText.Contains('\n') + ? messageText + : messageText.Substring(0, Math.Min(messageText.Length, 128)) + + (messageText.Length >= 128 ? "..." : ""))); + if (message.ApplicationProperties.Any()) + { + builder.AppendLine(MessagePropertiesHeader); + foreach (var p in message.ApplicationProperties) + { + builder.AppendLine(string.Format(MessagePropertyFormat, + p.Key, + p.Value)); + } + } + if (writer != null) + { + await writer.WriteAsync(builder.ToString()); + await writer.FlushAsync(); + } + else + { + break; + } + } + // ReSharper disable once EmptyGeneralCatchClause + catch + { + } + } + } + } + // ReSharper disable once EmptyGeneralCatchClause + catch + { + } + finally + { + messageCollection.Dispose(); + } + } + #endregion + } +} diff --git a/src/Common/Helpers/ServiceBusHelper2.cs b/src/Common/Helpers/ServiceBusHelper2.cs index a94da0f3..85c5a9d7 100644 --- a/src/Common/Helpers/ServiceBusHelper2.cs +++ b/src/Common/Helpers/ServiceBusHelper2.cs @@ -171,7 +171,7 @@ public class ServiceBusHelper2 #region Private Fields private Type messageDeferProviderType = typeof(InMemoryMessageDeferProvider); private ServiceBusAdministrationClient serviceBusAdministrationClient; - private ServiceBusClient serviceBusClient; + public ServiceBusClient serviceBusClient; //private AzureNotificationHubs.serviceBusAdministrationClient notificationHubserviceBusAdministrationClient; private bool traceEnabled; private string scheme = DefaultScheme; @@ -237,7 +237,7 @@ public ServiceBusHelper2(WriteToLogDelegate writeToLog, ServiceBusHelper2 servic MessageDeferProviderType = serviceBusHelper.MessageDeferProviderType; Scheme = serviceBusHelper.Scheme; ServiceBusNamespaces = serviceBusHelper.ServiceBusNamespaces; - BrokeredMessageInspectors = serviceBusHelper.BrokeredMessageInspectors; + ReceivedMessageInspectors = new ReceivedMessageInspector(); EventDataInspectors = serviceBusHelper.EventDataInspectors; BrokeredMessageGenerators = serviceBusHelper.BrokeredMessageGenerators; EventDataGenerators = serviceBusHelper.EventDataGenerators; @@ -530,9 +530,9 @@ public Uri AtomFeedUri public Dictionary ServiceBusNamespaces { get; set; } /// - /// Gets or sets the dictionary containing BrokeredMessage inspectors. + /// Gets or sets the dictionary containing ReceivedMessage inspectors. /// - public Dictionary BrokeredMessageInspectors { get; set; } + public Dictionary ReceivedMessageInspectors { get; set; } /// /// Gets or sets the dictionary containing EventData inspectors. @@ -616,6 +616,15 @@ public static Encoding EncodingType encodingType = value; } } + + public ServiceBusClient ServiceBusClient + { + get + { + return serviceBusClient; + } + } + #endregion public delegate void UpdateStatisticsDelegate(long messageNumber, long elapsedMilliseconds, DirectionType direction); diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs index fd7500da..c645bc8f 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs @@ -52,6 +52,7 @@ namespace ServiceBusExplorer.Controls { using Azure.Messaging.ServiceBus; using Azure.Messaging.ServiceBus.Administration; + using Microsoft.ServiceBus.Messaging; using AccessRights = Microsoft.ServiceBus.Messaging.AccessRights; using EntityStatus = Microsoft.ServiceBus.Messaging.EntityStatus; using SharedAccessAuthorizationRule = Microsoft.ServiceBus.Messaging.SharedAccessAuthorizationRule; @@ -262,7 +263,7 @@ public partial class HandleQueueControl : UserControl private SortableBindingList messageBindingList = default!; private SortableBindingList deadletterBindingList = default!; private SortableBindingList transferDeadletterBindingList = default!; - private SortableBindingList sessionBindingList = default!; + private SortableBindingList sessionBindingList = default!; private bool buttonsMoved; private readonly bool duplicateQueue; @@ -334,7 +335,7 @@ public void GetMessages() { using ( var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromQueue, MainForm.SingletonMainForm.TopCount, - serviceBusHelper.ServiceBusMessageInspectors.Keys, queueProperties.RequiresSession)) + serviceBusHelper.BrokeredMessageInspectors.Keys, queueProperties.RequiresSession)) { if (receiveModeForm.ShowDialog() == DialogResult.OK) { @@ -342,10 +343,10 @@ public void GetMessages() messageCustomPropertyGrid.SelectedObject = null; messagePropertyGrid.SelectedObject = null; var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && - serviceBusHelper.ServiceBusMessageInspectors.ContainsKey( + serviceBusHelper.BrokeredMessageInspectors.ContainsKey( receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) - as IServiceBusMessageInspector + ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[receiveModeForm.Inspector]) + as IBrokeredMessageInspector : null; if (queueProperties.EnablePartitioning) { @@ -408,50 +409,50 @@ private async Task DoPurge(PurgeStrategies purgeStrategy, string deleteConfirmat public void GetDeadletterMessages() { - using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.ServiceBusMessageInspectors.Keys)) + using (var ReceiveModeForm = new ReceiveModeForm(RetrieveMessagesFromDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.BrokeredMessageInspectors.Keys)) { - if (receiveModeForm.ShowDialog() != DialogResult.OK) + if (ReceiveModeForm.ShowDialog() != DialogResult.OK) { return; } txtDeadletterText.Text = string.Empty; deadletterCustomPropertyGrid.SelectedObject = null; deadletterPropertyGrid.SelectedObject = null; - var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.ServiceBusMessageInspectors.ContainsKey(receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) as IServiceBusMessageInspector + var messageInspector = !string.IsNullOrEmpty(ReceiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(ReceiveModeForm.Inspector) + ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[ReceiveModeForm.Inspector]) as IBrokeredMessageInspector : null; if (queueProperties.EnablePartitioning) { - ReadDeadletterMessagesOneAtTheTime(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); + ReadDeadletterMessagesOneAtTheTime(ReceiveModeForm.Peek, ReceiveModeForm.All, ReceiveModeForm.Count, messageInspector, ReceiveModeForm.FromSequenceNumber); } else { - GetDeadletterMessages(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); + GetDeadletterMessages(ReceiveModeForm.Peek, ReceiveModeForm.All, ReceiveModeForm.Count, messageInspector, ReceiveModeForm.FromSequenceNumber); } } } public void GetTransferDeadletterMessages() { - using (var receiveModeForm = new ReceiveModeForm(RetrieveMessagesFromTransferDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.ServiceBusMessageInspectors.Keys)) + using (var ReceiveModeForm = new ReceiveModeForm(RetrieveMessagesFromTransferDeadletterQueue, MainForm.SingletonMainForm.TopCount, serviceBusHelper.BrokeredMessageInspectors.Keys)) { - if (receiveModeForm.ShowDialog() != DialogResult.OK) + if (ReceiveModeForm.ShowDialog() != DialogResult.OK) { return; } txtTransferDeadletterText.Text = string.Empty; transferDeadletterCustomPropertyGrid.SelectedObject = null; transferDeadletterPropertyGrid.SelectedObject = null; - var messageInspector = !string.IsNullOrEmpty(receiveModeForm.Inspector) && serviceBusHelper.ServiceBusMessageInspectors.ContainsKey(receiveModeForm.Inspector) - ? Activator.CreateInstance(serviceBusHelper.ServiceBusMessageInspectors[receiveModeForm.Inspector]) as IServiceBusMessageInspector + var messageInspector = !string.IsNullOrEmpty(ReceiveModeForm.Inspector) && serviceBusHelper.BrokeredMessageInspectors.ContainsKey(ReceiveModeForm.Inspector) + ? Activator.CreateInstance(serviceBusHelper.BrokeredMessageInspectors[ReceiveModeForm.Inspector]) as IBrokeredMessageInspector : null; if (queueProperties.EnablePartitioning) { - ReadTransferDeadletterMessagesOneAtTheTime(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); + ReadTransferDeadletterMessagesOneAtTheTime(ReceiveModeForm.Peek, ReceiveModeForm.All, ReceiveModeForm.Count, messageInspector, ReceiveModeForm.FromSequenceNumber); } else { - GetTransferDeadletterMessages(receiveModeForm.Peek, receiveModeForm.All, receiveModeForm.Count, messageInspector, receiveModeForm.FromSequenceNumber); + GetTransferDeadletterMessages(ReceiveModeForm.Peek, ReceiveModeForm.All, ReceiveModeForm.Count, messageInspector, ReceiveModeForm.FromSequenceNumber); } } } @@ -478,8 +479,8 @@ public void GetMessageSessions() tabPageSessions.SuspendDrawing(); tabPageSessions.SuspendLayout(); - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueProperties.Name, - ReceiveMode.PeekLock); + ReceiverOptions options = new ReceiverOptions(); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueProperties.Name, ReceiveMode.PeekLock); var sessionEnumerable = queueClient.GetMessageSessions(); if (sessionEnumerable == null) { @@ -1082,7 +1083,7 @@ private void ConfigureCreateUserInterface() btnTransferDeadletterQueue.Visible = false; // Create BindingList for Authorization Rules - var bindingList = new BindingList(new List()) + var bindingList = new BindingList(new List()) { AllowEdit = true, AllowNew = true, @@ -1138,11 +1139,11 @@ private void InitializeData() btnDeadletter.Visible = true; // Authorization Rules - BindingList bindingList; + BindingList bindingList; if (queueProperties.AuthorizationRules.Count > 0) { - var enumerable = queueProperties.AuthorizationRules.Select(r => new AuthorizationRuleWrapper(r)); - bindingList = new BindingList(enumerable.ToList()) + var enumerable = queueProperties.AuthorizationRules.Select(r => new AuthorizationRuleWrapper2(r)); + bindingList = new BindingList(enumerable.ToList()) { AllowEdit = true, AllowNew = true, @@ -1152,7 +1153,7 @@ private void InitializeData() } else { - bindingList = new BindingList(new List()) + bindingList = new BindingList(new List()) { AllowEdit = true, AllowNew = true, @@ -1160,7 +1161,7 @@ private void InitializeData() }; } bindingList.ListChanged += bindingList_ListChanged; - authorizationRulesBindingSource.DataSource = new BindingList(bindingList); + authorizationRulesBindingSource.DataSource = new BindingList(bindingList); authorizationRulesDataGridView.DataSource = authorizationRulesBindingSource; // Initialize property grid @@ -1277,7 +1278,7 @@ private void InitializeData() checkedListBox.SetItemChecked(EnablePartitioningItemText, queueProperties.EnablePartitioning); // EnableExpress - checkedListBox.SetItemChecked(EnableExpressItemText, queueProperties.EnableExpress); + checkedListBox.SetItemChecked(EnableExpressItemText, /*queueProperties.EnableExpress*/true); } // RequiresDuplicateDetection @@ -1290,33 +1291,38 @@ private void InitializeData() // SupportOrdering checkedListBox.SetItemChecked(SupportOrderingItemText, - queueProperties.SupportOrdering); + /*queueProperties.SupportOrdering*/true); // IsAnonymousAccessible if (!serviceBusHelper.IsCloudNamespace) { checkedListBox.SetItemChecked(IsAnonymousAccessibleItemText, - queueProperties.IsAnonymousAccessible); + /*queueProperties.IsAnonymousAccessible*/true); } } - private MessageReceiver BuildMessageReceiver(ReceiveMode receiveMode, string? fromSession = null) + private ServiceBusReceiver BuildMessageReceiver(ServiceBusReceiveMode serviceBusReceiveMode, string? fromSession = null) { + var receiverOptions = new ServiceBusReceiverOptions() + { + ReceiveMode = serviceBusReceiveMode + }; if (fromSession == null && !queueProperties.RequiresSession) { - return serviceBusHelper.MessagingFactory.CreateMessageReceiver(queueProperties.Name, receiveMode); + return serviceBusHelper2.serviceBusClient.CreateReceiver(queueProperties.Name, receiverOptions); } - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queueProperties.Name, receiveMode); + var queueClient = serviceBusHelper2.serviceBusClient.CreateReceiver(queueProperties.Name, receiverOptions); var sessionAcceptTimeout = TimeSpan.FromSeconds(MainForm.SingletonMainForm.ReceiveTimeout); if (fromSession != null) { - return queueClient.AcceptMessageSession(fromSession, sessionAcceptTimeout); + return serviceBusHelper2.serviceBusClient.AcceptSessionAsync(queueProperties.Name, fromSession/*, sessionAcceptTimeout*/).Result; } - return queueClient.AcceptMessageSession(sessionAcceptTimeout); + // todo session accept timeout + return serviceBusHelper2.serviceBusClient.AcceptNextSessionAsync(queueProperties.Name).Result; } - private void GetMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) + private async Task GetMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) { try { @@ -1331,25 +1337,25 @@ private void GetMessages(bool peek, bool all, int count, IServiceBusMessageInspe { var totalRetrieved = 0; - var receiver = BuildMessageReceiver(ReceiveMode.PeekLock, fromSession); + var receiver = BuildMessageReceiver(ServiceBusReceiveMode.PeekLock, fromSession); while (totalRetrieved < count) { - IEnumerable messageEnumerable; + IReadOnlyList messageEnumerable; if (totalRetrieved == 0 && fromSequenceNumber.HasValue) { - messageEnumerable = receiver.PeekBatch(fromSequenceNumber.Value, count); + messageEnumerable = await receiver.PeekMessagesAsync(count, fromSequenceNumber.Value); } else { - messageEnumerable = receiver.PeekBatch(count); + messageEnumerable = await receiver.PeekMessagesAsync(count); } if (messageEnumerable == null) { break; } - var messageArray = messageEnumerable as ServiceBusMessage[] ?? messageEnumerable.ToArray(); + var messageArray = messageEnumerable as ServiceBusReceivedMessage[] ?? messageEnumerable.ToArray(); var partialList = messageInspector != null ? messageArray.Select(b => messageInspector.AfterReceiveMessage(b)).ToList() : new List(messageArray); @@ -1364,7 +1370,7 @@ private void GetMessages(bool peek, bool all, int count, IServiceBusMessageInspe } else { - var messageReceiver = BuildMessageReceiver(ReceiveMode.ReceiveAndDelete, fromSession); + var messageReceiver = BuildMessageReceiver(ServiceBusReceiveMode.ReceiveAndDelete, fromSession); var totalRetrieved = 0; int retrieved; @@ -1440,14 +1446,14 @@ private void GetMessages(bool peek, bool all, int count, IServiceBusMessageInspe } } - private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) + private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber = null, string? fromSession = null) { try { var ServiceBusMessages = new List(); if (peek) { - var messageReceiver = BuildMessageReceiver(ReceiveMode.PeekLock, fromSession); + var messageReceiver = BuildMessageReceiver(ServiceBusReceiveMode.PeekLock, fromSession); for (var i = 0; i < count; i++) { @@ -1475,7 +1481,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBu } else { - var messageReceiver = BuildMessageReceiver(ReceiveMode.ReceiveAndDelete, fromSession); + var messageReceiver = BuildMessageReceiver(ServiceBusReceiveMode.ReceiveAndDelete, fromSession); var totalRetrieved = 0; int retrieved; @@ -1537,7 +1543,7 @@ private void ReadMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBu } } - private void GetDeadletterMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) + private void GetDeadletterMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1552,7 +1558,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IServiceBusMe var queuePath = QueueClient.FormatDeadLetterPath(queueProperties.Name); if (peek) { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.PeekLock); var totalRetrieved = 0; var retrieved = 0; do @@ -1587,7 +1593,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IServiceBusMe } else { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.ReceiveAndDelete); var totalRetrieved = 0; int retrieved; do @@ -1674,7 +1680,7 @@ private void GetDeadletterMessages(bool peek, bool all, int count, IServiceBusMe } } - private void GetTransferDeadletterMessages(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) + private void GetTransferDeadletterMessages(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1689,7 +1695,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IServ var queuePath = QueueClient.FormatTransferDeadLetterPath(queueProperties.Name); if (peek) { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.PeekLock); var totalRetrieved = 0; var retrieved = 0; do @@ -1724,7 +1730,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IServ } else { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.ReceiveAndDelete); var totalRetrieved = 0; int retrieved; do @@ -1811,7 +1817,7 @@ private void GetTransferDeadletterMessages(bool peek, bool all, int count, IServ } } - private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) + private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1820,7 +1826,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, if (peek) { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.PeekLock); for (var i = 0; i < count; i++) { ServiceBusMessage message; @@ -1848,7 +1854,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, } else { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.ReceiveAndDelete); var totalRetrieved = 0; int retrieved; do @@ -1907,7 +1913,7 @@ private void ReadDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, } } - private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IServiceBusMessageInspector? messageInspector, long? fromSequenceNumber) + private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int count, IBrokeredMessageInspector? messageInspector, long? fromSequenceNumber) { try { @@ -1916,7 +1922,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int if (peek) { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.PeekLock); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.PeekLock); for (var i = 0; i < count; i++) { ServiceBusMessage message; @@ -1944,7 +1950,7 @@ private void ReadTransferDeadletterMessagesOneAtTheTime(bool peek, bool all, int } else { - var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete); + var queueClient = serviceBusHelper.MessagingFactory.CreateQueueClient(queuePath, ServiceBusReceiveMode.ReceiveAndDelete); var totalRetrieved = 0; int retrieved; do @@ -2531,7 +2537,7 @@ private SelectEntityForm creteSelectEntityFormForPath(string path) { return new SelectEntityForm(SelectEntityDialogTitle, SelectEntityGrouperTitle, SelectEntityLabelText, queuePropertiesSource); } - TopicDescription topicDescriptionSource = default!; + TopicProperties topicDescriptionSource = default!; try { topicDescriptionSource = serviceBusHelper.GetTopic(path); diff --git a/src/ServiceBusExplorer/Forms/SelectEntityForm.cs b/src/ServiceBusExplorer/Forms/SelectEntityForm.cs index 3411b6e8..73732978 100644 --- a/src/ServiceBusExplorer/Forms/SelectEntityForm.cs +++ b/src/ServiceBusExplorer/Forms/SelectEntityForm.cs @@ -68,7 +68,7 @@ public partial class SelectEntityForm : Form readonly bool includeEventHubs; readonly bool includeNotificationHubs; readonly bool includeRelays; - readonly QueueProperties queuePropertiesSource; // Might be null + readonly QueueDescription queueDescriptionSource; // Might be null readonly TopicDescription topicDescriptionSource; // Might be null #endregion @@ -124,7 +124,7 @@ public SelectEntityForm(string dialogTitle, public SelectEntityForm(string dialogTitle, string groupTitle, string labelText, - QueueProperties queuePropertiesSource, + QueueDescription queueDescriptionSource, bool subscriptions = false, bool eventHubs = false, bool notificationHubs = false, @@ -136,7 +136,7 @@ public SelectEntityForm(string dialogTitle, notificationHubs, relays) { - this.queuePropertiesSource = queuePropertiesSource; + this.queueDescriptionSource = queueDescriptionSource; } public SelectEntityForm(string dialogTitle, @@ -187,7 +187,7 @@ bool FocusNodeIfMatching(TreeNode treeNode, Func getPath, string s } // Select the queue where it is coming from since that is likely where it will go - if (queuePropertiesSource != null) + if (queueDescriptionSource != null) { foreach (TreeNode rootNode in serviceBusTreeView.Nodes) { @@ -195,7 +195,7 @@ bool FocusNodeIfMatching(TreeNode treeNode, Func getPath, string s { if (level1Node.Text == QueueEntities || level1Node.Text == FilteredQueueEntities) { - if (FocusNodeIfMatching(level1Node, qd => qd.Name, queuePropertiesSource.Name)) + if (FocusNodeIfMatching(level1Node, qd => qd.Path, queueDescriptionSource.Path)) { return; } @@ -267,10 +267,10 @@ public override sealed string Text #region Private Methods void SetTextAndType(TreeNode node) { - var queueTag = node.Tag as QueueProperties; + var queueTag = node.Tag as QueueDescription; if (queueTag != null) { - txtEntity.Text = queueTag.Name; + txtEntity.Text = queueTag.Path; Type = QueueEntity; return; } @@ -336,7 +336,7 @@ private void CloneNode(TreeNode node, TreeNode parent) parent.Nodes.Add(node.Text, node.Text, node.ImageIndex, node.SelectedImageIndex); if (node.Tag != null) { - if (node.Tag is QueueProperties || + if (node.Tag is QueueDescription || node.Tag is TopicDescription || (includeSubscriptions && node.Tag is SubscriptionWrapper && ((SubscriptionWrapper)node.Tag).SubscriptionDescription != null) || (includeEventHubs && (node.Tag is EventHubDescription || node.Tag is ConsumerGroupDescription)) ||