You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2017/03/08 13:45:07 UTC

[01/13] activemq-nms-xms git commit: Creating new project for IBM WebSphere MQ provider. Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Repository: activemq-nms-xms
Updated Branches:
  refs/heads/master [created] a2ed5df9d


Creating new project for IBM WebSphere MQ provider.
Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)



Project: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/commit/d6f942b8
Tree: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/tree/d6f942b8
Diff: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/diff/d6f942b8

Branch: refs/heads/master
Commit: d6f942b82436b0f8107cd64f4c71da4c22c3d45e
Parents: 
Author: Jim Gomes <jg...@apache.org>
Authored: Wed Jan 6 01:54:30 2016 +0000
Committer: Jim Gomes <jg...@apache.org>
Committed: Wed Jan 6 01:54:30 2016 +0000

----------------------------------------------------------------------

----------------------------------------------------------------------



[12/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
Initial check-in of new Apache.NMS.XMS provider implementation.
Big thanks to St�phane Ramet for the implementation!
Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)



Project: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/commit/653d676d
Tree: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/tree/653d676d
Diff: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/diff/653d676d

Branch: refs/heads/master
Commit: 653d676deb7de6e2b29c23948bfb0d4f99291508
Parents: d6f942b
Author: Jim Gomes <jg...@apache.org>
Authored: Wed Jan 6 02:19:56 2016 +0000
Committer: Jim Gomes <jg...@apache.org>
Committed: Wed Jan 6 02:19:56 2016 +0000

----------------------------------------------------------------------
 Apache.NMS.XMS.Test.nunit                       |    7 +
 LICENSE.txt                                     |  764 +++++++++
 NOTICE.txt                                      |   12 +
 README.txt                                      |   47 +
 keyfile/NMSKey.snk                              |  Bin 0 -> 596 bytes
 nant-common.xml                                 |  658 ++++++++
 nant.build                                      |  189 +++
 package.ps1                                     |   61 +
 src/main/csharp/BytesMessage.cs                 |  187 +++
 src/main/csharp/Connection.cs                   |  461 ++++++
 src/main/csharp/ConnectionFactory.cs            | 1502 ++++++++++++++++++
 src/main/csharp/ConnectionMetaData.cs           |  106 ++
 src/main/csharp/Destination.cs                  |  524 ++++++
 src/main/csharp/InitialContext.cs               |  174 ++
 src/main/csharp/MapMessage.cs                   |  719 +++++++++
 src/main/csharp/Message.cs                      |  526 ++++++
 src/main/csharp/MessageConsumer.cs              |  201 +++
 src/main/csharp/MessageProducer.cs              |  416 +++++
 src/main/csharp/MessageProperties.cs            |  485 ++++++
 src/main/csharp/ObjectMessage.cs                |   65 +
 src/main/csharp/Queue.cs                        |   75 +
 src/main/csharp/QueueBrowser.cs                 |  145 ++
 src/main/csharp/Session.cs                      |  551 +++++++
 src/main/csharp/StreamMessage.cs                |  480 ++++++
 src/main/csharp/TemporaryQueue.cs               |   62 +
 src/main/csharp/TemporaryTopic.cs               |   62 +
 src/main/csharp/TextMessage.cs                  |   86 +
 src/main/csharp/Topic.cs                        |   72 +
 src/main/csharp/Util/Dispatcher.cs              |  173 ++
 src/main/csharp/Util/ExceptionUtil.cs           |  147 ++
 src/main/csharp/Util/IntrospectionSupport.cs    |  434 +++++
 src/main/csharp/Util/UriAttributeAttribute.cs   |   51 +
 src/main/csharp/Util/XMSConvert.cs              | 1475 +++++++++++++++++
 src/main/csharp/Util/XMSEnum.cs                 | 1167 ++++++++++++++
 src/main/csharp/_TODO_.txt                      |   29 +
 src/main/ndoc/NamespaceSummary.xml              |   21 +
 src/main/sandcastle/feedback_content.xml        |   32 +
 src/test/csharp/AsyncConsumeTest.cs             |  228 +++
 src/test/csharp/BadConsumeTest.cs               |   69 +
 src/test/csharp/BytesMessageTest.cs             |  138 ++
 src/test/csharp/Commands/BytesMessage.cs        |  511 ++++++
 src/test/csharp/Commands/Destination.cs         |  380 +++++
 src/test/csharp/Commands/MapMessage.cs          |   90 ++
 src/test/csharp/Commands/Message.cs             |  329 ++++
 src/test/csharp/Commands/ObjectMessage.cs       |   44 +
 src/test/csharp/Commands/Queue.cs               |   75 +
 src/test/csharp/Commands/StreamMessage.cs       |  901 +++++++++++
 src/test/csharp/Commands/TempDestination.cs     |   70 +
 src/test/csharp/Commands/TempQueue.cs           |   81 +
 src/test/csharp/Commands/TempTopic.cs           |   77 +
 src/test/csharp/Commands/TextMessage.cs         |   70 +
 src/test/csharp/Commands/Topic.cs               |   74 +
 src/test/csharp/ConnectionTest.cs               |  191 +++
 src/test/csharp/ConsumerTest.cs                 |  573 +++++++
 src/test/csharp/DurableTest.cs                  |  267 ++++
 src/test/csharp/EndianBinaryReaderTest.cs       |  162 ++
 src/test/csharp/EndianBinaryWriterTest.cs       |  202 +++
 src/test/csharp/EndianTest.cs                   |  131 ++
 .../csharp/ForeignMessageTransformationTest.cs  |  305 ++++
 src/test/csharp/MapMessageTest.cs               |  208 +++
 src/test/csharp/MessageSelectorTest.cs          |  184 +++
 src/test/csharp/MessageTest.cs                  |  147 ++
 src/test/csharp/MessageTransformerTest.cs       |  124 ++
 src/test/csharp/NMSPropertyTest.cs              |   82 +
 src/test/csharp/NMSTest.cs                      |  508 ++++++
 src/test/csharp/NMSTestSupport.cs               |  651 ++++++++
 src/test/csharp/NMSTracer.cs                    |   87 +
 src/test/csharp/PrimitiveMapTest.cs             |  170 ++
 src/test/csharp/ProducerTest.cs                 |  113 ++
 src/test/csharp/RedeliveryPolicyTest.cs         |  135 ++
 src/test/csharp/RequestResponseTest.cs          |   74 +
 src/test/csharp/StreamMessageTest.cs            |  111 ++
 src/test/csharp/TempDestinationDeletionTest.cs  |   80 +
 src/test/csharp/TempDestinationTest.cs          |  175 ++
 src/test/csharp/TextMessageTest.cs              |   71 +
 src/test/csharp/TransactionTest.cs              |  439 +++++
 src/test/csharp/XMSAsyncConsumeTest.cs          |  106 ++
 src/test/csharp/XMSBadConsumeTest.cs            |   50 +
 src/test/csharp/XMSBytesMessageTest.cs          |   51 +
 src/test/csharp/XMSConnectionTest.cs            |  104 ++
 src/test/csharp/XMSConsumerTest.cs              |  153 ++
 src/test/csharp/XMSDurableTest.cs               |   71 +
 .../XMSForeignMessageTransformationTest.cs      |   75 +
 src/test/csharp/XMSMapMessageTest.cs            |   49 +
 src/test/csharp/XMSMessageSelectorTest.cs       |   60 +
 src/test/csharp/XMSMessageTest.cs               |   42 +
 src/test/csharp/XMSMessageTransformerTest.cs    |   48 +
 src/test/csharp/XMSNMSPropertyTest.cs           |   41 +
 src/test/csharp/XMSProducerTest.cs              |   49 +
 src/test/csharp/XMSRequestResponseTest.cs       |   41 +
 src/test/csharp/XMSStreamMessageTest.cs         |   41 +
 .../csharp/XMSTempDestinationDeletionTest.cs    |   55 +
 src/test/csharp/XMSTempDestinationTest.cs       |   67 +
 src/test/csharp/XMSTestSupport.cs               |  132 ++
 src/test/csharp/XMSTextMessageTest.cs           |   41 +
 src/test/csharp/XMSTransactionTest.cs           |  115 ++
 src/test/csharp/XMSXmlMessageTest.cs            |   52 +
 src/test/csharp/XmlMessageTest.cs               |  186 +++
 vs2013-xms-test.csproj                          |  196 +++
 vs2013-xms.csproj                               |  146 ++
 vs2013-xms.sln                                  |   32 +
 xmsprovider-test.config                         |   33 +
 102 files changed, 22529 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/Apache.NMS.XMS.Test.nunit
----------------------------------------------------------------------
diff --git a/Apache.NMS.XMS.Test.nunit b/Apache.NMS.XMS.Test.nunit
new file mode 100644
index 0000000..54bccec
--- /dev/null
+++ b/Apache.NMS.XMS.Test.nunit
@@ -0,0 +1,7 @@
+\ufeff<NUnitProject>
+  <Settings activeconfig="Default" />
+  <Config name="Default" binpathtype="Auto">
+    <!--<assembly path="Apache.NMS.Test.dll" />-->
+    <assembly path="Apache.NMS.XMS.Test.dll" />
+  </Config>
+</NUnitProject>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/LICENSE.txt
----------------------------------------------------------------------
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..6f22588
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,764 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+APACHE ACTIVEMQ DEPENDENCIES:
+
+The Apache ActiveMQ message broker includes a number of dependencies, many 
+of them optional, with separate copyright notices and license terms. Your 
+use of the source code for the these subcomponents is subject to the terms 
+and conditions of the following licenses. 
+
+For the backport-util-concurrent library:
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<html><head><title>Creative Commons Public Domain</title>
+
+<body>
+
+<p align="center"><em>Copyright-Only Dedication (based on United States law) or Public Domain Certification</em></p>
+
+        <p>The
+person or persons who have associated work with this document (the
+"Dedicator" or "Certifier") hereby either (a) certifies that, to the
+best of his knowledge, the work of authorship identified is in the
+public domain of the country from which the work is published, or (b)
+hereby dedicates whatever copyright the dedicators holds in the work of
+authorship identified below (the "Work") to the public domain. A
+certifier, morever, dedicates any copyright interest he may have in the
+associated work, and for these purposes, is described as a "dedicator"
+below.</p>
+
+        <p>A certifier has taken reasonable steps to verify
+the copyright status of this work. Certifier recognizes that his good
+faith efforts may not shield him from liability if in fact the work
+certified is not in the public domain.</p>
+
+        <p>Dedicator makes
+this dedication for the benefit of the public at large and to the
+detriment of the Dedicator's heirs and successors. Dedicator intends
+this dedication to be an overt act of relinquishment in perpetuity of
+all present and future rights under copyright law, whether vested or
+contingent, in the Work. Dedicator understands that such relinquishment
+of all rights includes the relinquishment of all rights to enforce (by
+lawsuit or otherwise) those copyrights in the Work.</p>
+
+        <p>Dedicator
+recognizes that, once placed in the public domain, the Work may be
+freely reproduced, distributed, transmitted, used, modified, built
+upon, or otherwise exploited by anyone for any purpose, commercial or
+non-commercial, and in any way, including by methods that have not yet
+been invented or conceived.</p>
+    </div>
+</div>
+</body></html>
+
+For the mx4j, mx4j-remote, and mx4j-tools library:
+
+         The MX4J License, Version 1.0
+
+         Copyright (c) 2001-2004 by the MX4J contributors.  All rights reserved.
+
+         Redistribution and use in source and binary forms, with or without
+         modification, are permitted provided that the following conditions
+         are met:
+
+         1. Redistributions of source code must retain the above copyright
+            notice, this list of conditions and the following disclaimer.
+
+         2. Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in
+            the documentation and/or other materials provided with the
+            distribution.
+
+         3. The end-user documentation included with the redistribution,
+            if any, must include the following acknowledgment:
+               "This product includes software developed by the
+                MX4J project (http://mx4j.sourceforge.net)."
+            Alternately, this acknowledgment may appear in the software itself,
+            if and wherever such third-party acknowledgments normally appear.
+
+         4. The name "MX4J" must not be used to endorse or promote
+            products derived from this software without prior written
+            permission.
+            For written permission, please contact
+            biorn_steedom [at] users [dot] sourceforge [dot] net
+
+         5. Products derived from this software may not be called "MX4J",
+            nor may "MX4J" appear in their name, without prior written
+            permission of Simone Bordet.
+
+         THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+         WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+         OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+         DISCLAIMED.  IN NO EVENT SHALL THE MX4J CONTRIBUTORS
+         BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+         SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+         LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+         USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+         ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+         OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+         OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+         SUCH DAMAGE.
+         ====================================================================
+
+         This software consists of voluntary contributions made by many
+         individuals on behalf of the MX4J project.  For more information on
+         MX4J, please see
+         <a href="http://mx4j.sourceforge.net" target="_top">the MX4J website</a>.
+
+For the jetty and jetty-util library:
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+For the xmlpull library:
+
+XMLPULL API IS FREE
+-------------------
+
+All of the XMLPULL API source code, compiled code, and documentation 
+contained in this distribution *except* for tests (see separate LICENSE_TESTS.txt)
+are in the Public Domain.
+
+XMLPULL API comes with NO WARRANTY or guarantee of fitness for any purpose.
+
+Initial authors:
+
+  Stefan Haustein
+  Aleksander Slominski
+
+2001-12-12
+
+For the spring library:
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+For the xstream library:
+
+(BSD Style License)
+
+Copyright (c) 2003-2004, Joe Walnes
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of
+conditions and the following disclaimer. Redistributions in binary form must reproduce
+the above copyright notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the distribution.
+
+Neither the name of XStream nor the names of its contributors may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/NOTICE.txt
----------------------------------------------------------------------
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..d8ded15
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,12 @@
+=========================================================================
+==  NOTICE file corresponding to the section 4 d of                    ==
+==  the Apache License, Version 2.0,                                   ==
+==  in this case for the Apache ActiveMQ distribution.                 ==
+=========================================================================
+
+Apache ActiveMQ
+Copyright 2005-2006 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/README.txt
----------------------------------------------------------------------
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..6c5d2cf
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,47 @@
+=======================================================================
+Welcome to:
+ * Apache.NMS.XMS : Apache NMS for IBM XMS Client Library
+=======================================================================
+
+For more information see http://activemq.apache.org/nms
+
+=======================================================================
+Building With NAnt 0.86 see http://nant.sourceforge.net/
+=======================================================================
+
+NAnt version 0.86 or newer is required to build Apache.NMS.XMS.  Version 0.90
+or newer is highly recommended.
+To build the code using NAnt, run:
+
+  nant
+
+The NMS documentation can be generated into three different formats using
+Microsoft's Sandcastle open source product. The Sandcastle Styles project
+was used to enhance the output generated from the current release of Sandcastle.
+
+The Sandcastle project is located here:
+
+http://sandcastle.codeplex.com/
+
+The Sandcastle Styles project is located here:
+
+http://sandcastlestyles.codeplex.com/
+
+To generate the documentation, run:
+
+  nant sandcastle-all
+
+=======================================================================
+Building With Visual Studio 2013
+=======================================================================
+
+First build the project with nant, this will download and install 
+all the 3rd party dependencies for you.
+
+Open the solution File.  Build using "Build"->"Build Solution" 
+menu option.
+
+The resulting DLLs will be in build\${framework}\debug or the 
+build\${framework}\release directories depending on your settings 
+under "Build"->"Configuration Manager"
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/keyfile/NMSKey.snk
----------------------------------------------------------------------
diff --git a/keyfile/NMSKey.snk b/keyfile/NMSKey.snk
new file mode 100644
index 0000000..fdd5b24
Binary files /dev/null and b/keyfile/NMSKey.snk differ


[03/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/NMSTestSupport.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/NMSTestSupport.cs b/src/test/csharp/NMSTestSupport.cs
new file mode 100644
index 0000000..39da8bb
--- /dev/null
+++ b/src/test/csharp/NMSTestSupport.cs
@@ -0,0 +1,651 @@
+/*
+ * 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.IO;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using System.Xml;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	/// <summary>
+	/// Useful class for test cases support.
+	/// </summary>
+	public class NMSTestSupport
+	{
+		protected TimeSpan receiveTimeout = TimeSpan.FromMilliseconds(15000);
+		protected int testRun;
+		protected int idCounter;
+
+        protected Type testClassType;
+		public Type TestClassType
+		{
+			get { return this.testClassType; }
+			set { this.testClassType = value; }
+		}
+
+		#region Constructors
+
+		public NMSTestSupport()
+		{
+		}
+
+		#endregion
+
+		#region Set up and tear down
+
+		public virtual void SetUp()
+		{
+			this.testRun++;
+		}
+
+		public virtual void TearDown()
+		{
+		}
+
+		#endregion
+
+		#region Configuration file
+
+		private XmlDocument configurationDocument = null;
+		/// <summary>
+		/// The configuration document.
+		/// </summary>
+		public XmlDocument ConfigurationDocument
+		{
+			get
+			{
+				if(this.configurationDocument == null)
+				{
+					this.configurationDocument = LoadConfigFile();
+					Assert.IsTrue(this.configurationDocument != null,
+						"Error loading configuration.");
+				}
+
+				return this.configurationDocument;
+			}
+		}
+
+		/// <summary>
+		/// Loads the configuration file.
+		/// </summary>
+		/// <returns>XmlDocument of the configuration file</returns>
+		public virtual XmlDocument LoadConfigFile()
+		{
+			return LoadConfigFile(GetConfigFilePath());
+		}
+
+		/// <summary>
+		/// Loads the configuration file.
+		/// </summary>
+		/// <param name="configFilePath">Configuration file path</param>
+		/// <returns>XmlDocument of the configuration file</returns>
+		public virtual XmlDocument LoadConfigFile(string configFilePath)
+		{
+			XmlDocument configDoc = new XmlDocument();
+
+			configDoc.Load(configFilePath);
+
+			return configDoc;
+		}
+
+		/// <summary>
+		/// Gets the path of the configuration filename.
+		/// </summary>
+		/// <returns>Path of the configuration filename</returns>
+		public virtual string GetConfigFilePath()
+		{
+			// The full path may be specified by an environment variable
+			string configFilePath = GetEnvVar(GetConfigEnvVarName(), "");
+			bool configFound = (!string.IsNullOrEmpty(configFilePath)
+				&& File.Exists(configFilePath));
+
+			// Else it may be found in well known locations
+			if(!configFound)
+			{
+				string[] paths = GetConfigSearchPaths();
+				string configFileName = GetDefaultConfigFileName();
+
+				foreach(string path in paths)
+				{
+					string fullpath = Path.Combine(path, configFileName);
+					Tracer.Debug("\tScanning folder: " + path);
+
+					if(File.Exists(fullpath))
+					{
+						Tracer.Debug("\tAssembly found!");
+						configFilePath = fullpath;
+						configFound = true;
+						break;
+					}
+				}
+			}
+
+			Tracer.Debug("\tConfig file: " + configFilePath);
+			Assert.IsTrue(configFound, "Connection configuration file does not exist.");
+			return configFilePath;
+		}
+
+		/// <summary>
+		/// Gets the environment variable name for the configuration file path.
+		/// </summary>
+		/// <returns>Environment variable name</returns>
+		public virtual string GetConfigEnvVarName()
+		{
+			return "NMSTESTCONFIGPATH";
+		}
+
+		/// <summary>
+		/// Gets the default name for the configuration filename.
+		/// </summary>
+		/// <returns>Default name of the configuration filename</returns>
+		public virtual string GetDefaultConfigFileName()
+		{
+			return "nmsprovider-test.config";
+		}
+
+		/// <summary>
+		/// Gets an array of paths where the configuration file sould be found.
+		/// </summary>
+		/// <returns>Array of paths</returns>
+		private static string[] GetConfigSearchPaths()
+		{
+			ArrayList pathList = new ArrayList();
+
+			// Check the current folder first.
+			pathList.Add("");
+#if !NETCF
+			AppDomain currentDomain = AppDomain.CurrentDomain;
+
+			// Check the folder the assembly is located in.
+			pathList.Add(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
+			if(null != currentDomain.BaseDirectory)
+			{
+				pathList.Add(currentDomain.BaseDirectory);
+			}
+
+			if(null != currentDomain.RelativeSearchPath)
+			{
+				pathList.Add(currentDomain.RelativeSearchPath);
+			}
+#endif
+
+			return (string[]) pathList.ToArray(typeof(string));
+		}
+
+		/// <summary>
+		/// Gets the value of the "value" attribute of the specified node.
+		/// </summary>
+		/// <param name="parentNode">Parent node</param>
+		/// <param name="nodeName">Node name</param>
+		/// <param name="defaultVaue">Default value</param>
+		/// <returns></returns>
+		public string GetNodeValueAttribute(XmlElement parentNode,
+			string nodeName, string defaultVaue)
+		{
+			XmlElement node = (XmlElement)parentNode.SelectSingleNode(nodeName);
+
+			return (node == null ? defaultVaue : node.GetAttribute("value"));
+		}
+
+		#endregion
+
+		#region URI node
+
+		/// <summary>
+		/// Gets the URI node for the default configuration.
+		/// </summary>
+		/// <returns>URI node for the default configuration name</returns>
+		public virtual XmlElement GetURINode()
+		{
+			return GetURINode(GetNameTestURI());
+		}
+
+		/// <summary>
+		/// Gets the URI node for the default configuration.
+		/// </summary>
+		/// <param name="nameTestURI">Name of the default configuration node
+		/// </param>
+		/// <returns>URI node for the default configuration name</returns>
+		public virtual XmlElement GetURINode(string nameTestURI)
+		{
+			return (XmlElement)ConfigurationDocument.SelectSingleNode(
+				String.Format("/configuration/{0}", nameTestURI));
+		}
+
+		/// <summary>
+		/// Gets the name of the default connection configuration to be loaded.
+		/// </summary>
+		/// <returns>Default configuration name</returns>
+		public virtual string GetNameTestURI()
+		{
+			return "testURI";
+		}
+
+		#endregion
+
+		#region Factory
+
+		private NMSConnectionFactory nmsFactory;
+		/// <summary>
+		/// The connection factory interface property.
+		/// </summary>
+		public IConnectionFactory Factory
+		{
+			get
+			{
+				if(this.nmsFactory == null)
+				{
+					this.nmsFactory = CreateNMSFactory();
+
+					Assert.IsNotNull(this.nmsFactory, "Error creating factory.");
+				}
+
+				return this.nmsFactory.ConnectionFactory;
+			}
+		}
+
+		/// <summary>
+		/// Create the NMS Factory that can create NMS Connections.
+		/// </summary>
+		/// <returns>Connection factory</returns>
+		public NMSConnectionFactory CreateNMSFactory()
+		{
+			return CreateNMSFactory(GetNameTestURI());
+		}
+
+		/// <summary>
+		/// Create the NMS Factory that can create NMS Connections. This
+		/// function loads the connection settings from the configuration file.
+		/// </summary>
+		/// <param name="nameTestURI">The named connection configuration.
+		/// </param>
+		/// <returns>Connection factory</returns>
+		public NMSConnectionFactory CreateNMSFactory(string nameTestURI)
+		{
+			XmlElement uriNode = GetURINode(nameTestURI);
+
+			Uri brokerUri = null;
+			object[] factoryParams = null;
+			if(uriNode != null)
+			{
+				// Replace any environment variables embedded inside the string.
+				brokerUri = new Uri(uriNode.GetAttribute("value"));
+				factoryParams = GetFactoryParams(uriNode);
+				clientId = GetNodeValueAttribute(uriNode, "clientId", "NMSTestClientId");
+				userName = GetNodeValueAttribute(uriNode, "userName", null);
+				passWord = GetNodeValueAttribute(uriNode, "passWord", null);
+			}
+
+			if(factoryParams == null)
+			{
+				this.nmsFactory = new Apache.NMS.NMSConnectionFactory(brokerUri);
+			}
+			else
+			{
+				this.nmsFactory = new Apache.NMS.NMSConnectionFactory(brokerUri, factoryParams);
+			}
+
+			return this.nmsFactory;
+		}
+
+		/// <summary>
+		/// Get the parameters for the ConnectionFactory from the configuration
+		/// file.
+		/// </summary>
+		/// <param name="uriNode">Parent node of the factoryParams node.</param>
+		/// <returns>Object array of parameter objects to be passsed to provider
+		/// factory object.  Null if no parameters are specified in
+		/// configuration file.</returns>
+		public object[] GetFactoryParams(XmlElement uriNode)
+		{
+			ArrayList factoryParams = new ArrayList();
+			XmlElement factoryParamsNode = (XmlElement)uriNode.SelectSingleNode("factoryParams");
+
+			if(factoryParamsNode != null)
+			{
+				XmlNodeList nodeList = factoryParamsNode.SelectNodes("param");
+
+				if(nodeList != null)
+				{
+					foreach(XmlElement paramNode in nodeList)
+					{
+						string paramType = paramNode.GetAttribute("type");
+						string paramValue = paramNode.GetAttribute("value");
+
+						switch(paramType)
+						{
+							case "string":
+								factoryParams.Add(paramValue);
+								break;
+
+							case "int":
+								factoryParams.Add(int.Parse(paramValue));
+								break;
+
+							// TODO: Add more parameter types
+						}
+					}
+				}
+			}
+
+			if(factoryParams.Count > 0)
+			{
+				return factoryParams.ToArray();
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region Environment variables
+
+		/// <summary>
+		/// Get environment variable value.
+		/// </summary>
+		/// <param name="varName"></param>
+		/// <param name="defaultValue"></param>
+		/// <returns></returns>
+		public static string GetEnvVar(string varName, string defaultValue)
+		{
+#if (PocketPC||NETCF||NETCF_2_0)
+            string varValue = null;
+#else
+			string varValue = Environment.GetEnvironmentVariable(varName);
+#endif
+			if(null == varValue)
+			{
+				varValue = defaultValue;
+			}
+
+			return varValue;
+		}
+
+		#endregion
+
+		#region Client id and connection
+
+		protected string clientId;
+		/// <summary>
+		/// Client id.
+		/// </summary>
+		public string ClientId
+		{
+			get { return this.clientId; }
+		}
+
+		/// <summary>
+		/// Gets a new client id.
+		/// </summary>
+		/// <returns>Client id</returns>
+		public virtual string GetTestClientId()
+		{
+			System.Text.StringBuilder id = new System.Text.StringBuilder();
+
+			id.Append("ID:");
+			id.Append(this.GetType().Name);
+			id.Append(":");
+			id.Append(this.testRun);
+			id.Append(":");
+			id.Append(++idCounter);
+
+			return id.ToString();
+		}
+
+		protected string userName;
+		/// <summary>
+		/// User name.
+		/// </summary>
+		public string UserName
+		{
+			get { return this.userName; }
+		}
+
+		protected string passWord;
+		/// <summary>
+		/// User pass word.
+		/// </summary>
+		public string PassWord
+		{
+			get { return this.passWord; }
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <returns>New connection</returns>
+		public virtual IConnection CreateConnection()
+		{
+			return CreateConnection(null);
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns>New connection</returns>
+		public virtual IConnection CreateConnection(string newClientId)
+		{
+			IConnection newConnection;
+
+			if(this.userName == null)
+			{
+				newConnection = Factory.CreateConnection();
+			}
+			else
+			{
+				newConnection = Factory.CreateConnection(userName, passWord);
+			}
+
+			Assert.IsNotNull(newConnection, "Connection not created");
+
+			if(newClientId != null)
+			{
+				newConnection.ClientId = newClientId;
+			}
+
+			return newConnection;
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker, and start it.
+		/// </summary>
+		/// <returns>Started connection</returns>
+		public virtual IConnection CreateConnectionAndStart()
+		{
+			return CreateConnectionAndStart(null);
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker, and start it.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns>Started connection</returns>
+		public virtual IConnection CreateConnectionAndStart(string newClientId)
+		{
+			IConnection newConnection = CreateConnection(newClientId);
+			newConnection.Start();
+			return newConnection;
+		}
+
+		#endregion
+
+		#region Destination
+
+		/// <summary>
+		/// Gets a clear destination.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination</returns>
+		public virtual IDestination GetClearDestination(ISession session,
+			DestinationType type, string destinationRef)
+		{
+			string uri = GetDestinationURI(type, destinationRef);
+
+			return GetClearDestination(session, uri);
+		}
+
+		/// <summary>
+		/// Gets a clear destination. This will try to delete an existing
+		/// destination and re-create it.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="destinationURI">Destination URI</param>
+		/// <returns>Clear destination</returns>
+		public virtual IDestination GetClearDestination(ISession session,
+			string destinationURI)
+		{
+			IDestination destination;
+
+			try
+			{
+				DeleteDestination(session, destinationURI);
+				destination = CreateDestination(session, destinationURI);
+			}
+			catch(Exception)
+			{
+				// Can't delete it, so lets try and purge it.
+				destination = SessionUtil.GetDestination(session, destinationURI);
+
+				using(IMessageConsumer consumer = session.CreateConsumer(destination))
+				{
+					while(consumer.Receive(TimeSpan.FromMilliseconds(750)) != null)
+					{
+					}
+				}
+			}
+
+			return destination;
+		}
+
+		/// <summary>
+		/// Deletes a destination.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="destinationURI">Destination URI</param>
+		protected virtual void DeleteDestination(ISession session,
+			string destinationURI)
+		{
+			// Only delete the destination if it can be recreated
+			// SessionUtil.DeleteDestination(session, destinationURI, DestinationType.Queue)
+			throw new NotSupportedException();
+		}
+
+		/// <summary>
+		/// Creates a destination.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="destinationURI">Destination URI</param>
+		protected virtual IDestination CreateDestination(ISession session,
+			string destinationURI)
+		{
+			throw new NotSupportedException();
+		}
+
+		/// <summary>
+		/// Gets an existing destination. Don't clear its contents.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination</returns>
+		public virtual IDestination GetDestination(ISession session,
+			DestinationType type, string destinationRef)
+		{
+			string uri = GetDestinationURI(type, destinationRef);
+
+			IDestination destination = SessionUtil.GetDestination(session, uri);
+
+			return destination;
+		}
+
+		/// <summary>
+		/// Gets a destination URI.
+		/// </summary>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination URI</returns>
+		public virtual string GetDestinationURI(
+			DestinationType type, string destinationRef)
+		{
+			string uri = null;
+
+			if(!string.IsNullOrEmpty(destinationRef))
+			{
+				XmlElement uriNode = GetURINode();
+
+				if(uriNode != null)
+				{
+					uri = GetNodeValueAttribute(uriNode, destinationRef, null);
+				}
+			}
+
+			if(string.IsNullOrEmpty(uri))
+			{
+				uri = NewDestinationURI(type);
+			}
+
+			return uri;
+		}
+
+		/// <summary>
+		/// Gets a new destination URI.
+		/// </summary>
+		/// <param name="type">Destination type</param>
+		/// <returns>Destination URI</returns>
+		public virtual string NewDestinationURI(DestinationType type)
+		{
+			string name = "TEST." + this.TestClassType.Name
+						+ "." + Guid.NewGuid().ToString();
+			string scheme;
+			switch(type)
+			{
+				case DestinationType.Queue:
+					scheme = "queue://";
+					break;
+
+				case DestinationType.Topic:
+					scheme = "topic://";
+					break;
+
+				case DestinationType.TemporaryQueue:
+					scheme = "temp-queue://";
+					break;
+
+				case DestinationType.TemporaryTopic:
+					scheme = "temp-topic://";
+					break;
+
+				default:
+					throw new ArgumentException("type: " + type);
+			}
+
+			return scheme + name;
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/NMSTracer.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/NMSTracer.cs b/src/test/csharp/NMSTracer.cs
new file mode 100644
index 0000000..1e254bd
--- /dev/null
+++ b/src/test/csharp/NMSTracer.cs
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+#define TRACE	// Force tracing to be enabled for this class
+
+namespace Apache.NMS.Test
+{
+	public class NMSTracer : Apache.NMS.ITrace
+	{
+		#region ITrace Members
+		public void Debug(string message)
+		{
+#if !NETCF
+			System.Diagnostics.Trace.WriteLine(string.Format("DEBUG: {0}", message));
+#endif
+		}
+
+		public void Error(string message)
+		{
+#if !NETCF
+			System.Diagnostics.Trace.WriteLine(string.Format("ERROR: {0}", message));
+#endif
+		}
+
+		public void Fatal(string message)
+		{
+#if !NETCF
+			System.Diagnostics.Trace.WriteLine(string.Format("FATAL: {0}", message));
+#endif
+		}
+
+		public void Info(string message)
+		{
+#if !NETCF
+			System.Diagnostics.Trace.WriteLine(string.Format("INFO: {0}", message));
+#endif
+		}
+
+		public void Warn(string message)
+		{
+#if !NETCF
+			System.Diagnostics.Trace.WriteLine(string.Format("WARN: {0}", message));
+#endif
+		}
+
+		public bool IsDebugEnabled
+		{
+			get { return true; }
+		}
+
+		public bool IsErrorEnabled
+		{
+			get { return true; }
+		}
+
+		public bool IsFatalEnabled
+		{
+			get { return true; }
+		}
+
+		public bool IsInfoEnabled
+		{
+			get { return true; }
+		}
+
+		public bool IsWarnEnabled
+		{
+			get { return true; }
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/PrimitiveMapTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/PrimitiveMapTest.cs b/src/test/csharp/PrimitiveMapTest.cs
new file mode 100644
index 0000000..f98322a
--- /dev/null
+++ b/src/test/csharp/PrimitiveMapTest.cs
@@ -0,0 +1,170 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	[TestFixture]
+	public class PrimitiveMapTest
+	{
+
+		bool a = true;
+		byte b = 123;
+		char c = 'c';
+		short d = 0x1234;
+		int e = 0x12345678;
+		long f = 0x1234567812345678;
+		string g = "Hello World!";
+		bool h = false;
+		byte i = 0xFF;
+		short j = -0x1234;
+		int k = -0x12345678;
+		long l = -0x1234567812345678;
+		IList m = CreateList();
+		IDictionary n = CreateDictionary();
+
+		[Test]
+		public void TestNotMarshalled()
+		{
+			PrimitiveMap map = CreatePrimitiveMap();
+			AssertPrimitiveMap(map);
+		}
+
+		[Test]
+		public void TestMarshalled()
+		{
+			PrimitiveMap map = CreatePrimitiveMap();
+			byte[] data = map.Marshal();
+			map = PrimitiveMap.Unmarshal(data);
+			AssertPrimitiveMap(map);
+		}
+
+		[Test]
+		public void TestMarshalledWithBigString()
+		{
+			PrimitiveMap map = CreatePrimitiveMap();
+			String test = new String('a', 65538);
+			map.SetString("BIG_STRING", test);
+			byte[] data = map.Marshal();
+			map = PrimitiveMap.Unmarshal(data);
+			AssertPrimitiveMap(map);
+			Assert.AreEqual(test, map.GetString("BIG_STRING"));
+		}
+
+		protected PrimitiveMap CreatePrimitiveMap()
+		{
+			PrimitiveMap map = new PrimitiveMap();
+
+			map["a"] = a;
+			map["b"] = b;
+			map["c"] = c;
+			map["d"] = d;
+			map["e"] = e;
+			map["f"] = f;
+			map["g"] = g;
+			map["h"] = h;
+			map["i"] = i;
+			map["j"] = j;
+			map["k"] = k;
+			map["l"] = l;
+			map["m"] = m;
+			map["n"] = n;
+
+			return map;
+		}
+
+		protected void AssertPrimitiveMap(PrimitiveMap map)
+		{
+			// use generic API to access entries
+			Assert.AreEqual(a, map["a"], "generic map entry: a");
+			Assert.AreEqual(b, map["b"], "generic map entry: b");
+			Assert.AreEqual(c, map["c"], "generic map entry: c");
+			Assert.AreEqual(d, map["d"], "generic map entry: d");
+			Assert.AreEqual(e, map["e"], "generic map entry: e");
+			Assert.AreEqual(f, map["f"], "generic map entry: f");
+			Assert.AreEqual(g, map["g"], "generic map entry: g");
+			Assert.AreEqual(h, map["h"], "generic map entry: h");
+			Assert.AreEqual(i, map["i"], "generic map entry: i");
+			Assert.AreEqual(j, map["j"], "generic map entry: j");
+			Assert.AreEqual(k, map["k"], "generic map entry: k");
+			Assert.AreEqual(l, map["l"], "generic map entry: l");
+			//Assert.AreEqual(m, map["m"], "generic map entry: m");
+			//Assert.AreEqual(n, map["n"], "generic map entry: n");
+
+			// use type safe APIs
+			Assert.AreEqual(a, map.GetBool("a"), "map entry: a");
+			Assert.AreEqual(b, map.GetByte("b"), "map entry: b");
+			Assert.AreEqual(c, map.GetChar("c"), "map entry: c");
+			Assert.AreEqual(d, map.GetShort("d"), "map entry: d");
+			Assert.AreEqual(e, map.GetInt("e"), "map entry: e");
+			Assert.AreEqual(f, map.GetLong("f"), "map entry: f");
+			Assert.AreEqual(g, map.GetString("g"), "map entry: g");
+			Assert.AreEqual(h, map.GetBool("h"), "map entry: h");
+			Assert.AreEqual(i, map.GetByte("i"), "map entry: i");
+			Assert.AreEqual(j, map.GetShort("j"), "map entry: j");
+			Assert.AreEqual(k, map.GetInt("k"), "map entry: k");
+			Assert.AreEqual(l, map.GetLong("l"), "map entry: l");
+			//Assert.AreEqual(m, map.GetList("m"), "map entry: m");
+			//Assert.AreEqual(n, map.GetDictionary("n"), "map entry: n");
+
+			IList list = map.GetList("m");
+			Assert.AreEqual(2, list.Count, "list size");
+			Assert.IsTrue(list.Contains("Item1"));
+			Assert.IsTrue(list.Contains("Item2"));
+
+			IDictionary dictionary = map.GetDictionary("n");
+			Assert.AreEqual(5, dictionary.Count, "dictionary size");
+
+			IDictionary childMap = (IDictionary) dictionary["childMap"];
+			Assert.IsNotNull(childMap);
+			Assert.AreEqual("childMap", childMap["name"], "childMap[name]");
+
+			IList childList = (IList) dictionary["childList"];
+			Assert.IsNotNull(childList);
+			Assert.IsTrue(childList.Contains("childListElement1"));
+		}
+
+		protected static IList CreateList()
+		{
+			ArrayList answer = new ArrayList();
+			answer.Add("Item1");
+			answer.Add("Item2");
+			return answer;
+		}
+
+		protected static IDictionary CreateDictionary()
+		{
+			Hashtable answer = new Hashtable();
+			answer.Add("Name", "James");
+			answer.Add("Location", "London");
+			answer.Add("Company", "LogicBlaze");
+
+			Hashtable childMap = new Hashtable();
+			childMap.Add("name", "childMap");
+			answer.Add("childMap", childMap);
+
+			ArrayList childList = new ArrayList();
+			childList.Add("childListElement1");
+			answer.Add("childList", childList);
+			return answer;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/ProducerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/ProducerTest.cs b/src/test/csharp/ProducerTest.cs
new file mode 100644
index 0000000..4cb30ac
--- /dev/null
+++ b/src/test/csharp/ProducerTest.cs
@@ -0,0 +1,113 @@
+/*
+ * 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 NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class ProducerTest : NMSTest
+	{
+		protected ProducerTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+        //[Test]
+        public virtual void TestProducerSendToNullDestinationWithoutDefault()
+        {
+            using(IConnection connection = CreateConnection(GetTestClientId()))
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession())
+                {
+                    IMessageProducer producer = session.CreateProducer(null);
+
+                    try
+                    {
+                        producer.Send(null, session.CreateTextMessage("Message"));
+                        Assert.Fail("Producer should have thrown an NotSupportedException");
+                    }
+                    catch(NotSupportedException)
+                    {
+                    }
+                    catch(Exception ex)
+                    {
+                        Assert.Fail("Wrong Exception Type Thrown: " + ex.GetType().Name);
+                    }
+                }
+            }
+        }
+
+        //[Test]
+        public virtual void TestProducerSendToNullDestinationWithDefault()
+        {
+            using(IConnection connection = CreateConnection(GetTestClientId()))
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession())
+                {
+                    IDestination unusedDest = session.CreateTemporaryQueue();
+
+                    IMessageProducer producer = session.CreateProducer(unusedDest);
+
+                    try
+                    {
+                        producer.Send(null, session.CreateTextMessage("Message"));
+                        Assert.Fail("Producer should have thrown an InvalidDestinationException");
+                    }
+                    catch(InvalidDestinationException)
+                    {
+                    }
+                    catch(Exception ex)
+                    {
+                        Assert.Fail("Wrong Exception Type Thrown: " + ex.GetType().Name);
+                    }
+                }
+            }
+        }
+
+		//[Test]
+		public virtual void TestProducerSendToNonDefaultDestination()
+		{
+            using(IConnection connection = CreateConnection(GetTestClientId()))
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession())
+                {
+					IDestination unusedDest = session.CreateTemporaryQueue();
+					IDestination usedDest = session.CreateTemporaryQueue();
+
+					IMessageProducer producer = session.CreateProducer(unusedDest);
+
+                    try
+                    {
+					    producer.Send(usedDest, session.CreateTextMessage("Message"));
+                        Assert.Fail("Producer should have thrown an NotSupportedException");
+                    }
+                    catch(NotSupportedException)
+                    {
+                    }
+                    catch(Exception ex)
+                    {
+                        Assert.Fail("Wrong Exception Type Thrown: " + ex.GetType().Name);
+                    }
+				}
+			}
+        }
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/RedeliveryPolicyTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/RedeliveryPolicyTest.cs b/src/test/csharp/RedeliveryPolicyTest.cs
new file mode 100644
index 0000000..d11a6fb
--- /dev/null
+++ b/src/test/csharp/RedeliveryPolicyTest.cs
@@ -0,0 +1,135 @@
+\ufeff/*
+ * 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 Apache.NMS.Policies;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+    [TestFixture]
+    public class RedeliveryPolicyTest
+    {
+        [Test]
+        public void Executes_redelivery_policy_with_backoff_enabled_correctly()
+        {
+            RedeliveryPolicy policy = new RedeliveryPolicy();
+
+            policy.BackOffMultiplier = 2;
+            policy.InitialRedeliveryDelay = 5;
+            policy.UseExponentialBackOff = true;
+
+            // simulate a retry of 10 times
+            Assert.IsTrue(policy.RedeliveryDelay(0) == 0, "redelivery delay not 5 is " + policy.RedeliveryDelay(0));
+            Assert.IsTrue(policy.RedeliveryDelay(1) == 5, "redelivery delay not 10 is " + policy.RedeliveryDelay(1));
+            Assert.IsTrue(policy.RedeliveryDelay(2) == 10, "redelivery delay not 20 is " + policy.RedeliveryDelay(2));
+            Assert.IsTrue(policy.RedeliveryDelay(3) == 20, "redelivery delay not 40 is " + policy.RedeliveryDelay(3));
+            Assert.IsTrue(policy.RedeliveryDelay(4) == 40, "redelivery delay not 80 is " + policy.RedeliveryDelay(4));
+            Assert.IsTrue(policy.RedeliveryDelay(5) == 80, "redelivery delay not 160 is " + policy.RedeliveryDelay(5));
+            Assert.IsTrue(policy.RedeliveryDelay(6) == 160, "redelivery delay not 320 is " + policy.RedeliveryDelay(6));
+            Assert.IsTrue(policy.RedeliveryDelay(7) == 320, "redelivery delay not 640 is " + policy.RedeliveryDelay(7));
+            Assert.IsTrue(policy.RedeliveryDelay(8) == 640, "redelivery delay not 1280 is " + policy.RedeliveryDelay(8));
+            Assert.IsTrue(policy.RedeliveryDelay(9) == 1280, "redelivery delay not 2560 is " + policy.RedeliveryDelay(9));
+        }
+
+        [Test]
+        public void Executes_redelivery_policy_with_backoff_of_3_enabled_correctly()
+        {
+            RedeliveryPolicy policy = new RedeliveryPolicy();
+
+            policy.BackOffMultiplier = 3;
+            policy.InitialRedeliveryDelay = 3;
+            policy.UseExponentialBackOff = true;
+
+            // simulate a retry of 10 times
+            Assert.IsTrue(policy.RedeliveryDelay(0) == 0, "redelivery delay not 5 is " + policy.RedeliveryDelay(0));
+            Assert.IsTrue(policy.RedeliveryDelay(1) == 3, "redelivery delay not 10 is " + policy.RedeliveryDelay(1));
+            Assert.IsTrue(policy.RedeliveryDelay(2) == 9, "redelivery delay not 20 is " + policy.RedeliveryDelay(2));
+            Assert.IsTrue(policy.RedeliveryDelay(3) == 27, "redelivery delay not 40 is " + policy.RedeliveryDelay(3));
+            Assert.IsTrue(policy.RedeliveryDelay(4) == 81, "redelivery delay not 80 is " + policy.RedeliveryDelay(4));
+            Assert.IsTrue(policy.RedeliveryDelay(5) == 243, "redelivery delay not 160 is " + policy.RedeliveryDelay(5));
+            Assert.IsTrue(policy.RedeliveryDelay(6) == 729, "redelivery delay not 320 is " + policy.RedeliveryDelay(6));
+            Assert.IsTrue(policy.RedeliveryDelay(7) == 2187, "redelivery delay not 640 is " + policy.RedeliveryDelay(7));
+            Assert.IsTrue(policy.RedeliveryDelay(8) == 6561, "redelivery delay not 1280 is " + policy.RedeliveryDelay(8));
+            Assert.IsTrue(policy.RedeliveryDelay(9) == 19683, "redelivery delay not 2560 is " + policy.RedeliveryDelay(9));
+        }
+
+        [Test]
+        public void Executes_redelivery_policy_without_backoff_enabled_correctly()
+        {
+            RedeliveryPolicy policy = new RedeliveryPolicy();
+
+            policy.InitialRedeliveryDelay = 5;
+
+            // simulate a retry of 10 times
+            Assert.IsTrue(policy.RedeliveryDelay(0) == 0, "redelivery delay not 0 is " + policy.RedeliveryDelay(0));
+            Assert.IsTrue(policy.RedeliveryDelay(1) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(1));
+            Assert.IsTrue(policy.RedeliveryDelay(2) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(2));
+            Assert.IsTrue(policy.RedeliveryDelay(3) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(3));
+            Assert.IsTrue(policy.RedeliveryDelay(4) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(4));
+            Assert.IsTrue(policy.RedeliveryDelay(5) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(5));
+            Assert.IsTrue(policy.RedeliveryDelay(6) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(6));
+            Assert.IsTrue(policy.RedeliveryDelay(7) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(7));
+            Assert.IsTrue(policy.RedeliveryDelay(8) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(8));
+            Assert.IsTrue(policy.RedeliveryDelay(9) == 5, "redelivery delay not 5 is " + policy.RedeliveryDelay(9));
+        }
+
+        [Test]
+        public void Should_get_collision_percent_correctly()
+        {
+            RedeliveryPolicy policy = new RedeliveryPolicy();
+
+            policy.CollisionAvoidancePercent = 45;
+
+            Assert.IsTrue(policy.CollisionAvoidancePercent == 45);
+        }
+
+        [Test]
+        public void Executes_redelivery_policy_with_collision_enabled_correctly()
+        {
+            RedeliveryPolicy policy = new RedeliveryPolicy();
+
+            policy.BackOffMultiplier = 2;
+            policy.InitialRedeliveryDelay = 5;
+            policy.UseExponentialBackOff = true;
+            policy.UseCollisionAvoidance = true;
+            policy.CollisionAvoidancePercent = 10;
+
+            // simulate a retry of 10 times
+            int delay = policy.RedeliveryDelay(0);
+            Assert.IsTrue(delay == 0, "not zero is " + policy.RedeliveryDelay(0));
+            delay = policy.RedeliveryDelay(1);
+            Assert.IsTrue(delay >= 4.5 && delay <= 5.5, "not delay >= 4.5 && delay <= 5.5 is " + policy.RedeliveryDelay(1));
+            delay = policy.RedeliveryDelay(2);
+            Assert.IsTrue(delay >= 9 && delay <= 11, "not delay >= 9 && delay <= 11 is " + policy.RedeliveryDelay(2));
+            delay = policy.RedeliveryDelay(3);
+            Assert.IsTrue(delay >= 18 && delay <= 22, "not delay >= 18 && delay <= 22 is " + policy.RedeliveryDelay(3));
+            delay = policy.RedeliveryDelay(4);
+            Assert.IsTrue(delay >= 36 && delay <= 44, "not delay >= 36 && delay <= 44 is " + policy.RedeliveryDelay(4));
+            delay = policy.RedeliveryDelay(5);
+            Assert.IsTrue(delay >= 72 && delay <= 88, "not delay >= 72 && delay <= 88 is " + policy.RedeliveryDelay(5));
+            delay = policy.RedeliveryDelay(6);
+            Assert.IsTrue(delay >= 144 && delay <= 176, "not delay >= 144 && delay <= 176 is " + policy.RedeliveryDelay(6));
+            delay = policy.RedeliveryDelay(7);
+            Assert.IsTrue(delay >= 288 && delay <= 352, "not delay >= 288 && delay <= 352 is " + policy.RedeliveryDelay(7));
+            delay = policy.RedeliveryDelay(8);
+            Assert.IsTrue(delay >= 576 && delay <= 704, "not delay >= 576 && delay <= 704 is " + policy.RedeliveryDelay(8));
+            delay = policy.RedeliveryDelay(9);
+            Assert.IsTrue(delay >= 1152 && delay <= 1408, "not delay >= 1152 && delay <= 1408 is " + policy.RedeliveryDelay(9));
+            delay = policy.RedeliveryDelay(10);
+            Assert.IsTrue(delay >= 2304 && delay <= 2816, "not delay >= 2304 && delay <= 2816 is " + policy.RedeliveryDelay(10));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/RequestResponseTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/RequestResponseTest.cs b/src/test/csharp/RequestResponseTest.cs
new file mode 100644
index 0000000..1c1ca41
--- /dev/null
+++ b/src/test/csharp/RequestResponseTest.cs
@@ -0,0 +1,74 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class RequestResponseTest : NMSTest
+	{
+		protected RequestResponseTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		//[Category("RequestResponse")]		
+		public virtual void TestRequestResponseMessaging(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					ITemporaryQueue replyTo = session.CreateTemporaryQueue();
+
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						IMessage request = session.CreateMessage();
+						
+						request.NMSReplyTo = replyTo;
+						
+						producer.Send(request);
+						
+						request = consumer.Receive(TimeSpan.FromMilliseconds(3000));
+						Assert.IsNotNull(request);
+						Assert.IsNotNull(request.NMSReplyTo);
+						
+						using(IMessageProducer responder = session.CreateProducer(request.NMSReplyTo))
+						{
+							IMessage response = session.CreateTextMessage("RESPONSE");							
+							responder.Send(response);
+						}						
+					}
+					
+					using(IMessageConsumer consumer = session.CreateConsumer(replyTo))
+					{
+						ITextMessage response = consumer.Receive(TimeSpan.FromMilliseconds(3000)) as ITextMessage;
+						Assert.IsNotNull(response);
+						Assert.AreEqual("RESPONSE", response.Text);
+					}
+				}
+			}
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/StreamMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/StreamMessageTest.cs b/src/test/csharp/StreamMessageTest.cs
new file mode 100644
index 0000000..d2c6d87
--- /dev/null
+++ b/src/test/csharp/StreamMessageTest.cs
@@ -0,0 +1,111 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class StreamMessageTest : NMSTest
+	{
+		protected bool a = true;
+		protected byte b = 123;
+		protected char c = 'c';
+		protected short d = 0x1234;
+		protected int e = 0x12345678;
+		protected long f = 0x1234567812345678;
+		protected string g = "Hello World!";
+		protected bool h = false;
+		protected byte i = 0xFF;
+		protected short j = -0x1234;
+		protected int k = -0x12345678;
+		protected long l = -0x1234567812345678;
+		protected float m = 2.1F;
+		protected double n = 2.3;
+
+		protected StreamMessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveStreamMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						IStreamMessage request;
+
+						try
+						{
+							request = session.CreateStreamMessage();
+						}
+						catch(System.NotSupportedException)
+						{
+							return;
+						}
+
+						request.WriteBoolean(a);
+						request.WriteByte(b);
+						request.WriteChar(c);
+						request.WriteInt16(d);
+						request.WriteInt32(e);
+						request.WriteInt64(f);
+						request.WriteString(g);
+						request.WriteBoolean(h);
+						request.WriteByte(i);
+						request.WriteInt16(j);
+						request.WriteInt32(k);
+						request.WriteInt64(l);
+						request.WriteSingle(m);
+						request.WriteDouble(n);
+						producer.Send(request);
+
+						IStreamMessage message = consumer.Receive(receiveTimeout) as IStreamMessage;
+						Assert.IsNotNull(message, "No message returned!");
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+						// use generic API to access entries
+						Assert.AreEqual(a, message.ReadBoolean(), "Stream Boolean Value: a");
+						Assert.AreEqual(b, message.ReadByte(), "Stream Byte Value: b");
+						Assert.AreEqual(c, message.ReadChar(), "Stream Char Value: c");
+						Assert.AreEqual(d, message.ReadInt16(), "Stream Int16 Value: d");
+						Assert.AreEqual(e, message.ReadInt32(), "Stream Int32 Value: e");
+						Assert.AreEqual(f, message.ReadInt64(), "Stream Int64 Value: f");
+						Assert.AreEqual(g, message.ReadString(), "Stream String Value: g");
+						Assert.AreEqual(h, message.ReadBoolean(), "Stream Boolean Value: h");
+						Assert.AreEqual(i, message.ReadByte(), "Stream Byte Value: i");
+						Assert.AreEqual(j, message.ReadInt16(), "Stream Int16 Value: j");
+						Assert.AreEqual(k, message.ReadInt32(), "Stream Int32 Value: k");
+						Assert.AreEqual(l, message.ReadInt64(), "Stream Int64 Value: l");
+						Assert.AreEqual(m, message.ReadSingle(), "Stream Single Value: m");
+						Assert.AreEqual(n, message.ReadDouble(), "Stream Double Value: n");
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/TempDestinationDeletionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/TempDestinationDeletionTest.cs b/src/test/csharp/TempDestinationDeletionTest.cs
new file mode 100644
index 0000000..6c96d74
--- /dev/null
+++ b/src/test/csharp/TempDestinationDeletionTest.cs
@@ -0,0 +1,80 @@
+\ufeff/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class TempDestinationDeletionTest : NMSTest
+	{
+		protected TempDestinationDeletionTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestTempDestinationDeletion(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			//[Values(QUEUE_DESTINATION_NAME, TOPIC_DESTINATION_NAME, TEMP_QUEUE_DESTINATION_NAME, TEMP_TOPIC_DESTINATION_NAME)]
+			string testDestinationURI)
+		{
+			using(IConnection connection1 = CreateConnection(GetTestClientId()))
+			{
+				connection1.Start();
+				using(ISession session = connection1.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					const int MaxNumDestinations = 100;
+
+					for(int index = 1; index <= MaxNumDestinations; index++)
+					{
+						IDestination destination = GetClearDestination(session, testDestinationURI);
+
+						using(IMessageProducer producer = session.CreateProducer(destination))
+						using(IMessageConsumer consumer = session.CreateConsumer(destination))
+						{
+							producer.DeliveryMode = deliveryMode;
+
+							IMessage request = session.CreateTextMessage("Hello World, Just Passing Through!");
+
+							request.NMSType = "TEMP_MSG";
+							producer.Send(request);
+							IMessage receivedMsg = consumer.Receive(TimeSpan.FromMilliseconds(5000));
+							Assert.IsNotNull(receivedMsg);
+							Assert.AreEqual(receivedMsg.NMSType, "TEMP_MSG");
+							
+							// Ensures that Consumer closes out its subscription
+							consumer.Close();
+						}
+
+						try
+						{
+							session.DeleteDestination(destination);
+						}
+						catch(NotSupportedException)
+						{
+							// Might as well not try this again.
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/TempDestinationTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/TempDestinationTest.cs b/src/test/csharp/TempDestinationTest.cs
new file mode 100644
index 0000000..f773698
--- /dev/null
+++ b/src/test/csharp/TempDestinationTest.cs
@@ -0,0 +1,175 @@
+/*
+ * 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 NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+    //[TestFixture]
+    public class TempDestinationTest : NMSTest
+    {
+        private IConnection connection;
+        private IList connections = ArrayList.Synchronized(new ArrayList());
+
+		protected TempDestinationTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+        //[SetUp]
+        public override void SetUp()
+        {
+            base.SetUp();
+
+            this.connection = CreateConnection();
+            this.connections.Add(connection);
+        }
+
+        //[TearDown]
+        public override void TearDown()
+        {
+            foreach(IConnection conn in this.connections)
+            {
+                try
+                {
+                    conn.Close();
+                }
+                catch
+                {
+                }
+            }
+
+            connections.Clear();
+
+            base.TearDown();
+        }
+
+        //[Test]
+        public virtual void TestTempDestOnlyConsumedByLocalConn()
+        {
+            connection.Start();
+
+            ISession tempSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+            ITemporaryQueue queue = tempSession.CreateTemporaryQueue();
+            IMessageProducer producer = tempSession.CreateProducer(queue);
+            producer.DeliveryMode = (MsgDeliveryMode.NonPersistent);
+            ITextMessage message = tempSession.CreateTextMessage("First");
+            producer.Send(message);
+
+            // temp destination should not be consume when using another connection
+            IConnection otherConnection = CreateConnection();
+            connections.Add(otherConnection);
+            ISession otherSession = otherConnection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+            ITemporaryQueue otherQueue = otherSession.CreateTemporaryQueue();
+            IMessageConsumer consumer = otherSession.CreateConsumer(otherQueue);
+            IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(3000));
+            Assert.IsNull(msg);
+
+            // should be able to consume temp destination from the same connection
+            consumer = tempSession.CreateConsumer(queue);
+            msg = consumer.Receive(TimeSpan.FromMilliseconds(3000));
+            Assert.IsNotNull(msg);
+        }
+
+        //[Test]
+        public virtual void TestTempQueueHoldsMessagesWithConsumers()
+        {
+            ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+            ITemporaryQueue queue = session.CreateTemporaryQueue();
+            IMessageConsumer consumer = session.CreateConsumer(queue);
+            connection.Start();
+
+            IMessageProducer producer = session.CreateProducer(queue);
+            producer.DeliveryMode = (MsgDeliveryMode.NonPersistent);
+            ITextMessage message = session.CreateTextMessage("Hello");
+            producer.Send(message);
+
+            IMessage message2 = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+            Assert.IsNotNull(message2);
+            Assert.IsTrue(message2 is ITextMessage, "Expected message to be a ITextMessage");
+            Assert.IsTrue(((ITextMessage)message2).Text == message.Text, "Expected message to be a '" + message.Text + "'");
+        }
+
+        //[Test]
+        public virtual void TestTempQueueHoldsMessagesWithoutConsumers()
+        {
+            ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+            ITemporaryQueue queue = session.CreateTemporaryQueue();
+            IMessageProducer producer = session.CreateProducer(queue);
+            producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
+            ITextMessage message = session.CreateTextMessage("Hello");
+            producer.Send(message);
+
+            connection.Start();
+            IMessageConsumer consumer = session.CreateConsumer(queue);
+            IMessage message2 = consumer.Receive(TimeSpan.FromMilliseconds(3000));
+            Assert.IsNotNull(message2);
+            Assert.IsTrue(message2 is ITextMessage, "Expected message to be a ITextMessage");
+            Assert.IsTrue(((ITextMessage)message2).Text == message.Text, "Expected message to be a '" + message.Text + "'");
+        }
+
+        //[Test]
+        public virtual void TestTmpQueueWorksUnderLoad()
+        {
+            int count = 500;
+            int dataSize = 1024;
+
+            ArrayList list = new ArrayList(count);
+            ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+            ITemporaryQueue queue = session.CreateTemporaryQueue();
+            IBytesMessage message;
+            IBytesMessage message2;
+            IMessageProducer producer = session.CreateProducer(queue);
+            producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
+
+            byte[] srcdata = new byte[dataSize];
+            srcdata[0] = (byte) 'B';
+            srcdata[1] = (byte) 'A';
+            srcdata[2] = (byte) 'D';
+            srcdata[3] = (byte) 'W';
+            srcdata[4] = (byte) 'O';
+            srcdata[5] = (byte) 'L';
+            srcdata[6] = (byte) 'F';
+            for(int i = 0; i < count; i++)
+            {
+                message = session.CreateBytesMessage();
+                message.WriteBytes(srcdata);
+                message.Properties.SetInt("c", i);
+                producer.Send(message);
+                list.Add(message);
+            }
+
+            connection.Start();
+            byte[] data = new byte[dataSize];
+            byte[] data2 = new byte[dataSize];
+            IMessageConsumer consumer = session.CreateConsumer(queue);
+            for(int i = 0; i < count; i++)
+            {
+                message2 = consumer.Receive(TimeSpan.FromMilliseconds(2000)) as IBytesMessage;
+                Assert.IsNotNull(message2);
+                Assert.AreEqual(i, message2.Properties.GetInt("c"));
+                message = list[i] as IBytesMessage;
+                Assert.IsNotNull(message);
+				message.Reset();
+                message.ReadBytes(data);
+                message2.ReadBytes(data2);
+                Assert.AreEqual(data, data2);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/TextMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/TextMessageTest.cs b/src/test/csharp/TextMessageTest.cs
new file mode 100644
index 0000000..8db26aa
--- /dev/null
+++ b/src/test/csharp/TextMessageTest.cs
@@ -0,0 +1,71 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class TextMessageTest : NMSTest
+	{
+		protected TextMessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveTextMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						IMessage request = session.CreateTextMessage("Hello World!");
+						producer.Send(request);
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(request, message);
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+					}
+				}
+			}
+		}
+
+		/// <summary>
+		/// Assert that two messages are ITextMessages and their text bodies are equal.
+		/// </summary>
+		/// <param name="expected"></param>
+		/// <param name="actual"></param>
+		protected void AssertTextMessageEqual(IMessage expected, IMessage actual)
+		{
+			ITextMessage expectedTextMsg = expected as ITextMessage;
+			Assert.IsNotNull(expectedTextMsg, "'expected' message not a text message");
+			ITextMessage actualTextMsg = actual as ITextMessage;
+			Assert.IsNotNull(actualTextMsg, "'actual' message not a text message");
+			Assert.AreEqual(expectedTextMsg.Text, actualTextMsg.Text, "Text message does not match.");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/TransactionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/TransactionTest.cs b/src/test/csharp/TransactionTest.cs
new file mode 100644
index 0000000..7c13827
--- /dev/null
+++ b/src/test/csharp/TransactionTest.cs
@@ -0,0 +1,439 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class TransactionTest : NMSTest
+	{
+		protected TransactionTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestSendRollback(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.Transactional))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage firstMsgSend = session.CreateTextMessage("First Message");
+						producer.Send(firstMsgSend);
+						session.Commit();
+
+						ITextMessage rollbackMsg = session.CreateTextMessage("I'm going to get rolled back.");
+						producer.Send(rollbackMsg);
+						session.Rollback();
+
+						ITextMessage secondMsgSend = session.CreateTextMessage("Second Message");
+						producer.Send(secondMsgSend);
+						session.Commit();
+
+						// Receive the messages
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+
+						message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, message, "Second message does not match.");
+
+						// validates that the rollback was not consumed
+						session.Commit();
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestSendSessionClose(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			ITextMessage firstMsgSend;
+			ITextMessage secondMsgSend;
+
+			using(IConnection connection1 = CreateConnection(GetTestClientId()))
+			{
+				connection1.Start();
+				using(ISession session1 = connection1.CreateSession(AcknowledgementMode.Transactional))
+				{
+					IDestination destination1 = GetClearDestination(session1, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session1.CreateConsumer(destination1))
+					{
+						// First connection session that sends one message, and the
+						// second message is implicitly rolled back as the session is
+						// disposed before Commit() can be called.
+						using(IConnection connection2 = CreateConnection(GetTestClientId()))
+						{
+							connection2.Start();
+							using(ISession session2 = connection2.CreateSession(AcknowledgementMode.Transactional))
+							{
+								IDestination destination2 = GetClearDestination(session2, DestinationType.Queue, testQueueRef);
+								using(IMessageProducer producer = session2.CreateProducer(destination2))
+								{
+									producer.DeliveryMode = deliveryMode;
+									firstMsgSend = session2.CreateTextMessage("First Message");
+									producer.Send(firstMsgSend);
+									session2.Commit();
+
+									ITextMessage rollbackMsg = session2.CreateTextMessage("I'm going to get rolled back.");
+									producer.Send(rollbackMsg);
+								}
+							}
+						}
+
+						// Second connection session that will send one message.
+						using(IConnection connection2 = CreateConnection(GetTestClientId()))
+						{
+							connection2.Start();
+							using(ISession session2 = connection2.CreateSession(AcknowledgementMode.Transactional))
+							{
+								IDestination destination2 = GetClearDestination(session2, DestinationType.Queue, testQueueRef);
+								using(IMessageProducer producer = session2.CreateProducer(destination2))
+								{
+									producer.DeliveryMode = deliveryMode;
+									secondMsgSend = session2.CreateTextMessage("Second Message");
+									producer.Send(secondMsgSend);
+									session2.Commit();
+								}
+							}
+						}
+
+						// Check the consumer to verify which messages were actually received.
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+
+						message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, message, "Second message does not match.");
+
+						// validates that the rollback was not consumed
+						session1.Commit();
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestReceiveRollback(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.Transactional))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						// Send both messages
+						ITextMessage firstMsgSend = session.CreateTextMessage("First Message");
+						producer.Send(firstMsgSend);
+						ITextMessage secondMsgSend = session.CreateTextMessage("Second Message");
+						producer.Send(secondMsgSend);
+						session.Commit();
+
+						// Receive the messages
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+						session.Commit();
+
+						message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, message, "Second message does not match.");
+
+						// Rollback so we can get that last message again.
+						session.Rollback();
+						IMessage rollbackMsg = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, rollbackMsg, "Rollback message does not match.");
+						session.Commit();
+					}
+				}
+			}
+		}
+
+
+		//[Test]
+		public virtual void TestReceiveTwoThenRollback(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.Transactional))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						// Send both messages
+						ITextMessage firstMsgSend = session.CreateTextMessage("First Message");
+						producer.Send(firstMsgSend);
+						ITextMessage secondMsgSend = session.CreateTextMessage("Second Message");
+						producer.Send(secondMsgSend);
+						session.Commit();
+
+						// Receive the messages
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+						message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, message, "Second message does not match.");
+
+						// Rollback so we can get that last two messages again.
+						session.Rollback();
+						IMessage rollbackMsg = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, rollbackMsg, "First rollback message does not match.");
+						rollbackMsg = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(secondMsgSend, rollbackMsg, "Second rollback message does not match.");
+
+						Assert.IsNull(consumer.ReceiveNoWait());
+						session.Commit();
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestSendCommitNonTransaction(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage firstMsgSend = session.CreateTextMessage("SendCommitNonTransaction Message");
+						producer.Send(firstMsgSend);
+						try
+						{
+							session.Commit();
+							Assert.Fail("Should have thrown an InvalidOperationException.");
+						}
+						catch(InvalidOperationException)
+						{
+						}
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestReceiveCommitNonTransaction(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage firstMsgSend = session.CreateTextMessage("ReceiveCommitNonTransaction Message");
+						producer.Send(firstMsgSend);
+
+						// Receive the messages
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+						if(AcknowledgementMode.ClientAcknowledge == ackMode)
+						{
+							message.Acknowledge();
+						}
+
+						try
+						{
+							session.Commit();
+							Assert.Fail("Should have thrown an InvalidOperationException.");
+						}
+						catch(InvalidOperationException)
+						{
+						}
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestReceiveRollbackNonTransaction(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage firstMsgSend = session.CreateTextMessage("ReceiveCommitNonTransaction Message");
+						producer.Send(firstMsgSend);
+
+						// Receive the messages
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						AssertTextMessageEqual(firstMsgSend, message, "First message does not match.");
+						if(AcknowledgementMode.ClientAcknowledge == ackMode)
+						{
+							message.Acknowledge();
+						}
+
+						try
+						{
+							session.Rollback();
+							Assert.Fail("Should have thrown an InvalidOperationException.");
+						}
+						catch(InvalidOperationException)
+						{
+						}
+					}
+				}
+			}
+		}
+
+		/// <summary>
+		/// Assert that two messages are ITextMessages and their text bodies are equal.
+		/// </summary>
+		/// <param name="expected"></param>
+		/// <param name="actual"></param>
+		/// <param name="message"></param>
+		protected void AssertTextMessageEqual(IMessage expected, IMessage actual, String message)
+		{
+			ITextMessage expectedTextMsg = expected as ITextMessage;
+			Assert.IsNotNull(expectedTextMsg, "'expected' message not a text message");
+			ITextMessage actualTextMsg = actual as ITextMessage;
+			Assert.IsNotNull(actualTextMsg, "'actual' message not a text message");
+			Assert.AreEqual(expectedTextMsg.Text, actualTextMsg.Text, message);
+		}
+
+		//[Test]
+		public virtual void TestRedispatchOfRolledbackTx(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.Transactional);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+
+				SendMessages(connection, destination, deliveryMode, 2);
+
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				Assert.IsNotNull(consumer.Receive(TimeSpan.FromMilliseconds(1500)));
+				Assert.IsNotNull(consumer.Receive(TimeSpan.FromMilliseconds(1500)));
+
+				// install another consumer while message dispatch is unacked/uncommitted
+				ISession redispatchSession = connection.CreateSession(AcknowledgementMode.Transactional);
+				IMessageConsumer redispatchConsumer = redispatchSession.CreateConsumer(destination);
+
+				session.Rollback();
+				session.Close();
+
+				IMessage msg = redispatchConsumer.Receive(TimeSpan.FromMilliseconds(1500));
+				Assert.IsNotNull(msg);
+				Assert.IsTrue(msg.NMSRedelivered);
+				Assert.AreEqual(2, msg.Properties.GetLong("NMSXDeliveryCount"));
+				msg = redispatchConsumer.Receive(TimeSpan.FromMilliseconds(1500));
+				Assert.IsNotNull(msg);
+				Assert.IsTrue(msg.NMSRedelivered);
+				Assert.AreEqual(2, msg.Properties.GetLong("NMSXDeliveryCount"));
+				redispatchSession.Commit();
+
+				Assert.IsNull(redispatchConsumer.Receive(TimeSpan.FromMilliseconds(500)));
+				redispatchSession.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestRedispatchOfUncommittedTx(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.Transactional);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+
+				SendMessages(connection, destination, deliveryMode, 2);
+
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				Assert.IsNotNull(consumer.Receive(TimeSpan.FromMilliseconds(2000)));
+				Assert.IsNotNull(consumer.Receive(TimeSpan.FromMilliseconds(2000)));
+
+				// install another consumer while message dispatch is unacked/uncommitted
+				ISession redispatchSession = connection.CreateSession(AcknowledgementMode.Transactional);
+				IMessageConsumer redispatchConsumer = redispatchSession.CreateConsumer(destination);
+
+				// no commit so will auto rollback and get re-dispatched to redisptachConsumer
+				session.Close();
+
+				IMessage msg = redispatchConsumer.Receive(TimeSpan.FromMilliseconds(2000));
+				Assert.IsNotNull(msg);
+				Assert.IsTrue(msg.NMSRedelivered);
+				Assert.AreEqual(2, msg.Properties.GetLong("NMSXDeliveryCount"));
+
+				msg = redispatchConsumer.Receive(TimeSpan.FromMilliseconds(2000));
+				Assert.IsNotNull(msg);
+				Assert.IsTrue(msg.NMSRedelivered);
+				Assert.AreEqual(2, msg.Properties.GetLong("NMSXDeliveryCount"));
+				redispatchSession.Commit();
+
+				Assert.IsNull(redispatchConsumer.Receive(TimeSpan.FromMilliseconds(500)));
+				redispatchSession.Close();
+			}
+		}
+	}
+}
+
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSAsyncConsumeTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSAsyncConsumeTest.cs b/src/test/csharp/XMSAsyncConsumeTest.cs
new file mode 100644
index 0000000..7ef2954
--- /dev/null
+++ b/src/test/csharp/XMSAsyncConsumeTest.cs
@@ -0,0 +1,106 @@
+/*
+ * 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.Threading;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSAsyncConsumeTest : AsyncConsumeTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSAsyncConsumeTest() :
+			base(new XMSTestSupport())
+		{
+		}
+
+		[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+		}
+
+		[TearDown]
+		public override void TearDown()
+		{
+			base.TearDown();
+		}
+
+		[Test]
+		public void TestAsynchronousConsume(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestAsynchronousConsume(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestCreateConsumerAfterSend(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestCreateConsumerAfterSend(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestCreateConsumerBeforeSendAddListenerAfterSend(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestCreateConsumerBeforeSendAddListenerAfterSend(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestAsynchronousTextMessageConsume(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestAsynchronousTextMessageConsume(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestTemporaryQueueAsynchronousConsume(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession syncSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ISession asyncSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IDestination destination = GetClearDestination(syncSession, DestinationType.Queue, DEFAULT_TEST_QUEUE))
+			using(ITemporaryQueue tempReplyDestination = syncSession.CreateTemporaryQueue())
+			using(IMessageConsumer consumer = asyncSession.CreateConsumer(destination))
+			using(IMessageConsumer tempConsumer = asyncSession.CreateConsumer(tempReplyDestination))
+			using(IMessageProducer producer = syncSession.CreateProducer(destination))
+			{
+				producer.DeliveryMode = deliveryMode;
+				tempConsumer.Listener += new MessageListener(OnMessage);
+				consumer.Listener += new MessageListener(OnQueueMessage);
+
+				IMessage request = syncSession.CreateMessage();
+				request.NMSCorrelationID = "TemqQueueAsyncConsume";
+				request.NMSType = "Test";
+				request.NMSReplyTo = tempReplyDestination;
+				producer.Send(request);
+
+				WaitForMessageToArrive();
+				Assert.AreEqual("TempQueueAsyncResponse", receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSBadConsumeTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSBadConsumeTest.cs b/src/test/csharp/XMSBadConsumeTest.cs
new file mode 100644
index 0000000..4c6b0b8
--- /dev/null
+++ b/src/test/csharp/XMSBadConsumeTest.cs
@@ -0,0 +1,50 @@
+/*
+ * 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 NUnit.Framework;
+using Apache.NMS.Test;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSBadConsumeTest : BadConsumeTest
+	{
+		public XMSBadConsumeTest()
+			: base(new NMSTestSupport())
+		{
+		}
+
+		[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+		}
+
+		[TearDown]
+		public override void TearDown()
+		{
+			base.TearDown();
+		}
+
+		[Test]
+		[ExpectedException(Handler="ExceptionValidationCheck")]
+		public override void TestBadConsumerException()
+		{
+			base.TestBadConsumerException();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSBytesMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSBytesMessageTest.cs b/src/test/csharp/XMSBytesMessageTest.cs
new file mode 100644
index 0000000..25a3382
--- /dev/null
+++ b/src/test/csharp/XMSBytesMessageTest.cs
@@ -0,0 +1,51 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSBytesMessageTest : BytesMessageTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSBytesMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void SendReceiveBytesMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.SendReceiveBytesMessage(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+
+        [Test]
+        public void SendReceiveBytesMessageContent(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+			base.SendReceiveBytesMessageContent(deliveryMode, DEFAULT_TEST_QUEUE);
+        }
+	}
+}


[06/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/AsyncConsumeTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/AsyncConsumeTest.cs b/src/test/csharp/AsyncConsumeTest.cs
new file mode 100644
index 0000000..c414927
--- /dev/null
+++ b/src/test/csharp/AsyncConsumeTest.cs
@@ -0,0 +1,228 @@
+/*
+ * 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.Threading;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class AsyncConsumeTest : NMSTest
+	{
+		protected string RESPONSE_CLIENT_ID;
+		protected AutoResetEvent semaphore;
+		protected bool received;
+		protected IMessage receivedMsg;
+
+		public AsyncConsumeTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+			semaphore = new AutoResetEvent(false);
+			received = false;
+			receivedMsg = null;
+
+			RESPONSE_CLIENT_ID = GetTestClientId() + ":RESPONSE";
+		}
+
+		//[TearDown]
+		public override void TearDown()
+		{
+			receivedMsg = null;
+			base.TearDown();
+		}
+
+		//[Test]
+		public virtual void TestAsynchronousConsume(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			// IBM XMS doesn't support both synchronous and asynchronous operations
+			// in the same session. Needs 2 separate sessions.
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession producerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ISession consumerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IDestination producerDestination = GetClearDestination(producerSession, DestinationType.Queue, testQueueRef))
+			using(IDestination consumerDestination = GetDestination(consumerSession, DestinationType.Queue, testQueueRef))
+			using(IMessageConsumer consumer = consumerSession.CreateConsumer(consumerDestination))
+			using(IMessageProducer producer = producerSession.CreateProducer(producerDestination))
+			{
+				producer.DeliveryMode = deliveryMode;
+				consumer.Listener += new MessageListener(OnMessage);
+
+				IMessage request = producerSession.CreateMessage();
+				request.NMSCorrelationID = "AsyncConsume";
+				request.NMSType = "Test";
+				producer.Send(request);
+
+				WaitForMessageToArrive();
+				Assert.AreEqual(request.NMSCorrelationID, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+			}
+		}
+
+		//[Test]
+		public virtual void TestCreateConsumerAfterSend(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession producerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ISession consumerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IDestination producerDestination = GetClearDestination(producerSession, DestinationType.Queue, testQueueRef))
+			using(IDestination consumerDestination = GetDestination(consumerSession, DestinationType.Queue, testQueueRef))
+			{
+				string correlationId = "AsyncConsumeAfterSend";
+
+				using(IMessageProducer producer = producerSession.CreateProducer(producerDestination))
+				{
+					producer.DeliveryMode = deliveryMode;
+					IMessage request = producerSession.CreateMessage();
+					request.NMSCorrelationID = correlationId;
+					request.NMSType = "Test";
+					producer.Send(request);
+				}
+
+				using(IMessageConsumer consumer = consumerSession.CreateConsumer(consumerDestination))
+				{
+					consumer.Listener += new MessageListener(OnMessage);
+					WaitForMessageToArrive();
+					Assert.AreEqual(correlationId, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestCreateConsumerBeforeSendAddListenerAfterSend(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession producerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ISession consumerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IDestination producerDestination = GetClearDestination(producerSession, DestinationType.Queue, testQueueRef))
+			using(IDestination consumerDestination = GetDestination(consumerSession, DestinationType.Queue, testQueueRef))
+			using(IMessageConsumer consumer = consumerSession.CreateConsumer(consumerDestination))
+			using(IMessageProducer producer = producerSession.CreateProducer(producerDestination))
+			{
+				producer.DeliveryMode = deliveryMode;
+
+				IMessage request = producerSession.CreateMessage();
+				request.NMSCorrelationID = "AsyncConsumeAfterSendLateListener";
+				request.NMSType = "Test";
+				producer.Send(request);
+
+				// now lets add the listener
+				consumer.Listener += new MessageListener(OnMessage);
+				WaitForMessageToArrive();
+				Assert.AreEqual(request.NMSCorrelationID, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+			}
+		}
+
+		//[Test]
+		public virtual void TestAsynchronousTextMessageConsume(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession producerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ISession consumerSession = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IDestination producerDestination = GetClearDestination(producerSession, DestinationType.Queue, testQueueRef))
+			using(IDestination consumerDestination = GetDestination(consumerSession, DestinationType.Queue, testQueueRef))
+			using(IMessageConsumer consumer = consumerSession.CreateConsumer(consumerDestination))
+			using(IMessageProducer producer = producerSession.CreateProducer(producerDestination))
+			{
+				consumer.Listener += new MessageListener(OnMessage);
+				producer.DeliveryMode = deliveryMode;
+
+				ITextMessage request = producerSession.CreateTextMessage("Hello, World!");
+				request.NMSCorrelationID = "AsyncConsumeTextMessage";
+				request.Properties["NMSXGroupID"] = "cheese";
+				request.Properties["myHeader"] = "James";
+
+				producer.Send(request);
+
+				WaitForMessageToArrive();
+				Assert.AreEqual(request.NMSCorrelationID, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+				Assert.AreEqual(request.Properties["NMSXGroupID"], receivedMsg.Properties["NMSXGroupID"], "Invalid NMSXGroupID.");
+				Assert.AreEqual(request.Properties["myHeader"], receivedMsg.Properties["myHeader"], "Invalid myHeader.");
+				Assert.AreEqual(request.Text, ((ITextMessage) receivedMsg).Text, "Invalid text body.");
+			}
+		}
+
+		//[Test]
+		public virtual void TestTemporaryQueueAsynchronousConsume(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnectionAndStart(GetTestClientId()))
+			using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(ITemporaryQueue tempReplyDestination = session.CreateTemporaryQueue())
+			using(IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef))
+			using(IMessageConsumer consumer = session.CreateConsumer(destination))
+			using(IMessageConsumer tempConsumer = session.CreateConsumer(tempReplyDestination))
+			using(IMessageProducer producer = session.CreateProducer(destination))
+			{
+				producer.DeliveryMode = deliveryMode;
+				tempConsumer.Listener += new MessageListener(OnMessage);
+				consumer.Listener += new MessageListener(OnQueueMessage);
+
+				IMessage request = session.CreateMessage();
+				request.NMSCorrelationID = "TemqQueueAsyncConsume";
+				request.NMSType = "Test";
+				request.NMSReplyTo = tempReplyDestination;
+				producer.Send(request);
+
+				WaitForMessageToArrive();
+				Assert.AreEqual("TempQueueAsyncResponse", receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+			}
+		}
+
+		protected void OnQueueMessage(IMessage message)
+		{
+			Assert.AreEqual("TemqQueueAsyncConsume", message.NMSCorrelationID, "Invalid correlation ID.");
+			using(IConnection connection = CreateConnectionAndStart(RESPONSE_CLIENT_ID))
+			using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+			using(IMessageProducer producer = session.CreateProducer(message.NMSReplyTo))
+			{
+				producer.DeliveryMode = message.NMSDeliveryMode;
+
+				ITextMessage response = session.CreateTextMessage("Asynchronous Response Message Text");
+				response.NMSCorrelationID = "TempQueueAsyncResponse";
+				response.NMSType = message.NMSType;
+				producer.Send(response);
+			}
+		}
+
+		protected void OnMessage(IMessage message)
+		{
+			receivedMsg = message;
+			received = true;
+			semaphore.Set();
+		}
+
+		protected void WaitForMessageToArrive()
+		{
+			semaphore.WaitOne((int) receiveTimeout.TotalMilliseconds, true);
+			Assert.IsTrue(received, "Should have received a message by now!");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/BadConsumeTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/BadConsumeTest.cs b/src/test/csharp/BadConsumeTest.cs
new file mode 100644
index 0000000..564f9d8
--- /dev/null
+++ b/src/test/csharp/BadConsumeTest.cs
@@ -0,0 +1,69 @@
+/*
+ * 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 NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class BadConsumeTest : NMSTest
+	{
+		protected IConnection connection;
+		protected ISession session;
+
+		protected BadConsumeTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[SetUp]
+		public override void SetUp()
+		{
+			connection = CreateConnection(GetTestClientId());
+			connection.Start();
+			session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+		}
+
+		//[TearDown]
+		public override void TearDown()
+		{
+			if(null != session)
+			{
+				session.Dispose();
+				session = null;
+			}
+
+			if(null != connection)
+			{
+				connection.Dispose();
+				connection = null;
+			}
+		}
+
+		//[Test]
+		//[ExpectedException(Handler="ExceptionValidationCheck")]
+		public virtual void TestBadConsumerException()
+		{
+			session.CreateConsumer(null);
+		}
+
+		public void ExceptionValidationCheck(Exception ex)
+		{
+			Assert.IsNotNull(ex as NMSException, "Invalid exception was thrown.");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/BytesMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/BytesMessageTest.cs b/src/test/csharp/BytesMessageTest.cs
new file mode 100644
index 0000000..d8c3af7
--- /dev/null
+++ b/src/test/csharp/BytesMessageTest.cs
@@ -0,0 +1,138 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class BytesMessageTest : NMSTest
+	{
+		protected byte[] msgContent = {1, 2, 3, 4, 5, 6, 7, 8};
+
+		protected BytesMessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void SendReceiveBytesMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						IMessage request = session.CreateBytesMessage(msgContent);
+						producer.Send(request);
+
+						IMessage message = consumer.Receive(receiveTimeout);
+                        AssertMessageIsReadOnly(message);
+						AssertBytesMessageEqual(request, message);
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+					}
+				}
+			}
+		}
+
+        //[Test]
+        public virtual void SendReceiveBytesMessageContent(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+        {
+            using(IConnection connection = CreateConnection(GetTestClientId()))
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+                {
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+                    using(IMessageConsumer consumer = session.CreateConsumer(destination))
+                    using(IMessageProducer producer = session.CreateProducer(destination))
+                    {
+                        producer.DeliveryMode = deliveryMode;
+                        IBytesMessage request = session.CreateBytesMessage();
+                        
+                        request.WriteBoolean(true);
+                        request.WriteByte((byte) 1);
+                        request.WriteBytes(new byte[1]);
+                        request.WriteBytes(new byte[3], 0, 2);
+                        request.WriteChar('a');
+                        request.WriteDouble(1.5);
+                        request.WriteSingle((float) 1.5);
+                        request.WriteInt32(1);
+                        request.WriteInt64(1);
+                        request.WriteObject("stringobj");
+                        request.WriteInt16((short) 1);
+                        request.WriteString("utfstring");
+                        
+                        producer.Send(request);
+
+                        IMessage message = consumer.Receive(receiveTimeout);
+                        AssertMessageIsReadOnly(message);
+                        AssertBytesMessageEqual(request, message);
+                        Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+                    }
+                }
+            }
+        }
+        
+        protected void AssertMessageIsReadOnly(IMessage message)
+        {
+			Type writeableExceptionType = typeof(MessageNotWriteableException);
+			IBytesMessage theMessage = message as IBytesMessage;
+            Assert.IsNotNull(theMessage);
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteBoolean(true); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteByte((byte) 1); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteBytes(new byte[1]); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteBytes(new byte[3], 0, 2); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteChar('a'); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteDouble(1.5); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteSingle((float) 1.5); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteInt32(1); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteInt64(1); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteObject("stringobj"); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteInt16((short) 1); });
+			Assert.Throws(writeableExceptionType, delegate () { theMessage.WriteString("utfstring"); });
+		}
+        
+		/// <summary>
+		/// Assert that two messages are IBytesMessages and their contents are equal.
+		/// </summary>
+		/// <param name="expected"></param>
+		/// <param name="actual"></param>
+		protected void AssertBytesMessageEqual(IMessage expected, IMessage actual)
+		{
+			IBytesMessage expectedBytesMsg = expected as IBytesMessage;
+			expectedBytesMsg.Reset();
+			Assert.IsNotNull(expectedBytesMsg, "'expected' message not a bytes message");
+			IBytesMessage actualBytesMsg = actual as IBytesMessage;
+			Assert.IsNotNull(actualBytesMsg, "'actual' message not a bytes message");
+			Assert.AreEqual(expectedBytesMsg.Content, actualBytesMsg.Content, "Bytes message contents do not match.");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/BytesMessage.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/BytesMessage.cs b/src/test/csharp/Commands/BytesMessage.cs
new file mode 100644
index 0000000..e581942
--- /dev/null
+++ b/src/test/csharp/Commands/BytesMessage.cs
@@ -0,0 +1,511 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using System;
+using System.Collections;
+using System.IO;
+
+namespace Apache.NMS.Commands
+{
+    public class BytesMessage : Message, IBytesMessage
+    {
+        private EndianBinaryReader dataIn = null;
+        private EndianBinaryWriter dataOut = null;
+        private MemoryStream outputBuffer = null;
+        private int length = 0;
+
+        public override Object Clone()
+        {
+            StoreContent();
+            return base.Clone();
+        }
+
+        public override void ClearBody()
+        {
+            base.ClearBody();
+            this.outputBuffer = null;
+            this.dataIn = null;
+            this.dataOut = null;
+            this.length = 0;
+        }
+
+        public long BodyLength
+        {
+            get
+            {
+                InitializeReading();
+                return this.length;
+            }
+        }
+
+        public byte ReadByte()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadByte();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteByte( byte value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public bool ReadBoolean()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadBoolean();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteBoolean( bool value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public char ReadChar()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadChar();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteChar( char value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public short ReadInt16()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadInt16();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteInt16( short value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public int ReadInt32()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadInt32();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteInt32( int value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public long ReadInt64()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadInt64();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteInt64( long value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public float ReadSingle()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadSingle();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteSingle( float value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public double ReadDouble()
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.ReadDouble();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteDouble( double value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public int ReadBytes( byte[] value )
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.Read( value, 0, value.Length );
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public int ReadBytes( byte[] value, int length )
+        {
+            InitializeReading();
+            try
+            {
+                return dataIn.Read( value, 0, length );
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteBytes( byte[] value )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value, 0, value.Length );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteBytes( byte[] value, int offset, int length )
+        {
+            InitializeWriting();
+            try
+            {
+                dataOut.Write( value, offset, length );
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public string ReadString()
+        {
+            InitializeReading();
+            try
+            {
+                // JMS, CMS and NMS all encode the String using a 16 bit size header.
+                return dataIn.ReadString16();
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteString( string value )
+        {
+            InitializeWriting();
+            try
+            {
+                // JMS, CMS and NMS all encode the String using a 16 bit size header.
+                dataOut.WriteString16(value);
+            }
+            catch(Exception e)
+            {
+                throw NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteObject( System.Object value )
+        {
+            InitializeWriting();
+            if( value is System.Byte )
+            {
+                this.dataOut.Write( (byte) value );
+            }
+            else if( value is Char )
+            {
+                this.dataOut.Write( (char) value );
+            }
+            else if( value is Boolean )
+            {
+                this.dataOut.Write( (bool) value );
+            }
+            else if( value is Int16 )
+            {
+                this.dataOut.Write( (short) value );
+            }
+            else if( value is Int32 )
+            {
+                this.dataOut.Write( (int) value );
+            }
+            else if( value is Int64 )
+            {
+                this.dataOut.Write( (long) value );
+            }
+            else if( value is Single )
+            {
+                this.dataOut.Write( (float) value );
+            }
+            else if( value is Double )
+            {
+                this.dataOut.Write( (double) value );
+            }
+            else if( value is byte[] )
+            {
+                this.dataOut.Write( (byte[]) value );
+            }
+            else if( value is String )
+            {
+                this.dataOut.WriteString16( (string) value );
+            }
+            else
+            {
+                throw new MessageFormatException("Cannot write non-primitive type:" + value.GetType());
+            }
+        }
+
+        public new byte[] Content
+        {
+            get
+            {
+                byte[] buffer = null;
+                InitializeReading();
+                if(this.length != 0)
+                {
+                    buffer = new byte[this.length];
+                    this.dataIn.Read(buffer, 0, buffer.Length);
+                }
+                return buffer;
+            }
+
+            set
+            {
+                InitializeWriting();
+                this.dataOut.Write(value, 0, value.Length);
+            }
+        }
+
+        public void Reset()
+        {
+            StoreContent();
+            this.dataIn = null;
+            this.dataOut = null;
+            this.outputBuffer = null;
+            this.ReadOnlyBody = true;
+        }
+
+        private void InitializeReading()
+        {
+            FailIfWriteOnlyBody();
+            if(this.dataIn == null)
+            {
+                byte[] data = base.Content;
+
+                if(base.Content == null)
+                {
+                    data = new byte[0];
+                }
+
+                Stream target = new MemoryStream(data, false);
+
+                this.length = data.Length;
+                this.dataIn = new EndianBinaryReader(target);
+            }
+        }
+
+        private void InitializeWriting()
+        {
+            FailIfReadOnlyBody();
+            if(this.dataOut == null)
+            {
+                this.outputBuffer = new MemoryStream();
+                this.dataOut = new EndianBinaryWriter(this.outputBuffer);
+            }
+        }
+
+        private void StoreContent()
+        {
+            if(this.dataOut != null)
+            {
+                this.dataOut.Close();
+                base.Content = outputBuffer.ToArray();
+
+                this.dataOut = null;
+                this.outputBuffer = null;
+            }
+        }
+
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/Destination.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/Destination.cs b/src/test/csharp/Commands/Destination.cs
new file mode 100644
index 0000000..23c477d
--- /dev/null
+++ b/src/test/csharp/Commands/Destination.cs
@@ -0,0 +1,380 @@
+/*
+ * 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.Specialized;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Commands
+{
+    /// <summary>
+    /// Summary description for Destination.
+    /// </summary>
+    public abstract class Destination : IDestination, ICloneable
+    {
+        /// <summary>
+        /// Topic Destination object
+        /// </summary>
+        public const int TOPIC = 1;
+        /// <summary>
+        /// Temporary Topic Destination object
+        /// </summary>
+        public const int TEMPORARY_TOPIC = 2;
+        /// <summary>
+        /// Queue Destination object
+        /// </summary>
+        public const int QUEUE = 3;
+        /// <summary>
+        /// Temporary Queue Destination object
+        /// </summary>
+        public const int TEMPORARY_QUEUE = 4;
+
+        private const String TEMP_PREFIX = "{TD{";
+        private const String TEMP_POSTFIX = "}TD}";
+
+        private String physicalName = "";
+        private StringDictionary options = null;
+
+		private bool disposed = false;
+
+        /// <summary>
+        /// The Default Constructor
+        /// </summary>
+        protected Destination()
+        {
+        }
+
+        /// <summary>
+        /// Construct the Destination with a defined physical name;
+        /// </summary>
+        /// <param name="name"></param>
+        protected Destination(String name)
+        {
+            setPhysicalName(name);
+        }
+
+		~Destination()
+		{
+			Dispose(false);
+		}
+
+		public void Dispose()
+		{
+			Dispose(true);
+			GC.SuppressFinalize(this);
+		}
+
+		private void Dispose(bool disposing)
+		{
+			if(disposed)
+			{
+				return;
+			}
+
+			if(disposing)
+			{
+				try
+				{
+					OnDispose();
+				}
+				catch(Exception ex)
+				{
+					Tracer.ErrorFormat("Exception disposing Destination {0}: {1}", this.physicalName, ex.Message);
+				}
+			}
+
+			disposed = true;
+		}
+
+		/// <summary>
+		/// Child classes can override this method to perform clean-up logic.
+		/// </summary>
+		protected virtual void OnDispose()
+		{
+		}
+
+		public bool IsTopic
+        {
+            get
+            {
+                int destinationType = GetDestinationType();
+                return TOPIC == destinationType
+                    || TEMPORARY_TOPIC == destinationType;
+            }
+        }
+
+        public bool IsQueue
+        {
+            get
+            {
+                int destinationType = GetDestinationType();
+                return QUEUE == destinationType
+                    || TEMPORARY_QUEUE == destinationType;
+            }
+        }
+
+        public bool IsTemporary
+        {
+            get
+            {
+                int destinationType = GetDestinationType();
+                return TEMPORARY_QUEUE == destinationType
+                    || TEMPORARY_TOPIC == destinationType;
+            }
+        }
+
+        /// <summary>
+        /// Dictionary of name/value pairs representing option values specified
+        /// in the URI used to create this Destination.  A null value is returned
+        /// if no options were specified.
+        /// </summary>
+        internal StringDictionary Options
+        {
+            get { return this.options; }
+        }
+
+        private void setPhysicalName(string name)
+        {
+            this.physicalName = name;
+
+            int p = name.IndexOf('?');
+            if(p >= 0)
+            {
+                String optstring = physicalName.Substring(p + 1);
+                this.physicalName = name.Substring(0, p);
+                options = URISupport.ParseQuery(optstring);
+            }
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <param name="destination"></param>
+        /// <returns></returns>
+        public static Destination Transform(IDestination destination)
+        {
+            Destination result = null;
+            if(destination != null)
+            {
+                if(destination is Destination)
+                {
+                    result = (Destination) destination;
+                }
+                else
+                {
+                    if(destination is ITemporaryQueue)
+                    {
+                        result = new TempQueue(((IQueue) destination).QueueName);
+                    }
+                    else if(destination is ITemporaryTopic)
+                    {
+                        result = new TempTopic(((ITopic) destination).TopicName);
+                    }
+                    else if(destination is IQueue)
+                    {
+                        result = new Queue(((IQueue) destination).QueueName);
+                    }
+                    else if(destination is ITopic)
+                    {
+                        result = new Topic(((ITopic) destination).TopicName);
+                    }
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// Create a temporary name from the clientId
+        /// </summary>
+        /// <param name="clientId"></param>
+        /// <returns></returns>
+        public static String CreateTemporaryName(String clientId)
+        {
+            return TEMP_PREFIX + clientId + TEMP_POSTFIX;
+        }
+
+        /// <summary>
+        /// From a temporary destination find the clientId of the Connection that created it
+        /// </summary>
+        /// <param name="destination"></param>
+        /// <returns>the clientId or null if not a temporary destination</returns>
+        public static String GetClientId(Destination destination)
+        {
+            String answer = null;
+            if(destination != null && destination.IsTemporary)
+            {
+                String name = destination.PhysicalName;
+                int start = name.IndexOf(TEMP_PREFIX);
+                if(start >= 0)
+                {
+                    start += TEMP_PREFIX.Length;
+                    int stop = name.LastIndexOf(TEMP_POSTFIX);
+                    if(stop > start && stop < name.Length)
+                    {
+                        answer = name.Substring(start, stop);
+                    }
+                }
+            }
+            return answer;
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <param name="o">object to compare</param>
+        /// <returns>1 if this is less than o else 0 if they are equal or -1 if this is less than o</returns>
+        public int CompareTo(Object o)
+        {
+            if(o is Destination)
+            {
+                return CompareTo((Destination) o);
+            }
+            return -1;
+        }
+
+        /// <summary>
+        /// Lets sort by name first then lets sort topics greater than queues
+        /// </summary>
+        /// <param name="that">another destination to compare against</param>
+        /// <returns>1 if this is less than o else 0 if they are equal or -1 if this is less than o</returns>
+        public int CompareTo(Destination that)
+        {
+            int answer = 0;
+            if(physicalName != that.physicalName)
+            {
+                if(physicalName == null)
+                {
+                    return -1;
+                }
+                else if(that.physicalName == null)
+                {
+                    return 1;
+                }
+                answer = physicalName.CompareTo(that.physicalName);
+            }
+
+            if(answer == 0)
+            {
+                if(IsTopic)
+                {
+                    if(that.IsQueue)
+                    {
+                        return 1;
+                    }
+                }
+                else
+                {
+                    if(that.IsTopic)
+                    {
+                        return -1;
+                    }
+                }
+            }
+            return answer;
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <returns>Returns the Destination type</returns>
+        public abstract int GetDestinationType();
+
+        public String PhysicalName
+        {
+            get { return this.physicalName; }
+            set
+            {
+                this.physicalName = value;
+            }
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <returns>string representation of this instance</returns>
+        public override String ToString()
+        {
+            switch(DestinationType)
+            {
+            case DestinationType.Topic:
+            return "topic://" + PhysicalName;
+
+            case DestinationType.TemporaryTopic:
+            return "temp-topic://" + PhysicalName;
+
+            case DestinationType.TemporaryQueue:
+            return "temp-queue://" + PhysicalName;
+
+            default:
+            return "queue://" + PhysicalName;
+            }
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <returns>hashCode for this instance</returns>
+        public override int GetHashCode()
+        {
+            int answer = 37;
+
+            if(this.physicalName != null)
+            {
+                answer = physicalName.GetHashCode();
+            }
+            if(IsTopic)
+            {
+                answer ^= 0xfabfab;
+            }
+            return answer;
+        }
+
+        /// <summary>
+        /// if the object passed in is equivalent, return true
+        /// </summary>
+        /// <param name="obj">the object to compare</param>
+        /// <returns>true if this instance and obj are equivalent</returns>
+        public override bool Equals(Object obj)
+        {
+            bool result = this == obj;
+            if(!result && obj != null && obj is Destination)
+            {
+                Destination other = (Destination) obj;
+                result = this.GetDestinationType() == other.GetDestinationType()
+                    && this.physicalName.Equals(other.physicalName);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// Factory method to create a child destination if this destination is a composite
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns>the created Destination</returns>
+        public abstract Destination CreateDestination(String name);
+
+        public abstract DestinationType DestinationType
+        {
+            get;
+        }
+
+        public virtual Object Clone()
+        {
+            // Since we are the lowest level base class, do a
+            // shallow copy which will include the derived classes.
+            // From here we would do deep cloning of other objects
+            // if we had any.
+            return this.MemberwiseClone();
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/MapMessage.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/MapMessage.cs b/src/test/csharp/Commands/MapMessage.cs
new file mode 100644
index 0000000..4ba9751
--- /dev/null
+++ b/src/test/csharp/Commands/MapMessage.cs
@@ -0,0 +1,90 @@
+/*
+ * 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.IO;
+using Apache.NMS;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Commands
+{
+    public class MapMessage : Message, IMapMessage
+    {
+        private PrimitiveMap body;
+        private PrimitiveMapInterceptor typeConverter;
+
+        public MapMessage() : base()
+        {
+        }
+
+        public MapMessage(PrimitiveMap body) : base()
+        {
+            this.body = body;
+            this.typeConverter = new PrimitiveMapInterceptor(this, this.body);
+        }
+
+        public override void ClearBody()
+        {
+            this.body = null;
+            this.typeConverter = null;
+            base.ClearBody();
+        }
+
+        public override bool ReadOnlyBody
+        {
+            get { return base.ReadOnlyBody; }
+
+            set
+            {
+                if(this.typeConverter != null)
+                {
+                    this.typeConverter.ReadOnly = true;
+                }
+
+                base.ReadOnlyBody = value;
+            }
+        }
+
+
+        public IPrimitiveMap Body
+        {
+            get
+            {
+                if(this.body == null)
+                {
+                    this.body = new PrimitiveMap();
+                    this.typeConverter = new PrimitiveMapInterceptor(this, this.body);
+                }
+
+                return this.typeConverter;
+            }
+
+            set
+            {
+                this.body = value as PrimitiveMap;
+                if(value != null)
+                {
+                    this.typeConverter = new PrimitiveMapInterceptor(this, value);
+                }
+                else
+                {
+                    this.typeConverter = null;
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/Message.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/Message.cs b/src/test/csharp/Commands/Message.cs
new file mode 100644
index 0000000..5cadd5f
--- /dev/null
+++ b/src/test/csharp/Commands/Message.cs
@@ -0,0 +1,329 @@
+/*
+ * 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 Apache.NMS.Util;
+
+namespace Apache.NMS.Commands
+{
+    public class Message : IMessage, ICloneable
+    {
+        private IDestination destination;
+        private string transactionId;
+        private string messageId;
+        private string groupID;
+		private int groupSequence;
+        private string correlationId;
+        private bool persistent;
+        private long expiration;
+        private byte priority;
+        private IDestination replyTo;
+        private long timestamp;
+        private string type;
+        private bool redelivered;
+        private byte[] content;
+        private bool readOnlyMsgProperties;
+        private bool readOnlyMsgBody;
+
+        private MessagePropertyIntercepter propertyHelper;
+        private PrimitiveMap properties;
+
+        ///
+        /// <summery>
+        ///  Clone this object and return a new instance that the caller now owns.
+        /// </summery>
+        ///
+        public virtual Object Clone()
+        {
+            // Since we are the lowest level base class, do a
+            // shallow copy which will include the derived classes.
+            // From here we would do deep cloning of other objects
+            // if we had any.
+            Message o = (Message) this.MemberwiseClone();
+
+            if(this.messageId != null)
+            {
+                o.NMSMessageId = (string) this.messageId.Clone();
+            }
+			
+			return o;
+		}		
+
+        ///
+        /// <summery>
+        ///  Returns a string containing the information for this DataStructure
+        ///  such as its type and value of its elements.
+        /// </summery>
+        ///
+        public override string ToString()
+        {
+            return GetType().Name + "[" +
+                "Destination=" + destination + ", " +
+                "TransactionId=" + transactionId + ", " +
+                "MessageId=" + messageId + ", " +
+                "GroupID=" + groupID + ", " +
+                "GroupSequence=" + groupSequence + ", " +
+                "CorrelationId=" + correlationId + ", " +
+                "Expiration=" + expiration + ", " +
+                "Priority=" + priority + ", " +
+                "ReplyTo=" + replyTo + ", " +
+                "Timestamp=" + timestamp + ", " +
+                "Type=" + type + ", " +
+                "Redelivered=" + redelivered +
+                "]";
+        }
+
+        public void Acknowledge()
+        {
+        }
+		
+        public virtual void ClearBody()
+        {
+			this.content = null;
+        }
+
+        public virtual void ClearProperties()
+        {
+            this.properties.Clear();
+        }
+		
+        protected void FailIfReadOnlyBody()
+        {
+            if(ReadOnlyBody == true)
+            {
+                throw new MessageNotWriteableException("Message is in Read-Only mode.");
+            }
+        }
+
+        protected void FailIfWriteOnlyBody()
+        {
+            if(ReadOnlyBody == false)
+            {
+                throw new MessageNotReadableException("Message is in Write-Only mode.");
+            }
+        }
+		
+        #region Properties
+		
+		public string TransactionId
+		{
+			get { return this.transactionId; }
+			set { this.transactionId = value; }
+		}
+
+        public byte[] Content
+        {
+            get { return content; }
+            set { this.content = value; }
+        }
+		
+        public virtual bool ReadOnlyProperties
+        {
+            get { return this.readOnlyMsgProperties; }
+            set { this.readOnlyMsgProperties = value; }
+        }
+
+        public virtual bool ReadOnlyBody
+        {
+            get { return this.readOnlyMsgBody; }
+            set { this.readOnlyMsgBody = value; }
+        }
+		
+        public IPrimitiveMap Properties
+        {
+            get
+            {
+                if(null == properties)
+                {
+                    properties = new PrimitiveMap();
+                    propertyHelper = new MessagePropertyIntercepter(this, properties, this.ReadOnlyProperties);
+                    propertyHelper.AllowByteArrays = false;
+                }
+
+                return propertyHelper;
+            }
+        }
+
+        /// <summary>
+        /// The correlation ID used to correlate messages with conversations or long running business processes
+        /// </summary>
+        public string NMSCorrelationID
+        {
+            get { return correlationId; }
+            set { correlationId = value; }
+        }
+
+        /// <summary>
+        /// The destination of the message
+        /// </summary>
+        public IDestination NMSDestination
+        {
+            get { return destination; }
+            set { this.destination = Destination.Transform(value); }
+        }
+
+        private TimeSpan timeToLive = TimeSpan.FromMilliseconds(0);
+        /// <summary>
+        /// The time in milliseconds that this message should expire in
+        /// </summary>
+        public TimeSpan NMSTimeToLive
+        {
+            get { return timeToLive; }
+
+            set
+            {
+                timeToLive = value;
+                if(timeToLive.TotalMilliseconds > 0)
+                {
+                    long timeStamp = timestamp;
+
+                    if(timeStamp == 0)
+                    {
+                        timeStamp = DateUtils.ToJavaTimeUtc(DateTime.UtcNow);
+                    }
+
+                    expiration = timeStamp + (long) timeToLive.TotalMilliseconds;
+                }
+                else
+                {
+                    expiration = 0;
+                }
+            }
+        }
+
+        /// <summary>
+        /// The timestamp the broker added to the message
+        /// </summary>
+        public DateTime NMSTimestamp
+        {
+            get { return DateUtils.ToDateTime(timestamp); }
+            set
+            {
+                timestamp = DateUtils.ToJavaTimeUtc(value);
+                if(timeToLive.TotalMilliseconds > 0)
+                {
+                    expiration = timestamp + (long) timeToLive.TotalMilliseconds;
+                }
+            }
+        }
+
+        /// <summary>
+        /// The message ID which is set by the provider
+        /// </summary>
+        public string NMSMessageId
+        {
+            get { return this.messageId; }
+            set { this.messageId = value; }
+        }
+
+        /// <summary>
+        /// Whether or not this message is persistent
+        /// </summary>
+        public MsgDeliveryMode NMSDeliveryMode
+        {
+            get { return (persistent ? MsgDeliveryMode.Persistent : MsgDeliveryMode.NonPersistent); }
+            set { persistent = (MsgDeliveryMode.Persistent == value); }
+        }
+
+        /// <summary>
+        /// The Priority on this message
+        /// </summary>
+        public MsgPriority NMSPriority
+        {
+            get { return (MsgPriority) priority; }
+            set { priority = (byte) value; }
+        }
+
+        /// <summary>
+        /// Returns true if this message has been redelivered to this or another consumer before being acknowledged successfully.
+        /// </summary>
+        public bool NMSRedelivered
+        {
+            get { return this.redelivered; }
+            set { this.redelivered = value; }
+        }
+
+        /// <summary>
+        /// The destination that the consumer of this message should send replies to
+        /// </summary>
+        public IDestination NMSReplyTo
+        {
+            get { return replyTo; }
+            set { replyTo = Destination.Transform(value); }
+        }
+
+        /// <summary>
+        /// The type name of this message
+        /// </summary>
+        public string NMSType
+        {
+            get { return type; }
+            set { type = value; }
+        }
+
+        #endregion
+
+        #region NMS Extension headers
+
+        /// <summary>
+        /// Returns the number of times this message has been redelivered to other consumers without being acknowledged successfully.
+        /// </summary>
+        public int NMSXDeliveryCount
+        {
+            get { return 0; }
+        }
+
+        /// <summary>
+        /// The Message Group ID used to group messages together to the same consumer for the same group ID value
+        /// </summary>
+        public string NMSXGroupID
+        {
+            get { return groupID; }
+            set { groupID = value; }
+        }
+        /// <summary>
+        /// The Message Group Sequence counter to indicate the position in a group
+        /// </summary>
+        public int NMSXGroupSeq
+        {
+            get { return groupSequence; }
+            set { groupSequence = value; }
+        }
+
+        /// <summary>
+        /// Returns the ID of the producers transaction
+        /// </summary>
+        public string NMSXProducerTXID
+        {
+            get
+            {
+                if(null != transactionId)
+                {
+                    return transactionId;
+                }
+
+                return String.Empty;
+            }
+        }
+
+        #endregion
+
+    };
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/ObjectMessage.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/ObjectMessage.cs b/src/test/csharp/Commands/ObjectMessage.cs
new file mode 100644
index 0000000..ba68ee0
--- /dev/null
+++ b/src/test/csharp/Commands/ObjectMessage.cs
@@ -0,0 +1,44 @@
+/*
+* 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.IO;
+
+using Apache.NMS;
+
+namespace Apache.NMS.Commands
+{
+    public class ObjectMessage : Message, IObjectMessage
+    {
+        private object body;
+
+        public override string ToString() {
+            return GetType().Name + "["
+                + " ]";
+        }
+
+        // Properties
+
+        public object Body
+        {
+            get { return body; }
+            set { body = value; }
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/Queue.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/Queue.cs b/src/test/csharp/Commands/Queue.cs
new file mode 100644
index 0000000..c0dd5f9
--- /dev/null
+++ b/src/test/csharp/Commands/Queue.cs
@@ -0,0 +1,75 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Commands
+{
+    /// <summary>
+    /// Summary description for Queue.
+    /// </summary>
+    public class Queue : Destination, IQueue
+    {
+        public Queue()
+            : base()
+        {
+        }
+
+        public Queue(String name)
+            : base(name)
+        {
+        }
+
+        override public DestinationType DestinationType
+        {
+            get
+            {
+                return DestinationType.Queue;
+            }
+        }
+
+        public String QueueName
+        {
+            get { return PhysicalName; }
+        }
+
+        public override int GetDestinationType()
+        {
+            return QUEUE;
+        }
+
+        public override Destination CreateDestination(String name)
+        {
+            return new Queue(name);
+        }
+
+        public override Object Clone()
+        {
+            // Since we are a derived class use the base's Clone()
+            // to perform the shallow copy. Since it is shallow it
+            // will include our derived class. Since we are derived,
+            // this method is an override.
+            Queue o = (Queue) base.Clone();
+
+            // Now do the deep work required
+            // If any new variables are added then this routine will
+            // likely need updating
+
+            return o;
+        }
+    }
+}
+


[07/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/XMSConvert.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/XMSConvert.cs b/src/main/csharp/Util/XMSConvert.cs
new file mode 100644
index 0000000..06d8e2c
--- /dev/null
+++ b/src/main/csharp/Util/XMSConvert.cs
@@ -0,0 +1,1475 @@
+/*
+ * 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 IBM.XMS;
+
+namespace Apache.NMS.XMS.Util
+{
+	/// <summary>
+	/// This class implements conversion methods between the IBM XMS and
+	/// the Apache NMS models.
+	/// </summary>
+	public class XMSConvert
+	{
+		#region IBM XMS to Apache NMS objects conversion
+
+		/// <summary>
+		/// Converts an IBM XMS connection interface
+		/// into an NMS connection interface.
+		/// </summary>
+		/// <param name="xmsConnection">IBM XMS connection interface.</param>
+		/// <returns>Apache NMS connection interface.</returns>
+		public static Apache.NMS.IConnection ToNMSConnection(
+			IBM.XMS.IConnection xmsConnection)
+		{
+			return (xmsConnection != null
+				? new Apache.NMS.XMS.Connection(xmsConnection)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS session interface
+		/// into an NMS session interface.
+		/// </summary>
+		/// <param name="xmsSession">IBM XMS session interface.</param>
+		/// <returns>Apache NMS session interface.</returns>
+		public static Apache.NMS.ISession ToNMSSession(
+			IBM.XMS.ISession xmsSession)
+		{
+			return (xmsSession != null
+				? new Apache.NMS.XMS.Session(xmsSession)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS destination interface
+		/// into an NMS destination interface.
+		/// </summary>
+		/// <param name="xmsDestination">XMS destination.</param>
+		/// <returns>Apache NMS destination interface.</returns>
+		public static Apache.NMS.IDestination ToNMSDestination(
+				IBM.XMS.IDestination xmsDestination)
+		{
+			return ToNMSDestination(xmsDestination, false);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS destination interface
+		/// into an NMS destination interface.
+		/// </summary>
+		/// <param name="xmsDestination">XMS destination.</param>
+		/// <param name="isTemporary">Destination is temporary.</param>
+		/// <returns>Apache NMS destination interface.</returns>
+		public static Apache.NMS.IDestination ToNMSDestination(
+				IBM.XMS.IDestination xmsDestination,
+				bool isTemporary)
+		{
+			if(xmsDestination.TypeId == IBM.XMS.DestinationType.Queue)
+			{
+				return (isTemporary ? ToNMSTemporaryQueue(xmsDestination)
+									: ToNMSQueue(xmsDestination));
+			}
+
+			if(xmsDestination.TypeId == IBM.XMS.DestinationType.Topic)
+			{
+				return (isTemporary ? ToNMSTemporaryTopic(xmsDestination)
+									: ToNMSTopic(xmsDestination));
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS queue interface
+		/// into an NMS queue interface.
+		/// </summary>
+		/// <param name="xmsQueue">XMS destination of type
+		/// <c>DestinationType.Queue</c>.</param>
+		/// <returns>Apache NMS queue interface.</returns>
+		public static Apache.NMS.IQueue ToNMSQueue(
+			IBM.XMS.IDestination xmsQueue)
+		{
+			if((xmsQueue != null) &&
+			(xmsQueue.TypeId != IBM.XMS.DestinationType.Queue))
+			{ throw new ArgumentException(
+				"Cannot convert IBM XMS destination to NMS destination: invalid destination type id.",
+				"xmsQueue");
+			}
+			return (xmsQueue != null
+				? new Apache.NMS.XMS.Queue(xmsQueue)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS topic interface
+		/// into an NMS topic interface.
+		/// </summary>
+		/// <param name="xmsTopic">XMS destination of type
+		/// <c>DestinationType.Topic</c>.</param>
+		/// <returns>Apache NMS topic interface.</returns>
+		public static Apache.NMS.ITopic ToNMSTopic(
+			IBM.XMS.IDestination xmsTopic)
+		{
+			if((xmsTopic != null) &&
+			(xmsTopic.TypeId != IBM.XMS.DestinationType.Topic))
+			{ throw new ArgumentException(
+				"Cannot convert IBM XMS destination to NMS destination: invalid destination type id.",
+				"xmsTopic");
+			}
+			return (xmsTopic != null
+				? new Apache.NMS.XMS.Topic(xmsTopic)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS temporary queue interface
+		/// into an NMS temporary queue interface.
+		/// </summary>
+		/// <param name="xmsTemporaryQueue">XMS destination of type
+		/// <c>DestinationType.Queue</c>.</param>
+		/// <returns>Apache NMS temporary queue interface.</returns>
+		// Couldn't find a means to test whether a XMS destination is temporary.
+		public static Apache.NMS.ITemporaryQueue ToNMSTemporaryQueue(
+			IBM.XMS.IDestination xmsTemporaryQueue)
+		{
+			if((xmsTemporaryQueue != null) &&
+			(xmsTemporaryQueue.TypeId != IBM.XMS.DestinationType.Queue))
+			{ throw new ArgumentException(
+				"Cannot convert IBM XMS destination to NMS destination: invalid destination type id.",
+				"xmsTemporaryQueue");
+			}
+			return (xmsTemporaryQueue != null
+				? new Apache.NMS.XMS.TemporaryQueue(xmsTemporaryQueue)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS temporary topic interface
+		/// into an NMS temporary topic interface.
+		/// </summary>
+		/// <param name="xmsTemporaryTopic">XMS destination of type
+		/// <c>DestinationType.Topic</c>.</param>
+		/// <returns>Apache NMS temporary topic interface.</returns>
+		// Couldn't find a means to test whether a XMS destination is temporary.
+		public static Apache.NMS.ITemporaryTopic ToNMSTemporaryTopic(
+			IBM.XMS.IDestination xmsTemporaryTopic)
+		{
+			if((xmsTemporaryTopic != null) &&
+			(xmsTemporaryTopic.TypeId != IBM.XMS.DestinationType.Queue))
+			{ throw new ArgumentException(
+				"Cannot convert IBM XMS destination to NMS destination: invalid destination type id.",
+				"xmsTemporaryTopic");
+			}
+			return (xmsTemporaryTopic != null
+				? new Apache.NMS.XMS.TemporaryTopic(xmsTemporaryTopic)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS message producer interface
+		/// into an NMS message producer interface.
+		/// </summary>
+		/// <param name="session">NMS session.</param>
+		/// <param name="xmsMessageProducer">XMS message producer.</param>
+		/// <returns>Apache NMS message producer interface.</returns>
+		public static Apache.NMS.IMessageProducer ToNMSMessageProducer(
+			Apache.NMS.XMS.Session session,
+			IBM.XMS.IMessageProducer xmsMessageProducer)
+		{
+			return (xmsMessageProducer != null
+				? new Apache.NMS.XMS.MessageProducer(session, xmsMessageProducer)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS message consumer interface
+		/// into an NMS message consumer interface.
+		/// </summary>
+		/// <param name="session">NMS session.</param>
+		/// <param name="xmsMessageConsumer">XMS message consumer.</param>
+		/// <returns>Apache NMS message consumer interface.</returns>
+		public static Apache.NMS.IMessageConsumer ToNMSMessageConsumer(
+			Apache.NMS.XMS.Session session,
+			IBM.XMS.IMessageConsumer xmsMessageConsumer)
+		{
+			return (xmsMessageConsumer != null
+				? new Apache.NMS.XMS.MessageConsumer(session, xmsMessageConsumer)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS queue browser interface
+		/// into an NMS queue browser interface.
+		/// </summary>
+		/// <param name="xmsQueueBrowser">XMS queue browser.</param>
+		/// <returns>Apache NMS queue browser interface.</returns>
+		public static Apache.NMS.IQueueBrowser ToNMSQueueBrowser(
+			IBM.XMS.IQueueBrowser xmsQueueBrowser)
+		{
+			return (xmsQueueBrowser != null
+				? new Apache.NMS.XMS.QueueBrowser(xmsQueueBrowser)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS message
+		/// into an NMS message.
+		/// </summary>
+		/// <param name="xmsMessage">IBM XMS message.</param>
+		/// <returns>NMS message.</returns>
+		public static Apache.NMS.IMessage ToNMSMessage(IBM.XMS.IMessage xmsMessage)
+		{
+			if(xmsMessage is IBM.XMS.ITextMessage)
+			{
+				return ToNMSTextMessage((IBM.XMS.ITextMessage)xmsMessage);
+			}
+
+			if(xmsMessage is IBM.XMS.IBytesMessage)
+			{
+				return ToNMSBytesMessage((IBM.XMS.IBytesMessage)xmsMessage);
+			}
+
+			if(xmsMessage is IBM.XMS.IStreamMessage)
+			{
+				return ToNMSStreamMessage((IBM.XMS.IStreamMessage)xmsMessage);
+			}
+
+			if(xmsMessage is IBM.XMS.IMapMessage)
+			{
+				return ToNMSMapMessage((IBM.XMS.IMapMessage)xmsMessage);
+			}
+
+			if(xmsMessage is IBM.XMS.IObjectMessage)
+			{
+				return ToNMSObjectMessage((IBM.XMS.IObjectMessage)xmsMessage);
+			}
+
+			return (xmsMessage != null
+				? new Apache.NMS.XMS.Message(xmsMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS text message
+		/// into an NMS text message.
+		/// </summary>
+		/// <param name="xmsTextMessage">IBM XMS text message.</param>
+		/// <returns>NMS text message.</returns>
+		public static Apache.NMS.ITextMessage ToNMSTextMessage(
+			IBM.XMS.ITextMessage xmsTextMessage)
+		{
+			return (xmsTextMessage != null
+				? new Apache.NMS.XMS.TextMessage(xmsTextMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS bytes message
+		/// into an NMS bytes message.
+		/// </summary>
+		/// <param name="xmsBytesMessage">IBM XMS bytes message.</param>
+		/// <returns>NMS bytes message.</returns>
+		public static Apache.NMS.IBytesMessage ToNMSBytesMessage(
+			IBM.XMS.IBytesMessage xmsBytesMessage)
+		{
+			return (xmsBytesMessage != null
+				? new Apache.NMS.XMS.BytesMessage(xmsBytesMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS stream message
+		/// into an NMS stream message.
+		/// </summary>
+		/// <param name="xmsStreamMessage">IBM XMS stream message.</param>
+		/// <returns>NMS stream message.</returns>
+		public static Apache.NMS.IStreamMessage ToNMSStreamMessage(
+			IBM.XMS.IStreamMessage xmsStreamMessage)
+		{
+			return (xmsStreamMessage != null
+				? new Apache.NMS.XMS.StreamMessage(xmsStreamMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS map message
+		/// into an NMS map message.
+		/// </summary>
+		/// <param name="xmsMapMessage">IBM XMS map message.</param>
+		/// <returns>NMS map message.</returns>
+		public static Apache.NMS.IMapMessage ToNMSMapMessage(
+			IBM.XMS.IMapMessage xmsMapMessage)
+		{
+			return (xmsMapMessage != null
+				? new Apache.NMS.XMS.MapMessage(xmsMapMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS object message
+		/// into an NMS object message.
+		/// </summary>
+		/// <param name="xmsObjectMessage">IBM XMS object message.</param>
+		/// <returns>NMS object message.</returns>
+		public static Apache.NMS.IObjectMessage ToNMSObjectMessage(
+			IBM.XMS.IObjectMessage xmsObjectMessage)
+		{
+			return (xmsObjectMessage != null
+				? new Apache.NMS.XMS.ObjectMessage(xmsObjectMessage)
+				: null);
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS message
+		/// into an NMS primitive map.
+		/// </summary>
+		/// <param name="xmsMessage">IBM XMS message.</param>
+		/// <returns>NMS primitive map.</returns>
+		public static Apache.NMS.IPrimitiveMap ToMessageProperties(
+			IBM.XMS.IMessage xmsMessage)
+		{
+			return (xmsMessage != null
+				? new Apache.NMS.XMS.MessageProperties(xmsMessage)
+				: null);
+		}
+
+		#endregion
+
+		#region Apache NMS to IBM XMS objects conversion
+
+		/// <summary>
+		/// Converts an NMS destination
+		/// into an IBM XMS destination.
+		/// </summary>
+		/// <param name="nmsDestination">NMS destination.</param>
+		/// <returns>IBM XMS destination.</returns>
+		public static IBM.XMS.IDestination ToXMSDestination(
+			Apache.NMS.IDestination nmsDestination)
+		{
+			if(nmsDestination is Apache.NMS.XMS.Destination)
+			{
+				return ((Apache.NMS.XMS.Destination)nmsDestination).xmsDestination;
+			}
+			return null;
+		}
+
+		#endregion
+
+		#region Property values conversion
+
+		#region Exception handling
+
+		/// <summary>
+		/// Throws a conversion exception.
+		/// </summary>
+		private static void ThrowCantConvertValueException(object value,
+					string conversionMethod)
+		{
+			throw new ArgumentException(string.Format(
+				"Cannot convert {0} using {1}.", value, conversionMethod),
+				conversionMethod);
+		}
+
+		#endregion
+
+		#region Encoding
+
+		/// <summary>
+		/// Converts an XMS encoding key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Encoding ToEncoding(Int32 inputValue)
+		{
+			return (Encoding)inputValue;
+		}
+
+		/// <summary>
+		/// Converts an encoding to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSEncoding(Encoding inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Message Type
+
+		/// <summary>
+		/// Converts an XMS message type key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static MessageType ToMessageType(Int32 inputValue)
+		{
+			return (MessageType)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a message type to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMessageType(MessageType inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Confirm On Arrival
+
+		/// <summary>
+		/// Converts an XMS "confirm on arrival" key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportConfirmOnArrival ToReportConfirmOnArrival(
+			Int32 inputValue)
+		{
+			return (ReportConfirmOnArrival)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "confirm on arrival" to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportConfirmOnArrival(
+			ReportConfirmOnArrival inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Confirm On Delivery
+
+		/// <summary>
+		/// Converts an XMS "confirm on delivery" key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportConfirmOnDelivery ToReportConfirmOnDelivery(
+			Int32 inputValue)
+		{
+			return (ReportConfirmOnDelivery)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "confirm on delivery" to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportConfirmOnDelivery(
+			ReportConfirmOnDelivery inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Exception
+
+		/// <summary>
+		/// Converts an XMS "report exceptions" key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportExceptions ToReportExceptions(
+			Int32 inputValue)
+		{
+			return (ReportExceptions)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "report exceptions" to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportExceptions(
+			ReportExceptions inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Expiration
+
+		/// <summary>
+		/// Converts an XMS "report expiration" key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportExpiration ToReportExpiration(
+			Int32 inputValue)
+		{
+			return (ReportExpiration)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "report expiration" to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportExpiration(
+			ReportExpiration inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Correlation Id
+
+		/// <summary>
+		/// Converts an XMS "report correlation id." key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportCorrelationId ToReportCorrelationId(
+			Int32 inputValue)
+		{
+			return (ReportCorrelationId)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "report correlation id." to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportCorrelationId(
+			ReportCorrelationId inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Report Message Id
+
+		/// <summary>
+		/// Converts an XMS "report message id." key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReportMessageId ToReportMessageId(
+			Int32 inputValue)
+		{
+			return (ReportMessageId)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a "report message id." to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReportMessageId(
+			ReportMessageId inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Asynchronous Exceptions
+
+		/// <summary>
+		/// Converts an XMS asynchronous exceptions handling directive key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static AsynchronousExceptions ToAsynchronousExceptions(
+			Int32 inputValue)
+		{
+			return (AsynchronousExceptions)inputValue;
+		}
+
+		/// <summary>
+		/// Converts an asynchronous exceptions handling directive to the
+		/// equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSAsynchronousExceptions(
+			AsynchronousExceptions inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Connection Type
+
+		/// <summary>
+		/// Converts an XMS connection type key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ConnectionType ToConnectionType(Int32 inputValue)
+		{
+			return (ConnectionType)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a connection type to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSConnectionType(ConnectionType inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Delivery Mode
+
+		/// <summary>
+		/// Converts an XMS delivery mode key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static DeliveryMode ToDeliveryMode(Int32 inputValue)
+		{
+			return (DeliveryMode)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a delivery mode to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSDeliveryMode(DeliveryMode inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Priority
+
+		/// <summary>
+		/// Converts an XMS priority key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Priority ToPriority(Int32 inputValue)
+		{
+			return (Priority)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a priority to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSPriority(Priority inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Connection Protocol (RTT)
+
+		/// <summary>
+		/// Converts an RTT connection protocol key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static RTTConnectionProtocol ToRTTConnectionProtocol(
+			Int32 inputValue)
+		{
+			return (RTTConnectionProtocol)inputValue;
+		}
+
+		/// <summary>
+		/// Converts an RTT connection protocol to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSRTTConnectionProtocol(
+			RTTConnectionProtocol inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Multicast (RTT)
+
+		/// <summary>
+		/// Converts an RTT multicast state key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Multicast ToMulticast(Int32 inputValue)
+		{
+			return (Multicast)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a multicast state to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMulticast(Multicast inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Broker Version (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ broker version key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static BrokerVersion ToBrokerVersion(Int32 inputValue)
+		{
+			return (BrokerVersion)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a broker version to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSBrokerVersion(BrokerVersion inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Reconnect Options (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ reconnect option key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReconnectOptions ToReconnectOptions(Int32 inputValue)
+		{
+			return (ReconnectOptions)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a reconnect option to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReconnectOptions(ReconnectOptions inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Connection Mode (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ connection mode key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ConnectionMode ToConnectionMode(Int32 inputValue)
+		{
+			return (ConnectionMode)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a connection mode to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSConnectionMode(ConnectionMode inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Fail If Quiesce (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ yes/no key to the equivalent boolean.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static bool ToFailIfQuiesce(Int32 inputValue)
+		{
+			switch(inputValue)
+			{
+				case XMSC.WMQ_FIQ_YES: return true;
+				case XMSC.WMQ_FIQ_NO : return false;
+				default:
+					ThrowCantConvertValueException(inputValue, "ToFailIfQuiesce");
+					return false;
+
+			}
+		}
+
+		/// <summary>
+		/// Converts a WMQ boolean to the equivalent XMS yes/no value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSFailIfQuiesce(bool inputValue)
+		{
+			return inputValue ? XMSC.WMQ_FIQ_YES : XMSC.WMQ_FIQ_NO;
+		}
+
+		#endregion
+
+		#region Message Body (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ message body key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static MessageBody ToMessageBody(Int32 inputValue)
+		{
+			return (MessageBody)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a message body to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMessageBody(MessageBody inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Message Context (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ message context key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static MessageContext ToMessageContext(Int32 inputValue)
+		{
+			return (MessageContext)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a message context to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMessageContext(MessageContext inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region MQMD Read Enabled (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ yes/no key to the equivalent boolean.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static bool ToMQMDReadEnabled(Int32 inputValue)
+		{
+			return (inputValue != 0);
+			//switch(inputValue)
+			//{
+			//case XMSC.WMQ_READ_ENABLED_YES: return true;
+			//case XMSC.WMQ_READ_ENABLED_NO : return false;
+			//default:
+			//	ThrowCantConvertValueException(inputValue, "ToMQMDReadEnabled");
+			//	return false;
+			//}
+		}
+
+		/// <summary>
+		/// Converts a WMQ boolean to the equivalent XMS yes/no value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMQMDReadEnabled(bool inputValue)
+		{
+			return inputValue ? 1 : 0;
+			//	XMSC.WMQ_READ_ENABLED_YES : XMSC.WMQ_READ_ENABLED_NO;
+		}
+
+		#endregion
+
+		#region MQMD Write Enabled (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ yes/no key to the equivalent boolean.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static bool ToMQMDWriteEnabled(Int32 inputValue)
+		{
+			return (inputValue != 0);
+			//switch(inputValue)
+			//{
+			//case XMSC.WMQ_WRITE_ENABLED_YES: return true;
+			//case XMSC.WMQ_WRITE_ENABLED_NO : return false;
+			//default:
+			//	ThrowCantConvertValueException(inputValue, "ToMQMDWriteEnabled");
+			//	return false;
+			//}
+		}
+
+		/// <summary>
+		/// Converts a WMQ boolean to the equivalent XMS yes/no value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMQMDWriteEnabled(bool inputValue)
+		{
+			return inputValue ? 1 : 0;
+			//	XMSC.WMQ_WRITE_ENABLED_YES : XMSC.WMQ_WRITE_ENABLED_NO;
+		}
+
+		#endregion
+
+		#region Asynchronous Puts Allowed (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ asynchronous puts allowed key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static AsynchronousPutsAllowed ToAsynchronousPutsAllowed(
+			Int32 inputValue)
+		{
+			return (AsynchronousPutsAllowed)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ asynchronous puts allowed to the equivalent
+		/// XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSAsynchronousPutsAllowed(
+			AsynchronousPutsAllowed inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Read Ahead Allowed (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ read ahead allowed key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReadAheadAllowed ToReadAheadAllowed(
+			Int32 inputValue)
+		{
+			return (ReadAheadAllowed)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ read ahead allowed to the equivalent
+		/// XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReadAheadAllowed(
+			ReadAheadAllowed inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Read Ahead Close Policy (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ read ahead close policy key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReadAheadClosePolicy ToReadAheadClosePolicy(
+			Int32 inputValue)
+		{
+			return (ReadAheadClosePolicy)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ read ahead close policy to the equivalent
+		/// XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReadAheadClosePolicy(
+			ReadAheadClosePolicy inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Message Selection (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ message selection key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static MessageSelection ToMessageSelection(Int32 inputValue)
+		{
+			return (MessageSelection)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ message selection to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMessageSelection(MessageSelection inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Receive Conversion (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ receive conversion key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ReceiveConversion ToReceiveConversion(Int32 inputValue)
+		{
+			return (ReceiveConversion)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ receive conversion to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSReceiveConversion(ReceiveConversion inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Share Socket Allowed (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ yes/no key to the equivalent boolean.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static bool ToShareSocketAllowed(Int32 inputValue)
+		{
+			switch(inputValue)
+			{
+			case XMSC.WMQ_SHARE_CONV_ALLOWED_YES: return true;
+			case XMSC.WMQ_SHARE_CONV_ALLOWED_NO : return false;
+			default:
+				ThrowCantConvertValueException(inputValue, "ShareSocketAllowed");
+				return false;
+			}
+		}
+
+		/// <summary>
+		/// Converts a WMQ boolean to the equivalent XMS yes/no value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSShareSocketAllowed(bool inputValue)
+		{
+			return inputValue
+				? XMSC.WMQ_SHARE_CONV_ALLOWED_YES
+				: XMSC.WMQ_SHARE_CONV_ALLOWED_NO;
+		}
+
+		#endregion
+
+		#region Target Client (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ target client key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static TargetClient ToTargetClient(Int32 inputValue)
+		{
+			return (TargetClient)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ target client to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSTargetClient(TargetClient inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Wildcard Format (WMQ)
+
+		/// <summary>
+		/// Converts a WMQ wildcard format key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static WildcardFormat ToWildcardFormat(Int32 inputValue)
+		{
+			return (WildcardFormat)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WMQ wildcard format to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSWildcardFormat(WildcardFormat inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Connection Protocol (WPM)
+
+		/// <summary>
+		/// Converts a WPM connection protocol key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static WPMConnectionProtocol ToWPMConnectionProtocol(
+			Int32 inputValue)
+		{
+			return (WPMConnectionProtocol)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WPM connection protocol to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSWPMConnectionProtocol(
+			WPMConnectionProtocol inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Connection Proximity (WPM)
+
+		/// <summary>
+		/// Converts a WPM connection proximity key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static ConnectionProximity ToConnectionProximity(
+			Int32 inputValue)
+		{
+			return (ConnectionProximity)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WPM connection proximity to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSConnectionProximity(
+			ConnectionProximity inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Mapping (WPM)
+
+		/// <summary>
+		/// Converts a WPM mapping key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Mapping ToMapping(Int32 inputValue)
+		{
+			return (Mapping)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WPM mapping to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSMapping(Mapping inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Target Significance (WPM)
+
+		/// <summary>
+		/// Converts a WPM target significance key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static TargetSignificance ToTargetSignificance(
+			Int32 inputValue)
+		{
+			return (TargetSignificance)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WPM target significance to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSTargetSignificance(
+			TargetSignificance inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#region Target Type (WPM)
+
+		/// <summary>
+		/// Converts a WPM target type key.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static TargetType ToTargetType(Int32 inputValue)
+		{
+			return (TargetType)inputValue;
+		}
+
+		/// <summary>
+		/// Converts a WPM target type to the equivalent XMS value.
+		/// </summary>
+		/// <param name="inputValue">Input value.</param>
+		/// <returns>Converted value.</returns>
+		public static Int32 ToXMSTargetType(TargetType inputValue)
+		{
+			return (Int32)inputValue;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region IBM XMS to Apache NMS enumerations conversion
+
+		/// <summary>
+		/// Converts an IBM XMS destination type
+		/// to the equivalent NMS value.
+		/// </summary>
+		/// <param name="xmsDestinationType">XMS destination type.</param>
+		/// <param name="isTemporary">Whether the destination is temporary.
+		/// </param>
+		/// <returns>NMS destination type.</returns>
+		public static DestinationType ToDestinationType(
+			IBM.XMS.DestinationType xmsDestinationType, bool isTemporary)
+		{
+			switch(xmsDestinationType)
+			{
+			case IBM.XMS.DestinationType.Queue:
+				return(isTemporary
+					? DestinationType.TemporaryQueue
+					: DestinationType.Queue);
+
+			case IBM.XMS.DestinationType.Topic:
+				return(isTemporary
+					? DestinationType.TemporaryTopic
+					: DestinationType.Queue);
+
+			default:
+				ThrowCantConvertValueException(
+					xmsDestinationType.ToString(),
+					"ToDestinationType");
+				return DestinationType.Queue;
+			}
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS acknowledgement mode
+		/// to the equivalent NMS value.
+		/// </summary>
+		/// <param name="acknowledgeMode">XMS acknowledgement mode.</param>
+		/// <returns>NMS acknowledgement mode.</returns>
+		public static Apache.NMS.AcknowledgementMode ToAcknowledgementMode(
+			IBM.XMS.AcknowledgeMode acknowledgeMode)
+		{
+			Apache.NMS.AcknowledgementMode acknowledge =
+				Apache.NMS.AcknowledgementMode.AutoAcknowledge;
+
+			switch(acknowledgeMode)
+			{
+			case IBM.XMS.AcknowledgeMode.AutoAcknowledge:
+				acknowledge = Apache.NMS.AcknowledgementMode.AutoAcknowledge;
+				break;
+
+			case IBM.XMS.AcknowledgeMode.ClientAcknowledge:
+				acknowledge = Apache.NMS.AcknowledgementMode.ClientAcknowledge;
+				break;
+
+			case IBM.XMS.AcknowledgeMode.DupsOkAcknowledge:
+				acknowledge = Apache.NMS.AcknowledgementMode.DupsOkAcknowledge;
+				break;
+
+			case IBM.XMS.AcknowledgeMode.SessionTransacted:
+				acknowledge = Apache.NMS.AcknowledgementMode.Transactional;
+				break;
+			}
+
+			return acknowledge;
+		}
+
+		/// <summary>
+		/// Converts an IBM XMS delivery mode
+		/// to the equivalent NMS value.
+		/// </summary>
+		/// <param name="deliveryMode">XMS delivery mode.</param>
+		/// <returns>NMS delivery mode.</returns>
+		public static MsgDeliveryMode ToNMSMsgDeliveryMode(
+			IBM.XMS.DeliveryMode deliveryMode)
+		{
+			if(deliveryMode == IBM.XMS.DeliveryMode.Persistent)
+			{
+				return MsgDeliveryMode.Persistent;
+			}
+
+			if(deliveryMode == IBM.XMS.DeliveryMode.NonPersistent)
+			{
+				return MsgDeliveryMode.NonPersistent;
+			}
+
+			// Hard cast it to the enumeration.
+			return (MsgDeliveryMode) deliveryMode;
+		}
+
+		#endregion
+
+		#region Apache NMS to IBM XMS enumerations conversion
+
+		/// <summary>
+		/// Converts an NMS acknowledgement mode
+		/// to the equivalent IBM XMS value.
+		/// </summary>
+		/// <param name="acknowledge">NMS acknowledgement mode.</param>
+		/// <returns>IBM XMS acknowledgement mode.</returns>
+		public static IBM.XMS.AcknowledgeMode ToAcknowledgeMode(
+			Apache.NMS.AcknowledgementMode acknowledge)
+		{
+			IBM.XMS.AcknowledgeMode acknowledgeMode =
+				(IBM.XMS.AcknowledgeMode)0;
+
+			switch(acknowledge)
+			{
+			case Apache.NMS.AcknowledgementMode.AutoAcknowledge:
+				acknowledgeMode = IBM.XMS.AcknowledgeMode.AutoAcknowledge;
+				break;
+
+			case Apache.NMS.AcknowledgementMode.ClientAcknowledge:
+				acknowledgeMode = IBM.XMS.AcknowledgeMode.ClientAcknowledge;
+				break;
+
+			case Apache.NMS.AcknowledgementMode.DupsOkAcknowledge:
+				acknowledgeMode = IBM.XMS.AcknowledgeMode.DupsOkAcknowledge;
+				break;
+
+			case Apache.NMS.AcknowledgementMode.Transactional:
+				acknowledgeMode = IBM.XMS.AcknowledgeMode.SessionTransacted;
+				break;
+			}
+
+			return acknowledgeMode;
+		}
+
+		/// <summary>
+		/// Converts an NMS delivery mode
+		/// to the equivalent IBM XMS value.
+		/// </summary>
+		/// <param name="deliveryMode">NMS delivery mode.</param>
+		/// <returns>IBM XMS delivery mode.</returns>
+		public static IBM.XMS.DeliveryMode ToJMSDeliveryMode(
+			MsgDeliveryMode deliveryMode)
+		{
+			if(deliveryMode == MsgDeliveryMode.Persistent)
+			{
+				return IBM.XMS.DeliveryMode.Persistent;
+			}
+
+			if(deliveryMode == MsgDeliveryMode.NonPersistent)
+			{
+				return IBM.XMS.DeliveryMode.NonPersistent;
+			}
+
+			// Hard cast it to the enumeration.
+			return (IBM.XMS.DeliveryMode) deliveryMode;
+		}
+
+		#endregion
+
+		#region Enumerable adapter
+
+		private class EnumerableAdapter : IEnumerable
+		{
+			private readonly IEnumerator enumerator;
+			public EnumerableAdapter(IEnumerator _enumerator)
+			{
+				this.enumerator = _enumerator;
+			}
+
+			public IEnumerator GetEnumerator()
+			{
+				return this.enumerator;
+			}
+		}
+
+		public static IEnumerable ToEnumerable(IEnumerator enumerator)
+		{
+			return new EnumerableAdapter(enumerator);
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/XMSEnum.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/XMSEnum.cs b/src/main/csharp/Util/XMSEnum.cs
new file mode 100644
index 0000000..6a95cef
--- /dev/null
+++ b/src/main/csharp/Util/XMSEnum.cs
@@ -0,0 +1,1167 @@
+/*
+ * 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 IBM.XMS;
+
+namespace Apache.NMS.XMS.Util
+{
+
+#region Encoding (IBM JMS)*
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_encoding.htm?lang=en
+/// <summary>
+/// How numerical data in the body of the message is represented when the XMS
+/// client forwards the message to its intended destination.
+/// </summary>
+public enum Encoding
+{
+	/// <summary>
+	/// Normal integer encoding.
+	/// </summary>
+	IntegerNormal = MQC.MQENC_INTEGER_NORMAL,
+
+	/// <summary>
+	/// Reversed integer encoding.
+	/// </summary>
+	IntegerReversed = MQC.MQENC_INTEGER_REVERSED,
+
+	/// <summary>
+	/// Normal packed decimal encoding.
+	/// </summary>
+	DecimalNormal = MQC.MQENC_DECIMAL_NORMAL,
+
+	/// <summary>
+	/// Reversed packed decimal encoding.
+	/// </summary>
+	DecimalReversed = MQC.MQENC_DECIMAL_REVERSED,
+
+	/// <summary>
+	/// Normal IEEE floating point encoding.
+	/// </summary>
+	FloatIEEENormal = MQC.MQENC_FLOAT_IEEE_NORMAL,
+
+	/// <summary>
+	/// Reversed IEEE floating point encoding.
+	/// </summary>
+	FloatIEEEReversed = MQC.MQENC_FLOAT_IEEE_REVERSED,
+
+	/// <summary>
+	/// z/OS� architecture floating point encoding.
+	/// </summary>
+	FloatS390 = MQC.MQENC_FLOAT_S390,
+
+	/// <summary>
+	/// Native machine encoding.
+	/// </summary>
+	Native = MQC.MQENC_NATIVE
+}
+
+#endregion
+
+#region Message Type (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_msgtype.htm?lang=en
+/// <summary>
+/// Message type.
+/// </summary>
+public enum MessageType
+{
+	/// <summary>
+	/// The message is one that does not require a reply.
+	/// </summary>
+	Datagram = MQC.MQMT_DATAGRAM,
+
+	/// <summary>
+	/// The message is one that requires a reply.
+	/// </summary>
+	Request = MQC.MQMT_REQUEST,
+
+	/// <summary>
+	/// The message is a reply message.
+	/// </summary>
+	Reply = MQC.MQMT_REPLY,
+
+	/// <summary>
+	/// The message is a report message.
+	/// </summary>
+	Report = MQC.MQMT_REPORT
+}
+
+#endregion
+
+#region Report Confirm On Arrival (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_coa.htm?lang=en
+/// <summary>
+/// Request 'confirm on arrival' report messages, specifying how much
+/// application data from the original message must be included in a
+/// report message.
+/// </summary>
+public enum ReportConfirmOnArrival
+{
+	/// <summary>
+	/// Request 'confirm on arrival' report messages, with no application
+	/// data from the original message included in a report message.
+	/// </summary>
+	NoData = MQC.MQRO_COA,
+
+	/// <summary>
+	/// Request 'confirm on arrival' report messages, with the first 100 bytes
+	/// of application data from the original message included in a report
+	/// message.
+	/// </summary>
+	PartialData = MQC.MQRO_COA_WITH_DATA,
+
+	/// <summary>
+	/// Request 'confirm on arrival' report messages, with all the application
+	/// data from the original message included in a report message.
+	/// </summary>
+	FullData = MQC.MQRO_COA_WITH_FULL_DATA
+}
+
+#endregion
+
+#region Report Confirm On Delivery (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_cod.htm?lang=en
+/// <summary>
+/// Request 'confirm on delivery' report messages, specifying how much
+/// application data from the original message must be included in a
+/// report message.
+/// </summary>
+public enum ReportConfirmOnDelivery
+{
+	/// <summary>
+	/// Request 'confirm on delivery' report messages, with no application
+	/// data from the original message included in a report message.
+	/// </summary>
+	NoData = MQC.MQRO_COD,
+
+	/// <summary>
+	/// Request 'confirm on delivery' report messages, with the first 100 bytes
+	/// of application data from the original message included in a report
+	/// message.
+	/// </summary>
+	PartialData = MQC.MQRO_COD_WITH_DATA,
+
+	/// <summary>
+	/// Request 'confirm on delivery' report messages, with all the application
+	/// data from the original message included in a report message.
+	/// </summary>
+	FullData = MQC.MQRO_COD_WITH_FULL_DATA
+}
+
+#endregion
+
+#region Report Exception (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_excpt.htm?lang=en
+/// <summary>
+/// Request exception report messages, specifying how much application data
+/// from the original message must be included in a report message.
+/// </summary>
+public enum ReportExceptions
+{
+	/// <summary>
+	/// Request exception report messages, with no application data from the
+	/// original message included in a report message.
+	/// </summary>
+	NoData = MQC.MQRO_COD,
+
+	/// <summary>
+	/// Request exception report messages, with the first 100 bytes of
+	/// application data from the original message included in a report
+	/// message.
+	/// </summary>
+	PartialData = MQC.MQRO_COD_WITH_DATA,
+
+	/// <summary>
+	/// Request exception report messages, with all the application data from
+	/// the original message included in a report message.
+	/// </summary>
+	FullData = MQC.MQRO_COD_WITH_FULL_DATA
+}
+
+#endregion
+
+#region Report Expiration (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_exprn.htm?lang=en
+/// <summary>
+/// Request expiration report messages, specifying how much application data
+/// from the original message must be included in a report message.
+/// </summary>
+public enum ReportExpiration
+{
+	/// <summary>
+	/// Request expiration report messages, with no application data from the
+	/// original message included in a report message.
+	/// </summary>
+	NoData = MQC.MQRO_EXPIRATION,
+
+	/// <summary>
+	/// Request expiration report messages, with the first 100 bytes of
+	/// application data from the original message included in a report
+	/// message.
+	/// </summary>
+	PartialData = MQC.MQRO_EXPIRATION_WITH_DATA,
+
+	/// <summary>
+	/// Request expiration report messages, with all the application data from
+	/// the original message included in a report message.
+	/// </summary>
+	FullData = MQC.MQRO_EXPIRATION_WITH_FULL_DATA
+}
+
+#endregion
+
+#region Report Correlation Id (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_pcid.htm?lang=en
+/// <summary>
+/// Request that the correlation identifier of any report or reply message
+/// is the same as the correlation identifier of the original message.
+/// </summary>
+public enum ReportCorrelationId
+{
+	/// <summary>
+	/// Request that the correlation identifier of any report or reply message
+	/// is the same as the correlation identifier of the original message.
+	/// </summary>
+	OriginalCorrelationId = MQC.MQRO_PASS_CORREL_ID,
+
+	/// <summary>
+	/// Request that the correlation identifier of any report or reply message
+	/// is the same as the message identifier of the original message.
+	/// </summary>
+	OriginalMessageId = MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID
+}
+
+#endregion
+
+#region Report Message Id (IBM JMS)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prp_jms_ibm_rep_pmid.htm?lang=en
+/// <summary>
+/// Request that the message identifier of any report or reply message is the
+/// same as the message identifier of the original message.
+/// </summary>
+public enum ReportMessageId
+{
+	/// <summary>
+	/// Request that the message identifier of any report or reply message is the same as the message identifier of the original message.
+	/// </summary>
+	OriginalMessageId = MQC.MQRO_PASS_MSG_ID,
+
+	/// <summary>
+	/// Request that a new message identifier is generated for each report or
+	/// reply message.
+	/// </summary>
+	NewMessageId = MQC.MQRO_NEW_MSG_ID
+}
+
+#endregion
+
+#region Asynchronous Exceptions
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_async_exceptions.htm?lang=en
+/// <summary>
+/// whether XMS informs an ExceptionListener only when a connection is broken,
+/// or when any exception occurs asynchronously to an XMS API call.
+/// </summary>
+public enum AsynchronousExceptions
+{
+	/// <summary>
+	/// Any exception detected asynchronously, outside the scope of a
+	/// synchronous API call, and all connection broken exceptions are sent
+	/// to the <c>ExceptionListener</c>.
+	/// </summary>
+	All = XMSC.ASYNC_EXCEPTIONS_ALL,
+
+	/// <summary>
+	/// Only exceptions indicating a broken connection are sent to the
+	/// <c>ExceptionListener</c>. Any other exceptions occurring during
+	/// asynchronous processing are not reported to the
+	/// <c>ExceptionListener</c>, and hence the application is not informed
+	/// of these exceptions.
+	/// </summary>
+	ConnectionBroken = XMSC.ASYNC_EXCEPTIONS_CONNECTIONBROKEN
+}
+
+#endregion
+
+#region Connection Type
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_connection_type.htm?lang=en
+/// <summary>
+/// The type of messaging server to which an application connects.
+/// </summary>
+public enum ConnectionType
+{
+	/// <summary>
+	/// A real-time connection to a broker.
+	/// </summary>
+	RTT = XMSC.CT_RTT,
+
+	/// <summary>
+	/// A connection to a WebSphere� MQ queue manager.
+	/// </summary>
+	WMQ = XMSC.CT_WMQ,
+
+	/// <summary>
+	/// A connection to a WebSphere service integration bus.
+	/// </summary>
+	WPM = XMSC.CT_WPM
+}
+
+#endregion
+
+#region Delivery Mode
+
+/// <summary>
+/// The delivery mode of messages sent to the destination.
+/// </summary>
+public enum DeliveryMode
+{
+	/// <summary>
+	/// A message sent to the destination is nonpersistent. The default
+	/// delivery mode of the message producer, or any delivery mode specified
+	/// on the Send call, is ignored. If the destination is a WebSphere MQ
+	/// queue, the value of the queue attribute <c>DefPersistence</c> is also
+	/// ignored.
+	/// </summary>
+	NotPersistent = XMSC.DELIVERY_NOT_PERSISTENT,
+
+	/// <summary>
+	/// A message sent to the destination is persistent. The default
+	/// delivery mode of the message producer, or any delivery mode specified
+	/// on the Send call, is ignored. If the destination is a WebSphere MQ
+	/// queue, the value of the queue attribute <c>DefPersistence</c> is also
+	/// ignored.
+	/// </summary>
+	Persistent = XMSC.DELIVERY_PERSISTENT,
+
+	/// <summary>
+	/// A message sent to the destination has the delivery mode specified on
+	/// the Send call. If the Send call specifies no delivery mode, the default
+	/// delivery mode of the message producer is used instead. If the
+	/// destination is a WebSphere MQ queue, the value of the queue attribute
+	/// <c>DefPersistence</c> is ignored.
+	/// </summary>
+	AsApplication = XMSC.DELIVERY_AS_APP,
+
+	/// <summary>
+	/// If the destination is a WebSphere MQ queue, a message put on the queue
+	/// has the delivery mode specified by the value of the queue attribute
+	/// <c>DefPersistence</c>. The default delivery mode of the message
+	/// producer, or any delivery mode specified on the Send call, is ignored.
+	/// </summary>
+	AsDestination = XMSC.DELIVERY_AS_DEST
+}
+
+#endregion
+
+#region Priority
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_priority.htm?lang=en
+/// <summary>
+/// The priority of messages sent to the destination.
+/// </summary>
+public enum Priority
+{
+	/// <summary>
+	/// Lowest message priority.
+	/// </summary>
+	Lowest = 0,
+
+	/// <summary>
+	/// Between Low and Lowest message priority.
+	/// </summary>
+	VeryLow = 1,
+
+	/// <summary>
+	/// Low message priority.
+	/// </summary>
+	Low = 2,
+
+	/// <summary>
+	/// Normal message priority.
+	/// </summary>
+	Normal = 5,
+
+	/// <summary>
+	/// Between High and Normal message priority.
+	/// </summary>
+	AboveNormal = 6,
+
+	/// <summary>
+	/// High message priority.
+	/// </summary>
+	High = 7,
+
+	/// <summary>
+	/// Between Highest and High message priority.
+	/// </summary>
+	VeryHigh = 8,
+
+	/// <summary>
+	/// Highest message priority.
+	/// </summary>
+	Highest = 9,
+
+	/// <summary>
+	/// A message sent to the destination has the priority specified on the
+	/// Send call. If the Send call specifies no priority, the default
+	/// priority of the message producer is used instead. If the destination
+	/// is a WebSphere MQ queue, the value of the queue attribute
+	/// <c>DefPriority</c> is ignored.
+	/// </summary>
+	AsApplication = XMSC.PRIORITY_AS_APP,
+
+	/// <summary>
+	/// If the destination is a WebSphere MQ queue, a message put on the
+	/// queue has the priority specified by the value of the queue attribute
+	/// <c>DefPriority</c>. The default priority of the message producer,
+	/// or any priority specified on the Send call, is ignored.
+	/// </summary>
+	AsDestination = XMSC.PRIORITY_AS_DEST
+}
+
+#endregion
+
+#region Connection Protocol (RTT)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_rtt_conn_prot.htm?lang=en
+/// <summary>
+/// The communications protocol used for a real-time connection to a broker.
+/// </summary>
+public enum RTTConnectionProtocol
+{
+	/// <summary>
+	/// Real-time connection to a broker over TCP/IP.
+	/// <c>ConnectionFactory</c> object.
+	/// </summary>
+	TCP = XMSC.RTT_CP_TCP
+}
+
+#endregion
+
+#region Multicast (RTT)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_rtt_multicast.htm?lang=en
+/// <summary>
+/// The multicast setting for a connection factory or destination. Only a
+/// destination that is a topic can have this property.
+/// An application uses this property to enable multicast in association with
+/// a real-time connection to a broker and, if multicast is enabled, to
+/// specify the precise way in which multicast is used to deliver messages
+/// from the broker to a message consumer. The property has no effect on how
+/// a message producer sends messages to the broker.
+/// </summary>
+public enum Multicast
+{
+	/// <summary>
+	/// Messages are not delivered to a message consumer using WebSphere� MQ
+	/// Multicast Transport. This value is the default value for a
+	/// <c>ConnectionFactory</c> object.
+	/// </summary>
+	Disabled = XMSC.RTT_MULTICAST_DISABLED,
+
+	/// <summary>
+	/// Messages are delivered to a message consumer according to the multicast
+	/// setting for the connection factory associated with the message consumer.
+	/// The multicast setting for the connection factory is noted at the time
+	/// that the connection is created. This value is valid only for a
+	/// <c>Destination</c> object, and is the default value for a
+	/// <c>Destination</c> object.
+	/// </summary>
+	AsConnectionFactory = XMSC.RTT_MULTICAST_ASCF,
+
+	/// <summary>
+	/// If the topic is configured for multicast in the broker, messages are
+	/// delivered to a message consumer using WebSphere MQ Multicast Transport.
+	/// A reliable quality of service is used if the topic is configured for
+	/// reliable multicast.
+	/// </summary>
+	Enabled = XMSC.RTT_MULTICAST_ENABLED,
+
+	/// <summary>
+	/// If the topic is configured for reliable multicast in the broker,
+	/// messages are delivered to a message consumer using WebSphere MQ
+	/// Multicast Transport with a reliable quality of service. If the topic
+	/// is not configured for reliable multicast, you cannot create a message
+	/// consumer for the topic.
+	/// </summary>
+	Reliable = XMSC.RTT_MULTICAST_RELIABLE,
+
+	/// <summary>
+	/// If the topic is configured for multicast in the broker, messages are
+	/// delivered to a message consumer using WebSphere MQ Multicast Transport.
+	/// A reliable quality of service is not used even if the topic is
+	/// configured for reliable multicast.
+	/// </summary>
+	NotReliable = XMSC.RTT_MULTICAST_NOT_RELIABLE
+}
+
+#endregion
+
+#region Broker Version (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_brkr_version.htm?lang=en
+/// <summary>
+/// The type of broker used by the application for a connection or for the
+/// destination. Only a destination that is a topic can have this property.
+/// </summary>
+public enum BrokerVersion
+{
+	/// <summary>
+	/// The application is using a WebSphere� MQ Publish/Subscribe broker.
+	/// </summary>
+	Version1 = XMSC.WMQ_BROKER_V1,
+
+	/// <summary>
+	/// The application is using a broker of IBM� Integration Bus.
+	/// </summary>
+	Version2 = XMSC.WMQ_BROKER_V2,
+
+	/// <summary>
+	/// After the broker is migrated, set this property so that RFH2 headers
+	/// are no longer used. After migration, this property is no longer
+	/// relevant.
+	/// </summary>
+	Unspecified = XMSC.WMQ_BROKER_UNSPECIFIED
+}
+
+#endregion
+
+#region Reconnect Options (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_rtt_client_reconnect_options.htm?lang=en
+/// <summary>
+/// Client reconnect options for new connections created by a factory.
+/// </summary>
+public enum ReconnectOptions
+{
+	/// <summary>
+	/// Use the value specified in the <c>mqclient.ini</c> file. Set the value
+	/// by using the DefRecon property within the Channels stanza.
+	/// </summary>
+	AsDefault = XMSC.WMQ_CLIENT_RECONNECT_AS_DEF,
+
+	/// <summary>
+	/// Reconnect to any of the queue managers specified in the connection name
+	/// list.
+	/// </summary>
+	AnyQueueManager = XMSC.WMQ_CLIENT_RECONNECT,
+
+	/// <summary>
+	/// Reconnects to the same queue manager that it is originally connected to.
+	/// It returns <c>MQRC.RECONNECT_QMID_MISMATCH</c> if the queue manager it
+	/// tries to connect to (specified in the connection name list) has a
+	/// different QMID to the queue manager originally connected to.
+	/// </summary>
+	SameQueueManager = XMSC.WMQ_CLIENT_RECONNECT_Q_MGR,
+
+	/// <summary>
+	/// Reconnection is disabled.
+	/// </summary>
+	Disabled = XMSC.WMQ_CLIENT_RECONNECT_DISABLED
+}
+
+#endregion
+
+#region Connection Mode (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_conn_mode.htm?lang=en
+/// <summary>
+/// The mode by which an application connects to a queue manager.
+/// </summary>
+public enum ConnectionMode
+{
+	/// <summary>
+	/// A connection to a queue manager in bindings mode, for optimal performance. This value is the default value for C/C++.
+	/// </summary>
+	Bindings = XMSC.WMQ_CM_BINDINGS,
+
+	/// <summary>
+	/// A connection to a queue manager in client mode, to ensure a fully managed stack. This value is the default value for .NET.
+	/// </summary>
+	Client = XMSC.WMQ_CM_CLIENT,
+
+	/// <summary>
+	/// A connection to a queue manager which forces an unmanaged client stack.
+	/// </summary>
+	ClientUnmanaged = XMSC.WMQ_CM_CLIENT_UNMANAGED
+}
+
+#endregion
+
+#region Encoding (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_encoding.htm?lang=en
+// cf. "Encoding (IBM JMS)"
+
+#endregion
+
+#region Fail If Quiesce (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_fail_if_quiesce.htm?lang=en
+/// <summary>
+/// Whether calls to certain methods fail if the queue manager to which the
+/// application is connected is in a quiescing state.
+/// </summary>
+public enum FailIfQuiesce
+{
+	/// <summary>
+	/// Calls to certain methods fail if the queue manager is in a quiescing
+	/// state. When the application detects that the queue manager is
+	/// quiescing, the application can complete its immediate task and close
+	/// the connection, allowing the queue manager to stop.
+	/// </summary>
+	Yes = XMSC.WMQ_FIQ_YES,
+
+	/// <summary>
+	/// No method calls fail because the queue manager is in a quiescing
+	/// state. If you specify this value, the application cannot detect that
+	/// the queue manager is quiescing. The application might continue to
+	/// perform operations against the queue manager and therefore prevent
+	/// the queue manager from stopping.
+	/// </summary>
+	No = XMSC.WMQ_FIQ_NO
+}
+
+#endregion
+
+#region Message Body (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_message_body.htm?lang=en
+/// <summary>
+/// Whether an XMS application processes the <c>MQRFH2</c> of a WebSphere�
+/// MQ message as part of the message payload (that is, as part of the
+/// message body).
+/// </summary>
+public enum MessageBody
+{
+	/// <summary>
+	/// Receive: The inbound XMS message type and body are determined by the
+	/// contents of the <c>MQRFH2</c> (if present) or the <c>MQMD</c> (if there
+	/// is no <c>MQRFH2</c>) in the received WebSphere MQ message.
+	/// Send: The outbound XMS message body contains a prepended and
+	/// auto-generated <c>MQRFH2</c> header based on XMS Message properties and
+	/// header fields.
+	/// </summary>
+	JMS = XMSC.WMQ_MESSAGE_BODY_JMS,
+
+	/// <summary>
+	/// Receive: The inbound XMS message type is always <c>ByteMessage</c>,
+	/// irrespective of the contents of received WebSphere MQ message or the
+	/// format field of the received <c>MQMD</c>. The XMS message body is the
+	/// unaltered message data returned by the underlying messaging provider
+	/// API call. The character set and encoding of the data in the message
+	/// body is determined by the <c>CodedCharSetId</c> and <c>Encoding</c>
+	/// fields of the <c>MQMD</c>. The format of the data in the message body
+	/// is determined by the <c>Format</c> field of the <c>MQMD</c>.
+	/// Send: The outbound XMS message body contains the application payload
+	/// as-is; and no auto-generated WebSphere MQ header is added to the body.
+	/// </summary>
+	MQ = XMSC.WMQ_MESSAGE_BODY_MQ,
+
+	/// <summary>
+	/// Receive: The XMS client determines a suitable value for this property.
+	/// On receive path, this value is the <c>WMQ_MESSAGE_BODY_JMS</c> property
+	/// value.
+	/// Send: The XMS client determines a suitable value for this property. On
+	/// send path, this value is the <c>XMSC_WMQ_TARGET_CLIENT</c> property
+	/// value.
+	/// </summary>
+	Unspecified = XMSC.WMQ_MESSAGE_BODY_UNSPECIFIED
+}
+
+#endregion
+
+#region Message Context (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_mqmd_message_context.htm?lang=en
+/// <summary>
+/// Determines what level of message context is to be set by the XMS
+/// application. The application must be running with appropriate context
+/// authority for this property to take effect.
+/// </summary>
+public enum MessageContext
+{
+	/// <summary>
+	/// For outbound messages, the <c>MQOPEN</c> API call and the <c>MQPMO</c>
+	/// structure specifies no explicit message context options.
+	/// </summary>
+	Default = XMSC.WMQ_MDCTX_DEFAULT,
+
+	/// <summary>
+	/// The <c>MQOPEN</c> API call specifies the message context option 
+	/// <c>MQOO_SET_IDENTITY_CONTEXT</c> and the <c>MQPMO</c> structure
+	/// specifies <c>MQPMO_SET_IDENTITY_CONTEXT</c>.
+	/// </summary>
+	SetIdentity = XMSC.WMQ_MDCTX_SET_IDENTITY_CONTEXT,
+
+	/// <summary>
+	/// The <c>MQOPEN</c> API call specifies the message context option
+	/// <c>MQOO_SET_ALL_CONTEXT</c> and the <c>MQPMO</c> structure
+	/// specifies <c>MQPMO_SET_ALL_CONTEXT</c>. 
+	/// </summary>
+	SetAll = XMSC.WMQ_MDCTX_SET_ALL_CONTEXT,
+}
+
+#endregion
+
+#region MQMD Read Enabled (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_mqmd_read_enabled.htm?lang=en
+/// <summary>
+/// Whether an XMS application can extract the values of MQMD fields or not.
+/// </summary>
+public enum MQMDReadEnabled
+{
+	/// <summary>
+	/// When sending messages, the <c>JMS_IBM_MQMD*</c> properties on a sent
+	/// message are not updated to reflect the updated field values in the
+	/// <c>MQMD</c>.
+	/// When receiving messages, none of the <c>JMS_IBM_MQMD*</c> properties
+	/// are available on a received message, even if some or all of them are
+	/// set by the sender.
+	/// </summary>
+	No = 0, //XMSC.WMQ_READ_ENABLED_NO,
+
+	/// <summary>
+	/// When sending messages, all of the <c>JMS_IBM_MQMD*</c> properties on
+	/// a sent message are updated to reflect the updated field values in the
+	/// <c>MQMD</c>, including those properties that the sender did not set
+	/// explicitly.
+	/// When receiving messages, all of the <c>JMS_IBM_MQMD*</c> properties
+	/// are available on a received message, including those properties that
+	/// the sender did not set explicitly. 
+	/// </summary>
+	Yes = 1 //XMSC.WMQ_READ_ENABLED_YES
+}
+
+#endregion
+
+#region MQMD Write Enabled (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_mqmd_write_enabled.htm?lang=en
+/// <summary>
+/// Whether an XMS application can write the values of MQMD fields or not.
+/// </summary>
+public enum MQMDWriteEnabled
+{
+	/// <summary>
+	/// All <c>JMS_IBM_MQMD*</c> properties are ignored and their values are
+	/// not copied into the underlying <c>MQMD</c> structure.
+	/// </summary>
+	No = 0, //XMSC.WMQ_WRITE_ENABLED_NO,
+
+	/// <summary>
+	/// <c>JMS_IBM_MQMD*</c> properties are processed. Their values are copied
+	/// into the underlying <c>MQMD</c> structure.
+	/// </summary>
+	Yes = 1 //XMSC.WMQ_WRITE_ENABLED_YES
+}
+
+#endregion
+
+#region Asynchronous Puts Allowed (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_put_async_allowed.htm?lang=en
+/// <summary>
+/// Whether message producers are allowed to use asynchronous puts to send
+/// messages to this destination.
+/// </summary>
+public enum AsynchronousPutsAllowed
+{
+	/// <summary>
+	/// Determine whether asynchronous puts are allowed by referring to the
+	/// queue or topic definition.
+	/// </summary>
+	AsDestination = XMSC.WMQ_PUT_ASYNC_ALLOWED_AS_DEST,
+
+	/// <summary>
+	/// Determine whether asynchronous puts are allowed by referring to the
+	/// queue definition.
+	/// </summary>
+	AsQueueDefinition = XMSC.WMQ_PUT_ASYNC_ALLOWED_AS_Q_DEF,
+
+	/// <summary>
+	/// Determine whether asynchronous puts are allowed by referring to the
+	/// topic definition.
+	/// </summary>
+	AsTopicDefinition = XMSC.WMQ_PUT_ASYNC_ALLOWED_AS_TOPIC_DEF,
+
+	/// <summary>
+	/// Asynchronous puts are not allowed.
+	/// </summary>
+	Disabled = XMSC.WMQ_PUT_ASYNC_ALLOWED_DISABLED,
+
+	/// <summary>
+	/// Asynchronous puts are allowed.
+	/// </summary>
+	Enabled = XMSC.WMQ_PUT_ASYNC_ALLOWED_ENABLED
+}
+
+#endregion
+
+#region Read Ahead Allowed (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_read_ahead_allowed.htm?lang=en
+/// <summary>
+/// Whether message consumers and queue browsers are allowed to use read ahead
+/// to get non-persistent, non-transactional messages from this destination
+/// into an internal buffer before receiving them.
+/// </summary>
+public enum ReadAheadAllowed
+{
+	/// <summary>
+	/// Determine whether read ahead is allowed by referring to the queue
+	/// definition.
+	/// </summary>
+	AsQueueDefinition = XMSC.WMQ_READ_AHEAD_ALLOWED_AS_Q_DEF,
+
+	/// <summary>
+	/// Determine whether read ahead is allowed by referring to the topic
+	/// definition.
+	/// </summary>
+	AsTopicDefinition = XMSC.WMQ_READ_AHEAD_ALLOWED_AS_TOPIC_DEF,
+
+	/// <summary>
+	/// Determine whether read ahead is allowed by referring to the queue
+	/// or topic definition.
+	/// </summary>
+	AsDestinationDefinition = XMSC.WMQ_READ_AHEAD_ALLOWED_AS_DEST,
+
+	/// <summary>
+	/// Read ahead is not allowed while consuming or browsing messages.
+	/// </summary>
+	Disabled = XMSC.WMQ_READ_AHEAD_ALLOWED_DISABLED,
+
+	/// <summary>
+	/// Read ahead is allowed.
+	/// </summary>
+	Enabled = XMSC.WMQ_READ_AHEAD_ALLOWED_ENABLED
+}
+
+#endregion
+
+#region Read Ahead Close Policy (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_read_ahead_close_policy.htm?lang=en
+/// <summary>
+/// This property determines, for messages being delivered to an asynchronous
+/// message listener, what happens to messages in the internal read ahead buffer
+/// when the message consumer is closed.
+/// </summary>
+public enum ReadAheadClosePolicy
+{
+	/// <summary>
+	/// Only the current message listener invocation completes before returning,
+	/// potentially leaving messages in the internal read ahead buffer, which
+	/// are then discarded.
+	/// </summary>
+	DeliverCurrent = XMSC.WMQ_READ_AHEAD_DELIVERCURRENT,
+
+	/// <summary>
+	/// All messages in the internal read ahead buffer are delivered to the
+	/// application message listener before returning. 
+	/// </summary>
+	DeliverAll = XMSC.WMQ_READ_AHEAD_DELIVERALL
+}
+
+#endregion
+
+#region Message Selection (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_mes_selection.htm?lang=en
+/// <summary>
+/// Determines whether message selection is done by the XMS client or by
+/// the broker.
+/// </summary>
+public enum MessageSelection
+{
+	/// <summary>
+	/// Message selection is done by the XMS client.
+	/// </summary>
+	Client = XMSC.WMQ_MSEL_CLIENT,
+
+	/// <summary>
+	/// Message selection is done by the broker.
+	/// </summary>
+	Broker = XMSC.WMQ_MSEL_BROKER
+}
+
+#endregion
+
+#region Receive Conversion (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_receive_conversion.htm?lang=en
+/// <summary>
+/// Whether data conversion is going to be performed by the queue manager.
+/// </summary>
+public enum ReceiveConversion
+{
+	/// <summary>
+	/// Perform data conversion on the XMS client only. Conversion is always
+	/// done using codepage 1208.
+	/// </summary>
+	Client = XMSC.WMQ_RECEIVE_CONVERSION_CLIENT_MSG,
+
+	/// <summary>
+	/// Perform data conversion on the queue manager before sending a message
+	/// to the XMS client. 
+	/// </summary>
+	QueueManager = XMSC.WMQ_RECEIVE_CONVERSION_QMGR
+}
+
+#endregion
+
+#region Share Socket Allowed (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_share_conv_allowed.htm?lang=en
+/// <summary>
+/// Whether a client connection can share its socket with other top-level XMS
+/// connections from the same process to the same queue manager, if the channel
+/// definitions match.
+/// </summary>
+public enum ShareSocketAllowed
+{
+	/// <summary>
+	/// Connections do not share a socket.
+	/// </summary>
+	False = XMSC.WMQ_SHARE_CONV_ALLOWED_NO,
+
+	/// <summary>
+	/// Connections share a socket.
+	/// </summary>
+	True = XMSC.WMQ_SHARE_CONV_ALLOWED_YES
+}
+
+#endregion
+
+#region Target Client (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wmq_target_client.htm?lang=en
+/// <summary>
+/// Whether messages sent to the destination contain an <c>MQRFH2</c> header.
+/// </summary>
+public enum TargetClient
+{
+	/// <summary>
+	/// Messages sent to the destination contain an <c>MQRFH2</c> header.
+	/// Specify this value if the application is sending the messages to
+	/// another XMS application, a WebSphere� JMS application, or a native
+	/// WebSphere MQ application that is designed to handle an <c>MQRFH2</c>
+	/// header.
+	/// </summary>
+	JMS = XMSC.WMQ_TARGET_DEST_JMS,
+
+	/// <summary>
+	/// Messages sent to the destination do not contain an <c>MQRFH2</c>
+	/// header. Specify this value if the application is sending the messages
+	/// to a native WebSphere MQ application that is not designed to handle
+	/// an <c>MQRFH2</c> header.
+	/// </summary>
+	MQ = XMSC.WMQ_TARGET_DEST_MQ
+}
+
+#endregion
+
+#region Wildcard Format (WMQ)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xmsc_wmq_wildcard_format.htm?lang=en
+/// <summary>
+/// This property determines which version of wildcard syntax is to be used.
+/// </summary>
+public enum WildcardFormat
+{
+	/// <summary>
+	/// Recognizes the topic level wildcards only i.e. '#' and '+' are treated
+	/// as wildcards.
+	/// </summary>
+	TopicOnly = XMSC.WMQ_WILDCARD_TOPIC_ONLY,
+
+	/// <summary>
+	/// Recognizes the character wildcards only i.e. '*' and '?' are treated
+	/// as wildcards.
+	/// </summary>
+	CharacterOnly = XMSC.WMQ_WILDCARD_CHAR_ONLY
+}
+
+#endregion
+
+#region Connection Protocol (WPM)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_conn_prot.htm?lang=en
+/// <summary>
+/// The communications protocol used for the connection to the messaging
+/// engine.
+/// </summary>
+public enum WPMConnectionProtocol
+{
+	/// <summary>
+	/// The connection uses HTTP over TCP/IP.
+	/// </summary>
+	HTTP = XMSC.WPM_CP_HTTP,
+
+	/// <summary>
+	/// The connection uses TCP/IP.
+	/// </summary>
+	TCP = XMSC.WPM_CP_TCP
+}
+
+#endregion
+
+#region Connection Proximity (WPM)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_conn_prox.htm?lang=en
+/// <summary>
+/// The connection proximity setting for the connection. This property
+/// determines how close the messaging engine that the application connects
+/// to must be to the bootstrap server.
+/// </summary>
+public enum ConnectionProximity
+{
+	/// <summary>
+	/// Bus.
+	/// </summary>
+	Bus,           // XMSC.WPM_CONNECTION_PROXIMITY_BUS     = "Bus"
+
+	/// <summary>
+	/// Cluster.
+	/// </summary>
+	Cluster,       // XMSC.WPM_CONNECTION_PROXIMITY_CLUSTER = "Cluster"
+
+	/// <summary>
+	/// Host.
+	/// </summary>
+	Host,          // XMSC.WPM_CONNECTION_PROXIMITY_HOST    = "Host"
+
+	/// <summary>
+	/// Server.
+	/// </summary>
+	Server         // XMSC.WPM_CONNECTION_PROXIMITY_SERVER  = "Server"
+}
+
+#endregion
+
+#region Mapping (WPM)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_non_pers_m.htm?lang=en
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_pers_m.htm?lang=en
+/// <summary>
+/// The reliability level of messages that are sent using the connection.
+/// </summary>
+public enum Mapping
+{
+	/// <summary>
+	/// Determined by the default reliability level specified for the queue
+	/// or topic space in the service integration bus.
+	/// </summary>
+	AsDestination = XMSC.WPM_MAPPING_AS_DESTINATION,
+
+	/// <summary>
+	/// Best effort nonpersistent.
+	/// </summary>
+	BestEffortNonPersistent = XMSC.WPM_MAPPING_BEST_EFFORT_NON_PERSISTENT,
+
+	/// <summary>
+	/// Express nonpersistent.
+	/// </summary>
+	ExpressNonPersistent = XMSC.WPM_MAPPING_EXPRESS_NON_PERSISTENT,
+
+	/// <summary>
+	/// Reliable nonpersistent.
+	/// </summary>
+	ReliableNonPersistent = XMSC.WPM_MAPPING_RELIABLE_NON_PERSISTENT,
+
+	/// <summary>
+	/// Reliable persistent.
+	/// </summary>
+	ReliablePersistent = XMSC.WPM_MAPPING_RELIABLE_PERSISTENT,
+
+	/// <summary>
+	/// Assured persistent.
+	/// </summary>
+	AssuredPersistent = XMSC.WPM_MAPPING_ASSURED_PERSISTENT
+}
+
+#endregion
+
+#region Target Significance (WPM)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_target_signf.htm?lang=en
+/// <summary>
+/// The significance of the target group of messaging engines.
+/// </summary>
+public enum TargetSignificance
+{
+	/// <summary>
+	/// A messaging engine in the target group is selected if one is available.
+	/// Otherwise, a messaging engine outside the target group is selected,
+	/// provided it is in the same service integration bus.
+	/// </summary>
+	Preferred, // XMSC.WPM_TARGET_SIGNIFICANCE_PREFERRED = "Preferred"
+
+	/// <summary>
+	/// The selected messaging engine must be in the target group. If a
+	/// messaging engine in the target group is not available, the connection
+	/// process fails.
+	/// </summary>
+	Required   // XMSC.WPM_TARGET_SIGNIFICANCE_REQUIRED  = "Required"
+}
+
+#endregion
+
+#region Target Type (WPM)
+
+// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/prx_wpm_target_type.htm?lang=en
+/// <summary>
+/// The type of the target group of messaging engines. This property
+/// determines the nature of the target group identified by the
+/// <c>XMSC_WPM_TARGET_GROUP</c> property.
+/// </summary>
+public enum TargetType
+{
+	/// <summary>
+	/// The name of the target group is the name of a bus member. The target
+	/// group is all the messaging engines in the bus member.
+	/// </summary>
+	BusMember,      // XMSC.WPM_TARGET_TYPE_BUSMEMBER = "BusMember"
+
+	/// <summary>
+	/// The name of the target group is the name of a user-defined group of
+	/// messaging engines. The target group is all the messaging engines that
+	/// are registered with the user-defined group.
+	/// </summary>
+	Custom,         // XMSC.WPM_TARGET_TYPE_CUSTOM = "Custom"
+
+	/// <summary>
+	/// The name of the target group is the name of a messaging engine. The
+	/// target group is the specified messaging engine.
+	/// </summary>
+	MessagingEngine // XMSC.WPM_TARGET_TYPE_ME = "ME"
+}
+
+#endregion
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/_TODO_.txt
----------------------------------------------------------------------
diff --git a/src/main/csharp/_TODO_.txt b/src/main/csharp/_TODO_.txt
new file mode 100644
index 0000000..d14384c
--- /dev/null
+++ b/src/main/csharp/_TODO_.txt
@@ -0,0 +1,29 @@
+ ~ BytesMessage.cs				// Ajouter commentaires
+ X Connection.cs
+ X ConnectionFactory.cs
+ X ConnectionMetaData.cs
+ X Destination.cs
+ X InitialContext.cs
+ X MapMessage.cs
+ X Message.cs
+ ~ MessageConsumer.cs			// Ajouter commentaires
+ ~ MessageProducer.cs			// Ajouter commentaires
+ ~ MessageProperties.cs			// Ajouter commentaires
+ X ObjectMessage.cs
+ X Queue.cs
+ ~ QueueBrowser.cs				// Ajouter commentaires
+ ~ Session.cs					// Ajouter commentaires
+ X StreamMessage.cs
+ X TemporaryQueue.cs
+ X TemporaryTopic.cs
+ X TextMessage.cs
+ X Topic.cs
+ ? Util\Dispatcher.cs
+ X Util\ExceptionUtil.cs
+ X Util\IntrospectionSupport.cs
+ X Util\UriAttributeAttribute.cs
+ X Util\XMSConvert.cs
+ X Util\XMSEnum.cs
+
+
+Temporary Queue / Topic
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/ndoc/NamespaceSummary.xml
----------------------------------------------------------------------
diff --git a/src/main/ndoc/NamespaceSummary.xml b/src/main/ndoc/NamespaceSummary.xml
new file mode 100644
index 0000000..e4aa15e
--- /dev/null
+++ b/src/main/ndoc/NamespaceSummary.xml
@@ -0,0 +1,21 @@
+<!--
+    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.
+-->
+<namespaces>
+    <namespace name="XMS">
+        The <b>XMS</b> namespace defines the IBM XMS provider API for the .Net Message System (NMS) API, which is an interface to messaging systems rather like JMS is for Java.
+    </namespace>
+</namespaces>

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/sandcastle/feedback_content.xml
----------------------------------------------------------------------
diff --git a/src/main/sandcastle/feedback_content.xml b/src/main/sandcastle/feedback_content.xml
new file mode 100644
index 0000000..ee30a12
--- /dev/null
+++ b/src/main/sandcastle/feedback_content.xml
@@ -0,0 +1,32 @@
+<content xml:space="preserve">
+
+  <item id="fb_alias">activemq.docs@apache.org</item>
+  <item id="fb_product"></item>
+  <item id="fb_deliverable"></item>
+
+  <item id="fb_subject">Customer%20Feedback</item>
+  <item id="fb_body">%0\dThank%20you%20for%20your%20feedback.%20The%20developer%20writing%20teams%20use%20your%20feedback%20to%20improve%20documentation.%20While%20we%20are%20reviewing%20your%20feedback,%20we%20may%20send%20you%20e-mail%20to%20ask%20for%20clarification%20or%20feedback%20on%20a%20solution.%20We%20do%20not%20use%20your%20e-mail%20address%20for%20any%20other%20purpose.%0\d</item>
+ 
+   <item id="fb_headerFeedBack">Send Feedback</item>
+  
+
+   <!-- feedback values for sandcastle scenario -->
+
+   <item id="feedback_alias"></item>
+   <item id="feedback_product"></item>
+   <item id="feedback_deliverable"></item>
+   <item id="feedback_fileVersion"></item>
+   <item id="feedback_topicVersion"></item>
+   <item id="feedback_body"></item>
+   <item id="feedback_subject"></item>
+
+   <item id="fb_Introduction">We value your feedback. To rate this topic and send feedback about this topic to the documentation team, click a rating, and then click <b>Send Feedback</b>. For assistance with support issues, refer to the technical support information included with the product.</item>
+
+   <item id="fb_Send">Send Feedback</item>
+   <item id="fb_Poor">Poor</item>
+   <item id="fb_Excellent">Outstanding</item>
+   <item id="fb_EnterFeedbackText">To e-mail your feedback, click here:</item>
+   <item id="fb_Title">Documentation Feedback</item>
+   <item id="fb_altIcon">Display feedback instructions at the bottom of the page.</item>
+
+</content>
\ No newline at end of file


[04/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/EndianBinaryWriterTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/EndianBinaryWriterTest.cs b/src/test/csharp/EndianBinaryWriterTest.cs
new file mode 100644
index 0000000..635b449
--- /dev/null
+++ b/src/test/csharp/EndianBinaryWriterTest.cs
@@ -0,0 +1,202 @@
+\ufeff/*
+ * 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.IO;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	[TestFixture]
+	public class EndianBinaryWriterTest
+	{
+		void writeString16TestHelper(char[] input, byte[] expect)
+		{
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+
+			String str = new String(input);
+
+			writer.WriteString16(str);
+
+			byte[] result = stream.GetBuffer();
+
+			Assert.AreEqual(result[0], 0x00);
+			Assert.AreEqual(result[1], expect.Length);
+
+			for(int i = 4; i < expect.Length; ++i)
+			{
+				Assert.AreEqual(result[i], expect[i - 2]);
+			}
+		}
+
+		[Test]
+		public void testWriteString16_1byteUTF8encoding()
+		{
+			// Test data with 1-byte UTF8 encoding.
+			char[] input = { '\u0000', '\u000B', '\u0048', '\u0065', '\u006C', '\u006C', '\u006F', '\u0020', '\u0057', '\u006F', '\u0072', '\u006C', '\u0064' };
+			byte[] expect = { 0xC0, 0x80, 0x0B, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 };
+
+			writeString16TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString16_2byteUTF8encoding()
+		{
+			// Test data with 2-byte UT8 encoding.
+			char[] input = { '\u0000', '\u00C2', '\u00A9', '\u00C3', '\u00A6' };
+			byte[] expect = { 0xC0, 0x80, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC2, 0xA6 };
+
+			writeString16TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString16_1byteAnd2byteEmbeddedNULLs()
+		{
+			// Test data with 1-byte and 2-byte encoding with embedded NULL's.
+			char[] input = { '\u0000', '\u0004', '\u00C2', '\u00A9', '\u00C3', '\u0000', '\u00A6' };
+			byte[] expect = { 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			writeString16TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString16_nullstring()
+		{
+			// test that a null string writes no output.
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			writer.WriteString16(null);
+			Assert.AreEqual(0, stream.Length);
+		}
+
+		[Test]
+		public void testWriteString16_emptystring()
+		{
+			// test that a null string writes no output.
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			writer.WriteString16("");
+
+			stream.Seek(0, SeekOrigin.Begin);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+			Assert.AreEqual(0, reader.ReadInt16());
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testWriteString16_stringTooLong()
+		{
+			// String of length 65536 of Null Characters.
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			String testStr = new String('a', 65536);
+			writer.Write(testStr);
+		}
+
+		[Test]
+		public void testWriteString16_maxStringLength()
+		{
+			// String of length 65535 of non Null Characters since Null encodes as UTF-8.
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			String testStr = new String('a', 65535);
+			writer.Write(testStr);
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testWriteString16_invalidEncodingHeader()
+		{
+			// Set one of the 65535 bytes to a value that will result in a 2 byte UTF8 encoded sequence.
+			// This will cause the string of length 65535 to have a utf length of 65536.
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			String testStr = new String('a', 65535);
+			char[] array = testStr.ToCharArray();
+			array[0] = '\u0000';
+			testStr = new String(array);
+			writer.Write(testStr);
+		}
+
+		void writeString32TestHelper(char[] input, byte[] expect)
+		{
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+
+			String str = new String(input);
+
+			writer.WriteString32(str);
+
+			byte[] result = stream.GetBuffer();
+
+			Assert.AreEqual(result[0], 0x00);
+			Assert.AreEqual(result[1], 0x00);
+			Assert.AreEqual(result[2], 0x00);
+			Assert.AreEqual(result[3], expect.Length);
+
+			for(int i = 4; i < expect.Length; ++i)
+			{
+				Assert.AreEqual(result[i], expect[i - 4]);
+			}
+		}
+
+		[Test]
+		public void testWriteString32_1byteUTF8encoding()
+		{
+			// Test data with 1-byte UTF8 encoding.
+			char[] input = { '\u0000', '\u000B', '\u0048', '\u0065', '\u006C', '\u006C', '\u006F', '\u0020', '\u0057', '\u006F', '\u0072', '\u006C', '\u0064' };
+			byte[] expect = { 0xC0, 0x80, 0x0B, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 };
+
+			writeString32TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString32_2byteUTF8encoding()
+		{
+			// Test data with 2-byte UT8 encoding.
+			char[] input = { '\u0000', '\u00C2', '\u00A9', '\u00C3', '\u00A6' };
+			byte[] expect = { 0xC0, 0x80, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC2, 0xA6 };
+
+			writeString32TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString32_1byteAnd2byteEmbeddedNULLs()
+		{
+			// Test data with 1-byte and 2-byte encoding with embedded NULL's.
+			char[] input = { '\u0000', '\u0004', '\u00C2', '\u00A9', '\u00C3', '\u0000', '\u00A6' };
+			byte[] expect = { 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			writeString32TestHelper(input, expect);
+		}
+
+		[Test]
+		public void testWriteString32_nullstring()
+		{
+			// test that a null strings writes a -1
+			MemoryStream stream = new MemoryStream();
+			EndianBinaryWriter writer = new EndianBinaryWriter(stream);
+			writer.WriteString32(null);
+
+			stream.Seek(0, SeekOrigin.Begin);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+			Assert.AreEqual(-1, reader.ReadInt32());
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/EndianTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/EndianTest.cs b/src/test/csharp/EndianTest.cs
new file mode 100644
index 0000000..773eaf1
--- /dev/null
+++ b/src/test/csharp/EndianTest.cs
@@ -0,0 +1,131 @@
+/*
+ * 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.IO;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	[TestFixture]
+	public class EndianTest
+	{
+		[Test]
+		public void TestLongEndian()
+		{
+			long value = 0x0102030405060708L;
+			long newValue = EndianSupport.SwitchEndian(value);
+			Assert.AreEqual(0x0807060504030201L, newValue);
+			long actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestIntEndian()
+		{
+			int value = 0x12345678;
+			int newValue = EndianSupport.SwitchEndian(value);
+			Assert.AreEqual(0x78563412, newValue);
+			int actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestCharEndian()
+		{
+			char value = 'J';
+			char newValue = EndianSupport.SwitchEndian(value);
+			char actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestShortEndian()
+		{
+			short value = 0x1234;
+			short newValue = EndianSupport.SwitchEndian(value);
+			Assert.AreEqual(0x3412, newValue);
+			short actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestNegativeLongEndian()
+		{
+			long value = -0x0102030405060708L;
+			long newValue = EndianSupport.SwitchEndian(value);
+			long actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestNegativeIntEndian()
+		{
+			int value = -0x12345678;
+			int newValue = EndianSupport.SwitchEndian(value);
+			int actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestNegativeShortEndian()
+		{
+			short value = -0x1234;
+			short newValue = EndianSupport.SwitchEndian(value);
+			short actual = EndianSupport.SwitchEndian(newValue);
+			Assert.AreEqual(value, actual);
+		}
+
+		[Test]
+		public void TestFloatDontNeedEndianSwitch()
+		{
+			float value = -1.223F;
+
+			// Convert to int so we can compare to Java version.
+			MemoryStream ms = new MemoryStream(4);
+			BinaryWriter bw = new BinaryWriter(ms);
+			bw.Write(value);
+			bw.Close();
+			ms = new MemoryStream(ms.ToArray());
+			BinaryReader br = new BinaryReader(ms);
+
+			// System.out.println(Integer.toString(Float.floatToIntBits(-1.223F), 16));
+			Assert.AreEqual(-0x406374bc, br.ReadInt32());
+		}
+
+		[Test]
+		public void TestDoublDontNeedEndianSwitch()
+		{
+			double value = -1.223D;
+
+			// Convert to int so we can compare to Java version.
+			MemoryStream ms = new MemoryStream(4);
+			BinaryWriter bw = new BinaryWriter(ms);
+			bw.Write(value);
+			bw.Close();
+			ms = new MemoryStream(ms.ToArray());
+			BinaryReader br = new BinaryReader(ms);
+			long longVersion = br.ReadInt64();
+
+			// System.out.println(Long.toString(Double.doubleToLongBits(-1.223D), 16));
+			Assert.AreEqual(-0x400c6e978d4fdf3b, longVersion);
+		}
+	}
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/ForeignMessageTransformationTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/ForeignMessageTransformationTest.cs b/src/test/csharp/ForeignMessageTransformationTest.cs
new file mode 100644
index 0000000..e5870b8
--- /dev/null
+++ b/src/test/csharp/ForeignMessageTransformationTest.cs
@@ -0,0 +1,305 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Commands;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+    //[TestFixture]
+    public class ForeignMessageTransformationTest : NMSTest
+    {
+        private string propertyName = "Test-Property";
+        private string propertyValue = "Test-Property-Value";
+        private string mapElementName = "Test-Map-Property";
+        private string mapElementValue = "Test-Map-Property-Value";
+        private string textBody = "This is a TextMessage from a Foreign Provider";
+        private byte[] bytesContent = {1, 2, 3, 4, 5, 6, 7, 8};
+
+        private bool a = true;
+        private byte b = 123;
+        private char c = 'c';
+        private short d = 0x1234;
+        private int e = 0x12345678;
+        private long f = 0x1234567812345678;
+        private string g = "Hello World!";
+        private bool h = false;
+        private byte i = 0xFF;
+        private short j = -0x1234;
+        private int k = -0x12345678;
+        private long l = -0x1234567812345678;
+        private float m = 2.1F;
+        private double n = 2.3;
+
+		protected ForeignMessageTransformationTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+        //[Test]
+        public virtual void TestSendReceiveForeignMessage(
+            //[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+            MsgDeliveryMode deliveryMode, string testTopicRef)
+        {
+            using(IConnection connection = CreateConnection())
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+                {
+					IDestination destination = GetClearDestination(session, DestinationType.Topic, testTopicRef);
+                    using(IMessageConsumer consumer = session.CreateConsumer(destination))
+                    using(IMessageProducer producer = session.CreateProducer(destination))
+                    {
+                        try
+                        {
+                            producer.DeliveryMode = deliveryMode;
+                            Message request = new Message();
+                            request.Properties[propertyName] = propertyValue;
+
+                            producer.Send(request);
+
+                            IMessage message = consumer.Receive(receiveTimeout);
+                            Assert.IsNotNull(message, "No message returned!");
+                            Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+                            Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+                            // use generic API to access entries
+                            Assert.AreEqual(propertyValue, message.Properties[propertyName], "generic map entry: " + propertyName);
+
+                            // use type safe APIs
+                            Assert.AreEqual(propertyValue, message.Properties.GetString(propertyName),   "map entry: " + propertyName);
+                        }
+                        catch(NotSupportedException)
+                        {
+                        }
+                    }
+                }
+            }
+        }
+
+        //[Test]
+        public virtual void TestSendReceiveForeignTextMessage(
+            //[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+            MsgDeliveryMode deliveryMode, string testTopicRef)
+        {
+            using(IConnection connection = CreateConnection())
+            {
+                connection.Start();
+                using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+                {
+					IDestination destination = GetClearDestination(session, DestinationType.Topic, testTopicRef);
+                    using(IMessageConsumer consumer = session.CreateConsumer(destination))
+                    using(IMessageProducer producer = session.CreateProducer(destination))
+                    {
+                        try
+                        {
+                            producer.DeliveryMode = deliveryMode;
+                            TextMessage request = new TextMessage();
+                            request.Properties[propertyName] = propertyValue;
+                            request.Text = textBody;
+
+                            producer.Send(request);
+
+                            ITextMessage message = consumer.Receive(receiveTimeout) as ITextMessage;
+                            Assert.IsNotNull(message, "No message returned!");
+                            Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+                            Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+                            // Check the body
+                            Assert.AreEqual(textBody, message.Text, "TextMessage body was wrong.");
+
+                            // use generic API to access entries
+                            Assert.AreEqual(propertyValue, message.Properties[propertyName], "generic map entry: " + propertyName);
+
+                            // use type safe APIs
+                            Assert.AreEqual(propertyValue, message.Properties.GetString(propertyName),   "map entry: " + propertyName);
+                        }
+                        catch(NotSupportedException)
+                        {
+                        }
+                    }
+                }
+            }
+        }
+
+		//[Test]
+		public virtual void TestSendReceiveForeignBytesMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testTopicRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Topic, testTopicRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						try
+						{
+							producer.DeliveryMode = deliveryMode;
+							BytesMessage request = new BytesMessage();
+							request.Properties[propertyName] = propertyValue;
+							request.WriteBytes(bytesContent);
+
+							producer.Send(request);
+
+							IBytesMessage message = consumer.Receive(receiveTimeout) as IBytesMessage;
+							Assert.IsNotNull(message, "No message returned!");
+							Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+							Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+							// Check the body
+							byte[] content = new byte[bytesContent.Length];
+							Assert.AreEqual(bytesContent.Length, message.ReadBytes(content));
+							Assert.AreEqual(bytesContent, content, "BytesMessage body was wrong.");
+
+							// use generic API to access entries
+							Assert.AreEqual(propertyValue, message.Properties[propertyName], "generic map entry: " + propertyName);
+
+							// use type safe APIs
+							Assert.AreEqual(propertyValue, message.Properties.GetString(propertyName),   "map entry: " + propertyName);
+						}
+						catch(NotSupportedException)
+						{
+						}
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveForeignMapMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testTopicRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Topic, testTopicRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						try
+						{
+							producer.DeliveryMode = deliveryMode;
+							MapMessage request = new MapMessage();
+							request.Properties[propertyName] = propertyValue;
+							request.Body[mapElementName] = mapElementValue;
+
+							producer.Send(request);
+
+							IMapMessage message = consumer.Receive(receiveTimeout) as IMapMessage;
+							Assert.IsNotNull(message, "No message returned!");
+							Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+							Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+							// Check the body
+							Assert.AreEqual(request.Body.Count, message.Body.Count);
+							Assert.AreEqual(mapElementValue, message.Body[mapElementName], "MapMessage body was wrong.");
+
+							// use generic API to access entries
+							Assert.AreEqual(propertyValue, message.Properties[propertyName], "generic map entry: " + propertyName);
+
+							// use type safe APIs
+							Assert.AreEqual(propertyValue, message.Properties.GetString(propertyName),   "map entry: " + propertyName);
+						}
+						catch(NotSupportedException)
+						{
+						}
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveForeignStreamMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testTopicRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Topic, testTopicRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						try
+						{
+							producer.DeliveryMode = deliveryMode;
+							StreamMessage request = new StreamMessage();
+							request.Properties[propertyName] = propertyValue;
+
+							request.WriteBoolean(a);
+							request.WriteByte(b);
+							request.WriteChar(c);
+							request.WriteInt16(d);
+							request.WriteInt32(e);
+							request.WriteInt64(f);
+							request.WriteString(g);
+							request.WriteBoolean(h);
+							request.WriteByte(i);
+							request.WriteInt16(j);
+							request.WriteInt32(k);
+							request.WriteInt64(l);
+							request.WriteSingle(m);
+							request.WriteDouble(n);
+
+							producer.Send(request);
+
+							IStreamMessage message = consumer.Receive(receiveTimeout) as IStreamMessage;
+							Assert.IsNotNull(message, "No message returned!");
+							Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+							Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+							// Check the body
+							Assert.AreEqual(a, message.ReadBoolean(), "Stream Boolean Value: a");
+							Assert.AreEqual(b, message.ReadByte(), "Stream Byte Value: b");
+							Assert.AreEqual(c, message.ReadChar(), "Stream Char Value: c");
+							Assert.AreEqual(d, message.ReadInt16(), "Stream Int16 Value: d");
+							Assert.AreEqual(e, message.ReadInt32(), "Stream Int32 Value: e");
+							Assert.AreEqual(f, message.ReadInt64(), "Stream Int64 Value: f");
+							Assert.AreEqual(g, message.ReadString(), "Stream String Value: g");
+							Assert.AreEqual(h, message.ReadBoolean(), "Stream Boolean Value: h");
+							Assert.AreEqual(i, message.ReadByte(), "Stream Byte Value: i");
+							Assert.AreEqual(j, message.ReadInt16(), "Stream Int16 Value: j");
+							Assert.AreEqual(k, message.ReadInt32(), "Stream Int32 Value: k");
+							Assert.AreEqual(l, message.ReadInt64(), "Stream Int64 Value: l");
+							Assert.AreEqual(m, message.ReadSingle(), "Stream Single Value: m");
+							Assert.AreEqual(n, message.ReadDouble(), "Stream Double Value: n");
+
+							// use generic API to access entries
+							Assert.AreEqual(propertyValue, message.Properties[propertyName], "generic map entry: " + propertyName);
+
+							// use type safe APIs
+							Assert.AreEqual(propertyValue, message.Properties.GetString(propertyName),   "map entry: " + propertyName);
+						}
+						catch(NotSupportedException)
+						{
+						}
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/MapMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/MapMessageTest.cs b/src/test/csharp/MapMessageTest.cs
new file mode 100644
index 0000000..6b7385d
--- /dev/null
+++ b/src/test/csharp/MapMessageTest.cs
@@ -0,0 +1,208 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class MapMessageTest : NMSTest
+	{
+		protected bool a = true;
+		protected byte b = 123;
+		protected char c = 'c';
+		protected short d = 0x1234;
+		protected int e = 0x12345678;
+		protected long f = 0x1234567812345678;
+		protected string g = "Hello World!";
+		protected bool h = false;
+		protected byte i = 0xFF;
+		protected short j = -0x1234;
+		protected int k = -0x12345678;
+		protected long l = -0x1234567812345678;
+		protected float m = 2.1F;
+		protected double n = 2.3;
+		protected byte[] o = {1, 2, 3, 4, 5};
+
+		protected MapMessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveMapMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						IMapMessage request = session.CreateMapMessage();
+						request.Body["a"] = a;
+						request.Body["b"] = b;
+						request.Body["c"] = c;
+						request.Body["d"] = d;
+						request.Body["e"] = e;
+						request.Body["f"] = f;
+						request.Body["g"] = g;
+						request.Body["h"] = h;
+						request.Body["i"] = i;
+						request.Body["j"] = j;
+						request.Body["k"] = k;
+						request.Body["l"] = l;
+						request.Body["m"] = m;
+						request.Body["n"] = n;
+						request.Body["o"] = o;
+						producer.Send(request);
+
+						IMapMessage message = consumer.Receive(receiveTimeout) as IMapMessage;
+						Assert.IsNotNull(message, "No message returned!");
+						Assert.AreEqual(request.Body.Count, message.Body.Count, "Invalid number of message maps.");
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+						Assert.AreEqual(ToHex(f), ToHex(message.Body.GetLong("f")), "map entry: f as hex");
+
+						// use generic API to access entries
+						Assert.AreEqual(a, message.Body["a"], "generic map entry: a");
+						Assert.AreEqual(b, message.Body["b"], "generic map entry: b");
+						Assert.AreEqual(c, message.Body["c"], "generic map entry: c");
+						Assert.AreEqual(d, message.Body["d"], "generic map entry: d");
+						Assert.AreEqual(e, message.Body["e"], "generic map entry: e");
+						Assert.AreEqual(f, message.Body["f"], "generic map entry: f");
+						Assert.AreEqual(g, message.Body["g"], "generic map entry: g");
+						Assert.AreEqual(h, message.Body["h"], "generic map entry: h");
+						Assert.AreEqual(i, message.Body["i"], "generic map entry: i");
+						Assert.AreEqual(j, message.Body["j"], "generic map entry: j");
+						Assert.AreEqual(k, message.Body["k"], "generic map entry: k");
+						Assert.AreEqual(l, message.Body["l"], "generic map entry: l");
+						Assert.AreEqual(m, message.Body["m"], "generic map entry: m");
+						Assert.AreEqual(n, message.Body["n"], "generic map entry: n");
+						Assert.AreEqual(o, message.Body["o"], "generic map entry: o");
+
+						// use type safe APIs
+						Assert.AreEqual(a, message.Body.GetBool("a"), "map entry: a");
+						Assert.AreEqual(b, message.Body.GetByte("b"), "map entry: b");
+						Assert.AreEqual(c, message.Body.GetChar("c"), "map entry: c");
+						Assert.AreEqual(d, message.Body.GetShort("d"), "map entry: d");
+						Assert.AreEqual(e, message.Body.GetInt("e"), "map entry: e");
+						Assert.AreEqual(f, message.Body.GetLong("f"), "map entry: f");
+						Assert.AreEqual(g, message.Body.GetString("g"), "map entry: g");
+						Assert.AreEqual(h, message.Body.GetBool("h"), "map entry: h");
+						Assert.AreEqual(i, message.Body.GetByte("i"), "map entry: i");
+						Assert.AreEqual(j, message.Body.GetShort("j"), "map entry: j");
+						Assert.AreEqual(k, message.Body.GetInt("k"), "map entry: k");
+						Assert.AreEqual(l, message.Body.GetLong("l"), "map entry: l");
+						Assert.AreEqual(m, message.Body.GetFloat("m"), "map entry: m");
+						Assert.AreEqual(n, message.Body.GetDouble("n"), "map entry: n");
+						Assert.AreEqual(o, message.Body.GetBytes("o"), "map entry: o");
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveNestedMapMessage(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						try
+						{
+							producer.DeliveryMode = deliveryMode;
+							IMapMessage request = session.CreateMapMessage();
+							const string textFieldValue = "Nested Map Messages Rule!";
+
+							request.Body.SetString("textField", textFieldValue);
+
+							IDictionary grandChildMap = new Hashtable();
+							grandChildMap["x"] = "abc";
+							grandChildMap["y"] = new ArrayList(new object[] { "a", "b", "c" });
+
+							IDictionary nestedMap = new Hashtable();
+							nestedMap["a"] = "foo";
+							nestedMap["b"] = (int) 23;
+							nestedMap["c"] = (long) 45;
+							nestedMap["d"] = grandChildMap;
+
+							request.Body.SetDictionary("mapField", nestedMap);
+							request.Body.SetList("listField", new ArrayList(new Object[] { "a", "b", "c" }));
+
+							producer.Send(request);
+
+							IMapMessage message = consumer.Receive(receiveTimeout) as IMapMessage;
+							Assert.IsNotNull(message, "No message returned!");
+							Assert.AreEqual(request.Body.Count, message.Body.Count, "Invalid number of message maps.");
+							Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+
+							string textFieldResponse = message.Body.GetString("textField");
+							Assert.AreEqual(textFieldValue, textFieldResponse, "textField does not match.");
+
+							IDictionary nestedMapResponse = message.Body.GetDictionary("mapField");
+							Assert.IsNotNull(nestedMapResponse, "Nested map not returned.");
+							Assert.AreEqual(nestedMap.Count, nestedMapResponse.Count, "nestedMap: Wrong number of elements");
+							Assert.AreEqual("foo", nestedMapResponse["a"], "nestedMap: a");
+							Assert.AreEqual(23, nestedMapResponse["b"], "nestedMap: b");
+							Assert.AreEqual(45, nestedMapResponse["c"], "nestedMap: c");
+
+							IDictionary grandChildMapResponse = nestedMapResponse["d"] as IDictionary;
+							Assert.IsNotNull(grandChildMapResponse, "Grand child map not returned.");
+							Assert.AreEqual(grandChildMap.Count, grandChildMapResponse.Count, "grandChildMap: Wrong number of elements");
+							Assert.AreEqual(grandChildMapResponse["x"], "abc", "grandChildMap: x");
+
+							IList grandChildList = grandChildMapResponse["y"] as IList;
+							Assert.IsNotNull(grandChildList, "Grand child list not returned.");
+							Assert.AreEqual(3, grandChildList.Count, "grandChildList: Wrong number of list elements.");
+							Assert.AreEqual("a", grandChildList[0], "grandChildList: a");
+							Assert.AreEqual("b", grandChildList[1], "grandChildList: b");
+							Assert.AreEqual("c", grandChildList[2], "grandChildList: c");
+
+							IList listFieldResponse = message.Body.GetList("listField");
+							Assert.IsNotNull(listFieldResponse, "Nested list not returned.");
+							Assert.AreEqual(3, listFieldResponse.Count, "listFieldResponse: Wrong number of list elements.");
+							Assert.AreEqual("a", listFieldResponse[0], "listFieldResponse: a");
+							Assert.AreEqual("b", listFieldResponse[1], "listFieldResponse: b");
+							Assert.AreEqual("c", listFieldResponse[2], "listFieldResponse: c");
+						}
+						catch(NotSupportedException)
+						{
+						}
+						catch(NMSException e)
+						{
+							Assert.IsTrue(e.InnerException.GetType() == typeof(NotSupportedException));
+						}
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/MessageSelectorTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/MessageSelectorTest.cs b/src/test/csharp/MessageSelectorTest.cs
new file mode 100644
index 0000000..03f0a4e
--- /dev/null
+++ b/src/test/csharp/MessageSelectorTest.cs
@@ -0,0 +1,184 @@
+/*
+ * 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.Threading;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	//[Category("LongRunning")]
+	public class MessageSelectorTest : NMSTest
+	{
+		private int receivedNonIgnoredMsgCount = 0;
+		private int receivedIgnoredMsgCount = 0;
+		private bool simulateSlowConsumer = false;
+
+		protected MessageSelectorTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestFilterIgnoredMessages(
+			//[Values(SELECTOR_TEST_QUEUE_URI, SELECTOR_TEST_TOPIC_URI)]
+			string testDestinationURI)
+		{
+			simulateSlowConsumer = false;
+			RunFilterIgnoredMessagesTest(testDestinationURI);
+		}
+
+		/// <summary>
+		/// A slow consumer will trigger the producer flow control on the broker when the destination is
+		/// a queue.  It will also trigger the consumer flow control by slowing down the feed to all of the
+		/// consumers on the queue to only send messages as fast as the slowest consumer can run.
+		/// When sending to a topic, the producer will not be slowed down, and consumers will be allowed
+		/// to run as fast as they can go.
+		/// Since this test can take a long time to run, it is marked as explicit.
+		/// </summary>
+		/// <param name="testDestinationURI"></param>
+		//[Test]
+		public virtual void TestFilterIgnoredMessagesSlowConsumer(
+			//[Values(SELECTOR_TEST_QUEUE_URI, SELECTOR_TEST_TOPIC_URI)]
+			string testDestinationURI)
+		{
+			simulateSlowConsumer = true;
+			RunFilterIgnoredMessagesTest(testDestinationURI);
+		}
+
+		public void RunFilterIgnoredMessagesTest(string testDestinationURI)
+		{
+			TimeSpan ttl = TimeSpan.FromMinutes(30);
+			const int MaxNumRequests = 100000;
+
+			using(IConnection connection1 = CreateConnection(GetTestClientId()))
+			using(IConnection connection2 = CreateConnection(GetTestClientId()))
+			using(IConnection connection3 = CreateConnection(GetTestClientId()))
+			{
+				connection1.Start();
+				connection2.Start();
+				connection3.Start();
+				using(ISession session1 = connection1.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				using(ISession session2 = connection2.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				using(ISession session3 = connection3.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination1 = GetClearDestination(session1, testDestinationURI);
+					IDestination destination2 = GetClearDestination(session2, testDestinationURI);
+					IDestination destination3 = GetClearDestination(session3, testDestinationURI);
+
+					using(IMessageProducer producer = session1.CreateProducer(destination1))
+					using(IMessageConsumer consumer1 = session2.CreateConsumer(destination2, "JMSType NOT LIKE '%IGNORE'"))
+					{
+						int numNonIgnoredMsgsSent = 0;
+						int numIgnoredMsgsSent = 0;
+
+						producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
+
+						receivedNonIgnoredMsgCount = 0;
+						receivedIgnoredMsgCount = 0;
+						consumer1.Listener += new MessageListener(OnNonIgnoredMessage);
+						IMessageConsumer consumer2 = null;
+
+						for(int index = 1; index <= MaxNumRequests; index++)
+						{
+							IMessage request = session1.CreateTextMessage(String.Format("Hello World! [{0} of {1}]", index, MaxNumRequests));
+
+							request.NMSTimeToLive = ttl;
+							if(0 == (index % 2))
+							{
+								request.NMSType = "ACTIVE";
+								numNonIgnoredMsgsSent++;
+							}
+							else
+							{
+								request.NMSType = "ACTIVE.IGNORE";
+								numIgnoredMsgsSent++;
+							}
+
+							producer.Send(request);
+
+							if(2000 == index)
+							{
+								// Start the second consumer
+								if(destination3.IsTopic)
+								{
+									// Reset the ignored message sent count, since all previous messages
+									// will not have been consumed on a topic.
+									numIgnoredMsgsSent = 0;
+								}
+
+								consumer2 = session3.CreateConsumer(destination3, "JMSType LIKE '%IGNORE'");
+								consumer2.Listener += new MessageListener(OnIgnoredMessage);
+							}
+						}
+
+						// Create a waiting loop that will coordinate the end of the test.  It checks
+						// to see that all intended messages were received.  It will continue to wait as
+						// long as new messages are being received.  If it stops receiving messages before
+						// it receives everything it expects, it will eventually timeout and the test will fail.
+						int waitCount = 0;
+						int lastReceivedINongnoredMsgCount = receivedNonIgnoredMsgCount;
+						int lastReceivedIgnoredMsgCount = receivedIgnoredMsgCount;
+
+						while(receivedNonIgnoredMsgCount < numNonIgnoredMsgsSent
+								|| receivedIgnoredMsgCount < numIgnoredMsgsSent)
+						{
+							if(lastReceivedINongnoredMsgCount != receivedNonIgnoredMsgCount
+								|| lastReceivedIgnoredMsgCount != receivedIgnoredMsgCount)
+							{
+								// Reset the wait count.
+								waitCount = 0;
+							}
+							else
+							{
+								waitCount++;
+							}
+
+							lastReceivedINongnoredMsgCount = receivedNonIgnoredMsgCount;
+							lastReceivedIgnoredMsgCount = receivedIgnoredMsgCount;
+
+							Assert.IsTrue(waitCount <= 30, String.Format("Timeout waiting for all messages to be delivered. Only {0} of {1} non-ignored messages delivered.  Only {2} of {3} ignored messages delivered.",
+								receivedNonIgnoredMsgCount, numNonIgnoredMsgsSent, receivedIgnoredMsgCount, numIgnoredMsgsSent));
+							Thread.Sleep(1000);
+						}
+
+						consumer2.Dispose();
+					}
+				}
+			}
+		}
+
+		protected void OnNonIgnoredMessage(IMessage message)
+		{
+			receivedNonIgnoredMsgCount++;
+			Assert.AreEqual(message.NMSType, "ACTIVE");
+		}
+
+		protected void OnIgnoredMessage(IMessage message)
+		{
+			receivedIgnoredMsgCount++;
+			Assert.AreEqual(message.NMSType, "ACTIVE.IGNORE");
+			if(simulateSlowConsumer)
+			{
+				// Simulate a slow consumer  It doesn't have to be too slow in a high speed environment
+				// in order to trigger producer flow control.
+				Thread.Sleep(10);
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/MessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/MessageTest.cs b/src/test/csharp/MessageTest.cs
new file mode 100644
index 0000000..228ed98
--- /dev/null
+++ b/src/test/csharp/MessageTest.cs
@@ -0,0 +1,147 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class MessageTest : NMSTest
+	{
+		protected bool		a = true;
+		protected byte		b = 123;
+		protected char		c = 'c';
+		protected short		d = 0x1234;
+		protected int		e = 0x12345678;
+		protected long		f = 0x1234567812345678;
+		protected string	g = "Hello World!";
+		protected bool		h = false;
+		protected byte		i = 0xFF;
+		protected short		j = -0x1234;
+		protected int		k = -0x12345678;
+		protected long		l = -0x1234567812345678;
+		protected float		m = 2.1F;
+		protected double	n = 2.3;
+		protected byte[]    o = {1, 2, 3, 4, 5};
+
+		protected MessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestSendReceiveMessageProperties(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						IMessage request = session.CreateMessage();
+						request.Properties["a"] = a;
+						request.Properties["b"] = b;
+						request.Properties["c"] = c;
+						request.Properties["d"] = d;
+						request.Properties["e"] = e;
+						request.Properties["f"] = f;
+						request.Properties["g"] = g;
+						request.Properties["h"] = h;
+						request.Properties["i"] = i;
+						request.Properties["j"] = j;
+						request.Properties["k"] = k;
+						request.Properties["l"] = l;
+						request.Properties["m"] = m;
+						request.Properties["n"] = n;
+						
+						try
+						{
+							request.Properties["o"] = o;
+							Assert.Fail("Should not be able to add a Byte[] to the Properties of a Message.");
+						}
+						catch
+						{
+							// Expected
+						}
+						
+						try
+						{
+							request.Properties.SetBytes("o", o);
+							Assert.Fail("Should not be able to add a Byte[] to the Properties of a Message.");
+						}
+						catch
+						{
+							// Expected
+						}						
+						
+						producer.Send(request);
+
+						IMessage message = consumer.Receive(receiveTimeout);
+						Assert.IsNotNull(message, "No message returned!");
+						Assert.AreEqual(request.Properties.Count, message.Properties.Count, "Invalid number of properties.");
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+						Assert.AreEqual(ToHex(f), ToHex(message.Properties.GetLong("f")), "map entry: f as hex");
+
+						// use generic API to access entries
+						// Perform a string only comparison here since some NMS providers are type limited and
+						// may return only a string instance from the generic [] accessor.  Each provider should
+						// further test this functionality to determine that the correct type is returned if
+						// it is capable of doing so.
+						Assert.AreEqual(a.ToString(), message.Properties["a"].ToString(), "generic map entry: a");
+						Assert.AreEqual(b.ToString(), message.Properties["b"].ToString(), "generic map entry: b");
+						Assert.AreEqual(c.ToString(), message.Properties["c"].ToString(), "generic map entry: c");
+						Assert.AreEqual(d.ToString(), message.Properties["d"].ToString(), "generic map entry: d");
+						Assert.AreEqual(e.ToString(), message.Properties["e"].ToString(), "generic map entry: e");
+						Assert.AreEqual(f.ToString(), message.Properties["f"].ToString(), "generic map entry: f");
+						Assert.AreEqual(g.ToString(), message.Properties["g"].ToString(), "generic map entry: g");
+						Assert.AreEqual(h.ToString(), message.Properties["h"].ToString(), "generic map entry: h");
+						Assert.AreEqual(i.ToString(), message.Properties["i"].ToString(), "generic map entry: i");
+						Assert.AreEqual(j.ToString(), message.Properties["j"].ToString(), "generic map entry: j");
+						Assert.AreEqual(k.ToString(), message.Properties["k"].ToString(), "generic map entry: k");
+						Assert.AreEqual(l.ToString(), message.Properties["l"].ToString(), "generic map entry: l");
+						Assert.AreEqual(m.ToString(), message.Properties["m"].ToString(), "generic map entry: m");
+						Assert.AreEqual(n.ToString(), message.Properties["n"].ToString(), "generic map entry: n");
+
+						// use type safe APIs
+						Assert.AreEqual(a, message.Properties.GetBool("a"),   "map entry: a");
+						Assert.AreEqual(b, message.Properties.GetByte("b"),   "map entry: b");
+						Assert.AreEqual(c, message.Properties.GetChar("c"),   "map entry: c");
+						Assert.AreEqual(d, message.Properties.GetShort("d"),  "map entry: d");
+						Assert.AreEqual(e, message.Properties.GetInt("e"),    "map entry: e");
+						Assert.AreEqual(f, message.Properties.GetLong("f"),   "map entry: f");
+						Assert.AreEqual(g, message.Properties.GetString("g"), "map entry: g");
+						Assert.AreEqual(h, message.Properties.GetBool("h"),   "map entry: h");
+						Assert.AreEqual(i, message.Properties.GetByte("i"),   "map entry: i");
+						Assert.AreEqual(j, message.Properties.GetShort("j"),  "map entry: j");
+						Assert.AreEqual(k, message.Properties.GetInt("k"),    "map entry: k");
+						Assert.AreEqual(l, message.Properties.GetLong("l"),   "map entry: l");
+						Assert.AreEqual(m, message.Properties.GetFloat("m"),  "map entry: m");
+						Assert.AreEqual(n, message.Properties.GetDouble("n"), "map entry: n");
+					}
+				}
+			}
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/MessageTransformerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/MessageTransformerTest.cs b/src/test/csharp/MessageTransformerTest.cs
new file mode 100644
index 0000000..f2d5b12
--- /dev/null
+++ b/src/test/csharp/MessageTransformerTest.cs
@@ -0,0 +1,124 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class MessageTransformerTest : NMSTest
+	{
+		private string propertyName = "ADDITIONAL-PROPERTY";
+		private string propertyValue = "ADDITIONAL-PROPERTY-VALUE";
+
+		protected MessageTransformerTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[Test]
+		public virtual void TestProducerTransformer(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = session.CreateTemporaryTopic();
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						producer.ProducerTransformer = DoProducerTransform;
+
+                        IMessage message = session.CreateMessage();
+
+                        message.Properties["Test"] = "Value";
+
+                        producer.Send(message);
+
+                        message = consumer.Receive(TimeSpan.FromMilliseconds(5000));
+
+                        Assert.IsNotNull(message);
+                        Assert.IsTrue(message.Properties.Count == 2);
+
+                        Assert.AreEqual("Value", message.Properties["Test"]);
+                        Assert.AreEqual(propertyValue, message.Properties[propertyName]);
+					}
+				}
+			}
+		}
+		
+		//[Test]
+		public virtual void TestConsumerTransformer(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = session.CreateTemporaryTopic();
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+
+						consumer.ConsumerTransformer = DoConsumerTransform;
+
+                        IMessage message = session.CreateMessage();
+
+                        message.Properties["Test"] = "Value";
+
+                        producer.Send(message);
+
+                        message = consumer.Receive(TimeSpan.FromMilliseconds(5000));
+
+                        Assert.IsNotNull(message);
+                        Assert.IsTrue(message.Properties.Count == 2, "Property Count should be 2");
+
+                        Assert.AreEqual("Value", message.Properties["Test"], "Property 'Value' was incorrect");
+                        Assert.AreEqual(propertyValue, message.Properties[propertyName], "Property not inserted");
+                    }
+				}
+			}
+		}
+		
+		private IMessage DoProducerTransform(ISession session, IMessageProducer producer, IMessage message)
+		{
+			message.Properties[propertyName] = propertyValue;
+			
+			return message;
+		}
+
+		private IMessage DoConsumerTransform(ISession session, IMessageConsumer consumer, IMessage message)
+		{
+            IMessage newMessage = session.CreateMessage();
+
+            MessageTransformation.CopyNMSMessageProperties(message, newMessage);
+
+			newMessage.Properties[propertyName] = propertyValue;
+
+			return newMessage;
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/NMSPropertyTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/NMSPropertyTest.cs b/src/test/csharp/NMSPropertyTest.cs
new file mode 100644
index 0000000..82b1021
--- /dev/null
+++ b/src/test/csharp/NMSPropertyTest.cs
@@ -0,0 +1,82 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class NMSPropertyTest : NMSTest
+	{
+		// standard NMS properties
+		protected string expectedText = "Hey this works!";
+		protected string correlationID = "FooBar";
+		protected MsgPriority priority = MsgPriority.Normal;
+		protected String type = "FooType";
+		protected String groupID = "BarGroup";
+		protected int groupSeq = 1;
+
+		protected NMSPropertyTest(NMSTestSupport testSupport)
+			: base (testSupport)
+		{
+		}
+
+		//[Test]
+		public void TestSendReceiveNMSProperties(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.Priority = priority;
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage request = session.CreateTextMessage(expectedText);
+
+						// Set the headers
+						request.NMSCorrelationID = correlationID;
+						request.NMSType = type;
+						request.Properties["NMSXGroupID"] = groupID;
+						request.Properties["NMSXGroupSeq"] = groupSeq;
+
+						producer.Send(request);
+
+						ITextMessage message = consumer.Receive(receiveTimeout) as ITextMessage;
+
+						Assert.IsNotNull(message, "Did not receive an ITextMessage!");
+						Assert.AreEqual(expectedText, message.Text, "Message text does not match.");
+
+						// compare standard NMS headers
+						Assert.AreEqual(correlationID, message.NMSCorrelationID, "NMSCorrelationID does not match");
+						Assert.AreEqual(deliveryMode, message.NMSDeliveryMode, "NMSDeliveryMode does not match");
+						Assert.AreEqual(priority, message.NMSPriority, "NMSPriority does not match");
+						Assert.AreEqual(type, message.NMSType, "NMSType does not match");
+						Assert.AreEqual(groupID, message.Properties["NMSXGroupID"], "NMSXGroupID does not match");
+						Assert.AreEqual(groupSeq, message.Properties["NMSXGroupSeq"], "NMSXGroupSeq does not match");
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/NMSTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/NMSTest.cs b/src/test/csharp/NMSTest.cs
new file mode 100644
index 0000000..1069586
--- /dev/null
+++ b/src/test/csharp/NMSTest.cs
@@ -0,0 +1,508 @@
+/*
+ * 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.Xml;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	/// <summary>
+	/// Base class for test cases
+	/// </summary>
+	public abstract class NMSTest
+	{
+		protected TimeSpan receiveTimeout = TimeSpan.FromMilliseconds(15000);
+
+		public static string ToHex(long value)
+		{
+			return String.Format("{0:x}", value);
+		}
+
+		#region Constructors and test support
+
+		private NMSTestSupport testSupport;
+
+		static NMSTest()
+		{
+			Apache.NMS.Tracer.Trace = new NMSTracer();
+		}
+
+		protected NMSTest(NMSTestSupport testSupport)
+		{
+			this.testSupport = testSupport;
+			this.testSupport.TestClassType = this.GetType();
+		}
+
+		#endregion
+
+		#region Set up and tear down
+
+		[SetUp]
+		public virtual void SetUp()
+		{
+			this.testSupport.SetUp();
+		}
+
+		[TearDown]
+		public virtual void TearDown()
+		{
+			this.testSupport.TearDown();
+		}
+
+		#endregion
+
+		#region Configuration file
+
+		/// <summary>
+		/// The configuration document.
+		/// </summary>
+		public XmlDocument ConfigurationDocument
+		{
+			get { return this.testSupport.ConfigurationDocument; }
+		}
+
+		/// <summary>
+		/// Loads the configuration file.
+		/// </summary>
+		/// <returns>XmlDocument of the configuration file</returns>
+		protected virtual XmlDocument LoadConfigFile()
+		{
+			return this.testSupport.LoadConfigFile();
+		}
+
+		/// <summary>
+		/// Loads the configuration file.
+		/// </summary>
+		/// <param name="configFilePath">Configuration file path</param>
+		/// <returns>XmlDocument of the configuration file</returns>
+		protected virtual XmlDocument LoadConfigFile(string configFilePath)
+		{
+			return this.testSupport.LoadConfigFile(configFilePath);
+		}
+
+		/// <summary>
+		/// Gets the path of the configuration filename.
+		/// </summary>
+		/// <returns>Path of the configuration filename</returns>
+		protected virtual string GetConfigFilePath()
+		{
+			return this.testSupport.GetConfigFilePath();
+		}
+
+		/// <summary>
+		/// Gets the environment variable name for the configuration file path.
+		/// </summary>
+		/// <returns>Environment variable name</returns>
+		protected virtual string GetConfigEnvVarName()
+		{
+			return this.testSupport.GetConfigEnvVarName();
+		}
+
+		/// <summary>
+		/// Gets the default name for the configuration filename.
+		/// </summary>
+		/// <returns>Default name of the configuration filename</returns>
+		protected virtual string GetDefaultConfigFileName()
+		{
+			return this.testSupport.GetDefaultConfigFileName();
+		}
+
+		/// <summary>
+		/// Gets the value of the "value" attribute of the specified node.
+		/// </summary>
+		/// <param name="parentNode">Parent node</param>
+		/// <param name="nodeName">Node name</param>
+		/// <param name="defaultVaue">Default value</param>
+		/// <returns></returns>
+		protected virtual string GetNodeValueAttribute(XmlElement parentNode,
+			string nodeName, string defaultVaue)
+		{
+			return this.testSupport.GetNodeValueAttribute(parentNode,
+				nodeName, defaultVaue);
+		}
+
+		#endregion
+
+		#region URI node
+
+		/// <summary>
+		/// Gets the URI node for the default configuration.
+		/// </summary>
+		/// <returns>URI node for the default configuration name</returns>
+		public virtual XmlElement GetURINode()
+		{
+			return this.testSupport.GetURINode();
+		}
+
+		/// <summary>
+		/// Gets the URI node for the default configuration.
+		/// </summary>
+		/// <param name="nameTestURI">Name of the default configuration node
+		/// </param>
+		/// <returns>URI node for the default configuration name</returns>
+		public virtual XmlElement GetURINode(string nameTestURI)
+		{
+			return this.testSupport.GetURINode(nameTestURI);
+		}
+
+		/// <summary>
+		/// Gets the name of the default connection configuration to be loaded.
+		/// </summary>
+		/// <returns>Default configuration name</returns>
+		protected virtual string GetNameTestURI()
+		{
+			return this.testSupport.GetNameTestURI();
+		}
+
+		#endregion
+
+		#region Factory
+
+		private NMSConnectionFactory nmsFactory;
+		/// <summary>
+		/// The connection factory interface property.
+		/// </summary>
+		public IConnectionFactory Factory
+		{
+			get { return this.testSupport.Factory; }
+		}
+
+		/// <summary>
+		/// Create the NMS Factory that can create NMS Connections.
+		/// </summary>
+		/// <returns>Connection factory</returns>
+		protected NMSConnectionFactory CreateNMSFactory()
+		{
+			return this.testSupport.CreateNMSFactory();
+		}
+
+		/// <summary>
+		/// Create the NMS Factory that can create NMS Connections. This
+		/// function loads the connection settings from the configuration file.
+		/// </summary>
+		/// <param name="nameTestURI">The named connection configuration.
+		/// </param>
+		/// <returns>Connection factory</returns>
+		protected NMSConnectionFactory CreateNMSFactory(string nameTestURI)
+		{
+			return this.testSupport.CreateNMSFactory(nameTestURI);
+		}
+
+		/// <summary>
+		/// Get the parameters for the ConnectionFactory from the configuration
+		/// file.
+		/// </summary>
+		/// <param name="uriNode">Parent node of the factoryParams node.</param>
+		/// <returns>Object array of parameter objects to be passsed to provider
+		/// factory object.  Null if no parameters are specified in
+		/// configuration file.</returns>
+		protected object[] GetFactoryParams(XmlElement uriNode)
+		{
+			return this.testSupport.GetFactoryParams(uriNode);
+		}
+
+		#endregion
+
+		#region Client id and connection
+
+		/// <summary>
+		/// Client id.
+		/// </summary>
+		public string ClientId
+		{
+			get { return this.testSupport.ClientId; }
+		}
+
+		/// <summary>
+		/// Gets a new client id.
+		/// </summary>
+		/// <returns>Client id</returns>
+		public virtual string GetTestClientId()
+		{
+			return this.testSupport.GetTestClientId();
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <returns>New connection</returns>
+		public virtual IConnection CreateConnection()
+		{
+			return this.testSupport.CreateConnection();
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns>New connection</returns>
+		public virtual IConnection CreateConnection(string newClientId)
+		{
+			return this.testSupport.CreateConnection(newClientId);
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker, and start it.
+		/// </summary>
+		/// <returns>Started connection</returns>
+		public virtual IConnection CreateConnectionAndStart()
+		{
+			return this.testSupport.CreateConnectionAndStart();
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker, and start it.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns>Started connection</returns>
+		public virtual IConnection CreateConnectionAndStart(string newClientId)
+		{
+			return this.testSupport.CreateConnectionAndStart(newClientId);
+		}
+
+		#endregion
+
+		#region Destination
+
+		/// <summary>
+		/// Gets a clear destination.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination</returns>
+		public virtual IDestination GetClearDestination(ISession session,
+			DestinationType type, string destinationRef)
+		{
+			return this.testSupport.GetClearDestination(session, type, destinationRef);
+		}
+
+		/// <summary>
+		/// Gets a clear destination. This will try to delete an existing
+		/// destination and re-create it.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="destinationURI">Destination URI</param>
+		/// <returns>Clear destination</returns>
+		public virtual IDestination GetClearDestination(ISession session,
+			string destinationURI)
+		{
+			return this.testSupport.GetClearDestination(session, destinationURI);
+		}
+
+		/// <summary>
+		/// Gets an existing destination. Don't clear its contents.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination</returns>
+		public virtual IDestination GetDestination(ISession session,
+			DestinationType type, string destinationRef)
+		{
+			return this.testSupport.GetDestination(session, type, destinationRef);
+		}
+
+		/// <summary>
+		/// Gets a destination URI.
+		/// </summary>
+		/// <param name="type">Destination type</param>
+		/// <param name="destinationRef">Configuration node name for the
+		/// destination URI</param>
+		/// <returns>Destination URI</returns>
+		public virtual string GetDestinationURI(DestinationType type, string destinationRef)
+		{
+			return this.testSupport.GetDestinationURI(type, destinationRef);
+		}
+
+		#endregion
+
+		#region Durable consumer
+
+		/// <summary>
+		/// Register a durable consumer
+		/// </summary>
+		/// <param name="connectionID">Connection ID of the consumer.</param>
+		/// <param name="destination">Destination name to register.  Supports
+		/// embedded prefix names.</param>
+		/// <param name="consumerID">Name of the durable consumer.</param>
+		/// <param name="selector">Selector parameters for consumer.</param>
+		/// <param name="noLocal"></param>
+		protected void RegisterDurableConsumer(string connectionID,
+			string destination, string consumerID, string selector, bool noLocal)
+		{
+			using(IConnection connection = CreateConnection(connectionID))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(
+					AcknowledgementMode.DupsOkAcknowledge))
+				{
+					ITopic destinationTopic = (ITopic)SessionUtil.GetDestination(session, destination);
+					Assert.IsNotNull(destinationTopic, "Could not get destination topic.");
+
+					using(IMessageConsumer consumer = session.CreateDurableConsumer(destinationTopic, consumerID, selector, noLocal))
+					{
+						Assert.IsNotNull(consumer, "Could not create durable consumer.");
+					}
+				}
+			}
+		}
+
+		/// <summary>
+		/// Unregister a durable consumer for the given connection ID.
+		/// </summary>
+		/// <param name="connectionID">Connection ID of the consumer.</param>
+		/// <param name="consumerID">Name of the durable consumer.</param>
+		protected void UnregisterDurableConsumer(string connectionID, string consumerID)
+		{
+			using(IConnection connection = CreateConnection(connectionID))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.DupsOkAcknowledge))
+				{
+					session.DeleteDurableConsumer(consumerID);
+				}
+			}
+		}
+
+		#endregion
+
+		#region Send messages
+
+		/// <summary>
+		/// Sends a specified number of text messages to the designated
+		/// destination.
+		/// </summary>
+		/// <param name="destination">Destination.</param>
+		/// <param name="deliveryMode">Delivery mode.</param>
+		/// <param name="count">Number of messages to be sent.</param>
+		public void SendMessages(IDestination destination,
+			MsgDeliveryMode deliveryMode, int count)
+		{
+			IConnection connection = CreateConnection();
+			connection.Start();
+			SendMessages(connection, destination, deliveryMode, count);
+			connection.Close();
+		}
+
+		/// <summary>
+		/// Sends a specified number of text messages to the designated
+		/// destination.
+		/// </summary>
+		/// <param name="connection">Connection.</param>
+		/// <param name="destination">Destination.</param>
+		/// <param name="deliveryMode">Delivery mode.</param>
+		/// <param name="count">Number of messages to be sent.</param>
+		public void SendMessages(IConnection connection,
+			IDestination destination, MsgDeliveryMode deliveryMode, int count)
+		{
+			ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+			SendMessages(session, destination, deliveryMode, count);
+			session.Close();
+		}
+
+		/// <summary>
+		/// Sends a specified number of text messages to the designated
+		/// destination.
+		/// </summary>
+		/// <param name="session">Session.</param>
+		/// <param name="destination">Destination.</param>
+		/// <param name="deliveryMode">Delivery mode.</param>
+		/// <param name="count">Number of messages to be sent.</param>
+		public void SendMessages(ISession session, IDestination destination,
+			MsgDeliveryMode deliveryMode, int count)
+		{
+			IMessageProducer producer = session.CreateProducer(destination);
+			producer.DeliveryMode = deliveryMode;
+			for(int i = 0; i < count; i++)
+			{
+				producer.Send(session.CreateTextMessage("" + i));
+			}
+			producer.Close();
+		}
+
+		#endregion
+
+		#region Check messages
+
+		protected void AssertTextMessagesEqual(IMessage[] firstSet, IMessage[] secondSet)
+		{
+			AssertTextMessagesEqual(firstSet, secondSet, "");
+		}
+
+		protected void AssertTextMessagesEqual(IMessage[] firstSet, IMessage[] secondSet, string messsage)
+		{
+			Assert.AreEqual(firstSet.Length, secondSet.Length, "Message count does not match: " + messsage);
+
+			for(int i = 0; i < secondSet.Length; i++)
+			{
+				ITextMessage m1 = firstSet[i] as ITextMessage;
+				ITextMessage m2 = secondSet[i] as ITextMessage;
+
+				AssertTextMessageEqual(m1, m2, "Message " + (i + 1) + " did not match : ");
+			}
+		}
+
+		protected void AssertEquals(ITextMessage m1, ITextMessage m2)
+		{
+			AssertEquals(m1, m2, "");
+		}
+
+		protected void AssertTextMessageEqual(ITextMessage m1, ITextMessage m2, string message)
+		{
+			Assert.IsFalse(m1 == null ^ m2 == null, message + ": expected {" + m1 + "}, but was {" + m2 + "}");
+
+			if(m1 == null)
+			{
+				return;
+			}
+
+			Assert.AreEqual(m1.Text, m2.Text, message);
+		}
+
+		protected void AssertEquals(IMessage m1, IMessage m2)
+		{
+			AssertEquals(m1, m2, "");
+		}
+
+		protected void AssertEquals(IMessage m1, IMessage m2, string message)
+		{
+			Assert.IsFalse(m1 == null ^ m2 == null, message + ": expected {" + m1 + "}, but was {" + m2 + "}");
+
+			if(m1 == null)
+			{
+				return;
+			}
+
+			Assert.IsTrue(m1.GetType() == m2.GetType(), message + ": expected {" + m1 + "}, but was {" + m2 + "}");
+
+			if(m1 is ITextMessage)
+			{
+				AssertTextMessageEqual((ITextMessage) m1, (ITextMessage) m2, message);
+			}
+			else
+			{
+				Assert.AreEqual(m1, m2, message);
+			}
+		}
+
+		#endregion
+	}
+}


[02/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSConnectionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSConnectionTest.cs b/src/test/csharp/XMSConnectionTest.cs
new file mode 100644
index 0000000..10b778b
--- /dev/null
+++ b/src/test/csharp/XMSConnectionTest.cs
@@ -0,0 +1,104 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSConnectionTest : ConnectionTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+		protected static string DEFAULT_TEST_TOPIC = "defaultTestTopic";
+
+		public XMSConnectionTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+		}
+	
+		[TearDown]
+		public override void TearDown()
+		{
+			base.TearDown();
+		}
+	
+		/// <summary>
+		/// Verify that it is possible to create multiple connections to the broker.
+		/// There was a bug in the connection factory which set the clientId member which made
+		/// it impossible to create an additional connection.
+		/// </summary>
+		[Test]
+		public override void TestTwoConnections()
+		{
+			base.TestTwoConnections();
+		}
+	
+		[Test]
+		public void TestCreateAndDisposeWithConsumer(
+			[Values(true, false)]
+			bool disposeConsumer)
+		{
+			base.TestCreateAndDisposeWithConsumer(disposeConsumer, DEFAULT_TEST_QUEUE);
+		}
+	
+		[Test]
+		public void TestCreateAndDisposeWithProducer(
+			[Values(true, false)]
+			bool disposeProducer)
+		{
+			base.TestCreateAndDisposeWithProducer(disposeProducer, DEFAULT_TEST_QUEUE);
+		}
+	
+		[Test]
+		public void TestStartAfterSend(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			[Values(DestinationType.Queue, DestinationType.Topic)]
+			DestinationType destinationType)
+		{
+			base.TestStartAfterSend(deliveryMode, destinationType,
+				destinationType == DestinationType.Queue ? DEFAULT_TEST_QUEUE : DEFAULT_TEST_TOPIC);
+		}
+
+		/// <summary>
+		/// Tests if the consumer receives the messages that were sent before the
+		/// connection was started.
+		/// </summary>
+		[Test]
+		public void TestStoppedConsumerHoldsMessagesTillStarted()
+		{
+			base.TestStoppedConsumerHoldsMessagesTillStarted(DEFAULT_TEST_TOPIC);
+		}
+	
+		/// <summary>
+		/// Tests if the consumer is able to receive messages eveb when the
+		/// connecction restarts multiple times.
+		/// </summary>
+		[Test]
+		public void TestMultipleConnectionStops()
+		{
+			base.TestMultipleConnectionStops(DEFAULT_TEST_TOPIC);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSConsumerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSConsumerTest.cs b/src/test/csharp/XMSConsumerTest.cs
new file mode 100644
index 0000000..522dfe2
--- /dev/null
+++ b/src/test/csharp/XMSConsumerTest.cs
@@ -0,0 +1,153 @@
+/*
+ * 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.Threading;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSConsumerTest : ConsumerTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+		protected static string DEFAULT_TEST_TOPIC = "defaultTestTopic";
+
+		public XMSConsumerTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+// The .NET CF does not have the ability to interrupt threads, so this test is impossible.
+#if !NETCF
+		[Test]
+		public override void TestNoTimeoutConsumer(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			base.TestNoTimeoutConsumer(ackMode);
+		}
+
+		[Test]
+		public override void TestSyncReceiveConsumerClose(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			base.TestSyncReceiveConsumerClose(ackMode);
+		}
+
+		[Test]
+		public override void TestDoChangeSentMessage(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode,
+			[Values(true, false)] bool doClear)
+		{
+			base.TestDoChangeSentMessage(ackMode, doClear);
+		}
+
+		[Test]
+		public override void TestConsumerReceiveBeforeMessageDispatched(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			base.TestConsumerReceiveBeforeMessageDispatched(ackMode);
+		}
+
+		[Test]
+		public void TestDontStart(
+			[Values(MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			[Values(DestinationType.Queue, DestinationType.Topic)]
+			DestinationType destinationType)
+		{
+			base.TestDontStart(deliveryMode, destinationType,
+				destinationType == DestinationType.Queue ? DEFAULT_TEST_QUEUE : DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestSendReceiveTransacted(
+			[Values(MsgDeliveryMode.NonPersistent, MsgDeliveryMode.Persistent)]
+			MsgDeliveryMode deliveryMode,
+			[Values(DestinationType.Queue, DestinationType.Topic, DestinationType.TemporaryQueue, DestinationType.TemporaryTopic)]
+			DestinationType destinationType)
+		{
+			string testDestinationRef;
+			switch(destinationType)
+			{
+			case DestinationType.Queue: testDestinationRef = DEFAULT_TEST_QUEUE; break;
+			case DestinationType.Topic: testDestinationRef = DEFAULT_TEST_TOPIC; break;
+			default:                    testDestinationRef = "";                 break;
+			}
+
+			base.TestSendReceiveTransacted(deliveryMode, destinationType, testDestinationRef);
+		}
+
+		[Test]
+		public void TestAckedMessageAreConsumed()
+		{
+			base.TestAckedMessageAreConsumed(DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestLastMessageAcked()
+		{
+			base.TestLastMessageAcked(DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestUnAckedMessageAreNotConsumedOnSessionClose()
+		{
+			base.TestUnAckedMessageAreNotConsumedOnSessionClose(DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestAsyncAckedMessageAreConsumed()
+		{
+			base.TestAsyncAckedMessageAreConsumed(DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public void TestAsyncUnAckedMessageAreNotConsumedOnSessionClose()
+		{
+			base.TestAsyncUnAckedMessageAreNotConsumedOnSessionClose(DEFAULT_TEST_QUEUE);
+		}
+
+		[Test]
+		public override void TestAddRemoveAsnycMessageListener()
+		{
+			base.TestAddRemoveAsnycMessageListener();
+		}
+
+		[Test]
+		public override void TestReceiveNoWait(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode,
+			[Values(MsgDeliveryMode.NonPersistent, MsgDeliveryMode.Persistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestReceiveNoWait(ackMode, deliveryMode);
+		}
+
+#endif
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSDurableTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSDurableTest.cs b/src/test/csharp/XMSDurableTest.cs
new file mode 100644
index 0000000..994ecf8
--- /dev/null
+++ b/src/test/csharp/XMSDurableTest.cs
@@ -0,0 +1,71 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSDurableTest : DurableTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+		protected static string DEFAULT_TEST_TOPIC = "defaultTestTopic";
+		protected static string DURABLE_TEST_TOPIC = "durableConsumerTestTopic";
+
+		public XMSDurableTest()
+			: base(new XMSTestSupport())
+		{
+		}
+		
+		[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+		}
+
+		[Test]
+		public void TestSendWhileClosed(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			base.TestSendWhileClosed(ackMode, DEFAULT_TEST_TOPIC);
+	    }		
+		
+		[Test]
+		public void TestDurableConsumerSelectorChange(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			base.TestDurableConsumerSelectorChange(ackMode, DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestDurableConsumer(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+				AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			string testDurableTopicURI = GetDestinationURI(DestinationType.Topic, DURABLE_TEST_TOPIC);
+
+			base.TestDurableConsumer(ackMode, testDurableTopicURI); 
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSForeignMessageTransformationTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSForeignMessageTransformationTest.cs b/src/test/csharp/XMSForeignMessageTransformationTest.cs
new file mode 100644
index 0000000..0b6d144
--- /dev/null
+++ b/src/test/csharp/XMSForeignMessageTransformationTest.cs
@@ -0,0 +1,75 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+    [TestFixture]
+    public class XMSForeignMessageTransformationTest : ForeignMessageTransformationTest
+    {
+		protected static string DEFAULT_TEST_TOPIC = "defaultTestTopic";
+
+		public XMSForeignMessageTransformationTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void TestSendReceiveForeignMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveForeignMessage(deliveryMode, DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestSendReceiveForeignTextMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveForeignTextMessage(deliveryMode, DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestSendReceiveForeignBytesMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveForeignBytesMessage(deliveryMode, DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestSendReceiveForeignMapMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveForeignMapMessage(deliveryMode, DEFAULT_TEST_TOPIC);
+		}
+
+		[Test]
+		public void TestSendReceiveForeignStreamMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveForeignStreamMessage(deliveryMode, DEFAULT_TEST_TOPIC);
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSMapMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSMapMessageTest.cs b/src/test/csharp/XMSMapMessageTest.cs
new file mode 100644
index 0000000..c92cd89
--- /dev/null
+++ b/src/test/csharp/XMSMapMessageTest.cs
@@ -0,0 +1,49 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+    [TestFixture]
+    public class XMSMapMessageTest : MapMessageTest
+    {
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSMapMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+        [Test]
+        public void TestSendReceiveMapMessage(
+            [Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+            MsgDeliveryMode deliveryMode)
+        {
+            base.TestSendReceiveMapMessage(deliveryMode, DEFAULT_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestSendReceiveNestedMapMessage(
+            [Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+            MsgDeliveryMode deliveryMode)
+        {
+            base.TestSendReceiveNestedMapMessage(deliveryMode, DEFAULT_TEST_QUEUE);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSMessageSelectorTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSMessageSelectorTest.cs b/src/test/csharp/XMSMessageSelectorTest.cs
new file mode 100644
index 0000000..179bbf9
--- /dev/null
+++ b/src/test/csharp/XMSMessageSelectorTest.cs
@@ -0,0 +1,60 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	[Category("LongRunning")]
+	public class XMSMessageSelectorTest : MessageSelectorTest
+	{
+		protected const string SELECTOR_TEST_QUEUE = "messageSelectorTestQueue";
+		protected const string SELECTOR_TEST_TOPIC = "messageSelectorTestTopic";
+
+		public XMSMessageSelectorTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public override void TestFilterIgnoredMessages(
+			[Values(SELECTOR_TEST_QUEUE, SELECTOR_TEST_TOPIC)]
+			string testDestinationRef)
+		{
+			string testDestinationURI = GetDestinationURI(
+				testDestinationRef == SELECTOR_TEST_QUEUE ? DestinationType.Queue : DestinationType.Topic,
+				testDestinationRef);
+
+			base.TestFilterIgnoredMessages(testDestinationURI);
+		}
+
+		[Test]
+		public override void TestFilterIgnoredMessagesSlowConsumer(
+			[Values(SELECTOR_TEST_QUEUE, SELECTOR_TEST_TOPIC)]
+			string testDestinationRef)
+		{
+			string testDestinationURI = GetDestinationURI(
+				testDestinationRef == SELECTOR_TEST_QUEUE ? DestinationType.Queue : DestinationType.Topic,
+				testDestinationRef);
+
+			base.TestFilterIgnoredMessagesSlowConsumer(testDestinationURI);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSMessageTest.cs b/src/test/csharp/XMSMessageTest.cs
new file mode 100644
index 0000000..9e2f367
--- /dev/null
+++ b/src/test/csharp/XMSMessageTest.cs
@@ -0,0 +1,42 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSMessageTest : MessageTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void TestSendReceiveMessageProperties(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveMessageProperties(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSMessageTransformerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSMessageTransformerTest.cs b/src/test/csharp/XMSMessageTransformerTest.cs
new file mode 100644
index 0000000..58e8b54
--- /dev/null
+++ b/src/test/csharp/XMSMessageTransformerTest.cs
@@ -0,0 +1,48 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSMessageTransformerTest : MessageTransformerTest
+	{
+		public XMSMessageTransformerTest()
+			: base(new XMSTestSupport())
+		{
+		}
+				
+		[Test]
+		public override void TestProducerTransformer(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestProducerTransformer(deliveryMode);
+		}
+		
+		[Test]
+		public override void TestConsumerTransformer(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestConsumerTransformer(deliveryMode);
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSNMSPropertyTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSNMSPropertyTest.cs b/src/test/csharp/XMSNMSPropertyTest.cs
new file mode 100644
index 0000000..eed608a
--- /dev/null
+++ b/src/test/csharp/XMSNMSPropertyTest.cs
@@ -0,0 +1,41 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSNMSPropertyTest : NMSPropertyTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSNMSPropertyTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void TestSendReceiveNMSProperties(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveNMSProperties(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSProducerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSProducerTest.cs b/src/test/csharp/XMSProducerTest.cs
new file mode 100644
index 0000000..58ce283
--- /dev/null
+++ b/src/test/csharp/XMSProducerTest.cs
@@ -0,0 +1,49 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSProducerTest : ProducerTest
+	{
+		public XMSProducerTest()
+			: base(new NMSTestSupport())
+		{
+		}
+
+        [Test]
+        public override void TestProducerSendToNullDestinationWithoutDefault()
+        {
+            base.TestProducerSendToNullDestinationWithoutDefault();
+        }
+
+        [Test]
+        public override void TestProducerSendToNullDestinationWithDefault()
+        {
+            base.TestProducerSendToNullDestinationWithDefault();
+        }
+
+		[Test]
+		public override void TestProducerSendToNonDefaultDestination()
+		{
+            base.TestProducerSendToNonDefaultDestination();
+        }
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSRequestResponseTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSRequestResponseTest.cs b/src/test/csharp/XMSRequestResponseTest.cs
new file mode 100644
index 0000000..0d96e29
--- /dev/null
+++ b/src/test/csharp/XMSRequestResponseTest.cs
@@ -0,0 +1,41 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSRequestResponseTest : RequestResponseTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSRequestResponseTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		[Category("RequestResponse")]		
+		public void TestRequestResponseMessaging()
+		{
+			base.TestRequestResponseMessaging(DEFAULT_TEST_QUEUE);
+		}
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSStreamMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSStreamMessageTest.cs b/src/test/csharp/XMSStreamMessageTest.cs
new file mode 100644
index 0000000..8331c2e
--- /dev/null
+++ b/src/test/csharp/XMSStreamMessageTest.cs
@@ -0,0 +1,41 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSStreamMessageTest : StreamMessageTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSStreamMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void TestSendReceiveStreamMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveStreamMessage(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSTempDestinationDeletionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSTempDestinationDeletionTest.cs b/src/test/csharp/XMSTempDestinationDeletionTest.cs
new file mode 100644
index 0000000..e9d5f45
--- /dev/null
+++ b/src/test/csharp/XMSTempDestinationDeletionTest.cs
@@ -0,0 +1,55 @@
+\ufeff/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSTempDestinationDeletionTest : TempDestinationDeletionTest
+	{
+		protected const string DELETION_TEST_QUEUE = "deletionTestQueue";
+		protected const string DELETION_TEST_TOPIC = "deletionTestTopic";
+		protected const string DELETION_TEST_TEMP_QUEUE = "deletionTestTempQueue";
+		protected const string DELETION_TEST_TEMP_TOPIC = "deletionTestTempTopic";
+
+		public XMSTempDestinationDeletionTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public override void TestTempDestinationDeletion(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			[Values(DELETION_TEST_QUEUE, DELETION_TEST_TOPIC, DELETION_TEST_TEMP_QUEUE, DELETION_TEST_TEMP_TOPIC)]
+			string testDestinationRef)
+		{
+            DestinationType type;
+			if     (testDestinationRef == DELETION_TEST_QUEUE)      type = DestinationType.Queue;
+			else if(testDestinationRef == DELETION_TEST_TOPIC)      type = DestinationType.Topic;
+			else if(testDestinationRef == DELETION_TEST_TEMP_QUEUE) type = DestinationType.TemporaryQueue;
+			else                                                    type = DestinationType.TemporaryTopic;
+
+			string testDestinationURI = GetDestinationURI(type, testDestinationRef);
+
+			base.TestTempDestinationDeletion(deliveryMode, testDestinationURI);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSTempDestinationTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSTempDestinationTest.cs b/src/test/csharp/XMSTempDestinationTest.cs
new file mode 100644
index 0000000..25d09bb
--- /dev/null
+++ b/src/test/csharp/XMSTempDestinationTest.cs
@@ -0,0 +1,67 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+    [TestFixture]
+    public class XMSTempDestinationTest : TempDestinationTest
+    {
+		public XMSTempDestinationTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+        [SetUp]
+        public override void SetUp()
+        {
+            base.SetUp();
+        }
+
+        [TearDown]
+        public override void TearDown()
+        {
+            base.TearDown();
+        }
+
+        [Test]
+        public override void TestTempDestOnlyConsumedByLocalConn()
+        {
+            base.TestTempDestOnlyConsumedByLocalConn();
+        }
+
+        [Test]
+        public override void TestTempQueueHoldsMessagesWithConsumers()
+        {
+            base.TestTempQueueHoldsMessagesWithConsumers();
+        }
+
+        [Test]
+        public override void TestTempQueueHoldsMessagesWithoutConsumers()
+        {
+            base.TestTempQueueHoldsMessagesWithoutConsumers();
+        }
+
+        [Test]
+        public override void TestTmpQueueWorksUnderLoad()
+        {
+            base.TestTmpQueueWorksUnderLoad();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSTestSupport.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSTestSupport.cs b/src/test/csharp/XMSTestSupport.cs
new file mode 100644
index 0000000..556012e
--- /dev/null
+++ b/src/test/csharp/XMSTestSupport.cs
@@ -0,0 +1,132 @@
+/*
+ * 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.Xml;
+using Apache.NMS.Test;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+using Apache.NMS.XMS;
+
+namespace Apache.NMS.XMS.Test
+{
+	/// <summary>
+	/// Useful class for test cases support.
+	/// </summary>
+	public class XMSTestSupport : NMSTestSupport
+	{
+		/// <summary>
+		/// Gets the environment variable name for the configuration file path.
+		/// </summary>
+		/// <returns>Environment variable name</returns>
+		public override string GetConfigEnvVarName()
+		{
+			return "XMSTESTCONFIGPATH";
+		}
+
+		/// <summary>
+		/// Gets the default name for the configuration filename.
+		/// </summary>
+		/// <returns>Default name of the configuration filename</returns>
+		public override string GetDefaultConfigFileName()
+		{
+			return "xmsprovider-test.config";
+		}
+
+		/// <summary>
+		/// Gets a new client id.
+		/// </summary>
+		/// <returns>Client id</returns>
+		public override string GetTestClientId()
+		{
+			return base.GetTestClientId();
+			//return null;
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns>New connection</returns>
+		public override IConnection CreateConnection(string newClientId)
+		{
+			IConnection newConnection;
+
+			// IBM.XMS throws an exception if attempting to set the ClientId
+			// on the Connection after it was created.
+			// In a multithreaded environment, it would probably be best to
+			// create as many factories as client ids, rather than change the
+			// client id on the factory before creating a connection. Plus it
+			// wouldn't be a good idea to protect the code section through a
+			// semaphore, since connections creation takes a long time to be
+			// performed.
+			if(newClientId != null)
+			{
+				((Apache.NMS.XMS.ConnectionFactory)Factory).ClientId = newClientId;
+			}
+
+			if(this.userName == null)
+			{
+				newConnection = Factory.CreateConnection();
+			}
+			else
+			{
+				newConnection = Factory.CreateConnection(userName, passWord);
+			}
+
+			Assert.IsNotNull(newConnection, "Connection not created");
+
+			return newConnection;
+		}
+
+		ISession cleanupSession = null;
+		/// <summary>
+		/// Gets a clear destination. This will try to delete an existing
+		/// destination and re-create it.
+		/// </summary>
+		/// <param name="session">Session</param>
+		/// <param name="destinationURI">Destination URI</param>
+		/// <returns>Clear destination</returns>
+		public override IDestination GetClearDestination(ISession session,
+			string destinationURI)
+		{
+			IDestination destination = SessionUtil.GetDestination(session, destinationURI);
+
+			// Destination exists. Can't use the given session to clean up:
+			// once used synchronously, IBM XMS doesn't allow the session to be
+			// used asynchronously. Therefore, we create a specific synchronous
+			// session to perform cleanups.
+			if(cleanupSession == null)
+			{
+				IConnection cleanupConnection = CreateConnection("Cleanup");
+				cleanupSession = cleanupConnection.CreateSession();
+			}
+
+			IDestination cleanupDestination = SessionUtil.GetDestination(cleanupSession, destinationURI);
+
+			using(IMessageConsumer consumer = cleanupSession.CreateConsumer(destination))
+			{
+				while(consumer.Receive(TimeSpan.FromMilliseconds(750)) != null)
+				{
+				}
+			}
+
+			return destination;
+		}
+
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSTextMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSTextMessageTest.cs b/src/test/csharp/XMSTextMessageTest.cs
new file mode 100644
index 0000000..bfbfd77
--- /dev/null
+++ b/src/test/csharp/XMSTextMessageTest.cs
@@ -0,0 +1,41 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSTextMessageTest : TextMessageTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSTextMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+		[Test]
+		public void TestSendReceiveTextMessage(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			base.TestSendReceiveTextMessage(deliveryMode, DEFAULT_TEST_QUEUE);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSTransactionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSTransactionTest.cs b/src/test/csharp/XMSTransactionTest.cs
new file mode 100644
index 0000000..f369c4f
--- /dev/null
+++ b/src/test/csharp/XMSTransactionTest.cs
@@ -0,0 +1,115 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+    [TestFixture]
+    public class XMSTransactionTest : TransactionTest
+    {
+        protected static string TRANSACTION_TEST_QUEUE = "transactionTestQueue";
+
+		public XMSTransactionTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+        [Test]
+        public void TestSendRollback(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestSendRollback(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestSendSessionClose(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestSendSessionClose(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestReceiveRollback(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestReceiveRollback(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+
+        [Test]
+        public void TestReceiveTwoThenRollback(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestReceiveTwoThenRollback(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestSendCommitNonTransaction(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestSendCommitNonTransaction(ackMode, deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestReceiveCommitNonTransaction(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+            base.TestReceiveCommitNonTransaction(ackMode, deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestReceiveRollbackNonTransaction(
+			[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge)]
+			AcknowledgementMode ackMode,
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+            base.TestReceiveRollbackNonTransaction(ackMode, deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestRedispatchOfRolledbackTx(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestRedispatchOfRolledbackTx(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+
+        [Test]
+        public void TestRedispatchOfUncommittedTx(
+			[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode)
+        {
+            base.TestRedispatchOfUncommittedTx(deliveryMode, TRANSACTION_TEST_QUEUE);
+        }
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XMSXmlMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XMSXmlMessageTest.cs b/src/test/csharp/XMSXmlMessageTest.cs
new file mode 100644
index 0000000..db0c80a
--- /dev/null
+++ b/src/test/csharp/XMSXmlMessageTest.cs
@@ -0,0 +1,52 @@
+/*
+ * 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 Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.XMS.Test
+{
+	[TestFixture]
+	public class XMSXmlMessageTest : XmlMessageTest
+	{
+		protected static string DEFAULT_TEST_QUEUE = "defaultTestQueue";
+
+		public XMSXmlMessageTest()
+			: base(new XMSTestSupport())
+		{
+		}
+
+#if NET_3_5 || MONO
+
+		[Test]
+		public void TestSendReceiveXmlMessage_Net35()
+		{
+			base.TestSendReceiveXmlMessage_Net35(DEFAULT_TEST_QUEUE);
+		}
+
+#else
+
+		// Test the obsolete API versions until they are completely removed.
+		[Test]
+		public void SendReceiveXmlMessage()
+		{
+			base.TestSendReceiveXmlMessage(DEFAULT_TEST_QUEUE);
+		}
+
+#endif
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/XmlMessageTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/XmlMessageTest.cs b/src/test/csharp/XmlMessageTest.cs
new file mode 100644
index 0000000..ebbb202
--- /dev/null
+++ b/src/test/csharp/XmlMessageTest.cs
@@ -0,0 +1,186 @@
+/*
+ * 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 Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	// For ease of cross-platform exchange of information, you might generate objects from
+	// an XSD file using XSDObjectGen. However, C# has built-in support for serializing.
+	// All of the XML attributes that are commented out are optional, but give you fine-grained
+	// control over the serialized format if you need it.
+
+	// [Serializable]
+	public enum CheckType
+	{
+		// [XmlEnum(Name = "message")]
+		message,
+		// [XmlEnum(Name = "command")]
+		command,
+		// [XmlEnum(Name = "response")]
+		response
+	}
+
+	// [XmlRoot(ElementName = "NMSTestXmlType1", IsNullable = false), Serializable]
+	public class NMSTestXmlType1
+	{
+		// [XmlElement(ElementName = "crcCheck", IsNullable = false, DataType = "int")]
+		public int crcCheck;
+
+		// [XmlElement(Type = typeof(CheckType), ElementName = "checkType", IsNullable = false)]
+		public CheckType checkType;
+
+		public NMSTestXmlType1()
+		{
+			crcCheck = 0;
+			checkType = CheckType.message;
+		}
+	}
+
+	// [XmlRoot(ElementName = "NMSTestXmlType2", IsNullable = false), Serializable]
+	public class NMSTestXmlType2
+	{
+		// [XmlElement(ElementName = "stringCheck", IsNullable = false, DataType = "string")]
+		public string stringCheck;
+
+		public NMSTestXmlType2()
+		{
+			stringCheck = String.Empty;
+		}
+	}
+
+	//[TestFixture]
+	public class XmlMessageTest : NMSTest
+	{
+		public XmlMessageTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+#if NET_3_5 || MONO
+
+		//[Test]
+		public virtual void TestSendReceiveXmlMessage_Net35(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						NMSTestXmlType1 srcIntObject = new NMSTestXmlType1();
+						srcIntObject.crcCheck = 0xbadf00d;
+						srcIntObject.checkType = CheckType.command;
+						producer.Send(srcIntObject);
+
+						NMSTestXmlType2 srcStringObject = new NMSTestXmlType2();
+						srcStringObject.stringCheck = "BadFood";
+						producer.Send(srcStringObject);
+
+						// Demonstrate the ability to generically handle multiple object types
+						// sent to the same consumer.  If only one object type is ever sent to
+						// the destination, then a simple inline cast is all that is necessary
+						// when calling the NMSConvert.FromXmlMessage() function.
+
+						for(int index = 0; index < 2; index++)
+						{
+							object receivedObject = consumer.Receive(receiveTimeout).ToObject();
+							Assert.IsNotNull(receivedObject, "Failed to retrieve XML message object.");
+
+							if(receivedObject is NMSTestXmlType1)
+							{
+								NMSTestXmlType1 destObject = (NMSTestXmlType1) receivedObject;
+								Assert.AreEqual(srcIntObject.crcCheck, destObject.crcCheck, "CRC integer mis-match.");
+								Assert.AreEqual(srcIntObject.checkType, destObject.checkType, "Check type mis-match.");
+							}
+							else if(receivedObject is NMSTestXmlType2)
+							{
+								NMSTestXmlType2 destObject = (NMSTestXmlType2) receivedObject;
+								Assert.AreEqual(srcStringObject.stringCheck, destObject.stringCheck, "CRC string mis-match.");
+							}
+							else
+							{
+								Assert.Fail("Invalid object type.");
+							}
+						}
+					}
+				}
+			}
+		}
+
+#else
+
+		// Test the obsolete API versions until they are completely removed.
+		//[Test]
+		public virtual void TestSendReceiveXmlMessage(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						NMSTestXmlType1 srcIntObject = new NMSTestXmlType1();
+						srcIntObject.crcCheck = 0xbadf00d;
+						srcIntObject.checkType = CheckType.command;
+						producer.Send(NMSConvert.ToXmlMessage(session, srcIntObject));
+
+						NMSTestXmlType2 srcStringObject = new NMSTestXmlType2();
+						srcStringObject.stringCheck = "BadFood";
+						producer.Send(NMSConvert.ToXmlMessage(session, srcStringObject));
+
+						// Demonstrate the ability to generically handle multiple object types
+						// sent to the same consumer.  If only one object type is ever sent to
+						// the destination, then a simple inline cast is all that is necessary
+						// when calling the NMSConvert.FromXmlMessage() function.
+
+						for(int index = 0; index < 2; index++)
+						{
+							object receivedObject = NMSConvert.FromXmlMessage(consumer.Receive(receiveTimeout));
+							Assert.IsNotNull(receivedObject, "Failed to retrieve XML message object.");
+
+							if(receivedObject is NMSTestXmlType1)
+							{
+								NMSTestXmlType1 destObject = (NMSTestXmlType1) receivedObject;
+								Assert.AreEqual(srcIntObject.crcCheck, destObject.crcCheck, "CRC integer mis-match.");
+								Assert.AreEqual(srcIntObject.checkType, destObject.checkType, "Check type mis-match.");
+							}
+							else if(receivedObject is NMSTestXmlType2)
+							{
+								NMSTestXmlType2 destObject = (NMSTestXmlType2) receivedObject;
+								Assert.AreEqual(srcStringObject.stringCheck, destObject.stringCheck, "CRC string mis-match.");
+							}
+							else
+							{
+								Assert.Fail("Invalid object type.");
+							}
+						}
+					}
+				}
+			}
+		}
+
+#endif
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/vs2013-xms-test.csproj
----------------------------------------------------------------------
diff --git a/vs2013-xms-test.csproj b/vs2013-xms-test.csproj
new file mode 100644
index 0000000..ccdcca0
--- /dev/null
+++ b/vs2013-xms-test.csproj
@@ -0,0 +1,196 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EB943C69-2C9B-45E7-B95B-FB916E7057ED}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Apache.NMS.XMS.Test</RootNamespace>
+    <AssemblyName>Apache.NMS.XMS.Test</AssemblyName>
+    <WarningLevel>4</WarningLevel>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>keyfile\NMSKey.snk</AssemblyOriginatorKeyFile>
+    <SccProjectName>Svn</SccProjectName>
+    <SccLocalPath>Svn</SccLocalPath>
+    <SccAuxPath>Svn</SccAuxPath>
+    <SccProvider>SubversionScc</SccProvider>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>build\net-4.0\debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;NET,NET_4_0</DefineConstants>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <NoWarn>3016</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>true</Optimize>
+    <OutputPath>build\net-4.0\release\</OutputPath>
+    <DefineConstants>TRACE;NET,NET_4_0</DefineConstants>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <DebugType>full</DebugType>
+    <NoWarn>3016</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Apache.NMS">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-4.0\Apache.NMS.dll</HintPath>
+    </Reference>
+    <Reference Include="Apache.NMS.Test">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-4.0\Apache.NMS.Test.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\NUnit\net-4.0\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="src\test\csharp\CommonAssemblyInfo.cs" />
+    <Compile Include="src\test\csharp\AsyncConsumeTest.cs" />
+    <Compile Include="src\test\csharp\BadConsumeTest.cs" />
+    <Compile Include="src\test\csharp\BytesMessageTest.cs" />
+    <Compile Include="src\test\csharp\CommonAssemblyInfo.cs" />
+    <Compile Include="src\test\csharp\ConnectionTest.cs" />
+    <Compile Include="src\test\csharp\ConsumerTest.cs" />
+    <Compile Include="src\test\csharp\DurableTest.cs" />
+    <Compile Include="src\test\csharp\EndianBinaryReaderTest.cs" />
+    <Compile Include="src\test\csharp\EndianBinaryWriterTest.cs" />
+    <Compile Include="src\test\csharp\EndianTest.cs" />
+    <Compile Include="src\test\csharp\ForeignMessageTransformationTest.cs" />
+    <Compile Include="src\test\csharp\MapMessageTest.cs" />
+    <Compile Include="src\test\csharp\MessageSelectorTest.cs" />
+    <Compile Include="src\test\csharp\MessageTest.cs" />
+    <Compile Include="src\test\csharp\MessageTransformerTest.cs" />
+    <Compile Include="src\test\csharp\NMSPropertyTest.cs" />
+    <Compile Include="src\test\csharp\NMSTest.cs" />
+    <Compile Include="src\test\csharp\NMSTestSupport.cs" />
+    <Compile Include="src\test\csharp\NMSTracer.cs" />
+    <Compile Include="src\test\csharp\PrimitiveMapTest.cs" />
+    <Compile Include="src\test\csharp\ProducerTest.cs" />
+    <Compile Include="src\test\csharp\RedeliveryPolicyTest.cs" />
+    <Compile Include="src\test\csharp\RequestResponseTest.cs" />
+    <Compile Include="src\test\csharp\StreamMessageTest.cs" />
+    <Compile Include="src\test\csharp\TempDestinationDeletionTest.cs" />
+    <Compile Include="src\test\csharp\TempDestinationTest.cs" />
+    <Compile Include="src\test\csharp\TextMessageTest.cs" />
+    <Compile Include="src\test\csharp\TransactionTest.cs" />
+    <Compile Include="src\test\csharp\XmlMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSAsyncConsumeTest.cs" />
+    <Compile Include="src\test\csharp\XMSBadConsumeTest.cs" />
+    <Compile Include="src\test\csharp\XMSBytesMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSConnectionTest.cs" />
+    <Compile Include="src\test\csharp\XMSConsumerTest.cs" />
+    <Compile Include="src\test\csharp\XMSDurableTest.cs" />
+    <Compile Include="src\test\csharp\XMSForeignMessageTransformationTest.cs" />
+    <Compile Include="src\test\csharp\XMSMapMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSMessageSelectorTest.cs" />
+    <Compile Include="src\test\csharp\XMSMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSMessageTransformerTest.cs" />
+    <Compile Include="src\test\csharp\XMSNMSPropertyTest.cs" />
+    <Compile Include="src\test\csharp\XMSProducerTest.cs" />
+    <Compile Include="src\test\csharp\XMSRequestResponseTest.cs" />
+    <Compile Include="src\test\csharp\XMSStreamMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSTempDestinationDeletionTest.cs" />
+    <Compile Include="src\test\csharp\XMSTempDestinationTest.cs" />
+    <Compile Include="src\test\csharp\XMSTestSupport.cs" />
+    <Compile Include="src\test\csharp\XMSTextMessageTest.cs" />
+    <Compile Include="src\test\csharp\XMSTransactionTest.cs" />
+    <Compile Include="src\test\csharp\XMSXmlMessageTest.cs" />
+    <Compile Include="src\test\csharp\Commands\BytesMessage.cs" />
+    <Compile Include="src\test\csharp\Commands\Destination.cs" />
+    <Compile Include="src\test\csharp\Commands\MapMessage.cs" />
+    <Compile Include="src\test\csharp\Commands\Message.cs" />
+    <Compile Include="src\test\csharp\Commands\ObjectMessage.cs" />
+    <Compile Include="src\test\csharp\Commands\Queue.cs" />
+    <Compile Include="src\test\csharp\Commands\StreamMessage.cs" />
+    <Compile Include="src\test\csharp\Commands\TempDestination.cs" />
+    <Compile Include="src\test\csharp\Commands\TempQueue.cs" />
+    <Compile Include="src\test\csharp\Commands\TempTopic.cs" />
+    <Compile Include="src\test\csharp\Commands\TextMessage.cs" />
+    <Compile Include="src\test\csharp\Commands\Topic.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Apache.NMS.XMS.Test.nunit">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="keyfile\XMSKey.snk" />
+    <Content Include="xmsprovider-test.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="vs2013-xms.csproj">
+      <Project>{2af5ebb5-9873-4b35-a8fc-8b6e74242767}</Project>
+      <Name>vs2013-xms</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PostBuildEvent>cd $(ProjectDir)
+nant -nologo -q install-all -D:compile.skip=true</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/vs2013-xms.csproj
----------------------------------------------------------------------
diff --git a/vs2013-xms.csproj b/vs2013-xms.csproj
new file mode 100644
index 0000000..86fbfc9
--- /dev/null
+++ b/vs2013-xms.csproj
@@ -0,0 +1,146 @@
+\ufeff<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Apache.NMS.XMS</RootNamespace>
+    <AssemblyName>Apache.NMS.XMS</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>keyfile\NMSKey.snk</AssemblyOriginatorKeyFile>
+    <SccProjectName>Svn</SccProjectName>
+    <SccLocalPath>Svn</SccLocalPath>
+    <SccAuxPath>Svn</SccAuxPath>
+    <SccProvider>SubversionScc</SccProvider>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>build\net-4.0\debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;NET,NET_4_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>build\net-4.0\release\</OutputPath>
+    <DefineConstants>TRACE;NET,NET_4_0</DefineConstants>
+    <ErrorReport>none</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DebugSymbols>true</DebugSymbols>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Apache.NMS">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-4.0\Apache.NMS.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="IBM.XMS">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\IBM.XMS\net-4.0\IBM.XMS.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="src\main\csharp\BytesMessage.cs" />
+    <Compile Include="src\main\csharp\CommonAssemblyInfo.cs" />
+    <Compile Include="src\main\csharp\Connection.cs" />
+    <Compile Include="src\main\csharp\ConnectionFactory.cs" />
+    <Compile Include="src\main\csharp\ConnectionMetaData.cs" />
+    <Compile Include="src\main\csharp\Destination.cs" />
+    <Compile Include="src\main\csharp\InitialContext.cs" />
+    <Compile Include="src\main\csharp\MapMessage.cs" />
+    <Compile Include="src\main\csharp\Message.cs" />
+    <Compile Include="src\main\csharp\MessageConsumer.cs" />
+    <Compile Include="src\main\csharp\MessageProducer.cs" />
+    <Compile Include="src\main\csharp\MessageProperties.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\TemporaryQueue.cs" />
+    <Compile Include="src\main\csharp\TemporaryTopic.cs" />
+    <Compile Include="src\main\csharp\TextMessage.cs" />
+    <Compile Include="src\main\csharp\Topic.cs" />
+    <Compile Include="src\main\csharp\Util\Dispatcher.cs" />
+    <Compile Include="src\main\csharp\Util\ExceptionUtil.cs" />
+    <Compile Include="src\main\csharp\Util\IntrospectionSupport.cs" />
+    <Compile Include="src\main\csharp\Util\UriAttributeAttribute.cs" />
+    <Compile Include="src\main\csharp\Util\XMSConvert.cs" />
+    <Compile Include="src\main\csharp\Util\XMSEnum.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="keyfile\XMSKey.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>cd $(ProjectDir)
+nant -nologo download-vendor -D:vendor.build.config=$(ConfigurationName) -D:vendor.build.framework=net-4.0</PreBuildEvent>
+    <PostBuildEvent>cd $(ProjectDir)
+nant -nologo -q install-all -D:compile.skip=true</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/vs2013-xms.sln
----------------------------------------------------------------------
diff --git a/vs2013-xms.sln b/vs2013-xms.sln
new file mode 100644
index 0000000..64bfb8e
--- /dev/null
+++ b/vs2013-xms.sln
@@ -0,0 +1,32 @@
+\ufeff
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vs2013-xms", "vs2013-xms.csproj", "{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vs2013-xms-test", "vs2013-xms-test.csproj", "{EB943C69-2C9B-45E7-B95B-FB916E7057ED}"
+EndProject
+Global
+	GlobalSection(SubversionScc) = preSolution
+		Svn-Managed = True
+		Manager = AnkhSVN - Subversion Support for Visual Studio
+	EndGlobalSection
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2AF5EBB5-9873-4B35-A8FC-8B6E74242767}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EB943C69-2C9B-45E7-B95B-FB916E7057ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EB943C69-2C9B-45E7-B95B-FB916E7057ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EB943C69-2C9B-45E7-B95B-FB916E7057ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EB943C69-2C9B-45E7-B95B-FB916E7057ED}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/xmsprovider-test.config
----------------------------------------------------------------------
diff --git a/xmsprovider-test.config b/xmsprovider-test.config
new file mode 100644
index 0000000..496545f
--- /dev/null
+++ b/xmsprovider-test.config
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+* 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.
+-->
+<configuration>
+	<testURI value="xms:wmq://localhost:1414">
+		<userName value="guest"/>
+		<passWord value="guest"/>
+		<defaultTestQueue value="queue://TEST.QUEUE"/>
+		<defaultTestTopic value="topic://TEST.TOPIC"/>
+		<durableConsumerTestTopic value="topic://TEST.DURABLE.CONSUMER.TOPIC"/>
+		<messageSelectorTestQueue value="queue://TEST.SELECTOR.MESSAGE.QUEUE"/>
+		<messageSelectorTestTopic value="topic://TEST.SELECTOR.MESSAGE.TOPIC"/>
+		<deletionTestQueue value="queue://TEST.DELETION.QUEUE"/>
+		<deletionTestTopic value="topic://TEST.DELETION.TOPIC"/>
+		<deletionTestTempQueue value="temp-queue://TEST.DELETION.TEMP.QUEUE"/>
+		<deletionTestTempTopic value="temp-topic://TEST.DELETION.TEMP.TOPIC"/>
+		<transactionTestQueue value="queue://TEST.TRANSACTION.QUEUE"/>
+	</testURI>
+</configuration>


[09/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/MapMessage.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/MapMessage.cs b/src/main/csharp/MapMessage.cs
new file mode 100644
index 0000000..188e3d7
--- /dev/null
+++ b/src/main/csharp/MapMessage.cs
@@ -0,0 +1,719 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents a map message which contains key and value pairs which are
+	/// of primitive types.
+	/// </summary>
+	class MapMessage : Apache.NMS.XMS.Message, Apache.NMS.IMapMessage,
+		Apache.NMS.IPrimitiveMap
+	{
+		#region Constructors and access to internal map message
+
+		/// <summary>
+		/// Internal IBM XMS map message.
+		/// </summary>
+		public IBM.XMS.IMapMessage xmsMapMessage
+		{
+			get { return (IBM.XMS.IMapMessage)(this.xmsMessage); }
+			set { this.xmsMessage = value; }
+		}
+
+		/// <summary>
+		/// Constructs a <c>MapMessage</c> object.
+		/// </summary>
+		/// <param name="message">XMS map message.</param>
+		public MapMessage(IBM.XMS.IMapMessage message)
+			: base(message)
+		{
+		}
+
+		#endregion
+
+		#region IMapMessage Members
+
+		public Apache.NMS.IPrimitiveMap Body
+		{
+			get { return this; }
+		}
+
+		#endregion
+
+		#region IPrimitiveMap Members
+
+		#region General methods
+
+		/// <summary>
+		/// Clears the contents of the message body.
+		/// </summary>
+		public void Clear()
+		{
+			try
+			{
+				this.ReadOnlyBody = false;
+				this.xmsMapMessage.ClearBody();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Checks if the body contains the specified item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		public bool Contains(object key)
+		{
+			try
+			{
+				return this.xmsMapMessage.ItemExists(key.ToString());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return false;
+			}
+		}
+
+		/// <summary>
+		/// Removes an item from the map message body.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		public void Remove(object key)
+		{
+			try
+			{
+				// Best guess at equivalent implementation.
+				this.xmsMapMessage.SetObject(key.ToString(), null);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Count of key/value pairs in the message body.
+		/// </summary>
+		public int Count
+		{
+			get
+			{
+				int count = 0;
+
+				try
+				{
+					IEnumerator mapNames = this.xmsMapMessage.MapNames;
+					while(mapNames.MoveNext())
+					{
+						count++;
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return count;
+			}
+		}
+
+		/// <summary>
+		/// The collection of keys in the mep message body.
+		/// </summary>
+		public ICollection Keys
+		{
+			get
+			{
+				ArrayList keys = new ArrayList();
+
+				try
+				{
+					IEnumerator mapNames = this.xmsMapMessage.MapNames;
+					while(mapNames.MoveNext())
+					{
+						keys.Add(mapNames.Current);
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return keys;
+			}
+		}
+
+		/// <summary>
+		/// The collection of values in the mep message body.
+		/// </summary>
+		public ICollection Values
+		{
+			get
+			{
+				ArrayList values = new ArrayList();
+
+				try
+				{
+					IEnumerator mapNames = this.xmsMapMessage.MapNames;
+					while(mapNames.MoveNext())
+					{
+						string key = (string)mapNames.Current;
+						values.Add(this.xmsMapMessage.GetObject(key));
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return values;
+			}
+		}
+
+		/// <summary>
+		/// Accesses an item by its key.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		public object this[string key]
+		{
+			get
+			{
+				try
+				{
+					return this.xmsMapMessage.GetObject(key);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+					return null;
+				}
+			}
+			set
+			{
+				try
+				{
+					this.xmsMapMessage.SetObject(key, value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		#endregion
+
+		#region String items
+
+		/// <summary>
+		/// Gets the value of a <c>string</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public string GetString(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetString(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>string</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetString(string key, string value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetString(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Boolean items
+
+		/// <summary>
+		/// Gets the value of a <c>bool</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public bool GetBool(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetBoolean(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return false;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>bool</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetBool(string key, bool value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetBoolean(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Byte items
+
+		/// <summary>
+		/// Gets the value of a <c>byte</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public byte GetByte(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetByte(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>byte</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetByte(string key, byte value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetByte(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Char items
+
+		/// <summary>
+		/// Gets the value of a <c>char</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public char GetChar(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetChar(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return (char) 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>char</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetChar(string key, char value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetChar(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Short items
+
+		/// <summary>
+		/// Gets the value of a 16 bits <c>short</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public short GetShort(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetShort(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a 16 bits <c>short</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetShort(string key, short value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetShort(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Int items
+
+		/// <summary>
+		/// Gets the value of a 32 bits <c>int</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public int GetInt(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetInt(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a 32 bits <c>int</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetInt(string key, int value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetInt(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Long items
+
+		/// <summary>
+		/// Gets the value of a 64 bits <c>long</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public long GetLong(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetLong(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a 64 bits <c>long</c> integer item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetLong(string key, long value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetLong(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Float items
+
+		/// <summary>
+		/// Gets the value of a <c>float</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public float GetFloat(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetFloat(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>float</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetFloat(string key, float value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetFloat(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Double items
+
+		/// <summary>
+		/// Gets the value of a <c>double</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public double GetDouble(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetDouble(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>double</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetDouble(string key, double value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetDouble(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region List items
+
+		/// <summary>
+		/// Gets the value of an <c>IList</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public IList GetList(string key)
+		{
+			try
+			{
+				return (IList) this.xmsMapMessage.GetObject(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of an <c>IList</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="list">Item value.</param>
+		public void SetList(string key, IList list)
+		{
+			try
+			{
+				this.xmsMapMessage.SetObject(key, list);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Bytes array items
+
+		/// <summary>
+		/// Gets the value of a <c>byte[]</c> byte array item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public byte[] GetBytes(string key)
+		{
+			try
+			{
+				return this.xmsMapMessage.GetBytes(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>byte[]</c> byte array item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Item value.</param>
+		public void SetBytes(string key, byte[] value)
+		{
+			try
+			{
+				this.xmsMapMessage.SetBytes(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of a <c>byte[]</c> byte array item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="value">Byte array from which value is extracted.</param>
+		/// <param name="offset">Index of first byte to extract.</param>
+		/// <param name="length">Number of bytes to extract.</param>
+		public void SetBytes(string key, byte[] value, int offset, int length)
+		{
+			try
+			{
+				this.xmsMapMessage.SetBytes(key, value, offset, length);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Dictionary items
+
+		/// <summary>
+		/// Gets the value of an <c>IDictionary</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <returns>Item value.</returns>
+		public IDictionary GetDictionary(string key)
+		{
+			try
+			{
+				return (IDictionary) this.xmsMapMessage.GetObject(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Sets the value of an <c>IDictionary</c> item.
+		/// </summary>
+		/// <param name="key">Item key.</param>
+		/// <param name="dictionary">Item value.</param>
+		public void SetDictionary(string key, IDictionary dictionary)
+		{
+			try
+			{
+				this.xmsMapMessage.SetObject(key, dictionary);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Message.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Message.cs b/src/main/csharp/Message.cs
new file mode 100644
index 0000000..278b73c
--- /dev/null
+++ b/src/main/csharp/Message.cs
@@ -0,0 +1,526 @@
+/*
+ * 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 Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents a message either to be sent to a message broker or received
+	/// from a message broker.
+	/// </summary>
+	class Message : Apache.NMS.IMessage
+	{
+		public IBM.XMS.IMessage xmsMessage;
+
+		#region Constructors
+
+		/// <summary>
+		/// Constructs a <c>Message</c> object.
+		/// </summary>
+		/// <param name="message">XMS message.</param>
+		public Message(IBM.XMS.IMessage message)
+		{
+			this.xmsMessage = message;
+		}
+
+		#endregion
+
+		#region IMessage Members
+
+		#region Acknowledgement
+
+		/// <summary>
+		/// If using client acknowledgement mode on the session then this
+		/// method will acknowledge that the message has been processed
+		/// correctly.
+		/// </summary>
+		public void Acknowledge()
+		{
+			try
+			{
+				this.xmsMessage.Acknowledge();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Message body
+
+		private bool readOnlyMsgBody = false;
+		/// <summary>
+		/// Whether the message body is read-only.
+		/// </summary>
+		public virtual bool ReadOnlyBody
+		{
+			get { return this.readOnlyMsgBody; }
+			set { this.readOnlyMsgBody = value; }
+		}
+
+		/// <summary>
+		/// Clears out the message body. Clearing a message's body does not
+		/// clear its header values or property entries.
+		/// If this message body was read-only, calling this method leaves
+		/// the message body in the same state as an empty body in a newly
+		/// created message.
+		/// </summary>
+		public void ClearBody()
+		{
+			try
+			{
+				this.ReadOnlyBody = false;
+				this.xmsMessage.ClearBody();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Message properties
+
+		#region General comments
+
+		// https://docs.oracle.com/cd/E19798-01/821-1841/bnces/index.html
+		// A JMS message has three parts: a header, properties, and a body.
+		// A JMS message header contains a number of predefined fields that
+		// contain values that both clients and providers use to identify
+		// and to route messages:
+		//   Header Field     Set By 
+		//   JMSDestination   send or publish method
+		//   JMSDeliveryMode  send or publish method
+		//   JMSExpiration    send or publish method
+		//   JMSPriority      send or publish method
+		//   JMSMessageID     send or publish method
+		//   JMSTimestamp     send or publish method
+		//   JMSCorrelationID Client 
+		//   JMSReplyTo       Client 
+		//   JMSType          Client
+		//   JMSRedelivered   JMS provider 
+		// Properties can be created and set for messages if values are needed
+		// in addition to those provided by the header fields.
+		// The JMS API provides some predefined property names that a provider
+		// can support. The use either of these predefined properties or of
+		// user-defined properties is optional.
+		// The JMS API defines five message body formats:
+		//   Message Type   Body Contains
+		//   TextMessage    A java.lang.String object.
+		//   MapMessage     A set of name-value pairs, with names as String
+		//                  objects and values as primitive types.
+		//   BytesMessage   A stream of uninterpreted bytes.
+		//   StreamMessage  A stream of primitive values, filled and read
+		//                  sequentially. 
+		//   ObjectMessage  A Serializable object.
+		//   Message        Nothing. Composed of header fields and properties
+		//                  only.
+		//
+		// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xms_cmesmod.htm?lang=en
+		// The XMS message model is the same as the WebSphere� MQ classes for
+		// JMS message model.
+		// In particular, XMS implements the same message header fields and
+		// message properties that WebSphere MQ classes for JMS implements:
+		//   JMS header fields.       These fields have names that commence
+		//                            with the prefix JMS.
+		//   JMS defined properties.  These fields have properties whose names
+		//                            commence with the prefix JMSX.
+		//   IBM� defined properties. These fields have properties whose names
+		//                            commence with the prefix JMS_IBM_.
+		//
+		// Apache.NMS redefines JMS message header fields with an "NMS" prefix:
+		//   JMS                           NMS                               IBM.XMS
+		//   Destination JMSDestination    IDestination    NMSDestination    IDestination JMSDestination
+		//   int         JMSDeliveryMode   MsgDeliveryMode NMSDeliveryMode   DeliveryMode JMSDeliveryMode
+		//   long        JMSExpiration     [TimeSpan       NMSTimeToLive]    Int64        JMSExpiration
+		//   int         JMSPriority       MsgPriority     NMSPriority       Int32        JMSPriority
+		//   String      JMSMessageID      string          NMSMessageId      String       JMSMessageID
+		//   long        JMSTimestamp      DateTime        NMSTimestamp      Int64        JMSTimestamp
+		//   String      JMSCorrelationID  string          NMSCorrelationID  String       JMSCorrelationID
+		//   Destination JMSReplyTo        IDestination    NMSReplyTo        IDestination JMSReplyTo
+		//   String      JMSType           string          NMSType           String       JMSType
+		//   boolean     JMSRedelivered    bool            NMSRedelivered    Boolean      JMSRedelivered
+		// Properties are set and retrieved through typed SetXxxProperty and
+		// GetXxxProperty methods.
+		// Unlike JMS, Apache.NMS does not expose those methods in the
+		// IMessage interface, but through the IPrimitiveMap interface,
+		// implemented by the MessageProperties class, exposed through
+		// the IMessage.Properties property.
+		// The MessagePropertyIntercepter propertyHelper intercepts get and
+		// set invocations on properties whose name starts with "NMS", and
+		// maps them to the equivalent message header fields through
+		// reflection. Other invocations are routed to the
+		// MessageProperties.Get/SetObjetProperty methods, which in turn
+		// invokes xmsMessage.Get/SetObjectProperty.
+		//
+		// XMS message properties are:
+		//   XMSC.JMS_DESTINATION               = "JMSDestination"
+		//   XMSC.JMS_DELIVERY_MODE             = "JMSDeliveryMode"
+		//   XMSC.JMS_EXPIRATION                = "JMSExpiration"
+		//   XMSC.JMS_PRIORITY                  = "JMSPriority"
+		//   XMSC.JMS_MESSAGEID                 = "JMSMessageID"
+		//   XMSC.JMS_TIMESTAMP                 = "JMSTimestamp"
+		//   XMSC.JMS_CORRELATIONID             = "JMSCorrelationID"
+		//   XMSC.JMS_REPLYTO                   = "JMSReplyto"
+		//   XMSC.JMS_TYPE                      = "JMSType"
+		//   XMSC.JMS_REDELIVERED               = "JMSRedelivered"
+		//
+		//   XMSC.JMSX_USERID                   = "JMSXUserID"
+		//   XMSC.JMSX_APPID                    = "JMSXAppID"
+		//   XMSC.JMSX_DELIVERY_COUNT           = "JMSXDeliveryCount"
+		//   XMSC.JMSX_GROUPID                  = "JMSXGroupID"
+		//   XMSC.JMSX_GROUPSEQ                 = "JMSXGroupSeq"
+		//   XMSC.JMSX_STATE                    = "JMSXState"
+		//   XMSC.JMSX_PRODUCER_TXID            = "JMSXProducerTXID"
+		//   XMSC.JMSX_CONSUMER_TXID            = "JMSXConsumerTXID"
+		//   XMSC.JMSX_RCV_TIMESTAMP            = "JMSXRcvTimestamp"
+
+		//   XMSC.JMS_IBM_REPORT_EXCEPTION      = "JMS_IBM_Report_Exception"
+		//   XMSC.JMS_IBM_REPORT_EXPIRATION     = "JMS_IBM_Report_Expiration"
+		//   XMSC.JMS_IBM_REPORT_COA            = "JMS_IBM_Report_COA"
+		//   XMSC.JMS_IBM_REPORT_COD            = "JMS_IBM_Report_COD"
+		//   XMSC.JMS_IBM_REPORT_NAN            = "JMS_IBM_Report_NAN"
+		//   XMSC.JMS_IBM_REPORT_PAN            = "JMS_IBM_Report_PAN"
+		//   XMSC.JMS_IBM_REPORT_PASS_MSG_ID    = "JMS_IBM_Report_Pass_Msg_ID"
+		//   XMSC.JMS_IBM_REPORT_PASS_CORREL_ID = "JMS_IBM_Report_Pass_Correl_ID"
+		//   XMSC.JMS_IBM_REPORT_DISCARD_MSG    = "JMS_IBM_Report_Discard_Msg"
+		//   XMSC.JMS_IBM_MSGTYPE               = "JMS_IBM_MsgType"
+		//   XMSC.JMS_IBM_FEEDBACK              = "JMS_IBM_Feedback"
+		//   XMSC.JMS_IBM_FORMAT                = "JMS_IBM_Format"
+		//   XMSC.JMS_IBM_PUTAPPLTYPE           = "JMS_IBM_PutApplType"
+		//   XMSC.JMS_IBM_ENCODING              = "JMS_IBM_Encoding"
+		//   XMSC.JMS_IBM_CHARACTER_SET         = "JMS_IBM_Character_Set"
+		//   XMSC.JMS_IBM_PUTDATE               = "JMS_IBM_PutDate"
+		//   XMSC.JMS_IBM_PUTTIME               = "JMS_IBM_PutTime"
+		//   XMSC.JMS_IBM_LAST_MSG_IN_GROUP     = "JMS_IBM_Last_Msg_In_Group"
+		//   XMSC.JMS_IBM_EXCEPTIONREASON       = "JMS_IBM_ExceptionReason"
+		//   XMSC.JMS_IBM_EXCEPTIONTIMESTAMP    = "JMS_IBM_ExceptionTimestamp"
+		//   XMSC.JMS_IBM_EXCEPTIONMESSAGE      = "JMS_IBM_ExceptionMessage"
+		//   XMSC.JMS_IBM_SYSTEM_MESSAGEID      = "JMS_IBM_System_MessageID"
+		//   XMSC.JMS_IBM_EXCEPTIONPROBLEMDESTINATION = "JMS_IBM_ExceptionProblemDestination"
+		//   XMSC.JMS_IBM_ARM_CORRELATOR        = "JMS_IBM_ArmCorrelator"
+		//   XMSC.JMS_IBM_WAS_RM_CORRELATOR     = "JMS_IBM_RMCorrelator"
+		//   XMSC.JMS_IBM_CONNECTIONID          = "JMS_IBM_ConnectionID"
+		//   XMSC.JMS_IBM_RETAIN                = "JMS_IBM_Retain"
+		//   XMSC.JMS_IBM_MQMD_REPORT           = "JMS_IBM_MQMD_Report"
+		//   XMSC.JMS_IBM_MQMD_MSGTYPE          = "JMS_IBM_MQMD_MsgType"
+		//   XMSC.JMS_IBM_MQMD_EXPIRY           = "JMS_IBM_MQMD_Expiry"
+		//   XMSC.JMS_IBM_MQMD_FEEDBACK         = "JMS_IBM_MQMD_Feedback"
+		//   XMSC.JMS_IBM_MQMD_ENCODING         = "JMS_IBM_MQMD_Encoding"
+		//   XMSC.JMS_IBM_MQMD_CODEDCHARSETID   = "JMS_IBM_MQMD_CodedCharSetId"
+		//   XMSC.JMS_IBM_MQMD_FORMAT           = "JMS_IBM_MQMD_Format"
+		//   XMSC.JMS_IBM_MQMD_PRIORITY         = "JMS_IBM_MQMD_Priority"
+		//   XMSC.JMS_IBM_MQMD_PERSISTENCE      = "JMS_IBM_MQMD_Persistence"
+		//   XMSC.JMS_IBM_MQMD_MSGID            = "JMS_IBM_MQMD_MsgId"
+		//   XMSC.JMS_IBM_MQMD_CORRELID         = "JMS_IBM_MQMD_CorrelId"
+		//   XMSC.JMS_IBM_MQMD_BACKOUTCOUNT     = "JMS_IBM_MQMD_BackoutCount"
+		//   XMSC.JMS_IBM_MQMD_REPLYTOQ         = "JMS_IBM_MQMD_ReplyToQ"
+		//   XMSC.JMS_IBM_MQMD_REPLYTOQMGR      = "JMS_IBM_MQMD_ReplyToQMgr"
+		//   XMSC.JMS_IBM_MQMD_USERIDENTIFIER   = "JMS_IBM_MQMD_UserIdentifier"
+		//   XMSC.JMS_IBM_MQMD_ACCOUNTINGTOKEN  = "JMS_IBM_MQMD_AccountingToken"
+		//   XMSC.JMS_IBM_MQMD_APPLIDENTITYDATA = "JMS_IBM_MQMD_ApplIdentityData"
+		//   XMSC.JMS_IBM_MQMD_PUTAPPLTYPE      = "JMS_IBM_MQMD_PutApplType"
+		//   XMSC.JMS_IBM_MQMD_PUTAPPLNAME      = "JMS_IBM_MQMD_PutApplName"
+		//   XMSC.JMS_IBM_MQMD_PUTDATE          = "JMS_IBM_MQMD_PutDate"
+		//   XMSC.JMS_IBM_MQMD_PUTTIME          = "JMS_IBM_MQMD_PutTime"
+		//   XMSC.JMS_IBM_MQMD_APPLORIGINDATA   = "JMS_IBM_MQMD_ApplOriginData"
+		//   XMSC.JMS_IBM_MQMD_GROUPID          = "JMS_IBM_MQMD_GroupId"
+		//   XMSC.JMS_IBM_MQMD_MSGSEQNUMBER     = "JMS_IBM_MQMD_MsgSeqNumber"
+		//   XMSC.JMS_IBM_MQMD_OFFSET           = "JMS_IBM_MQMD_Offset"
+		//   XMSC.JMS_IBM_MQMD_MSGFLAGS         = "JMS_IBM_MQMD_MsgFlags"
+		//   XMSC.JMS_IBM_MQMD_ORIGINALLENGTH   = "JMS_IBM_MQMD_OriginalLength"
+		//   XMSC.JMS_TOG_ARM_CORRELATOR        = "JMS_TOG_ARM_Correlator"
+
+		#endregion
+
+		#region General methods
+
+		private bool readOnlyMsgProperties = false;
+		/// <summary>
+		/// Whether the message properties is read-only.
+		/// </summary>
+		public virtual bool ReadOnlyProperties
+		{
+			get { return this.readOnlyMsgProperties; }
+
+			set
+			{
+				if(this.propertyHelper != null)
+				{
+					this.propertyHelper.ReadOnly = value;
+				}
+				this.readOnlyMsgProperties = value;
+			}
+		}
+
+		/// <summary>
+		/// Clears a message's properties.
+		/// The message's header fields and body are not cleared.
+		/// </summary>
+		public void ClearProperties()
+		{
+			try
+			{
+				this.ReadOnlyProperties = false;
+				this.xmsMessage.ClearProperties();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		private Apache.NMS.IPrimitiveMap properties = null;
+		private Apache.NMS.Util.MessagePropertyIntercepter propertyHelper;
+		/// <summary>
+		/// Provides access to the message properties (headers)
+		/// </summary>
+		public Apache.NMS.IPrimitiveMap Properties
+		{
+			get
+			{
+				if(properties == null)
+				{
+					properties = XMSConvert.ToMessageProperties(this.xmsMessage);
+					propertyHelper = new Apache.NMS.Util.MessagePropertyIntercepter(
+						this, properties, this.ReadOnlyProperties);
+				}
+
+				return propertyHelper;
+			}
+		}
+
+		#endregion
+
+		#region Message header fields
+
+		/// <summary>
+		/// The correlation ID used to correlate messages from conversations
+		/// or long running business processes.
+		/// </summary>
+		public string NMSCorrelationID
+		{
+			get
+			{
+				try
+				{
+					return this.xmsMessage.JMSCorrelationID;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+					return null;
+				}
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSCorrelationID = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// The destination of the message.
+		/// </summary>
+		public Apache.NMS.IDestination NMSDestination
+		{
+			get
+			{
+				return XMSConvert.ToNMSDestination(
+					this.xmsMessage.JMSDestination);
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSDestination =
+						XMSConvert.ToXMSDestination(value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		protected TimeSpan timeToLive;
+		/// <summary>
+		/// The amount of time that this message is valid for.
+		/// <c>null</c> if this message does not expire.
+		/// </summary>
+		public TimeSpan NMSTimeToLive
+		{
+			get { return this.timeToLive; }
+			set { this.timeToLive = value; }
+		}
+
+		/// <summary>
+		/// The message ID which is set by the provider.
+		/// </summary>
+		public string NMSMessageId
+		{
+			get { return this.xmsMessage.JMSMessageID; }
+			set { this.xmsMessage.JMSMessageID = value; }
+		}
+
+		/// <summary>
+		/// Whether or not this message is persistent.
+		/// </summary>
+		public MsgDeliveryMode NMSDeliveryMode
+		{
+			get
+			{
+				return XMSConvert.ToNMSMsgDeliveryMode(
+					this.xmsMessage.JMSDeliveryMode);
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSDeliveryMode =
+						XMSConvert.ToJMSDeliveryMode(value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// The Priority on this message.
+		/// </summary>
+		public MsgPriority NMSPriority
+		{
+			get
+			{
+				return (MsgPriority)this.xmsMessage.JMSPriority;
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSPriority = (int)value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Returns true if this message has been redelivered to this or
+		/// another consumer before being acknowledged successfully.
+		/// </summary>
+		public bool NMSRedelivered
+		{
+			get { return this.xmsMessage.JMSRedelivered; }
+			set
+			{
+				throw new NMSException("JMSRedelivered cannot be set.");
+			}
+		}
+
+		/// <summary>
+		/// The destination that the consumer of this message should send
+		/// replies to.
+		/// </summary>
+		public Apache.NMS.IDestination NMSReplyTo
+		{
+			get
+			{
+				return XMSConvert.ToNMSDestination(
+					this.xmsMessage.JMSReplyTo);
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSReplyTo =
+						XMSConvert.ToXMSDestination(value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// The timestamp of when the message was pubished in UTC time. If the
+		/// publisher disables setting the timestamp on the message, the time
+		/// will be set to the start of the UNIX epoch (1970-01-01 00:00:00).
+		/// </summary>
+		public DateTime NMSTimestamp
+		{
+			get { return DateUtils.ToDateTime(this.xmsMessage.JMSTimestamp); }
+			set { this.xmsMessage.JMSTimestamp = DateUtils.ToJavaTime(value); }
+		}
+
+		/// <summary>
+		/// The type name of this message.
+		/// </summary>
+		public string NMSType
+		{
+			get { return this.xmsMessage.JMSType; }
+			set
+			{
+				try
+				{
+					this.xmsMessage.JMSType = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		#endregion
+
+		#endregion
+
+		#endregion
+
+		#region Event handlers
+
+		public virtual void OnSend()
+		{
+			this.ReadOnlyProperties = true;
+			this.ReadOnlyBody = true;
+		}
+
+		public virtual void OnMessageRollback()
+		{
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/MessageConsumer.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/MessageConsumer.cs b/src/main/csharp/MessageConsumer.cs
new file mode 100644
index 0000000..1ad2949
--- /dev/null
+++ b/src/main/csharp/MessageConsumer.cs
@@ -0,0 +1,201 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+
+namespace Apache.NMS.XMS
+{
+	class MessageConsumer : Apache.NMS.IMessageConsumer
+	{
+		private readonly Apache.NMS.XMS.Util.Dispatcher dispatcher
+			= new Apache.NMS.XMS.Util.Dispatcher();
+		protected readonly Apache.NMS.XMS.Session nmsSession;
+		public IBM.XMS.IMessageConsumer xmsMessageConsumer;
+		private bool closed = false;
+		private bool disposed = false;
+
+		public MessageConsumer(Apache.NMS.XMS.Session session,
+			IBM.XMS.IMessageConsumer consumer)
+		{
+			this.nmsSession = session;
+			this.xmsMessageConsumer = consumer;
+			this.xmsMessageConsumer.MessageListener = this.HandleXmsMessage;
+		}
+
+		~MessageConsumer()
+		{
+			Dispose(false);
+		}
+
+		#region IMessageConsumer Members
+
+		private ConsumerTransformerDelegate consumerTransformer;
+		/// <summary>
+		/// A Delegate that is called each time a Message is dispatched to allow the client to do
+		/// any necessary transformations on the received message before it is delivered.
+		/// </summary>
+		public ConsumerTransformerDelegate ConsumerTransformer
+		{
+			get { return this.consumerTransformer; }
+			set { this.consumerTransformer = value; }
+		}
+
+		/// <summary>
+		/// Waits until a message is available and returns it
+		/// </summary>
+		public Apache.NMS.IMessage Receive()
+		{
+			return this.dispatcher.Dequeue();
+		}
+
+		/// <summary>
+		/// If a message is available within the timeout duration it is returned otherwise this method returns null
+		/// </summary>
+		public Apache.NMS.IMessage Receive(TimeSpan timeout)
+		{
+			return this.dispatcher.Dequeue(timeout);
+		}
+
+		/// <summary>
+		/// If a message is available immediately it is returned otherwise this method returns null
+		/// </summary>
+		public Apache.NMS.IMessage ReceiveNoWait()
+		{
+			return this.dispatcher.DequeueNoWait();
+		}
+
+		/// <summary>
+		/// An asynchronous listener which can be used to consume messages asynchronously
+		/// </summary>
+		public event Apache.NMS.MessageListener Listener;
+
+		/// <summary>
+		/// Closes the message consumer. 
+		/// </summary>
+		/// <remarks>
+		/// Clients should close message consumers them when they are not needed.
+		/// This call blocks until a receive or message listener in progress has completed.
+		/// A blocked message consumer receive call returns null when this message consumer is closed.
+		/// </remarks>
+		public void Close()
+		{
+			lock(this)
+			{
+				if(closed)
+				{
+					return;
+				}
+			}
+
+			// wake up any pending dequeue() call on the dispatcher
+			this.dispatcher.Close();
+
+			lock(this)
+			{
+				try
+				{
+					this.xmsMessageConsumer.MessageListener = null;
+					this.xmsMessageConsumer.Close();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+				finally
+				{
+					closed = true;
+				}
+			}
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		///<summary>
+		/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+		///</summary>
+		///<filterpriority>2</filterpriority>
+		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
+
+		private void HandleXmsMessage(IBM.XMS.IMessage xmsMessage)
+		{
+			Apache.NMS.IMessage message = XMSConvert.ToNMSMessage(xmsMessage);
+
+			if(message != null)
+			{
+				if(this.ConsumerTransformer != null)
+				{
+					IMessage newMessage = ConsumerTransformer(this.nmsSession, this, message);
+
+					if(newMessage != null)
+					{
+						message = newMessage;
+					}
+				}
+
+				if(Listener != null)
+				{
+					try
+					{
+						Listener(message);
+					}
+					catch(Exception ex)
+					{
+						Apache.NMS.Tracer.Debug("Error handling message: " + ex.Message);
+					}
+				}
+				else
+				{
+					this.dispatcher.Enqueue(message);
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/MessageProducer.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/MessageProducer.cs b/src/main/csharp/MessageProducer.cs
new file mode 100644
index 0000000..34da42c
--- /dev/null
+++ b/src/main/csharp/MessageProducer.cs
@@ -0,0 +1,416 @@
+/*
+ * 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.Threading;
+using Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+
+namespace Apache.NMS.XMS
+{
+	class MessageProducer : Apache.NMS.IMessageProducer
+	{
+		protected readonly Apache.NMS.XMS.Session nmsSession;
+		public IBM.XMS.IMessageProducer xmsMessageProducer;
+		private TimeSpan requestTimeout = NMSConstants.defaultRequestTimeout;
+		private bool closed = false;
+		private bool disposed = false;
+
+		public MessageProducer(Apache.NMS.XMS.Session session,
+			IBM.XMS.IMessageProducer producer)
+		{
+			this.nmsSession = session;
+			this.xmsMessageProducer = producer;
+			this.RequestTimeout = session.RequestTimeout;
+		}
+
+		~MessageProducer()
+		{
+			Dispose(false);
+		}
+
+		private Apache.NMS.XMS.Message GetXMSMessage(Apache.NMS.IMessage message)
+		{
+			Apache.NMS.XMS.Message msg = (Apache.NMS.XMS.Message) message;
+
+			if(this.ProducerTransformer != null)
+			{
+				IMessage transformed = this.ProducerTransformer(this.nmsSession, this, message);
+				if(transformed != null)
+				{
+					msg = (Apache.NMS.XMS.Message) transformed;
+				}
+			}
+
+			return msg;
+		}
+
+		#region IMessageProducer Members
+
+		/// <summary>
+		/// Sends the message to the default destination for this producer.
+		/// </summary>
+		public void Send(Apache.NMS.IMessage message)
+		{
+			Apache.NMS.XMS.Message msg = GetXMSMessage(message);
+			long timeToLive = (long) message.NMSTimeToLive.TotalMilliseconds;
+
+			if(0 == timeToLive)
+			{
+				timeToLive = this.xmsMessageProducer.TimeToLive;
+			}
+
+			try
+			{
+				msg.OnSend();
+				this.xmsMessageProducer.Send(
+							msg.xmsMessage,
+							this.xmsMessageProducer.DeliveryMode,
+							this.xmsMessageProducer.Priority,
+							timeToLive);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Sends the message to the default destination with the explicit QoS
+		/// configuration.
+		/// </summary>
+		public void Send(Apache.NMS.IMessage message,
+			MsgDeliveryMode deliveryMode, MsgPriority priority,
+			TimeSpan timeToLive)
+		{
+			Apache.NMS.XMS.Message msg = GetXMSMessage(message);
+
+			try
+			{
+				this.xmsMessageProducer.Send(
+							msg.xmsMessage,
+							XMSConvert.ToJMSDeliveryMode(deliveryMode),
+							(int)priority,
+							(long)timeToLive.TotalMilliseconds);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Sends the message to the given destination.
+		/// </summary>
+		public void Send(Apache.NMS.IDestination destination,
+			Apache.NMS.IMessage message)
+		{
+			Apache.NMS.XMS.Destination dest =
+				(Apache.NMS.XMS.Destination)destination;
+
+			Apache.NMS.XMS.Message msg = GetXMSMessage(message);
+			long timeToLive = (long)message.NMSTimeToLive.TotalMilliseconds;
+
+			if(0 == timeToLive)
+			{
+				timeToLive = this.xmsMessageProducer.TimeToLive;
+			}
+
+			try
+			{
+				this.xmsMessageProducer.Send(
+							dest.xmsDestination,
+							msg.xmsMessage,
+							this.xmsMessageProducer.DeliveryMode,
+							this.xmsMessageProducer.Priority,
+							timeToLive);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Sends the message to the given destination with the explicit QoS
+		/// configuration.
+		/// </summary>
+		public void Send(Apache.NMS.IDestination destination,
+			Apache.NMS.IMessage message, MsgDeliveryMode deliveryMode,
+			MsgPriority priority, TimeSpan timeToLive)
+		{
+			Apache.NMS.XMS.Destination dest =
+				(Apache.NMS.XMS.Destination)destination;
+
+			Apache.NMS.XMS.Message msg = GetXMSMessage(message);
+
+			try
+			{
+				this.xmsMessageProducer.Send(
+							dest.xmsDestination,
+							msg.xmsMessage,
+							XMSConvert.ToJMSDeliveryMode(deliveryMode),
+							(int)priority,
+							(long)timeToLive.TotalMilliseconds);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		private ProducerTransformerDelegate producerTransformer;
+		/// <summary>
+		/// A delegate that is called each time a Message is sent from this
+		/// Producer which allows the application to perform any needed
+		/// transformations on the Message before it is sent.
+		/// </summary>
+		public ProducerTransformerDelegate ProducerTransformer
+		{
+			get { return this.producerTransformer; }
+			set { this.producerTransformer = value; }
+		}
+
+		public MsgDeliveryMode DeliveryMode
+		{
+			get
+			{
+				return XMSConvert.ToNMSMsgDeliveryMode(
+					this.xmsMessageProducer.DeliveryMode);
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessageProducer.DeliveryMode =
+						XMSConvert.ToJMSDeliveryMode(value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		public TimeSpan TimeToLive
+		{
+			get
+			{
+				return TimeSpan.FromMilliseconds(
+					this.xmsMessageProducer.TimeToLive);
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessageProducer.TimeToLive =
+						(long)value.TotalMilliseconds;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// The default timeout for network requests.
+		/// </summary>
+		public TimeSpan RequestTimeout
+		{
+			get { return requestTimeout; }
+			set { this.requestTimeout = value; }
+		}
+
+		public MsgPriority Priority
+		{
+			get { return (MsgPriority) this.xmsMessageProducer.Priority; }
+			set
+			{
+				try
+				{
+					this.xmsMessageProducer.Priority = (int) value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		public bool DisableMessageID
+		{
+			get { return this.xmsMessageProducer.DisableMessageID; }
+			set
+			{
+				try
+				{
+					this.xmsMessageProducer.DisableMessageID = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		public bool DisableMessageTimestamp
+		{
+			get { return this.xmsMessageProducer.DisableMessageTimestamp; }
+			set
+			{
+				try
+				{
+					this.xmsMessageProducer.DisableMessageTimestamp = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Creates a new message with an empty body
+		/// </summary>
+		public Apache.NMS.IMessage CreateMessage()
+		{
+			return this.nmsSession.CreateMessage();
+		}
+
+		/// <summary>
+		/// Creates a new text message with an empty body.
+		/// </summary>
+		public Apache.NMS.ITextMessage CreateTextMessage()
+		{
+			return this.nmsSession.CreateTextMessage();
+		}
+
+		/// <summary>
+		/// Creates a new text message with the given body.
+		/// </summary>
+		public Apache.NMS.ITextMessage CreateTextMessage(string text)
+		{
+			return this.nmsSession.CreateTextMessage(text);
+		}
+
+		/// <summary>
+		/// Creates a new Map message which contains primitive key and value
+		/// pairs.
+		/// </summary>
+		public Apache.NMS.IMapMessage CreateMapMessage()
+		{
+			return this.nmsSession.CreateMapMessage();
+		}
+
+		/// <summary>
+		/// Creates a new object message containing the given .NET object as
+		/// the body.
+		/// </summary>
+		public Apache.NMS.IObjectMessage CreateObjectMessage(object body)
+		{
+			return this.nmsSession.CreateObjectMessage(body);
+		}
+
+		/// <summary>
+		/// Creates a new binary message.
+		/// </summary>
+		public Apache.NMS.IBytesMessage CreateBytesMessage()
+		{
+			return this.nmsSession.CreateBytesMessage();
+		}
+
+		/// <summary>
+		/// Creates a new binary message with the given body.
+		/// </summary>
+		public Apache.NMS.IBytesMessage CreateBytesMessage(byte[] body)
+		{
+			return this.nmsSession.CreateBytesMessage(body);
+		}
+
+		/// <summary>
+		/// Creates a new stream message.
+		/// </summary>
+		public Apache.NMS.IStreamMessage CreateStreamMessage()
+		{
+			return this.nmsSession.CreateStreamMessage();
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		public void Close()
+		{
+			lock(this)
+			{
+				if(closed)
+				{
+					return;
+				}
+
+				try
+				{
+					this.xmsMessageProducer.Close();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+				finally
+				{
+					closed = true;
+				}
+			}
+		}
+		///<summary>
+		///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+		///</summary>
+		///<filterpriority>2</filterpriority>
+		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
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/MessageProperties.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/MessageProperties.cs b/src/main/csharp/MessageProperties.cs
new file mode 100644
index 0000000..3edd086
--- /dev/null
+++ b/src/main/csharp/MessageProperties.cs
@@ -0,0 +1,485 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+
+namespace Apache.NMS.XMS
+{
+	public class MessageProperties : Apache.NMS.IPrimitiveMap
+	{
+		public IBM.XMS.IMessage xmsMessage;
+
+		public MessageProperties(IBM.XMS.IMessage message)
+		{
+			this.xmsMessage = message;
+		}
+
+		#region IPrimitiveMap Members
+
+		public void Clear()
+		{
+			try
+			{
+				this.xmsMessage.ClearProperties();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public bool Contains(object key)
+		{
+			return this.xmsMessage.PropertyExists(key.ToString());
+		}
+
+		public void Remove(object key)
+		{
+			try
+			{
+				// Best guess at equivalent implementation.
+				this.xmsMessage.SetObjectProperty(key.ToString(), null);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public int Count
+		{
+			get
+			{
+				int count = 0;
+				try
+				{
+					IEnumerator propertyNamesEnumerator =
+						this.xmsMessage.PropertyNames;
+
+					if(null != propertyNamesEnumerator)
+					{
+						while(propertyNamesEnumerator.MoveNext())
+						{
+							count++;
+						}
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return count;
+			}
+		}
+
+		public ICollection Keys
+		{
+			get
+			{
+				ArrayList keys = new ArrayList();
+
+				try
+				{
+					foreach(string propertyName in XMSConvert.ToEnumerable(this.xmsMessage.PropertyNames))
+					{
+						keys.Add(propertyName);
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return keys;
+			}
+		}
+
+		public ICollection Values
+		{
+			get
+			{
+				ArrayList values = new ArrayList();
+
+				try
+				{
+					foreach(string propertyName in XMSConvert.ToEnumerable(this.xmsMessage.PropertyNames))
+					{
+						values.Add(this.xmsMessage.GetObjectProperty(propertyName));
+					}
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+
+				return values;
+			}
+		}
+
+		public object this[string key]
+		{
+			get
+			{
+				try
+				{
+					return this.xmsMessage.GetObjectProperty(key);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+					return null;
+				}
+			}
+			set
+			{
+				try
+				{
+					this.xmsMessage.SetObjectProperty(key, value);
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		public string GetString(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetStringProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		public void SetString(string key, string value)
+		{
+			try
+			{
+				this.xmsMessage.SetStringProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public bool GetBool(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetBooleanProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return false;
+			}
+		}
+
+		public void SetBool(string key, bool value)
+		{
+			try
+			{
+				this.xmsMessage.SetBooleanProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public byte GetByte(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetByteProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetByte(string key, byte value)
+		{
+			try
+			{
+				this.xmsMessage.SetByteProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public char GetChar(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetCharProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return (char) 0;
+			}
+		}
+
+		public void SetChar(string key, char value)
+		{
+			try
+			{
+				this.xmsMessage.SetCharProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public short GetShort(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetShortProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetShort(string key, short value)
+		{
+			try
+			{
+				this.xmsMessage.SetShortProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public int GetInt(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetIntProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetInt(string key, int value)
+		{
+			try
+			{
+				this.xmsMessage.SetIntProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public long GetLong(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetLongProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetLong(string key, long value)
+		{
+			try
+			{
+				this.xmsMessage.SetLongProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public float GetFloat(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetFloatProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetFloat(string key, float value)
+		{
+			try
+			{
+				this.xmsMessage.SetFloatProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public double GetDouble(string key)
+		{
+			try
+			{
+				return this.xmsMessage.GetDoubleProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		public void SetDouble(string key, double value)
+		{
+			try
+			{
+				this.xmsMessage.SetDoubleProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public IList GetList(string key)
+		{
+			try
+			{
+				return (IList) this.xmsMessage.GetObjectProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		public void SetList(string key, IList list)
+		{
+			try
+			{
+				this.xmsMessage.SetObjectProperty(key, list);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public void SetBytes(string key, byte[] value)
+		{
+			try
+			{
+				this.xmsMessage.SetBytesProperty(key, value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public void SetBytes(string key, byte[] value, int offset, int length)
+		{
+			try
+			{
+				byte[] byteSection = new byte[length];
+
+				for(int srcIndex = offset, destIndex = 0; srcIndex < (offset + length); srcIndex++, destIndex++)
+				{
+					byteSection[destIndex] = value[srcIndex];
+				}
+
+				this.xmsMessage.SetBytesProperty(key, byteSection);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		public byte[] GetBytes(string key)
+		{
+			try
+			{
+				return (byte[]) this.xmsMessage.GetBytesProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		public IDictionary GetDictionary(string key)
+		{
+			try
+			{
+				return (IDictionary) this.xmsMessage.GetObjectProperty(key);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		public void SetDictionary(string key, IDictionary dictionary)
+		{
+			try
+			{
+				this.xmsMessage.SetObjectProperty(key, dictionary);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/ObjectMessage.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/ObjectMessage.cs b/src/main/csharp/ObjectMessage.cs
new file mode 100644
index 0000000..b777674
--- /dev/null
+++ b/src/main/csharp/ObjectMessage.cs
@@ -0,0 +1,65 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents an object message which contains a serializable .NET object.
+	/// </summary>
+	class ObjectMessage : Apache.NMS.XMS.Message, Apache.NMS.IObjectMessage
+	{
+		#region Constructors and access to internal map message
+
+		/// <summary>
+		/// Internal IBM XMS object message.
+		/// </summary>
+		public IBM.XMS.IObjectMessage xmsObjectMessage
+		{
+			get { return (IBM.XMS.IObjectMessage)this.xmsMessage; }
+			set { this.xmsMessage = value; }
+		}
+
+		/// <summary>
+		/// Constructs a <c>MapMessage</c> object.
+		/// </summary>
+		/// <param name="message">XMS map message.</param>
+		public ObjectMessage(IBM.XMS.IObjectMessage message)
+			: base(message)
+		{
+		}
+
+		#endregion
+
+		#region IObjectMessage Members
+
+		/// <summary>
+		/// Object message body.
+		/// </summary>
+		public object Body
+		{
+			get { return this.xmsObjectMessage.Object; }
+			set { this.xmsObjectMessage.Object = value; }
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Queue.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Queue.cs b/src/main/csharp/Queue.cs
new file mode 100644
index 0000000..579a65a
--- /dev/null
+++ b/src/main/csharp/Queue.cs
@@ -0,0 +1,75 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	public class Queue : Apache.NMS.XMS.Destination, Apache.NMS.IQueue
+	{
+		#region Constructors and destructors
+
+		/// <summary>
+		/// Constructs a <c>Queue</c> object.
+		/// </summary>
+		/// <param name="queue">IBM XMS queue</param>
+		public Queue(IBM.XMS.IDestination queue)
+			: base(queue)
+		{
+		}
+
+		/// <summary>
+		/// Constructs a <c>Queue</c> object.
+		/// </summary>
+		/// <param name="queue">IBM XMS queue</param>
+		/// <param name="isTemporary">Whether the queue is temporary</param>
+		public Queue(IBM.XMS.IDestination queue, bool isTemporary)
+			: base(queue, isTemporary)
+		{
+		}
+
+		#endregion
+        
+        #region IQueue Members
+
+		/// <summary>
+		/// Queue name.
+		/// </summary>
+		public string QueueName
+		{
+			get { return this.xmsDestination.Name; }
+		}
+
+		#endregion
+
+		#region ToString
+
+		/// <summary>
+		/// Returns a string representation of this instance.
+		/// </summary>
+		/// <returns>String representation of this instance</returns>
+		public override System.String ToString()
+		{
+			return "queue://" + QueueName;
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/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..2ef3690
--- /dev/null
+++ b/src/main/csharp/QueueBrowser.cs
@@ -0,0 +1,145 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+
+namespace Apache.NMS.XMS
+{
+	public class QueueBrowser : Apache.NMS.IQueueBrowser
+	{
+		public IBM.XMS.IQueueBrowser xmsQueueBrowser;
+		private bool closed = false;
+		private bool disposed = false;
+
+		public QueueBrowser(IBM.XMS.IQueueBrowser queueBrowser)
+		{
+			this.xmsQueueBrowser = queueBrowser;
+		}
+
+		~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()
+		{
+			lock(this)
+			{
+				if(closed)
+				{
+					return;
+				}
+
+				try
+				{
+					this.xmsQueueBrowser.Close();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+				finally
+				{
+					closed = true;
+				}
+			}
+		}
+
+		public string MessageSelector
+		{
+			get { return this.xmsQueueBrowser.MessageSelector; }
+		}
+
+		public IQueue Queue
+		{
+			get { return XMSConvert.ToNMSQueue(this.xmsQueueBrowser.Queue); }
+		}
+
+		internal class Enumerator : IEnumerator
+		{
+			private IEnumerator innerEnumerator;
+
+			public Enumerator(IEnumerator innerEnumerator)
+			{
+				this.innerEnumerator = innerEnumerator;
+			}
+
+			public object Current
+			{
+				get
+				{
+					return XMSConvert.ToNMSMessage((IBM.XMS.IMessage)this.innerEnumerator.Current);
+				}
+			}
+
+			public bool MoveNext()
+			{
+				return this.innerEnumerator.MoveNext();
+			}
+
+			public void Reset()
+			{
+				this.innerEnumerator.Reset();
+			}
+		}
+
+		public IEnumerator GetEnumerator()
+		{
+			return new Enumerator(this.xmsQueueBrowser.GetEnumerator());
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Session.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Session.cs b/src/main/csharp/Session.cs
new file mode 100644
index 0000000..8e01827
--- /dev/null
+++ b/src/main/csharp/Session.cs
@@ -0,0 +1,551 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents a NMS session to IBM XMS.
+	/// </summary>
+	public class Session : Apache.NMS.ISession
+	{
+		public readonly IBM.XMS.ISession xmsSession;
+		private bool closed = false;
+		private bool disposed = false;
+		
+		public Session(IBM.XMS.ISession session)
+		{
+			this.xmsSession = session;
+		}
+		
+		~Session()
+		{
+			Dispose(false);
+		}
+		
+		#region ISession Members
+		
+		public Apache.NMS.IMessageProducer CreateProducer()
+		{
+			return CreateProducer(null);
+		}
+		
+		public Apache.NMS.IMessageProducer CreateProducer(
+			Apache.NMS.IDestination destination)
+		{
+			Apache.NMS.XMS.Destination destinationObj =
+				(Apache.NMS.XMS.Destination)destination;
+		
+			try
+			{
+				Apache.NMS.IMessageProducer producer =
+					XMSConvert.ToNMSMessageProducer(this,
+						this.xmsSession.CreateProducer(
+							destinationObj.xmsDestination));
+				ConfigureProducer(producer);
+				return producer;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IMessageConsumer CreateConsumer(
+			Apache.NMS.IDestination destination)
+		{
+			Apache.NMS.XMS.Destination destinationObj =
+				(Apache.NMS.XMS.Destination)destination;
+		
+			try
+			{
+				Apache.NMS.IMessageConsumer consumer =
+					XMSConvert.ToNMSMessageConsumer(this,
+						this.xmsSession.CreateConsumer(
+							destinationObj.xmsDestination));
+				ConfigureConsumer(consumer);
+				return consumer;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IMessageConsumer CreateConsumer(
+			Apache.NMS.IDestination destination, string selector)
+		{
+			Apache.NMS.XMS.Destination destinationObj =
+				(Apache.NMS.XMS.Destination)destination;
+		
+			try
+			{
+				Apache.NMS.IMessageConsumer consumer =
+					XMSConvert.ToNMSMessageConsumer(this,
+						this.xmsSession.CreateConsumer(
+							destinationObj.xmsDestination, selector));
+				ConfigureConsumer(consumer);
+				return consumer;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IMessageConsumer CreateConsumer(
+			Apache.NMS.IDestination destination, string selector, bool noLocal)
+		{
+			Apache.NMS.XMS.Destination destinationObj = 
+				(Apache.NMS.XMS.Destination)destination;
+		
+			try
+			{
+				Apache.NMS.IMessageConsumer consumer =
+					XMSConvert.ToNMSMessageConsumer(this,
+						this.xmsSession.CreateConsumer(
+							destinationObj.xmsDestination, selector, noLocal));
+				ConfigureConsumer(consumer);
+				return consumer;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IMessageConsumer CreateDurableConsumer(
+			Apache.NMS.ITopic destination, string name, string selector,
+			bool noLocal)
+		{
+			Apache.NMS.XMS.Topic topicObj = (Apache.NMS.XMS.Topic)destination;
+		
+			try
+			{
+				Apache.NMS.IMessageConsumer consumer =
+					XMSConvert.ToNMSMessageConsumer(this,
+						this.xmsSession.CreateDurableSubscriber(
+							topicObj.xmsDestination, name, selector, noLocal));
+				ConfigureConsumer(consumer);
+				return consumer;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		private void ConfigureProducer(Apache.NMS.IMessageProducer producer)
+		{
+			producer.ProducerTransformer = this.ProducerTransformer;
+		}
+		
+		private void ConfigureConsumer(Apache.NMS.IMessageConsumer consumer)
+		{
+			consumer.ConsumerTransformer = this.ConsumerTransformer;
+		}
+		
+		public void DeleteDurableConsumer(string name)
+		{
+			try
+			{
+				this.xmsSession.Unsubscribe(name);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+		
+		public IQueueBrowser CreateBrowser(IQueue queue)
+		{
+			Apache.NMS.XMS.Queue queueObj = (Apache.NMS.XMS.Queue)queue;
+		
+			try
+			{
+				return XMSConvert.ToNMSQueueBrowser(this.xmsSession.CreateBrowser(
+					queueObj.xmsDestination));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public IQueueBrowser CreateBrowser(IQueue queue, string selector)
+		{
+			Apache.NMS.XMS.Queue queueObj = (Apache.NMS.XMS.Queue) queue;
+		
+			try
+			{
+				return XMSConvert.ToNMSQueueBrowser(this.xmsSession.CreateBrowser(
+					queueObj.xmsDestination, selector));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IQueue GetQueue(string name)
+		{
+			try
+			{
+				return XMSConvert.ToNMSQueue(this.xmsSession.CreateQueue(name));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.ITopic GetTopic(string name)
+		{
+			try
+			{
+				return XMSConvert.ToNMSTopic(this.xmsSession.CreateTopic(name));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.ITemporaryQueue CreateTemporaryQueue()
+		{
+			try
+			{
+				return XMSConvert.ToNMSTemporaryQueue(
+					this.xmsSession.CreateTemporaryQueue());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.ITemporaryTopic CreateTemporaryTopic()
+		{
+			try
+			{
+				return XMSConvert.ToNMSTemporaryTopic(
+					this.xmsSession.CreateTemporaryTopic());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		/// <summary>
+		/// Delete a destination (Queue, Topic, Temp Queue, Temp Topic).
+		/// </summary>
+		public void DeleteDestination(IDestination destination)
+		{
+			// The IBM.XMS API does not support destination deletion
+			throw new NotSupportedException();
+		}
+		
+		public Apache.NMS.IMessage CreateMessage()
+		{
+			try
+			{
+				return XMSConvert.ToNMSMessage(
+					this.xmsSession.CreateMessage());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.ITextMessage CreateTextMessage()
+		{
+			try
+			{
+				return XMSConvert.ToNMSTextMessage(
+					this.xmsSession.CreateTextMessage());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.ITextMessage CreateTextMessage(string text)
+		{
+			try
+			{
+				return XMSConvert.ToNMSTextMessage(
+					this.xmsSession.CreateTextMessage(text));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IMapMessage CreateMapMessage()
+		{
+			try
+			{
+				return XMSConvert.ToNMSMapMessage(
+					this.xmsSession.CreateMapMessage());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IBytesMessage CreateBytesMessage()
+		{
+			try
+			{
+				return XMSConvert.ToNMSBytesMessage(
+					this.xmsSession.CreateBytesMessage());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IBytesMessage CreateBytesMessage(byte[] body)
+		{
+			try
+			{
+				Apache.NMS.IBytesMessage bytesMessage = CreateBytesMessage();
+		
+				if(null != bytesMessage)
+				{
+					bytesMessage.Content = body;
+				}
+		
+				return bytesMessage;
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IStreamMessage CreateStreamMessage()
+		{
+			try
+			{
+				return XMSConvert.ToNMSStreamMessage(
+					this.xmsSession.CreateStreamMessage());
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public Apache.NMS.IObjectMessage CreateObjectMessage(Object body)
+		{
+			try
+			{
+				IBM.XMS.IObjectMessage xmsObjectMessage =
+					this.xmsSession.CreateObjectMessage();
+				xmsObjectMessage.Object = body;
+				return XMSConvert.ToNMSObjectMessage(xmsObjectMessage);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public void Commit()
+		{
+			try
+			{
+				this.xmsSession.Commit();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+		
+		public void Rollback()
+		{
+			try
+			{
+				this.xmsSession.Rollback();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+		
+		public void Recover()
+		{
+			throw new NotSupportedException();
+		}
+		
+		private ConsumerTransformerDelegate consumerTransformer;
+		/// <summary>
+		/// A Delegate that is called each time a Message is dispatched to
+		/// allow the client to do any necessary transformations on the
+		/// received message before it is delivered. The Session instance
+		/// sets the delegate on each Consumer it creates.
+		/// </summary>
+		public ConsumerTransformerDelegate ConsumerTransformer
+		{
+			get { return this.consumerTransformer; }
+			set { this.consumerTransformer = value; }
+		}
+		
+		private ProducerTransformerDelegate producerTransformer;
+		/// <summary>
+		/// A delegate that is called each time a Message is sent from this
+		/// Producer which allows the application to perform any needed
+		/// transformations on the Message before it is sent. The Session
+		/// instance sets the delegate on each Producer it creates.
+		/// </summary>
+		public ProducerTransformerDelegate ProducerTransformer
+		{
+			get { return this.producerTransformer; }
+			set { this.producerTransformer = value; }
+		}
+		
+		#region Transaction State Events
+		
+		#pragma warning disable 0067
+		public event SessionTxEventDelegate TransactionStartedListener;
+		public event SessionTxEventDelegate TransactionCommittedListener;
+		public event SessionTxEventDelegate TransactionRolledBackListener;
+		#pragma warning restore 0067
+		
+		#endregion
+		
+		// Properties
+		
+		/// <summary>
+		/// The default timeout for network requests.
+		/// </summary>
+		private TimeSpan requestTimeout =
+			Apache.NMS.NMSConstants.defaultRequestTimeout;
+		public TimeSpan RequestTimeout
+		{
+			get { return this.requestTimeout; }
+			set { this.requestTimeout = value; }
+		}
+		
+		public bool Transacted
+		{
+			get { return this.xmsSession.Transacted; }
+		}
+		
+		public Apache.NMS.AcknowledgementMode AcknowledgementMode
+		{
+			get { return XMSConvert.ToAcknowledgementMode(this.xmsSession.AcknowledgeMode); }
+		}
+		
+		public void Close()
+		{
+			lock(this)
+			{
+				if(closed)
+				{
+					return;
+				}
+		
+				try
+				{
+					this.xmsSession.Close();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+				finally
+				{
+					closed = true;
+				}
+			}
+		}
+		
+		#endregion
+		
+		#region IDisposable Members
+		
+		///<summary>
+		/// Performs application-defined tasks associated with freeing,
+		/// releasing, or resetting unmanaged resources.
+		///</summary>
+		///<filterpriority>2</filterpriority>
+		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
+	}
+}


[08/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/StreamMessage.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/StreamMessage.cs b/src/main/csharp/StreamMessage.cs
new file mode 100644
index 0000000..b25579b
--- /dev/null
+++ b/src/main/csharp/StreamMessage.cs
@@ -0,0 +1,480 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+    /// <summary>
+    /// A StreamMessage object is used to send a stream of primitive types in the 
+    /// .NET programming language. It is filled and read sequentially. It inherits 
+    /// from the Message interface and adds a stream message body.
+    /// </summary>
+	class StreamMessage : Apache.NMS.XMS.Message, Apache.NMS.IStreamMessage
+	{
+		#region Constructors and access to internal stream message
+
+		/// <summary>
+		/// Internal IBM XMS stream message.
+		/// </summary>
+		public IBM.XMS.IStreamMessage xmsStreamMessage
+		{
+			get { return (IBM.XMS.IStreamMessage)this.xmsMessage; }
+			set { this.xmsMessage = value; }
+		}
+
+		/// <summary>
+		/// Constructs a <c>StreamMessage</c> object.
+		/// </summary>
+		/// <param name="message">XMS stream message.</param>
+		public StreamMessage(IBM.XMS.IStreamMessage message)
+			: base(message)
+		{
+		}
+
+		#endregion
+
+		#region IStreamMessage Members
+
+		#region Reset method
+
+		/// <summary>
+		/// Resets the contents of the stream message body.
+		/// </summary>
+		public void Reset()
+		{
+			try
+			{
+				this.xmsStreamMessage.Reset();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#region Read methods
+
+		/// <summary>
+		/// Reads a boolean from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Boolean"/></returns>
+		public bool ReadBoolean()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadBoolean();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return false;
+			}
+		}
+
+		/// <summary>
+		/// Reads a byte from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Byte"/></returns>
+		public byte ReadByte()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadByte();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a byte array from the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Byte"/> array</param>
+		/// <returns>The total number of bytes read into the buffer, or -1 if
+		/// there is no more data because the end of the byte field has been
+		/// reached</returns>
+		public int ReadBytes(byte[] value)
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadBytes(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a character from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Char"/></returns>
+		public char ReadChar()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadChar();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return (char) 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a 16 bits (short) integer number from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Int16"/></returns>
+		public short ReadInt16()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadShort();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a 32 bits (int) integer number from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Int32"/></returns>
+		public int ReadInt32()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadInt();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a 64 bits (long) integer number from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Int64"/></returns>
+		public long ReadInt64()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadLong();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a single precision floating point number from the stream
+		/// message.
+		/// </summary>
+		/// <returns>A <see cref="System.Single"/></returns>
+		public float ReadSingle()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadFloat();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a double precision floating point number from the stream
+		/// message.
+		/// </summary>
+		/// <returns>A <see cref="System.Double"/></returns>
+		public double ReadDouble()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadDouble();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		/// <summary>
+		/// Reads a character string from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.String"/></returns>
+		public string ReadString()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadString();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Reads an object from the stream message.
+		/// </summary>
+		/// <returns>A <see cref="System.Object"/></returns>
+		public object ReadObject()
+		{
+			try
+			{
+				return this.xmsStreamMessage.ReadObject();
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return 0;
+			}
+		}
+
+		#endregion
+
+		#region Write methods
+
+		/// <summary>
+		/// Writes a boolean to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Boolean"/></param>
+		public void WriteBoolean(bool value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteBoolean(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a byte to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Byte"/></param>
+		public void WriteByte(byte value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteByte(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a byte array to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Byte"/> array</param>
+		public void WriteBytes(byte[] value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteBytes(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a portion of a byte array as a byte array field to the
+		/// stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Byte"/> array</param>
+		/// <param name="offset">A <see cref="System.Int32"/> value that
+		/// indicates the point in the buffer to begin writing to the stream
+		/// message.</param>
+		/// <param name="length">A <see cref="System.Int32"/> value that
+		/// indicates how many bytes in the buffer to write to the stream
+		/// message.</param>
+		public void WriteBytes(byte[] value, int offset, int length)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteBytes(value, offset, length);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a character to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Char"/></param>
+		public void WriteChar(char value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteChar(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a 16 bts (short) integer to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Int16"/></param>
+		public void WriteInt16(short value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteShort(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a 32 bts (int) integer to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Int32"/></param>
+		public void WriteInt32(int value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteInt(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a 64 bts (long) integer to the stream message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Int64"/></param>
+		public void WriteInt64(long value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteLong(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a single precision floating point number to the stream
+		/// message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Single"/></param>
+		public void WriteSingle(float value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteFloat(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a double precision floating point number to the stream
+		/// message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Double"/></param>
+		public void WriteDouble(double value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteDouble(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes a character string to the stream
+		/// message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.String"/></param>
+		public void WriteString(string value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteString(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		/// <summary>
+		/// Writes an object to the stream
+		/// message.
+		/// </summary>
+		/// <param name="value">A <see cref="System.Object"/></param>
+		public void WriteObject(object value)
+		{
+			try
+			{
+				this.xmsStreamMessage.WriteObject(value);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+
+		#endregion
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/TemporaryQueue.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/TemporaryQueue.cs b/src/main/csharp/TemporaryQueue.cs
new file mode 100644
index 0000000..4d896c5
--- /dev/null
+++ b/src/main/csharp/TemporaryQueue.cs
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+namespace Apache.NMS.XMS
+{
+	class TemporaryQueue : Apache.NMS.XMS.Queue, Apache.NMS.ITemporaryQueue
+	{
+		#region Constructors and destructors
+
+		/// <summary>
+		/// Constructs a <c>TemporaryQueue</c> object.
+		/// </summary>
+		/// <param name="temporaryQueue">IBM XMS queue</param>
+		public TemporaryQueue(IBM.XMS.IDestination temporaryQueue)
+			: base(temporaryQueue, true)
+		{
+		}
+
+		#endregion
+
+		#region ITemporaryQueue Members
+
+		/// <summary>
+		/// Deletes the temporary queue.
+		/// </summary>
+		public void Delete()
+		{
+			// IBM.XMS does not provide a method for deleting a destination.
+			// Should we throw an exception or ignore the request ?
+			//this.xmsDestination.Delete();
+		}
+
+		#endregion
+
+		#region ToString
+
+		/// <summary>
+		/// Returns a string representation of this instance.
+		/// </summary>
+		/// <returns>String representation of this instance</returns>
+		public override System.String ToString()
+		{
+			return "temp-queue://" + QueueName;
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/TemporaryTopic.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/TemporaryTopic.cs b/src/main/csharp/TemporaryTopic.cs
new file mode 100644
index 0000000..374b528
--- /dev/null
+++ b/src/main/csharp/TemporaryTopic.cs
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+namespace Apache.NMS.XMS
+{
+	class TemporaryTopic : Apache.NMS.XMS.Topic, Apache.NMS.ITemporaryTopic
+	{
+		#region Constructors and destructors
+
+		/// <summary>
+		/// Constructs a <c>TemporaryTopic</c> object.
+		/// </summary>
+		/// <param name="temporaryTopic">IBM XMS queue</param>
+		public TemporaryTopic(IBM.XMS.IDestination temporaryTopic)
+			: base(temporaryTopic, true)
+		{
+		}
+
+		#endregion
+
+		#region ITemporaryTopic Members
+
+		/// <summary>
+		/// Deletes the temporary topic.
+		/// </summary>
+		public void Delete()
+		{
+			// IBM.XMS does not provide a method for deleting a destination.
+			// Should we throw an exception or ignore the request ?
+			//this.xmsDestination.Delete();
+		}
+
+		#endregion
+
+		#region ToString
+
+		/// <summary>
+		/// Returns a string representation of this instance.
+		/// </summary>
+		/// <returns>string representation of this instance</returns>
+		public override System.String ToString()
+		{
+			return "temp-topic://" + TopicName;
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/TextMessage.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/TextMessage.cs b/src/main/csharp/TextMessage.cs
new file mode 100644
index 0000000..d98cd03
--- /dev/null
+++ b/src/main/csharp/TextMessage.cs
@@ -0,0 +1,86 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents a text based message.
+	/// </summary>
+	class TextMessage : Apache.NMS.XMS.Message, Apache.NMS.ITextMessage
+	{
+		#region Constructors and access to internal stream message
+
+		/// <summary>
+		/// Internal IBM XMS text message.
+		/// </summary>
+		public IBM.XMS.ITextMessage xmsTextMessage
+		{
+			get { return (IBM.XMS.ITextMessage)this.xmsMessage; }
+			set { this.xmsMessage = value; }
+		}
+
+		/// <summary>
+		/// Constructs a <c>TextMessage</c> object.
+		/// </summary>
+		/// <param name="message">XMS text message.</param>
+		public TextMessage(IBM.XMS.ITextMessage message)
+			: base(message)
+		{
+		}
+
+		#endregion
+
+		#region ITextMessage Members
+
+		/// <summary>
+		/// The text contents of the message body.
+		/// </summary>
+		public string Text
+		{
+			get
+			{
+				try
+				{
+					return this.xmsTextMessage.Text;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+					return null;
+				}
+			}
+			set
+			{
+				try
+				{
+					this.xmsTextMessage.Text = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Topic.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Topic.cs b/src/main/csharp/Topic.cs
new file mode 100644
index 0000000..c4cc4c2
--- /dev/null
+++ b/src/main/csharp/Topic.cs
@@ -0,0 +1,72 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	public class Topic : Apache.NMS.XMS.Destination, Apache.NMS.ITopic
+	{
+		#region Constructors and destructors
+
+		/// <summary>
+		/// Constructs a <c>Topic</c> object.
+		/// </summary>
+		/// <param name="topic">IBM XMS topic</param>
+		public Topic(IBM.XMS.IDestination topic)
+			: base(topic)
+		{
+		}
+
+		/// <summary>
+		/// Constructs a <c>Topic</c> object.
+		/// </summary>
+		/// <param name="topic">IBM XMS topic</param>
+		/// <param name="isTemporary">Whether the topic is temporary</param>
+		public Topic(IBM.XMS.IDestination topic, bool isTemporary)
+			: base(topic, isTemporary)
+		{
+		}
+
+		#endregion
+
+        #region ITopic Members
+
+		public string TopicName
+		{
+			get { return this.xmsDestination.Name; }
+		}
+
+		#endregion
+
+		#region ToString
+
+		/// <summary>
+		/// Returns a String representation of this instance.
+		/// </summary>
+		/// <returns>String representation of this instance</returns>
+		public override System.String ToString()
+		{
+			return "topic://" + TopicName;
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/Dispatcher.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/Dispatcher.cs b/src/main/csharp/Util/Dispatcher.cs
new file mode 100644
index 0000000..d036cb3
--- /dev/null
+++ b/src/main/csharp/Util/Dispatcher.cs
@@ -0,0 +1,173 @@
+/*
+ * 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.Threading;
+
+namespace Apache.NMS.XMS.Util
+{
+	/// <summary>
+	/// Handles the multi-threaded dispatching between the transport and the consumers
+	/// </summary>
+	public class Dispatcher
+    {
+		System.Collections.Queue queue = new System.Collections.Queue();
+		readonly Object semaphore = new Object();
+		readonly ArrayList messagesToRedeliver = new ArrayList();
+        
+        // TODO can't use EventWaitHandle on MONO 1.0
+        AutoResetEvent messageReceivedEventHandle = new AutoResetEvent(false);
+        bool m_bAsyncDelivery = false;
+        bool m_bClosed = false;
+
+		public void SetAsyncDelivery(AutoResetEvent eventHandle)
+		{
+			lock (semaphore)
+			{
+				messageReceivedEventHandle = eventHandle;
+				m_bAsyncDelivery = true;
+				if (queue.Count > 0)
+				{
+					messageReceivedEventHandle.Set();
+				}
+			}
+		}
+
+        /// <summary>
+        /// Whem we start a transaction we must redeliver any rolled back messages
+        /// </summary>
+        public void RedeliverRolledBackMessages()
+		{
+            lock (semaphore)
+            {
+				System.Collections.Queue replacement = new System.Collections.Queue(queue.Count + messagesToRedeliver.Count);
+                foreach (Apache.NMS.IMessage element in messagesToRedeliver)
+                {
+                    replacement.Enqueue(element);
+                }
+                messagesToRedeliver.Clear();
+                
+                while (queue.Count > 0)
+                {
+					Apache.NMS.IMessage element = (Apache.NMS.IMessage) queue.Dequeue();
+                    replacement.Enqueue(element);
+                }
+
+				queue = replacement;
+                if (queue.Count > 0)
+                {
+                	messageReceivedEventHandle.Set();
+                }
+            }
+        }
+        
+        /// <summary>
+        /// Redeliver the given message, putting it at the head of the queue
+        /// </summary>
+		public void Redeliver(Apache.NMS.IMessage message)
+        {
+            lock (semaphore)
+			{
+				messagesToRedeliver.Add(message);
+            }
+        }
+        
+        /// <summary>
+        /// Method Enqueue
+        /// </summary>
+		public void Enqueue(Apache.NMS.IMessage message)
+        {
+            lock (semaphore)
+            {
+                queue.Enqueue(message);
+                messageReceivedEventHandle.Set();
+            }
+        }
+        
+        /// <summary>
+        /// Method DequeueNoWait
+        /// </summary>
+		public Apache.NMS.IMessage DequeueNoWait()
+        {
+			Apache.NMS.XMS.Message rc = null;
+            lock (semaphore)
+            {
+                if (!m_bClosed && queue.Count > 0)
+                {
+					rc = (Apache.NMS.XMS.Message) queue.Dequeue();
+					if(null != rc)
+					{
+						rc.ReadOnlyBody = true;
+						rc.ReadOnlyProperties = true;
+					}
+                } 
+            }
+            return rc;
+        }
+
+        /// <summary>
+        /// Method Dequeue
+        /// </summary>
+		public Apache.NMS.IMessage Dequeue(TimeSpan timeout)
+        {
+			Apache.NMS.IMessage rc;
+			bool bClosed = false;
+			lock (semaphore)
+			{
+				bClosed = m_bClosed;
+				rc = DequeueNoWait();
+			}
+
+            while (!bClosed && rc == null)
+            {
+                if( !messageReceivedEventHandle.WaitOne(timeout, false))
+                {
+                    break;
+                }
+
+				lock (semaphore)
+				{
+					rc = DequeueNoWait();
+					bClosed = m_bClosed;
+				}
+            }
+            return rc;
+        }
+        
+        /// <summary>
+        /// Method Dequeue
+        /// </summary>
+		public Apache.NMS.IMessage Dequeue()
+        {
+			TimeSpan indefiniteWait = TimeSpan.FromMilliseconds(Timeout.Infinite);
+			return Dequeue(indefiniteWait);
+        }
+
+		public void Close()
+		{
+			lock (semaphore)
+			{
+				m_bClosed = true;
+				queue.Clear();
+				if(m_bAsyncDelivery)
+				{
+					messageReceivedEventHandle.Set();
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/ExceptionUtil.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/ExceptionUtil.cs b/src/main/csharp/Util/ExceptionUtil.cs
new file mode 100644
index 0000000..14ee5d1
--- /dev/null
+++ b/src/main/csharp/Util/ExceptionUtil.cs
@@ -0,0 +1,147 @@
+\ufeff/*
+ * 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.Text;
+using System.Collections.Generic;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS.Util
+{
+	class ExceptionUtil
+	{
+		/// <summary>
+		/// Wrap the provider specific exception inside an NMS exception to
+		/// more tightly integrate the provider extensions into the NMS API.
+		/// </summary>
+		/// <param name="ex">Original exception.</param>
+		public static void WrapAndThrowNMSException(Exception ex)
+		{
+			if(ex is Apache.NMS.NMSException)
+			{
+				// Already derived from NMSException
+				throw ex;
+			}
+
+			if(ex is IBM.XMS.IllegalStateException)
+			{
+				IBM.XMS.IllegalStateException xmsEx =
+					(IBM.XMS.IllegalStateException)ex;
+				throw new Apache.NMS.IllegalStateException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.InvalidClientIDException)
+			{
+				IBM.XMS.InvalidClientIDException xmsEx =
+					(IBM.XMS.InvalidClientIDException)ex;
+				throw new Apache.NMS.InvalidClientIDException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.InvalidDestinationException)
+			{
+				IBM.XMS.InvalidDestinationException xmsEx =
+					(IBM.XMS.InvalidDestinationException)ex;
+				throw new Apache.NMS.InvalidDestinationException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.InvalidSelectorException)
+			{
+				IBM.XMS.InvalidSelectorException xmsEx =
+					(IBM.XMS.InvalidSelectorException)ex;
+				throw new Apache.NMS.InvalidSelectorException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.MessageEOFException)
+			{
+				IBM.XMS.MessageEOFException xmsEx =
+					(IBM.XMS.MessageEOFException)ex;
+				throw new Apache.NMS.MessageEOFException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.MessageFormatException)
+			{
+				IBM.XMS.MessageFormatException xmsEx =
+					(IBM.XMS.MessageFormatException)ex;
+				throw new Apache.NMS.MessageFormatException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.MessageNotReadableException)
+			{
+				IBM.XMS.MessageNotReadableException xmsEx =
+					(IBM.XMS.MessageNotReadableException)ex;
+				throw new Apache.NMS.MessageNotReadableException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.MessageNotWriteableException)
+			{
+				IBM.XMS.MessageNotWriteableException xmsEx =
+					(IBM.XMS.MessageNotWriteableException)ex;
+				throw new Apache.NMS.MessageNotWriteableException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.ResourceAllocationException)
+			{
+				IBM.XMS.ResourceAllocationException xmsEx =
+					(IBM.XMS.ResourceAllocationException)ex;
+				throw new Apache.NMS.ResourceAllocationException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.SecurityException)
+			{
+				IBM.XMS.SecurityException xmsEx =
+					(IBM.XMS.SecurityException)ex;
+				throw new Apache.NMS.NMSSecurityException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.TransactionInProgressException)
+			{
+				IBM.XMS.TransactionInProgressException xmsEx =
+					(IBM.XMS.TransactionInProgressException)ex;
+				throw new Apache.NMS.TransactionInProgressException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.TransactionRolledBackException)
+			{
+				IBM.XMS.TransactionRolledBackException xmsEx =
+					(IBM.XMS.TransactionRolledBackException)ex;
+				throw new Apache.NMS.TransactionRolledBackException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			if(ex is IBM.XMS.XMSException)
+			{
+				IBM.XMS.XMSException xmsEx =
+					(IBM.XMS.XMSException)ex;
+				throw new Apache.NMS.NMSException(
+					xmsEx.Message, xmsEx.ErrorCode, xmsEx);
+			}
+
+			// Not an EMS exception that should be wrapped.
+			throw ex;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/IntrospectionSupport.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/IntrospectionSupport.cs b/src/main/csharp/Util/IntrospectionSupport.cs
new file mode 100644
index 0000000..175135f
--- /dev/null
+++ b/src/main/csharp/Util/IntrospectionSupport.cs
@@ -0,0 +1,434 @@
+\ufeff/*
+ * 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.Reflection;
+using System.Globalization;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using Apache.NMS;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.XMS.Util
+{
+	/// <summary>
+	/// Utility class used to provide convenience methods that apply named
+	/// property settings to objects.
+	/// </summary>
+	public class IntrospectionSupport
+	{
+        #region Manage maps of member names and URI aliases
+
+		private static Dictionary<Type, StringDictionary> nameMaps =
+			new Dictionary<Type, StringDictionary>();
+		private static readonly object nameMapsLock = new object();
+
+		/// <summary>
+		/// Gets the member names map for the specified type.
+		/// </summary>
+		/// <param name="type">Type whose names map is requested.</param>
+		/// <returns>Names map for the specified type.</returns>
+        /// <remarks>
+		/// The map is created and registered if it is not found in the
+		/// <c>nameMaps</c> registry.
+        /// </remarks>
+		public static StringDictionary GetNameMap(Type type)
+		{
+			StringDictionary nameMap;
+			lock(IntrospectionSupport.nameMapsLock)
+			{
+				if(!IntrospectionSupport.nameMaps.TryGetValue(
+					type, out nameMap))
+				{
+					nameMap = CreateNameMap(type);
+					IntrospectionSupport.nameMaps.Add(type, nameMap);
+				}
+			}
+			return nameMap;
+		}
+
+		/// <summary>
+		/// Creates a dictionary of public property and attribute names,
+        /// indexed by themselves plus all URI attribute keys associated
+		/// to them.
+		/// </summary>
+		/// <param name="type">Type whose names map is requested.</param>
+		/// <returns>Names map for the specified type.</returns>
+		/// <remarks>
+		/// Applied to this property:
+		/// <code>
+		///   [UriAttribute("My.Test", "MyTest")]
+		///   public string Test
+		///   { get { return(_test); }
+		///     set { _test = value; }
+		///   }
+		/// </code>
+		/// the method returns a dictionary containing
+		/// ("test" -> "Test"), ("my.test" -> "Test"), ("mytest" -> "Test").
+		/// Note that <c>StringDictionary</c> converts keys to lowercase but
+		/// keeps values untouched.
+		/// </remarks>
+		public static StringDictionary CreateNameMap(Type type)
+		{
+			StringDictionary nameMap = new StringDictionary();
+			BindingFlags flags = BindingFlags.FlattenHierarchy
+							| BindingFlags.Public
+							| BindingFlags.Instance;
+
+			// Process public instance self or inherited property
+			foreach(PropertyInfo propertyInfo in type.GetProperties(flags))
+		    {
+				AddToNameMap(nameMap, propertyInfo);
+			}
+
+			// Process public instance self or inherited fields
+			foreach(FieldInfo fieldInfo in type.GetFields(flags))
+		    {
+				AddToNameMap(nameMap, fieldInfo);
+			}
+
+			return(nameMap);
+		}
+
+		/// <summary>
+		/// Adds a property or field name and URI attribute keys to the
+		/// specified name map.
+		/// </summary>
+		/// <param name="nameMap">Name map.</param>
+		/// <param name="memberInfo">Member information for the property
+		/// or field.</param>
+		private static void AddToNameMap(StringDictionary nameMap,
+			MemberInfo memberInfo)
+		{
+			// Add member name mapped to itself
+			nameMap.Add(memberInfo.Name, memberInfo.Name);
+
+			// For each UriAttribute custom attribute
+			foreach(Attribute attr in memberInfo.GetCustomAttributes(
+				typeof(UriAttributeAttribute), true))
+			{
+				// For each URI attribute key
+				foreach(string key in
+					((UriAttributeAttribute)attr).AttributeKeys)
+				{
+					// Index property name by URI attribute key
+					if(!nameMap.ContainsKey(key))
+					{
+						nameMap.Add(key, memberInfo.Name);
+					}
+				}
+			}
+
+			return;
+		}
+
+        #endregion
+
+		#region Set properties
+
+		/// <summary>
+		/// Sets the public properties of a target object using a string map.
+		/// This method uses .Net reflection to identify public properties of
+		/// the target object matching the keys from the passed map.
+		/// </summary>
+		/// <param name="target">Object whose properties will be set.</param>
+		/// <param name="valueMap">Map of key/value pairs.</param>
+		public static void SetProperties(object target,
+			StringDictionary valueMap)
+		{
+			SetProperties(target, valueMap, GetNameMap(target.GetType()));
+		}
+
+        /// <summary>
+        /// Sets the public properties of a target object using a string map.
+        /// This method uses .Net reflection to access public properties of
+        /// the target object matching the keys from the passed map.
+        /// </summary>
+        /// <param name="target">The object whose properties will be set.</param>
+        /// <param name="valueMap">Map of key/value pairs.</param>
+        /// <param name="nameMap">Map of key/property name pairs.</param>
+        public static void SetProperties(object target,
+            StringDictionary valueMap,
+			StringDictionary nameMap)
+        {
+			Tracer.DebugFormat("SetProperties called with target: {0}",
+				target.GetType().Name);
+
+			// Application of specified values is recursive. If a key does not
+			// correspond to a member of the current target object, it is
+			// supposed to refer to a sub-member of such a member. Since member
+			// keys can contain dot characters, an attempt is made to find the
+			// "longest" key corresponding to a member of the current object
+			// (this identifies the "sub-target"), and extract the remaining
+			// key characters as a sub-key to sub-members.
+			// The following dictionary indexes keys to "sub-targets", and
+			// "sub-key"/value pairs to assign to "sub-targets".
+			Dictionary<string, StringDictionary> subTargetMap = null;
+
+			foreach(string key in valueMap.Keys)
+			{
+				if(nameMap.ContainsKey(key))
+				{
+					// Key refers to a member of the current target
+					string memberName = nameMap[key];
+					MemberInfo member = FindMemberInfo(target, memberName);
+					if(member == null)
+					{
+						// Should not happen if the nameMap was indeed created
+						// for the current target object...
+						throw new NMSException(string.Format(
+							"No such property or field: {0} on class: {1}",
+							memberName, target.GetType().Name));
+					}
+
+					// Set value
+					try
+					{
+						if(member.MemberType == MemberTypes.Property)
+						{
+							PropertyInfo property = (PropertyInfo)member;
+							object value = ConvertValue(valueMap[key],
+								property.PropertyType);
+							property.SetValue(target, value, null);
+						}
+						else
+						{
+							FieldInfo field = (FieldInfo)member;
+							object value = ConvertValue(valueMap[key],
+								field.FieldType);
+							field.SetValue(target, value);
+						}
+					}
+					catch(Exception ex)
+					{
+						throw NMSExceptionSupport.Create(
+							"Error while attempting to apply option.", ex);
+					}
+                }
+				else
+				{
+					// Key does NOT refers to a member of the current target
+					// Extract maximal member key + subkeys
+					string memberKey = key;
+					int dotPos = memberKey.LastIndexOf('.');
+					bool memberFound = false;
+					while(!memberFound && dotPos > 0)
+					{
+						memberKey = memberKey.Substring(0, dotPos);
+						if(nameMap.ContainsKey(memberKey))
+						{
+							memberKey = nameMap[memberKey];
+							memberFound = true;
+						}
+						else
+						{
+							dotPos = memberKey.LastIndexOf('.');
+						}
+					}
+
+					if(!memberFound)
+					{
+						throw new NMSException(string.Format(
+							"Unknown property or field: {0} on class: {1}",
+							key, target.GetType().Name));
+					}
+
+					// Register memberKey, subKey and value for further processing
+					string subKey = key.Substring(dotPos + 1);
+					StringDictionary subValueMap;
+
+					if(subTargetMap == null)
+					{
+						subTargetMap = new Dictionary<string, StringDictionary>();
+					}
+
+					if(!subTargetMap.TryGetValue(memberKey, out subValueMap))
+					{
+						subValueMap = new StringDictionary();
+						subTargetMap.Add(memberKey, subValueMap);
+					}
+
+					// In theory, we can't have the same subkey twice, since
+					// they were unique subkeys from another dictionary.
+					// Therefore, no need to check for subValueMap.ContainsKey.
+					subValueMap.Add(subKey, valueMap[key]);
+				}
+            }
+
+			// Now process any compound assignments.
+			if(subTargetMap != null)
+			{
+				foreach(string subTargetKey in subTargetMap.Keys)
+				{
+					MemberInfo member = FindMemberInfo(target, subTargetKey);
+					object subTarget = GetUnderlyingObject(member, target);
+					SetProperties(subTarget, subTargetMap[subTargetKey]);
+				}
+			}
+        }
+
+		/// <summary>
+		/// Converts the specified string value to the type of the target
+		/// member.
+		/// </summary>
+		private static object ConvertValue(string inputString, Type targetType)
+		{
+			// If the target member is an enumeration, get the enumeration
+			// value or combined (or-ed) values
+			object value;
+			if(targetType.IsEnum)
+			{
+				if(inputString.Contains("+"))
+				{
+					string[] inputValues = inputString.Split('+');
+
+					FieldInfo fieldInfo = targetType.GetField(inputValues[0],
+						BindingFlags.Public
+						| BindingFlags.Static
+						| BindingFlags.IgnoreCase);
+					if(fieldInfo == null)
+					{
+						throw new NMSException(string.Format(
+							"Invalid {0} value \"{1}\"", targetType.Name,
+							inputValues[0]));
+					}
+					dynamic val = fieldInfo.GetValue(null);
+
+					for(int v = 1; v < inputValues.Length; v++)
+					{
+						fieldInfo = targetType.GetField(inputValues[v],
+							BindingFlags.Public
+							| BindingFlags.Static
+							| BindingFlags.IgnoreCase);
+						if(fieldInfo == null)
+						{
+							throw new NMSException(string.Format(
+								"Invalid {0} value \"{1}\"", targetType.Name,
+								inputValues[v]));
+						}
+						val = (dynamic)val | (dynamic)fieldInfo.GetValue(null);
+					}
+
+					value = Convert.ChangeType(val, targetType);
+				}
+				else
+				{
+					FieldInfo fieldInfo = targetType.GetField(inputString,
+                                 BindingFlags.Public
+                               | BindingFlags.Static
+                               | BindingFlags.IgnoreCase);
+					if(fieldInfo == null)
+					{
+						throw new NMSException(string.Format(
+							"Invalid {0} value \"{1}\"", targetType.Name,
+							inputString));
+					}
+					value = fieldInfo.GetValue(null);
+				}
+			}
+			else
+			{
+				// Not an enumeration
+				value = Convert.ChangeType(inputString,
+					targetType, CultureInfo.InvariantCulture);
+			}
+			return value;
+		}
+
+		#endregion
+
+		#region Get member information and objects
+
+		/// <summary>
+		/// Gets member information for a property or field of the target
+		/// object.
+		///	</summary>
+		/// <param name="target">Target object.</param>
+		/// <param name="name">Property or field name.</param>
+		/// <returns>Retrieved member information.</returns>
+        private static MemberInfo FindMemberInfo(object target, string name)
+        {
+            BindingFlags flags = BindingFlags.FlattenHierarchy
+                               | BindingFlags.Public
+                               | BindingFlags.Instance
+                               | BindingFlags.IgnoreCase;
+
+            Type type = target.GetType();
+
+            MemberInfo member = type.GetProperty(name, flags);
+
+            if(member == null)
+            {
+                member = type.GetField(name, flags);
+            }
+
+            return member;
+        }
+
+		/// <summary>
+		/// Gets object assigned to the specified property or field member of
+		/// the target object.
+		///	</summary>
+		/// <param name="member">Member information.</param>
+		/// <param name="target">Target object.</param>
+		/// <returns>Retrieved object.</returns>
+		private static object GetUnderlyingObject(
+			MemberInfo member, object target)
+		{
+			object result = null;
+
+			if(member.MemberType == MemberTypes.Field)
+			{
+				FieldInfo field = member as FieldInfo;
+
+				if(field.FieldType.IsPrimitive)
+				{
+					throw new NMSException(string.Format(
+						"The field given is a primitive type: {0}",
+						member.Name));
+				}
+
+				result = field.GetValue(target);
+			}
+			else
+			{
+				PropertyInfo property = member as PropertyInfo;
+				MethodInfo getter = property.GetGetMethod();
+
+				if(getter == null)
+				{
+					throw new NMSException(string.Format(
+						"Cannot access member: {0}",
+						member.Name));
+				}
+
+				result = getter.Invoke(target, null);
+			}
+
+			if(result == null)
+			{
+				throw new NMSException(string.Format(
+					"Could not retrieve the value of member {0}.",
+					member.Name));
+			}
+
+			return result;
+		}
+
+		#endregion
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Util/UriAttributeAttribute.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Util/UriAttributeAttribute.cs b/src/main/csharp/Util/UriAttributeAttribute.cs
new file mode 100644
index 0000000..f7278d8
--- /dev/null
+++ b/src/main/csharp/Util/UriAttributeAttribute.cs
@@ -0,0 +1,51 @@
+\ufeff/*
+ * 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;
+
+namespace Apache.NMS.XMS.Util
+{
+    /// <summary>
+    /// Attribute for mapping a URI attribute key to an object's property.
+    /// </summary>
+    public class UriAttributeAttribute : System.Attribute
+    {
+        private readonly string[] attributeKeys;
+
+        /// <summary>
+        /// Constructs an <c>UriAttributeAttribute</c> specifying a list
+        /// of attribute keys.
+        /// </summary>
+        /// <param name="keys">URI attribute keys.</param>
+        public UriAttributeAttribute(params string[] keys)
+        {
+            this.attributeKeys = new string[keys.Length];
+            for(int k = 0; k < keys.Length; k++)
+            {
+                this.attributeKeys[k] = keys[k];
+            }
+        }
+
+        /// <summary>
+        /// URI attribute keys.
+        /// </summary>
+        public string[] AttributeKeys
+        {
+            get { return this.attributeKeys; }
+        }
+    }
+}


[13/13] activemq-nms-xms git commit: Remove TODO text file.

Posted by ta...@apache.org.
Remove TODO text file.


Project: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/commit/a2ed5df9
Tree: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/tree/a2ed5df9
Diff: http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/diff/a2ed5df9

Branch: refs/heads/master
Commit: a2ed5df9da43344613c34553ad90ba2cbeff48d2
Parents: 653d676
Author: Jim Gomes <jg...@apache.org>
Authored: Wed Jan 13 23:08:12 2016 +0000
Committer: Jim Gomes <jg...@apache.org>
Committed: Wed Jan 13 23:08:12 2016 +0000

----------------------------------------------------------------------
 src/main/csharp/_TODO_.txt | 29 -----------------------------
 1 file changed, 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/a2ed5df9/src/main/csharp/_TODO_.txt
----------------------------------------------------------------------
diff --git a/src/main/csharp/_TODO_.txt b/src/main/csharp/_TODO_.txt
deleted file mode 100644
index d14384c..0000000
--- a/src/main/csharp/_TODO_.txt
+++ /dev/null
@@ -1,29 +0,0 @@
- ~ BytesMessage.cs				// Ajouter commentaires
- X Connection.cs
- X ConnectionFactory.cs
- X ConnectionMetaData.cs
- X Destination.cs
- X InitialContext.cs
- X MapMessage.cs
- X Message.cs
- ~ MessageConsumer.cs			// Ajouter commentaires
- ~ MessageProducer.cs			// Ajouter commentaires
- ~ MessageProperties.cs			// Ajouter commentaires
- X ObjectMessage.cs
- X Queue.cs
- ~ QueueBrowser.cs				// Ajouter commentaires
- ~ Session.cs					// Ajouter commentaires
- X StreamMessage.cs
- X TemporaryQueue.cs
- X TemporaryTopic.cs
- X TextMessage.cs
- X Topic.cs
- ? Util\Dispatcher.cs
- X Util\ExceptionUtil.cs
- X Util\IntrospectionSupport.cs
- X Util\UriAttributeAttribute.cs
- X Util\XMSConvert.cs
- X Util\XMSEnum.cs
-
-
-Temporary Queue / Topic
\ No newline at end of file


[11/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/nant-common.xml
----------------------------------------------------------------------
diff --git a/nant-common.xml b/nant-common.xml
new file mode 100644
index 0000000..3e5a8fc
--- /dev/null
+++ b/nant-common.xml
@@ -0,0 +1,658 @@
+\ufeff<?xml version="1.0"?>
+<!--
+    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.
+-->
+<project xmlns="http://nant.sourceforge.net/release/0.85/nant.xsd">
+
+    <!-- ============================================================================================ -->
+    <!--    P R O P E R T Y    D E F I N I T I O N S                                                  -->
+    <!-- ============================================================================================ -->
+
+    <!-- global project settings -->
+    <property name="project.cls.compliant"   value="true" unless="${property::exists('project.cls.compliant')}" />
+    <property name="project.release.type"    value="SNAPSHOT" unless="${property::exists('project.release.type')}" />
+    <property name="project.version.full"    value="${project.version + if(project.release.type == 'snapshot', '-' + project.release.type, '')}" dynamic="true" />
+    <property name="project.startyear"       value="2005" />
+    <property name="build.dir"               value="${basedir}/build" />
+    <property name="doc.dir"                 value="${build.dir}/doc" />
+    <property name="lib.dir"                 value="${path::combine(basedir, 'lib')}" dynamic="true" />
+    <property name="lib.family.dir"          value="${path::combine(lib.dir, framework::get-family(framework::get-target-framework()))}" dynamic="true" />
+    <property name="lib.framework.dir"       value="${path::combine(lib.family.dir, version::to-string(framework::get-version(framework::get-target-framework())))}" dynamic="true" />
+    <property name="package.dir"             value="${basedir}/package" />
+    <property name="src.package.name"        value="${project.name + '-' + project.version + if(project.release.type == 'SNAPSHOT', '-' + project.release.type, '') + '-src.zip'}" />
+    <property name="bin.package.name"        value="${project.name + '-' + project.version + if(project.release.type == 'SNAPSHOT', '-' + project.release.type, '') + '-bin.zip'}" />
+
+    <!-- default configuration -->
+    <property name="build.defines"           value="" />
+    <property name="build.noskip"            value="false" />
+    <property name="build.skip"              value="false" />
+    <property name="build.skip.release"      value="false" unless="${property::exists('build.skip.release')}" />
+    <property name="download.skip"           value="false" unless="${property::exists('download.skip')}"/>
+    <property name="install.skip"            value="false" unless="${property::exists('install.skip')}"/>
+    <property name="compile.skip"            value="false" unless="${property::exists('compile.skip')}" />
+    <property name="current.build.config"    value="${if(project.release.type == 'release', 'release', 'debug')}" overwrite="false" />
+    <property name="current.build.framework" value="${framework::get-target-framework()}" overwrite="false" />
+    <property name="current.build.defines"   value="${build.defines}" />
+    <property name="build.framework.strings" value="net-2.0,net-3.5,net-4.0,mono-2.0,mono-4.0,netcf-2.0,netcf-3.5" unless="${property::exists('build.framework.strings')}"/>
+    <property name="current.build.framework.assembly.dir" value="${framework::get-assembly-directory(framework::get-target-framework())}" dynamic="true" />
+
+    <property name="build.config.strings"    value="${if(property::exists('configuration'), configuration, if(build.skip.release == 'true', 'debug', 'debug,release'))}" dynamic="true" />
+
+    <!-- Figure out the user's HOME directory -->
+    <property name="user.home" value="${environment::get-variable('HOME')}"
+            if="${environment::variable-exists('HOME') and platform::is-unix()}"
+            unless="${property::exists('user.home')}" />
+    <property name="user.home" value="${environment::get-variable('USERPROFILE')}"
+            if="${environment::variable-exists('USERPROFILE') and platform::is-windows()}"
+            unless="${property::exists('user.home')}" />
+    <fail message="The HOME environment variable is not defined.  Please set it to your home directory."
+            unless="${property::exists('user.home')}" if="${platform::is-unix()}" />
+    <fail message="The USERPROFILE environment variable is not defined.  Please set it to your home directory."
+            unless="${property::exists('user.home')}" if="${platform::is-windows()}" />
+
+    <!-- Figure out the NANT repositories -->
+    <property name="nant.remote.repo" value="${environment::get-variable('NANT_REMOTE_REPO')}"
+            if="${environment::variable-exists('NANT_REMOTE_REPO')}"
+            unless="${property::exists('nant.remote.repo')}" />
+    <property name="nant.local.repo" value="${environment::get-variable('NANT_REPO')}/local"
+            if="${environment::variable-exists('NANT_REPO')}"
+            unless="${property::exists('nant.local.repo')}" />
+    <property name="nant.local.repo" value="${user.home}/.nant/repository/local"
+            unless="${property::exists('nant.local.repo')}" />
+
+    <!-- Figure out the keyfile location -->
+    <property name="snk.file" value="${environment::get-variable('ACTIVEMQ_DOTNET_SNK')}"
+            if="${environment::variable-exists('ACTIVEMQ_DOTNET_SNK')}"
+            unless="${property::exists('snk.file')}" />
+    <property name="snk.file" value="${basedir}/keyfile/NMSKey.snk"
+            if="${not property::exists('snk.file')}" />
+
+    <!-- ============================================================================================ -->
+    <!--      I N I T I A L I Z A T I O N     T A R G E T S                                           -->
+    <!-- ============================================================================================ -->
+
+    <target name="init" description="Initializes build properties">
+        <!-- enabled the release or debug configuration -->
+        <call target="set-${current.build.config}-configuration" />
+
+        <!-- Check to see if our build setup for the target framework -->
+        <if test="${not(target::exists('set-'+current.build.framework+'-framework-configuration'))}">
+            <fail message="The '${current.build.framework}' framework is not supported by this version of ActiveMQ .NET" />
+        </if>
+        <call target="set-${current.build.framework}-framework-configuration" />
+
+        <!-- Check to see current platform supports the target framework -->
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="build.skip" value="false" />
+        </if>
+        <if test="${not framework::exists(current.build.framework)}">
+            <if test="${build.noskip}">
+                <fail message="${current.build.framework.name} is not available." />
+            </if>
+            <if test="${not(build.noskip)}">
+                <echo message="${current.build.framework.name} is not available. Build skipped." />
+                <property name="build.skip" value="true" />
+            </if>
+        </if>
+
+        <!-- Check to see if we should skip this build framework. -->
+        <if test="${not(build.skip)}">
+            <if test="${property::exists('build.'+current.build.framework+'.skip')}">
+                <property name="build.skip" value="true" />
+                <echo message="The '${current.build.framework}' framework is not supported by this version of ActiveMQ .NET" />
+            </if>
+        </if>
+
+        <property name="current.build.keysign" value="${current.build.framework.sign}" />
+        <property name="build.bin.dir" value="${build.dir}/${current.build.framework}/${current.build.config}" />
+        <if test="${not(build.skip)}">
+            <echo message="Doing ${if(current.build.keysign,'a signed','an unsigned')} ${current.build.config} build for the ${current.build.framework.name} framework" />
+            <mkdir dir="${build.bin.dir}" />
+        </if>
+        <call target="dependency-init" />
+    </target>
+
+    <!-- Generate four-digit build number -->
+    <target name="generate-build-number">
+        <if test="${not property::exists('project.version.numeric')}">
+            <script language="C#">
+                <imports>
+                    <import namespace="System.Globalization" />
+                    <import namespace="System.Threading" />
+                </imports>
+                <code>
+                    <!-- Format for assembly revision is the number of days from the year the project 'started', property project.startyear.  -->
+                    <![CDATA[
+                        public static void ScriptMain(Project project)
+                        {
+                            int startYear = Convert.ToInt32(project.Properties["project.startyear"]);
+                            DateTime start = new DateTime(startYear, 1, 1);
+                            TimeSpan ts = DateTime.Now - start;
+                            project.Properties["project.version.numeric"] = project.Properties["project.version"].ToString() + "." + ts.Days.ToString();
+                        }
+                    ]]>
+                </code>
+            </script>
+        </if>
+    </target>
+
+    <!-- Generate assemblyinfo.cs files -->
+    <target name="generate-assemblyinfo" depends="generate-build-number" description="Generate the assembly info for the path in assemblyinfo.filename">
+        <asminfo output="${assemblyinfo.filename}" language="CSharp">
+            <imports>
+                <import namespace="System" />
+                <import namespace="System.Reflection" />
+                <import namespace="System.Runtime.InteropServices" />
+            </imports>
+            <attributes>
+                <attribute type="ComVisibleAttribute" value="false" />
+                <attribute type="CLSCompliantAttribute" value="${project.cls.compliant}" />
+                <attribute type="AssemblyTitleAttribute" value="${project.short_description}" />
+                <attribute type="AssemblyDescriptionAttribute" value="${project.description}" />
+                <attribute type="AssemblyConfigurationAttribute" value="${project.release.type}" />
+                <attribute type="AssemblyCompanyAttribute" value="http://activemq.apache.org/nms" />
+                <attribute type="AssemblyProductAttribute" value="${project.short_description}" />
+                <attribute type="AssemblyCopyrightAttribute" value="Copyright (C) ${project.startyear}-${datetime::get-year(datetime::now())} Apache Software Foundation" />
+                <attribute type="AssemblyTrademarkAttribute" value="" />
+                <attribute type="AssemblyCultureAttribute" value="" />
+                <attribute type="AssemblyVersionAttribute" value="${project.version.numeric}" />
+                <attribute type="AssemblyInformationalVersionAttribute" value="${project.version}" />
+            </attributes>
+        </asminfo>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--    C O N F I G U R A T I O N     T A R G E T S                                               -->
+    <!-- ============================================================================================ -->
+
+    <target name="set-noskip-configuration" description="Disable skipping builds">
+        <property name="project.noskip" value="true" />
+    </target>
+
+    <target name="set-debug-configuration" description="Enabled 'debug' builds">
+        <property name="current.build.config" value="debug" />
+        <property name="current.build.config.debug" value="true" />
+        <property name="current.build.config.release" value="false" />
+        <property name="current.build.defines" value="${build.defines}DEBUG,TRACE," dynamic="true" />
+        <property name="csc.debug" value="Full" />
+        <property name="csc.optimize" value="false" />
+    </target>
+
+    <target name="set-release-configuration" description="Enabled 'release' builds">
+        <property name="current.build.config" value="release" />
+        <property name="current.build.config.release" value="true" />
+        <property name="current.build.config.debug" value="false" />
+        <property name="csc.debug" value="Full" />
+        <property name="csc.optimize" value="true" />
+    </target>
+
+    <target name="set-net-2.0-framework-configuration">
+        <property name="current.build.framework" value="net-2.0" />
+        <property name="current.build.framework.name" value=".NET 2.0" />
+        <property name="current.build.defines" value="${build.defines}NET,NET_2_0" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v2_0" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+        <!-- Use the .NET 3.5 compiler for improved language features.  Still targets same runtime. -->
+        <if test="${framework::exists('net-3.5')}">
+            <property name="nant.settings.currentframework" value="net-3.5" />
+        </if>
+    </target>
+
+    <target name="set-net-3.5-framework-configuration">
+        <property name="current.build.framework" value="net-3.5" />
+        <property name="current.build.framework.name" value=".NET 3.5" />
+        <property name="current.build.defines" value="${build.defines}NET,NET_2_0,NET_3_5" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v6_1" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <target name="set-net-4.0-framework-configuration">
+        <property name="current.build.framework" value="net-4.0" />
+        <property name="current.build.framework.name" value=".NET 4.0" />
+        <property name="current.build.defines" value="${build.defines}NET,NET_2_0,NET_3_5,NET_4_0" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v7_0" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <target name="set-netcf-2.0-framework-configuration">
+        <property name="current.build.framework" value="netcf-2.0" />
+        <property name="current.build.framework.name" value=".NET Compact Framework 2.0" />
+        <property name="current.build.defines" value="${build.defines}PocketPC,NETCF,NETCF_2_0" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v1_1" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <target name="set-netcf-3.5-framework-configuration">
+        <property name="current.build.framework" value="netcf-3.5" />
+        <property name="current.build.framework.name" value=".NET Compact Framework 3.5" />
+        <property name="current.build.defines" value="${build.defines}PocketPC,NETCF,NETCF_3_5" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v3_5" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <target name="set-mono-2.0-framework-configuration">
+        <property name="current.build.framework" value="mono-2.0" />
+        <property name="current.build.framework.name" value="Mono 2.0" />
+        <property name="current.build.defines" value="${build.defines}MONO,MONO_2_0" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v1_1" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <target name="set-mono-4.0-framework-configuration">
+        <property name="current.build.framework" value="mono-4.0" />
+        <property name="current.build.framework.name" value="Mono 4.0" />
+        <property name="current.build.defines" value="${build.defines}MONO,MONO_4_0" dynamic="true" />
+        <property name="current.build.framework.sign" value="true" />
+        <property name="link.sdkdoc.version" value="SDK_v1_1" />
+        <property name="link.sdkdoc.web" value="true" />
+        <if test="${framework::exists(current.build.framework)}">
+            <property name="nant.settings.currentframework" value="${current.build.framework}" />
+        </if>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--     C O M P I L E    T A R G E T S                                                           -->
+    <!-- ============================================================================================ -->
+
+    <target name="compile-all" description="Compile all build configurations for all runtime configurations">
+        <echo message="Compiling all build configurations for all runtime configurations." />
+        <foreach item="String" in="${build.framework.strings}" delim="," property="current.build.framework">
+            <foreach item="String" in="${build.config.strings}" delim="," property="current.build.config">
+                <call target="compile-target" />
+            </foreach>
+        </foreach>
+    </target>
+
+    <target name="compile-target" depends="init, download-vendor, conditional-compile" />
+
+    <target name="conditional-compile" depends="init" unless="${build.skip or compile.skip}"
+            description="Conditionaly compiles all the modules if build framework and type are supported">
+        <call target="compile" />
+    </target>
+
+    <target name="compile" description="Compile everything">
+        <call target="compile-main" cascade="false" />
+        <call target="compile-test" cascade="false" />
+    </target>
+
+    <target name="compile-main" depends="init" description="Build the main library">
+        <echo message="Building the ${project.name} library" />
+        <property name="assemblyinfo.filename" value="src/main/csharp/CommonAssemblyInfo.cs" />
+        <call target="generate-assemblyinfo" />
+
+        <csc if="${current.build.keysign}" keyfile="${snk.file}" target="library"
+                define="${current.build.defines}" warnaserror="false" debug="${csc.debug}" optimize="${csc.optimize}"
+                output="${build.bin.dir}/${project.name}.dll" doc="${build.bin.dir}/${project.name}.xml">
+            <nowarn>
+                <warning number="1591" /> <!-- do not report warnings for missing XML comments -->
+            </nowarn>
+            <sources failonempty="true">
+                <include name="src/main/csharp/**.cs" />
+            </sources>
+            <references refid="dependencies" />
+        </csc>
+        <csc if="${not current.build.keysign}" target="library"
+                define="${current.build.defines}" warnaserror="false" debug="${csc.debug}" optimize="${csc.optimize}"
+                output="${build.bin.dir}/${project.name}.dll" doc="${build.bin.dir}/${project.name}.xml">
+            <nowarn>
+                <warning number="1591" /> <!-- do not report warnings for missing XML comments -->
+            </nowarn>
+            <sources failonempty="true">
+                <include name="src/main/csharp/**.cs" />
+            </sources>
+            <references refid="dependencies" />
+        </csc>
+        <call target="copy-content" />
+    </target>
+
+    <!-- Compile the nms-test module -->
+    <target name="compile-test" depends="compile-main" description="Build the test library">
+        <echo message="Building the ${project.name}.Test library" />
+        <property name="assemblyinfo.filename" value="src/test/csharp/CommonAssemblyInfo.cs" />
+        <call target="generate-assemblyinfo" />
+
+        <csc if="${current.build.keysign}" keyfile="${snk.file}" target="library"
+                define="${current.build.defines}" warnaserror="false" debug="${csc.debug}" optimize="${csc.optimize}"
+                output="${build.bin.dir}/${project.name}.Test.dll" doc="${build.bin.dir}/${project.name}.Test.xml">
+            <nowarn>
+                <warning number="1591" /> <!-- do not report warnings for missing XML comments -->
+                <warning number="3016" /> <!-- do not report warnings for array parameters  -->
+            </nowarn>
+            <sources failonempty="true">
+                <include name="src/test/csharp/**.cs" />
+            </sources>
+            <references refid="test.dependencies" />
+        </csc>
+        <csc if="${not current.build.keysign}" target="library"
+                define="${current.build.defines}" warnaserror="false" debug="${csc.debug}" optimize="${csc.optimize}"
+                output="${build.bin.dir}/${project.name}.Test.dll" doc="${build.bin.dir}/${project.name}.Test.xml">
+            <nowarn>
+                <warning number="1591" /> <!-- do not report warnings for missing XML comments -->
+                <warning number="3016" /> <!-- do not report warnings for array parameters  -->
+            </nowarn>
+            <sources failonempty="true">
+                <include name="src/test/csharp/**.cs" />
+            </sources>
+            <references refid="test.dependencies" />
+        </csc>
+        <call target="copy-content" />
+    </target>
+
+    <target name="copy-content">
+        <foreach item="File" property="content.filename">
+            <in>
+                <items refid="content.filenames" />
+            </in>
+            <do>
+                <copy todir="${build.bin.dir}" file="${content.filename}" if="${not file::up-to-date(content.filename, '${build.bin.dir}/${content.filename}')}" />
+            </do>
+        </foreach>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--      I N S T A L L     T A R G E T S                                                         -->
+    <!-- ============================================================================================ -->
+
+    <target name="install-all" description="Install all build configurations for all runtime configurations">
+        <echo message="Installing all build configurations for all runtime configurations." />
+        <foreach item="String" in="${build.framework.strings}" delim="," property="current.build.framework">
+            <foreach item="String" in="${build.config.strings}" delim="," property="current.build.config">
+                <call target="install" />
+            </foreach>
+        </foreach>
+    </target>
+
+    <!-- Install the modules to the local repo -->
+    <target name="install" depends="init, compile-target, conditional-install"
+            description="Install the artifacts into the nant repo" />
+
+    <target name="conditional-install" unless="${build.skip or install.skip}"
+            description="Install the artifacts into the nant repo">
+        <property name="path" value="${project.group}/${project.name}/${project.version.full}/${current.build.framework}/${current.build.config}" />
+        <foreach item="File" property="install.filename">
+            <in>
+                <items refid="install.filenames" />
+            </in>
+            <do>
+                <property name="repo.task.artifact" value="${path}/${path::get-file-name(install.filename)}" />
+                <property name="repo.task.src" value="${install.filename}" />
+                <property name="repo.task.dest" value="${nant.local.repo}/${repo.task.artifact}" />
+                <mkdir dir="${directory::get-parent-directory(repo.task.dest)}" />
+                <copy file="${repo.task.src}" tofile="${repo.task.dest}" />
+            </do>
+        </foreach>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--      R E P O    D O W N L O A D     T A R G E T S                                            -->
+    <!-- ============================================================================================ -->
+
+    <target name="download-vendor-all" description="Download vendor files for all runtime configurations">
+        <echo message="Downloading vendor files for all runtime configurations." />
+        <property name="current.build.config" value="release" />
+        <foreach item="String" in="${build.framework.strings}" delim="," property="current.build.framework">
+            <call target="download-vendor" />
+        </foreach>
+    </target>
+
+    <target name="download-vendor" depends="vendor-init, conditional-download"
+                description="Download the vendor artifacts from the nant repo" />
+
+    <target name="conditional-download" unless="${build.skip or download.skip}"
+                description="Download the artifacts from the nant repo">
+        <!-- Iterate over the defined vendor filesets. -->
+        <foreach item="String" in="${vendor.fileset.names}" delim="," property="current.vendor">
+            <property name="vendor.name" value="${property::get-value(current.vendor + '.name')}" />
+            <property name="vendor.group" value="${property::get-value(current.vendor + '.group')}" />
+            <property name="vendor.version" value="${property::get-value(current.vendor + '.version')}" />
+            <property name="vendor.filenames" value="${property::get-value(current.vendor + '.filenames')}" />
+            <property name="local.repo.vendor.path" value="${nant.local.repo}/${vendor.group}/${vendor.name}/${vendor.version}/${current.build.framework}/${current.build.config}" />
+            <property name="lib.path" value="lib/${vendor.name}/${current.build.framework}" />
+            <!--
+            Update the LIB folder with the latest version of the file.  If there is a newer version
+            installed in the local repository, then that version will be copied into the LIB folder.
+            -->
+            <foreach item="String" in="${vendor.filenames}" delim="," property="repo.task.artifact">
+                <property name="lib.task.dest" value="${lib.path}/${repo.task.artifact}" />
+                <mkdir dir="${directory::get-parent-directory(lib.task.dest)}" />
+                <property name="repo.task.src" value="${local.repo.vendor.path}/${repo.task.artifact}" />
+                <copy file="${repo.task.src}" tofile="${lib.task.dest}" if="${file::exists(repo.task.src)}" />
+                <if test="${not file::exists(lib.task.dest)}">
+                    <echo message="Required dependent assembly ${repo.task.artifact} from ${vendor.name} for ${current.build.framework} is not available. Build skipped." />
+                    <property name="build.skip" value="true" />
+                </if>
+            </foreach>
+        </foreach>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--      T E S T     T A R G E T S                                                               -->
+    <!-- ============================================================================================ -->
+
+    <target name="test" depends="test-debug" description="Alias test target to test-debug" />
+
+    <target name="test-all" depends="test-debug, test-release" description="Test all build configurations for all runtime configurations" />
+
+    <target name="test-debug" depends="" description="Test debug build configurations for all runtime configurations">
+        <property name="current.build.config" value="debug" />
+        <call target="test-frameworks" />
+    </target>
+
+    <target name="test-release" depends="" description="Test release build configurations for all runtime configurations">
+        <property name="current.build.config" value="release" />
+        <call target="test-frameworks" />
+    </target>
+
+    <target name="test-frameworks">
+        <foreach item="String" in="${build.framework.strings}" delim="," property="current.build.framework">
+            <call target="init" />
+            <if test="${not build.skip}">
+                <exec program="nunit-console" failonerror="true" workingdir="build/${current.build.framework}/${current.build.config}">
+                    <arg value="${NUnit.Projectfile}" />
+                    <arg value="-labels" />
+                    <arg value="-exclude=Manual,LongRunning" />
+                    <arg value="-xml=Nunit.TestOutput.xml" />
+                </exec>
+            </if>
+        </foreach>
+    </target>
+
+    <!-- ============================================================================================ -->
+    <!--      M I S C E L L A N E O U S    T A R G E T S                                              -->
+    <!-- ============================================================================================ -->
+
+    <target name="build" depends="default" description="Build the project." />
+
+    <target name="rebuild" depends="clean,build" description="Rebuild the project." />
+
+    <target name="clean" description="Deletes build">
+        <if test="${target::exists('clean-init')}">
+            <call target="clean-init" />
+        </if>
+        <foreach item="String" in="${build.framework.strings}" delim="," property="current.build.framework">
+            <foreach item="String" in="${build.config.strings}" delim="," property="current.build.config">
+                <call target="clean-proj" />
+            </foreach>
+        </foreach>
+    </target>
+
+    <target name="clean-proj" depends="init" description="Deletes specific project build">
+        <property name="clean.dir" value="build/${current.build.framework}/${current.build.config}" />
+        <delete dir="${clean.dir}" if="${directory::exists(clean.dir)}" />
+        <property name="clean.dir" value="package/${current.build.config}" />
+        <delete dir="${clean.dir}" if="${directory::exists(clean.dir)}" />
+    </target>
+
+    <target name="package" description="Bundle the source and binary distributions.">
+        <mkdir dir="${package.dir}"
+                if="${not directory::exists(package.dir)}" />
+        <zip zipfile="${package.dir}/${bin.package.name}">
+            <fileset refid="bin.package.contents"/>
+        </zip>
+        <zip zipfile="${package.dir}/${src.package.name}">
+            <fileset refid="src.package.contents"/>
+        </zip>
+    </target>
+
+    <target name="doc" depends="build">
+        <mkdir dir="${doc.dir}" />
+        <ndoc failonerror="false">
+            <assemblies basedir="${build.bin.dir}">
+                <include name="${project.name}.dll" />
+            </assemblies>
+            <summaries basedir="${basedir}/src/main/ndoc">
+                <include name="NamespaceSummary.xml" />
+            </summaries>
+            <documenters>
+                <documenter name="MSDN">
+                    <property name="OutputDirectory" value="${doc.dir}" />
+                    <property name="HtmlHelpName" value="${project.name}" />
+                    <property name="HtmlHelpCompilerFilename" value="hhc.exe" />
+                    <property name="IncludeFavorites" value="False" />
+                    <property name="Title" value="${project.short_description}" />
+                    <property name="SplitTOCs" value="False" />
+                    <property name="DefaulTOC" value="" />
+                    <!--
+                    <property name="ShowVisualBasic" value="True" />
+                    <property name="ShowMissingSummaries" value="True" />
+                    <property name="ShowMissingRemarks" value="True" />
+                    <property name="ShowMissingParams" value="True" />
+                    <property name="ShowMissingReturns" value="True" />
+                    <property name="ShowMissingValues" value="True" />
+                    -->
+                    <property name="DocumentInternals" value="False" />
+                    <property name="DocumentProtected" value="True" />
+                    <property name="DocumentPrivates" value="False" />
+                    <property name="DocumentEmptyNamespaces" value="False" />
+                    <property name="IncludeAssemblyVersion" value="True" />
+                    <property name="CopyrightText" value="" />
+                    <property name="CopyrightHref" value="" />
+                </documenter>
+            </documenters>
+        </ndoc>
+    </target>
+
+    <target name="sandcastle" depends="set-release-configuration, init, conditional-compile">
+        <!-- Directories -->
+        <property name="sandcastle.style" value="vs2005" unless="${property::exists('sandcastle.style')}" />
+        <property name="documentation.dir" value="${build.bin.dir}" />
+        <property name="bin.intern.dir" value="${build.bin.dir}" />
+        <property name="bin.extern.dir" value="${basedir}\lib\NUnit\net-2.0" />
+        <property name="sandcastle.dir" value="${environment::get-variable('DXROOT')}" />
+        <property name="sandcastle.workingdir" value="${build.dir}\doc\${sandcastle.style}" />
+        <property name="sandcastle.output.dir" value="${sandcastle.workingdir}\Output" />
+
+        <!-- Executables -->
+        <property name="sandcastle.mrefbuilder.exe" value="${sandcastle.dir}\productiontools\mrefbuilder.exe" />
+        <property name="sandcastle.buildassembler.exe" value="${sandcastle.dir}\productiontools\buildassembler.exe" />
+        <property name="sandcastle.xsltransform.exe" value="${sandcastle.dir}\productiontools\xsltransform.exe" />
+        <property name="sandcastle.productiontransforms.dir" value="${sandcastle.dir}\ProductionTransforms" />
+
+        <!-- Create or Cleanup Working Directory -->
+        <mkdir dir="${sandcastle.workingdir}"
+                if="${not directory::exists(sandcastle.workingdir)}" />
+        <delete>
+            <fileset basedir="${sandcastle.workingdir}">
+                <include name="**\*" />
+            </fileset>
+        </delete>
+
+        <!-- Copy configuration file, and hard code references -->
+        <copy file="${sandcastle.dir}/Presentation/${sandcastle.style}/Configuration/Sandcastle.config"
+                tofile="${sandcastle.workingdir}/Sandcastle.config">
+            <filterchain>
+                <replacestring from="&quot;..\..\" to="&quot;${sandcastle.dir}\" />
+                <replacestring from="&quot;..\" to="&quot;${sandcastle.dir}\Examples\" />
+                <replacestring from="&quot;.\comments.xml" to="&quot;${documentation.dir}\${project.name}.xml" />
+                <replacestring from="&quot;%DXROOT%\Presentation\${sandcastle.style}\content\feedback_content.xml&quot;" to="&quot;${basedir}/src/main/sandcastle/feedback_content.xml&quot;" />
+            </filterchain>
+        </copy>
+
+        <!-- Run MRefBuilder (introspection on assemblies) to create basic Reflection XML -->
+        <exec program="${sandcastle.mrefbuilder.exe}" workingdir="${sandcastle.workingdir}">
+            <arg value="${bin.intern.dir}/${project.name}.dll" />
+            <arg value="/out:reflection.int.xml" />
+            <arg value="/dep:${bin.extern.dir}\*.dll" />
+        </exec>
+
+        <!-- Create Reflection XML -->
+        <exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
+            <arg value="/xsl:&quot;${sandcastle.productiontransforms.dir}\ApplyVSDocModel.xsl&quot;" if="${sandcastle.style != 'prototype'}" />
+            <arg value="/xsl:&quot;${sandcastle.productiontransforms.dir}\ApplyPrototypeDocModel.xsl&quot;" if="${sandcastle.style == 'prototype'}" />
+            <arg value="/xsl:&quot;${sandcastle.productiontransforms.dir}\AddFriendlyFilenames.xsl&quot;" /> <!-- if="${sandcastle.style != 'prototype'}" /> -->
+            <arg value="/xsl:&quot;${sandcastle.productiontransforms.dir}\AddGuidFilenames.xsl&quot;" if="${sandcastle.style == 'disabled'}" />
+            <arg value="reflection.int.xml" />
+            <arg value="/out:reflection.xml" />
+            <arg value="/arg:IncludeAllMembersTopic=true" />
+            <arg value="/arg:IncludeInheritedOverloadTopics=true" />
+        </exec>
+
+        <!-- Create Manifest (list of Topics) -->
+        <exec program="${sandcastle.xsltransform.exe}" workingdir="${sandcastle.workingdir}">
+            <arg value="/xsl:&quot;${sandcastle.productiontransforms.dir}\ReflectionToManifest.xsl&quot;" />
+            <arg value="reflection.xml" />
+            <arg value="/out:manifest.xml" />
+        </exec>
+
+        <!-- Create Output Environment -->
+        <mkdir dir="${sandcastle.output.dir}" />
+        <mkdir dir="${sandcastle.output.dir}/html" />
+        <copy todir="${sandcastle.output.dir}">
+            <fileset basedir="${sandcastle.dir}/Presentation/${sandcastle.style}">
+                <include name="icons/*" />
+                <include name="media/*" />
+                <include name="scripts/*" />
+                <include name="styles/*" />
+            </fileset>
+        </copy>
+
+        <!-- Run BuildAssembler (create html topic files) -->
+        <exec program="${sandcastle.buildassembler.exe}" workingdir="${sandcastle.workingdir}">
+            <arg value="/config:Sandcastle.config" />
+            <arg value="manifest.xml" />
+        </exec>
+    </target>
+
+    <target name="sandcastle-all" description="Generate all formats of the Sandcastle documentation files.">
+        <foreach item="String" in="vs2005,prototype,hana" delim="," property="sandcastle.style">
+            <call target="sandcastle" />
+        </foreach>
+    </target>
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/nant.build
----------------------------------------------------------------------
diff --git a/nant.build b/nant.build
new file mode 100644
index 0000000..0912aa5
--- /dev/null
+++ b/nant.build
@@ -0,0 +1,189 @@
+\ufeff<?xml version="1.0"?>
+<!--
+    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.
+-->
+<project name="Apache.NMS.XMS" default="default" xmlns="http://nant.sourceforge.net/release/0.85/nant.xsd">
+	<!-- ============================================================================================ -->
+	<!--      I N I T I A L I Z A T I O N                                                             -->
+	<!-- ============================================================================================ -->
+	<property name="basedir" value="${project::get-base-directory()}" />
+	<property name="project.name" value="Apache.NMS.XMS" />
+	<property name="project.group" value="org.apache.activemq" />
+	<property name="project.version" value="1.8.0" unless="${property::exists('project.version')}" />
+	<property name="project.release.type" value="SNAPSHOT" unless="${property::exists('project.release.type')}" />
+	<property name="project.short_description" value="Apache NMS for XMS Class Library" />
+	<property name="project.description" value="Apache NMS for XMS Class Library (.Net Messaging Library Implementation): An implementation of the NMS API for XMS" />
+	<!-- The XMS module is not CLS compliant yet -->
+	<property name="project.cls.compliant" value="false" />
+	<!-- Repository organized as: organization/module/version/plaform/artifact, platform might be something like 'all' or 'net-4.0/release' -->
+	<property name="nunit.dll" value="${basedir}/lib/NUnit/${current.build.framework}/nunit.framework.dll" dynamic="true" />
+	<property name="Apache.NMS.dll" value="${basedir}/lib/Apache.NMS/${current.build.framework}/Apache.NMS.dll" dynamic="true" />
+	<property name="Apache.NMS.pdb" value="${basedir}/lib/Apache.NMS/${current.build.framework}/Apache.NMS.pdb" dynamic="true" />
+	<!--<property name="Apache.NMS.Test.dll" value="${basedir}/lib/Apache.NMS/${current.build.framework}//Apache.NMS.Test.dll" dynamic="true" />-->
+	<!--<property name="Apache.NMS.Test.pdb" value="${basedir}/lib/Apache.NMS/${current.build.framework}/Apache.NMS.Test.pdb" dynamic="true" />-->
+	<property name="IBM.XMS.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.dll" dynamic="true" />
+	<property name="IBM.XMS.Impl.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Impl.dll" dynamic="true" />
+	<property name="IBM.XMS.Core.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Core.dll" dynamic="true" />
+	<property name="IBM.XMS.Util.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Util.dll" dynamic="true" />
+	<property name="IBM.XMS.NLS.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.NLS.dll" dynamic="true" />
+	<property name="IBM.XMS.Provider.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Provider.dll" dynamic="true" />
+	<property name="IBM.XMS.Client.Impl.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Client.Impl.dll" dynamic="true" />
+	<property name="IBM.XMS.Client.WMQ.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Client.WMQ.dll" dynamic="true" />
+	<property name="IBM.XMS.Admin.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Admin.dll" dynamic="true" />
+	<property name="IBM.XMS.Admin.Objects.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Admin.Objects.dll" dynamic="true" />
+	<property name="IBM.XMS.Comms.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Comms.dll" dynamic="true" />
+	<property name="IBM.XMS.Comms.RMM.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Comms.RMM.dll" dynamic="true" />
+	<property name="IBM.XMS.Comms.SSL.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Comms.SSL.dll" dynamic="true" />
+	<property name="IBM.XMS.Formats.JMF.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Formats.JMF.dll" dynamic="true" />
+	<property name="IBM.XMS.Formats.MFP.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Formats.MFP.dll" dynamic="true" />
+	<property name="IBM.XMS.Match.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.Match.dll" dynamic="true" />
+	<property name="IBM.XMS.SIB.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.SIB.dll" dynamic="true" />
+	<property name="IBM.XMS.WCF.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.WCF.dll" dynamic="true" />
+	<property name="IBM.XMS.WCF.NLS.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.WCF.NLS.dll" dynamic="true" />
+	<property name="IBM.XMS.WMQI.dll" value="${basedir}/lib/IBM.XMS/${current.build.framework}/IBM.XMS.WMQI.dll" dynamic="true" />
+	<property name="NUnit.Projectfile" value="Apache.NMS.XMS.Test.nunit" />
+	<!-- Skip certain frameworks, since IBM XMS client is not supported on those platforms. -->
+	<property name="build.netcf-2.0.skip" value="true" />
+	<property name="build.netcf-3.5.skip" value="true" />
+	<property name="build.mono-2.0.skip" value="true" />
+	<!-- Possibly supported (cf. http://stackoverflow.com/questions/10138267/ibm-mqs-net-xms-and-mono) but not tested -->
+	<property name="build.mono-4.0.skip" value="true" />
+	<!-- Possibly supported (cf. http://stackoverflow.com/questions/10138267/ibm-mqs-net-xms-and-mono) but not tested -->
+	<property name="build.net-2.0.skip" value="true" />
+	<!-- Possibly supported but not tested -->
+	<property name="build.net-3.5.skip" value="true" />
+	<!-- Possibly supported but not tested -->
+	<target name="vendor-init" description="Initializes Vendor library from local repository.">
+		<!--
+		   Vendor specific info.  The prefix of 'vendor.apache.org' is taken from the property
+		   'vendor.fileset.names'.  This comma-delimited list is iterated, and properties with
+		   well-known suffixes are used to access and copy down vendor file dependencies.
+		-->
+		<property name="vendor.fileset.names" value="vendor.apache.org,vendor.nunit.org,vendor.ibm.org" />
+		<!-- Property grouping for 'vendor.apache.org' -->
+		<property name="vendor.apache.org.name" value="Apache.NMS" />
+		<property name="vendor.apache.org.group" value="org.apache.activemq" />
+		<property name="vendor.apache.org.version" value="1.8.0" />
+		<property name="vendor.apache.org.filenames" value="Apache.NMS.dll,Apache.NMS.pdb,Apache.NMS.Test.dll,Apache.NMS.Test.pdb" />
+		<!-- Property grouping for 'vendor.nunit.org' -->
+		<property name="vendor.nunit.org.name" value="NUnit" />
+		<property name="vendor.nunit.org.group" value="org.nunit" />
+		<property name="vendor.nunit.org.version" value="2.5.8" />
+		<property name="vendor.nunit.org.filenames" value="nunit.framework.dll" />
+		<!-- Property grouping for 'vendor.ibm.org' -->
+		<property name="vendor.ibm.org.name" value="IBM.XMS" />
+		<property name="vendor.ibm.org.group" value="org.ibm.xms" />
+		<property name="vendor.ibm.org.version" value="8.0.0" />
+		<property name="vendor.ibm.org.filenames" value="IBM.XMS.dll,IBM.XMS.Impl.dll,IBM.XMS.Core.dll,IBM.XMS.Util.dll,IBM.XMS.NLS.dll,IBM.XMS.Provider.dll,IBM.XMS.Client.Impl.dll,IBM.XMS.Client.WMQ.dll,IBM.XMS.Admin.dll,IBM.XMS.Admin.Objects.dll,IBM.XMS.Comms.dll,IBM.XMS.Comms.RMM.dll,IBM.XMS.Comms.SSL.dll,IBM.XMS.Formats.JMF.dll,IBM.XMS.Formats.MFP.dll,IBM.XMS.Match.dll,IBM.XMS.SIB.dll,IBM.XMS.WCF.dll,IBM.XMS.WCF.NLS.dll,IBM.XMS.WMQI.dll" />
+	</target>
+	<target name="dependency-init" description="Initializes build dependencies">
+		<assemblyfileset failonempty="true" id="dependencies">
+			<include name="${current.build.framework.assembly.dir}/mscorlib.dll" />
+			<include name="${current.build.framework.assembly.dir}/System.dll" />
+			<include name="${current.build.framework.assembly.dir}/System.Xml.dll" />
+			<include name="${IBM.XMS.dll}" />
+			<include name="${IBM.XMS.Impl.dll}" />
+			<include name="${IBM.XMS.Core.dll}" />
+			<include name="${IBM.XMS.Util.dll}" />
+			<include name="${IBM.XMS.NLS.dll}" />
+			<include name="${IBM.XMS.Provider.dll}" />
+			<include name="${IBM.XMS.Client.Impl.dll}" />
+			<include name="${IBM.XMS.Client.WMQ.dll}" />
+			<include name="${IBM.XMS.Admin.dll}" />
+			<include name="${IBM.XMS.Admin.Objects.dll}" />
+			<include name="${IBM.XMS.Comms.dll}" />
+			<include name="${IBM.XMS.Comms.RMM.dll}" />
+			<include name="${IBM.XMS.Comms.SSL.dll}" />
+			<include name="${IBM.XMS.Formats.JMF.dll}" />
+			<include name="${IBM.XMS.Formats.MFP.dll}" />
+			<include name="${IBM.XMS.Match.dll}" />
+			<include name="${IBM.XMS.SIB.dll}" />
+			<include name="${IBM.XMS.WCF.dll}" />
+			<include name="${IBM.XMS.WCF.NLS.dll}" />
+			<include name="${IBM.XMS.WMQI.dll}" />
+			<include name="${Apache.NMS.dll}" />
+		</assemblyfileset>
+		<assemblyfileset failonempty="true" id="test.dependencies">
+			<include name="${current.build.framework.assembly.dir}/mscorlib.dll" />
+			<include name="${current.build.framework.assembly.dir}/System.dll" />
+			<include name="${current.build.framework.assembly.dir}/System.Xml.dll" />
+			<include name="${IBM.XMS.dll}" />
+			<include name="${IBM.XMS.Impl.dll}" />
+			<include name="${IBM.XMS.Core.dll}" />
+			<include name="${IBM.XMS.Util.dll}" />
+			<include name="${IBM.XMS.NLS.dll}" />
+			<include name="${IBM.XMS.Provider.dll}" />
+			<include name="${IBM.XMS.Client.Impl.dll}" />
+			<include name="${IBM.XMS.Client.WMQ.dll}" />
+			<include name="${IBM.XMS.Admin.dll}" />
+			<include name="${IBM.XMS.Admin.Objects.dll}" />
+			<include name="${IBM.XMS.Comms.dll}" />
+			<include name="${IBM.XMS.Comms.RMM.dll}" />
+			<include name="${IBM.XMS.Comms.SSL.dll}" />
+			<include name="${IBM.XMS.Formats.JMF.dll}" />
+			<include name="${IBM.XMS.Formats.MFP.dll}" />
+			<include name="${IBM.XMS.Match.dll}" />
+			<include name="${IBM.XMS.SIB.dll}" />
+			<include name="${IBM.XMS.WCF.dll}" />
+			<include name="${IBM.XMS.WCF.NLS.dll}" />
+			<include name="${IBM.XMS.WMQI.dll}" />
+			<include name="${Apache.NMS.dll}" />
+			<!--<include name="${Apache.NMS.Test.dll}" />-->
+			<include name="${build.bin.dir}/${project.name}.dll" />
+			<include name="${nunit.dll}" />
+		</assemblyfileset>
+		<fileset id="content.filenames">
+			<include name="LICENSE.txt" />
+			<include name="NOTICE.txt" />
+			<include name="nmsprovider-*.config" />
+			<include name="${IBM.XMS.dll}" />
+			<include name="${IBM.XMS.Impl.dll}" />
+			<include name="${IBM.XMS.Core.dll}" />
+			<include name="${IBM.XMS.Util.dll}" />
+			<include name="${IBM.XMS.NLS.dll}" />
+			<include name="${IBM.XMS.Provider.dll}" />
+			<include name="${IBM.XMS.Client.Impl.dll}" />
+			<include name="${IBM.XMS.Client.WMQ.dll}" />
+			<include name="${IBM.XMS.Admin.dll}" />
+			<include name="${IBM.XMS.Admin.Objects.dll}" />
+			<include name="${IBM.XMS.Comms.dll}" />
+			<include name="${IBM.XMS.Comms.RMM.dll}" />
+			<include name="${IBM.XMS.Comms.SSL.dll}" />
+			<include name="${IBM.XMS.Formats.JMF.dll}" />
+			<include name="${IBM.XMS.Formats.MFP.dll}" />
+			<include name="${IBM.XMS.Match.dll}" />
+			<include name="${IBM.XMS.SIB.dll}" />
+			<include name="${IBM.XMS.WCF.dll}" />
+			<include name="${IBM.XMS.WCF.NLS.dll}" />
+			<include name="${IBM.XMS.WMQI.dll}" />
+			<include name="${Apache.NMS.dll}" />
+			<include name="${Apache.NMS.pdb}" />
+			<!--<include name="${Apache.NMS.Test.dll}" />-->
+			<!--<include name="${Apache.NMS.Test.pdb}" />-->
+			<include name="${nunit.dll}" />
+			<include name="${NUnit.Projectfile}" />
+		</fileset>
+		<fileset id="install.filenames">
+			<include name="LICENSE.txt" />
+			<include name="NOTICE.txt" />
+			<include name="${build.bin.dir}/${project.name}.dll" />
+			<include name="${build.bin.dir}/${project.name}.pdb" />
+		</fileset>
+	</target>
+	<target name="default" depends="install-all" />
+	<!-- Load the common target definitions  -->
+	<include buildfile="${basedir}/nant-common.xml" />
+</project>

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/package.ps1
----------------------------------------------------------------------
diff --git a/package.ps1 b/package.ps1
new file mode 100644
index 0000000..6fbb79b
--- /dev/null
+++ b/package.ps1
@@ -0,0 +1,61 @@
+# 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.
+
+$pkgname = "Apache.NMS.XMS"
+$pkgver = "1.8-SNAPSHOT"
+$configurations = "release", "debug"
+$frameworks = "net-4.0"
+
+write-progress "Creating package directory." "Initializing..."
+if(!(test-path package))
+{
+	md package
+}
+
+if(test-path build)
+{
+	pushd build
+
+	$pkgdir = "..\package"
+
+	write-progress "Packaging Application files." "Scanning..."
+	$zipfile = "$pkgdir\$pkgname-$pkgver-bin.zip"
+	zip -9 -u -j "$zipfile" ..\LICENSE.txt
+	zip -9 -u -j "$zipfile" ..\NOTICE.txt
+	foreach($configuration in $configurations)
+	{
+		foreach($framework in $frameworks)
+		{
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.dll"
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.xml"
+			zip -9 -u "$zipfile" "$framework\$configuration\xmsprovider*.config"
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.dll"
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.xml"
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.pdb"
+			zip -9 -u "$zipfile" "$framework\$configuration\$pkgname.Test.pdb"
+		}
+	}
+
+	popd
+}
+
+write-progress "Packaging Source code files." "Scanning..."
+$pkgdir = "package"
+$zipfile = "$pkgdir\$pkgname-$pkgver-src.zip"
+
+zip -9 -u "$zipfile" LICENSE.txt NOTICE.txt nant-common.xml nant.build package.ps1 vs2013-xms-test.csproj vs2013-xms.csproj vs2013-xms.sln
+zip -9 -u -r "$zipfile" keyfile src
+
+write-progress -Completed "Packaging" "Complete."

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/BytesMessage.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/BytesMessage.cs b/src/main/csharp/BytesMessage.cs
new file mode 100644
index 0000000..bddfb0f
--- /dev/null
+++ b/src/main/csharp/BytesMessage.cs
@@ -0,0 +1,187 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	class BytesMessage : Apache.NMS.XMS.Message, Apache.NMS.IBytesMessage
+	{
+		public IBM.XMS.IBytesMessage xmsBytesMessage
+		{
+			get { return (IBM.XMS.IBytesMessage)this.xmsMessage; }
+			set { this.xmsMessage = value; }
+		}
+
+		public BytesMessage(IBM.XMS.IBytesMessage message)
+			: base(message)
+		{
+		}
+
+		#region IBytesMessage Members
+
+		public byte[] Content
+		{
+			get
+			{
+				int contentLength = (int) this.xmsBytesMessage.BodyLength;
+				byte[] msgContent = new byte[contentLength];
+
+				this.xmsBytesMessage.Reset();
+				this.xmsBytesMessage.ReadBytes(msgContent, contentLength);
+				return msgContent;
+			}
+
+			set
+			{
+				this.ReadOnlyBody = false;
+				this.xmsBytesMessage.ClearBody();
+				this.xmsBytesMessage.WriteBytes(value, 0, value.Length);
+			}
+		}
+
+		public long BodyLength
+		{
+			get { return this.xmsBytesMessage.BodyLength; }
+		}
+
+		public bool ReadBoolean()
+		{
+			return this.xmsBytesMessage.ReadBoolean();
+		}
+
+		public byte ReadByte()
+		{
+			return (byte) this.xmsBytesMessage.ReadByte();
+		}
+
+		public int ReadBytes(byte[] value, int length)
+		{
+			return this.xmsBytesMessage.ReadBytes(value, length);
+		}
+
+		public int ReadBytes(byte[] value)
+		{
+			return this.xmsBytesMessage.ReadBytes(value);
+		}
+
+		public char ReadChar()
+		{
+			return this.xmsBytesMessage.ReadChar();
+		}
+
+		public double ReadDouble()
+		{
+			return this.xmsBytesMessage.ReadDouble();
+		}
+
+		public short ReadInt16()
+		{
+			return this.xmsBytesMessage.ReadShort();
+		}
+
+		public int ReadInt32()
+		{
+			return this.xmsBytesMessage.ReadInt();
+		}
+
+		public long ReadInt64()
+		{
+			return this.xmsBytesMessage.ReadLong();
+		}
+
+		public float ReadSingle()
+		{
+			return this.xmsBytesMessage.ReadFloat();
+		}
+
+		public string ReadString()
+		{
+			return this.xmsBytesMessage.ReadUTF();
+		}
+
+		public void Reset()
+		{
+			this.xmsBytesMessage.Reset();
+		}
+
+		public void WriteBoolean(bool value)
+		{
+			this.xmsBytesMessage.WriteBoolean(value);
+		}
+
+		public void WriteByte(byte value)
+		{
+			this.xmsBytesMessage.WriteByte(value);
+		}
+
+		public void WriteBytes(byte[] value, int offset, int length)
+		{
+			this.xmsBytesMessage.WriteBytes(value, offset, length);
+		}
+
+		public void WriteBytes(byte[] value)
+		{
+			this.xmsBytesMessage.WriteBytes(value);
+		}
+
+		public void WriteChar(char value)
+		{
+			this.xmsBytesMessage.WriteChar(value);
+		}
+
+		public void WriteDouble(double value)
+		{
+			this.xmsBytesMessage.WriteDouble(value);
+		}
+
+		public void WriteInt16(short value)
+		{
+			this.xmsBytesMessage.WriteShort(value);
+		}
+
+		public void WriteInt32(int value)
+		{
+			this.xmsBytesMessage.WriteInt(value);
+		}
+
+		public void WriteInt64(long value)
+		{
+			this.xmsBytesMessage.WriteLong(value);
+		}
+
+		public void WriteObject(object value)
+		{
+			this.xmsBytesMessage.WriteObject(value);
+		}
+
+		public void WriteSingle(float value)
+		{
+			this.xmsBytesMessage.WriteFloat(value);
+		}
+
+		public void WriteString(string value)
+		{
+			this.xmsBytesMessage.WriteUTF(value);
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Connection.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Connection.cs b/src/main/csharp/Connection.cs
new file mode 100644
index 0000000..07ba2fd
--- /dev/null
+++ b/src/main/csharp/Connection.cs
@@ -0,0 +1,461 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Represents an NMS connection to IBM MQ.
+	/// </summary>
+	///
+	public class Connection : Apache.NMS.IConnection
+	{
+		private Apache.NMS.AcknowledgementMode acknowledgementMode;
+		public readonly IBM.XMS.IConnection xmsConnection;
+		private IRedeliveryPolicy redeliveryPolicy;
+		private ConnectionMetaData metaData = null;
+		private readonly Atomic<bool> started = new Atomic<bool>(false);
+		private bool closed = false;
+		private bool disposed = false;
+		
+		#region Constructors
+		
+		/// <summary>
+		/// Constructs a connection object.
+		/// </summary>
+		public Connection(IBM.XMS.IConnection xmsConnection)
+		{
+			this.xmsConnection = xmsConnection;
+			this.xmsConnection.ExceptionListener = this.HandleXmsException;
+		}
+		
+		/// <summary>
+		/// "Destructs" or "finalizes" a connection object.
+		/// </summary>
+		~Connection()
+		{
+			Dispose(false);
+		}
+		
+		#endregion
+		
+		#region IStartable Members
+		
+		/// <summary>
+		/// Starts message delivery for this connection.
+		/// </summary>
+		public void Start()
+		{
+			if(started.CompareAndSet(false, true))
+			{
+				try
+				{
+					this.xmsConnection.Start();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+		
+		public bool IsStarted
+		{
+			get { return this.started.Value; }
+		}
+		
+		#endregion
+		
+		#region IStoppable Members
+		
+		/// <summary>
+		/// Stop message delivery for this connection.
+		/// </summary>
+		public void Stop()
+		{
+			try
+			{
+				if(started.CompareAndSet(true, false))
+				{
+					this.xmsConnection.Stop();
+				}
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+		}
+		
+		#endregion
+		
+		#region IConnection Members
+		
+		/// <summary>
+		/// Creates a new session to work on this connection
+		/// </summary>
+		public Apache.NMS.ISession CreateSession()
+		{
+			return CreateSession(acknowledgementMode);
+		}
+		
+		/// <summary>
+		/// Creates a new session to work on this connection
+		/// </summary>
+		public Apache.NMS.ISession CreateSession(
+			Apache.NMS.AcknowledgementMode mode)
+		{
+			try
+			{
+				bool isTransacted =
+					(mode == Apache.NMS.AcknowledgementMode.Transactional);
+				return XMSConvert.ToNMSSession(
+					this.xmsConnection.CreateSession(
+						isTransacted, XMSConvert.ToAcknowledgeMode(mode)));
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+		
+		public void Close()
+		{
+			lock(this)
+			{
+				if(closed)
+				{
+					return;
+				}
+		
+				try
+				{
+					this.xmsConnection.ExceptionListener = null;
+					this.xmsConnection.Stop();
+					this.xmsConnection.Close();
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+				finally
+				{
+					closed = true;
+				}
+			}
+		}
+		
+		public void PurgeTempDestinations()
+		{
+		}
+		
+		#endregion
+		
+		#region IDisposable Members
+		
+		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
+		
+		#region Attributes
+		
+		/// <summary>
+		/// The default timeout for network requests.
+		/// </summary>
+		public TimeSpan RequestTimeout
+		{
+			get { return Apache.NMS.NMSConstants.defaultRequestTimeout; }
+			set { }
+		}
+		
+		public Apache.NMS.AcknowledgementMode AcknowledgementMode
+		{
+			get { return acknowledgementMode; }
+			set { acknowledgementMode = value; }
+		}
+		
+		public string ClientId
+		{
+			get
+			{
+				try
+				{
+					return this.xmsConnection.ClientID;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+					return null;
+				}
+			}
+			set
+			{
+				try
+				{
+					this.xmsConnection.ClientID = value;
+				}
+				catch(Exception ex)
+				{
+					ExceptionUtil.WrapAndThrowNMSException(ex);
+				}
+			}
+		}
+		
+		/// <summary>
+		/// Get/or set the redelivery policy for this connection.
+		/// </summary>
+		public IRedeliveryPolicy RedeliveryPolicy
+		{
+			get { return this.redeliveryPolicy; }
+			set { this.redeliveryPolicy = value; }
+		}
+		
+		/// <summary>
+		/// Gets the Meta Data for the NMS Connection instance.
+		/// </summary>
+		public IConnectionMetaData MetaData
+		{
+			get { return this.metaData ?? (this.metaData = new ConnectionMetaData()); }
+		}
+		
+		#endregion
+		
+		#region Properties
+		
+		// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/props_conn.htm?lang=en
+		
+		#region Common properties
+		
+		/// <summary>
+		/// This property is used to obtain the name of the queue manager
+		/// to which it is connected.
+		/// </summary>
+		public string ResolvedQueueManagerName
+		{
+			get { return this.xmsConnection.GetStringProperty(XMSC.WMQ_RESOLVED_QUEUE_MANAGER); }
+			set { this.xmsConnection.SetStringProperty(XMSC.WMQ_RESOLVED_QUEUE_MANAGER, value); }
+		}
+		
+		/// <summary>
+		/// This property is populated with the ID of the queue manager
+		/// after the connection.
+		/// </summary>
+		public string ResolvedQueueManagerId
+		{
+			get { return this.xmsConnection.GetStringProperty(XMSC.WMQ_RESOLVED_QUEUE_MANAGER_ID); }
+			set { this.xmsConnection.SetStringProperty(XMSC.WMQ_RESOLVED_QUEUE_MANAGER_ID, value); }
+		}
+		
+		#endregion
+		
+		#region WPM-specific properties
+		
+		/// <summary>
+		/// The communications protocol used for the connection to the
+		/// messaging engine. This property is read-only.
+		/// </summary>
+		public Int32 XMSConnectionProtocol
+		{
+			get { return this.xmsConnection.GetIntProperty(XMSC.WPM_CONNECTION_PROTOCOL); }
+		}
+		
+		/// <summary>
+		/// The communications protocol used for the connection to the
+		/// messaging engine. This property is read-only.
+		/// </summary>
+		public WPMConnectionProtocol ConnectionProtocol
+		{
+			get { return XMSConvert.ToWPMConnectionProtocol(this.XMSConnectionProtocol); }
+		}
+		
+		/// <summary>
+		/// The host name or IP address of the system that contains the
+		/// messaging engine to which the application is connected. This
+		/// property is read-only.
+		/// </summary>
+		public string HostName
+		{
+			get { return this.xmsConnection.GetStringProperty(XMSC.WPM_HOST_NAME); }
+		}
+		
+		/// <summary>
+		/// The name of the messaging engine to which the application is
+		/// connected. This property is read-only.
+		/// </summary>
+		public string MessagingEngineName
+		{
+			get { return this.xmsConnection.GetStringProperty(XMSC.WPM_ME_NAME); }
+		}
+		
+		/// <summary>
+		/// The number of the port listened on by the messaging engine to
+		/// which the application is connected. This property is read-only.
+		/// </summary>
+		public Int32 Port
+		{
+			get { return this.xmsConnection.GetIntProperty(XMSC.WPM_PORT); }
+		}
+		
+		#endregion
+		
+		#endregion
+		
+		#region Event Listeners, Handlers and Delegates
+		
+		/// <summary>
+		/// A delegate that can receive transport level exceptions.
+		/// </summary>
+		public event ExceptionListener ExceptionListener;
+		
+		/// <summary>
+		/// Handles XMS connection exceptions.
+		/// </summary>
+		private void HandleXmsException(Exception exception)
+		{
+			if(ExceptionListener != null)
+			{
+				// Return codes MQRC_RECONNECTING and MQRC_RECONNECTED
+				// are not defined in XMS.
+				// const int MQRC_RECONNECTING = 2544;
+				// const int MQRC_RECONNECTED = 2545;
+				// According to http://www-01.ibm.com/support/knowledgecenter/#!/SSFKSJ_8.0.0/com.ibm.mq.con.doc/q017800_.htm
+				// Except for JMS and XMS clients, if a client application has
+				// access to reconnection options, it can also create an event
+				// handler to handle reconnection events.
+				ExceptionListener(exception);
+			}
+			else
+			{
+				Apache.NMS.Tracer.Error(exception);
+			}
+		}
+		
+		/// <summary>
+		/// An asynchronous listener that is notified when a fault tolerant
+		/// connection has been interrupted.
+		/// </summary>
+		/// <remarks>
+		/// IBM XMS does not handle disconnection / reconnection notifications.
+		/// This delegate will never be called.
+		/// </remarks>
+		public event ConnectionInterruptedListener ConnectionInterruptedListener;
+		
+		private void HandleTransportInterrupted()
+		{
+			Tracer.Debug("Transport has been interrupted.");
+		
+			if(this.ConnectionInterruptedListener != null && !this.closed)
+			{
+				try
+				{
+					this.ConnectionInterruptedListener();
+				}
+				catch
+				{
+				}
+			}
+		}
+		
+		/// <summary>
+		/// An asynchronous listener that is notified when a fault tolerant
+		/// connection has been resumed.
+		/// </summary>
+		/// <remarks>
+		/// IBM XMS does not handle disconnection / reconnection notifications.
+		/// This delegate will never be called.
+		/// </remarks>
+		public event ConnectionResumedListener ConnectionResumedListener;
+		
+		private void HandleTransportResumed()
+		{
+			Tracer.Debug("Transport has resumed normal operation.");
+		
+			if(this.ConnectionResumedListener != null && !this.closed)
+			{
+				try
+				{
+					this.ConnectionResumedListener();
+				}
+				catch
+				{
+				}
+			}
+		}
+		
+		private ConsumerTransformerDelegate consumerTransformer;
+		/// <summary>
+		/// A Delegate that is called each time a Message is dispatched to allow the client to do
+		/// any necessary transformations on the received message before it is delivered.  The
+		/// ConnectionFactory sets the provided delegate instance on each Connection instance that
+		/// is created from this factory, each connection in turn passes the delegate along to each
+		/// Session it creates which then passes that along to the Consumers it creates.
+		/// </summary>
+		public ConsumerTransformerDelegate ConsumerTransformer
+		{
+			get { return this.consumerTransformer; }
+			set { this.consumerTransformer = value; }
+		}
+		
+		private ProducerTransformerDelegate producerTransformer;
+		/// <summary>
+		/// A delegate that is called each time a Message is sent from this Producer which allows
+		/// the application to perform any needed transformations on the Message before it is sent.
+		/// The ConnectionFactory sets the provided delegate instance on each Connection instance that
+		/// is created from this factory, each connection in turn passes the delegate along to each
+		/// Session it creates which then passes that along to the Producers it creates.
+		/// </summary>
+		public ProducerTransformerDelegate ProducerTransformer
+		{
+			get { return this.producerTransformer; }
+			set { this.producerTransformer = value; }
+		}
+		
+		#endregion
+	}
+}


[05/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/StreamMessage.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/StreamMessage.cs b/src/test/csharp/Commands/StreamMessage.cs
new file mode 100644
index 0000000..1195a12
--- /dev/null
+++ b/src/test/csharp/Commands/StreamMessage.cs
@@ -0,0 +1,901 @@
+/*
+ * 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.IO;
+using System.Collections;
+
+using Apache.NMS;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Commands
+{
+    public class StreamMessage : Message, IStreamMessage
+    {
+        private EndianBinaryReader dataIn = null;
+        private EndianBinaryWriter dataOut = null;
+        private MemoryStream byteBuffer = null;
+        private int bytesRemaining = -1;
+
+        public bool ReadBoolean()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.BOOLEAN_TYPE)
+                    {
+                        return this.dataIn.ReadBoolean();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Boolean.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a bool");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Boolean type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public byte ReadByte()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.BYTE_TYPE)
+                    {
+                        return this.dataIn.ReadByte();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Byte.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a byte");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Byte type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public char ReadChar()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.CHAR_TYPE)
+                    {
+                        return this.dataIn.ReadChar();
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a char");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Char type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public short ReadInt16()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.SHORT_TYPE)
+                    {
+                        return this.dataIn.ReadInt16();
+                    }
+                    else if(type == PrimitiveMap.BYTE_TYPE)
+                    {
+                        return this.dataIn.ReadByte();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Int16.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a short");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Int16 type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public int ReadInt32()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.INTEGER_TYPE)
+                    {
+                        return this.dataIn.ReadInt32();
+                    }
+                    else if(type == PrimitiveMap.SHORT_TYPE)
+                    {
+                        return this.dataIn.ReadInt16();
+                    }
+                    else if(type == PrimitiveMap.BYTE_TYPE)
+                    {
+                        return this.dataIn.ReadByte();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Int32.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a int");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Int32 type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public long ReadInt64()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.LONG_TYPE)
+                    {
+                        return this.dataIn.ReadInt64();
+                    }
+                    else if(type == PrimitiveMap.INTEGER_TYPE)
+                    {
+                        return this.dataIn.ReadInt32();
+                    }
+                    else if(type == PrimitiveMap.SHORT_TYPE)
+                    {
+                        return this.dataIn.ReadInt16();
+                    }
+                    else if(type == PrimitiveMap.BYTE_TYPE)
+                    {
+                        return this.dataIn.ReadByte();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Int64.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a long");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Int64 type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public float ReadSingle()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.FLOAT_TYPE)
+                    {
+                        return this.dataIn.ReadSingle();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Single.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a float");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Single type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public double ReadDouble()
+        {
+            InitializeReading();
+
+            try
+            {
+                long startingPos = this.byteBuffer.Position;
+                try
+                {
+                    int type = this.dataIn.ReadByte();
+
+                    if(type == PrimitiveMap.DOUBLE_TYPE)
+                    {
+                        return this.dataIn.ReadDouble();
+                    }
+                    else if(type == PrimitiveMap.FLOAT_TYPE)
+                    {
+                        return this.dataIn.ReadSingle();
+                    }
+                    else if(type == PrimitiveMap.STRING_TYPE)
+                    {
+                        return Single.Parse(this.dataIn.ReadString16());
+                    }
+                    else if(type == PrimitiveMap.NULL)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new NMSException("Cannot convert Null type to a double");
+                    }
+                    else
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Value is not a Double type.");
+                    }
+                }
+                catch(FormatException e)
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw NMSExceptionSupport.CreateMessageFormatException(e);
+                }
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public string ReadString()
+        {
+            InitializeReading();
+
+            long startingPos = this.byteBuffer.Position;
+
+            try
+            {
+                int type = this.dataIn.ReadByte();
+
+                if(type == PrimitiveMap.BIG_STRING_TYPE)
+                {
+                    return this.dataIn.ReadString32();
+                }
+                else if(type == PrimitiveMap.STRING_TYPE)
+                {
+                    return this.dataIn.ReadString16();
+                }
+                else if(type == PrimitiveMap.LONG_TYPE)
+                {
+                    return this.dataIn.ReadInt64().ToString();
+                }
+                else if(type == PrimitiveMap.INTEGER_TYPE)
+                {
+                    return this.dataIn.ReadInt32().ToString();
+                }
+                else if(type == PrimitiveMap.SHORT_TYPE)
+                {
+                    return this.dataIn.ReadInt16().ToString();
+                }
+                else if(type == PrimitiveMap.FLOAT_TYPE)
+                {
+                    return this.dataIn.ReadSingle().ToString();
+                }
+                else if(type == PrimitiveMap.DOUBLE_TYPE)
+                {
+                    return this.dataIn.ReadDouble().ToString();
+                }
+                else if(type == PrimitiveMap.CHAR_TYPE)
+                {
+                    return this.dataIn.ReadChar().ToString();
+                }
+                else if(type == PrimitiveMap.BYTE_TYPE)
+                {
+                    return this.dataIn.ReadByte().ToString();
+                }
+                else if(type == PrimitiveMap.BOOLEAN_TYPE)
+                {
+                    return this.dataIn.ReadBoolean().ToString();
+                }
+                else if(type == PrimitiveMap.NULL)
+                {
+                    return null;
+                }
+                else
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw new MessageFormatException("Value is not a known type.");
+                }
+            }
+            catch(FormatException e)
+            {
+                this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public int ReadBytes(byte[] value)
+        {
+            InitializeReading();
+
+            if(value == null)
+            {
+                throw new NullReferenceException("Passed Byte Array is null");
+            }
+
+            try
+            {
+                if(this.bytesRemaining == -1)
+                {
+                    long startingPos = this.byteBuffer.Position;
+                    byte type = this.dataIn.ReadByte();
+
+                    if(type != PrimitiveMap.BYTE_ARRAY_TYPE)
+                    {
+                        this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                        throw new MessageFormatException("Not a byte array");
+                    }
+
+                    this.bytesRemaining = this.dataIn.ReadInt32();
+                }
+                else if(this.bytesRemaining == 0)
+                {
+                    this.bytesRemaining = -1;
+                    return -1;
+                }
+
+                if(value.Length <= this.bytesRemaining)
+                {
+                    // small buffer
+                    this.bytesRemaining -= value.Length;
+                    this.dataIn.Read(value, 0, value.Length);
+                    return value.Length;
+                }
+                else
+                {
+                    // big buffer
+                    int rc = this.dataIn.Read(value, 0, this.bytesRemaining);
+                    this.bytesRemaining = 0;
+                    return rc;
+                }
+            }
+            catch(EndOfStreamException ex)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(ex);
+            }
+            catch(IOException ex)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(ex);
+            }
+        }
+
+        public Object ReadObject()
+        {
+            InitializeReading();
+
+            long startingPos = this.byteBuffer.Position;
+
+            try
+            {
+                int type = this.dataIn.ReadByte();
+
+                if(type == PrimitiveMap.BIG_STRING_TYPE)
+                {
+                    return this.dataIn.ReadString32();
+                }
+                else if(type == PrimitiveMap.STRING_TYPE)
+                {
+                    return this.dataIn.ReadString16();
+                }
+                else if(type == PrimitiveMap.LONG_TYPE)
+                {
+                    return this.dataIn.ReadInt64();
+                }
+                else if(type == PrimitiveMap.INTEGER_TYPE)
+                {
+                    return this.dataIn.ReadInt32();
+                }
+                else if(type == PrimitiveMap.SHORT_TYPE)
+                {
+                    return this.dataIn.ReadInt16();
+                }
+                else if(type == PrimitiveMap.FLOAT_TYPE)
+                {
+                    return this.dataIn.ReadSingle();
+                }
+                else if(type == PrimitiveMap.DOUBLE_TYPE)
+                {
+                    return this.dataIn.ReadDouble();
+                }
+                else if(type == PrimitiveMap.CHAR_TYPE)
+                {
+                    return this.dataIn.ReadChar();
+                }
+                else if(type == PrimitiveMap.BYTE_TYPE)
+                {
+                    return this.dataIn.ReadByte();
+                }
+                else if(type == PrimitiveMap.BOOLEAN_TYPE)
+                {
+                    return this.dataIn.ReadBoolean();
+                }
+                else if(type == PrimitiveMap.BYTE_ARRAY_TYPE)
+                {
+                    int length = this.dataIn.ReadInt32();
+                    byte[] data = new byte[length];
+                    this.dataIn.Read(data, 0, length);
+                    return data;
+                }
+                else if(type == PrimitiveMap.NULL)
+                {
+                    return null;
+                }
+                else
+                {
+                    this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                    throw new MessageFormatException("Value is not a known type.");
+                }
+            }
+            catch(FormatException e)
+            {
+                this.byteBuffer.Seek(startingPos, SeekOrigin.Begin);
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+            catch(EndOfStreamException e)
+            {
+                throw NMSExceptionSupport.CreateMessageEOFException(e);
+            }
+            catch(IOException e)
+            {
+                throw NMSExceptionSupport.CreateMessageFormatException(e);
+            }
+        }
+
+        public void WriteBoolean(bool value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.BOOLEAN_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteByte(byte value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.BYTE_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteBytes(byte[] value)
+        {
+            InitializeWriting();
+            this.WriteBytes(value, 0, value.Length);
+        }
+
+        public void WriteBytes(byte[] value, int offset, int length)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.BYTE_ARRAY_TYPE);
+                this.dataOut.Write((int) length);
+                this.dataOut.Write(value, offset, length);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteChar(char value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.CHAR_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteInt16(short value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.SHORT_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteInt32(int value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.INTEGER_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteInt64(long value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.LONG_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteSingle(float value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.FLOAT_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteDouble(double value)
+        {
+            InitializeWriting();
+            try
+            {
+                this.dataOut.Write(PrimitiveMap.DOUBLE_TYPE);
+                this.dataOut.Write(value);
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteString(string value)
+        {
+            InitializeWriting();
+            try
+            {
+                if( value.Length > 8192 )
+                {
+                    this.dataOut.Write(PrimitiveMap.BIG_STRING_TYPE);
+                    this.dataOut.WriteString32(value);
+                }
+                else
+                {
+                    this.dataOut.Write(PrimitiveMap.STRING_TYPE);
+                    this.dataOut.WriteString16(value);
+                }
+            }
+            catch(IOException e)
+            {
+                NMSExceptionSupport.Create(e);
+            }
+        }
+
+        public void WriteObject(Object value)
+        {
+            InitializeWriting();
+            if( value is System.Byte )
+            {
+                this.WriteByte( (byte) value );
+            }
+            else if( value is Char )
+            {
+                this.WriteChar( (char) value );
+            }
+            else if( value is Boolean )
+            {
+                this.WriteBoolean( (bool) value );
+            }
+            else if( value is Int16 )
+            {
+                this.WriteInt16( (short) value );
+            }
+            else if( value is Int32 )
+            {
+                this.WriteInt32( (int) value );
+            }
+            else if( value is Int64 )
+            {
+                this.WriteInt64( (long) value );
+            }
+            else if( value is Single )
+            {
+                this.WriteSingle( (float) value );
+            }
+            else if( value is Double )
+            {
+                this.WriteDouble( (double) value );
+            }
+            else if( value is byte[] )
+            {
+                this.WriteBytes( (byte[]) value );
+            }
+            else if( value is String )
+            {
+                this.WriteString( (string) value );
+            }
+            else
+            {
+                throw new MessageFormatException("Cannot write non-primitive type:" + value.GetType());
+            }
+        }
+
+        public override Object Clone()
+        {
+            StoreContent();
+            return base.Clone();
+        }
+
+        public override void ClearBody()
+        {
+            base.ClearBody();
+            this.byteBuffer = null;
+            this.dataIn = null;
+            this.dataOut = null;
+            this.bytesRemaining = -1;
+        }
+
+        public void Reset()
+        {
+            StoreContent();
+            this.dataIn = null;
+            this.dataOut = null;
+            this.byteBuffer = null;
+            this.bytesRemaining = -1;
+            this.ReadOnlyBody = true;
+        }
+
+        private void InitializeReading()
+        {
+            FailIfWriteOnlyBody();
+            if(this.dataIn == null)
+            {
+                this.byteBuffer = new MemoryStream(this.Content, false);
+                this.dataIn = new EndianBinaryReader(this.byteBuffer);
+            }
+        }
+
+        private void InitializeWriting()
+        {
+            FailIfReadOnlyBody();
+            if(this.dataOut == null)
+            {
+                this.byteBuffer = new MemoryStream();
+                this.dataOut = new EndianBinaryWriter(this.byteBuffer);
+            }
+        }
+
+        private void StoreContent()
+        {
+            if( dataOut != null)
+            {
+                dataOut.Close();
+
+                this.Content = byteBuffer.ToArray();
+                this.dataOut = null;
+                this.byteBuffer = null;
+            }
+        }
+
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/TempDestination.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/TempDestination.cs b/src/test/csharp/Commands/TempDestination.cs
new file mode 100644
index 0000000..6e2e63f
--- /dev/null
+++ b/src/test/csharp/Commands/TempDestination.cs
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Commands
+{
+    public abstract class TempDestination : Destination
+    {
+        /// <summary>
+        /// Method CreateDestination
+        /// </summary>
+        /// <returns>An Destination</returns>
+        /// <param name="name">A  String</param>
+        public override Destination CreateDestination(String name)
+        {
+            return null;
+        }
+
+        abstract override public DestinationType DestinationType
+        {
+            get;
+        }
+
+        public TempDestination()
+            : base()
+        {
+        }
+
+        public TempDestination(String name)
+            : base(name)
+        {
+        }
+
+        public override Object Clone()
+        {
+            // Since we are a derived class use the base's Clone()
+            // to perform the shallow copy. Since it is shallow it
+            // will include our derived class. Since we are derived,
+            // this method is an override.
+            TempDestination o = (TempDestination) base.Clone();
+
+            // Now do the deep work required
+            // If any new variables are added then this routine will
+            // likely need updating
+
+            return o;
+        }
+
+        public void Delete()
+        {
+            throw new NotSupportedException("Stomp Cannot Delete Temporary Destinations");
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/TempQueue.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/TempQueue.cs b/src/test/csharp/Commands/TempQueue.cs
new file mode 100644
index 0000000..0f39e5e
--- /dev/null
+++ b/src/test/csharp/Commands/TempQueue.cs
@@ -0,0 +1,81 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Commands
+{
+    /// <summary>
+    /// A Temporary Queue
+    /// </summary>
+    public class TempQueue : TempDestination, ITemporaryQueue
+    {
+        public TempQueue()
+            : base()
+        {
+        }
+
+        public TempQueue(String name)
+            : base(name)
+        {
+        }
+
+        override public DestinationType DestinationType
+        {
+            get
+            {
+                return DestinationType.TemporaryQueue;
+            }
+        }
+
+        public String QueueName
+        {
+            get { return PhysicalName; }
+        }
+
+        public String GetQueueName()
+        {
+            return PhysicalName;
+        }
+
+        public override int GetDestinationType()
+        {
+            return TEMPORARY_QUEUE;
+        }
+
+        public override Destination CreateDestination(String name)
+        {
+            return new TempQueue(name);
+        }
+
+        public override Object Clone()
+        {
+            // Since we are a derived class use the base's Clone()
+            // to perform the shallow copy. Since it is shallow it
+            // will include our derived class. Since we are derived,
+            // this method is an override.
+            TempQueue o = (TempQueue) base.Clone();
+
+            // Now do the deep work required
+            // If any new variables are added then this routine will
+            // likely need updating
+
+            return o;
+        }
+
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/TempTopic.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/TempTopic.cs b/src/test/csharp/Commands/TempTopic.cs
new file mode 100644
index 0000000..3a42a55
--- /dev/null
+++ b/src/test/csharp/Commands/TempTopic.cs
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Commands
+{
+
+    /// <summary>
+    /// A Temporary Topic
+    /// </summary>
+    public class TempTopic : TempDestination, ITemporaryTopic
+    {
+        public TempTopic() : base()
+        {
+        }
+
+        public TempTopic(String name) : base(name)
+        {
+        }
+
+        override public DestinationType DestinationType
+        {
+            get { return DestinationType.TemporaryTopic; }
+        }
+
+        public String TopicName
+        {
+            get { return PhysicalName; }
+        }
+
+        public String GetTopicName()
+        {
+            return PhysicalName;
+        }
+
+        public override int GetDestinationType()
+        {
+            return TEMPORARY_TOPIC;
+        }
+
+        public override Destination CreateDestination(String name)
+        {
+            return new TempTopic(name);
+        }
+
+        public override Object Clone()
+        {
+            // Since we are a derived class use the base's Clone()
+            // to perform the shallow copy. Since it is shallow it
+            // will include our derived class. Since we are derived,
+            // this method is an override.
+            TempTopic o = (TempTopic) base.Clone();
+
+            // Now do the deep work required
+            // If any new variables are added then this routine will
+            // likely need updating
+
+            return o;
+        }
+
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/TextMessage.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/TextMessage.cs b/src/test/csharp/Commands/TextMessage.cs
new file mode 100644
index 0000000..40eac3b
--- /dev/null
+++ b/src/test/csharp/Commands/TextMessage.cs
@@ -0,0 +1,70 @@
+/*
+ * 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.IO;
+
+using Apache.NMS;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Commands
+{
+    public class TextMessage : Message, ITextMessage
+    {
+        private String text = null;
+
+        public TextMessage()
+        {
+        }
+
+        public TextMessage(String text)
+        {
+            this.Text = text;
+        }
+
+        public override string ToString()
+        {
+            string text = this.Text;
+
+            if(text != null && text.Length > 63)
+            {
+                text = text.Substring(0, 45) + "..." + text.Substring(text.Length - 12);
+            }
+            return base.ToString() + " Text = " + (text ?? "null");
+        }
+
+        public override void ClearBody()
+        {
+            base.ClearBody();
+            this.text = null;
+        }
+
+        // Properties
+
+        public string Text
+        {
+            get { return this.text; }
+            set
+            {
+                FailIfReadOnlyBody();
+                this.text = value;
+                this.Content = null;
+            }
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/Commands/Topic.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/Commands/Topic.cs b/src/test/csharp/Commands/Topic.cs
new file mode 100644
index 0000000..adb7c11
--- /dev/null
+++ b/src/test/csharp/Commands/Topic.cs
@@ -0,0 +1,74 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Commands
+{
+
+    /// <summary>
+    /// Summary description for Topic.
+    /// </summary>
+    public class Topic : Destination, ITopic
+    {
+        public Topic() : base()
+        {
+        }
+
+        public Topic(String name) : base(name)
+        {
+        }
+
+        override public DestinationType DestinationType
+        {
+            get
+            {
+                return DestinationType.Topic;
+            }
+        }
+
+        public String TopicName
+        {
+            get { return PhysicalName; }
+        }
+
+        public override int GetDestinationType()
+        {
+            return TOPIC;
+        }
+
+        public override Destination CreateDestination(String name)
+        {
+            return new Topic(name);
+        }
+
+        public override Object Clone()
+        {
+            // Since we are a derived class use the base's Clone()
+            // to perform the shallow copy. Since it is shallow it
+            // will include our derived class. Since we are derived,
+            // this method is an override.
+            Topic o = (Topic) base.Clone();
+
+            // Now do the deep work required
+            // If any new variables are added then this routine will
+            // likely need updating
+
+            return o;
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/ConnectionTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/ConnectionTest.cs b/src/test/csharp/ConnectionTest.cs
new file mode 100644
index 0000000..22cdf08
--- /dev/null
+++ b/src/test/csharp/ConnectionTest.cs
@@ -0,0 +1,191 @@
+/*
+ * 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 NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class ConnectionTest : NMSTest
+	{
+		IConnection startedConnection = null;
+		IConnection stoppedConnection = null;
+
+		protected ConnectionTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+
+			startedConnection = CreateConnection(null);
+			startedConnection.Start();
+			stoppedConnection = CreateConnection(null);
+		}
+
+		//[TearDown]
+		public override void TearDown()
+		{
+			startedConnection.Close();
+			stoppedConnection.Close();
+
+			base.TearDown();
+		}
+
+		/// <summary>
+		/// Verify that it is possible to create multiple connections to the broker.
+		/// There was a bug in the connection factory which set the clientId member which made
+		/// it impossible to create an additional connection.
+		/// </summary>
+		//[Test]
+		public virtual void TestTwoConnections()
+		{
+			using(IConnection connection1 = CreateConnection(null))
+			{
+				connection1.Start();
+				using(IConnection connection2 = CreateConnection(null))
+				{
+					// with the bug present we'll get an exception in connection2.start()
+					connection2.Start();
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestCreateAndDisposeWithConsumer(
+			//[Values(true, false)]
+			bool disposeConsumer, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection("DisposalTestConnection"))
+			{
+				connection.Start();
+
+				using(ISession session = connection.CreateSession())
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					IMessageConsumer consumer = session.CreateConsumer(destination);
+
+					connection.Stop();
+					if(disposeConsumer)
+					{
+						consumer.Dispose();
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestCreateAndDisposeWithProducer(
+			//[Values(true, false)]
+			bool disposeProducer, string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection("DisposalTestConnection"))
+			{
+				connection.Start();
+
+				using(ISession session = connection.CreateSession())
+				{
+					IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+					IMessageProducer producer = session.CreateProducer(destination);
+
+					connection.Stop();
+					if(disposeProducer)
+					{
+						producer.Dispose();
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestStartAfterSend(
+			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			//[Values(DestinationType.Queue, DestinationType.Topic)]
+			DestinationType destinationType, string testDestinationRef)
+		{
+			using(IConnection connection = CreateConnection(GetTestClientId()))
+			{
+				ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+				IDestination destination = GetClearDestination(session, destinationType, testDestinationRef);
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+
+				// Send the messages
+				SendMessages(session, destination, deliveryMode, 1);
+
+				// Start the conncection after the message was sent.
+				connection.Start();
+
+				// Make sure only 1 message was delivered.
+				Assert.IsNotNull(consumer.Receive(TimeSpan.FromMilliseconds(1000)));
+				Assert.IsNull(consumer.ReceiveNoWait());
+			}
+		}
+
+		/// <summary>
+		/// Tests if the consumer receives the messages that were sent before the
+		/// connection was started.
+		/// </summary>
+		//[Test]
+		public virtual void TestStoppedConsumerHoldsMessagesTillStarted(string testTopicRef)
+		{
+			ISession startedSession = startedConnection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+			ISession stoppedSession = stoppedConnection.CreateSession(AcknowledgementMode.AutoAcknowledge);
+
+			// Setup the consumers.
+			IDestination topic = GetClearDestination(startedSession, DestinationType.Topic, testTopicRef);
+			IMessageConsumer startedConsumer = startedSession.CreateConsumer(topic);
+			IMessageConsumer stoppedConsumer = stoppedSession.CreateConsumer(topic);
+
+			// Send the message.
+			IMessageProducer producer = startedSession.CreateProducer(topic);
+			ITextMessage message = startedSession.CreateTextMessage("Hello");
+			producer.Send(message);
+
+			// Test the assertions.
+			IMessage m = startedConsumer.Receive(TimeSpan.FromMilliseconds(1000));
+			Assert.IsNotNull(m);
+
+			m = stoppedConsumer.Receive(TimeSpan.FromMilliseconds(1000));
+			Assert.IsNull(m);
+
+			stoppedConnection.Start();
+			m = stoppedConsumer.Receive(TimeSpan.FromMilliseconds(5000));
+			Assert.IsNotNull(m);
+
+			startedSession.Close();
+			stoppedSession.Close();
+		}
+
+		/// <summary>
+		/// Tests if the consumer is able to receive messages eveb when the
+		/// connecction restarts multiple times.
+		/// </summary>
+		//[Test]
+		public virtual void TestMultipleConnectionStops(string testTopicRef)
+		{
+			TestStoppedConsumerHoldsMessagesTillStarted(testTopicRef);
+			stoppedConnection.Stop();
+			TestStoppedConsumerHoldsMessagesTillStarted(testTopicRef);
+			stoppedConnection.Stop();
+			TestStoppedConsumerHoldsMessagesTillStarted(testTopicRef);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/ConsumerTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/ConsumerTest.cs b/src/test/csharp/ConsumerTest.cs
new file mode 100644
index 0000000..a3aec2e
--- /dev/null
+++ b/src/test/csharp/ConsumerTest.cs
@@ -0,0 +1,573 @@
+/*
+ * 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.Threading;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class ConsumerTest : NMSTest
+	{
+		protected const int COUNT = 25;
+		protected const string VALUE_NAME = "value";
+
+		private bool dontAck;
+
+		protected ConsumerTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+// The .NET CF does not have the ability to interrupt threads, so this test is impossible.
+#if !NETCF
+		//[Test]
+		public virtual void TestNoTimeoutConsumer(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			// Launch a thread to perform IMessageConsumer.Receive().
+			// If it doesn't fail in less than three seconds, no exception was thrown.
+			Thread receiveThread = new Thread(new ThreadStart(TimeoutConsumerThreadProc));
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					ITemporaryQueue queue = session.CreateTemporaryQueue();
+					using(this.timeoutConsumer = session.CreateConsumer(queue))
+					{
+						receiveThread.Start();
+						if(receiveThread.Join(3000))
+						{
+							Assert.Fail("IMessageConsumer.Receive() returned without blocking.  Test failed.");
+						}
+						else
+						{
+							// Kill the thread - otherwise it'll sit in Receive() until a message arrives.
+							receiveThread.Interrupt();
+						}
+					}
+				}
+			}
+		}
+
+		protected IMessageConsumer timeoutConsumer;
+
+		protected void TimeoutConsumerThreadProc()
+		{
+			try
+			{
+				timeoutConsumer.Receive();
+			}
+			catch(ArgumentOutOfRangeException e)
+			{
+				// The test failed.  We will know because the timeout will expire inside TestNoTimeoutConsumer().
+				Assert.Fail("Test failed with exception: " + e.Message);
+			}
+			catch(ThreadInterruptedException)
+			{
+				// The test succeeded!  We were still blocked when we were interrupted.
+			}
+			catch(Exception e)
+			{
+				// Some other exception occurred.
+				Assert.Fail("Test failed with exception: " + e.Message);
+			}
+		}
+
+		//[Test]
+		public virtual void TestSyncReceiveConsumerClose(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			// Launch a thread to perform IMessageConsumer.Receive().
+			// If it doesn't fail in less than three seconds, no exception was thrown.
+			Thread receiveThread = new Thread(new ThreadStart(TimeoutConsumerThreadProc));
+			using (IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using (ISession session = connection.CreateSession(ackMode))
+				{
+					ITemporaryQueue queue = session.CreateTemporaryQueue();
+					using (this.timeoutConsumer = session.CreateConsumer(queue))
+					{
+						receiveThread.Start();
+						if (receiveThread.Join(3000))
+						{
+							Assert.Fail("IMessageConsumer.Receive() returned without blocking.  Test failed.");
+						}
+						else
+						{
+							// Kill the thread - otherwise it'll sit in Receive() until a message arrives.
+							this.timeoutConsumer.Close();
+							receiveThread.Join(10000);
+							if (receiveThread.IsAlive)
+							{
+								// Kill the thread - otherwise it'll sit in Receive() until a message arrives.
+								receiveThread.Interrupt();
+								Assert.Fail("IMessageConsumer.Receive() thread is still alive, Close should have killed it.");
+							}
+						}
+					}
+				}
+			}
+		}
+
+		internal class ThreadArg
+		{
+			internal IConnection connection = null;
+			internal ISession session = null;
+			internal IDestination destination = null;
+		}
+
+		protected void DelayedProducerThreadProc(Object arg)
+		{
+			try
+			{
+				ThreadArg args = arg as ThreadArg;
+
+				using(ISession session = args.connection.CreateSession())
+				{
+					using(IMessageProducer producer = session.CreateProducer(args.destination))
+					{
+						// Give the consumer time to enter the receive.
+						Thread.Sleep(5000);
+
+						producer.Send(args.session.CreateTextMessage("Hello World"));
+					}
+				}
+			}
+			catch(Exception e)
+			{
+				// Some other exception occurred.
+				Assert.Fail("Test failed with exception: " + e.Message);
+			}
+		}
+
+		//[Test]
+		public virtual void TestDoChangeSentMessage(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode,
+			//[Values(true, false)]
+			bool doClear)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					ITemporaryQueue queue = session.CreateTemporaryQueue();
+					using(IMessageConsumer consumer = session.CreateConsumer(queue))
+					{
+						IMessageProducer producer = session.CreateProducer(queue);
+						ITextMessage message = session.CreateTextMessage();
+
+						string prefix = "ConsumerTest - TestDoChangeSentMessage: ";
+
+						for(int i = 0; i < COUNT; i++)
+						{
+							message.Properties[VALUE_NAME] = i;
+							message.Text = prefix + Convert.ToString(i);
+
+							producer.Send(message);
+
+							if(doClear)
+							{
+								message.ClearBody();
+								message.ClearProperties();
+							}
+						}
+
+						if(ackMode == AcknowledgementMode.Transactional)
+						{
+							session.Commit();
+						}
+
+						for(int i = 0; i < COUNT; i++)
+						{
+							ITextMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(2000)) as ITextMessage;
+							Assert.AreEqual(msg.Text, prefix + Convert.ToString(i));
+							Assert.AreEqual(msg.Properties.GetInt(VALUE_NAME), i);
+						}
+
+						if(ackMode == AcknowledgementMode.Transactional)
+						{
+							session.Commit();
+						}
+
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestConsumerReceiveBeforeMessageDispatched(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode)
+		{
+			// Launch a thread to perform a delayed send.
+			Thread sendThread = new Thread(DelayedProducerThreadProc);
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					ITemporaryQueue queue = session.CreateTemporaryQueue();
+					using(IMessageConsumer consumer = session.CreateConsumer(queue))
+					{
+						ThreadArg arg = new ThreadArg();
+
+						arg.connection = connection;
+						arg.session = session;
+						arg.destination = queue;
+
+						sendThread.Start(arg);
+						IMessage message = consumer.Receive(TimeSpan.FromMinutes(1));
+						Assert.IsNotNull(message);
+					}
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestDontStart(
+			//[Values(MsgDeliveryMode.NonPersistent)]
+			MsgDeliveryMode deliveryMode,
+			//[Values(DestinationType.Queue, DestinationType.Topic)]
+			DestinationType destinationType, string testDestinationRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				ISession session = connection.CreateSession();
+				IDestination destination = GetClearDestination(session, destinationType, testDestinationRef);
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+
+				// Send the messages
+				SendMessages(session, destination, deliveryMode, 1);
+
+				// Make sure no messages were delivered.
+				Assert.IsNull(consumer.Receive(TimeSpan.FromMilliseconds(1000)));
+			}
+		}
+
+		//[Test]
+		public void TestSendReceiveTransacted(
+			//[Values(MsgDeliveryMode.NonPersistent, MsgDeliveryMode.Persistent)]
+			MsgDeliveryMode deliveryMode,
+			//[Values(DestinationType.Queue, DestinationType.Topic, DestinationType.TemporaryQueue, DestinationType.TemporaryTopic)]
+			DestinationType destinationType, string testDestinationRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				// Send a message to the broker.
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.Transactional);
+				IDestination destination = GetClearDestination(session, destinationType, testDestinationRef);
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				IMessageProducer producer = session.CreateProducer(destination);
+
+				producer.DeliveryMode = deliveryMode;
+				producer.Send(session.CreateTextMessage("Test"));
+
+				// Message should not be delivered until commit.
+				Thread.Sleep(1000);
+				Assert.IsNull(consumer.ReceiveNoWait());
+				session.Commit();
+
+				// Make sure only 1 message was delivered.
+				IMessage message = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(message);
+				Assert.IsFalse(message.NMSRedelivered);
+				Assert.IsNull(consumer.ReceiveNoWait());
+
+				// Message should be redelivered is rollback is used.
+				session.Rollback();
+
+				// Make sure only 1 message was delivered.
+				message = consumer.Receive(TimeSpan.FromMilliseconds(2000));
+				Assert.IsNotNull(message);
+				Assert.IsTrue(message.NMSRedelivered);
+				Assert.IsNull(consumer.ReceiveNoWait());
+
+				// If we commit now, the message should not be redelivered.
+				session.Commit();
+				Thread.Sleep(1000);
+				Assert.IsNull(consumer.ReceiveNoWait());
+			}
+		}
+
+		//[Test]
+		public virtual void TestAckedMessageAreConsumed(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+				IMessageProducer producer = session.CreateProducer(destination);
+				producer.Send(session.CreateTextMessage("Hello"));
+
+				// Consume the message...
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(msg);
+				msg.Acknowledge();
+
+				// Reset the session.
+				session.Close();
+				session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+
+				// Attempt to Consume the message...
+				consumer = session.CreateConsumer(destination);
+				msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNull(msg);
+
+				session.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestLastMessageAcked(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+				IMessageProducer producer = session.CreateProducer(destination);
+				producer.Send(session.CreateTextMessage("Hello"));
+				producer.Send(session.CreateTextMessage("Hello2"));
+				producer.Send(session.CreateTextMessage("Hello3"));
+
+				// Consume the message...
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(msg);
+				msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(msg);
+				msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(msg);
+				msg.Acknowledge();
+
+				// Reset the session.
+				session.Close();
+				session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+
+				// Attempt to Consume the message...
+				consumer = session.CreateConsumer(destination);
+				msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNull(msg);
+
+				session.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestUnAckedMessageAreNotConsumedOnSessionClose(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+				IMessageProducer producer = session.CreateProducer(destination);
+				producer.Send(session.CreateTextMessage("Hello"));
+
+				// Consume the message...
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNotNull(msg);
+				// Don't ack the message.
+
+				// Reset the session.  This should cause the unacknowledged message to be re-delivered.
+				session.Close();
+				session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+
+				// Attempt to Consume the message...
+				consumer = session.CreateConsumer(destination);
+				msg = consumer.Receive(TimeSpan.FromMilliseconds(2000));
+				Assert.IsNotNull(msg);
+				msg.Acknowledge();
+
+				session.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestAsyncAckedMessageAreConsumed(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+				IMessageProducer producer = session.CreateProducer(destination);
+				producer.Send(session.CreateTextMessage("Hello"));
+
+				// Consume the message...
+				IMessageConsumer consumer = session.CreateConsumer(destination);
+				consumer.Listener += new MessageListener(OnMessage);
+
+				Thread.Sleep(5000);
+
+				// Reset the session.
+				session.Close();
+
+				session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+
+				// Attempt to Consume the message...
+				consumer = session.CreateConsumer(destination);
+				IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));
+				Assert.IsNull(msg);
+
+				session.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestAsyncUnAckedMessageAreNotConsumedOnSessionClose(string testQueueRef)
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				// don't aknowledge message on onMessage() call
+				dontAck = true;
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				IDestination destination = GetClearDestination(session, DestinationType.Queue, testQueueRef);
+				IMessageProducer producer = session.CreateProducer(destination);
+				producer.Send(session.CreateTextMessage("Hello"));
+
+				// Consume the message...
+				using(IMessageConsumer consumer = session.CreateConsumer(destination))
+				{
+					consumer.Listener += new MessageListener(OnMessage);
+					// Don't ack the message.
+				}
+
+				// Reset the session. This should cause the Unacked message to be
+				// redelivered.
+				session.Close();
+
+				Thread.Sleep(5000);
+				session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				// Attempt to Consume the message...
+				using(IMessageConsumer consumer = session.CreateConsumer(destination))
+				{
+					IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(2000));
+					Assert.IsNotNull(msg);
+					msg.Acknowledge();
+				}
+
+				session.Close();
+			}
+		}
+
+		//[Test]
+		public virtual void TestAddRemoveAsnycMessageListener()
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+
+				ISession session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
+				ITemporaryTopic topic = session.CreateTemporaryTopic();
+				IMessageConsumer consumer = session.CreateConsumer(topic);
+
+				consumer.Listener += OnMessage;
+				consumer.Listener -= OnMessage;
+				consumer.Listener += OnMessage;
+
+				consumer.Close();
+			}
+		}
+
+		public void OnMessage(IMessage message)
+		{
+			Assert.IsNotNull(message);
+
+			if(!dontAck)
+			{
+				try
+				{
+					message.Acknowledge();
+				}
+				catch(Exception)
+				{
+				}
+			}
+		}
+
+		//[Test]
+		public virtual void TestReceiveNoWait(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode,
+			//[Values(MsgDeliveryMode.NonPersistent, MsgDeliveryMode.Persistent)]
+			MsgDeliveryMode deliveryMode)
+		{
+			const int RETRIES = 20;
+
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					IDestination destination = session.CreateTemporaryQueue();
+
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						producer.DeliveryMode = deliveryMode;
+						ITextMessage message = session.CreateTextMessage("TEST");
+						producer.Send(message);
+
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+					}
+
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					{
+						IMessage message = null;
+
+						for(int i = 0; i < RETRIES && message == null; ++i)
+						{
+							message = consumer.ReceiveNoWait();
+							Thread.Sleep(100);
+						}
+
+						Assert.IsNotNull(message);
+						message.Acknowledge();
+
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+					}
+				}
+			}
+		}
+
+#endif
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/DurableTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/DurableTest.cs b/src/test/csharp/DurableTest.cs
new file mode 100644
index 0000000..819f10c
--- /dev/null
+++ b/src/test/csharp/DurableTest.cs
@@ -0,0 +1,267 @@
+/*
+ * 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.Threading;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	//[TestFixture]
+	public class DurableTest : NMSTest
+	{
+		protected static string DURABLE_SELECTOR = "2 > 1";
+
+		protected string TEST_CLIENT_AND_CONSUMER_ID;
+		protected string SEND_CLIENT_ID;
+
+		protected DurableTest(NMSTestSupport testSupport)
+			: base(testSupport)
+		{
+		}
+
+		//[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+			
+			TEST_CLIENT_AND_CONSUMER_ID = GetTestClientId();
+			SEND_CLIENT_ID = GetTestClientId();
+		}
+
+		//[Test]
+		public virtual void TestSendWhileClosed(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode, string testTopicRef)
+		{
+			try
+			{				
+		        using(IConnection connection = CreateConnection(TEST_CLIENT_AND_CONSUMER_ID))
+				{
+			        connection.Start();
+
+					using(ISession session = connection.CreateSession(ackMode))
+					{
+						ITopic topic = (ITopic)GetClearDestination(session, DestinationType.Topic, testTopicRef);
+						IMessageProducer producer = session.CreateProducer(topic);
+
+						producer.DeliveryMode = MsgDeliveryMode.Persistent;
+										
+				        ISession consumeSession = connection.CreateSession(ackMode);
+				        IMessageConsumer consumer = consumeSession.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, null, false);
+				        Thread.Sleep(1000);
+				        consumer.Dispose();
+						consumer = null;
+				        
+						ITextMessage message = session.CreateTextMessage("DurableTest-TestSendWhileClosed");
+				        message.Properties.SetString("test", "test");
+				        message.NMSType = "test";
+				        producer.Send(message);
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+										        
+				        Thread.Sleep(1000);
+						consumer = consumeSession.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, null, false);
+				        ITextMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
+						msg.Acknowledge();
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							consumeSession.Commit();
+						}
+						
+						Assert.IsNotNull(msg);
+				        Assert.AreEqual(msg.Text, "DurableTest-TestSendWhileClosed");
+				        Assert.AreEqual(msg.NMSType, "test");
+				        Assert.AreEqual(msg.Properties.GetString("test"), "test");
+					}
+				}
+			}
+			catch(Exception ex)
+			{
+				Assert.Fail(ex.Message);
+			}
+			finally
+			{
+                // Pause to allow Stomp to unregister at the broker.
+                Thread.Sleep(500);
+
+				UnregisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, TEST_CLIENT_AND_CONSUMER_ID);
+			}			
+	    }		
+		
+		//[Test]
+		public void TestDurableConsumerSelectorChange(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode, string testTopicRef)
+		{
+			try
+			{
+				using(IConnection connection = CreateConnection(TEST_CLIENT_AND_CONSUMER_ID))
+				{
+					connection.Start();
+					using(ISession session = connection.CreateSession(ackMode))
+					{
+						ITopic topic = (ITopic)GetClearDestination(session, DestinationType.Topic, testTopicRef);
+						IMessageProducer producer = session.CreateProducer(topic);
+						IMessageConsumer consumer = session.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, "color='red'", false);
+
+						producer.DeliveryMode = MsgDeliveryMode.Persistent;
+
+						// Send the messages
+						ITextMessage sendMessage = session.CreateTextMessage("1st");
+						sendMessage.Properties["color"] = "red";
+						producer.Send(sendMessage);
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+
+						ITextMessage receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
+						Assert.IsNotNull(receiveMsg, "Failed to retrieve 1st durable message.");
+						Assert.AreEqual("1st", receiveMsg.Text);
+						Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
+						receiveMsg.Acknowledge();
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+
+						// Change the subscription, allowing some time for the Broker to purge the
+						// consumers resources.
+						consumer.Dispose();
+                        Thread.Sleep(1000);
+						
+						consumer = session.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, "color='blue'", false);
+
+						sendMessage = session.CreateTextMessage("2nd");
+						sendMessage.Properties["color"] = "red";
+						producer.Send(sendMessage);
+						sendMessage = session.CreateTextMessage("3rd");
+						sendMessage.Properties["color"] = "blue";
+						producer.Send(sendMessage);
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+
+						// Selector should skip the 2nd message.
+						receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
+						Assert.IsNotNull(receiveMsg, "Failed to retrieve durable message.");
+						Assert.AreEqual("3rd", receiveMsg.Text, "Retrieved the wrong durable message.");
+						Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
+						receiveMsg.Acknowledge();
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+
+						// Make sure there are no pending messages.
+						Assert.IsNull(consumer.ReceiveNoWait(), "Wrong number of messages in durable subscription.");
+					}
+				}
+			}
+			catch(Exception ex)
+			{
+				Assert.Fail(ex.Message);
+			}
+			finally
+			{
+                // Pause to allow Stomp to unregister at the broker.
+                Thread.Sleep(500);
+
+				UnregisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, TEST_CLIENT_AND_CONSUMER_ID);
+			}
+		}
+
+		//[Test]
+		public void TestDurableConsumer(
+			//[Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
+			//	AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
+			AcknowledgementMode ackMode, string testDurableTopicName)
+		{
+			try
+			{
+				RegisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, testDurableTopicName, TEST_CLIENT_AND_CONSUMER_ID, null, false);
+				RunTestDurableConsumer(testDurableTopicName, ackMode);
+				if(AcknowledgementMode.Transactional == ackMode)
+				{
+					RunTestDurableConsumer(testDurableTopicName, ackMode);
+				}
+			}
+			finally
+			{
+                // Pause to allow Stomp to unregister at the broker.
+                Thread.Sleep(500);
+				
+				UnregisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, TEST_CLIENT_AND_CONSUMER_ID);
+			}
+		}
+
+		protected void RunTestDurableConsumer(string topicName, AcknowledgementMode ackMode)
+		{
+			SendDurableMessage(topicName);
+			SendDurableMessage(topicName);
+
+			using(IConnection connection = CreateConnection(TEST_CLIENT_AND_CONSUMER_ID))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(ackMode))
+				{
+					ITopic topic = SessionUtil.GetTopic(session, topicName);
+					using(IMessageConsumer consumer = session.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, null, false))
+					{
+						IMessage msg = consumer.Receive(receiveTimeout);
+						Assert.IsNotNull(msg, "Did not receive first durable message.");
+						msg.Acknowledge();
+
+						msg = consumer.Receive(receiveTimeout);
+						Assert.IsNotNull(msg, "Did not receive second durable message.");
+						msg.Acknowledge();
+
+						if(AcknowledgementMode.Transactional == ackMode)
+						{
+							session.Commit();
+						}
+					}
+				}
+			}
+		}
+
+		protected void SendDurableMessage(string topicName)
+		{
+			using(IConnection connection = CreateConnection(SEND_CLIENT_ID))
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession())
+				{
+					ITopic topic = SessionUtil.GetTopic(session, topicName);
+					using(IMessageProducer producer = session.CreateProducer(topic))
+					{
+						ITextMessage message = session.CreateTextMessage("Durable Hello");
+
+						producer.DeliveryMode = MsgDeliveryMode.Persistent;
+						producer.Send(message);
+					}
+				}
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/test/csharp/EndianBinaryReaderTest.cs
----------------------------------------------------------------------
diff --git a/src/test/csharp/EndianBinaryReaderTest.cs b/src/test/csharp/EndianBinaryReaderTest.cs
new file mode 100644
index 0000000..dca24d0
--- /dev/null
+++ b/src/test/csharp/EndianBinaryReaderTest.cs
@@ -0,0 +1,162 @@
+\ufeff/*
+ * 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.IO;
+using Apache.NMS.Util;
+using NUnit.Framework;
+
+namespace Apache.NMS.Test
+{
+	[TestFixture]
+	public class EndianBinaryReaderTest
+	{
+		public void readString16Helper(byte[] input, char[] expect)
+		{
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			char[] result = reader.ReadString16().ToCharArray();
+
+			for(int i = 0; i < expect.Length; ++i)
+			{
+				Assert.AreEqual(expect[i], result[i]);
+			}
+		}
+
+		[Test]
+		public void testReadString16_1byteUTF8encoding()
+		{
+			// Test data with 1-byte UTF8 encoding.
+			char[] expect = { '\u0000', '\u000B', '\u0048', '\u0065', '\u006C', '\u006C', '\u006F', '\u0020', '\u0057', '\u006F', '\u0072', '\u006C', '\u0064' };
+			byte[] input = { 0x00, 0x0E, 0xC0, 0x80, 0x0B, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 };
+
+			readString16Helper(input, expect);
+		}
+
+		[Test]
+		public void testReadString16_2byteUTF8encoding()
+		{
+			// Test data with 2-byte UT8 encoding.
+			char[] expect = { '\u0000', '\u00C2', '\u00A9', '\u00C3', '\u00A6' };
+			byte[] input = { 0x00, 0x0A, 0xC0, 0x80, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC2, 0xA6 };
+			readString16Helper(input, expect);
+		}
+
+		[Test]
+		public void testReadString16_1byteAnd2byteEmbeddedNULLs()
+		{
+			// Test data with 1-byte and 2-byte encoding with embedded NULL's.
+			char[] expect = { '\u0000', '\u0004', '\u00C2', '\u00A9', '\u00C3', '\u0000', '\u00A6' };
+			byte[] input = { 0x00, 0x0D, 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			readString16Helper(input, expect);
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testReadString16_UTF8Missing2ndByte()
+		{
+			// Test with bad UTF-8 encoding, missing 2nd byte of two byte value
+			byte[] input = { 0x00, 0x0D, 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xC2, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			reader.ReadString16();
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testReadString16_3byteEncodingMissingLastByte()
+		{
+			// Test with three byte encode that's missing a last byte.
+			byte[] input = { 0x00, 0x02, 0xE8, 0xA8 };
+
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			reader.ReadString16();
+		}
+
+		public void readString32Helper(byte[] input, char[] expect)
+		{
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			char[] result = reader.ReadString32().ToCharArray();
+
+			for(int i = 0; i < expect.Length; ++i)
+			{
+				Assert.AreEqual(expect[i], result[i]);
+			}
+		}
+
+		[Test]
+		public void testReadString32_1byteUTF8encoding()
+		{
+			// Test data with 1-byte UTF8 encoding.
+			char[] expect = { '\u0000', '\u000B', '\u0048', '\u0065', '\u006C', '\u006C', '\u006F', '\u0020', '\u0057', '\u006F', '\u0072', '\u006C', '\u0064' };
+			byte[] input = { 0x00, 0x00, 0x00, 0x0E, 0xC0, 0x80, 0x0B, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 };
+
+			readString32Helper(input, expect);
+		}
+
+		[Test]
+		public void testReadString32_2byteUTF8encoding()
+		{
+			// Test data with 2-byte UT8 encoding.
+			char[] expect = { '\u0000', '\u00C2', '\u00A9', '\u00C3', '\u00A6' };
+			byte[] input = { 0x00, 0x00, 0x00, 0x0A, 0xC0, 0x80, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC2, 0xA6 };
+			readString32Helper(input, expect);
+		}
+
+		[Test]
+		public void testReadString32_1byteAnd2byteEmbeddedNULLs()
+		{
+			// Test data with 1-byte and 2-byte encoding with embedded NULL's.
+			char[] expect = { '\u0000', '\u0004', '\u00C2', '\u00A9', '\u00C3', '\u0000', '\u00A6' };
+			byte[] input = { 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xA9, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			readString32Helper(input, expect);
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testReadString32_UTF8Missing2ndByte()
+		{
+			// Test with bad UTF-8 encoding, missing 2nd byte of two byte value
+			byte[] input = { 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x80, 0x04, 0xC3, 0x82, 0xC2, 0xC2, 0xC3, 0x83, 0xC0, 0x80, 0xC2, 0xA6 };
+
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			reader.ReadString32();
+		}
+
+		[Test]
+		[ExpectedException(typeof(IOException))]
+		public void testReadString32_3byteEncodingMissingLastByte()
+		{
+			// Test with three byte encode that's missing a last byte.
+			byte[] input = { 0x00, 0x00, 0x00, 0x02, 0xE8, 0xA8 };
+
+			MemoryStream stream = new MemoryStream(input);
+			EndianBinaryReader reader = new EndianBinaryReader(stream);
+
+			reader.ReadString32();
+		}
+	}
+}


[10/13] activemq-nms-xms git commit: Initial check-in of new Apache.NMS.XMS provider implementation. Big thanks to Stéphane Ramet for the implementation! Fixes [AMQNET-185]. (See https://issues.apache.org/jira/browse/AMQNET-185)

Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/ConnectionFactory.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/ConnectionFactory.cs b/src/main/csharp/ConnectionFactory.cs
new file mode 100644
index 0000000..35863bb
--- /dev/null
+++ b/src/main/csharp/ConnectionFactory.cs
@@ -0,0 +1,1502 @@
+/*
+ * 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.Collections.Specialized;
+using Apache.NMS.XMS.Util;
+using Apache.NMS.Policies;
+using Apache.NMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// A Factory that can establish NMS connections to IBM MQ.
+	/// </summary>
+	/// <remarks>
+	/// XMS connection factories can either be created from definitions
+	/// administered in a repository ("administered object"), or created
+	/// from an <c>XMSFactoryFactory</c>.
+	///
+	/// Addressable repositories for administered objects are:
+	/// - file system context
+	///   (URL format: "file://Path").
+	/// - LDAP context
+	///   (URL format: "ldap:[Hostname][:Port]["/"[DistinguishedName]]").
+	/// - WSS context:
+	///   (URL format: "http://Url", "cosnaming://Url" or "wsvc://Url").
+	///
+	/// A non-administered object is instanciated for a specific protocol:
+	/// - WebSphere Application Server Service Integration Bus
+	///   (protocol prefix: <c>"wpm:"</c>; XMS key: <c>XMSC.CT_WPM</c>).
+	/// - IBM Integration Bus using WebSphere MQ Real-Time Transport
+	///   (protocol prefix: <c>"rtt:"</c>; XMS key: <c>XMSC.CT_RTT</c>).
+	/// - WebSphere MQ queue manager
+	///   (protocol prefix: <c>"wmq:"</c>; XMS key: <c>XMSC.CT_WMQ</c>).
+	/// </remarks>
+	public class ConnectionFactory : Apache.NMS.IConnectionFactory
+	{
+		public IBM.XMS.IConnectionFactory xmsConnectionFactory = null;
+
+		private Uri brokerUri = null;
+		private IRedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
+
+		#region Constructors
+
+		/// <summary>
+		/// Constructs a <c>ConnectionFactory</c> object using default values.
+		/// </summary>
+		public ConnectionFactory()
+			: this(new Uri("xms:wmq:"))
+		{
+		}
+
+		/// <summary>
+		/// Constructs a <c>ConnectionFactory</c> object.
+		/// </summary>
+		/// <param name="brokerUri">Factory URI.</param>
+		public ConnectionFactory(Uri brokerUri)
+		{
+			try
+			{
+				// BrokerUri will construct the xmsConnectionFactory
+				this.BrokerUri = brokerUri;
+			}
+			catch(Exception ex)
+			{
+				Apache.NMS.Tracer.DebugFormat(
+					"Exception instantiating IBM.XMS.ConnectionFactory: {0}",
+					ex.Message);
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+			// In case WrapAndThrowNMSException masks the exception
+			if(this.xmsConnectionFactory == null)
+			{
+				throw new Apache.NMS.NMSException(
+					"Error instantiating XMS connection factory object.");
+			}
+		}
+
+		/// <summary>
+		/// Constructs the internal <c>ConnectionFactory</c> object from the
+		/// parameters specified in the input URI.
+		/// </summary>
+		/// <param name="factoryUri">Factory URI.</param>
+		/// <returns>URI stripped out from overridable property values.
+		/// </returns>
+		private Uri CreateConnectionFactoryFromURI(Uri factoryUri)
+		{
+			try
+			{
+				// Remove "xms:" scheme prefix
+				string originalString = factoryUri.OriginalString;
+				factoryUri = new Uri(originalString.Substring(
+					originalString.IndexOf(":") + 1));
+
+				// Parse URI properties
+				StringDictionary properties = URISupport.ParseQuery(
+					factoryUri.Query);
+
+				// The URI scheme specifies either the repository of
+				// administered objects where the ConnectionFactory object
+				// is defined, or the target connection type for
+				// non-administered objects.
+				switch(factoryUri.Scheme.ToLower())
+				{
+				case "rtt":
+				case "wmq":
+				case "wpm":
+					CreateNonAdministeredConnectionFactory(
+						factoryUri, properties);
+					break;
+				case "http":
+				case "ldap":
+				case "cosnaming":
+				case "wsvc":
+				default:
+					CreateAdministeredConnectionFactory(
+						factoryUri, properties);
+					break;
+				}
+
+				// Configure the instanciated connection factory
+				ConfigureConnectionFactory(factoryUri, properties);
+
+				return new Uri("xms:" + factoryUri.Scheme);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+				return null;
+			}
+		}
+
+		/// <summary>
+		/// Creates a connection factory from the object definition retrieved
+		/// from a repository of administered objects.
+		/// </summary>
+		/// <param name="factoryUri">Factory URI.</param>
+		/// <param name="properties">URI properties.</param>
+		private void CreateAdministeredConnectionFactory(
+			Uri factoryUri, StringDictionary properties)
+		{
+			// The initial context URL is the non-query part of the factory URI
+			string icUrl = factoryUri.OriginalString.Substring(0,
+				factoryUri.OriginalString.IndexOf('?'));
+
+			// Extract other InitialContext property values from URI
+			string icPrefix = "ic.";
+			StringDictionary icProperties = URISupport.ExtractProperties(
+				properties, icPrefix);
+
+			// Initialize environment Hashtable
+			Hashtable environment = new Hashtable();
+			environment[XMSC.IC_URL] = icUrl;
+			foreach(DictionaryEntry de in icProperties)
+			{
+				string key = ((string)de.Key).Substring(icPrefix.Length);
+				//TODO: convert "environment." attribute types.
+				environment[key] = de.Value;
+			}
+
+			// Create an InitialContext
+			InitialContext ic = new InitialContext(environment);
+
+			// Extract administered object name
+			string objectNameKey = "object.Name";
+			if(!properties.ContainsKey(objectNameKey))
+			{
+				throw new NMSException(string.Format(
+					"URI attribute {0} must be specified.", objectNameKey));
+			}
+            string objectName = properties[objectNameKey];
+			properties.Remove(objectNameKey);
+
+			// Lookup for object
+			this.xmsConnectionFactory =
+				(IBM.XMS.IConnectionFactory)ic.Lookup(objectName);
+		}
+
+		/// <summary>
+		/// Creates a non-administered connection factory.
+		/// </summary>
+		/// <param name="factoryUri">Factory URI.</param>
+		/// <param name="properties">URI properties.</param>
+		private void CreateNonAdministeredConnectionFactory(
+			Uri factoryUri, StringDictionary properties)
+		{
+			// Get an XMS factory factory for the requested protocol
+			IBM.XMS.XMSFactoryFactory xmsFactoryFactory = null;
+			string scheme = factoryUri.Scheme.ToLower();
+			switch(scheme)
+			{
+			case "rtt":
+				xmsFactoryFactory =
+					IBM.XMS.XMSFactoryFactory.GetInstance(IBM.XMS.XMSC.CT_RTT);
+
+				if(!string.IsNullOrEmpty(factoryUri.Host))
+				{
+					this.RTTHostName = factoryUri.Host;
+				}
+
+				if(factoryUri.Port != -1)
+				{
+					this.RTTPort = factoryUri.Port;
+				}
+				break;
+
+			case "wmq":
+				xmsFactoryFactory =
+					IBM.XMS.XMSFactoryFactory.GetInstance(IBM.XMS.XMSC.CT_WMQ);
+				break;
+
+			case "wpm":
+				xmsFactoryFactory =
+					IBM.XMS.XMSFactoryFactory.GetInstance(IBM.XMS.XMSC.CT_WPM);
+				break;
+			}
+
+			// Create the connection factory
+			this.xmsConnectionFactory =
+				xmsFactoryFactory.CreateConnectionFactory();
+
+			// For RTT and WMQ protocols, set the host name and port if
+			// they are specified
+			switch(scheme)
+			{
+				case "rtt":
+					if(!string.IsNullOrEmpty(factoryUri.Host))
+					{
+						this.RTTHostName = factoryUri.Host;
+					}
+
+					if(factoryUri.Port != -1)
+					{
+						this.RTTPort = factoryUri.Port;
+					}
+					break;
+
+				case "wmq":
+					if(!string.IsNullOrEmpty(factoryUri.Host))
+					{
+						this.WMQHostName = factoryUri.Host;
+					}
+
+					if(factoryUri.Port != -1)
+					{
+						this.WMQPort = factoryUri.Port;
+					}
+					break;
+			}
+		}
+
+		/// <summary>
+		/// Configures the connection factory.
+		/// </summary>
+		/// <param name="factoryUri">Factory URI.</param>
+		/// <param name="properties">URI properties.</param>
+		private void ConfigureConnectionFactory(
+			Uri factoryUri, StringDictionary properties)
+		{
+			if(properties != null && properties.Count > 0)
+			{
+				IntrospectionSupport.SetProperties(this, properties);
+			}
+		}
+
+		#endregion
+
+		#region Redelivery Policy
+
+		/// <summary>
+		/// Get/or set the redelivery policy that new IConnection objects are
+		/// assigned upon creation.
+		/// </summary>
+		public IRedeliveryPolicy RedeliveryPolicy
+		{
+			get { return this.redeliveryPolicy; }
+			set
+			{
+				if(value != null)
+				{
+					this.redeliveryPolicy = value;
+				}
+			}
+		}
+
+		#endregion
+
+		#region Properties (configure via URL parameters)
+
+		// http://www-01.ibm.com/support/knowledgecenter/?lang=en#!/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/props_connf.htm
+
+		#region Connection Factory Properties common to all protocols
+
+		/// <summary>
+		/// The client identifier for a connection.
+		/// </summary>
+		[UriAttribute("factory.ClientId")]
+		public string ClientId
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.CLIENT_ID); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.CLIENT_ID, value); }
+		}
+
+		/// <summary>
+		/// The type of messaging server to which an application connects.
+		/// </summary>
+		[UriAttribute("factory.XMSConnectionType")]
+		public Int32 XMSConnectionType
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.CONNECTION_TYPE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.CONNECTION_TYPE, value); }
+		}
+
+		/// <summary>
+		/// The type of messaging server to which an application connects.
+		/// </summary>
+		[UriAttribute("factory.ConnectionType")]
+		public ConnectionType ConnectionType
+		{
+			get { return XMSConvert.ToConnectionType(this.XMSConnectionType); }
+			set { this.XMSConnectionType = XMSConvert.ToXMSConnectionType(value); }
+		}
+
+		/// <summary>
+		/// A user identifier that can be used to authenticate the application
+		/// when it attempts to connect to a messaging server.
+		/// </summary>
+		[UriAttribute("factory.UserId")]
+		public string UserId
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.USERID); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.USERID, value); }
+		}
+
+		/// <summary>
+		/// A password that can be used to authenticate the application when it
+		/// attempts to connect to a messaging server.
+		/// </summary>
+		[UriAttribute("factory.XMSPassword")]
+		public byte[] XMSPassword
+		{
+			get { return this.xmsConnectionFactory.GetBytesProperty(XMSC.PASSWORD); }
+			set { this.xmsConnectionFactory.SetBytesProperty(XMSC.PASSWORD, value); }
+		}
+
+		/// <summary>
+		/// A password that can be used to authenticate the application when it
+		/// attempts to connect to a messaging server, specified as a string.
+		/// </summary>
+		[UriAttribute("factory.Password")]
+		public string Password
+		{
+			get { return Convert.ToBase64String(this.XMSPassword); }
+			set { this.XMSPassword = Convert.FromBase64String(value); }
+		}
+
+		/// <summary>
+		/// This property determines whether XMS informs an ExceptionListener
+		/// only when a connection is broken, or when any exception occurs
+		/// asynchronously to an XMS API call.
+		/// </summary>
+		/// <remarks>
+		/// This property applies to all Connections created from this
+		/// ConnectionFactory that have an ExceptionListener registered.
+		/// </remarks>
+		[UriAttribute("factory.XMSAsynchronousExceptions")]
+		public Int32 XMSAsynchronousExceptions
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.ASYNC_EXCEPTIONS); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.ASYNC_EXCEPTIONS, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether XMS informs an
+		/// <c>ExceptionListener</c> only when a connection is broken, or when
+		/// any exception occurs asynchronously to an XMS API call.
+		/// </summary>
+		[UriAttribute("factory.AsynchronousExceptions")]
+		public AsynchronousExceptions AsynchronousExceptions
+		{
+			get { return XMSConvert.ToAsynchronousExceptions(this.XMSAsynchronousExceptions); }
+			set { this.XMSAsynchronousExceptions = XMSConvert.ToXMSAsynchronousExceptions(value); }
+		}
+
+		#endregion
+
+		#region RTT-specific properties
+
+		/// <summary>
+		/// The communications protocol used for a real-time connection to a broker.
+		/// </summary>
+		[UriAttribute("rtt.XMSConnectionProtocol")]
+		public Int32 XMSConnectionProtocol
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.RTT_CONNECTION_PROTOCOL); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.RTT_CONNECTION_PROTOCOL, value); }
+		}
+
+		/// <summary>
+		/// The communications protocol used for a real-time connection to a broker.
+		/// </summary>
+		[UriAttribute("rtt.ConnectionProtocol")]
+		public RTTConnectionProtocol ConnectionProtocol
+		{
+			get { return XMSConvert.ToRTTConnectionProtocol(this.XMSConnectionProtocol); }
+			set { this.XMSConnectionProtocol = XMSConvert.ToXMSRTTConnectionProtocol(value); }
+		}
+
+		/// <summary>
+		/// The host name or IP address of the system on which a broker runs.
+		/// </summary>
+		[UriAttribute("rtt.HostName")]
+		public string RTTHostName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.RTT_HOST_NAME); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.RTT_HOST_NAME, value); }
+		}
+
+		/// <summary>
+		/// The number of the port on which a broker listens for incoming requests.
+		/// </summary>
+		[UriAttribute("rtt.Port")]
+		public Int32 RTTPort
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.RTT_PORT); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.RTT_PORT, value); }
+		}
+
+		/// <summary>
+		/// The host name or IP address of the local network interface to be
+		/// used for a real-time connection to a broker.
+		/// </summary>
+		[UriAttribute("rtt.LocalAddress")]
+		public string RTTLocalAddress
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.RTT_LOCAL_ADDRESS); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.RTT_LOCAL_ADDRESS, value); }
+		}
+
+		/// <summary>
+		/// The multicast setting for the connection factory.
+		/// </summary>
+		[UriAttribute("rtt.XMSMulticast")]
+		public Int32 XMSMulticast
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.RTT_MULTICAST); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.RTT_MULTICAST, value); }
+		}
+
+		/// <summary>
+		/// The multicast setting for a connection factory or destination.
+		/// </summary>
+		[UriAttribute("rtt.Multicast")]
+		public Multicast Multicast
+		{
+			get { return XMSConvert.ToMulticast(this.XMSMulticast); }
+			set { this.XMSMulticast = XMSConvert.ToXMSMulticast(value); }
+		}
+
+		/// <summary>
+		/// The time interval, in milliseconds, after which XMS .NET checks the
+		/// connection to a Real Time messaging server to detect any activity.
+		/// </summary>
+		[UriAttribute("rtt.BrokerPingInterval")]
+		public Int32 BrokerPingInterval
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.RTT_BROKER_PING_INTERVAL); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.RTT_BROKER_PING_INTERVAL, value); }
+		}
+
+		#endregion
+
+		#region WMQ-specific properties
+
+		/// <summary>
+		/// The host name or IP address of the system on which a queue manager
+		/// runs.
+		/// </summary>
+		[UriAttribute("wmq.HostName")]
+		public string WMQHostName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_HOST_NAME); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, value); }
+		}
+
+		/// <summary>
+		/// The number of the port on which a queue manager listens for
+		/// incoming requests.
+		/// </summary>
+		[UriAttribute("wmq.Port")]
+		public Int32 WMQPort
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_PORT); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_PORT, value); }
+		}
+
+		/// <summary>
+		/// For a connection to a queue manager, this property specifies the
+		/// local network interface to be used, or the local port or range of
+		/// local ports to be used, or both.
+		/// </summary>
+		[UriAttribute("wmq.LocalAddress")]
+		public string WMQLocalAddress
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_LOCAL_ADDRESS); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_LOCAL_ADDRESS, value); }
+		}
+
+		/// <summary>
+		/// The name of the queue manager to connect to.
+		/// </summary>
+		[UriAttribute("wmq.QueueManagerName")]
+		public string QueueManagerName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_QUEUE_MANAGER); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, value); }
+		}
+
+		/// <summary>
+		/// The version, release, modification level and fix pack of the queue
+		/// manager to which the application intends to connect.
+		/// </summary>
+		[UriAttribute("wmq.ProviderVersion")]
+		public string ProviderVersion
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_PROVIDER_VERSION); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_PROVIDER_VERSION, value); }
+		}
+
+		/// <summary>
+		/// The name of the channel to be used for a connection.
+		/// </summary>
+		[UriAttribute("wmq.ChannelName")]
+		public string ChannelName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_CHANNEL); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL, value); }
+		}
+
+		/// <summary>
+		/// A Uniform Resource Locator (URL) that identifies the name and
+		/// location of the file that contains the client channel definition
+		/// table and also specifies how the file can be accessed.
+		/// </summary>
+		[UriAttribute("wmq.ClientChannelDefinitionTableURL")]
+		public string ClientChannelDefinitionTableURL
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_CCDTURL); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_CCDTURL, value); }
+		}
+
+		/// <summary>
+		/// The mode by which an application connects to a queue manager.
+		/// </summary>
+		[UriAttribute("wmq.XMSConnectionMode")]
+		public Int32 XMSConnectionMode
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_CONNECTION_MODE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, value); }
+		}
+
+		/// <summary>
+		/// The mode by which an application connects to a queue manager,
+		/// specified as a string.
+		/// </summary>
+		[UriAttribute("wmq.ConnectionMode")]
+		public ConnectionMode ConnectionMode
+		{
+			get { return XMSConvert.ToConnectionMode(this.XMSConnectionMode); }
+			set { this.XMSConnectionMode = XMSConvert.ToXMSConnectionMode(value); }
+		}
+
+		/// <summary>
+		/// This property specifies the client reconnect options for new
+		/// connections created by this factory.
+		/// </summary>
+		[UriAttribute("wmq.ClientReconnectOptions")]
+		public string ClientReconnectOptions
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_CLIENT_RECONNECT_OPTIONS); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_CLIENT_RECONNECT_OPTIONS, value); }
+		}
+
+		/// <summary>
+		/// This property specifies the duration of time, in seconds, that a
+		/// client connection attempts to reconnect.
+		/// </summary>
+		[UriAttribute("wmq.ClientReconnectTimeout")]
+		public string ClientReconnectTimeout
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_CLIENT_RECONNECT_TIMEOUT, value); }
+		}
+
+		/// <summary>
+		/// This property specifies the hosts to which the client attempts to
+		/// reconnect to after its connection are broken.
+		/// </summary>
+		[UriAttribute("wmq.ConnectionNameList")]
+		public string ConnectionNameList
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_CONNECTION_NAME_LIST); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_CONNECTION_NAME_LIST, value); }
+		}
+
+		/// <summary>
+		/// Whether calls to certain methods fail if the queue manager to which
+		/// the application is connected is in a quiescing state.
+		/// </summary>
+		[UriAttribute("wmq.XMSFailIfQuiesce")]
+		public Int32 XMSFailIfQuiesce
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_FAIL_IF_QUIESCE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_FAIL_IF_QUIESCE, value); }
+		}
+
+		/// <summary>
+		/// Whether calls to certain methods fail if the queue manager to which
+		/// the application is connected is in a quiescing state.
+		/// </summary>
+		[UriAttribute("wmq.FailIfQuiesce")]
+		public bool FailIfQuiesce
+		{
+			get { return XMSConvert.ToFailIfQuiesce(this.XMSFailIfQuiesce); }
+			set { this.XMSFailIfQuiesce = XMSConvert.ToXMSFailIfQuiesce(value); }
+		}
+
+		/// <summary>
+		/// The type of broker used by the application for a connection or for
+		/// the destination.
+		/// </summary>
+		[UriAttribute("wmq.XMSBrokerVersion")]
+		public Int32 XMSBrokerVersion
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_BROKER_VERSION); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, value); }
+		}
+
+		/// <summary>
+		/// The type of broker used by the application for a connection or for
+		/// the destination.
+		/// </summary>
+		[UriAttribute("wmq.BrokerVersion")]
+		public BrokerVersion BrokerVersion
+		{
+			get { return XMSConvert.ToBrokerVersion(this.XMSBrokerVersion); }
+			set { this.XMSBrokerVersion = XMSConvert.ToXMSBrokerVersion(value); }
+		}
+
+		/// <summary>
+		/// The name of the queue manager to which a broker is connected.
+		/// </summary>
+		[UriAttribute("wmq.BrokerQueueManagerName")]
+		public string BrokerQueueManagerName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_BROKER_QMGR); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_BROKER_QMGR, value); }
+		}
+
+		/// <summary>
+		/// The name of the control queue used by a broker.
+		/// </summary>
+		[UriAttribute("wmq.BrokerControlQueueName")]
+		public string BrokerControlQueueName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_BROKER_CONTROLQ); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_BROKER_CONTROLQ, value); }
+		}
+
+		/// <summary>
+		/// The name of the queue monitored by a broker where applications send
+		/// messages that they publish.
+		/// </summary>
+		[UriAttribute("wmq.BrokerPublishQueueName")]
+		public string BrokerPublishQueueName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_BROKER_PUBQ); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_BROKER_PUBQ, value); }
+		}
+
+		/// <summary>
+		/// The name of the subscriber queue for a nondurable message consumer.
+		/// </summary>
+		[UriAttribute("wmq.BrokerSubscriberQueueName")]
+		public string BrokerSubscriberQueueName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_BROKER_SUBQ); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_BROKER_SUBQ, value); }
+		}
+
+		/// <summary>
+		/// Determines whether message selection is done by the XMS client or
+		/// by the broker.
+		/// </summary>
+		[UriAttribute("wmq.XMSMessageSelection")]
+		public Int32 XMSMessageSelection
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_MESSAGE_SELECTION); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_MESSAGE_SELECTION, value); }
+		}
+
+		/// <summary>
+		/// Determines whether message selection is done by the XMS client or
+		/// by the broker.
+		/// </summary>
+		[UriAttribute("wmq.MessageSelection")]
+		public MessageSelection MessageSelection
+		{
+			get { return XMSConvert.ToMessageSelection(this.XMSMessageSelection); }
+			set { this.XMSMessageSelection = XMSConvert.ToXMSMessageSelection(value); }
+		}
+
+		/// <summary>
+		/// The maximum number of messages to be retrieved from a queue in one
+		/// batch when using asynchronous message delivery.
+		/// </summary>
+		[UriAttribute("wmq.MessageBatchSize")]
+		public Int32 MessageBatchSize
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_MSG_BATCH_SIZE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_MSG_BATCH_SIZE, value); }
+		}
+
+		/// <summary>
+		/// If each message listener within a session has no suitable message
+		/// on its queue, this value is the maximum interval, in milliseconds,
+		/// that elapses before each message listener tries again to get a
+		/// message from its queue.
+		/// </summary>
+		[UriAttribute("wmq.PollingInterval")]
+		public Int32 PollingInterval
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_POLLING_INTERVAL); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_POLLING_INTERVAL, value); }
+		}
+
+		/// <summary>
+		/// The number of messages published by a publisher before the XMS
+		/// client requests an acknowledgement from the broker.
+		/// </summary>
+		[UriAttribute("wmq.PublishAcknowledgementInterval")]
+		public Int32 PublishAcknowledgementInterval
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_PUB_ACK_INTERVAL); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_PUB_ACK_INTERVAL, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether message producers are allowed to
+		/// use asynchronous puts to send messages to this destination.
+		/// </summary>
+		[UriAttribute("wmq.XMSAsynchronousPutsAllowed")]
+		public Int32 XMSAsynchronousPutsAllowed
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_PUT_ASYNC_ALLOWED); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_PUT_ASYNC_ALLOWED, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether message producers are allowed to
+		/// use asynchronous puts to send messages to this destination.
+		/// </summary>
+		[UriAttribute("wmq.AsynchronousPutsAllowed")]
+		public AsynchronousPutsAllowed AsynchronousPutsAllowed
+		{
+			get { return XMSConvert.ToAsynchronousPutsAllowed(this.XMSAsynchronousPutsAllowed); }
+			set { this.XMSAsynchronousPutsAllowed = XMSConvert.ToXMSAsynchronousPutsAllowed(value); }
+		}
+
+		/// <summary>
+		/// The identifier (CCSID) of the coded character set, or code page,
+		/// in which fields of character data defined in the Message Queue
+		/// Interface (MQI) are exchanged between the XMS client and the
+		/// WebSphere MQ client.
+		/// </summary>
+		[UriAttribute("wmq.QueueManagerCCSID")]
+		public string QueueManagerCCSID
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_QMGR_CCSID); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_QMGR_CCSID, value); }
+		}
+
+		/// <summary>
+		/// Identifies a channel receive exit to be run.
+		/// </summary>
+		[UriAttribute("wmq.ReceiveExit")]
+		public string ReceiveExit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_RECEIVE_EXIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_RECEIVE_EXIT, value); }
+		}
+
+		/// <summary>
+		/// The user data that is passed to a channel receive exit when it
+		/// is called.
+		/// </summary>
+		[UriAttribute("wmq.ReceiveExitInit")]
+		public string ReceiveExitInit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_RECEIVE_EXIT_INIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_RECEIVE_EXIT_INIT, value); }
+		}
+
+		/// <summary>
+		/// Identifies a channel security exit.
+		/// </summary>
+		[UriAttribute("wmq.SecurityExit")]
+		public string SecurityExit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SECURITY_EXIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SECURITY_EXIT, value); }
+		}
+
+		/// <summary>
+		/// The user data that is passed to a channel security exit when it
+		/// is called.
+		/// </summary>
+		[UriAttribute("wmq.SecurityExitInit")]
+		public string SecurityExitInit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SECURITY_EXIT_INIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SECURITY_EXIT_INIT, value); }
+		}
+
+		/// <summary>
+		/// Identifies a channel send exit.
+		/// </summary>
+		[UriAttribute("wmq.SendExit")]
+		public string SendExit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SEND_EXIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SEND_EXIT, value); }
+		}
+
+		/// <summary>
+		/// The user data that is passed to channel send exits when they
+		/// are called.
+		/// </summary>
+		[UriAttribute("wmq.SendExitInit")]
+		public string SendExitInit
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SEND_EXIT_INIT); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SEND_EXIT_INIT, value); }
+		}
+
+		/// <summary>
+		/// The number of send calls to allow between checking for asynchronous
+		/// put errors, within a single non-transacted XMS session.
+		/// </summary>
+		[UriAttribute("wmq.SendCheckCount")]
+		public Int32 SendCheckCount
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_SEND_CHECK_COUNT); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_SEND_CHECK_COUNT, value); }
+		}
+
+		/// <summary>
+		/// Whether a client connection can share its socket with other
+		/// top-level XMS connections from the same process to the same queue
+		/// manager, if the channel definitions match.
+		/// </summary>
+		[UriAttribute("wmq.XMSShareSocketAllowed")]
+		public Int32 XMSShareSocketAllowed
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_SHARE_CONV_ALLOWED); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_SHARE_CONV_ALLOWED, value); }
+		}
+
+		/// <summary>
+		/// Whether a client connection can share its socket with other
+		/// top-level XMS connections from the same process to the same queue
+		/// manager, if the channel definitions match.
+		/// </summary>
+		[UriAttribute("wmq.ShareSocketAllowed")]
+		public bool ShareSocketAllowed
+		{
+			get { return XMSConvert.ToShareSocketAllowed(this.XMSShareSocketAllowed); }
+			set { this.XMSShareSocketAllowed = XMSConvert.ToXMSShareSocketAllowed(value); }
+		}
+
+		/// <summary>
+		/// The locations of the servers that hold the certificate revocation
+		/// lists (CRLs) to be used on an SSL connection to a queue manager.
+		/// </summary>
+		[UriAttribute("wmq.SSLCertificateStores")]
+		public string SSLCertificateStores
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_CERT_STORES); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_CERT_STORES, value); }
+		}
+
+		/// <summary>
+		/// The name of the CipherSpec to be used on a secure connection to
+		/// a queue manager.
+		/// </summary>
+		[UriAttribute("wmq.SSLCipherSpec")]
+		public string SSLCipherSpec
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC, value); }
+		}
+
+		/// <summary>
+		/// The name of the CipherSuite to be used on an SSL or TLS connection
+		/// to a queue manager. The protocol used in negotiating the secure
+		/// connection depends on the specified CipherSuite.
+		/// </summary>
+		[UriAttribute("wmq.SSLCipherSuite")]
+		public string SSLCipherSuite
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_CIPHER_SUITE); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SUITE, value); }
+		}
+
+		/// <summary>
+		/// Configuration details for the cryptographic hardware connected
+		/// to the client system.
+		/// </summary>
+		[UriAttribute("wmq.SSLCryptoHardware")]
+		public string SSLCryptoHardware
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_CRYPTO_HW); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_CRYPTO_HW, value); }
+		}
+
+		/// <summary>
+		/// The value of this property determines whether an application can
+		/// or cannot use non-FIPS compliant cipher suites. If this property
+		/// is set to true, only FIPS algorithms are used for the client-server
+		/// connection.
+		/// </summary>
+		[UriAttribute("wmq.SSLFipsRequired")]
+		public bool SSLFipsRequired
+		{
+			get { return this.xmsConnectionFactory.GetBooleanProperty(XMSC.WMQ_SSL_FIPS_REQUIRED); }
+			set { this.xmsConnectionFactory.SetBooleanProperty(XMSC.WMQ_SSL_FIPS_REQUIRED, value); }
+		}
+
+		/// <summary>
+		/// The location of the key database file in which keys and
+		/// certificates are stored.
+		/// </summary>
+		[UriAttribute("wmq.SSLKeyRepository")]
+		public string SSLKeyRepository
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, value); }
+		}
+
+		/// <summary>
+		/// The KeyResetCount represents the total number of unencrypted bytes
+		/// sent and received within an SSL conversation before the secret key
+		/// is renegotiated.
+		/// </summary>
+		[UriAttribute("wmq.SSLKeyResetCount")]
+		public Int32 SSLKeyResetCount
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_SSL_KEY_RESETCOUNT); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_SSL_KEY_RESETCOUNT, value); }
+		}
+
+		/// <summary>
+		/// The peer name to be used on an SSL connection to a queue manager.
+		/// </summary>
+		[UriAttribute("wmq.SSLPeerName")]
+		public string SSLPeerName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_SSL_PEER_NAME); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_SSL_PEER_NAME, value); }
+		}
+
+		/// <summary>
+		/// Whether all messages must be retrieved from queues within sync point control.
+		/// </summary>
+		[UriAttribute("wmq.SyncpointAllGets")]
+		public bool SyncpointAllGets
+		{
+			get { return this.xmsConnectionFactory.GetBooleanProperty(XMSC.WMQ_SYNCPOINT_ALL_GETS); }
+			set { this.xmsConnectionFactory.SetBooleanProperty(XMSC.WMQ_SYNCPOINT_ALL_GETS, value); }
+		}
+
+		/// <summary>
+		/// Whether messages sent to the destination contain an MQRFH2 header.
+		/// </summary>
+		[UriAttribute("wmq.XMSTargetClient")]
+		public Int32 XMSTargetClient
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WMQ_TARGET_CLIENT); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WMQ_TARGET_CLIENT, value); }
+		}
+
+		/// <summary>
+		/// Whether messages sent to the destination contain an <c>MQRFH2</c>
+		/// header.
+		/// </summary>
+		[UriAttribute("wmq.TargetClient")]
+		public TargetClient TargetClient
+		{
+			get { return XMSConvert.ToTargetClient(this.XMSTargetClient); }
+			set { this.XMSTargetClient = XMSConvert.ToXMSTargetClient(value); }
+		}
+
+		/// <summary>
+		/// The prefix used to form the name of the WebSphere MQ dynamic queue
+		/// that is created when the application creates an XMS temporary queue.
+		/// </summary>
+		[UriAttribute("wmq.TemporaryQueuePrefix")]
+		public string WMQTemporaryQueuePrefix
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_TEMP_Q_PREFIX); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_TEMP_Q_PREFIX, value); }
+		}
+
+		/// <summary>
+		/// When creating temporary topics, XMS generates a topic string of
+		/// the form "TEMP/TEMPTOPICPREFIX/unique_id", or if this property
+		/// contains the default value, then this string, "TEMP/unique_id", is
+		/// generated. Specifying a non-empty value allows specific model
+		/// queues to be defined for creating the managed queues for subscribers
+		/// to temporary topics created under this connection.
+		/// </summary>
+		[UriAttribute("wmq.TemporaryTopicPrefix")]
+		public string WMQTemporaryTopicPrefix
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX, value); }
+		}
+
+		/// <summary>
+		/// The name of the WebSphere MQ model queue from which a dynamic
+		/// queue is created when the application creates an XMS temporary
+		/// queue.
+		/// </summary>
+		[UriAttribute("wmq.TemporaryModel")]
+		public string WMQTemporaryModel
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX, value); }
+		}
+
+		#endregion
+
+		#region WPM-specific properties
+
+		/// <summary>
+		/// For a connection to a service integration bus, this property
+		/// specifies the local network interface to be used, or the local
+		/// port or range of local ports to be used, or both.
+		/// </summary>
+		[UriAttribute("wpm.LocalAddress")]
+		public string WPMLocalAddress
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_LOCAL_ADDRESS); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_LOCAL_ADDRESS, value); }
+		}
+
+		/// <summary>
+		/// The name of the service integration bus that the application
+		/// connects to.
+		/// </summary>
+		[UriAttribute("wpm.BusName")]
+		public string BusName
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_BUS_NAME); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_BUS_NAME, value); }
+		}
+
+		/// <summary>
+		/// The connection proximity setting for the connection.
+		/// </summary>
+		[UriAttribute("wpm.XMSConnectionProximity")]
+		public Int32 XMSConnectionProximity
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WPM_CONNECTION_PROXIMITY); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WPM_CONNECTION_PROXIMITY, value); }
+		}
+
+		/// <summary>
+		/// The connection proximity setting for the connection.
+		/// </summary>
+		[UriAttribute("wpm.ConnectionProximity")]
+		public ConnectionProximity ConnectionProximity
+		{
+			get { return XMSConvert.ToConnectionProximity(this.XMSConnectionProximity); }
+			set { this.XMSConnectionProximity = XMSConvert.ToXMSConnectionProximity(value); }
+		}
+
+		/// <summary>
+		/// The name of the messaging engine where all durable subscriptions
+		/// for a connection or a destination are managed.
+		/// </summary>
+		[UriAttribute("wpm.DurableSubscriptionHome")]
+		public string DurableSubscriptionHome
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_DUR_SUB_HOME); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_DUR_SUB_HOME, value); }
+		}
+
+		/// <summary>
+		/// The reliability level of nonpersistent messages that are sent
+		/// using the connection.
+		/// </summary>
+		[UriAttribute("wpm.XMSNonPersistentMap")]
+		public Int32 XMSNonPersistentMap
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WPM_NON_PERSISTENT_MAP); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WPM_NON_PERSISTENT_MAP, value); }
+		}
+
+		/// <summary>
+		/// The reliability level of nonpersistent messages that are sent
+		/// using the connection.
+		/// </summary>
+		[UriAttribute("wpm.NonPersistentMap")]
+		public Mapping NonPersistentMap
+		{
+			get { return XMSConvert.ToMapping(this.XMSNonPersistentMap); }
+			set { this.XMSNonPersistentMap = XMSConvert.ToXMSMapping(value); }
+		}
+
+		/// <summary>
+		/// The reliability level of persistent messages that are sent
+		/// using the connection.
+		/// </summary>
+		[UriAttribute("wpm.XMSPersistentMap")]
+		public Int32 XMSPersistentMap
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WPM_PERSISTENT_MAP); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WPM_PERSISTENT_MAP, value); }
+		}
+
+		/// <summary>
+		/// The reliability level of persistent messages that are sent
+		/// using the connection.
+		/// </summary>
+		[UriAttribute("wpm.PersistentMap")]
+		public Mapping PersistentMap
+		{
+			get { return XMSConvert.ToMapping(this.XMSPersistentMap); }
+			set { this.XMSPersistentMap = XMSConvert.ToXMSMapping(value); }
+		}
+
+		/// <summary>
+		/// A sequence of one or more endpoint addresses of bootstrap servers.
+		/// </summary>
+		[UriAttribute("wpm.ProviderEndpoints")]
+		public string ProviderEndpoints
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_PROVIDER_ENDPOINTS); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_PROVIDER_ENDPOINTS, value); }
+		}
+
+		/// <summary>
+		/// The name of a target group of messaging engines.
+		/// </summary>
+		[UriAttribute("wpm.TargetGroup")]
+		public string TargetGroup
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_TARGET_GROUP); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_TARGET_GROUP, value); }
+		}
+
+		/// <summary>
+		/// The significance of the target group of messaging engines.
+		/// </summary>
+		[UriAttribute("wpm.XMSTargetSignificance")]
+		public Int32 XMSTargetSignificance
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WPM_TARGET_SIGNIFICANCE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WPM_TARGET_SIGNIFICANCE, value); }
+		}
+
+		/// <summary>
+		/// The significance of the target group of messaging engines.
+		/// </summary>
+		[UriAttribute("wpm.TargetSignificance")]
+		public TargetSignificance TargetSignificance
+		{
+			get { return XMSConvert.ToTargetSignificance(this.XMSTargetSignificance); }
+			set { this.XMSTargetSignificance = XMSConvert.ToXMSTargetSignificance(value); }
+		}
+
+		/// <summary>
+		/// The name of the inbound transport chain that the application must
+		/// use to connect to a messaging engine.
+		/// </summary>
+		[UriAttribute("wpm.TargetTransportChain")]
+		public string TargetTransportChain
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WPM_TARGET_TRANSPORT_CHAIN); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WPM_TARGET_TRANSPORT_CHAIN, value); }
+		}
+
+		/// <summary>
+		/// The type of the target group of messaging engines.
+		/// </summary>
+		[UriAttribute("wpm.XMSTargetType")]
+		public Int32 XMSTargetType
+		{
+			get { return this.xmsConnectionFactory.GetIntProperty(XMSC.WPM_TARGET_TYPE); }
+			set { this.xmsConnectionFactory.SetIntProperty(XMSC.WPM_TARGET_TYPE, value); }
+		}
+
+		/// <summary>
+		/// The type of the target group of messaging engines.
+		/// </summary>
+		[UriAttribute("wpm.TargetType")]
+		public TargetType TargetType
+		{
+			get { return XMSConvert.ToTargetType(this.XMSTargetType); }
+			set { this.XMSTargetType = XMSConvert.ToXMSTargetType(value); }
+		}
+
+		/// <summary>
+		/// The prefix used to form the name of the temporary queue that is
+		/// created in the service integration bus when the application creates
+		/// an XMS temporary queue.
+		/// </summary>
+		[UriAttribute("wpm.TemporaryQueuePrefix")]
+		public string WPMTemporaryQueuePrefix
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_TEMP_Q_PREFIX); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_TEMP_Q_PREFIX, value); }
+		}
+
+		/// <summary>
+		/// The prefix used to form the name of a temporary topic that is
+		/// created by the application.
+		/// </summary>
+		[UriAttribute("wpm.TemporaryTopicPrefix")]
+		public string WPMTemporaryTopicPrefix
+		{
+			get { return this.xmsConnectionFactory.GetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX); }
+			set { this.xmsConnectionFactory.SetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX, value); }
+		}
+
+		#endregion
+
+		#region Common properties having protocol-specific keys
+
+		/// <summary>
+		/// The host name or IP address of the system on which a broker (RTT)
+		/// or queue manager (WMQ) runs.
+		/// </summary>
+		public string HostName
+		{
+			get
+			{
+				switch(this.XMSConnectionType)
+				{
+					case XMSC.CT_RTT: return this.RTTHostName;
+					case XMSC.CT_WMQ: return this.WMQHostName;
+					case XMSC.CT_WPM: return null;
+					default         : return null;
+				}
+			}
+			set
+			{
+				switch(this.XMSConnectionType)
+				{
+					case XMSC.CT_RTT: this.RTTHostName = value; break;
+					case XMSC.CT_WMQ: this.WMQHostName = value; break;
+					case XMSC.CT_WPM: break;
+					default         : break;
+				}
+			}
+		}
+
+		/// <summary>
+		/// The number of the port on which a broker (RTT) or queue manager
+		/// (WMQ) listens for incoming requests.
+		/// </summary>
+		public Int32 Port
+		{
+			get
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: return this.RTTPort;
+					case IBM.XMS.XMSC.CT_WMQ: return this.WMQPort;
+					case IBM.XMS.XMSC.CT_WPM: return 0;
+					default         : return 0;
+				}
+			}
+			set
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: this.RTTPort = value; break;
+					case IBM.XMS.XMSC.CT_WMQ: this.WMQPort = value; break;
+					case IBM.XMS.XMSC.CT_WPM: break;
+					default         : break;
+				}
+			}
+		}
+
+		/// <summary>
+		/// The host name or IP address of the local network interface to be
+		/// used for a RTT real-time connection to a broker.
+		/// For a WMQ connection to a queue manager, this property specifies
+		/// the local network interface to be used, or the local port or range
+		/// of local ports to be used, or both.
+		/// For a WPM connection to a service integration bus, this property
+		/// specifies the local network interface to be used, or the local
+		/// port or range of local ports to be used, or both.
+		/// </summary>
+		public string LocalAddress
+		{
+			get
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: return this.RTTLocalAddress;
+					case IBM.XMS.XMSC.CT_WMQ: return this.WMQLocalAddress;
+					case IBM.XMS.XMSC.CT_WPM: return this.WPMLocalAddress;
+					default         : return null;
+				}
+			}
+			set
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: this.RTTLocalAddress = value; break;
+					case IBM.XMS.XMSC.CT_WMQ: this.WMQLocalAddress = value; break;
+					case IBM.XMS.XMSC.CT_WPM: this.WPMLocalAddress = value; break;
+					default         : break;
+				}
+			}
+		}
+
+		/// <summary>
+		/// The prefix used to form the name of the WebSphere MQ dynamic queue
+		/// that is created (WMQ), or the name of the temporary queue that is
+		/// created in the service integration bus (WPM) when the application
+		/// creates an XMS temporary queue.
+		/// </summary>
+		public string TemporaryQueuePrefix
+		{
+			get
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: return null;
+					case IBM.XMS.XMSC.CT_WMQ: return this.WMQTemporaryQueuePrefix;
+					case IBM.XMS.XMSC.CT_WPM: return this.WPMTemporaryQueuePrefix;
+					default         : return null;
+				}
+			}
+			set
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: break;
+					case IBM.XMS.XMSC.CT_WMQ: this.WMQTemporaryQueuePrefix = value; break;
+					case IBM.XMS.XMSC.CT_WPM: this.WPMTemporaryQueuePrefix = value; break;
+					default         : break;
+				}
+			}
+		}
+
+		/// <summary>
+		/// The prefix used to form the name of a temporary topic that is
+		/// created by the application (WMQ and WPM).
+		/// </summary>
+		public string TemporaryTopicPrefix
+		{
+			get
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: return null;
+					case IBM.XMS.XMSC.CT_WMQ: return this.WMQTemporaryTopicPrefix;
+					case IBM.XMS.XMSC.CT_WPM: return this.WPMTemporaryTopicPrefix;
+					default         : return null;
+				}
+			}
+			set
+			{
+				switch(this.XMSConnectionType)
+				{
+					case IBM.XMS.XMSC.CT_RTT: break;
+					case IBM.XMS.XMSC.CT_WMQ: this.WMQTemporaryTopicPrefix = value; break;
+					case IBM.XMS.XMSC.CT_WPM: this.WPMTemporaryTopicPrefix = value; break;
+					default         : break;
+				}
+			}
+		}
+
+		#endregion
+
+		#endregion
+
+		#region IConnectionFactory Members
+
+		/// <summary>
+		/// Creates a new connection to IBM MQ with the default properties.
+		/// </summary>
+		public Apache.NMS.IConnection CreateConnection()
+		{
+			Apache.NMS.IConnection connection = null;
+			try
+			{
+				connection = new Apache.NMS.XMS.Connection(
+					this.xmsConnectionFactory.CreateConnection());
+				ConfigureConnection(connection);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+			return connection;
+		}
+
+		/// <summary>
+		/// Creates a new connection to IBM MQ using a specified user identity.
+		/// </summary>
+		/// <param name="userName">User name.</param>
+		/// <param name="password">Password.</param>
+		public Apache.NMS.IConnection CreateConnection(
+					string userName, string password)
+		{
+			Apache.NMS.IConnection connection = null;
+			try
+			{
+				connection = new Apache.NMS.XMS.Connection(
+					this.xmsConnectionFactory.CreateConnection(
+						userName, password));
+				ConfigureConnection(connection);
+			}
+			catch(Exception ex)
+			{
+				ExceptionUtil.WrapAndThrowNMSException(ex);
+			}
+			return connection;
+		}
+
+		/// <summary>
+		/// Configure the newly created connection.
+		/// </summary>
+		/// <param name="connection">Connection.</param>
+		private void ConfigureConnection(IConnection connection)
+		{
+			connection.RedeliveryPolicy = this.redeliveryPolicy.Clone() as IRedeliveryPolicy;
+			connection.ConsumerTransformer = this.consumerTransformer;
+			connection.ProducerTransformer = this.producerTransformer;
+		}
+
+		/// <summary>
+		/// Get or set the broker URI.
+		/// </summary>
+		public Uri BrokerUri
+		{
+			get { return this.brokerUri; }
+			set { this.brokerUri = CreateConnectionFactoryFromURI(value); }
+		}
+
+		private ConsumerTransformerDelegate consumerTransformer;
+		/// <summary>
+		/// A Delegate that is called each time a Message is dispatched to allow the client to do
+		/// any necessary transformations on the received message before it is delivered.  The
+		/// ConnectionFactory sets the provided delegate instance on each Connection instance that
+		/// is created from this factory, each connection in turn passes the delegate along to each
+		/// Session it creates which then passes that along to the Consumers it creates.
+		/// </summary>
+		public ConsumerTransformerDelegate ConsumerTransformer
+		{
+			get { return this.consumerTransformer; }
+			set { this.consumerTransformer = value; }
+		}
+
+		private ProducerTransformerDelegate producerTransformer;
+		/// <summary>
+		/// A delegate that is called each time a Message is sent from this Producer which allows
+		/// the application to perform any needed transformations on the Message before it is sent.
+		/// The ConnectionFactory sets the provided delegate instance on each Connection instance that
+		/// is created from this factory, each connection in turn passes the delegate along to each
+		/// Session it creates which then passes that along to the Producers it creates.
+		/// </summary>
+		public ProducerTransformerDelegate ProducerTransformer
+		{
+			get { return this.producerTransformer; }
+			set { this.producerTransformer = value; }
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/ConnectionMetaData.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/ConnectionMetaData.cs b/src/main/csharp/ConnectionMetaData.cs
new file mode 100644
index 0000000..27ffce3
--- /dev/null
+++ b/src/main/csharp/ConnectionMetaData.cs
@@ -0,0 +1,106 @@
+\ufeff/*
+ * 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.Reflection;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// Implements the Connection Meta-Data feature for Apache.NMS.EMS
+	/// </summary>
+	public class ConnectionMetaData : IConnectionMetaData
+	{
+		private int nmsMajorVersion;
+		private int nmsMinorVersion;
+
+		private string nmsProviderName;
+		private string nmsVersion;
+
+		private int providerMajorVersion;
+		private int providerMinorVersion;
+		private string providerVersion;
+
+		private string[] nmsxProperties;
+
+		public ConnectionMetaData()
+		{
+			Assembly self = Assembly.GetExecutingAssembly();
+			AssemblyName asmName = self.GetName();
+
+			this.nmsProviderName = asmName.Name;
+			this.providerMajorVersion = asmName.Version.Major;
+			this.providerMinorVersion = asmName.Version.Minor;
+			this.providerVersion = asmName.Version.ToString();
+
+			this.nmsxProperties = new String[] { };
+
+			foreach(AssemblyName name in self.GetReferencedAssemblies())
+			{
+				if(0 == string.Compare(name.Name, "Apache.NMS", true))
+				{
+					this.nmsMajorVersion = name.Version.Major;
+					this.nmsMinorVersion = name.Version.Minor;
+					this.nmsVersion = name.Version.ToString();
+
+					return;
+				}
+			}
+
+			throw new NMSException("Could not find a reference to the Apache.NMS Assembly.");
+		}
+
+		public int NMSMajorVersion
+		{
+			get { return this.nmsMajorVersion; }
+		}
+
+		public int NMSMinorVersion
+		{
+			get { return this.nmsMinorVersion; }
+		}
+
+		public string NMSProviderName
+		{
+			get { return this.nmsProviderName; }
+		}
+
+		public string NMSVersion
+		{
+			get { return this.nmsVersion; }
+		}
+
+		public string[] NMSXPropertyNames
+		{
+			get { return this.nmsxProperties; }
+		}
+
+		public int ProviderMajorVersion
+		{
+			get { return this.providerMajorVersion; }
+		}
+
+		public int ProviderMinorVersion
+		{
+			get { return this.providerMinorVersion; }
+		}
+
+		public string ProviderVersion
+		{
+			get { return this.providerVersion; }
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/Destination.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/Destination.cs b/src/main/csharp/Destination.cs
new file mode 100644
index 0000000..d3848b2
--- /dev/null
+++ b/src/main/csharp/Destination.cs
@@ -0,0 +1,524 @@
+/*
+ * 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 Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.XMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	public class Destination : IDestination
+	{
+		public IBM.XMS.IDestination xmsDestination;
+
+		#region Constructors
+
+		/// <summary>
+		/// Constructs a destination object.
+		/// </summary>
+		/// <param name="destination">IBM XMS destination.</param>
+		public Destination(IBM.XMS.IDestination destination)
+		{
+			this.xmsDestination = destination;
+		}
+
+		/// <summary>
+		/// Constructs a destination object specifying if the destination is
+		/// temporary.
+		/// </summary>
+		/// <param name="destination">IBM XMS destination.</param>
+		/// <param name="isTemporary">Whether the destination is temporary.
+		/// </param>
+		public Destination(IBM.XMS.IDestination destination, bool isTemporary)
+		{
+			this.xmsDestination = destination;
+			this.isTemporary = isTemporary;
+		}
+
+		#endregion
+
+		#region IDestination implementation
+
+		/// <summary>
+		/// Destination type.
+		/// </summary>
+		public DestinationType DestinationType
+		{
+			get
+			{
+				return XMSConvert.ToDestinationType(
+					this.xmsDestination.TypeId,
+					this.isTemporary);
+			}
+		}
+
+		/// <summary>
+		/// Checks if destination is a topic.
+		/// </summary>
+		public bool IsTopic
+		{
+			get
+			{
+				return (this.xmsDestination.TypeId
+					== IBM.XMS.DestinationType.Topic);
+			}
+		}
+
+		/// <summary>
+		/// Checks if destination is a queue.
+		/// </summary>
+		public bool IsQueue
+		{
+			get
+			{
+				return (this.xmsDestination.TypeId
+					== IBM.XMS.DestinationType.Queue);
+			}
+		}
+
+		private readonly bool isTemporary;
+		/// <summary>
+		/// Checks if destination is temporary.
+		/// </summary>
+		public bool IsTemporary
+		{
+			get { return this.isTemporary; }
+		}
+
+		#endregion
+
+		#region XMS IDestination properties
+
+		// http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/props_dest.htm?lang=en
+
+		#region Common properties
+
+		/// <summary>
+		/// Destination name.
+		/// </summary>
+		public string Name
+		{
+			get { return this.xmsDestination.Name; }
+		}
+
+		/// <summary>
+		/// The delivery mode of messages sent to the destination.
+		/// </summary>
+		public Int32 XMSDeliveryMode
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.DELIVERY_MODE); }
+			set { this.xmsDestination.SetIntProperty(XMSC.DELIVERY_MODE, value); }
+		}
+
+		/// <summary>
+		/// The delivery mode of messages sent to the destination.
+		/// </summary>
+		public Apache.NMS.XMS.Util.DeliveryMode DeliveryMode
+		{
+			get { return XMSConvert.ToDeliveryMode(this.XMSDeliveryMode); }
+			set { this.XMSDeliveryMode = XMSConvert.ToXMSDeliveryMode(value); }
+		}
+
+		/// <summary>
+		/// The priority of messages sent to the destination.
+		/// </summary>
+		public Int32 Priority
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.PRIORITY); }
+			set { this.xmsDestination.SetIntProperty(XMSC.PRIORITY, value); }
+		}
+
+		/// <summary>
+		/// The time to live in milliseconds for messages sent to the
+		/// destination.
+		/// </summary>
+		public Int32 TimeToLive
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.TIME_TO_LIVE); }
+			set { this.xmsDestination.SetIntProperty(XMSC.TIME_TO_LIVE, value); }
+		}
+
+		#endregion
+
+		#region RTT-specific properties
+
+		/// <summary>
+		/// The multicast setting for the destination.
+		/// </summary>
+		[UriAttribute("rtt.XMSMulticast")]
+		public Int32 XMSMulticast
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.RTT_MULTICAST); }
+			set { this.xmsDestination.SetIntProperty(XMSC.RTT_MULTICAST, value); }
+		}
+
+		/// <summary>
+		/// The multicast setting for the destination.
+		/// </summary>
+		[UriAttribute("rtt.Multicast")]
+		public Multicast Multicast
+		{
+			get { return XMSConvert.ToMulticast(this.XMSMulticast); }
+			set { this.XMSMulticast = XMSConvert.ToXMSMulticast(value); }
+		}
+
+		#endregion
+
+		#region WMQ-specific properties
+
+		/// <summary>
+		/// The type of broker used by the application for the destination.
+		/// </summary>
+		[UriAttribute("wmq.XMSBrokerVersion")]
+		public Int32 XMSBrokerVersion
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_BROKER_VERSION); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_BROKER_VERSION, value); }
+		}
+
+		/// <summary>
+		/// The type of broker used by the application for the destination.
+		/// </summary>
+		[UriAttribute("wmq.BrokerVersion")]
+		public BrokerVersion BrokerVersion
+		{
+			get { return XMSConvert.ToBrokerVersion(this.XMSBrokerVersion); }
+			set { this.XMSBrokerVersion = XMSConvert.ToXMSBrokerVersion(value); }
+		}
+
+		/// <summary>
+		/// The identifier (CCSID) of the coded character set, or code page,
+		/// that the strings of character data in the body of a message are in
+		/// when the XMS client forwards the message to the destination.
+		/// </summary>
+		[UriAttribute("wmq.DestinationCCSID")]
+		public Int32 DestinationCCSID
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_CCSID); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_CCSID, value); }
+		}
+
+		/// <summary>
+		/// The name of the subscriber queue for a durable subscriber that is
+		/// receiving messages from the destination.
+		/// </summary>
+		[UriAttribute("wmq.SubscriberQueueName")]
+		public string SubscriberQueueName
+		{
+			get { return this.xmsDestination.GetStringProperty(XMSC.WMQ_DUR_SUBQ); }
+			set { this.xmsDestination.SetStringProperty(XMSC.WMQ_DUR_SUBQ, value); }
+		}
+
+		/// <summary>
+		/// How numerical data in the body of a message is represented when
+		/// the XMS client forwards the message to the destination.
+		/// </summary>
+		[UriAttribute("wmq.XMSEncoding")]
+		public Int32 XMSEncoding
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_ENCODING); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_ENCODING, value); }
+		}
+
+		/// <summary>
+		/// How numerical data in the body of a message is represented when
+		/// the XMS client forwards the message to the destination.
+		/// </summary>
+		[UriAttribute("wmq.Encoding")]
+		public Encoding Encoding
+		{
+			get { return XMSConvert.ToEncoding(this.XMSEncoding); }
+			set { this.XMSEncoding = XMSConvert.ToXMSEncoding(value); }
+		}
+
+		/// <summary>
+		/// Whether calls to certain methods fail if the queue manager to which
+		/// the application is connected is in a quiescing state.
+		/// </summary>
+		[UriAttribute("wmq.XMSFailIfQuiesce")]
+		public Int32 XMSFailIfQuiesce
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_FAIL_IF_QUIESCE); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_FAIL_IF_QUIESCE, value); }
+		}
+
+		/// <summary>
+		/// Whether calls to certain methods fail if the queue manager to which
+		/// the application is connected is in a quiescing state.
+		/// </summary>
+		[UriAttribute("wmq.FailIfQuiesce")]
+		public bool FailIfQuiesce
+		{
+			get { return XMSConvert.ToFailIfQuiesce(this.XMSFailIfQuiesce); }
+			set { this.XMSFailIfQuiesce = XMSConvert.ToXMSFailIfQuiesce(value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application processes the
+		/// <c>MQRFH2</c> of a WebSphere MQ message as part of the message
+		/// payload (that is, as part of the message body).
+		/// </summary>
+		[UriAttribute("wmq.XMSMessageBody")]
+		public Int32 XMSMessageBody
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_MESSAGE_BODY); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_MESSAGE_BODY, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application processes the
+		/// <c>MQRFH2</c> of a WebSphere MQ message as part of the message
+		/// payload (that is, as part of the message body).
+		/// </summary>
+		[UriAttribute("wmq.MessageBody")]
+		public MessageBody MessageBody
+		{
+			get { return XMSConvert.ToMessageBody(this.XMSMessageBody); }
+			set { this.XMSMessageBody = XMSConvert.ToXMSMessageBody(value); }
+		}
+
+		/// <summary>
+		/// Determines what level of message context is to be set by the XMS
+		/// application. The application must be running with appropriate
+		/// context authority for this property to take effect.
+		/// </summary>
+		[UriAttribute("wmq.XMSMessageContext")]
+		public Int32 XMSMessageContext
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_MQMD_MESSAGE_CONTEXT); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_MQMD_MESSAGE_CONTEXT, value); }
+		}
+
+		/// <summary>
+		/// Determines what level of message context is to be set by the XMS
+		/// application. The application must be running with appropriate
+		/// context authority for this property to take effect.
+		/// </summary>
+		[UriAttribute("wmq.MessageContext")]
+		public MessageContext MessageContext
+		{
+			get { return XMSConvert.ToMessageContext(this.XMSMessageContext); }
+			set { this.XMSMessageContext = XMSConvert.ToXMSMessageContext(value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application can extract
+		/// the values of MQMD fields or not.
+		/// </summary>
+		[UriAttribute("wmq.XMSMQMDReadEnabled")]
+		public Int32 XMSMQMDReadEnabled
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_MQMD_READ_ENABLED); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_MQMD_READ_ENABLED, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application can extract
+		/// the values of MQMD fields or not.
+		/// </summary>
+		[UriAttribute("wmq.MQMDReadEnabled")]
+		public bool MQMDReadEnabled
+		{
+			get { return XMSConvert.ToMQMDReadEnabled(this.XMSMQMDReadEnabled); }
+			set { this.XMSMQMDReadEnabled = XMSConvert.ToXMSMQMDReadEnabled(value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application can set
+		/// the values of MQMD fields or not.
+		/// </summary>
+		[UriAttribute("wmq.XMSMQMDWriteEnabled")]
+		public Int32 XMSMQMDWriteEnabled
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_MQMD_WRITE_ENABLED); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_MQMD_WRITE_ENABLED, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether an XMS application can set
+		/// the values of MQMD fields or not.
+		/// </summary>
+		[UriAttribute("wmq.MQMDWriteEnabled")]
+		public bool MQMDWriteEnabled
+		{
+			get { return XMSConvert.ToMQMDWriteEnabled(this.XMSMQMDWriteEnabled); }
+			set { this.XMSMQMDWriteEnabled = XMSConvert.ToXMSMQMDWriteEnabled(value); }
+		}
+
+		/// <summary>
+		/// This property determines whether message consumers and queue
+		/// browsers are allowed to use read ahead to get non-persistent,
+		/// non-transactional messages from this destination into an internal
+		/// buffer before receiving them.
+		/// </summary>
+		[UriAttribute("wmq.XMSReadAheadAllowed")]
+		public Int32 XMSReadAheadAllowed
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_READ_AHEAD_ALLOWED); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_READ_AHEAD_ALLOWED, value); }
+		}
+
+		/// <summary>
+		/// This property determines whether message consumers and queue
+		/// browsers are allowed to use read ahead to get non-persistent,
+		/// non-transactional messages from this destination into an internal
+		/// buffer before receiving them.
+		/// </summary>
+		[UriAttribute("wmq.ReadAheadAllowed")]
+		public ReadAheadAllowed ReadAheadAllowed
+		{
+			get { return XMSConvert.ToReadAheadAllowed(this.XMSReadAheadAllowed); }
+			set { this.XMSReadAheadAllowed = XMSConvert.ToXMSReadAheadAllowed(value); }
+		}
+
+
+		/// <summary>
+		/// This property determines, for messages being delivered to an
+		/// asynchronous message listener, what happens to messages in the
+		/// internal read ahead buffer when the message consumer is closed.
+		/// </summary>
+		[UriAttribute("wmq.XMSReadAheadClosePolicy")]
+		public Int32 XMSReadAheadClosePolicy
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_READ_AHEAD_CLOSE_POLICY); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_READ_AHEAD_CLOSE_POLICY, value); }
+		}
+
+		/// <summary>
+		/// This property determines, for messages being delivered to an
+		/// asynchronous message listener, what happens to messages in the
+		/// internal read ahead buffer when the message consumer is closed.
+		/// </summary>
+		[UriAttribute("wmq.ReadAheadClosePolicy")]
+		public ReadAheadClosePolicy ReadAheadClosePolicy
+		{
+			get { return XMSConvert.ToReadAheadClosePolicy(this.XMSReadAheadClosePolicy); }
+			set { this.XMSReadAheadClosePolicy = XMSConvert.ToXMSReadAheadClosePolicy(value); }
+		}
+
+		/// <summary>
+		/// Destination property that sets the target CCSID for queue manager
+		/// message conversion. The value is ignored unless
+		/// <c>XMSC.WMQ_RECEIVE_CONVERSION</c> is set to
+		/// <c>WMQ_RECEIVE_CONVERSION_QMGR</c>.
+		/// </summary>
+		[UriAttribute("wmq.ReceiveCCSID")]
+		public Int32 ReceiveCCSID
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_RECEIVE_CCSID); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_RECEIVE_CCSID, value); }
+		}
+
+		/// <summary>
+		/// Destination property that determines whether data conversion is
+		/// going to be performed by the queue manager.
+		/// </summary>
+		[UriAttribute("wmq.XMSReceiveConversion")]
+		public Int32 XMSReceiveConversion
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_RECEIVE_CONVERSION); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_RECEIVE_CONVERSION, value); }
+		}
+
+		/// <summary>
+		/// Destination property that determines whether data conversion is
+		/// going to be performed by the queue manager.
+		/// </summary>
+		[UriAttribute("wmq.ReceiveConversion")]
+		public ReceiveConversion ReceiveConversion
+		{
+			get { return XMSConvert.ToReceiveConversion(this.XMSReceiveConversion); }
+			set { this.XMSReceiveConversion = XMSConvert.ToXMSReceiveConversion(value); }
+		}
+
+		/// <summary>
+		/// Whether messages sent to the destination contain an <c>MQRFH2</c>
+		/// header.
+		/// </summary>
+		[UriAttribute("wmq.XMSTargetClient")]
+		public Int32 XMSTargetClient
+		{
+			get { return this.xmsDestination.GetIntProperty(XMSC.WMQ_TARGET_CLIENT); }
+			set { this.xmsDestination.SetIntProperty(XMSC.WMQ_TARGET_CLIENT, value); }
+		}
+
+		/// <summary>
+		/// Whether messages sent to the destination contain an <c>MQRFH2</c>
+		/// header.
+		/// </summary>
+		[UriAttribute("wmq.TargetClient")]
+		public TargetClient TargetClient
+		{
+			get { return XMSConvert.ToTargetClient(this.XMSTargetClient); }
+			set { this.XMSTargetClient = XMSConvert.ToXMSTargetClient(value); }
+		}
+
+		/// <summary>
+		/// When creating temporary topics, XMS generates a topic string of
+		/// the form "TEMP/TEMPTOPICPREFIX/unique_id", or if this property
+		/// contains the default value, then this string, "TEMP/unique_id",
+		/// is generated. Specifying a non-empty value allows specific model
+		/// queues to be defined for creating the managed queues for subscribers
+		/// to temporary topics created under this connection.
+		/// </summary>
+		[UriAttribute("wmq.TemporaryTopicPrefix")]
+		public string WMQTemporaryTopicPrefix
+		{
+			get { return this.xmsDestination.GetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX); }
+			set { this.xmsDestination.SetStringProperty(XMSC.WMQ_TEMP_TOPIC_PREFIX, value); }
+		}
+
+		#endregion
+
+		#region WPM-specific properties
+
+		/// <summary>
+		/// The name of the service integration bus in which the destination
+		/// exists.
+		/// </summary>
+		[UriAttribute("wpm.BusName")]
+		public string BusName
+		{
+			get { return this.xmsDestination.GetStringProperty(XMSC.WPM_BUS_NAME); }
+			set { this.xmsDestination.SetStringProperty(XMSC.WPM_BUS_NAME, value); }
+		}
+
+
+		/// <summary>
+		/// The name of the topic space that contains the topic.
+		/// </summary>
+		[UriAttribute("wpm.TopicSpace")]
+		public string TopicSpace
+		{
+			get { return this.xmsDestination.GetStringProperty(XMSC.WPM_TOPIC_SPACE); }
+			set { this.xmsDestination.SetStringProperty(XMSC.WPM_TOPIC_SPACE, value); }
+		}
+
+		#endregion
+
+		#endregion
+
+		#region IDisposable implementation
+
+		public void Dispose()
+		{
+		}
+
+		#endregion
+	}
+}

http://git-wip-us.apache.org/repos/asf/activemq-nms-xms/blob/653d676d/src/main/csharp/InitialContext.cs
----------------------------------------------------------------------
diff --git a/src/main/csharp/InitialContext.cs b/src/main/csharp/InitialContext.cs
new file mode 100644
index 0000000..3b9ed83
--- /dev/null
+++ b/src/main/csharp/InitialContext.cs
@@ -0,0 +1,174 @@
+/*
+ * 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.Collections.Specialized;
+using Apache.NMS.XMS.Util;
+using Apache.NMS.Policies;
+using Apache.NMS.Util;
+using IBM.XMS;
+
+namespace Apache.NMS.XMS
+{
+	/// <summary>
+	/// An Initial Context for querying object repositories for object
+    /// definitions.
+	/// </summary>
+	public class InitialContext : IDisposable
+	{
+        public IBM.XMS.InitialContext xmsInitialContext;
+
+        #region Constructors
+
+        /// <summary>
+        /// Constructs an <c>InitialContext</c> object.
+        /// </summary>
+        /// <param name="environment">Environment settings.</param>
+		public InitialContext(Hashtable environment)
+		{
+            this.xmsInitialContext = new IBM.XMS.InitialContext(environment);
+		}
+
+        /// <summary>
+        /// Constructs an <c>InitialContext</c> object specifying the
+        /// repository URL.
+        /// </summary>
+        /// <param name="environment">Environment settings.</param>
+        /// <param name="repositoryURL">Repository URL.</param>
+		public InitialContext(Hashtable environment, string repositoryURL)
+		{
+            this.xmsInitialContext = new IBM.XMS.InitialContext(environment);
+            this.RepositoryURL = repositoryURL;
+		}
+
+		#endregion
+
+		#region Initial Context Properties (configure via ConnectionFactory URL parameters)
+
+        // http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/props_inctx.htm?lang=en
+
+        /// <summary>
+        /// Repository URL.
+        /// </summary>
+		[UriAttribute("ic.RepositoryURL")]
+        public string RepositoryURL
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_URL]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_URL] = value; }
+        }
+
+        /// <summary>
+        /// Initial context provider URL.
+        /// </summary>
+		[UriAttribute("ic.ProviderURL")]
+        public string ProviderURL
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_PROVIDER_URL]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_PROVIDER_URL] = value; }
+        }
+
+        /// <summary>
+        /// Initial context security protocol.
+        /// </summary>
+		[UriAttribute("ic.SecurityProtocol")]
+        public string SecurityProtocol
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_SECURITY_PROTOCOL]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_SECURITY_PROTOCOL] = value; }
+        }
+
+        /// <summary>
+        /// Initial context security authentication.
+        /// </summary>
+		[UriAttribute("ic.SecurityAuthentication")]
+        public string SecurityAuthentication
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_SECURITY_AUTHENTICATION]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_SECURITY_AUTHENTICATION] = value; }
+        }
+
+        /// <summary>
+        /// Initial context security principal.
+        /// </summary>
+		[UriAttribute("ic.SecurityPrincipal")]
+        public string SecurityPrincipal
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_SECURITY_PRINCIPAL]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_SECURITY_PRINCIPAL] = value; }
+        }
+
+        /// <summary>
+        /// Initial context security credentials.
+        /// </summary>
+		[UriAttribute("ic.SecurityCredentials")]
+        public string SecurityCredentials
+        {
+            get { return (string)this.xmsInitialContext.Environment[XMSC.IC_SECURITY_CREDENTIALS]; }
+            set { this.xmsInitialContext.Environment[XMSC.IC_SECURITY_CREDENTIALS] = value; }
+        }
+
+        #endregion
+
+        #region InitialContext Methods
+
+        /// <summary>
+        /// Create an object from an object definition that is retrieved from
+        /// the repository of administered objects.
+        /// </summary>
+        /// <param name="objectName">Requested object name.</param>
+        /// <returns>Requested object, or null if the requested object is
+        /// not found.</returns>
+        public object Lookup(string objectName)
+        {
+            return this.xmsInitialContext.Lookup(objectName);
+        }
+
+        /// <summary>
+        /// Add a new property to the environment.
+        /// </summary>
+        /// <param name="propertyName">Property name.</param>
+        /// <param name="propertyValue">Property value.</param>
+        /// <returns>Old property value.</returns>
+        public object AddToEnvironment(
+            string propertyName, object propertyValue)
+        {
+            return this.xmsInitialContext.AddToEnvironment(
+                propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Remove a property from the environment.
+        /// </summary>
+        /// <param name="propertyName">Property name.</param>
+        /// <returns>Old property value.</returns>
+        public object RemoveFromEnvironment(string propertyName)
+        {
+            return this.xmsInitialContext.RemoveFromEnvironment(propertyName);
+        }
+
+        #endregion
+
+        #region IDisposable
+
+        public void Dispose()
+        {
+            this.xmsInitialContext.Close();
+        }
+
+        #endregion
+	}
+}