Applied patch from Stephane Ramet to implement QueueBrowser and DeleteDestination. Thanks Stephane! Fixes [AMQNET-517]. (See https://issues.apache.org/jira/browse/AMQNET-517)
Project: http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/commit/51ec9a29 Tree: http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/tree/51ec9a29 Diff: http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/diff/51ec9a29 Branch: refs/heads/master Commit: 51ec9a290ca7bc352d50e4d18599776cca8423b9 Parents: bf07d7b Author: Jim Gomes <[email protected]> Authored: Wed Jan 13 23:24:08 2016 +0000 Committer: Jim Gomes <[email protected]> Committed: Wed Jan 13 23:24:08 2016 +0000 ---------------------------------------------------------------------- src/main/csharp/QueueBrowser.cs | 141 +++++++++++++++++++++++++++++++++++ src/main/csharp/Session.cs | 16 ++-- vs2008-msmq.csproj | 1 + 3 files changed, 152 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/51ec9a29/src/main/csharp/QueueBrowser.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/QueueBrowser.cs b/src/main/csharp/QueueBrowser.cs new file mode 100644 index 0000000..32752c5 --- /dev/null +++ b/src/main/csharp/QueueBrowser.cs @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +using System; +using System.Collections; +using System.Messaging; +using Apache.NMS; +using Apache.NMS.Util; + +namespace Apache.NMS.MSMQ +{ + public class QueueBrowser : Apache.NMS.IQueueBrowser + { + private bool closed = false; + private bool disposed = false; + + private readonly Session session; + private MessageQueue messageQueue; + + public QueueBrowser(Session session, MessageQueue messageQueue) + { + this.session = session; + this.messageQueue = messageQueue; + if(null != this.messageQueue) + { + this.messageQueue.MessageReadPropertyFilter.SetAll(); + } + + } + + ~QueueBrowser() + { + Dispose(false); + } + + #region IDisposable Members + + ///<summary> + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + ///</summary> + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + if(disposed) + { + return; + } + + if(disposing) + { + // Dispose managed code here. + } + + try + { + Close(); + } + catch + { + // Ignore errors. + } + + disposed = true; + } + + #endregion + + public void Close() + { + if(messageQueue != null) + { + messageQueue.Dispose(); + messageQueue = null; + } + closed = true; + } + + public string MessageSelector + { + get { throw new NotSupportedException(); } + } + + public IQueue Queue + { + get { return new Queue(this.messageQueue.Path); } + } + + internal class Enumerator : IEnumerator + { + private readonly Session session; + private readonly MessageEnumerator innerEnumerator; + + public Enumerator(Session session, MessageQueue messageQueue) + { + this.session = session; + this.innerEnumerator = messageQueue.GetMessageEnumerator2(); + } + + public object Current + { + get + { + return this.session.MessageConverter.ToNmsMessage(this.innerEnumerator.Current); + } + } + + public bool MoveNext() + { + return this.innerEnumerator.MoveNext(); + } + + public void Reset() + { + this.innerEnumerator.Reset(); + } + } + + public IEnumerator GetEnumerator() + { + return new Enumerator(this.session, this.messageQueue); + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/51ec9a29/src/main/csharp/Session.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Session.cs b/src/main/csharp/Session.cs index 9ce99f6..5172c08 100644 --- a/src/main/csharp/Session.cs +++ b/src/main/csharp/Session.cs @@ -90,12 +90,17 @@ namespace Apache.NMS.MSMQ public IQueueBrowser CreateBrowser(IQueue queue) { - throw new NotImplementedException(); + return CreateBrowser(queue, null); } public IQueueBrowser CreateBrowser(IQueue queue, string selector) { - throw new NotImplementedException(); + if(selector != null) + { + throw new NotSupportedException("Selectors are not supported by MSMQ"); + } + MessageQueue msmqQueue = MessageConverter.ToMsmqDestination(queue); + return new QueueBrowser(this, msmqQueue); } public IQueue GetQueue(string name) @@ -110,12 +115,12 @@ namespace Apache.NMS.MSMQ public ITemporaryQueue CreateTemporaryQueue() { - throw new NotSupportedException("Tempoary Queues are not supported by MSMQ"); + throw new NotSupportedException("Temporary Queues are not supported by MSMQ"); } public ITemporaryTopic CreateTemporaryTopic() { - throw new NotSupportedException("Tempoary Topics are not supported by MSMQ"); + throw new NotSupportedException("Temporary Topics are not supported by MSMQ"); } /// <summary> @@ -123,8 +128,7 @@ namespace Apache.NMS.MSMQ /// </summary> public void DeleteDestination(IDestination destination) { - // TODO: Implement if possible. If not possible, then change exception to NotSupportedException(). - throw new NotImplementedException(); + MessageQueue.Delete(destination.ToString()); } public IMessage CreateMessage() http://git-wip-us.apache.org/repos/asf/activemq-nms-msmq/blob/51ec9a29/vs2008-msmq.csproj ---------------------------------------------------------------------- diff --git a/vs2008-msmq.csproj b/vs2008-msmq.csproj index 6221c67..8a20d12 100644 --- a/vs2008-msmq.csproj +++ b/vs2008-msmq.csproj @@ -80,6 +80,7 @@ <Compile Include="src\main\csharp\MessageProducer.cs" /> <Compile Include="src\main\csharp\ObjectMessage.cs" /> <Compile Include="src\main\csharp\Queue.cs" /> + <Compile Include="src\main\csharp\QueueBrowser.cs" /> <Compile Include="src\main\csharp\Session.cs" /> <Compile Include="src\main\csharp\StreamMessage.cs" /> <Compile Include="src\main\csharp\TextMessage.cs" />
