Author: jgomes
Date: Fri Oct 24 18:02:55 2008
New Revision: 707803

URL: http://svn.apache.org/viewvc?rev=707803&view=rev
Log:
Integrate patch submitted from Robert Walls for Multicast Discovery support.  
Thanks, Robert!
Fixes [AMQNET-98]. (See https://issues.apache.org/activemq/browse/AMQNET-98)

Added:
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/
   (with props)
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/DiscoveryTransportFactory.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/
   (with props)
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/MulticastDiscoveryAgent.cs
Modified:
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQDestination.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ProducerAck.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/ConnectionFactory.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionState.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionStateTracker.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConsumerState.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ICommandVisitor.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ProducerState.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SessionState.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SynchronizedObjects.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ThreadSimulator.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/Tracked.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/TransactionState.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/DefaultThreadPools.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/PooledTaskRunner.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/Task.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunner.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunnerFactory.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/BackupTransport.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransport.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransportFactory.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/FutureResponse.cs
    
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/TransportFactory.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQDestination.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQDestination.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQDestination.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQDestination.cs
 Fri Oct 24 18:02:55 2008
@@ -440,10 +440,6 @@
                        }
                }
 
-               /// <summary>
-               /// </summary>
-               /// <returns>a list of child destinations if this destination 
represents a composite destination.</returns>
-
                /*public List GetChildDestinations() {
                 List answer = new ArrayList();
                 StringTokenizer iter = new StringTokenizer(physicalName, 
COMPOSITE_SEPARATOR);

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ProducerAck.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ProducerAck.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ProducerAck.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ProducerAck.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -20,17 +20,14 @@
 
 namespace Apache.NMS.ActiveMQ.Commands
 {
-
-       /**
-        * A ProducerAck command is sent by a broker to a producer to let it 
know it has
-        * received and processed messages that it has produced. The producer 
will be
-        * flow controlled if it does not receive ProducerAck commands back 
from the
-        * broker.
-        * 
-        */
+       /// <summary>
+       /// A ProducerAck command is sent by a broker to a producer to let it 
know it has
+       /// received and processed messages that it has produced. The producer 
will be
+       /// flow controlled if it does not receive ProducerAck commands back 
from the
+       /// broker.
+       /// </summary>
        public class ProducerAck : BaseCommand
        {
-
                protected ProducerId myProducerId;
                protected int mySize;
 
@@ -49,10 +46,9 @@
                        return visitor.processProducerAck(this);
                }
 
-               /**
-                * The producer id that this ack message is destined for.
-                * 
-                */
+               /// <summary>
+               /// The producer id that this ack message is destined for.
+               /// </summary>
                public ProducerId ProducerId
                {
                        get
@@ -65,10 +61,9 @@
                        }
                }
 
-               /**
-                * The number of bytes that are being acked.
-                * 
-                */
+               /// <summary>
+               /// The number of bytes that are being acked.
+               /// </summary>
                public int Size
                {
                        get

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/ConnectionFactory.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/ConnectionFactory.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/ConnectionFactory.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/ConnectionFactory.cs
 Fri Oct 24 18:02:55 2008
@@ -30,22 +30,23 @@
                public const string DEFAULT_BROKER_URL = 
"activemq:tcp://localhost:61616";
                public const string ENV_BROKER_URL = "ACTIVEMQ_BROKER_URL";
 
+               private static event ExceptionListener onException;
                private Uri brokerUri;
                private string connectionUserName;
                private string connectionPassword;
                private string clientId;
 
+               static ConnectionFactory()
+               {
+                       TransportFactory.OnException += 
ConnectionFactory.ExceptionHandler;
+               }
+
                public static string GetDefaultBrokerUrl()
                {
 #if (PocketPC||NETCF||NETCF_2_0)
                        return DEFAULT_BROKER_URL;
 #else
-                       string answer = 
Environment.GetEnvironmentVariable(ENV_BROKER_URL);
-                       if(answer == null)
-                       {
-                               answer = DEFAULT_BROKER_URL;
-                       }
-                       return answer;
+                       return 
Environment.GetEnvironmentVariable(ENV_BROKER_URL) ?? DEFAULT_BROKER_URL;
 #endif
                }
 
@@ -83,10 +84,16 @@
                public IConnection CreateConnection(string userName, string 
password)
                {
                        Uri uri = brokerUri;
-                       // Do we need to strip off the activemq prefix??
-                       if("activemq".Equals(brokerUri.Scheme))
+                       string scheme = brokerUri.Scheme;
+
+                       if(null != scheme)
                        {
-                               uri = new Uri(brokerUri.AbsolutePath + 
brokerUri.Query);
+                               // Do we need to strip off the activemq prefix??
+                               scheme = scheme.ToLower();
+                               if("activemq".Equals(scheme))
+                               {
+                                       uri = new Uri(brokerUri.AbsolutePath + 
brokerUri.Query);
+                               }
                        }
 
                        ConnectionInfo info = CreateConnectionInfo(userName, 
password);
@@ -129,7 +136,17 @@
                        set { clientId = value; }
                }
 
-               // Implementation methods
+               public event ExceptionListener OnException
+               {
+                       add { onException += value; }
+                       remove
+                       {
+                               if(onException != null)
+                               {
+                                       onException -= value;
+                               }
+                       }
+               }
 
                protected virtual ConnectionInfo CreateConnectionInfo(string 
userName, string password)
                {
@@ -140,14 +157,8 @@
                        answer.ConnectionId = connectionId;
                        answer.UserName = userName;
                        answer.Password = password;
-                       if(clientId == null)
-                       {
-                               answer.ClientId = CreateNewGuid();
-                       }
-                       else
-                       {
-                               answer.ClientId = clientId;
-                       }
+                       answer.ClientId = clientId ?? CreateNewGuid();
+
                        return answer;
                }
 
@@ -156,5 +167,12 @@
                        return Guid.NewGuid().ToString();
                }
 
