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 2013/11/16 00:43:14 UTC

svn commit: r1542430 [2/2] - in /activemq/activemq-dotnet/Apache.NMS.MQTT/trunk: ./ src/main/csharp/ src/main/csharp/Commands/ src/main/csharp/Messages/ src/main/csharp/Threads/ src/main/csharp/Transport/ src/main/csharp/Util/

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Topic.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Topic.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Topic.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Topic.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,59 @@
+//
+// 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.MQTT
+{
+	/// <summary>
+	/// MQTT Topic Destination.  
+	/// </summary>
+	public class Topic : ITopic
+	{
+		string name;
+
+		public Topic(string name)
+		{
+			this.name = name;
+		}
+
+		public string TopicName 
+		{ 
+			get { return this.name; }
+		}
+
+		DestinationType DestinationType 
+		{ 
+			get { return DestinationType.Topic; }
+		}
+		
+		bool IsTopic
+		{ 
+			get { return true; }
+		}
+		
+		bool IsQueue 
+		{ 
+			get { return false; }
+		}
+		
+		bool IsTemporary 
+		{ 
+			get { return false; }
+		}
+	}
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Topic.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/BaseCommand.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/BaseCommand.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/BaseCommand.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/BaseCommand.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,151 @@
+//
+// 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.MQTT.Transport
+{
+    public abstract class BaseCommand : Command, ICloneable
+    {
+        private int commandId;
+        private bool responseRequired = false;
+
+        public int CommandId
+        {
+            get { return commandId; }
+            set { this.commandId = value; }
+        }
+
+        public override int GetHashCode()
+        {
+            return (CommandId * 37) + CommandType;
+        }
+
+        public override bool Equals(Object that)
+        {
+            if(that is BaseCommand)
+            {
+                BaseCommand thatCommand = (BaseCommand) that;
+                return this.CommandType == thatCommand.CommandType &&
+                       this.CommandId == thatCommand.CommandId;
+            }
+            return false;
+        }
+
+        public override String ToString()
+        {
+            string answer = CommandName;
+            if(answer.Length == 0)
+            {
+                answer = base.ToString();
+            }
+            return answer + ": id = " + CommandId;
+        }
+
+        public virtual bool ResponseRequired
+        {
+            get { return responseRequired; }
+            set { responseRequired = value; }
+        }
+
+		public virtual bool IsResponse
+		{
+			get { return false; }
+		}
+
+		public virtual bool IsMessageDispatch
+		{
+			get { return false; }
+		}
+
+        public virtual bool IsCONNECT
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsCONNACK
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsDISCONNECT
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPINGREQ
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPINGRESP
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPUBACK
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPUBLISH
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPUBREC
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsPUBREL
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsSUBACK
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsSUBSCRIBE
+        {
+			get { return false; }
+        } 
+
+        public virtual bool IsUNSUBACK
+        {
+			get { return false; }
+        }
+
+        public virtual bool IsUNSUBSCRIBE
+        {
+			get { return false; }
+        }
+
+        public virtual 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.
+            BaseCommand o = (BaseCommand) base.Clone();
+
+            return o;
+        }
+    }
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/BaseCommand.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Command.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Command.cs?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Command.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Command.cs Fri Nov 15 23:43:13 2013
@@ -1,83 +1,122 @@
-/*
- * 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.
- */
+//
+// 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.MQTT.Transport
 {
     /// <summary>
-    /// An Transport Command Marker Interface
+    /// Represents a generic Command class that is sent or received via a ITransport
+	/// instance.  Commands are marshalled and unmarshalled from binary form.
     /// </summary>
     public interface Command : ICloneable
     {
+		int CommandType
+		{
+			get;
+		}
+
+		string CommandName
+		{
+			get;
+		}
+
         int CommandId
         {
-            get;
-            set;
+			get;
         }
 
         bool ResponseRequired
         {
-            get;
-            set;
+			get;
+        }
+
+		bool IsResponse
+		{
+			get; 
+		}
+
+		bool IsMessageDispatch
+		{
+			get; 
+		}
+
+        bool IsCONNECT
+        {
+			get;
+        }
+
+        bool IsCONNACK
+        {
+			get;
+        }
+
+        bool IsDISCONNECT
+        {
+			get;
+        }
+
+        bool IsPINGREQ
+        {
+			get;
         }
 
-        bool IsDestinationInfo
+        bool IsPINGRESP
         {
-            get;
+			get;
         }
 
-        bool IsKeepAliveInfo
+        bool IsPUBACK
         {
-            get;
+			get;
         }
 
-        bool IsMessage
+        bool IsPUBLISH
         {
-            get;
+			get;
         }
 
-        bool IsMessageAck
+        bool IsPUBREC
         {
-            get;
+			get;
         }
 
-        bool IsMessageDispatch
+        bool IsPUBREL
         {
-            get;
+			get;
         }
 
-        bool IsProducerInfo
+        bool IsSUBACK
         {
-            get;
+			get;
         }
 
-        bool IsResponse
+        bool IsSUBSCRIBE
         {
-            get;
+			get;
         }
 
-        bool IsSessionInfo
+        bool IsUNSUBACK
         {
-            get;
+			get;
         }
 
-        bool IsShutdownInfo
+        bool IsUNSUBSCRIBE
         {
-            get;
+			get;
         }
     }
 }

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,91 @@
+/*
+ * 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;
+
+namespace Apache.NMS.MQTT.Transport
+{
+	/// <summary>
+	/// Handles asynchronous responses
+	/// </summary>
+	public class FutureResponse
+	{
+		private TimeSpan maxWait = TimeSpan.FromMilliseconds(Timeout.Infinite);
+		public TimeSpan ResponseTimeout
+		{
+			get { return maxWait; }
+			set { maxWait = value; }
+		}
+
+		private readonly CountDownLatch latch = new CountDownLatch(1);
+		private Response response;
+
+		public Response Response
+		{
+			// Blocks the caller until a value has been set
+			get
+			{
+				lock(latch)
+				{
+					if(null != response)
+					{
+						return response;
+					}
+				}
+
+				try
+				{
+					if(!latch.await(maxWait) && response == null)
+					{
+						throw new RequestTimedOutException(maxWait);
+					}
+				}
+				catch(RequestTimedOutException e)
+				{
+					Tracer.Error("Caught Timeout Exception while waiting on monitor: " + e);
+					throw;
+				}
+				catch(Exception e)
+				{
+					Tracer.Error("Caught Exception while waiting on monitor: " + e);
+				}
+				
+				if(response == null && maxWait.TotalMilliseconds > 0)
+				{
+				}
+
+				lock(latch)
+				{
+					return response;
+				}
+			}
+
+			set
+			{
+				lock(latch)
+				{
+					response = value;
+				}
+
+				latch.countDown();
+			}
+		}
+	}
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/FutureResponse.cs
------------------------------------------------------------------------------
    svn:executable = *

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/ITransport.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/ITransport.cs?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/ITransport.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/ITransport.cs Fri Nov 15 23:43:13 2013
@@ -16,7 +16,6 @@
  */
 
 using System;
-using Apache.NMS.Stomp.Commands;
 
 namespace Apache.NMS.MQTT.Transport
 {
@@ -149,6 +148,36 @@ namespace Apache.NMS.MQTT.Transport
             get;
         }
         
+		/// <summary>
+		/// Returns true if this Transport supports reconnections.
+		/// </summary>
+	    bool IsReconnectSupported
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Returns true if this Transport can accept updated lists of connection Uri's.
+		/// </summary>
+	    bool IsUpdateURIsSupported
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Updates the Uri's that this Transport is aware of and will use to
+		/// connect itself to.  If the rebalance option is true this method will
+		/// terminate any current connection and reconnect to another available
+		/// Uri.
+		/// </summary>
+		/// <param name="rebalance">
+		/// A <see cref="System.Boolean"/>
+		/// </param>
+		/// <param name="updatedURIs">
+		/// A <see cref="Uri"/>
+		/// </param>
+		void UpdateURIs(bool rebalance, Uri[] updatedURIs);
+
 	}
 }
 

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/MQTTTransportFactoryAttribute.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/MQTTTransportFactoryAttribute.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/MQTTTransportFactoryAttribute.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/MQTTTransportFactoryAttribute.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,36 @@
+/*
+ * 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.MQTT.Util;
+
+namespace Apache.NMS.MQTT.Transport
+{
+    /// <summary>
+    /// Attribute that decorates ITransportFactory implementations to allow
+    /// the TransportFactory to find all the available factories dynamically.
+    /// </summary>
+
+    public class MQTTTransportFactoryAttribute : FactoryAttribute
+    {
+        public MQTTTransportFactoryAttribute(string scheme) : base(scheme)
+        {
+        }
+    }
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/MQTTTransportFactoryAttribute.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Response.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Response.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Response.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Response.cs Fri Nov 15 23:43:13 2013
@@ -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;
+
+namespace Apache.NMS.MQTT.Transport
+{
+	/// <summary>
+	/// Response type.
+	/// </summary>
+    public class Response : BaseCommand
+    {
+        int correlationId;
+
+        ///
+        /// <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 + "[ " + 
+                "commandId = " + this.CommandId + ", " + 
+                "responseRequired = " + this.ResponseRequired + ", " + 
+                "CorrelationId = " + CorrelationId + " ]";
+        }
+
+        public int CorrelationId
+        {
+            get { return correlationId; }
+            set { this.correlationId = value; }
+        }
+
+        ///
+        /// <summery>
+        ///  Return an answer of true to the isResponse() query.
+        /// </summery>
+        ///
+        public override bool IsResponse
+        {
+            get { return true; }
+        }
+
+    };
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/Response.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/TransportFactory.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/TransportFactory.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/TransportFactory.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/TransportFactory.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,152 @@
+/*
+ * 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.Collections.Generic;
+using Apache.NMS.MQTT.Util;
+
+namespace Apache.NMS.MQTT.Transport
+{
+    public class TransportFactory
+    {
+        public static event ExceptionListener OnException;
+
+        private static readonly FactoryFinder<MQTTTransportFactoryAttribute, ITransportFactory> FACTORY_FINDER =
+            new FactoryFinder<ActiveMQTransportFactoryAttribute, ITransportFactory>();
+
+        private readonly static object TRANSPORT_FACTORY_TYPES_LOCK = new object();
+        private readonly static IDictionary<String, Type> TRANSPORT_FACTORY_TYPES = new Dictionary<String, Type>();
+
+        public static void HandleException(Exception ex)
+        {
+            if(TransportFactory.OnException != null)
+            {
+                TransportFactory.OnException(ex);
+            }
+        }
+
+        public void RegisterTransportFactory(string scheme, Type factoryType)
+        {
+            lock (TRANSPORT_FACTORY_TYPES_LOCK)
+            {
+                TRANSPORT_FACTORY_TYPES[scheme] = factoryType;
+            }
+        }
+
+        /// <summary>
+        /// Creates a normal transport.
+        /// </summary>
+        /// <param name="location"></param>
+        /// <returns>the transport</returns>
+        public static ITransport CreateTransport(Uri location)
+        {
+            ITransportFactory tf = TransportFactory.CreateTransportFactory(location);
+            return tf.CreateTransport(location);
+        }
+
+        public static ITransport CompositeConnect(Uri location)
+        {
+            ITransportFactory tf = TransportFactory.CreateTransportFactory(location);
+            return tf.CompositeConnect(location);
+        }
+
+        /// <summary>
+        /// Create a transport factory for the scheme.  If we do not support the transport protocol,
+        /// an NMSConnectionException will be thrown.
+        /// </summary>
+        /// <param name="location"></param>
+        /// <returns></returns>
+        private static ITransportFactory CreateTransportFactory(Uri location)
+        {
+            string scheme = location.Scheme;
+
+            if(string.IsNullOrEmpty(scheme))
+            {
+                throw new NMSConnectionException(String.Format("Transport scheme invalid: [{0}]", location.ToString()));
+            }
+
+            ITransportFactory factory = null;
+
+            try
+            {
+                factory = NewInstance(scheme.ToLower());
+            }
+            catch(NMSConnectionException)
+            {
+                throw;
+            }
+            catch(Exception e)
+            {
+                throw new NMSConnectionException("Error creating transport.", e);
+            }
+
+            if(null == factory)
+            {
+                throw new NMSConnectionException("Unable to create a transport.");
+            }
+
+            return factory;
+        }
+
+        private static ITransportFactory NewInstance(string scheme)
+        {
+            try
+            {
+                Type factoryType = FindTransportFactory(scheme);
+
+                if(factoryType == null)
+                {
+                    throw new Exception("NewInstance failed to find a match for id = " + scheme);
+                }
+
+                return (ITransportFactory) Activator.CreateInstance(factoryType);
+            }
+            catch(Exception ex)
+            {
+                Tracer.WarnFormat("NewInstance failed to create an ITransportFactory with error: {0}", ex.Message);
+                throw;
+            }
+        }
+
+        private static Type FindTransportFactory(string scheme)
+        {
+            lock (TRANSPORT_FACTORY_TYPES_LOCK)
+            {
+                if(TRANSPORT_FACTORY_TYPES.ContainsKey(scheme))
+                {
+                    return TRANSPORT_FACTORY_TYPES[scheme];
+                }
+            }
+
+            try
+            {
+                Type factoryType = FACTORY_FINDER.FindFactoryType(scheme);
+
+                lock (TRANSPORT_FACTORY_TYPES_LOCK)
+                {
+                    TRANSPORT_FACTORY_TYPES[scheme] = factoryType;
+                }
+                return factoryType;
+            }
+            catch
+            {
+                throw new NMSConnectionException("Failed to find Factory for Transport type: " + scheme);
+            }
+        }
+    }
+}

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Transport/TransportFactory.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryAttribute.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryAttribute.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryAttribute.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryAttribute.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,45 @@
+/*
+ * 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.MQTT.Util
+{
+    [AttributeUsage(AttributeTargets.Class)]
+    public class FactoryAttribute : Attribute
+    {
+        private string factoryIdentifier;
+        private string description;
+
+        public FactoryAttribute(string factoryIdentifier)
+        {
+            this.factoryIdentifier = factoryIdentifier;
+        }
+
+        public string FactoryIdentifier
+        {
+            get { return this.factoryIdentifier; }
+        }
+
+        public string Description
+        {
+            get { return this.description; }
+            set { this.description = value; }
+        }
+    }
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryAttribute.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryFinder.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryFinder.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryFinder.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryFinder.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,125 @@
+/*
+ * 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.Collections.Generic;
+
+namespace Apache.NMS.MQTT.Util
+{
+    public class FactoryFinder<AttributeType, FactoryType> where AttributeType : FactoryAttribute
+    {
+        private static IDictionary<string, bool> DEFAULT_EXCLUDES;
+
+        static FactoryFinder()
+        {
+            DEFAULT_EXCLUDES = new Dictionary<string, bool>();
+
+            DEFAULT_EXCLUDES.Add("mscorlib", true);
+            DEFAULT_EXCLUDES.Add("System", true);
+            DEFAULT_EXCLUDES.Add("Mono", true);
+            DEFAULT_EXCLUDES.Add("Microsoft", true);
+            DEFAULT_EXCLUDES.Add("nunit", true);
+        }
+
+        public Type FindFactoryType(string factoryId)
+        {
+            try
+            {
+                // Look in this assembly first as its most likely to be the source, if we
+                // don't find it here then we expand out to all the currently loaded
+                // assemblies in the current AppDomain.  We could also start searching
+                // through all referenced assemblies in all the currently loaded ones but
+                // that could get out of hand so try this first.
+                Type result = this.SearchAssembly(Assembly.GetExecutingAssembly(), factoryId);
+
+                if(result == null)
+                {
+                    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
+
+                    foreach(Assembly assembly in assemblies)
+                    {
+                        if(!IsExcluded(assembly))
+                        {
+                            result = SearchAssembly(assembly, factoryId);
+
+                            if(result != null)
+                            {
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                return result;
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+        private bool IsExcluded(Assembly assembly)
+        {
+            if(assembly.Equals(Assembly.GetExecutingAssembly()))
+            {
+                return true;
+            }
+
+            string name = assembly.GetName().Name;
+
+            foreach(string key in DEFAULT_EXCLUDES.Keys)
+            {
+                if(name.StartsWith(key))
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        private Type SearchAssembly(Assembly assembly, string factoryId)
+        {
+            Tracer.DebugFormat("Searching Assembly: {0} for factory of the id: {1}",
+                               assembly.GetName().Name, factoryId);
+
+            Type[] types = assembly.GetTypes();
+
+            foreach(Type type in types)
+            {
+                object[] attributes = type.GetCustomAttributes(false);
+                foreach(Attribute attribute in attributes)
+                {
+                    if(attribute is AttributeType)
+                    {
+                        FactoryAttribute factoryAttribute = (FactoryAttribute)attribute;
+                        if(factoryAttribute.FactoryIdentifier.Equals(factoryId))
+                        {
+                            Tracer.DebugFormat("Found the Factory of type {0} for id: {1}",
+                                               type.ToString(), factoryId);
+                            return type;
+                        }
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FactoryFinder.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FifoMessageDispatchChannel.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FifoMessageDispatchChannel.cs?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FifoMessageDispatchChannel.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/FifoMessageDispatchChannel.cs Fri Nov 15 23:43:13 2013
@@ -18,7 +18,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading;
-using Apache.NMS.MQTT.Commands;
+using Apache.NMS.MQTT.Messages;
 
 namespace Apache.NMS.MQTT.Util
 {

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/IdGenerator.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/IdGenerator.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/IdGenerator.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/IdGenerator.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,193 @@
+/*
+ * 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.Net;
+using System.Net.Sockets;
+using System.Threading;
+
+namespace Apache.NMS.MQTT.Util
+{
+    public class IdGenerator
+    {
+        private static readonly String UNIQUE_STUB;
+        private static int instanceCount;
+        private static readonly String hostName;
+        private readonly String seed;
+        private long sequence;
+    
+        static IdGenerator()
+        {
+            String stub = "-1-" + DateTime.Now.Ticks;
+            hostName = "localhost";
+
+            try
+            {
+                hostName = Dns.GetHostName();
+                IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
+                Socket tempSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+                tempSocket.Bind(endPoint);
+                stub = "-" + ((IPEndPoint)tempSocket.LocalEndPoint).Port + "-" + DateTime.Now.Ticks + "-";
+                Thread.Sleep(100);
+                tempSocket.Close();
+            }
+            catch(Exception ioe)
+            {
+                Tracer.Warn("could not generate unique stub: " + ioe.Message);
+            }
+
+            UNIQUE_STUB = stub;
+        }
+    
+        /**
+         * Construct an IdGenerator
+         */
+        public IdGenerator(String prefix)
+        {
+            lock(UNIQUE_STUB)
+            {
+                this.seed = prefix + UNIQUE_STUB + (instanceCount++) + ":";
+            }
+        }
+
+        public IdGenerator() : this("ID:" + hostName)
+        {
+        }
+    
+        /// <summary>
+        /// As we have to find the hostname as a side-affect of generating a unique
+        /// stub, we allow it's easy retrevial here
+        /// </summary>
+        public static String HostName
+        {
+            get { return hostName; }
+        }
+
+        /// <summary>
+        /// Generate a Unique Id
+        /// </summary>
+        /// <returns>
+        /// A <see cref="String"/>
+        /// </returns>
+        public String GenerateId()
+        {
+            lock(UNIQUE_STUB)
+            {
+                return this.seed + (this.sequence++);
+            }
+        }
+
+        /// <summary>
+        /// Generate a unique ID - that is friendly for a URL or file system
+        /// </summary>
+        /// <returns>
+        /// A <see cref="String"/>
+        /// </returns>
+        public String GenerateSanitizedId()
+        {
+            String result = GenerateId();
+            result = result.Replace(':', '-');
+            result = result.Replace('_', '-');
+            result = result.Replace('.', '-');
+            return result;
+        }
+    
+        /// <summary>
+        /// From a generated id - return the seed (i.e. minus the count)
+        /// </summary>
+        /// <param name="id">
+        /// A <see cref="String"/>
+        /// </param>
+        /// <returns>
+        /// A <see cref="String"/>
+        /// </returns>
+        public static String GetSeedFromId(String id)
+        {
+            String result = id;
+
+            if(id != null)
+            {
+                int index = id.LastIndexOf(':');
+                if(index > 0 && (index + 1) < id.Length)
+                {
+                    result = id.Substring(0, index + 1);
+                }
+            }
+
+            return result;
+        }
+    
+        /// <summary>
+        /// From a generated id - return the generator count
+        /// </summary>
+        /// <param name="id">
+        /// A <see cref="String"/>
+        /// </param>
+        /// <returns>
+        /// A <see cref="System.Int64"/>
+        /// </returns>
+        public static long GetSequenceFromId(String id)
+        {
+            long result = -1;
+            if(id != null)
+            {
+                int index = id.LastIndexOf(':');
+    
+                if(index > 0 && (index + 1) < id.Length)
+                {
+                    String numStr = id.Substring(index + 1, id.Length);
+                    result = Int64.Parse(numStr);
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// Does a proper compare on the ids
+        /// </summary>
+        /// <param name="id1">
+        /// A <see cref="String"/>
+        /// </param>
+        /// <param name="id2">
+        /// A <see cref="String"/>
+        /// </param>
+        /// <returns>
+        /// A <see cref="System.Int32"/>
+        /// </returns>
+        public static int Compare(String id1, String id2)
+        {
+            int result = -1;
+
+            String seed1 = IdGenerator.GetSeedFromId(id1);
+            String seed2 = IdGenerator.GetSeedFromId(id2);
+
+            if(seed1 != null && seed2 != null)
+            {
+                result = seed1.CompareTo(seed2);
+
+                if(result == 0)
+                {
+                    long count1 = IdGenerator.GetSequenceFromId(id1);
+                    long count2 = IdGenerator.GetSequenceFromId(id2);
+                    result = (int)(count1 - count2);
+                }
+            }
+
+            return result;
+        }
+    }
+}

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/IdGenerator.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTDestination.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTDestination.cs?rev=1542430&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTDestination.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTDestination.cs Fri Nov 15 23:43:13 2013
@@ -0,0 +1,33 @@
+//
+// 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.MQTT.Util
+{
+	public class MQTTDestination
+	{
+		private MQTTDestination()
+		{
+		}
+
+		public static IDestination Transform(IDestination destination)
+		{
+			return null;
+		}
+	}
+}
+

Propchange: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTDestination.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTMessageTransformation.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTMessageTransformation.cs?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTMessageTransformation.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MQTTMessageTransformation.cs Fri Nov 15 23:43:13 2013
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+using System;
 using Apache.NMS.Util;
 using Apache.NMS.MQTT.Commands;
 

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MessageDispatchChannel.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MessageDispatchChannel.cs?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MessageDispatchChannel.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/src/main/csharp/Util/MessageDispatchChannel.cs Fri Nov 15 23:43:13 2013
@@ -16,7 +16,7 @@
  */
 
 using System;
-using Apache.NMS.MQTT.Commands;
+using Apache.NMS.MQTT.Messages;
 
 namespace Apache.NMS.MQTT.Util
 {

Modified: activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/vs2008-mqtt.csproj
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/vs2008-mqtt.csproj?rev=1542430&r1=1542429&r2=1542430&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/vs2008-mqtt.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS.MQTT/trunk/vs2008-mqtt.csproj Fri Nov 15 23:43:13 2013
@@ -76,6 +76,19 @@
     <Compile Include="src\main\csharp\Messages\BytesMessage.cs" />
     <Compile Include="src\main\csharp\Messages\MQTTMessage.cs" />
     <Compile Include="src\main\csharp\Transport\Command.cs" />
+    <Compile Include="src\main\csharp\Topic.cs" />
+    <Compile Include="src\main\csharp\Transport\BaseCommand.cs" />
+    <Compile Include="src\main\csharp\Transport\FutureResponse.cs" />
+    <Compile Include="src\main\csharp\Transport\Response.cs" />
+    <Compile Include="src\main\csharp\Threads\TimerEx.cs" />
+    <Compile Include="src\main\csharp\Threads\TimerTask.cs" />
+    <Compile Include="src\main\csharp\Util\FactoryAttribute.cs" />
+    <Compile Include="src\main\csharp\Util\FactoryFinder.cs" />
+    <Compile Include="src\main\csharp\Util\IdGenerator.cs" />
+    <Compile Include="src\main\csharp\ConnectionFailedException.cs" />
+    <Compile Include="src\main\csharp\Util\MQTTDestination.cs" />
+    <Compile Include="src\main\csharp\Transport\TransportFactory.cs" />
+    <Compile Include="src\main\csharp\Transport\MQTTTransportFactoryAttribute.cs" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="keyfile\" />