├── docs ├── img │ ├── gcm.png │ ├── log.png │ ├── button.png │ ├── newhub.png │ ├── sbe02.png │ ├── aboutform.png │ ├── allmetric.png │ ├── menuitem.png │ ├── messages.png │ ├── messages2.png │ ├── messages3.png │ ├── sessions.png │ ├── sessions2.png │ ├── template.png │ ├── windows.png │ ├── windows2.png │ ├── autodelete2.png │ ├── deadletter2.png │ ├── deadletter3.png │ ├── filterform.png │ ├── forwardform.png │ ├── listener01.png │ ├── listener02.png │ ├── listener03.png │ ├── listener04.png │ ├── listener05.png │ ├── listener06.png │ ├── monitortab.png │ ├── optionsform.png │ ├── parameters.png │ ├── disableentity.png │ ├── iothublistener.png │ ├── messagefiles.png │ ├── metricrootnode.png │ ├── peekmessages.png │ ├── readmessages2.png │ ├── registrations.png │ ├── registrations3.png │ ├── registrations4.png │ ├── relaymessage.png │ ├── relaymetrics01.png │ ├── relaymetrics02.png │ ├── tagexpression.png │ ├── windowsphone.png │ ├── bytespersecond01.png │ ├── bytespersecond02.png │ ├── connectionstring.png │ ├── getregistrations.png │ ├── metricsmaingraph.png │ ├── metricsquerytab.png │ ├── notificationhubs.png │ ├── partitionedqueue.png │ ├── partitionedtopic.png │ ├── relayservices01.png │ ├── relayservices02.png │ ├── relayservices03.png │ ├── relayservices04.png │ ├── relayservices05.png │ ├── relayservices06.png │ ├── senderthinktime.png │ ├── singlemetricstab.png │ ├── windowsphonetile.png │ ├── authorizationrules.png │ ├── eventhubmetrics01.png │ ├── eventhubmetrics02.png │ ├── getmessagesessions.png │ ├── messagecountdetails.png │ ├── metricsonentitytab.png │ ├── metricsonentitytab2.png │ ├── namespacemetrics01.png │ ├── namespacemetrics02.png │ ├── notificationhub01.png │ ├── receiverthinktime.png │ ├── repairandresubmit.png │ ├── repairsinglemessage.png │ ├── servicebusexplorer.jpg │ ├── authorizationrulestab.png │ ├── createnewregistration.png │ ├── startingdatetimeutc01.png │ ├── startingdatetimeutc02.png │ ├── consumergroupmetrics01.png │ ├── consumergroupmetrics02.png │ ├── notificationhubmetrics01.png │ ├── notificationhubmetrics02.png │ ├── resubmitmultiplemessages.png │ ├── partitionlistenercontrol01.png │ ├── sendernewmessagingfactory.png │ ├── connectivitymodeoptionsform.png │ ├── connectivitymodetransporttype.png │ ├── receivernewmessagingfactory.png │ └── microsoft.servicebus.connectionstring.png └── CODEOWNERS ├── media ├── download.png ├── UserConfigFile.png ├── connect-event-grid.png ├── publish-event-grid.png ├── AutoscalingTurnedOff.png ├── main-view-event-grid.png ├── service-bus-explorer.png ├── connect-info-event-grid.png ├── event-action-event-grid.png ├── receive-popup-event-grid.png └── receive-results-event-grid.png ├── src ├── EventGridExplorerLibrary │ ├── App.config │ └── EventGridExplorerLibrary.csproj ├── ServiceBusExplorer │ ├── Icons │ │ ├── Add.ico │ │ ├── Add.png │ │ ├── Web.ico │ │ ├── app.ico │ │ ├── exec.ico │ │ ├── Arrow.ico │ │ ├── Azure.ico │ │ ├── Chart.ico │ │ ├── Class.ico │ │ ├── Delete.ico │ │ ├── Funnel.ico │ │ ├── Queue.ico │ │ ├── RedAdd.ico │ │ ├── Topic.ico │ │ ├── search.ico │ │ ├── AddBlue.ico │ │ ├── AzureLogo.ico │ │ ├── BlueAdd.ico │ │ ├── Configure.ico │ │ ├── Contact.ico │ │ ├── EventHub.ico │ │ ├── GreyChart.ico │ │ ├── GreyClass.ico │ │ ├── Partition.ico │ │ ├── TextFile.ico │ │ ├── UserInfo.ico │ │ ├── WhiteLogo.ico │ │ ├── PieDiagram.ico │ │ ├── folder_web.ico │ │ ├── GreyEventHub.ico │ │ ├── GreyUserInfo.ico │ │ ├── RectangleBlue.ico │ │ ├── RectangleGreen.ico │ │ ├── groupofusers.ico │ │ ├── system_search.ico │ │ ├── WindowsAzureLogo.ico │ │ ├── groupofusers_grey.ico │ │ ├── ServiceBusExplorerLogo.ico │ │ └── NewServiceBusExplorerLogo.ico │ ├── Images │ │ ├── Red.png │ │ ├── hub.png │ │ ├── kdf.png │ │ ├── Green.png │ │ ├── Plus.png │ │ ├── Queue.png │ │ ├── Sort.png │ │ ├── Topic.png │ │ ├── World.png │ │ ├── BluLogo.png │ │ ├── Clouds.jpg │ │ ├── Clouds.png │ │ ├── Delete.png │ │ ├── Document.png │ │ ├── Objects.gif │ │ ├── Property.png │ │ ├── Yellow.png │ │ ├── akonadi.png │ │ ├── notepad.png │ │ ├── AzureLogo.png │ │ ├── ButtonLast.png │ │ ├── ButtonNext.png │ │ ├── DeleteGrey.png │ │ ├── PaoloAnja.png │ │ ├── Properties.png │ │ ├── Questions.png │ │ ├── SmallWorld.png │ │ ├── WhiteLogo.png │ │ ├── ButtonFirst.png │ │ ├── FindExtension.png │ │ ├── NewAzureLogo.png │ │ ├── NewAzureLogo2.png │ │ ├── RelayService.png │ │ ├── RelayServices.png │ │ ├── SmallDelete.png │ │ ├── SmallDocument.png │ │ ├── akonadi_grey.png │ │ ├── clipboard_48.png │ │ ├── groupofusers.png │ │ ├── system_search.png │ │ ├── ButtonPrevious.png │ │ ├── SmallBlueDelete.png │ │ ├── MicrosoftAzureLogo.png │ │ ├── WindowsAzureLogo.png │ │ ├── groupofusers_grey.png │ │ ├── FindByDateExtension.png │ │ ├── FindExtensionRaised.png │ │ ├── MicrosoftAzureWhiteLogo.png │ │ ├── NewAzureLogoWithScript.png │ │ ├── triangle shadow yellow.png │ │ ├── Document notepad Template.png │ │ └── FindByDateExtensionRaised.png │ ├── Controls │ │ ├── Grouper.bmp │ │ ├── CustomTrackBar.bmp │ │ ├── Windows │ │ │ ├── HeaderPanel.bmp │ │ │ └── HeaderPanel.Designer.cs │ │ ├── CheckBoxComboBox.Designer.cs │ │ ├── HeaderPanel.Designer.cs │ │ ├── Grouper.resx │ │ ├── TrackBar.resx │ │ ├── AccidentalDeletionPreventionCheckControl.cs │ │ └── ReadOnlyPropertyGrid.cs │ ├── GlobalSuppressions.cs │ ├── servicebusexplorer.png │ ├── NewServiceBusExplorerLogo.ico │ ├── Libraries │ │ └── FastColoredTextBox.dll │ ├── Properties │ │ ├── Settings.settings │ │ ├── Settings.Designer.cs │ │ └── AssemblyInfo.cs │ ├── ServiceBusExplorer.csproj.DotSettings │ ├── Helpers │ │ └── ConnectionStringHelper.cs │ ├── UIHelpers │ │ ├── WaitCursorScope.cs │ │ ├── DataGridViewHelper.cs │ │ ├── PropertyDescriptorList.cs │ │ ├── ReadOnlyEditor.cs │ │ ├── NativeMethods.cs │ │ ├── TestControlHelper.cs │ │ ├── MonitorRuleList.cs │ │ ├── ProviderInstaller.cs │ │ ├── ScrollBarHelper.cs │ │ ├── DictionaryPropertyDescriptor.cs │ │ ├── ControlHelper.cs │ │ └── MonitorRule.cs │ ├── Forms │ │ ├── ChangeQueueStatusForm.cs │ │ ├── PublishEventForm.cs │ │ ├── ReceiveEventForm.cs │ │ ├── CreateEventGridTopicForm.cs │ │ └── EventGridConnectForm.cs │ └── ServiceBusExplorer.nuspec ├── Utilities │ ├── Enums │ │ ├── MessageDirection.cs │ │ ├── DirectionType.cs │ │ ├── FormTypeEnum.cs │ │ ├── EntityType.cs │ │ └── EncodingType.cs │ ├── Utilities.csproj │ └── Helpers │ │ ├── NodeColorInfo.cs │ │ ├── CustomSortOrder.cs │ │ ├── StringExtensions.cs │ │ ├── ReadOnlyList.cs │ │ └── XmlLinqExtensions.cs ├── .editorconfig ├── Common │ ├── Helpers │ │ ├── TopicDescriptionExtensions.cs │ │ ├── IMessageDeferProvider.cs │ │ ├── IEventDataInspector.cs │ │ ├── IBrokeredMessageInspector.cs │ │ ├── QueueDescriptionExtensions.cs │ │ ├── FilterExpressionHelper.cs │ │ ├── IEventDataGenerator.cs │ │ ├── IBrokeredMessageGenerator.cs │ │ ├── IResourceAttribute.cs │ │ ├── IEnumerableExtensions.cs │ │ ├── TimeSpanExtensions.cs │ │ ├── AttributeList.cs │ │ ├── GenericCopier.cs │ │ ├── StringBodyWriter.cs │ │ ├── IdAttribute.cs │ │ ├── EventProcessorCheckpointManager.cs │ │ ├── LockDurationTooLowException.cs │ │ ├── CustomTypeDescriptionProvider.cs │ │ ├── ServiceBusHelperEventArgs.cs │ │ ├── UrlSegmentWrapper.cs │ │ ├── CustomMessageSessionAsyncHandlerFactory.cs │ │ ├── PropertyStateFlagsAttribute.cs │ │ ├── CustomMessageSessionAsyncHandlerConfiguration.cs │ │ ├── CustomMessageHeaderInfo.cs │ │ ├── UserPropertyWrapper.cs │ │ └── RuleWrapper.cs │ ├── Common.csproj.DotSettings │ ├── WindowsAzure │ │ ├── IServiceBusPartition.cs │ │ ├── IServiceBusEntity.cs │ │ ├── IServiceBusEventHub.cs │ │ ├── IServiceBusRelay.cs │ │ ├── IServiceBusRule.cs │ │ ├── IServiceBusTopic.cs │ │ ├── IServiceBusNotificationHub.cs │ │ ├── IServiceBusQueue.cs │ │ ├── IServiceBusConsumerGroup.cs │ │ └── IServiceBusSubscription.cs │ └── Abstractions │ │ └── EventDataMessage.cs ├── ServiceBusExplorer.Tests │ ├── ServiceBusExplorer.Tests.csproj.DotSettings │ ├── FileVersionShould.cs │ ├── Helpers │ │ └── ConversionHelperTests.cs │ ├── AssemblyVersionShould.cs │ ├── ServiceBusExplorer.Tests.csproj │ └── app.config ├── Directory.Build.props ├── ServiceBus │ ├── ServiceBus.csproj │ └── Helpers │ │ ├── PurgeStrategies.cs │ │ ├── PurgeOperationFailedEventArgs.cs │ │ └── PurgeOperationCompletedEventArgs.cs ├── Relay │ ├── Relay.csproj │ └── Helpers │ │ └── RelayWrapper.cs ├── EventHubs │ └── EventHubs.csproj └── NotificationHubs │ └── NotificationHubs.csproj ├── .github ├── workflows │ ├── handle-pull-request.yml │ ├── build-test.yml │ ├── winget-submission.yml │ └── handle-tag.yml └── stale.yml ├── GetNumberVersion.ps1 ├── NEWFEATURES.md ├── VERIFICATION-Template.txt ├── SetVersion.ps1 ├── LICENSE.txt └── Generate-VerificationFile.ps1 /docs/img/gcm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/gcm.png -------------------------------------------------------------------------------- /docs/img/log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/log.png -------------------------------------------------------------------------------- /docs/img/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/button.png -------------------------------------------------------------------------------- /docs/img/newhub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/newhub.png -------------------------------------------------------------------------------- /docs/img/sbe02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/sbe02.png -------------------------------------------------------------------------------- /media/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/download.png -------------------------------------------------------------------------------- /docs/img/aboutform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/aboutform.png -------------------------------------------------------------------------------- /docs/img/allmetric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/allmetric.png -------------------------------------------------------------------------------- /docs/img/menuitem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/menuitem.png -------------------------------------------------------------------------------- /docs/img/messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/messages.png -------------------------------------------------------------------------------- /docs/img/messages2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/messages2.png -------------------------------------------------------------------------------- /docs/img/messages3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/messages3.png -------------------------------------------------------------------------------- /docs/img/sessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/sessions.png -------------------------------------------------------------------------------- /docs/img/sessions2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/sessions2.png -------------------------------------------------------------------------------- /docs/img/template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/template.png -------------------------------------------------------------------------------- /docs/img/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/windows.png -------------------------------------------------------------------------------- /docs/img/windows2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/windows2.png -------------------------------------------------------------------------------- /docs/img/autodelete2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/autodelete2.png -------------------------------------------------------------------------------- /docs/img/deadletter2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/deadletter2.png -------------------------------------------------------------------------------- /docs/img/deadletter3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/deadletter3.png -------------------------------------------------------------------------------- /docs/img/filterform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/filterform.png -------------------------------------------------------------------------------- /docs/img/forwardform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/forwardform.png -------------------------------------------------------------------------------- /docs/img/listener01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener01.png -------------------------------------------------------------------------------- /docs/img/listener02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener02.png -------------------------------------------------------------------------------- /docs/img/listener03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener03.png -------------------------------------------------------------------------------- /docs/img/listener04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener04.png -------------------------------------------------------------------------------- /docs/img/listener05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener05.png -------------------------------------------------------------------------------- /docs/img/listener06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/listener06.png -------------------------------------------------------------------------------- /docs/img/monitortab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/monitortab.png -------------------------------------------------------------------------------- /docs/img/optionsform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/optionsform.png -------------------------------------------------------------------------------- /docs/img/parameters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/parameters.png -------------------------------------------------------------------------------- /media/UserConfigFile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/UserConfigFile.png -------------------------------------------------------------------------------- /docs/img/disableentity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/disableentity.png -------------------------------------------------------------------------------- /docs/img/iothublistener.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/iothublistener.png -------------------------------------------------------------------------------- /docs/img/messagefiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/messagefiles.png -------------------------------------------------------------------------------- /docs/img/metricrootnode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/metricrootnode.png -------------------------------------------------------------------------------- /docs/img/peekmessages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/peekmessages.png -------------------------------------------------------------------------------- /docs/img/readmessages2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/readmessages2.png -------------------------------------------------------------------------------- /docs/img/registrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/registrations.png -------------------------------------------------------------------------------- /docs/img/registrations3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/registrations3.png -------------------------------------------------------------------------------- /docs/img/registrations4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/registrations4.png -------------------------------------------------------------------------------- /docs/img/relaymessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relaymessage.png -------------------------------------------------------------------------------- /docs/img/relaymetrics01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relaymetrics01.png -------------------------------------------------------------------------------- /docs/img/relaymetrics02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relaymetrics02.png -------------------------------------------------------------------------------- /docs/img/tagexpression.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/tagexpression.png -------------------------------------------------------------------------------- /docs/img/windowsphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/windowsphone.png -------------------------------------------------------------------------------- /src/EventGridExplorerLibrary/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/img/bytespersecond01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/bytespersecond01.png -------------------------------------------------------------------------------- /docs/img/bytespersecond02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/bytespersecond02.png -------------------------------------------------------------------------------- /docs/img/connectionstring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/connectionstring.png -------------------------------------------------------------------------------- /docs/img/getregistrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/getregistrations.png -------------------------------------------------------------------------------- /docs/img/metricsmaingraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/metricsmaingraph.png -------------------------------------------------------------------------------- /docs/img/metricsquerytab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/metricsquerytab.png -------------------------------------------------------------------------------- /docs/img/notificationhubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/notificationhubs.png -------------------------------------------------------------------------------- /docs/img/partitionedqueue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/partitionedqueue.png -------------------------------------------------------------------------------- /docs/img/partitionedtopic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/partitionedtopic.png -------------------------------------------------------------------------------- /docs/img/relayservices01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices01.png -------------------------------------------------------------------------------- /docs/img/relayservices02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices02.png -------------------------------------------------------------------------------- /docs/img/relayservices03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices03.png -------------------------------------------------------------------------------- /docs/img/relayservices04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices04.png -------------------------------------------------------------------------------- /docs/img/relayservices05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices05.png -------------------------------------------------------------------------------- /docs/img/relayservices06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/relayservices06.png -------------------------------------------------------------------------------- /docs/img/senderthinktime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/senderthinktime.png -------------------------------------------------------------------------------- /docs/img/singlemetricstab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/singlemetricstab.png -------------------------------------------------------------------------------- /docs/img/windowsphonetile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/windowsphonetile.png -------------------------------------------------------------------------------- /media/connect-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/connect-event-grid.png -------------------------------------------------------------------------------- /media/publish-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/publish-event-grid.png -------------------------------------------------------------------------------- /docs/img/authorizationrules.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/authorizationrules.png -------------------------------------------------------------------------------- /docs/img/eventhubmetrics01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/eventhubmetrics01.png -------------------------------------------------------------------------------- /docs/img/eventhubmetrics02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/eventhubmetrics02.png -------------------------------------------------------------------------------- /docs/img/getmessagesessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/getmessagesessions.png -------------------------------------------------------------------------------- /docs/img/messagecountdetails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/messagecountdetails.png -------------------------------------------------------------------------------- /docs/img/metricsonentitytab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/metricsonentitytab.png -------------------------------------------------------------------------------- /docs/img/metricsonentitytab2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/metricsonentitytab2.png -------------------------------------------------------------------------------- /docs/img/namespacemetrics01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/namespacemetrics01.png -------------------------------------------------------------------------------- /docs/img/namespacemetrics02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/namespacemetrics02.png -------------------------------------------------------------------------------- /docs/img/notificationhub01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/notificationhub01.png -------------------------------------------------------------------------------- /docs/img/receiverthinktime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/receiverthinktime.png -------------------------------------------------------------------------------- /docs/img/repairandresubmit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/repairandresubmit.png -------------------------------------------------------------------------------- /docs/img/repairsinglemessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/repairsinglemessage.png -------------------------------------------------------------------------------- /docs/img/servicebusexplorer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/servicebusexplorer.jpg -------------------------------------------------------------------------------- /media/AutoscalingTurnedOff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/AutoscalingTurnedOff.png -------------------------------------------------------------------------------- /media/main-view-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/main-view-event-grid.png -------------------------------------------------------------------------------- /media/service-bus-explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/service-bus-explorer.png -------------------------------------------------------------------------------- /docs/img/authorizationrulestab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/authorizationrulestab.png -------------------------------------------------------------------------------- /docs/img/createnewregistration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/createnewregistration.png -------------------------------------------------------------------------------- /docs/img/startingdatetimeutc01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/startingdatetimeutc01.png -------------------------------------------------------------------------------- /docs/img/startingdatetimeutc02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/startingdatetimeutc02.png -------------------------------------------------------------------------------- /media/connect-info-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/connect-info-event-grid.png -------------------------------------------------------------------------------- /media/event-action-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/event-action-event-grid.png -------------------------------------------------------------------------------- /media/receive-popup-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/receive-popup-event-grid.png -------------------------------------------------------------------------------- /docs/img/consumergroupmetrics01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/consumergroupmetrics01.png -------------------------------------------------------------------------------- /docs/img/consumergroupmetrics02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/consumergroupmetrics02.png -------------------------------------------------------------------------------- /docs/img/notificationhubmetrics01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/notificationhubmetrics01.png -------------------------------------------------------------------------------- /docs/img/notificationhubmetrics02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/notificationhubmetrics02.png -------------------------------------------------------------------------------- /docs/img/resubmitmultiplemessages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/resubmitmultiplemessages.png -------------------------------------------------------------------------------- /media/receive-results-event-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/media/receive-results-event-grid.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Add.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Add.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Add.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Web.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Web.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/app.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/app.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/exec.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/exec.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Red.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/hub.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/kdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/kdf.png -------------------------------------------------------------------------------- /docs/img/partitionlistenercontrol01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/partitionlistenercontrol01.png -------------------------------------------------------------------------------- /docs/img/sendernewmessagingfactory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/sendernewmessagingfactory.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Arrow.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Arrow.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Azure.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Azure.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Chart.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Chart.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Class.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Class.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Delete.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Delete.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Funnel.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Funnel.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Queue.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Queue.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/RedAdd.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/RedAdd.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Topic.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Topic.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/search.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/search.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Green.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Plus.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Queue.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Sort.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Topic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Topic.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/World.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/World.png -------------------------------------------------------------------------------- /docs/img/connectivitymodeoptionsform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/connectivitymodeoptionsform.png -------------------------------------------------------------------------------- /docs/img/connectivitymodetransporttype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/connectivitymodetransporttype.png -------------------------------------------------------------------------------- /docs/img/receivernewmessagingfactory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/receivernewmessagingfactory.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/AddBlue.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/AddBlue.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/AzureLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/AzureLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/BlueAdd.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/BlueAdd.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Configure.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Configure.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Contact.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Contact.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/EventHub.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/EventHub.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/GreyChart.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/GreyChart.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/GreyClass.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/GreyClass.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/Partition.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/Partition.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/TextFile.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/TextFile.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/UserInfo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/UserInfo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/WhiteLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/WhiteLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/BluLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/BluLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Clouds.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Clouds.jpg -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Clouds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Clouds.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Delete.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Document.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Document.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Objects.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Objects.gif -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Property.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Yellow.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/akonadi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/akonadi.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/notepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/notepad.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/Grouper.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Controls/Grouper.bmp -------------------------------------------------------------------------------- /src/ServiceBusExplorer/GlobalSuppressions.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/GlobalSuppressions.cs -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/PieDiagram.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/PieDiagram.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/folder_web.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/folder_web.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/AzureLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/AzureLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/ButtonLast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/ButtonLast.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/ButtonNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/ButtonNext.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/DeleteGrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/DeleteGrey.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/PaoloAnja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/PaoloAnja.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Properties.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Questions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Questions.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/SmallWorld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/SmallWorld.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/WhiteLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/WhiteLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/GreyEventHub.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/GreyEventHub.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/GreyUserInfo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/GreyUserInfo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/RectangleBlue.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/RectangleBlue.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/RectangleGreen.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/RectangleGreen.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/groupofusers.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/groupofusers.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/system_search.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/system_search.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/ButtonFirst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/ButtonFirst.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/FindExtension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/FindExtension.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/NewAzureLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/NewAzureLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/NewAzureLogo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/NewAzureLogo2.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/RelayService.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/RelayService.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/RelayServices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/RelayServices.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/SmallDelete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/SmallDelete.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/SmallDocument.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/SmallDocument.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/akonadi_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/akonadi_grey.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/clipboard_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/clipboard_48.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/groupofusers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/groupofusers.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/system_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/system_search.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/servicebusexplorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/servicebusexplorer.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/WindowsAzureLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/WindowsAzureLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/ButtonPrevious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/ButtonPrevious.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/SmallBlueDelete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/SmallBlueDelete.png -------------------------------------------------------------------------------- /docs/img/microsoft.servicebus.connectionstring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/docs/img/microsoft.servicebus.connectionstring.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/CustomTrackBar.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Controls/CustomTrackBar.bmp -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/groupofusers_grey.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/groupofusers_grey.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/MicrosoftAzureLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/MicrosoftAzureLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/WindowsAzureLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/WindowsAzureLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/groupofusers_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/groupofusers_grey.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/NewServiceBusExplorerLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/NewServiceBusExplorerLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/FindByDateExtension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/FindByDateExtension.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/FindExtensionRaised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/FindExtensionRaised.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/Windows/HeaderPanel.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Controls/Windows/HeaderPanel.bmp -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/ServiceBusExplorerLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/ServiceBusExplorerLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/MicrosoftAzureWhiteLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/MicrosoftAzureWhiteLogo.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/NewAzureLogoWithScript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/NewAzureLogoWithScript.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/triangle shadow yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/triangle shadow yellow.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Libraries/FastColoredTextBox.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Libraries/FastColoredTextBox.dll -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Icons/NewServiceBusExplorerLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Icons/NewServiceBusExplorerLogo.ico -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/Document notepad Template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/Document notepad Template.png -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Images/FindByDateExtensionRaised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/HEAD/src/ServiceBusExplorer/Images/FindByDateExtensionRaised.png -------------------------------------------------------------------------------- /src/Utilities/Enums/MessageDirection.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Enums 2 | { 3 | public enum MessageDirection 4 | { 5 | Send, 6 | Receive 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/Utilities/Enums/DirectionType.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace ServiceBusExplorer.Enums 3 | { 4 | public enum DirectionType 5 | { 6 | Send, 7 | Receive 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/Utilities/Enums/FormTypeEnum.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Enums 2 | { 3 | public enum FormTypeEnum 4 | { 5 | Send, 6 | Test, 7 | Listener 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/workflows/handle-pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Handle pull request 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | call-build-test: 11 | uses: ./.github/workflows/build-test.yml 12 | with: 13 | release-version: '0.0.0' 14 | cache-build: false 15 | -------------------------------------------------------------------------------- /src/Utilities/Enums/EntityType.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace ServiceBusExplorer.Enums 3 | { 4 | public enum EntityType 5 | { 6 | All, 7 | Queue, 8 | Topic, 9 | Subscription, 10 | Rule, 11 | Relay, 12 | NotificationHub, 13 | EventHub, 14 | ConsumerGroup 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docs/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This is a comment.# Each line is a file pattern followed by one or more owners. 2 | # These owners will be the default owners for everything in 3 | # the repo. Unless a later match takes precedence, 4 | # @global-owner1 and @global-owner2 will be requested for 5 | # review when someone opens a pull request. 6 | * @paolosalvatori @SeanFeldman @ErikMogensen 7 | -------------------------------------------------------------------------------- /src/.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | # Windows-style newlines with a newline ending every file 5 | [*] 6 | end_of_line = crlf 7 | insert_final_newline = true 8 | 9 | # 4 space indentation 10 | [*.cs] 11 | indent_style = space 12 | indent_size = 4 13 | 14 | # 2 space indentation 15 | [*.config] 16 | indent_style = space 17 | indent_size = 2 18 | -------------------------------------------------------------------------------- /src/Common/Helpers/TopicDescriptionExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Helpers 2 | { 3 | using Microsoft.ServiceBus.Messaging; 4 | 5 | public static class TopicDescriptionExtensions 6 | { 7 | public static int MaxSizeInGigabytes(this TopicDescription topicDescription) 8 | { 9 | return (int) (topicDescription.MaxSizeInMegabytes / 1024); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/Common/Common.csproj.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | Default 3 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/ServiceBusExplorer.csproj.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | Default 3 | -------------------------------------------------------------------------------- /src/Utilities/Enums/EncodingType.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace ServiceBusExplorer.Enums 3 | { 4 | public enum EncodingType 5 | { 6 | // ReSharper disable once InconsistentNaming 7 | ASCII, 8 | // ReSharper disable once InconsistentNaming 9 | UTF7, 10 | // ReSharper disable once InconsistentNaming 11 | UTF8, 12 | // ReSharper disable once InconsistentNaming 13 | UTF32, 14 | Unicode 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | Default 3 | -------------------------------------------------------------------------------- /src/Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | false 5 | false 6 | false 7 | false 8 | true 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Helpers/ConnectionStringHelper.cs: -------------------------------------------------------------------------------- 1 | #region Using Directives 2 | 3 | using System.Text.RegularExpressions; 4 | 5 | #endregion 6 | 7 | namespace Microsoft.Azure.ServiceBusExplorer.Helpers 8 | { 9 | public static class ConnectionStringHelper 10 | { 11 | private readonly static Regex EntityPathRegex = new Regex(@"(?:^|[^\w])(EntityPath=[^;]+)"); 12 | 13 | public static bool IsEntitySpecific(string connectionString) 14 | { 15 | return EntityPathRegex.IsMatch(connectionString); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusPartition.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Microsoft.ServiceBus.Messaging; 4 | 5 | namespace ServiceBusExplorer.WindowsAzure 6 | { 7 | internal interface IServiceBusPartition : IServiceBusEntity 8 | { 9 | PartitionDescription GetPartition(string path, string consumerGroupName, string name); 10 | 11 | IEnumerable GetPartitions(string path, string consumerGroupName); 12 | 13 | Uri GetPartitionUri(string eventHubName, string consumerGroupName, string partitionId); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusEntity.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Helpers; 2 | using ServiceBusExplorer.Utilities.Helpers; 3 | 4 | namespace ServiceBusExplorer.WindowsAzure 5 | { 6 | internal interface IServiceBusEntity 7 | { 8 | /// 9 | /// Gets or sets the scheme of the URI. 10 | /// 11 | string Scheme { get; set; } 12 | 13 | WriteToLogDelegate WriteToLog { get; set; } 14 | 15 | delegate void EventHandler(ServiceBusHelperEventArgs args); 16 | 17 | public event EventHandler OnDelete; 18 | 19 | public event EventHandler OnCreate; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /GetNumberVersion.ps1: -------------------------------------------------------------------------------- 1 | # Verify it is a proper version 2 | param( 3 | [Parameter(Mandatory=$false)] 4 | [string] 5 | $Version 6 | ) 7 | 8 | Set-StrictMode -Version 3 9 | 10 | # RegEx from https://semver.org/ 11 | [string]$semanticRegEx = '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' 12 | 13 | if (-not ($Version -match $semanticRegEx)) { 14 | throw "The version must follow semantic versioning, see https://semver.org/." + ` 15 | " For instance 4.3.22-beta." 16 | } 17 | 18 | $parts = $Version -split {$_ -eq '-' -or $_ -eq '+'} 19 | 20 | return $parts[0] 21 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/WaitCursorScope.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | namespace ServiceBusExplorer.UIHelpers 4 | { 5 | internal class WaitCursorScope : IDisposable 6 | { 7 | private readonly Form _form; 8 | public WaitCursorScope(Form form = null) 9 | { 10 | _form = form; 11 | WaitCursor(true); 12 | } 13 | 14 | public void Dispose() 15 | { 16 | WaitCursor(false); 17 | } 18 | 19 | private void WaitCursor(bool waitCursor) 20 | { 21 | _ = _form == null ? Application.UseWaitCursor = waitCursor : _form.UseWaitCursor = waitCursor; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusEventHub.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Microsoft.ServiceBus.Messaging; 4 | 5 | namespace ServiceBusExplorer.WindowsAzure 6 | { 7 | internal interface IServiceBusEventHub : IServiceBusEntity 8 | { 9 | EventHubDescription CreateEventHub(EventHubDescription description); 10 | 11 | void DeleteEventHub(EventHubDescription eventHubDescription); 12 | 13 | void DeleteEventHubs(IEnumerable eventHubs); 14 | 15 | EventHubDescription GetEventHub(string path); 16 | 17 | Uri GetEventHubUri(string eventHubPath); 18 | 19 | EventHubDescription UpdateEventHub(EventHubDescription description); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusRelay.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.ServiceBus.Messaging; 5 | 6 | namespace ServiceBusExplorer.WindowsAzure 7 | { 8 | internal interface IServiceBusRelay : IServiceBusEntity 9 | { 10 | RelayDescription CreateRelay(RelayDescription description); 11 | 12 | Task DeleteRelay(string path); 13 | 14 | Task DeleteRelays(IEnumerable relayServices); 15 | 16 | RelayDescription GetRelay(string path); 17 | 18 | IEnumerable GetRelays(int timeoutInSeconds); 19 | 20 | Uri GetRelayUri(RelayDescription description); 21 | 22 | RelayDescription UpdateRelay(RelayDescription description); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /NEWFEATURES.md: -------------------------------------------------------------------------------- 1 | - HandlePartitionControl: IncomingBytesPerSecond OutgoingBytesPerSecond 2 | - EventData.SerializedSizeInBytes is used to calculate KB/sec in the partitionlistenercontrol 3 | - Added new properties (LastEnqueuedOffset and LastEnqueuedTimeUtc) to PartitionDescription control 4 | - Fixed visualization of event data properties in the partition listener control 5 | - Greatly improved message tracking and clear of the partition listener control 6 | - Relay Message saved to file 7 | - Support for Persistent and Dynamic Relay Services 8 | - Export Persistent Relay Services 9 | - Event Hub Metrics 10 | - All Metric 11 | - Partition Consumer 12 | - Added Metrics to consumer groups 13 | - New behavior: no chart is shown if a metric doesn't have any data 14 | notification hubs metrics 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusRule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Microsoft.ServiceBus.Messaging; 3 | using ServiceBusExplorer.Helpers; 4 | 5 | namespace ServiceBusExplorer.WindowsAzure 6 | { 7 | internal interface IServiceBusRule : IServiceBusEntity 8 | { 9 | RuleDescription AddRule(SubscriptionDescription subscriptionDescription, RuleDescription ruleDescription); 10 | 11 | IEnumerable GetRules(string topicPath, string name); 12 | 13 | IEnumerable GetRules(SubscriptionDescription subscription); 14 | 15 | void RemoveRule(SubscriptionDescription subscriptionDescription, RuleDescription rule); 16 | 17 | void RemoveRules(IEnumerable wrappers); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/ServiceBus/ServiceBus.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | ServiceBusExplorer.ServiceBus 5 | 1.0.0.1 6 | 7035 7 | 8 | 9 | True 10 | 11 | 12 | True 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /VERIFICATION-Template.txt: -------------------------------------------------------------------------------- 1 | VERIFICATION 2 | Verification is intended to assist the Chocolatey moderators and community 3 | in verifying that this package's contents are trustworthy. 4 | 5 | The installer have been downloaded from their official download link listed on 6 | and can be verified like this: 7 | 8 | 1. Download the following installers: 9 | 64-Bit: 10 | 2. You can use one of the following methods to obtain the checksum 11 | - Use powershell function 'Get-Filehash' 12 | - Use chocolatey utility 'checksum.exe' 13 | 14 | checksum type: md5 15 | checksum64: %CHECKSUM% 16 | 17 | File 'LICENSE.txt' is obtained from -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - bug 10 | - Feature 11 | - Discussion 12 | - enhancement 13 | - question 14 | - blocked 15 | - suggestion 16 | # Label to use when marking an issue as stale 17 | staleLabel: wontfix 18 | # Comment to post when marking an issue as stale. Set to `false` to disable 19 | markComment: > 20 | This issue has been automatically marked as stale because it has not had 21 | recent activity. It will be closed if no further activity occurs. Thank you 22 | for your contributions. 23 | # Comment to post when closing a stale issue. Set to `false` to disable 24 | closeComment: false 25 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusTopic.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.ServiceBus.Messaging; 5 | 6 | namespace ServiceBusExplorer.WindowsAzure 7 | { 8 | internal interface IServiceBusTopic : IServiceBusEntity 9 | { 10 | TopicDescription CreateTopic(TopicDescription topicDescription); 11 | 12 | Task DeleteTopic(TopicDescription topic); 13 | 14 | Task DeleteTopics(IEnumerable topics); 15 | 16 | TopicDescription GetTopic(string path); 17 | 18 | IEnumerable GetTopics(string filter, int timeoutInSeconds); 19 | 20 | Uri GetTopicUri(string topicPath); 21 | 22 | TopicDescription RenameTopic(string path, string newPath); 23 | 24 | TopicDescription UpdateTopic(TopicDescription topicDescription); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Utilities/Utilities.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | ServiceBusExplorer.Utilities 5 | 7.3 6 | ServiceBusExplorer.Utilities 7 | 1.0.0.1 8 | ServiceBusExplorer.Utilities 9 | 7035 10 | 11 | 12 | True 13 | 14 | 15 | True 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusNotificationHub.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.Azure.NotificationHubs; 5 | 6 | namespace ServiceBusExplorer.WindowsAzure 7 | { 8 | internal interface IServiceBusNotificationHub : IServiceBusEntity 9 | { 10 | NotificationHubDescription CreateNotificationHub(NotificationHubDescription description); 11 | 12 | Task DeleteNotificationHub(NotificationHubDescription notificationHubDescription); 13 | 14 | Task DeleteNotificationHubs(IEnumerable notificationHubs); 15 | 16 | NotificationHubDescription GetNotificationHub(string path); 17 | 18 | Uri GetNotificationHubUri(string notificationHubPath); 19 | 20 | NotificationHubDescription UpdateNotificationHub(NotificationHubDescription description); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusQueue.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.ServiceBus.Messaging; 5 | 6 | namespace ServiceBusExplorer.WindowsAzure 7 | { 8 | internal interface IServiceBusQueue : IServiceBusEntity 9 | { 10 | QueueDescription CreateQueue(QueueDescription description); 11 | 12 | Task DeleteQueue(QueueDescription queueDescription); 13 | 14 | Task DeleteQueues(IEnumerable queues); 15 | 16 | QueueDescription GetQueue(string path); 17 | 18 | Uri GetQueueDeadLetterQueueUri(string queuePath); 19 | 20 | IEnumerable GetQueues(string filter, int timeoutInSeconds); 21 | 22 | Uri GetQueueUri(string queuePath); 23 | 24 | QueueDescription RenameQueue(string path, string newPath); 25 | 26 | QueueDescription UpdateQueue(QueueDescription description); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Relay/Relay.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | 7.3 5 | ServiceBusExplorer.Relay 6 | 1.0.0.1 7 | 7035 8 | 9 | 10 | True 11 | 12 | 13 | True 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /SetVersion.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [Parameter(Mandatory)] 3 | [string] 4 | $FileName, 5 | 6 | [Parameter(Mandatory)] 7 | [string] 8 | $PropertyName, 9 | 10 | [Parameter(Mandatory, 11 | ParameterSetName = 'Version')] 12 | [Version] 13 | $Version, 14 | 15 | [Parameter(Mandatory, 16 | ParameterSetName = 'VersionString')] 17 | [string] 18 | $VersionString 19 | ) 20 | 21 | Set-StrictMode -Version 2 22 | 23 | $pattern = "^\[assembly: $PropertyName\(""(.*)""\)\]$" 24 | $found = $false 25 | 26 | if ($Version) { 27 | $VersionString = $Version 28 | } 29 | 30 | $content = (Get-Content $fileName -Encoding UTF8) | ForEach-Object { 31 | if ($_ -match $pattern) { 32 | "[assembly: $PropertyName(""{0}"")]" -f $VersionString 33 | $found = $true 34 | } 35 | else { 36 | $_ 37 | } 38 | } 39 | 40 | if (-not $found) { 41 | $content += "[assembly: $PropertyName(""{0}"")]" -f $VersionString 42 | } 43 | 44 | $content | Set-Content $fileName -Encoding UTF8 -------------------------------------------------------------------------------- /src/EventHubs/EventHubs.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | netstandard2.0 4 | 7.3 5 | ServiceBusExplorer.EventHubs 6 | ServiceBusExplorer.EventHubs 7 | 1.0.0.1 8 | 7035 9 | 10 | 11 | True 12 | 13 | 14 | True 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusConsumerGroup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Microsoft.ServiceBus.Messaging; 4 | 5 | namespace ServiceBusExplorer.WindowsAzure 6 | { 7 | internal interface IServiceBusConsumerGroup : IServiceBusEntity 8 | { 9 | ConsumerGroupDescription CreateConsumerGroup(ConsumerGroupDescription description); 10 | 11 | void DeleteConsumerGroup(ConsumerGroupDescription consumerGroupDescription); 12 | 13 | void DeleteConsumerGroups(string eventHubName, IEnumerable consumerGroups); 14 | 15 | ConsumerGroupDescription GetConsumerGroup(string eventHubPath, string name); 16 | 17 | IEnumerable GetConsumerGroups(string path); 18 | 19 | Uri GetConsumerGroupUri(string eventHubName, string consumerGroupPath); 20 | 21 | ConsumerGroupDescription UpdateConsumerGroup(ConsumerGroupDescription description); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Microsoft Azure 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/FileVersionShould.cs: -------------------------------------------------------------------------------- 1 | using FluentAssertions; 2 | using System; 3 | using System.Diagnostics; 4 | using System.IO; 5 | using System.Linq; 6 | using Xunit; 7 | 8 | namespace ServiceBusExplorer.Tests 9 | { 10 | public class FileVersionShould 11 | { 12 | private string expectedVersion; 13 | 14 | public FileVersionShould() 15 | { 16 | #if DEBUG 17 | expectedVersion = Environment.GetEnvironmentVariable("FILE_VERSION") ?? "1.0.0.1"; 18 | #else 19 | expectedVersion = Environment.GetEnvironmentVariable("FILE_VERSION") ?? throw new InvalidOperationException("file version not set by environment"); 20 | #endif 21 | } 22 | 23 | 24 | [Fact] 25 | public void FileShouldHaveSameVersionAsProvidedByBuild() 26 | { 27 | var assemblyNames = Directory.GetFiles(".", "ServiceBus*.*") 28 | .Where(x => x.EndsWith(".dll") || x.EndsWith(".exe")); 29 | 30 | var fileVersions = assemblyNames.Select(x => FileVersionInfo.GetVersionInfo(x).FileVersion); 31 | 32 | fileVersions.Should().HaveCount(9).And.AllBeEquivalentTo(expectedVersion); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ServiceBusExplorer.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/CheckBoxComboBox.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Controls 2 | { 3 | partial class CheckBoxComboBox 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | components = new System.ComponentModel.Container(); 32 | } 33 | 34 | #endregion 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/Windows/HeaderPanel.Designer.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | namespace KIS.Controls.Windows 4 | { 5 | partial class HeaderPanel 6 | { 7 | /// 8 | /// Required designer variable. 9 | /// 10 | private IContainer components = null; 11 | 12 | /// 13 | /// Clean up any resources being used. 14 | /// 15 | /// true if managed resources should be disposed; otherwise, false. 16 | protected override void Dispose(bool disposing) 17 | { 18 | if( disposing ) 19 | { 20 | if(components != null) 21 | { 22 | components.Dispose(); 23 | } 24 | } 25 | base.Dispose( disposing ); 26 | } 27 | 28 | #region Component Designer generated code 29 | /// 30 | /// Required method for Designer support - do not modify 31 | /// the contents of this method with the code editor. 32 | /// 33 | private void InitializeComponent() 34 | { 35 | this.SuspendLayout(); 36 | // 37 | // HeaderPanel 38 | // 39 | this.Scroll += new System.Windows.Forms.ScrollEventHandler(this.HeaderPanel_Scroll); 40 | this.ResumeLayout(false); 41 | 42 | } 43 | #endregion 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Setting ComVisible to false makes the types in this assembly not visible 6 | // to COM components. If you need to access a type in this assembly from 7 | // COM, set the ComVisible attribute to true on that type. 8 | [assembly: ComVisible(false)] 9 | [assembly: InternalsVisibleTo("ServiceBusExplorer.Tests")] 10 | 11 | // General Information about an assembly is controlled through the following 12 | // set of attributes. Change these attribute values to modify the information 13 | // associated with an assembly. 14 | [assembly: AssemblyTitle("Service Bus Explorer")] 15 | [assembly: AssemblyDescription("The Service Bus Explorer allows users to connect to a Service Bus namespace and easily administer and test the entities of an Azure Service Bus namespace. The tool provides advanced features like import/export functionality and the ability to test entities.")] 16 | [assembly: AssemblyCompany("Paolo Salvatori")] 17 | [assembly: AssemblyProduct("Service Bus Explorer")] 18 | [assembly: AssemblyCopyright("Copyright © Microsoft 2017")] 19 | 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("b7dc6295-ee39-429e-9a97-68dc919f049b")] 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/Common/WindowsAzure/IServiceBusSubscription.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Microsoft.ServiceBus.Messaging; 5 | 6 | namespace ServiceBusExplorer.WindowsAzure 7 | { 8 | internal interface IServiceBusSubscription : IServiceBusEntity 9 | { 10 | SubscriptionDescription CreateSubscription(TopicDescription topicDescription, SubscriptionDescription subscriptionDescription); 11 | 12 | SubscriptionDescription CreateSubscription(TopicDescription topicDescription, SubscriptionDescription subscriptionDescription, RuleDescription ruleDescription); 13 | 14 | Task DeleteSubscription(SubscriptionDescription subscriptionDescription); 15 | 16 | Task DeleteSubscriptions(IEnumerable subscriptionDescriptions); 17 | 18 | SubscriptionDescription GetSubscription(string topicPath, string name); 19 | 20 | Uri GetSubscriptionDeadLetterQueueUri(string topicPath, string name); 21 | 22 | IEnumerable GetSubscriptions(string topicPath); 23 | 24 | IEnumerable GetSubscriptions(TopicDescription topic, string filter); 25 | 26 | Uri GetSubscriptionUri(string topicPath, string name); 27 | 28 | SubscriptionDescription UpdateSubscription(TopicDescription topicDescription, SubscriptionDescription subscriptionDescription); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/DataGridViewHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows.Forms; 5 | 6 | using Microsoft.ServiceBus.Messaging; 7 | 8 | namespace ServiceBusExplorer.UIHelpers 9 | { 10 | internal static class DataGridViewHelper 11 | { 12 | static public void RemoveDataGridRowsUsingSequenceNumbers(DataGridView dataGridView, 13 | IEnumerable sequenceNumbersToRemove) 14 | { 15 | var rowsToRemove = new List(sequenceNumbersToRemove.Count()); 16 | 17 | foreach (DataGridViewRow row in dataGridView.Rows) 18 | { 19 | var message = (BrokeredMessage)row.DataBoundItem; 20 | 21 | if (sequenceNumbersToRemove.Contains(message.SequenceNumber)) 22 | { 23 | rowsToRemove.Add(row); 24 | 25 | if (rowsToRemove.Count >= sequenceNumbersToRemove.Count()) 26 | { 27 | break; 28 | } 29 | } 30 | } 31 | 32 | for (var rowIndex = rowsToRemove.Count - 1; rowIndex >= 0; --rowIndex) 33 | { 34 | var row = rowsToRemove[rowIndex]; 35 | dataGridView.Rows.Remove(row); 36 | } 37 | 38 | dataGridView.ClearSelection(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/HeaderPanel.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Controls 2 | { 3 | partial class HeaderPanel 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.SuspendLayout(); 32 | // 33 | // OutlookPanelEx 34 | // 35 | this.BackColor = System.Drawing.SystemColors.ControlLightLight; 36 | this.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4); 37 | this.Name = "OutlookPanelEx"; 38 | this.Size = new System.Drawing.Size(224, 172); 39 | this.Paint += new System.Windows.Forms.PaintEventHandler(this.OutlookPanelEx_Paint); 40 | this.ResumeLayout(false); 41 | 42 | } 43 | 44 | #endregion 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/EventGridExplorerLibrary/EventGridExplorerLibrary.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Library 5 | netstandard2.0 6 | 1.0.0.1 7 | EventGridExplorerLibrary 8 | ServiceBusExplorer.EventGridExplorerLibrary 9 | 7035 10 | 11 | 12 | 13 | True 14 | 15 | 16 | 17 | True 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Generate-VerificationFile.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [Parameter(Mandatory=$true, HelpMessage="Released version of ServiceBusExplorer")] 3 | [string] $Version, 4 | [Parameter(Mandatory=$true, HelpMessage="Path to the ServiceBusExplorer exe")] 5 | [string] $ExePath, 6 | [Parameter(Mandatory=$true, HelpMessage="Location of the VERIFICATION.txt template")] 7 | [string] $TemplateFilePath, 8 | [Parameter(Mandatory=$true, HelpMessage="Location to output the result to")] 9 | [string] $OutputFilePath 10 | ) 11 | 12 | Write-Output "Creating VERIFICATION.txt based on template '$($TemplateFilePath)' for '$($ExePath)'" 13 | 14 | # Get content of template 15 | $rawTemplate = Get-Content $TemplateFilePath | Out-String 16 | Write-Output "VERIFICATION.txt template: $($rawTemplate)" 17 | 18 | # Hash ServiceBusExplorer.exe 19 | $hashResult = Get-FileHash $ExePath -Algorithm MD5 20 | Write-Output "Created hash '$($hashResult.Hash)'" 21 | 22 | # Update template with checksum 23 | $rawTemplate = $rawTemplate.Replace('%CHECKSUM%', $hashResult.Hash) 24 | Write-Output "Replaced checksum in template with '$($hashResult.Hash)'" 25 | 26 | # Updating template with version 27 | $rawTemplate = $rawTemplate.Replace('%VERSION%', $Version) 28 | Write-Output "Replaced version in template with '$($Version)'" 29 | 30 | # Store output in VERIFICATION file 31 | New-Item -Path $OutputFilePath -Value $rawTemplate -Force 32 | Write-Host "Wrote results to $($OutputFilePath)" -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Forms/ChangeQueueStatusForm.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.ServiceBus.Messaging; 2 | using System; 3 | using System.IO; 4 | using System.Windows.Forms; 5 | 6 | namespace ServiceBusExplorer.Forms 7 | { 8 | public partial class ChangeQueueStatusForm : Form 9 | { 10 | public EntityStatus EntityStatus { get; private set; } 11 | 12 | public ChangeQueueStatusForm(EntityStatus entityCurrentStatus) 13 | { 14 | InitializeComponent(); 15 | SetSelected(entityCurrentStatus); 16 | } 17 | 18 | private void SetSelected(EntityStatus entityStatus) 19 | { 20 | if (!cbStatus.Items.Contains(entityStatus.ToString())) 21 | { 22 | throw new InvalidDataException($"Unexpected value {entityStatus} passed"); 23 | } 24 | EntityStatus = entityStatus; 25 | cbStatus.SelectedIndex = cbStatus.Items.IndexOf(entityStatus.ToString()); 26 | } 27 | 28 | private void btnOk_Click(object sender, EventArgs e) 29 | { 30 | EntityStatus = (EntityStatus)Enum.Parse(typeof(EntityStatus), cbStatus.SelectedItem.ToString()); 31 | DialogResult = DialogResult.OK; 32 | Close(); 33 | } 34 | 35 | private void btnCancel_Click(object sender, EventArgs e) 36 | { 37 | DialogResult = DialogResult.Cancel; 38 | Close(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Common/Helpers/IMessageDeferProvider.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | namespace ServiceBusExplorer.Helpers 23 | { 24 | public interface IMessageDeferProvider 25 | { 26 | int Count { get; } 27 | void Enqueue(long sequenceNumber); 28 | bool Dequeue(out long sequenceNumber); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/PropertyDescriptorList.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections.Generic; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.UIHelpers 29 | { 30 | internal class PropertyDescriptorList : List 31 | { 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ServiceBus/Helpers/PurgeStrategies.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | using System; 23 | 24 | namespace ServiceBusExplorer.ServiceBus.Helpers 25 | { 26 | [Flags] 27 | public enum PurgeStrategies 28 | { 29 | Messages = 1, 30 | DeadletteredMessages = 2, 31 | All = Messages | DeadletteredMessages 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Common/Helpers/IEventDataInspector.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using Microsoft.ServiceBus.Messaging; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public interface IEventDataInspector 31 | { 32 | EventData BeforeSendMessage(EventData eventData); 33 | EventData AfterReceiveMessage(EventData eventData); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Common/Helpers/IBrokeredMessageInspector.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using Microsoft.ServiceBus.Messaging; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public interface IBrokeredMessageInspector 31 | { 32 | BrokeredMessage BeforeSendMessage(BrokeredMessage message); 33 | BrokeredMessage AfterReceiveMessage(BrokeredMessage message); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Common/Helpers/QueueDescriptionExtensions.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | using Microsoft.ServiceBus.Messaging; 23 | 24 | namespace ServiceBusExplorer.Helpers 25 | { 26 | public static class QueueDescriptionExtensions 27 | { 28 | public static int MaxSizeInGigabytes(this QueueDescription queueDescription) 29 | { 30 | return (int) (queueDescription.MaxSizeInMegabytes / 1024); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ServiceBus/Helpers/PurgeOperationFailedEventArgs.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | using System; 23 | 24 | namespace ServiceBusExplorer.ServiceBus.Helpers 25 | { 26 | public class PurgeOperationFailedEventArgs : EventArgs 27 | { 28 | public Exception Exception { get; set; } 29 | 30 | public PurgeOperationFailedEventArgs(Exception exception) 31 | { 32 | this.Exception = exception; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Utilities/Helpers/NodeColorInfo.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Utilities.Helpers 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Drawing; 6 | using System.Linq; 7 | 8 | public class NodeColorInfo 9 | { 10 | public string Format() 11 | { 12 | return $"{Color.ToArgb()};{IsLeaf};{Text}"; 13 | } 14 | 15 | public static NodeColorInfo Parse(string value) 16 | { 17 | try 18 | { 19 | var parts = value.Split(';'); 20 | if (parts.Length == 3) 21 | { 22 | return new NodeColorInfo 23 | { 24 | Color = Color.FromArgb(int.Parse(parts[0])), 25 | IsLeaf = bool.Parse(parts[1]), 26 | Text = parts[2] 27 | }; 28 | } 29 | return null; 30 | } 31 | catch (Exception) 32 | { 33 | return null; 34 | } 35 | } 36 | 37 | public static List ParseAll(string value) 38 | { 39 | return value.Split('¤').Select(Parse).Where(n => n != null).ToList(); 40 | } 41 | 42 | public static string FormatAll(IEnumerable items) 43 | { 44 | return string.Join("¤", items.Select(i => i.Format())); 45 | } 46 | 47 | public string Text { get; set; } 48 | public bool IsLeaf { get; set; } 49 | public Color Color { get; set; } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/Common/Helpers/FilterExpressionHelper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | namespace ServiceBusExplorer.Helpers 23 | { 24 | public static class FilterExpressionHelper 25 | { 26 | #region Public Static Properties 27 | public static string QueueFilterExpression { get; set; } 28 | public static string TopicFilterExpression { get; set; } 29 | public static string SubscriptionFilterExpression { get; set; } 30 | #endregion 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Common/Helpers/IEventDataGenerator.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections.Generic; 25 | using ServiceBusExplorer.Utilities.Helpers; 26 | using Microsoft.ServiceBus.Messaging; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.Helpers 31 | { 32 | public interface IEventDataGenerator 33 | { 34 | IEnumerable GenerateEventDataCollection(int eventDataCount, WriteToLogDelegate writeToLog = null); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Common/Helpers/IBrokeredMessageGenerator.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections.Generic; 25 | using ServiceBusExplorer.Utilities.Helpers; 26 | using Microsoft.ServiceBus.Messaging; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.Helpers 31 | { 32 | public interface IBrokeredMessageGenerator 33 | { 34 | IEnumerable GenerateBrokeredMessageCollection(int messageCount, WriteToLogDelegate writeToLog = null); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/ReadOnlyEditor.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | using System.ComponentModel; 24 | using System.Drawing.Design; 25 | #endregion 26 | 27 | namespace ServiceBusExplorer.UIHelpers 28 | { 29 | public class ReadOnlyEditor : UITypeEditor 30 | { 31 | #region Public Methods 32 | public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 33 | { 34 | return UITypeEditorEditStyle.None; 35 | } 36 | #endregion 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Common/Helpers/IResourceAttribute.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | namespace ServiceBusExplorer.Helpers 23 | { 24 | public interface IResourceAttribute 25 | { 26 | #region Public Properties 27 | string BaseName 28 | { 29 | get; 30 | set; 31 | } 32 | 33 | string KeyPrefix 34 | { 35 | get; 36 | set; 37 | } 38 | 39 | string AssemblyFullName 40 | { 41 | get; 42 | set; 43 | } 44 | #endregion 45 | } 46 | } -------------------------------------------------------------------------------- /src/Common/Helpers/IEnumerableExtensions.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Collections.Generic; 26 | 27 | #endregion 28 | 29 | namespace Microsoft.Azure.ServiceBusExplorer.Helpers 30 | { 31 | public static class IEnumerableExtensions 32 | { 33 | public static void ForEach(this IEnumerable collection, Action action) 34 | { 35 | foreach (var item in collection) 36 | { 37 | action?.Invoke(item); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Utilities/Helpers/CustomSortOrder.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | namespace ServiceBusExplorer.Utilities.Helpers 23 | { 24 | public enum CustomSortOrder 25 | { 26 | // no custom sorting 27 | None, 28 | // sort asscending using the property name or category name 29 | AscendingByName, 30 | // sort asscending using property id or categor id 31 | AscendingById, 32 | // sort descending using the property name or category name 33 | DescendingByName, 34 | // sort descending using property id or categor id 35 | DescendingById, 36 | } 37 | } -------------------------------------------------------------------------------- /src/Common/Helpers/TimeSpanExtensions.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public static class TimeSpanExtensions 31 | { 32 | public static bool IsMaxValue(this TimeSpan timeSpan) 33 | { 34 | var maxValue = TimeSpan.MaxValue; 35 | return maxValue.Days == timeSpan.Days && 36 | maxValue.Hours == timeSpan.Hours && 37 | maxValue.Minutes == timeSpan.Minutes && 38 | maxValue.Seconds == timeSpan.Seconds; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Utilities/Helpers/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.IO; 25 | using System.Text; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Utilities.Helpers 30 | { 31 | public static class StringExtensions 32 | { 33 | public static MemoryStream ToMemoryStream(this string source) 34 | { 35 | return source.ToMemoryStream(Encoding.UTF8); 36 | } 37 | 38 | public static MemoryStream ToMemoryStream(this string source, Encoding encoding) 39 | { 40 | return new MemoryStream(encoding.GetBytes(source)); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /.github/workflows/build-test.yml: -------------------------------------------------------------------------------- 1 | name: build-test 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | release-version: 7 | required: true 8 | type: string 9 | cache-build: 10 | required: false 11 | type: boolean 12 | default: false 13 | workflow_dispatch: 14 | inputs: 15 | release-version: 16 | required: false 17 | description: A version number to test manual builds. e.g. 1.2.3 18 | type: string 19 | default: '1.2.3' 20 | env: 21 | SOLUTION_FILE_PATH: .\src 22 | BUILD_CONFIGURATION: Release 23 | 24 | jobs: 25 | build_test_publish: 26 | name: Build and run unit tests 27 | runs-on: windows-2022 28 | steps: 29 | - name: Git configuration 30 | run: git config --global core.autocrlf false 31 | 32 | - uses: actions/checkout@v4 33 | 34 | - name: Restore NuGet packages 35 | working-directory: ${{env.SOLUTION_FILE_PATH}} 36 | run: dotnet restore 37 | 38 | - name: Show version 39 | run: echo "Building version ${{ inputs.release-version }}" 40 | 41 | - name: Build 42 | working-directory: ${{env.SOLUTION_FILE_PATH}} 43 | run: >- 44 | dotnet build -c ${{env.BUILD_CONFIGURATION}} 45 | -p:InformationalVersion=${{inputs.release-version}} 46 | -p:FileVersion=${{inputs.release-version}} 47 | 48 | - name: Run tests 49 | env: 50 | FILE_VERSION: ${{inputs.release-version}} 51 | working-directory: ${{env.SOLUTION_FILE_PATH}} 52 | run: dotnet test -c ${{env.BUILD_CONFIGURATION}} --no-build --no-restore 53 | 54 | - name: Cache build 55 | uses: actions/cache@v4 56 | if: ${{ inputs.cache-build }} 57 | with: 58 | path: src/ServiceBusExplorer/bin/Release 59 | key: cached-output-${{ github.sha }} 60 | -------------------------------------------------------------------------------- /src/Common/Helpers/AttributeList.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Collections.Generic; 26 | using System.ComponentModel; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.Helpers 31 | { 32 | public class AttributeList : List 33 | { 34 | #region Public Conctructors 35 | public AttributeList() 36 | { 37 | 38 | } 39 | 40 | public AttributeList(AttributeCollection ac) 41 | { 42 | foreach (Attribute attr in ac) 43 | { 44 | Add(attr); 45 | } 46 | } 47 | #endregion 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Common/Abstractions/EventDataMessage.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.Abstractions 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using Microsoft.Azure.Amqp; 7 | using Microsoft.ServiceBus.Messaging; 8 | 9 | public class EventDataMessage : IDisposable 10 | { 11 | readonly EventData eventData; 12 | Stream stream; 13 | 14 | public EventDataMessage(EventData eventData) 15 | { 16 | this.eventData = eventData; 17 | stream = eventData.GetBodyStream(); 18 | Properties = eventData.Properties; 19 | PartitionKey = eventData.PartitionKey; 20 | SequenceNumber = eventData.SequenceNumber; 21 | Offset = eventData.Offset; 22 | SerializedSizeInBytes = eventData.SerializedSizeInBytes; 23 | EnqueuedTimeUtc = eventData.EnqueuedTimeUtc; 24 | SystemProperties = eventData.SystemProperties; 25 | } 26 | 27 | public string PartitionKey { get; private set; } 28 | public long SequenceNumber { get; private set; } 29 | public long SerializedSizeInBytes { get; private set; } 30 | public string Offset { get; private set; } 31 | public DateTime EnqueuedTimeUtc { get; private set; } 32 | public IDictionary Properties { get; private set; } 33 | public IDictionary SystemProperties { get; private set; } 34 | 35 | public Stream GetBodyStream() 36 | { 37 | var memoryStream = new MemoryStream(); 38 | 39 | stream.CopyTo(memoryStream); 40 | stream.Seek(0L, SeekOrigin.Begin); 41 | 42 | return memoryStream; 43 | } 44 | 45 | public void Dispose() 46 | { 47 | eventData.Dispose(); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/Utilities/Helpers/ReadOnlyList.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections; 25 | using System.Collections.Generic; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Utilities.Helpers 30 | { 31 | public class ReadOnlyList : List, ICollection, IList 32 | { 33 | #region Public Constructors 34 | public ReadOnlyList() { } 35 | public ReadOnlyList(IEnumerable collection) : base(collection) { } 36 | #endregion 37 | 38 | #region Public Properties 39 | bool ICollection.IsReadOnly { get { return true; } } 40 | bool IList.IsReadOnly { get { return true; } } 41 | #endregion 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/Grouper.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | text/microsoft-resx 32 | 33 | 34 | 1.0.0.0 35 | 36 | 37 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 38 | 39 | 40 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/TrackBar.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | text/microsoft-resx 32 | 33 | 34 | 1.0.0.0 35 | 36 | 37 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 38 | 39 | 40 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Forms/PublishEventForm.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Utilities.Helpers; 2 | using System; 3 | using System.Globalization; 4 | using System.Windows.Forms; 5 | 6 | namespace ServiceBusExplorer.Forms 7 | { 8 | public partial class PublishEventForm : Form 9 | { 10 | #region Private Constants 11 | private const string ExceptionFormat = "Exception: {0}"; 12 | private readonly WriteToLogDelegate writeToLog = default!; 13 | #endregion 14 | 15 | #region Public Fields 16 | public string EventSource = string.Empty; 17 | public string EventType = string.Empty; 18 | public string EventInfo = string.Empty; 19 | #endregion 20 | 21 | public PublishEventForm(WriteToLogDelegate writeToLog) 22 | { 23 | InitializeComponent(); 24 | this.writeToLog = writeToLog; 25 | } 26 | 27 | private void btnSubmit_Click(object sender, EventArgs e) 28 | { 29 | try 30 | { 31 | EventSource = txtEventSource.Text.Trim(); 32 | EventType = txtEventType.Text.Trim(); 33 | EventInfo = txtEventInfo.Text.Trim(); 34 | 35 | DialogResult = DialogResult.OK; 36 | } 37 | catch (Exception ex) 38 | { 39 | HandleException(ex); 40 | } 41 | } 42 | 43 | private void btnCancel_Click(object sender, EventArgs e) 44 | { 45 | DialogResult = DialogResult.Cancel; 46 | Close(); 47 | } 48 | 49 | private void HandleException(Exception ex) 50 | { 51 | if (string.IsNullOrWhiteSpace(ex?.Message)) 52 | { 53 | return; 54 | } 55 | 56 | writeToLog(string.Format(CultureInfo.CurrentCulture, ExceptionFormat, ex?.Message)); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/Common/Helpers/GenericCopier.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Web.Script.Serialization; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public static class GenericCopier where T : class 31 | { 32 | #region Public Static Methods 33 | public static T DeepCopy(object objectToCopy) 34 | { 35 | if (objectToCopy == null) 36 | { 37 | return null; 38 | } 39 | var jsonSerializer = new JavaScriptSerializer(); 40 | var value = jsonSerializer.Serialize(objectToCopy); 41 | return (T)jsonSerializer.Deserialize(value, objectToCopy.GetType()); 42 | } 43 | #endregion 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/NativeMethods.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Drawing; 26 | using System.Runtime.InteropServices; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.UIHelpers 31 | { 32 | internal static class NativeMethods 33 | { 34 | #region DllImports 35 | 36 | [DllImport("user32.dll", SetLastError = true)] 37 | internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); 38 | 39 | [DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] 40 | internal static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 41 | 42 | #endregion 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Forms/ReceiveEventForm.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Utilities.Helpers; 2 | using System; 3 | using System.Globalization; 4 | using System.Windows.Forms; 5 | 6 | namespace ServiceBusExplorer.Forms 7 | { 8 | public partial class ReceiveEventForm : Form 9 | { 10 | #region Private Constants 11 | private const string ExceptionFormat = "Exception: {0}"; 12 | private readonly WriteToLogDelegate writeToLog = default!; 13 | #endregion 14 | 15 | #region Public Fields 16 | public int EventCount; 17 | public bool GetMax = false; 18 | #endregion 19 | 20 | public ReceiveEventForm(WriteToLogDelegate writeToLog) 21 | { 22 | this.writeToLog = writeToLog; 23 | InitializeComponent(); 24 | } 25 | 26 | private void receiveEvents_CheckedChanged(object sender, EventArgs e) 27 | { 28 | txtEventCount.Enabled = btnTop.Checked; 29 | } 30 | 31 | private void btnOk_Click(object sender, EventArgs e) 32 | { 33 | try 34 | { 35 | GetMax = btnMax.Checked; 36 | EventCount = txtEventCount.Text != string.Empty ? int.Parse(txtEventCount.Text) : 0; 37 | } 38 | catch (Exception ex) 39 | { 40 | HandleException(ex); 41 | } 42 | 43 | DialogResult = DialogResult.OK; 44 | } 45 | 46 | private void btnCancel_Click(object sender, EventArgs e) 47 | { 48 | DialogResult = DialogResult.Cancel; 49 | Close(); 50 | } 51 | 52 | private void HandleException(Exception ex) 53 | { 54 | if (string.IsNullOrWhiteSpace(ex?.Message)) 55 | { 56 | return; 57 | } 58 | 59 | writeToLog(string.Format(CultureInfo.CurrentCulture, ExceptionFormat, ex?.Message)); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/Helpers/ConversionHelperTests.cs: -------------------------------------------------------------------------------- 1 | #region Using Directives 2 | 3 | using System; 4 | using System.Globalization; 5 | using ServiceBusExplorer.Utilities.Helpers; 6 | using FluentAssertions; 7 | using Xunit; 8 | 9 | #endregion 10 | 11 | namespace ServiceBusExplorer.Tests.Helpers 12 | { 13 | public class ConversionHelperTests 14 | { 15 | [Fact] 16 | public void MapStringTypeToCLRType_ValueIsGuidObject_ReturnsEqualGuidObject() 17 | { 18 | var guid = new Guid("2E9DB8C4-8803-4BD7-B860-8932CF13835E"); 19 | var convertedGuid = ConversionHelper.MapStringTypeToCLRType("Guid", guid); 20 | convertedGuid.Should().BeEquivalentTo(guid); 21 | } 22 | 23 | [Fact] 24 | public void MapStringTypeToCLRType_ValueIsGuidString_ReturnsEqualGuidObject() 25 | { 26 | var guidStr = "2E9DB8C4-8803-4BD7-B860-8932CF13835E"; 27 | var convertedGuid = ConversionHelper.MapStringTypeToCLRType("Guid", guidStr); 28 | convertedGuid.ToString().Should().BeEquivalentTo(guidStr); 29 | } 30 | 31 | [Theory] 32 | [InlineData("00:00:00")] 33 | [InlineData("3:44:55")] 34 | [InlineData("03:44:55")] 35 | [InlineData("1:00:00:00.0000000")] // one day 36 | public void MapStringTypeToCLRType_ValueIsTimeSpanString_ReturnsEqualTimespanObject(string timespanStr) 37 | { 38 | var convertedTimespan = ConversionHelper.MapStringTypeToCLRType("TimeSpan", timespanStr); 39 | convertedTimespan.Should().BeEquivalentTo(TimeSpan.Parse(timespanStr, CultureInfo.InvariantCulture)); 40 | } 41 | 42 | [Fact] 43 | public void MapStringTypeToCLRType_ValueIsTimeSpan_ReturnsEqualTimespanObject() 44 | { 45 | var convertedTimespan = ConversionHelper.MapStringTypeToCLRType("TimeSpan", TimeSpan.Zero); 46 | convertedTimespan.Should().Be(TimeSpan.Zero); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Common/Helpers/StringBodyWriter.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.ServiceModel.Channels; 25 | using System.Xml; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | class StringBodyWriter : BodyWriter 32 | { 33 | #region Private Fields 34 | private readonly string content; 35 | #endregion 36 | 37 | #region Public Constructor 38 | public StringBodyWriter(string content) 39 | : base(true) 40 | { 41 | this.content = content; 42 | } 43 | #endregion 44 | 45 | #region Protected Methods 46 | protected override void OnWriteBodyContents(XmlDictionaryWriter writer) 47 | { 48 | writer.WriteRaw(content); 49 | } 50 | #endregion 51 | } 52 | } -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Forms/CreateEventGridTopicForm.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Utilities.Helpers; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Data; 6 | using System.Diagnostics.Tracing; 7 | using System.Drawing; 8 | using System.Globalization; 9 | using System.Linq; 10 | using System.Reflection; 11 | using System.Runtime.ExceptionServices; 12 | using System.Text; 13 | using System.Threading.Tasks; 14 | using System.Windows.Forms; 15 | 16 | namespace ServiceBusExplorer.Forms 17 | { 18 | public partial class CreateEventGridTopicForm : Form 19 | { 20 | #region Private Constants 21 | private const string ExceptionFormat = "Exception: {0}"; 22 | private readonly WriteToLogDelegate writeToLog = default!; 23 | #endregion 24 | 25 | #region Public Fields 26 | public string TopicName; 27 | #endregion 28 | 29 | public CreateEventGridTopicForm(WriteToLogDelegate writeToLog) 30 | { 31 | this.writeToLog = writeToLog; 32 | InitializeComponent(); 33 | } 34 | 35 | private void btnOk_Click(object sender, EventArgs e) 36 | { 37 | try 38 | { 39 | TopicName = txtTopicName.Text; 40 | } 41 | catch (Exception ex) 42 | { 43 | HandleException(ex); 44 | } 45 | 46 | DialogResult = DialogResult.OK; 47 | } 48 | 49 | private void btnCancel_Click(object sender, EventArgs e) 50 | { 51 | DialogResult = DialogResult.Cancel; 52 | Close(); 53 | } 54 | 55 | private void HandleException(Exception ex) 56 | { 57 | if (string.IsNullOrWhiteSpace(ex?.Message)) 58 | { 59 | return; 60 | } 61 | 62 | writeToLog(string.Format(CultureInfo.CurrentCulture, ExceptionFormat, ex?.Message)); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/TestControlHelper.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Forms; 2 | using ServiceBusExplorer.Utilities.Helpers; 3 | 4 | using System; 5 | using System.Threading.Tasks; 6 | 7 | namespace ServiceBusExplorer.UIHelpers 8 | { 9 | internal class TestControlHelper 10 | { 11 | #region Public Constants 12 | //*************************** 13 | // Formats 14 | //*************************** 15 | public const string ExceptionFormat = "Exception: {0}"; 16 | public const string InnerExceptionFormat = "InnerException: {0}"; 17 | public const string LabelFormat = "{0:0.000}"; 18 | #endregion 19 | 20 | #region Public instance properties 21 | public bool IsReadyToStoreMessageText { get; set; } 22 | public ServiceBusHelper ServiceBusHelper { get; } 23 | public MainForm MainForm { get; } 24 | public WriteToLogDelegate WriteToLog { get; } 25 | public Action StartLog { get; } 26 | public Func StopLog { get; } 27 | #endregion 28 | 29 | #region Public constructor 30 | public TestControlHelper(MainForm mainForm, 31 | WriteToLogDelegate writeToLog, 32 | Func stopLog, 33 | Action startLog, 34 | ServiceBusHelper serviceBusHelper) 35 | { 36 | MainForm = mainForm ?? throw new ArgumentNullException(nameof(mainForm)); 37 | WriteToLog = writeToLog; 38 | StopLog = stopLog; 39 | StartLog = startLog; 40 | ServiceBusHelper = serviceBusHelper; 41 | } 42 | #endregion 43 | 44 | #region Public methods 45 | public void OnMessageTextChanged(string text) 46 | { 47 | if (IsReadyToStoreMessageText) 48 | { 49 | MainForm.MessageText = text; 50 | } 51 | } 52 | #endregion 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Common/Helpers/IdAttribute.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 31 | public class IdAttribute : Attribute 32 | { 33 | #region Public Constructors 34 | public IdAttribute() 35 | { 36 | PropertyId = 0; 37 | CategoryId = 0; 38 | } 39 | 40 | public IdAttribute(int propertyId, int categoryId) 41 | { 42 | PropertyId = propertyId; 43 | CategoryId = categoryId; 44 | } 45 | #endregion 46 | 47 | #region Public Properties 48 | public int PropertyId { get; set; } 49 | public int CategoryId { get; set; } 50 | #endregion 51 | } 52 | } -------------------------------------------------------------------------------- /src/Common/Helpers/EventProcessorCheckpointManager.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Threading.Tasks; 25 | using Microsoft.ServiceBus.Messaging; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | public class EventProcessorCheckpointManager : ICheckpointManager 32 | { 33 | #region Public Properties 34 | public string Namespace { get; set; } 35 | public string EventHub { get; set; } 36 | public string ConsumerGroup { get; set; } 37 | #endregion 38 | 39 | #region ICheckpointManager Methods 40 | public Task CheckpointAsync(Lease lease, string offset, long sequenceNumber) 41 | { 42 | return EventProcessorCheckpointHelper.CheckpointAsync(Namespace, EventHub, ConsumerGroup, lease, offset); 43 | } 44 | #endregion 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/ServiceBus/Helpers/PurgeOperationCompletedEventArgs.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | using System; 23 | 24 | namespace ServiceBusExplorer.ServiceBus.Helpers 25 | { 26 | public class PurgeOperationCompletedEventArgs : EventArgs 27 | { 28 | public bool IsDeadLetterQueue { get; set; } 29 | public string EntityPath { get; set; } 30 | public long ElapsedMilliseconds { get; set; } 31 | public long TotalMessagesPurged { get; set; } 32 | 33 | public PurgeOperationCompletedEventArgs(string entityPath, long elapsedMilliseconds, long totalMessagesPurged, bool isDeadLetterQueue) 34 | { 35 | this.EntityPath = entityPath; 36 | this.ElapsedMilliseconds = elapsedMilliseconds; 37 | this.TotalMessagesPurged = totalMessagesPurged; 38 | this.IsDeadLetterQueue = isDeadLetterQueue; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/AccidentalDeletionPreventionCheckControl.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace ServiceBusExplorer.Controls 6 | { 7 | public partial class AccidentalDeletionPreventionCheckControl : UserControl 8 | { 9 | #region Private Constants 10 | private const string DeletionBlockedTitle = "Deletion Blocked"; 11 | private const string DeletionBlockedMessage = "The deletion will not proceed unless you indicate your intention by typing the name of the item shown."; 12 | #endregion 13 | 14 | #region Public Constructors 15 | public AccidentalDeletionPreventionCheckControl() 16 | { 17 | InitializeComponent(); 18 | } 19 | #endregion 20 | 21 | #region Public Properties 22 | public string DeletionScopePromptText 23 | { 24 | get => lblDeletionScopePromptText.Text; 25 | set => lblDeletionScopePromptText.Text = value; 26 | } 27 | 28 | public bool DisableFurtherChecks 29 | { 30 | get => chkDisableAccidentalDeletionPrevention.Checked; 31 | set => chkDisableAccidentalDeletionPrevention.Checked = value; 32 | } 33 | #endregion 34 | 35 | #region Public Methods 36 | public bool CheckAcceptanceAndNotifyUser() 37 | { 38 | bool isAccepted = string.Equals( 39 | txtDeletionScopePromptCheck.Text.Trim(), 40 | lblDeletionScopePromptText.Text, 41 | StringComparison.InvariantCultureIgnoreCase); 42 | 43 | if (!isAccepted) 44 | { 45 | MessageBox.Show( 46 | FindForm(), 47 | DeletionBlockedMessage, 48 | DeletionBlockedTitle, 49 | MessageBoxButtons.OK, 50 | MessageBoxIcon.Warning); 51 | } 52 | 53 | return isAccepted; 54 | } 55 | #endregion 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/MonitorRuleList.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections.Generic; 25 | using System.Xml.Serialization; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.UIHelpers 30 | { 31 | [XmlRoot(ElementName = "MonitorRules", Namespace = "http://schemas.microsoft.com/servicebusexplorer")] 32 | [XmlType(TypeName = "MonitorRules", Namespace = "http://schemas.microsoft.com/servicebusexplorer")] 33 | public class MonitorRuleList : List 34 | { 35 | #region Public Constructors 36 | public MonitorRuleList() 37 | {} 38 | 39 | public MonitorRuleList(int capacity): base(capacity) 40 | {} 41 | 42 | public MonitorRuleList(IEnumerable collection) 43 | : base(collection) 44 | {} 45 | #endregion 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Utilities/Helpers/XmlLinqExtensions.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Xml.Linq; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Utilities.Helpers 29 | { 30 | public static class XmlLinqExtensions 31 | { 32 | public static XElement AquireElement(this XContainer container, 33 | string name, bool addFirst = false) 34 | { 35 | var element = container.Element(name); 36 | 37 | if (null != element) 38 | { 39 | return element; 40 | } 41 | 42 | element = new XElement(name); 43 | 44 | if (addFirst) 45 | { 46 | container.AddFirst(element); 47 | } 48 | else 49 | { 50 | container.Add(element); 51 | } 52 | 53 | return element; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/ProviderInstaller.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.ComponentModel; 25 | using ServiceBusExplorer.Helpers; 26 | 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.UIHelpers 31 | { 32 | public static class ProviderInstaller 33 | { 34 | #region Public Static Methods 35 | public static DynamicCustomTypeDescriptor Install(object instance) 36 | { 37 | var parentProvider = TypeDescriptor.GetProvider(instance); 38 | var parentCtd = parentProvider.GetTypeDescriptor(instance); 39 | var ourCtd = new DynamicCustomTypeDescriptor(parentCtd, instance); 40 | var ourProvider = new CustomTypeDescriptionProvider(parentProvider, ourCtd); 41 | TypeDescriptor.AddProvider(ourProvider, instance); 42 | return ourCtd; 43 | } 44 | #endregion 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/ServiceBusExplorer.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | servicebusexplorer 4 | Service Bus Explorer 5 | $version$ 6 | Paolo Salvatori 7 | Paolo Salvatori 8 | The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs. 9 | The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs. 10 | https://github.com/paolosalvatori/ServiceBusExplorer 11 | https://github.com/paolosalvatori/ServiceBusExplorer 12 | https://github.com/paolosalvatori/ServiceBusExplorer 13 | servicebusexplorer azure azureservicebus servicebus explorer eventhub queue subscription relay notificationhub 14 | Copyright 2017 Paolo Salvatori 15 | https://github.com/paolosalvatori/ServiceBusExplorer#license 16 | false 17 | https://raw.githubusercontent.com/paolosalvatori/ServiceBusExplorer/main/src/ServiceBusExplorer/Icons/NewServiceBusExplorerLogo.ico 18 | https://github.com/paolosalvatori/ServiceBusExplorer/wiki 19 | https://github.com/paolosalvatori/ServiceBusExplorer/releases 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/NotificationHubs/NotificationHubs.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {E836C914-9BFE-4C1C-96E5-6A414CDEF485} 4 | ServiceBusExplorer.NotificationHubs 5 | ServiceBusExplorer.NotificationHubs 6 | 1.0.0.1 7 | net472 8 | NotificationHubs 9 | NotificationHubs 10 | Copyright © 2019 11 | bin\$(Configuration)\ 12 | 7035 13 | 14 | 15 | full 16 | True 17 | 18 | 19 | pdbonly 20 | True 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | ExeInternalDependencyValidation.layerdiagram 35 | False 36 | 37 | 38 | AssemblyDependencyValidation.layerdiagram 39 | False 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/Relay/Helpers/RelayWrapper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Relay.Helpers 29 | { 30 | /// 31 | /// This class contains the information of a Relay 32 | /// 33 | public class RelayWrapper 34 | { 35 | #region Public Constructors 36 | /// 37 | /// Initializes a new instance of the RelayWrapper class. 38 | /// 39 | /// The service name. 40 | /// The service uri. 41 | public RelayWrapper(string name, Uri uri) 42 | { 43 | Name = name; 44 | Uri = uri; 45 | } 46 | #endregion 47 | 48 | #region Public Properties 49 | public string Name { get; set; } 50 | public Uri Uri { get; set; } 51 | #endregion 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /.github/workflows/winget-submission.yml: -------------------------------------------------------------------------------- 1 | name: WinGet submission on release 2 | # based off of https://github.com/microsoft/PowerToys/blob/main/.github/workflows/package-submissions.yml and https://github.com/microsoft/terminal/blob/main/.github/workflows/winget.yml 3 | 4 | on: 5 | release: 6 | types: [published] 7 | 8 | env: 9 | VERSION_REGEX: 'ServiceBusExplorer-([\d.]+)(?:-preview)?\.zip$' 10 | 11 | # winget-create will read the following environment variable to access the GitHub token needed for submitting a PR 12 | # See https://aka.ms/winget-create-token 13 | WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.WINGET_TOKEN }} 14 | 15 | jobs: 16 | winget: 17 | name: Publish winget package 18 | runs-on: windows-2022 19 | steps: 20 | - name: Submit PaoloSalvatori.ServiceBusExplorer ${{ github.event.release.prerelease && 'Preview' || 'Stable' }} 21 | run: | 22 | 23 | $assets = '${{ toJSON(github.event.release.assets) }}' | ConvertFrom-Json 24 | $wingetRelevantAsset = $assets | Where-Object { $_.name -like '*.zip' } | Select-Object -First 1 25 | $regex = [Regex]::New($env:VERSION_REGEX) 26 | $version = $regex.Match($wingetRelevantAsset.name).Groups[1].Value 27 | 28 | if ($version -eq '') { 29 | Write-Error "Version not found in asset name: $($wingetRelevantAsset.name)" 30 | exit 1 31 | } else { 32 | Write-Host "Version found: $version" 33 | } 34 | 35 | $wingetPackage = "PaoloSalvatori.ServiceBusExplorer${{ github.event.release.prerelease && '.Preview' || '' }}" 36 | Write-Host "Winget package: $wingetPackage" 37 | 38 | # URL 39 | $zipUrl = $wingetRelevantAsset.browser_download_url 40 | write-host "URL: $zipUrl" 41 | 42 | # Get the latest wingetcreate file 43 | Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe 44 | 45 | # Submit a PR for the package 46 | .\wingetcreate.exe update $wingetPackage --submit --version $version --urls "$zipUrl|x64" 47 | 48 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Forms/EventGridConnectForm.cs: -------------------------------------------------------------------------------- 1 | using ServiceBusExplorer.Helpers; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Windows.Forms; 6 | 7 | namespace ServiceBusExplorer.Forms 8 | { 9 | public partial class EventGridConnectForm : Form 10 | { 11 | #region Public Fields 12 | public string ResourceGroup; 13 | public string NamespaceName; 14 | public string SubscriptionId; 15 | public string ApiVersion; 16 | public int RetryTimeout; 17 | public string CloudTenant; 18 | public string CustomId; 19 | public List SelectedEntities = new List { Constants.TopicEntities, Constants.SubscriptionEntities }; 20 | #endregion 21 | 22 | public EventGridConnectForm() 23 | { 24 | InitializeComponent(); 25 | } 26 | 27 | private void customCloud_CheckedChanged(object sender, EventArgs e) 28 | { 29 | txtCustomId.Enabled = btnCustomCloud.Checked; 30 | } 31 | 32 | private void btnOk_Click(object sender, EventArgs e) 33 | { 34 | ResourceGroup = txtResourceGroupName.Text.Trim(); 35 | NamespaceName = txtNamespaceName.Text.Trim(); 36 | SubscriptionId = txtSubscriptionId.Text.Trim(); 37 | ApiVersion = cboApiVersion.Text.Trim(); 38 | 39 | int.TryParse(txtRetryTimeout.Text, out var retryTimoutInSeconds); 40 | RetryTimeout = retryTimoutInSeconds; 41 | CloudTenant = cloudGroupBox.Controls.OfType().FirstOrDefault(r => r.Checked).Text; 42 | CustomId = txtCustomId.Text?.Trim(); 43 | 44 | DialogResult = DialogResult.OK; 45 | } 46 | 47 | private void btnCancel_Click(object sender, EventArgs e) 48 | { 49 | DialogResult = DialogResult.Cancel; 50 | Close(); 51 | } 52 | 53 | private void EventGridConnectForm_Load(object sender, EventArgs e) 54 | { 55 | cboApiVersion.SelectedIndex = 0; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/AssemblyVersionShould.cs: -------------------------------------------------------------------------------- 1 | using FluentAssertions; 2 | using System; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Reflection; 6 | using System.Xml; 7 | using Xunit; 8 | 9 | namespace ServiceBusExplorer.Tests 10 | { 11 | public class AssemblyVersionShould 12 | { 13 | private const string CSharpProjectExtension = ".csproj"; 14 | 15 | [Fact] 16 | public void BeSameAsSetInProject() 17 | { 18 | var assemblyNames = Directory.GetFiles(".", "ServiceBus*.*") 19 | .Where(x=>x.EndsWith(".dll") || x.EndsWith(".exe")); 20 | 21 | var projectFiles = Directory.GetFiles("../../../../", $"*{CSharpProjectExtension}", SearchOption.AllDirectories); 22 | 23 | var xmlDocument = new XmlDocument(); 24 | 25 | var expectedVersions = projectFiles.Select(x => 26 | { 27 | xmlDocument.Load(x); 28 | var assemblyVersionNode = xmlDocument.SelectSingleNode("//AssemblyVersion"); 29 | var assemblyNameNode = xmlDocument.SelectSingleNode("//AssemblyName"); 30 | 31 | return new 32 | { 33 | assemblyName = assemblyNameNode?.InnerText ?? ExtractProjectName(x), 34 | assemblyVersion= assemblyVersionNode.InnerText 35 | }; 36 | }).ToArray() ; 37 | 38 | var actualAssemblyVersions = assemblyNames.Select(x=> 39 | { 40 | var assembly = Assembly.LoadFrom(x); 41 | return new 42 | { 43 | assemblyName = assembly.GetName().Name, 44 | assemblyVersion = assembly.GetName().Version.ToString() 45 | }; 46 | }).ToArray(); 47 | 48 | actualAssemblyVersions.Should().HaveCount(9).And.BeEquivalentTo(expectedVersions); 49 | } 50 | 51 | private string ExtractProjectName(string x) 52 | { 53 | return new FileInfo(x).Name.Replace(CSharpProjectExtension, string.Empty); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Common/Helpers/LockDurationTooLowException.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Runtime.Serialization; 26 | 27 | #endregion 28 | 29 | 30 | namespace ServiceBusExplorer.Helpers 31 | { 32 | [Serializable] 33 | public class LockDurationTooLowException : Exception 34 | { 35 | #region Public constructors 36 | public LockDurationTooLowException() 37 | { 38 | } 39 | 40 | public LockDurationTooLowException(string message) : base(message) 41 | { 42 | } 43 | 44 | public LockDurationTooLowException(string message, Exception innerException) : base(message, innerException) 45 | { 46 | } 47 | #endregion 48 | 49 | #region Protected constructor 50 | protected LockDurationTooLowException(SerializationInfo info, StreamingContext context) : base(info, context) 51 | { 52 | } 53 | #endregion 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Common/Helpers/CustomTypeDescriptionProvider.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.ComponentModel; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | public class CustomTypeDescriptionProvider : TypeDescriptionProvider 32 | { 33 | #region Private Fields 34 | 35 | private readonly ICustomTypeDescriptor customTypeDescriptor; 36 | #endregion 37 | 38 | #region Public Constructors 39 | public CustomTypeDescriptionProvider(TypeDescriptionProvider parent, ICustomTypeDescriptor ctd) 40 | : base(parent) 41 | { 42 | customTypeDescriptor = ctd; 43 | } 44 | #endregion 45 | 46 | #region Public Methods 47 | public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) 48 | { 49 | return customTypeDescriptor; 50 | } 51 | #endregion 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Common/Helpers/ServiceBusHelperEventArgs.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using ServiceBusExplorer.Enums; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | /// 32 | /// This class represents the arguments for the events of the ServiceBusHelper 33 | /// 34 | public class ServiceBusHelperEventArgs : EventArgs 35 | { 36 | #region Public Constructors 37 | public ServiceBusHelperEventArgs() 38 | { 39 | EntityInstance = null; 40 | } 41 | 42 | public ServiceBusHelperEventArgs(dynamic entityInstance, EntityType entityType) 43 | { 44 | EntityInstance = entityInstance; 45 | EntityType = entityType; 46 | } 47 | #endregion 48 | 49 | #region Public Constructors 50 | public dynamic EntityInstance { get; set; } 51 | public EntityType EntityType { get; set; } 52 | #endregion 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Common/Helpers/UrlSegmentWrapper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using ServiceBusExplorer.Enums; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | 32 | /// 33 | /// This class contains the information of a Url Segment 34 | /// 35 | public class UrlSegmentWrapper 36 | { 37 | #region Public Constructors 38 | /// 39 | /// Initializes a new instance of the UrlSegmentWrapper class. 40 | /// 41 | /// The entity type. 42 | /// The url segment uri. 43 | public UrlSegmentWrapper(EntityType type, Uri uri) 44 | { 45 | EntityType = type; 46 | Uri = uri; 47 | } 48 | #endregion 49 | 50 | #region Public Properties 51 | public EntityType EntityType { get; set; } 52 | public Uri Uri { get; set; } 53 | #endregion 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {41D3C27D-37FF-43B8-AAC0-4F483E507698} 4 | net472 5 | latest 6 | ServiceBusExplorer.Tests 7 | 1.0.0.1 8 | Microsoft 9 | ServiceBusExplorer.Tests 10 | Copyright © Microsoft 2016 11 | bin\$(Configuration)\ 12 | 7035 13 | 14 | 15 | True 16 | 17 | 18 | True 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/ScrollBarHelper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Runtime.InteropServices; 26 | using System.Windows.Forms; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.UIHelpers 31 | { 32 | class ScrollBarHelper 33 | { 34 | public static ScrollBars GetVisibleScrollbars(Control ctl) 35 | { 36 | var wndStyle = NativeMethods.GetWindowLong(ctl.Handle, Win32.GwlStyle); 37 | var hsVisible = (wndStyle & Win32.WsHscroll) != 0; 38 | var vsVisible = (wndStyle & Win32.WsVscroll) != 0; 39 | 40 | if (hsVisible) 41 | return vsVisible ? ScrollBars.Both : ScrollBars.Horizontal; 42 | return vsVisible ? ScrollBars.Vertical : ScrollBars.None; 43 | } 44 | } 45 | 46 | public class Win32 47 | { 48 | // offset of window style value 49 | public const int GwlStyle = -16; 50 | 51 | // window style constants for scrollbars 52 | public const int WsVscroll = 0x00200000; 53 | public const int WsHscroll = 0x00100000; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/Controls/ReadOnlyPropertyGrid.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | using System; 24 | using System.ComponentModel; 25 | using System.Windows.Forms; 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Controls 29 | { 30 | public class ReadOnlyPropertyGrid : PropertyGrid 31 | { 32 | private bool readOnly; 33 | 34 | public bool ReadOnly 35 | { 36 | get { return readOnly; } 37 | set 38 | { 39 | readOnly = value; 40 | SetObjectAsReadOnly(); 41 | } 42 | } 43 | 44 | protected override void OnSelectedObjectsChanged(EventArgs e) 45 | { 46 | SetObjectAsReadOnly(); 47 | base.OnSelectedObjectsChanged(e); 48 | } 49 | 50 | private void SetObjectAsReadOnly() 51 | { 52 | if (SelectedObject == null) 53 | { 54 | return; 55 | } 56 | TypeDescriptor.AddAttributes(SelectedObject, new Attribute[] { new ReadOnlyAttribute(readOnly) }); 57 | Refresh(); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/DictionaryPropertyDescriptor.cs: -------------------------------------------------------------------------------- 1 | namespace ServiceBusExplorer.UIHelpers 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.ComponentModel; 6 | using System.Drawing.Design; 7 | 8 | public class DictionaryPropertyDescriptor : PropertyDescriptor 9 | where TValue : class 10 | { 11 | private readonly IDictionary _dictionary; 12 | private readonly TKey _key; 13 | 14 | internal DictionaryPropertyDescriptor(IDictionary dictionary, TKey key, bool isReadOnly) 15 | : base(key.ToString(), null) 16 | { 17 | _dictionary = dictionary; 18 | _key = key; 19 | IsReadOnly = isReadOnly; 20 | } 21 | 22 | public override Type PropertyType => _dictionary[_key]?.GetType(); 23 | 24 | public override void SetValue(object component, object value) 25 | { 26 | _dictionary[_key] = value as TValue; 27 | } 28 | 29 | public override object GetValue(object component) 30 | { 31 | return _dictionary[_key]; 32 | } 33 | 34 | public override bool IsReadOnly { get; } 35 | 36 | public override Type ComponentType => null; 37 | 38 | public override bool CanResetValue(object component) 39 | { 40 | return false; 41 | } 42 | 43 | public override void ResetValue(object component) 44 | { 45 | } 46 | 47 | public override bool ShouldSerializeValue(object component) 48 | { 49 | return false; 50 | } 51 | 52 | public override object GetEditor(Type editorBaseType) 53 | { 54 | if (editorBaseType == typeof(UITypeEditor)) 55 | { 56 | if (PropertyType == typeof(string)) 57 | { 58 | var value = _dictionary[_key] as string; 59 | if (value != null && (value.Contains("\n") || value.Contains("\r"))) 60 | { 61 | return new System.ComponentModel.Design.MultilineStringEditor(); 62 | } 63 | } 64 | } 65 | 66 | return base.GetEditor(editorBaseType); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/ControlHelper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Runtime.InteropServices; 26 | using System.Windows.Forms; 27 | 28 | #endregion 29 | 30 | namespace ServiceBusExplorer.UIHelpers 31 | { 32 | public static class ControlHelper 33 | { 34 | #region Redraw Suspend/Resume 35 | private const int WmSetredraw = 0xB; 36 | public static void SuspendDrawing(this Control target) 37 | { 38 | NativeMethods.SendMessage(target.Handle, WmSetredraw, 0, 0); 39 | } 40 | 41 | public static void ResumeDrawing(this Control target) 42 | { 43 | ResumeDrawing(target, true); 44 | } 45 | 46 | public static void ResumeDrawing(this Control target, bool redraw) 47 | { 48 | NativeMethods.SendMessage(target.Handle, WmSetredraw, 1, 0); 49 | if (redraw) 50 | { 51 | target.Refresh(); 52 | } 53 | } 54 | #endregion 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/Common/Helpers/CustomMessageSessionAsyncHandlerFactory.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using Microsoft.ServiceBus.Messaging; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public class CustomMessageSessionAsyncHandlerFactory : IMessageSessionAsyncHandlerFactory 31 | { 32 | #region Public Properties 33 | public CustomMessageSessionAsyncHandlerConfiguration Configuration { get; set; } 34 | #endregion 35 | 36 | #region Public Constructor 37 | public CustomMessageSessionAsyncHandlerFactory(CustomMessageSessionAsyncHandlerConfiguration configuration) 38 | { 39 | Configuration = configuration; 40 | } 41 | #endregion 42 | 43 | #region IMessageSessionAsyncHandlerFactory Methods 44 | public IMessageSessionAsyncHandler CreateInstance(MessageSession session, BrokeredMessage message) 45 | { 46 | return new CustomMessageSessionAsyncHandler(Configuration); 47 | } 48 | 49 | public void DisposeInstance(IMessageSessionAsyncHandler handler) 50 | { 51 | } 52 | #endregion 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Common/Helpers/PropertyStateFlagsAttribute.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using ServiceBusExplorer.Utilities.Helpers; 25 | using System; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.Helpers 30 | { 31 | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] 32 | public class PropertyStateFlagsAttribute : Attribute 33 | { 34 | #region Private Fields 35 | private PropertyFlags mFlags = PropertyFlags.All & ~PropertyFlags.ExclusiveStandardValues; 36 | #endregion 37 | 38 | #region Public Constructors 39 | public PropertyStateFlagsAttribute() 40 | { 41 | 42 | } 43 | public PropertyStateFlagsAttribute(PropertyFlags flags) 44 | { 45 | mFlags = flags; 46 | } 47 | #endregion 48 | 49 | #region Public Properties 50 | public PropertyFlags Flags 51 | { 52 | get 53 | { 54 | return mFlags; 55 | } 56 | set 57 | { 58 | mFlags = value; 59 | } 60 | } 61 | #endregion 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/Common/Helpers/CustomMessageSessionAsyncHandlerConfiguration.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.ServiceModel.Channels; 26 | using ServiceBusExplorer.Utilities.Helpers; 27 | using Microsoft.ServiceBus.Messaging; 28 | 29 | #endregion 30 | 31 | namespace ServiceBusExplorer.Helpers 32 | { 33 | public class CustomMessageSessionAsyncHandlerConfiguration 34 | { 35 | #region Public Properties 36 | public bool Logging { get; set; } 37 | public bool Tracking { get; set; } 38 | public bool Verbose { get; set; } 39 | public bool AutoComplete { get; set; } 40 | public MessageEncoder MessageEncoder { get; set; } 41 | public ReceiveMode ReceiveMode { get; set; } 42 | public Func TrackMessage { get; set; } 43 | public Func GetElapsedTime { get; set; } 44 | public Action UpdateStatistics { get; set; } 45 | public IBrokeredMessageInspector MessageInspector { get; set; } 46 | public WriteToLogDelegate WriteToLog { get; set; } 47 | public ServiceBusHelper ServiceBusHelper { get; set; } 48 | #endregion 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.github/workflows/handle-tag.yml: -------------------------------------------------------------------------------- 1 | name: Handle tag 2 | 3 | on: 4 | push: 5 | tags: 6 | - '[0-9]+.[0-9]+.[0-9]+*' 7 | workflow_dispatch: 8 | 9 | jobs: 10 | check-tag-branch: 11 | # This job is based on replies in https://github.community/t/how-to-create-filter-on-both-tag-and-branch/16936/6 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Get tag commit hash 15 | id: tag-commit-hash 16 | run: | 17 | hash=${{ github.sha }} 18 | echo "{name}=tag-hash::${hash}" >> $GITHUB_OUTPUT 19 | echo $hash 20 | 21 | - name: Checkout main 22 | uses: actions/checkout@v4 23 | with: 24 | ref: main 25 | 26 | - name: Get latest main commit hash 27 | id: main-commit-hash 28 | run: | 29 | hash=$(git log -n1 --format=format:"%H") 30 | echo "{name}=main-hash::${hash}" >> $GITHUB_OUTPUT 31 | echo $hash 32 | 33 | - name: Verify tag commit matches main commit - exit if they don't match 34 | if: steps.tag-commit-hash.outputs.tag-hash != steps.main-commit-hash.outputs.main-hash 35 | run: | 36 | echo "Tag was not on the main branch. Exiting." 37 | exit 1 38 | 39 | get-version: 40 | runs-on: windows-2022 41 | steps: 42 | - name: Get version from tag 43 | id: extract-tag 44 | shell: bash 45 | run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 46 | 47 | - name: Check output to get version number 48 | run: | 49 | echo "release_version is $env:RELEASE_VERSION" 50 | if ($env:RELEASE_VERSION -eq $null -or $env:RELEASE_VERSION -eq '') { 51 | echo "Setting release version to 0.0.0" 52 | echo "RELEASE_VERSION=0.0.0" >> $env:GITHUB_ENV 53 | } 54 | 55 | outputs: 56 | release-version: ${{ env.RELEASE_VERSION }} 57 | 58 | call-build-test: 59 | needs: [check-tag-branch, get-version] 60 | uses: ./.github/workflows/build-test.yml 61 | with: 62 | release-version: ${{ needs.get-version.outputs.release-version }} 63 | cache-build: true 64 | 65 | publish-it: 66 | needs: [check-tag-branch, get-version, call-build-test] 67 | uses: ./.github/workflows/publish.yml 68 | secrets: 69 | CHOCO_TOKEN: ${{ secrets.CHOCOTOKEN }} 70 | with: 71 | release-version: ${{ needs.get-version.outputs.release-version }} 72 | 73 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer/UIHelpers/MonitorRule.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Windows.Forms.DataVisualization.Charting; 25 | using System.Xml.Serialization; 26 | 27 | #endregion 28 | 29 | namespace ServiceBusExplorer.UIHelpers 30 | { 31 | public enum MonitorState 32 | { 33 | Normal, 34 | Warning, 35 | Critical 36 | } 37 | 38 | public class MonitorRule 39 | { 40 | #region Private Fields 41 | private MonitorState monitorState = MonitorState.Normal; 42 | #endregion 43 | 44 | #region Public Properties 45 | public string Entity { get; set; } 46 | public string Type { get; set; } 47 | public string Monitor { get; set; } 48 | public long Warning { get; set; } 49 | public long Critical { get; set; } 50 | public long Current { get; set; } 51 | public bool Valid { get; set; } 52 | [XmlIgnore] 53 | public Series Series { get; set; } 54 | [XmlIgnore] 55 | public MonitorState State 56 | { 57 | get { return monitorState; } 58 | set { monitorState = value; } 59 | } 60 | #endregion 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/Common/Helpers/CustomMessageHeaderInfo.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System.Collections.Generic; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | public class CustomMessageHeaderInfo 31 | { 32 | #region Public Constructors 33 | public CustomMessageHeaderInfo() 34 | { 35 | 36 | Name = null; 37 | Namespace = null; 38 | Value = null; 39 | } 40 | 41 | public CustomMessageHeaderInfo(string key, string type, string value) 42 | { 43 | Name = key; 44 | Namespace = type; 45 | Value = value; 46 | } 47 | #endregion 48 | 49 | #region Static Constructor 50 | static CustomMessageHeaderInfo() 51 | { 52 | Headers = new List(); 53 | } 54 | #endregion 55 | 56 | #region Public Instance Properties 57 | public string Name { get; set; } 58 | public string Namespace { get; set; } 59 | public string Value { get; set; } 60 | #endregion 61 | 62 | #region Public Static Properties 63 | public static List Headers { get; set; } 64 | #endregion 65 | } 66 | } -------------------------------------------------------------------------------- /src/Common/Helpers/UserPropertyWrapper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using System; 25 | using System.Collections.Generic; 26 | using System.Linq; 27 | 28 | #endregion 29 | 30 | 31 | namespace ServiceBusExplorer.Helpers 32 | { 33 | public class UserPropertyWrapper 34 | { 35 | #region Private Fields 36 | private string name; 37 | private object val; 38 | #endregion 39 | 40 | #region Public Constructor 41 | public UserPropertyWrapper() 42 | { 43 | } 44 | 45 | public UserPropertyWrapper(KeyValuePair property) 46 | { 47 | name = property.Key; 48 | val = property.Value; 49 | } 50 | #endregion 51 | 52 | #region Public Properties 53 | public string Name 54 | { 55 | get 56 | { 57 | return name; 58 | } 59 | set 60 | { 61 | name = value; 62 | } 63 | } 64 | 65 | public object Value 66 | { 67 | get 68 | { 69 | return val; 70 | } 71 | set 72 | { 73 | val = value; 74 | } 75 | } 76 | #endregion 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Common/Helpers/RuleWrapper.cs: -------------------------------------------------------------------------------- 1 | #region Copyright 2 | //======================================================================================= 3 | // Microsoft Azure Customer Advisory Team 4 | // 5 | // This sample is supplemental to the technical guidance published on my personal 6 | // blog at http://blogs.msdn.com/b/paolos/. 7 | // 8 | // Author: Paolo Salvatori 9 | //======================================================================================= 10 | // Copyright (c) Microsoft Corporation. All rights reserved. 11 | // 12 | // LICENSED UNDER THE APACHE LICENSE, VERSION 2.0 (THE "LICENSE"); YOU MAY NOT USE THESE 13 | // FILES EXCEPT IN COMPLIANCE WITH THE LICENSE. YOU MAY OBTAIN A COPY OF THE LICENSE AT 14 | // http://www.apache.org/licenses/LICENSE-2.0 15 | // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE DISTRIBUTED UNDER THE 16 | // LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 | // KIND, EITHER EXPRESS OR IMPLIED. SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING 18 | // PERMISSIONS AND LIMITATIONS UNDER THE LICENSE. 19 | //======================================================================================= 20 | #endregion 21 | 22 | #region Using Directives 23 | 24 | using Microsoft.ServiceBus.Messaging; 25 | 26 | #endregion 27 | 28 | namespace ServiceBusExplorer.Helpers 29 | { 30 | /// 31 | /// This class adds a Subscriptions collection to the TopicDescription class 32 | /// 33 | public class RuleWrapper 34 | { 35 | #region Public Constructors 36 | /// 37 | /// Initializes a new instance of the RuleWrapper class. 38 | /// 39 | public RuleWrapper() 40 | { 41 | RuleDescription = null; 42 | SubscriptionDescription = null; 43 | } 44 | 45 | /// 46 | /// Initializes a new instance of the RuleWrapper class. 47 | /// 48 | /// A rule. 49 | /// A subscription. 50 | public RuleWrapper(RuleDescription rule, SubscriptionDescription subscription) 51 | { 52 | RuleDescription = rule; 53 | SubscriptionDescription = subscription; 54 | } 55 | #endregion 56 | 57 | #region Public Properties 58 | public RuleDescription RuleDescription { get; set; } 59 | public SubscriptionDescription SubscriptionDescription { get; set; } 60 | #endregion 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/ServiceBusExplorer.Tests/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | --------------------------------------------------------------------------------