+               protected static void ExceptionHandler(Exception ex)
+               {
+                       if(ConnectionFactory.onException != null)
+                       {
+                               ConnectionFactory.onException(ex);
+                       }
+               }
        }
 }

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/CommandVisitorAdapter.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionState.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionState.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionState.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionState.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionStateTracker.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionStateTracker.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionStateTracker.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConnectionStateTracker.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConsumerState.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConsumerState.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConsumerState.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ConsumerState.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ICommandVisitor.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ICommandVisitor.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ICommandVisitor.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ICommandVisitor.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ProducerState.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ProducerState.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ProducerState.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ProducerState.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SessionState.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SessionState.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SessionState.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SessionState.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SynchronizedObjects.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SynchronizedObjects.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SynchronizedObjects.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/SynchronizedObjects.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ThreadSimulator.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ThreadSimulator.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ThreadSimulator.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/ThreadSimulator.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/Tracked.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/Tracked.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/Tracked.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/Tracked.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -15,14 +15,12 @@
  * limitations under the License.
  */
 
-
 using Apache.NMS.ActiveMQ.Commands;
 
 namespace Apache.NMS.ActiveMQ.State
 {
        public class Tracked : Response
        {
-
                private ThreadSimulator runnable = null;
 
                public Tracked(ThreadSimulator runnable)

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/TransactionState.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/TransactionState.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/TransactionState.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/State/TransactionState.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/DefaultThreadPools.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/DefaultThreadPools.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/DefaultThreadPools.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/DefaultThreadPools.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -19,7 +19,7 @@
 {
        public class DefaultThreadPools
        {
-               /***
+               /*
                 * Java's execution model is different enough that I have left 
out
                 * the Executure concept in this implementation. This must be
                 * reviewed to see what is appropriate for the future.
@@ -41,7 +41,7 @@
                {
                        get { return DEFAULT_POOL; }
                }
-               ***/
+               */
 
                private static TaskRunnerFactory DEFAULT_TASK_RUNNER_FACTORY = 
new TaskRunnerFactory();
 

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/PooledTaskRunner.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/PooledTaskRunner.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/PooledTaskRunner.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/PooledTaskRunner.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -54,14 +54,13 @@
                        ThreadPool.QueueUserWorkItem(new WaitCallback(run), 
this);
                }
 
-               /**
-                * We Expect MANY wakeup calls on the same TaskRunner.
-                */
+               /// <summary>
+               /// We Expect MANY wakeup calls on the same TaskRunner.
+               /// </summary>
                public void wakeup()
                {
                        lock(runable)
                        {
-
                                // When we get in here, we make some 
assumptions of state:
                                // queued=false, iterating=false: wakeup() has 
not be called and
                                // therefore task is not executing.
@@ -88,10 +87,10 @@
                        }
                }
 
-               /**
-                * shut down the task
-                *
-                */
+               /// <summary>
+               /// shut down the task
+               /// </summary>
+               /// <param name="timeout"></param>
                public void shutdown(int timeout)
                {
                        lock(runable)

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/Task.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/Task.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/Task.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/Task.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunner.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunner.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunner.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunner.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunnerFactory.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunnerFactory.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunnerFactory.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/TaskRunnerFactory.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -29,7 +29,6 @@
        /// </summary>
        public class TaskRunnerFactory
        {
-
                private int maxIterationsPerRun;
                private String name;
                private ThreadPriority priority;

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/
------------------------------------------------------------------------------
    bugtraq:label = Issue#:

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/
------------------------------------------------------------------------------
--- bugtraq:message (added)
+++ bugtraq:message Fri Oct 24 18:02:55 2008
@@ -0,0 +1 @@
+Fixes [AMQNET-%BUGID%]. (See 
https://issues.apache.org/activemq/browse/AMQNET-%BUGID%)

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/
------------------------------------------------------------------------------
    bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID%

Added: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/DiscoveryTransportFactory.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/DiscoveryTransportFactory.cs?rev=707803&view=auto
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/DiscoveryTransportFactory.cs
 (added)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/DiscoveryTransportFactory.cs
 Fri Oct 24 18:02:55 2008
@@ -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;
+using System.Threading;
+using Apache.NMS.ActiveMQ.Transport.Discovery.Multicast;
+using Apache.NMS.ActiveMQ.Transport.Tcp;
+
+namespace Apache.NMS.ActiveMQ.Transport.Discovery
+{
+       public class DiscoveryTransportFactory : ITransportFactory
+       {
+               private const int TIMEOUT_IN_SECONDS = 20;
+
+               private static Uri discoveredUri;
+               private static MulticastDiscoveryAgent agent;
+               private static string currentServiceName;
+               private static readonly object uriLock = new object();
+               public static event ExceptionListener OnException;
+
+               public DiscoveryTransportFactory()
+               {
+                       currentServiceName = String.Empty;
+               }
+
+               private static void agent_OnNewServiceFound(string brokerName, 
string serviceName)
+               {
+                       lock(uriLock)
+                       {
+                               if(discoveredUri == null)
+                               {
+                                       currentServiceName = serviceName;
+                                       discoveredUri = new 
Uri(currentServiceName);
+                               }
+
+                               // This will end the wait in the 
CreateTransport method.
+                               Monitor.Pulse(uriLock);
+                       }
+               }
+
+               private static void agent_OnServiceRemoved(string brokerName, 
string serviceName)
+               {
+                       if(serviceName == currentServiceName)
+                       {
+                               lock(uriLock)
+                               {
+                                       discoveredUri = null;
+                               }
+
+                               if(OnException != null)
+                               {
+                                       OnException(new Exception("Broker is 
dead!"));
+                               }
+                       }
+               }
+
+               private static MulticastDiscoveryAgent Agent
+               {
+                       get
+                       {
+                               if(agent == null)
+                               {
+                                       agent = new MulticastDiscoveryAgent();
+                                       agent.OnNewServiceFound += 
agent_OnNewServiceFound;
+                                       agent.OnServiceRemoved += 
agent_OnServiceRemoved;
+                               }
+
+                               return agent;
+                       }
+               }
+
+               #region Overloaded FailoverTransportFactory Members
+
+               public ITransport CreateTransport(Uri location)
+               {
+                       if(!Agent.IsStarted)
+                       {
+                               Agent.Start();
+                       }
+
+                       DateTime expireTime = 
DateTime.Now.AddSeconds(TIMEOUT_IN_SECONDS);
+
+                       // If a new broker is found the agent will fire an 
event which will result in discoveredUri being set.
+                       lock(uriLock)
+                       {
+                               while(discoveredUri == null)
+                               {
+                                       if(expireTime < DateTime.Now)
+                                       {
+                                               throw new 
NMSConnectionException(
+                                                       "Unable to find a 
connection before the timeout period expired.");
+                                       }
+
+                                       Monitor.Wait(uriLock, 
TIMEOUT_IN_SECONDS * 1000);
+                               }
+                       }
+
+                       ITransport transport;
+
+                       lock(uriLock)
+                       {
+                               TcpTransportFactory tcpTransFactory = new 
TcpTransportFactory();
+
+                               transport = tcpTransFactory.CreateTransport(new 
Uri(discoveredUri + location.Query));
+                       }
+
+                       return transport;
+               }
+
+               public ITransport CompositeConnect(Uri location)
+               {
+                       throw new NMSConnectionException("Composite connection 
not supported with Discovery transport.");
+               }
+
+               #endregion
+       }
+}

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/
------------------------------------------------------------------------------
    bugtraq:label = Issue#:

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/
------------------------------------------------------------------------------
--- bugtraq:message (added)
+++ bugtraq:message Fri Oct 24 18:02:55 2008
@@ -0,0 +1 @@
+Fixes [AMQNET-%BUGID%]. (See 
https://issues.apache.org/activemq/browse/AMQNET-%BUGID%)

Propchange: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/
------------------------------------------------------------------------------
    bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID%

Added: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/MulticastDiscoveryAgent.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/MulticastDiscoveryAgent.cs?rev=707803&view=auto
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/MulticastDiscoveryAgent.cs
 (added)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Discovery/Multicast/MulticastDiscoveryAgent.cs
 Fri Oct 24 18:02:55 2008
@@ -0,0 +1,328 @@
+/*
+ * 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.Generic;
+using System.ComponentModel;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+
+namespace Apache.NMS.ActiveMQ.Transport.Discovery.Multicast
+{
+       internal delegate void NewBrokerServiceFound(string brokerName, string 
serviceName);
+       internal delegate void BrokerServiceRemoved(string brokerName, string 
serviceName);
+
+       internal class MulticastDiscoveryAgent : IDisposable
+       {
+               public const int MAX_SOCKET_CONNECTION_RETRY_ATTEMPS = 3;
+               public const int DEFAULT_BACKOFF_MILLISECONDS = 100;
+               public const int BACKOFF_MULTIPLIER = 2;
+               public const string DEFAULT_DISCOVERY_URI_STRING = 
"multicast://localhost:6155";
+               private const string TYPE_SUFFIX = "ActiveMQ-4.";
+               private const string ALIVE = "alive";
+               private const string DEAD = "dead";
+               private const char DELIMITER = '%';
+               private const int BUFF_SIZE = 8192;
+               private const string DEFAULT_GROUP = "default";
+               private const int EXPIRATION_OFFSET_IN_SECONDS = 2;
+               private const int WORKER_KILL_TIME_SECONDS = 10;
+               private const int SOCKET_TIMEOUT_MILLISECONDS = 500;
+
+               private string group;
+               private bool isStarted = false;
+               private readonly Uri discoveryUri;
+               private Socket multicastSocket;
+               private IPEndPoint endPoint;
+               private BackgroundWorker worker;
+
+               private event NewBrokerServiceFound onNewServiceFound;
+               private event BrokerServiceRemoved onServiceRemoved;
+
+               /// <summary>
+               /// Indexed by service name
+               /// </summary>
+               private readonly Dictionary<string, RemoteBrokerData> 
remoteBrokers;
+
+               public MulticastDiscoveryAgent()
+               {
+                       discoveryUri = new Uri(DEFAULT_DISCOVERY_URI_STRING);
+                       group = DEFAULT_GROUP;
+                       remoteBrokers = new Dictionary<string, 
RemoteBrokerData>();
+               }
+
+               public void Start()
+               {
+                       if(!isStarted)
+                       {
+                               isStarted = true;
+
+                               if(multicastSocket == null)
+                               {
+                                       int numFailedAttempts = 0;
+                                       int backoffTime = 
DEFAULT_BACKOFF_MILLISECONDS;
+
+                                       while(!TryToConnectSocket())
+                                       {
+                                               numFailedAttempts++;
+
+                                               if(numFailedAttempts > 
MAX_SOCKET_CONNECTION_RETRY_ATTEMPS)
+                                               {
+                                                       throw new 
ApplicationException(
+                                                               "Could not open 
the socket in order to discover advertising brokers.");
+                                               }
+
+                                               Thread.Sleep(backoffTime);
+                                               backoffTime *= 
BACKOFF_MULTIPLIER;
+                                       }
+                               }
+
+                               if(worker == null)
+                               {
+                                       worker = new BackgroundWorker();
+                                       worker.DoWork += worker_DoWork;
+                               }
+
+                               if(!worker.IsBusy)
+                               {
+                                       worker.RunWorkerAsync();
+                               }
+
+                       }
+               }
+
+               public void Stop()
+               {
+                       isStarted = false;
+
+                       DateTime expireTime = 
DateTime.Now.AddSeconds(WORKER_KILL_TIME_SECONDS);
+
+                       //wait for the worker to stop. Give it up to 
WORKER_KILL_TIME_SECONDS
+                       while(worker.IsBusy)
+                       {
+                               if(expireTime < DateTime.Now)
+                               {
+                                       throw new ApplicationException("Unable 
to stop the worker thread.");
+                               }
+                       }
+               }
+
+               private bool TryToConnectSocket()
+               {
+                       bool hasSucceeded = false;
+
+                       try
+                       {
+                               multicastSocket = new 
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+                               endPoint = new IPEndPoint(IPAddress.Any, 
discoveryUri.Port);
+
+                               //We have to allow reuse in the multicast 
socket. Otherwise, we would be unable to use multiple clients on the same 
machine.
+                               
multicastSocket.SetSocketOption(SocketOptionLevel.Socket, 
SocketOptionName.ReuseAddress, 1);
+                               multicastSocket.Bind(endPoint);
+
+                               IPAddress ip = 
IPAddress.Parse(discoveryUri.Host);
+
+                               
multicastSocket.SetSocketOption(SocketOptionLevel.IP, 
SocketOptionName.AddMembership,
+                                                                               
                 new MulticastOption(ip, IPAddress.Any));
+                               multicastSocket.ReceiveTimeout = 
SOCKET_TIMEOUT_MILLISECONDS;
+                               hasSucceeded = true;
+                       }
+                       catch(SocketException)
+                       {
+                       }
+
+                       return hasSucceeded;
+               }
+
+               private void worker_DoWork(object sender, DoWorkEventArgs e)
+               {
+                       Thread.CurrentThread.Name = "Discovery Agent Thread.";
+                       byte[] buffer = new byte[BUFF_SIZE];
+                       string receivedInfoRaw;
+                       string receivedInfo;
+
+                       while(isStarted)
+                       {
+                               try
+                               {
+                                       multicastSocket.Receive(buffer);
+                                       receivedInfoRaw = 
System.Text.Encoding.UTF8.GetString(buffer);
+                                       // We have to remove all of the null 
bytes.
+                                       receivedInfo = 
receivedInfoRaw.Substring(0, receivedInfoRaw.IndexOf("\0"));
+                                       ProcessBrokerMessage(receivedInfo);
+
+                               }
+                               catch(SocketException)
+                               {
+                                       // There was no multicast message sent 
before the timeout expired...Let us try again.
+                               }
+
+                               //We need to clear the buffer.
+                               buffer[0] = 0x0;
+                               ExpireOldServices();
+                       }
+               }
+
+               private void ProcessBrokerMessage(string message)
+               {
+                       string payload;
+                       string brokerName;
+                       string serviceName;
+
+                       if(message.StartsWith(MulticastType))
+                       {
+                               payload = 
message.Substring(MulticastType.Length);
+                               brokerName = GetBrokerName(payload);
+                               serviceName = GetServiceName(payload);
+
+                               if(payload.StartsWith(ALIVE))
+                               {
+                                       ProcessAliveBrokerMessage(brokerName, 
serviceName);
+                               }
+                               else if(payload.StartsWith(DEAD))
+                               {
+                                       ProcessDeadBrokerMessage(brokerName, 
serviceName);
+                               }
+                               else
+                               {
+                                       //Malformed Payload
+                               }
+                       }
+               }
+
+               private void ProcessDeadBrokerMessage(string brokerName, string 
serviceName)
+               {
+                       if(remoteBrokers.ContainsKey(serviceName))
+                       {
+                               remoteBrokers.Remove(serviceName);
+                               if(onServiceRemoved != null)
+                               {
+                                       onServiceRemoved(brokerName, 
serviceName);
+                               }
+                       }
+               }
+
+               private void ProcessAliveBrokerMessage(string brokerName, 
string serviceName)
+               {
+                       if(remoteBrokers.ContainsKey(serviceName))
+                       {
+                               remoteBrokers[serviceName].UpdateHeartBeat();
+                       }
+                       else
+                       {
+                               remoteBrokers.Add(serviceName, new 
RemoteBrokerData(brokerName, serviceName));
+
+                               if(onNewServiceFound != null)
+                               {
+                                       onNewServiceFound(brokerName, 
serviceName);
+                               }
+                       }
+               }
+
+               private static string GetBrokerName(string payload)
+               {
+                       string[] results = payload.Split(DELIMITER);
+                       return results[1];
+               }
+
+               private static string GetServiceName(string payload)
+               {
+                       string[] results = payload.Split(DELIMITER);
+                       return results[2];
+               }
+
+               private void ExpireOldServices()
+               {
+                       DateTime expireTime;
+                       List<RemoteBrokerData> deadServices = new 
List<RemoteBrokerData>();
+
+                       foreach(KeyValuePair<string, RemoteBrokerData> 
brokerService in remoteBrokers)
+                       {
+                               expireTime = 
brokerService.Value.lastHeartBeat.AddSeconds(EXPIRATION_OFFSET_IN_SECONDS);
+                               if(DateTime.Now > expireTime)
+                               {
+                                       deadServices.Add(brokerService.Value);
+                               }
+                       }
+
+                       // Remove all of the dead services
+                       for(int i = 0; i < deadServices.Count; i++)
+                       {
+                               
ProcessDeadBrokerMessage(deadServices[i].brokerName, 
deadServices[i].serviceName);
+                       }
+               }
+
+               public bool IsStarted
+               {
+                       get { return isStarted; }
+               }
+
+               public string Group
+               {
+                       get { return group; }
+                       set { group = value; }
+               }
+
+               internal string MulticastType
+               {
+                       get { return group + "." + TYPE_SUFFIX; }
+               }
+
+               internal event NewBrokerServiceFound OnNewServiceFound
+               {
+                       add { onNewServiceFound += value; }
+                       remove { onNewServiceFound -= value; }
+               }
+
+               internal event BrokerServiceRemoved OnServiceRemoved
+               {
+                       add { onServiceRemoved += value; }
+                       remove { onServiceRemoved += value; }
+               }
+
+               public void Dispose()
+               {
+                       if(isStarted)
+                       {
+                               Stop();
+                       }
+
+                       multicastSocket.Shutdown(SocketShutdown.Both);
+                       multicastSocket = null;
+               }
+
+               internal class RemoteBrokerData
+               {
+                       internal string brokerName;
+                       internal string serviceName;
+                       internal DateTime lastHeartBeat;
+
+                       internal RemoteBrokerData(string brokerName, string 
serviceName)
+                       {
+                               this.brokerName = brokerName;
+                               this.serviceName = serviceName;
+                               this.lastHeartBeat = DateTime.Now;
+                       }
+
+                       internal void UpdateHeartBeat()
+                       {
+                               this.lastHeartBeat = DateTime.Now;
+                       }
+
+               }
+       }
+}

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/BackupTransport.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/BackupTransport.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/BackupTransport.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/BackupTransport.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransport.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransport.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransport.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransport.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -44,7 +44,6 @@
                private Mutex reconnectMutex = new Mutex();
                private Mutex backupMutex = new Mutex();
                private Mutex sleepMutex = new Mutex();
-               private Mutex listenerMutex = new Mutex();
                private ConnectionStateTracker stateTracker = new 
ConnectionStateTracker();
                private Dictionary<int, Command> requestMap = new 
Dictionary<int, Command>();
 
@@ -75,14 +74,8 @@
 
                public TimeSpan RequestTimeout
                {
-                       get
-                       {
-                               return requestTimeout;
-                       }
-                       set
-                       {
-                               requestTimeout = value;
-                       }
+                       get { return requestTimeout; }
+                       set { requestTimeout = value; }
                }
 
                private class FailoverTask : Task
@@ -102,7 +95,7 @@
                                try
                                {
                                        parent.backupMutex.WaitOne();
-                                       if(parent.ConnectedTransport == null && 
!parent.disposed)
+                                       if(parent.ConnectedTransport == null && 
doReconnect)
                                        {
                                                result = parent.doReconnect();
                                                buildBackup = false;
@@ -112,6 +105,7 @@
                                {
                                        parent.backupMutex.ReleaseMutex();
                                }
+
                                if(buildBackup)
                                {
                                        parent.buildBackups();
@@ -165,12 +159,14 @@
                                                {
                                                }
                                        }
+
                                        Tracked t = oo as Tracked;
                                        if(t != null)
                                        {
                                                t.onResponses();
                                        }
                                }
+
                                if(!initialized)
                                {
                                        if(command.IsBrokerInfo)
@@ -185,10 +181,12 @@
                                                                
add(brokerString);
                                                        }
                                                }
+
                                                initialized = true;
                                        }
                                }
                        }
+
                        this.Command(sender, command);
                }
 
@@ -295,6 +293,7 @@
                                {
                                        return;
                                }
+
                                started = false;
                                disposed = true;
                                connected = false;
@@ -313,6 +312,7 @@
                        {
                                reconnectMutex.ReleaseMutex();
                        }
+
                        try
                        {
                                sleepMutex.WaitOne();
@@ -321,6 +321,7 @@
                        {
                                sleepMutex.ReleaseMutex();
                        }
+
                        reconnectTask.shutdown();
                        if(transportToStop != null)
                        {
@@ -330,146 +331,74 @@
 
                public int InitialReconnectDelay
                {
-                       get
-                       {
-                               return _initialReconnectDelay;
-                       }
-                       set
-                       {
-                               _initialReconnectDelay = value;
-                       }
+                       get { return _initialReconnectDelay; }
+                       set { _initialReconnectDelay = value; }
                }
 
                public int MaxReconnectDelay
                {
-                       get
-                       {
-                               return _maxReconnectDelay;
-                       }
-                       set
-                       {
-                               _maxReconnectDelay = value;
-                       }
+                       get { return _maxReconnectDelay; }
+                       set { _maxReconnectDelay = value; }
                }
 
                public int ReconnectDelay
                {
-                       get
-                       {
-                               return _reconnectDelay;
-                       }
-                       set
-                       {
-                               _reconnectDelay = value;
-                       }
+                       get { return _reconnectDelay; }
+                       set { _reconnectDelay = value; }
                }
 
                public int ReconnectDelayExponent
                {
-                       get
-                       {
-                               return _backOffMultiplier;
-                       }
-                       set
-                       {
-                               _backOffMultiplier = value;
-                       }
+                       get { return _backOffMultiplier; }
+                       set { _backOffMultiplier = value; }
                }
 
                public ITransport ConnectedTransport
                {
-                       get
-                       {
-                               return connectedTransport.Value;
-                       }
-                       set
-                       {
-                               connectedTransport.Value = value;
-                       }
+                       get { return connectedTransport.Value; }
+                       set { connectedTransport.Value = value; }
                }
 
                public Uri ConnectedTransportURI
                {
-                       get
-                       {
-                               return connectedTransportURI;
-                       }
-                       set
-                       {
-                               connectedTransportURI = value;
-                       }
+                       get { return connectedTransportURI; }
+                       set { connectedTransportURI = value; }
                }
 
                public int MaxReconnectAttempts
                {
-                       get
-                       {
-                               return _maxReconnectAttempts;
-                       }
-                       set
-                       {
-                               _maxReconnectAttempts = value;
-                       }
+                       get { return _maxReconnectAttempts; }
+                       set { _maxReconnectAttempts = value; }
                }
 
                public bool Randomize
                {
-                       get
-                       {
-                               return _randomize;
-                       }
-                       set
-                       {
-                               _randomize = value;
-                       }
+                       get { return _randomize; }
+                       set { _randomize = value; }
                }
 
                public bool Backup
                {
-                       get
-                       {
-                               return _backup;
-                       }
-                       set
-                       {
-                               _backup = value;
-                       }
+                       get { return _backup; }
+                       set { _backup = value; }
                }
 
                public int BackupPoolSize
                {
-                       get
-                       {
-                               return _backupPoolSize;
-                       }
-                       set
-                       {
-                               _backupPoolSize = value;
-                       }
+                       get { return _backupPoolSize; }
+                       set { _backupPoolSize = value; }
                }
 
                public bool TrackMessages
                {
-                       get
-                       {
-                               return _trackMessages;
-                       }
-                       set
-                       {
-                               _trackMessages = value;
-                       }
+                       get { return _trackMessages; }
+                       set { _trackMessages = value; }
                }
 
                public int MaxCacheSize
                {
-                       get
-                       {
-                               return _maxCacheSize;
-                       }
-                       set
-                       {
-                               _maxCacheSize = value;
-                       }
+                       get { return _maxCacheSize; }
+                       set { _maxCacheSize = value; }
                }
 
                /// <summary>
@@ -486,7 +415,6 @@
                        Exception error = null;
                        try
                        {
-
                                try
                                {
                                        reconnectMutex.WaitOne();
@@ -498,6 +426,7 @@
                                                        // Skipping send of 
ShutdownInfo command when not connected.
                                                        return;
                                                }
+
                                                if(command is RemoveInfo)
                                                {
                                                        // Simulate response to 
RemoveInfo command
@@ -539,6 +468,7 @@
                                                                {
                                                                        
reconnectMutex.WaitOne();
                                                                }
+
                                                                transport = 
ConnectedTransport;
                                                        }
 
@@ -630,6 +560,7 @@
                                Thread.CurrentThread.Interrupt();
                                throw new ThreadInterruptedException();
                        }
+
                        if(!disposed)
                        {
                                if(error != null)
@@ -667,6 +598,7 @@
                                        }
                                }
                        }
+
                        Reconnect();
                }
 
@@ -679,6 +611,7 @@
                                        uris.Remove(u[i]);
                                }
                        }
+
                        Reconnect();
                }
 
@@ -750,6 +683,7 @@
                                {
                                        removed = 
l.Remove(failedConnectTransportURI);
                                }
+
                                if(Randomize)
                                {
                                        // Randomly, reorder the list by random 
swapping
@@ -762,10 +696,12 @@
                                                l[i] = t;
                                        }
                                }
+
                                if(removed)
                                {
                                        l.Add(failedConnectTransportURI);
                                }
+
                                return l;
                        }
                }
@@ -783,6 +719,7 @@
                        {
                                tmpMap = new Dictionary<int, 
Command>(requestMap);
                        }
+
                        foreach(Command command in tmpMap.Values)
                        {
                                t.Oneway(command);
@@ -791,14 +728,8 @@
 
                public bool UseExponentialBackOff
                {
-                       get
-                       {
-                               return _useExponentialBackOff;
-                       }
-                       set
-                       {
-                               _useExponentialBackOff = value;
-                       }
+                       get { return _useExponentialBackOff; }
+                       set { _useExponentialBackOff = value; }
                }
 
                public override String ToString()
@@ -821,10 +752,7 @@
 
                public bool IsFaultTolerant
                {
-                       get
-                       {
-                               return true;
-                       }
+                       get { return true; }
                }
 
                bool doReconnect()
@@ -927,6 +855,7 @@
                                                                {
                                                                        
Tracer.Info("Successfully reconnected to " + uri);
                                                                }
+
                                                                connected = 
true;
                                                                return false;
                                                        }
@@ -943,9 +872,7 @@
                                {
                                        Tracer.Error("Failed to connect to 
transport after: " + connectFailures + " attempt(s)");
                                        connectionFailure = failure;
-
                                        onException(this, connectionFailure);
-
                                        return false;
                                }
                        }
@@ -953,6 +880,7 @@
                        {
                                reconnectMutex.ReleaseMutex();
                        }
+
                        if(!disposed)
                        {
 
@@ -1004,6 +932,7 @@
                                                        backups.Remove(bt);
                                                }
                                        }
+
                                        foreach(Uri uri in connectList)
                                        {
                                                if(ConnectedTransportURI != 
null && !ConnectedTransportURI.Equals(uri))
@@ -1028,6 +957,7 @@
                                                                
Tracer.Debug("Failed to build backup ");
                                                        }
                                                }
+
                                                if(backups.Count < 
BackupPoolSize)
                                                {
                                                        break;
@@ -1039,23 +969,18 @@
                        {
                                backupMutex.ReleaseMutex();
                        }
+
                        return false;
                }
 
                public bool IsDisposed
                {
-                       get
-                       {
-                               return disposed;
-                       }
+                       get { return disposed; }
                }
 
                public bool Connected
                {
-                       get
-                       {
-                               return connected;
-                       }
+                       get { return connected; }
                }
 
                public void Reconnect(Uri uri)
@@ -1080,34 +1005,19 @@
 
                public CommandHandler Command
                {
-                       get
-                       {
-                               return _commandHandler;
-                       }
-                       set
-                       {
-                               _commandHandler = value;
-                       }
+                       get { return _commandHandler; }
+                       set { _commandHandler = value; }
                }
 
                public ExceptionHandler Exception
                {
-                       get
-                       {
-                               return _exceptionHandler;
-                       }
-                       set
-                       {
-                               _exceptionHandler = value;
-                       }
+                       get { return _exceptionHandler; }
+                       set { _exceptionHandler = value; }
                }
 
                public bool IsStarted
                {
-                       get
-                       {
-                               return started;
-                       }
+                       get { return started; }
                }
 
                public void Dispose()
@@ -1122,6 +1032,7 @@
                        {
                                // get rid of unmanaged stuff
                        }
+
                        disposed = true;
                }
 

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransportFactory.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransportFactory.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransportFactory.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/Failover/FailoverTransportFactory.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/FutureResponse.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/FutureResponse.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/FutureResponse.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/FutureResponse.cs
 Fri Oct 24 18:02:55 2008
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 using Apache.NMS.ActiveMQ.Commands;
 using System;
 using System.Threading;

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/TransportFactory.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/TransportFactory.cs?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/TransportFactory.cs
 (original)
+++ 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Transport/TransportFactory.cs
 Fri Oct 24 18:02:55 2008
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -18,6 +18,7 @@
 using System;
 using System.Collections.Generic;
 
+using Apache.NMS.ActiveMQ.Transport.Discovery;
 using Apache.NMS.ActiveMQ.Transport.Failover;
 using Apache.NMS.ActiveMQ.Transport.Tcp;
 
@@ -25,13 +26,49 @@
 {
        public class TransportFactory
        {
-
-               private static Dictionary<String, ITransportFactory> 
TRANSPORT_FACTORYS = new Dictionary<String, ITransportFactory>();
+               private static readonly Dictionary<String, ITransportFactory> 
factoryCache;
+               public static event ExceptionListener OnException;
 
                static TransportFactory()
                {
-                       TRANSPORT_FACTORYS.Add("tcp", new 
TcpTransportFactory());
-                       TRANSPORT_FACTORYS.Add("failover", new 
FailoverTransportFactory());
+                       TransportFactory.factoryCache = new Dictionary<string, 
ITransportFactory>();
+               }
+
+               private static void HandleException(Exception ex)
+               {
+                       if(TransportFactory.OnException != null)
+                       {
+                               TransportFactory.OnException(ex);
+                       }
+               }
+
+               private static ITransportFactory AddTransportFactory(string 
scheme)
+               {
+                       ITransportFactory factory;
+
+                       switch(scheme.ToLower())
+                       {
+                               case "tcp":
+                                       factory = new TcpTransportFactory();
+                                       break;
+                               case "discovery":
+                                       factory = new 
DiscoveryTransportFactory();
+                                       DiscoveryTransportFactory.OnException 
+= TransportFactory.HandleException;
+                                       break;
+                               case "failover":
+                                       factory = new 
FailoverTransportFactory();
+                                       break;
+                               default:
+                                       throw new ApplicationException("The 
transport " + scheme + " is not supported.");
+                       }
+
+                       if(null == factory)
+                       {
+                               throw new ApplicationException("Unable to 
create a transport.");
+                       }
+
+                       TransportFactory.factoryCache.Add(scheme, factory);
+                       return factory;
                }
 
                /// <summary>
@@ -41,32 +78,39 @@
                /// <returns>the transport</returns>
                public static ITransport CreateTransport(Uri location)
                {
-                       ITransportFactory tf = findTransportFactory(location);
+                       ITransportFactory tf = 
TransportFactory.findTransportFactory(location);
                        return tf.CreateTransport(location);
                }
 
                public static ITransport CompositeConnect(Uri location)
                {
-                       ITransportFactory tf = findTransportFactory(location);
+                       ITransportFactory tf = 
TransportFactory.findTransportFactory(location);
                        return tf.CompositeConnect(location);
                }
 
                /// <summary>
+               /// Find the transport factory for the scheme.  We will cache 
the transport
+               /// factory in a lookup table.  If we do not support the 
transport protocol,
+               /// an ApplicationException will be thrown.
                /// </summary>
                /// <param name="location"></param>
                /// <returns></returns>
                private static ITransportFactory findTransportFactory(Uri 
location)
                {
-                       String scheme = location.Scheme;
-                       if(scheme == null)
+                       string scheme = location.Scheme;
+
+                       if(null == scheme)
                        {
                                throw new IOException("Transport not scheme 
specified: [" + location + "]");
                        }
-                       ITransportFactory tf = TRANSPORT_FACTORYS[scheme];
-                       if(tf == null)
+
+                       scheme = scheme.ToLower();
+                       ITransportFactory tf = 
TransportFactory.factoryCache[scheme];
+                       if(null == tf)
                        {
-                               throw new ApplicationException("Transport 
Factory for " + scheme + " does not exist.");
+                               tf = 
TransportFactory.AddTransportFactory(scheme);
                        }
+
                        return tf;
                }
        }

Modified: 
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj?rev=707803&r1=707802&r2=707803&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj 
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj 
Fri Oct 24 18:02:55 2008
@@ -721,6 +721,8 @@
     <Compile Include="src\main\csharp\TransactionContext.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile 
Include="src\main\csharp\Transport\Discovery\DiscoveryTransportFactory.cs" />
+    <Compile 
Include="src\main\csharp\Transport\Discovery\Multicast\MulticastDiscoveryAgent.cs"
 />
     <Compile Include="src\main\csharp\Transport\Failover\BackupTransport.cs" />
     <Compile Include="src\main\csharp\Transport\Failover\FailoverTransport.cs" 
/>
     <Compile 
Include="src\main\csharp\Transport\Failover\FailoverTransportFactory.cs" />


Reply via email to