You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jg...@apache.org on 2008/09/10 02:20:50 UTC

svn commit: r693666 - in /activemq/activemq-dotnet: Apache.NMS.ActiveMQ/trunk/ Apache.NMS.ActiveMQ/trunk/src/main/csharp/ Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/ Apache.NMS.ActiveMQ/trunk/...

Author: jgomes
Date: Tue Sep  9 17:20:49 2008
New Revision: 693666

URL: http://svn.apache.org/viewvc?rev=693666&view=rev
Log:
Added support for wireFormat.MaxInactivityDuration and wireFormat.MaxInactivityDurationInitialDelay.
Enhanced PrimitiveMap to support synchronized access from multiple threads.
Fixes [AMQNET-114]. (See https://issues.apache.org/activemq/browse/AMQNET-114)

Added:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/OpenWire/MaxInactivityDurationTest.cs
Modified:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant.build
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/OpenWireFormat.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/PrimitiveMap.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj
    activemq/activemq-dotnet/Apache.NMS/trunk/src/test/csharp/NMSTestSupport.cs

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant.build
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant.build?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant.build (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant.build Tue Sep  9 17:20:49 2008
@@ -35,6 +35,7 @@
 
   <!-- Repository organized as: organization/module/version/plaform/artifact, platform might be something like 'all' or 'net-2.0/release' -->
   <property name="nunit.dll" value="${basedir}/vendor/Apache.NMS/lib/${current.build.framework}/nunit.framework.dll" dynamic="true"/>
+  <property name="nunit.extensions.dll" value="${basedir}/vendor/Apache.NMS/lib/${current.build.framework}/nunit.framework.extensions.dll" dynamic="true"/>
   <property name="Apache.NMS.dll" value="${basedir}/vendor/Apache.NMS/build/${current.build.framework}/${current.build.config}/Apache.NMS.dll" dynamic="true"/>
   <property name="Apache.NMS.pdb" value="${basedir}/vendor/Apache.NMS/build/${current.build.framework}/${current.build.config}/Apache.NMS.pdb" dynamic="true"/>
   <property name="Apache.NMS.xml" value="${basedir}/vendor/Apache.NMS/build/${current.build.framework}/${current.build.config}/Apache.NMS.xml" dynamic="true"/>
@@ -75,6 +76,7 @@
       <include name="${Apache.NMS.Test.dll}"/>
       <include name="${build.bin.dir}/${project.name}.dll"/>
       <include name="${nunit.dll}"/>
+      <include name="${nunit.extensions.dll}"/>
     </assemblyfileset>
 
     <fileset id="content.filenames">
@@ -88,6 +90,7 @@
       <include name="${Apache.NMS.Test.pdb}"/>
       <include name="${Apache.NMS.Test.xml}"/>
       <include name="${nunit.dll}"/>
+      <include name="${nunit.extensions.dll}"/>
     </fileset>
 
     <fileset id="install.filenames">

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config Tue Sep  9 17:20:49 2008
@@ -16,21 +16,15 @@
 * limitations under the License.
 -->
 <configuration>
-	<defaultURI value="activemq:tcp://devgvapp1:61616">
-		<factoryParams/>
-		<userName value="guest"/>
-		<passWord value="guest"/>
-	</defaultURI>
+	<defaultURI value="activemq:tcp://activemqhost:61616"/>
 
-	<openWireURI value="activemq:tcp://jgomesv1:61616">
+	<maxInactivityDurationURI value="activemq:tcp://activemqhost:61616?wireFormat.MaxInactivityDuration=30000"/>
+
+	<openWireURI value="activemq:tcp://activemqhost:61616">
 		<factoryParams>
 			<param type="string" value="OpenWireTestClient"/>
 		</factoryParams>
+		<userName value="guest"/>
+		<passWord value="guest"/>
 	</openWireURI>
-
-	<stompURI value="activemq:stomp://jgomesv1:61613">
-		<factoryParams>
-			<param type="string" value="STOMPTestClient"/>
-		</factoryParams>
-	</stompURI>
 </configuration>

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs Tue Sep  9 17:20:49 2008
@@ -21,131 +21,174 @@
 
 namespace Apache.NMS.ActiveMQ.Commands
 {
-    //
-    //  Marshalling code for Open Wire Format for WireFormatInfo
-    //
-    //
-    public class WireFormatInfo : BaseCommand, Command, MarshallAware
-    {
-        public const byte ID_WireFormatInfo = 1;
-        static private byte[] MAGIC = new byte[] {
-            'A'&0xFF,
-            'c'&0xFF,
-            't'&0xFF,
-            'i'&0xFF,
-            'v'&0xFF,
-            'e'&0xFF,
-            'M'&0xFF,
-            'Q'&0xFF };
-        
-        byte[] magic = MAGIC;
-        int version;
-        byte[] marshalledProperties;
-        
-        private PrimitiveMap properties;
-        
-        public override string ToString() {
-            return GetType().Name + "["
-                + " Magic=" + Magic
-                + " Version=" + Version
-                + " MarshalledProperties=" + Properties.ToString()
-                + " ]";
-
-        }
-    
-        public override byte GetDataStructureType() {
-            return ID_WireFormatInfo;
-        }
-
-
-        // Properties
-        public byte[] Magic
-        {
-            get { return magic; }
-            set { this.magic = value; }
-        }
-
-        public bool Valid
-        {
-            get
-            {
-                if ( magic == null )
-                    return false;
-                if (magic.Length != MAGIC.Length)
-                    return false;
-                for (int i = 0; i < magic.Length; i++ )
-                {
-                    if( magic[i]!=MAGIC[i] )
-                        return false;
-                }
-                return true;
-            }
-        }
-        
-        public int Version
-        {
-            get { return version; }
-            set { this.version = value; }
-        }
-
-        public byte[] MarshalledProperties
-        {
-            get { return marshalledProperties; }
-            set { this.marshalledProperties = value; }
-        }
-        
-        public IPrimitiveMap Properties
-        {
-            get {
-                if (properties == null)
-                {
-                    properties = PrimitiveMap.Unmarshal(MarshalledProperties);
-                }
-                return properties;
-            }
-        }
-
-        public bool StackTraceEnabled
-        {
-            get { return true.Equals(Properties["StackTraceEnabled"]) ; }
-            set { Properties["StackTraceEnabled"] = value; }
-        }
-        public bool TcpNoDelayEnabled
-        {
-            get { return true.Equals(Properties["TcpNoDelayEnabled"]); }
-            set { Properties["TcpNoDelayEnabled"] = value; }
-        }
-        public bool SizePrefixDisabled
-        {
-            get { return true.Equals(Properties["SizePrefixDisabled"]); }
-            set { Properties["SizePrefixDisabled"] = value; }
-        }
-        public bool TightEncodingEnabled
-        {
-            get { return true.Equals(Properties["TightEncodingEnabled"]); }
-            set { Properties["TightEncodingEnabled"] = value; }
-        }
-        public bool CacheEnabled
-        {
-            get { return true.Equals(Properties["CacheEnabled"]); }
-            set { Properties["CacheEnabled"] = value; }
-        }
-        
-        // MarshallAware interface
-        public override bool IsMarshallAware()
-        {
-            return true;
-        }
-        
-        public override void BeforeMarshall(OpenWireFormat wireFormat)
-        {
-            MarshalledProperties = null;
-            if (properties != null)
-            {
-                MarshalledProperties = properties.Marshal();
-            }
-        }
-        
-
-    }
+	//
+	//  Marshalling code for Open Wire Format for WireFormatInfo
+	//
+	//
+	public class WireFormatInfo : BaseCommand, Command, MarshallAware
+	{
+		public const byte ID_WireFormatInfo = 1;
+		static private byte[] MAGIC = new byte[] {
+			'A'&0xFF,
+			'c'&0xFF,
+			't'&0xFF,
+			'i'&0xFF,
+			'v'&0xFF,
+			'e'&0xFF,
+			'M'&0xFF,
+			'Q'&0xFF };
+
+		byte[] magic = MAGIC;
+		int version;
+		byte[] marshalledProperties;
+
+		private PrimitiveMap properties;
+
+		public override string ToString() {
+			return GetType().Name + "["
+				+ " Magic=" + Magic
+				+ " Version=" + Version
+				+ " MarshalledProperties=" + Properties.ToString()
+				+ " ]";
+
+		}
+
+		public override byte GetDataStructureType() {
+			return ID_WireFormatInfo;
+		}
+
+
+		// Properties
+		public byte[] Magic
+		{
+			get { return magic; }
+			set { this.magic = value; }
+		}
+
+		public bool Valid
+		{
+			get
+			{
+				if(null == magic)
+				{
+					return false;
+				}
+
+				if(magic.Length != MAGIC.Length)
+				{
+					return false;
+				}
+
+				for(int i = 0; i < magic.Length; i++ )
+				{
+					if(magic[i] != MAGIC[i])
+					{
+						return false;
+					}
+				}
+
+				return true;
+			}
+		}
+
+		public int Version
+		{
+			get { return version; }
+			set { this.version = value; }
+		}
+
+		public byte[] MarshalledProperties
+		{
+			get { return marshalledProperties; }
+			set { this.marshalledProperties = value; }
+		}
+
+		public IPrimitiveMap Properties
+		{
+			get
+			{
+				if(null == properties)
+				{
+					properties = PrimitiveMap.Unmarshal(MarshalledProperties);
+				}
+
+				return properties;
+			}
+		}
+
+		public bool CacheEnabled
+		{
+			get { return true.Equals(Properties["CacheEnabled"]); }
+			set { Properties["CacheEnabled"] = value; }
+		}
+		public bool StackTraceEnabled
+		{
+			get { return true.Equals(Properties["StackTraceEnabled"]); }
+			set { Properties["StackTraceEnabled"] = value; }
+		}
+		public bool TcpNoDelayEnabled
+		{
+			get { return true.Equals(Properties["TcpNoDelayEnabled"]); }
+			set { Properties["TcpNoDelayEnabled"] = value; }
+		}
+		public bool SizePrefixDisabled
+		{
+			get { return true.Equals(Properties["SizePrefixDisabled"]); }
+			set { Properties["SizePrefixDisabled"] = value; }
+		}
+		public bool TightEncodingEnabled
+		{
+			get { return true.Equals(Properties["TightEncodingEnabled"]); }
+			set { Properties["TightEncodingEnabled"] = value; }
+		}
+		public long MaxInactivityDuration
+		{
+			get
+			{
+				object prop = Properties["MaxInactivityDuration"];
+				return (null != prop
+							? (long) prop
+							: 0);
+			}
+			set { Properties["MaxInactivityDuration"] = value; }
+		}
+		public long MaxInactivityDurationInitialDelay
+		{
+			get
+			{
+				object prop = Properties["MaxInactivityDurationInitialDelay"];
+				return (null != prop
+							? (long) prop
+							: 0);
+			}
+			set { Properties["MaxInactivityDurationInitialDelay"] = value; }
+		}
+		public int CacheSize
+		{
+			get
+			{
+				object prop = Properties["CacheSize"];
+				return (null != prop
+							? (int) prop
+							: 0);
+			}
+			set { Properties.SetInt("CacheSize", value); }
+		}
+
+		// MarshallAware interface
+		public override bool IsMarshallAware()
+		{
+			return true;
+		}
+
+		public override void BeforeMarshall(OpenWireFormat wireFormat)
+		{
+			MarshalledProperties = null;
+
+			if(properties != null)
+			{
+				MarshalledProperties = properties.Marshal();
+			}
+		}
+	}
 }

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs Tue Sep  9 17:20:49 2008
@@ -460,6 +460,10 @@
 			{
 				DispatchMessage((MessageDispatch) command);
 			}
+			else if(command is KeepAliveInfo)
+			{
+				OnKeepAliveCommand(commandTransport, (KeepAliveInfo) command);
+			}
 			else if(command is WireFormatInfo)
 			{
 				this.brokerWireFormatInfo = (WireFormatInfo) command;
@@ -507,6 +511,23 @@
 			}
 		}
 
+		protected void OnKeepAliveCommand(ITransport commandTransport, KeepAliveInfo info)
+		{
+			Tracer.Info("Keep alive message received.");
+			if(info.ResponseRequired)
+			{
+				try
+				{
+					info.ResponseRequired = false;
+					OneWay(info);
+				}
+				catch(Exception ex)
+				{
+					OnException(commandTransport, ex);
+				}
+			}
+		}
+
 		protected void OnException(ITransport sender, Exception exception)
 		{
 			Tracer.ErrorFormat("Transport Exception: {0}", exception.ToString());

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/OpenWireFormat.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/OpenWireFormat.cs?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/OpenWireFormat.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/OpenWireFormat.cs Tue Sep  9 17:20:49 2008
@@ -25,57 +25,69 @@
 
 namespace Apache.NMS.ActiveMQ.OpenWire
 {
-    /// <summary>
-    /// Implements the <a href="http://activemq.apache.org/openwire.html">OpenWire</a> protocol.
-    /// </summary>
-    public class OpenWireFormat : IWireFormat
-    {
-        
-        private BaseDataStreamMarshaller[] dataMarshallers;
-        private const byte NULL_TYPE = 0;
-		
+	/// <summary>
+	/// Implements the <a href="http://activemq.apache.org/openwire.html">OpenWire</a> protocol.
+	/// </summary>
+	public class OpenWireFormat : IWireFormat
+	{
+
+		private BaseDataStreamMarshaller[] dataMarshallers;
+		private const byte NULL_TYPE = 0;
+
 		private int version;
+		private bool cacheEnabled = false;
 		private bool stackTraceEnabled = false;
-		private bool tightEncodingEnabled = false;
-		private bool sizePrefixDisabled = false;
 		private bool tcpNoDelayEnabled = false;
-        private int minimumVersion=1;
+		private bool sizePrefixDisabled = false;
+		private bool tightEncodingEnabled = false;
+		private long maxInactivityDuration = 0;
+		private long maxInactivityDurationInitialDelay = 0;
+		private int cacheSize = 0;
+		private int minimumVersion=1;
 
-        private WireFormatInfo preferedWireFormatInfo = new WireFormatInfo();
+		private WireFormatInfo preferedWireFormatInfo = new WireFormatInfo();
 		private ITransport transport;
-        
-        public OpenWireFormat()
-        {
-            PreferedWireFormatInfo.StackTraceEnabled = false;
-            PreferedWireFormatInfo.TightEncodingEnabled = false;
-            PreferedWireFormatInfo.TcpNoDelayEnabled = true;
-            PreferedWireFormatInfo.CacheEnabled = false;
-            PreferedWireFormatInfo.SizePrefixDisabled = false;
-            PreferedWireFormatInfo.Version = 2;
-            
-            dataMarshallers = new BaseDataStreamMarshaller[256];
-            Version = 1;
-        }
 
-        public ITransport Transport
+		public OpenWireFormat()
+		{
+			PreferedWireFormatInfo.CacheEnabled = false;
+			PreferedWireFormatInfo.StackTraceEnabled = false;
+			PreferedWireFormatInfo.TcpNoDelayEnabled = true;
+			PreferedWireFormatInfo.SizePrefixDisabled = false;
+			PreferedWireFormatInfo.TightEncodingEnabled = false;
+			PreferedWireFormatInfo.MaxInactivityDuration = 0;
+			PreferedWireFormatInfo.MaxInactivityDurationInitialDelay = 0;
+			PreferedWireFormatInfo.CacheSize = 0;
+			PreferedWireFormatInfo.Version = 2;
+
+			dataMarshallers = new BaseDataStreamMarshaller[256];
+			Version = 1;
+		}
+
+		public ITransport Transport
 		{
 			get { return transport; }
 			set { transport = value; }
 		}
-				
-        public int Version
+
+		public int Version
 		{
-            get { return version; }
+			get { return version; }
 			set
 			{
-
-                Assembly dll = Assembly.GetExecutingAssembly();
-                Type type = dll.GetType("Apache.NMS.ActiveMQ.OpenWire.V"+value+".MarshallerFactory", false);
-                IMarshallerFactory factory = (IMarshallerFactory) Activator.CreateInstance(type);			    
-                factory.configure(this);			    
-			    version = value; 			
+				Assembly dll = Assembly.GetExecutingAssembly();
+				Type type = dll.GetType("Apache.NMS.ActiveMQ.OpenWire.V"+value+".MarshallerFactory", false);
+				IMarshallerFactory factory = (IMarshallerFactory) Activator.CreateInstance(type);
+				factory.configure(this);
+				version = value;
 			}
-        }
+		}
+
+		public bool CacheEnabled
+		{
+			get { return cacheEnabled; }
+			set { cacheEnabled = value; }
+		}
 
 		public bool StackTraceEnabled
 		{
@@ -83,116 +95,142 @@
 			set { stackTraceEnabled = value; }
 		}
 
+		public bool TcpNoDelayEnabled
+		{
+			get { return tcpNoDelayEnabled; }
+			set { tcpNoDelayEnabled = value; }
+		}
+
 		public bool SizePrefixDisabled
 		{
-            get { return sizePrefixDisabled; }
+			get { return sizePrefixDisabled; }
 			set { sizePrefixDisabled = value; }
-        }
+		}
 
-        public bool TightEncodingEnabled 
+		public bool TightEncodingEnabled
 		{
-            get { return tightEncodingEnabled; }
+			get { return tightEncodingEnabled; }
 			set { tightEncodingEnabled = value; }
-        }
+		}
 
-		public bool TcpNoDelayEnabled
+		public long MaxInactivityDuration
 		{
-			get { return tcpNoDelayEnabled; }
-			set { tcpNoDelayEnabled = value; }
+			get { return maxInactivityDuration; }
+			set { maxInactivityDuration = value; }
+		}
+
+		public long MaxInactivityDurationInitialDelay
+		{
+			get { return maxInactivityDurationInitialDelay; }
+			set { maxInactivityDurationInitialDelay = value; }
+		}
+
+		public int CacheSize
+		{
+			get { return cacheSize; }
+			set { cacheSize = value; }
 		}
 
-        public WireFormatInfo PreferedWireFormatInfo
-        {
-            get { return preferedWireFormatInfo; }
-            set { preferedWireFormatInfo = value; }
-        }
-
-        public void clearMarshallers()
-        {
-            for (int i=0; i < dataMarshallers.Length; i++ )
-            {
-                dataMarshallers[i] = null;
-            }
-        }
-        
-        public void addMarshaller(BaseDataStreamMarshaller marshaller)
-        {
-            byte type = marshaller.GetDataStructureType();
-            dataMarshallers[type & 0xFF] = marshaller;
-        }
-        
-        public void Marshal(Object o, BinaryWriter ds)
-        {
-            int size = 1;
-            if (o != null)
-            {
-                DataStructure c = (DataStructure) o;
-                byte type = c.GetDataStructureType();
-                BaseDataStreamMarshaller dsm = dataMarshallers[type & 0xFF];
-                if (dsm == null)
-                    throw new IOException("Unknown data type: " + type);
+		public WireFormatInfo PreferedWireFormatInfo
+		{
+			get { return preferedWireFormatInfo; }
+			set { preferedWireFormatInfo = value; }
+		}
 
-                if(tightEncodingEnabled) {
-					
+		public void clearMarshallers()
+		{
+			for (int i=0; i < dataMarshallers.Length; i++ )
+			{
+				dataMarshallers[i] = null;
+			}
+		}
+
+		public void addMarshaller(BaseDataStreamMarshaller marshaller)
+		{
+			byte type = marshaller.GetDataStructureType();
+			dataMarshallers[type & 0xFF] = marshaller;
+		}
+
+		public void Marshal(Object o, BinaryWriter ds)
+		{
+			int size = 1;
+			if(o != null)
+			{
+				DataStructure c = (DataStructure) o;
+				byte type = c.GetDataStructureType();
+				BaseDataStreamMarshaller dsm = dataMarshallers[type & 0xFF];
+				if(dsm == null)
+				{
+					throw new IOException("Unknown data type: " + type);
+				}
+
+				if(tightEncodingEnabled)
+				{
 					BooleanStream bs = new BooleanStream();
 					size += dsm.TightMarshal1(this, c, bs);
 					size += bs.MarshalledSize();
-					
-                    if( !sizePrefixDisabled ) {
+
+					if(!sizePrefixDisabled)
+					{
 						ds.Write(size);
 					}
-					
+
 					ds.Write(type);
 					bs.Marshal(ds);
 					dsm.TightMarshal2(this, c, ds, bs);
-					
-				} else {
-					
+				}
+				else
+				{
 					BinaryWriter looseOut = ds;
 					MemoryStream ms = null;
 					// If we are prefixing then we need to first write it to memory,
 					// otherwise we can write direct to the stream.
-					if( !sizePrefixDisabled ) {
-						ms= new MemoryStream();
+					if(!sizePrefixDisabled)
+					{
+						ms = new MemoryStream();
 						looseOut = new OpenWireBinaryWriter(ms);
 						looseOut.Write(size);
 					}
-					
+
 					looseOut.Write(type);
 					dsm.LooseMarshal(this, c, looseOut);
-					
-					if( !sizePrefixDisabled ) {
-						ms.Position=0;
-						looseOut.Write( (int)ms.Length-4 );
-						ds.Write(ms.GetBuffer(), 0, (int)ms.Length);
+
+					if(!sizePrefixDisabled)
+					{
+						ms.Position = 0;
+						looseOut.Write((int) ms.Length - 4);
+						ds.Write(ms.GetBuffer(), 0, (int) ms.Length);
 					}
 				}
-            }
-            else
-            {
-                ds.Write(size);
-                ds.Write(NULL_TYPE);
-            }
-        }
-        
-        public Object Unmarshal(BinaryReader dis)
-        {
-            // lets ignore the size of the packet
+			}
+			else
+			{
+				ds.Write(size);
+				ds.Write(NULL_TYPE);
+			}
+		}
+
+		public Object Unmarshal(BinaryReader dis)
+		{
+			// lets ignore the size of the packet
 			if(!sizePrefixDisabled)
 			{
 				dis.ReadInt32();
 			}
-            
-            // first byte is the type of the packet
-            byte dataType = dis.ReadByte();
-            if(dataType != NULL_TYPE)
-            {
-                BaseDataStreamMarshaller dsm = dataMarshallers[dataType & 0xFF];
-                if (dsm == null)
-                    throw new IOException("Unknown data type: " + dataType);
-                Tracer.Debug("Parsing type: " + dataType + " with: " + dsm);
-                Object data = dsm.CreateObject();
-				
+
+			// first byte is the type of the packet
+			byte dataType = dis.ReadByte();
+			if(dataType != NULL_TYPE)
+			{
+				BaseDataStreamMarshaller dsm = dataMarshallers[dataType & 0xFF];
+				if(dsm == null)
+				{
+					throw new IOException("Unknown data type: " + dataType);
+				}
+
+				Tracer.Debug("Parsing type: " + dataType + " with: " + dsm);
+				Object data = dsm.CreateObject();
+
 				if(tightEncodingEnabled)
 				{
 					BooleanStream bs = new BooleanStream();
@@ -205,172 +243,173 @@
 					dsm.LooseUnmarshal(this, data, dis);
 					return data;
 				}
-            }
-            else
-            {
-                return null;
-            }
-        }
-        
-        public int TightMarshalNestedObject1(DataStructure o, BooleanStream bs)
-        {
-            bs.WriteBoolean(o != null);
+			}
+			else
+			{
+				return null;
+			}
+		}
+
+		public int TightMarshalNestedObject1(DataStructure o, BooleanStream bs)
+		{
+			bs.WriteBoolean(o != null);
 			if(o == null)
 			{
 				return 0;
 			}
-            
-            if(o.IsMarshallAware())
-            {
-                MarshallAware ma = (MarshallAware) o;
-                byte[] sequence = ma.GetMarshalledForm(this);
-                bs.WriteBoolean(sequence != null);
-                if (sequence != null)
-                {
-                    return 1 + sequence.Length;
-                }
-            }
-            
-            byte type = o.GetDataStructureType();
-            if (type == 0)
+
+			if(o.IsMarshallAware())
 			{
-                throw new IOException("No valid data structure type for: " + o + " of type: " + o.GetType());
-            }
+				MarshallAware ma = (MarshallAware) o;
+				byte[] sequence = ma.GetMarshalledForm(this);
+				bs.WriteBoolean(sequence != null);
+				if (sequence != null)
+				{
+					return 1 + sequence.Length;
+				}
+			}
+
+			byte type = o.GetDataStructureType();
+			if (type == 0)
+			{
+				throw new IOException("No valid data structure type for: " + o + " of type: " + o.GetType());
+			}
 
-            BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
+			BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
 			if(dsm == null)
 			{
 				throw new IOException("Unknown data type: " + type);
 			}
-            Tracer.Debug("Marshalling type: " + type + " with structure: " + o);
-            return 1 + dsm.TightMarshal1(this, o, bs);
-        }
-        
-        public void TightMarshalNestedObject2(DataStructure o, BinaryWriter ds, BooleanStream bs)
-        {
+			Tracer.Debug("Marshalling type: " + type + " with structure: " + o);
+			return 1 + dsm.TightMarshal1(this, o, bs);
+		}
+
+		public void TightMarshalNestedObject2(DataStructure o, BinaryWriter ds, BooleanStream bs)
+		{
 			if(!bs.ReadBoolean())
 			{
 				return;
 			}
-            
-            byte type = o.GetDataStructureType();
-            ds.Write(type);
-            
-            if(o.IsMarshallAware() && bs.ReadBoolean())
-            {
-                MarshallAware ma = (MarshallAware) o;
-                byte[] sequence = ma.GetMarshalledForm(this);
-                ds.Write(sequence, 0, sequence.Length);
-            }
-            else
-            {
-                
-                BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
+
+			byte type = o.GetDataStructureType();
+			ds.Write(type);
+
+			if(o.IsMarshallAware() && bs.ReadBoolean())
+			{
+				MarshallAware ma = (MarshallAware) o;
+				byte[] sequence = ma.GetMarshalledForm(this);
+				ds.Write(sequence, 0, sequence.Length);
+			}
+			else
+			{
+
+				BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
 				if(dsm == null)
 				{
 					throw new IOException("Unknown data type: " + type);
 				}
-                dsm.TightMarshal2(this, o, ds, bs);
-            }
-        }
-        
-        public DataStructure TightUnmarshalNestedObject(BinaryReader dis, BooleanStream bs)
-        {
-            if(bs.ReadBoolean())
-            {
-                byte dataType = dis.ReadByte();
-                BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF];
+				dsm.TightMarshal2(this, o, ds, bs);
+			}
+		}
+
+		public DataStructure TightUnmarshalNestedObject(BinaryReader dis, BooleanStream bs)
+		{
+			if(bs.ReadBoolean())
+			{
+				byte dataType = dis.ReadByte();
+				BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF];
 				if(dsm == null)
 				{
 					throw new IOException("Unknown data type: " + dataType);
 				}
-                DataStructure data = dsm.CreateObject();
-                
-                if(data.IsMarshallAware() && bs.ReadBoolean())
-                {
-                    dis.ReadInt32();
-                    dis.ReadByte();
-                    
-                    BooleanStream bs2 = new BooleanStream();
-                    bs2.Unmarshal(dis);
-                    dsm.TightUnmarshal(this, data, dis, bs2);
-                    
-                    // TODO: extract the sequence from the dis and associate it.
-                    //                MarshallAware ma = (MarshallAware)data
-                    //                ma.setCachedMarshalledForm(this, sequence);
-                }
-                else
-                {
-                    dsm.TightUnmarshal(this, data, dis, bs);
-                }
-                
-                return data;
-            }
-            else
-            {
-                return null;
-            }
-        }
-
-
-        
-        public void LooseMarshalNestedObject(DataStructure o, BinaryWriter dataOut)
-        {
+				DataStructure data = dsm.CreateObject();
+
+				if(data.IsMarshallAware() && bs.ReadBoolean())
+				{
+					dis.ReadInt32();
+					dis.ReadByte();
+
+					BooleanStream bs2 = new BooleanStream();
+					bs2.Unmarshal(dis);
+					dsm.TightUnmarshal(this, data, dis, bs2);
+
+					// TODO: extract the sequence from the dis and associate it.
+					//                MarshallAware ma = (MarshallAware)data
+					//                ma.setCachedMarshalledForm(this, sequence);
+				}
+				else
+				{
+					dsm.TightUnmarshal(this, data, dis, bs);
+				}
+
+				return data;
+			}
+			else
+			{
+				return null;
+			}
+		}
+
+
+
+		public void LooseMarshalNestedObject(DataStructure o, BinaryWriter dataOut)
+		{
 			dataOut.Write(o!=null);
 			if(o != null)
 			{
 				byte type = o.GetDataStructureType();
 				dataOut.Write(type);
-                BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
+				BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[type & 0xFF];
 				if(dsm == null)
 				{
 					throw new IOException("Unknown data type: " + type);
 				}
 				dsm.LooseMarshal(this, o, dataOut);
 			}
-        }
-        
-        public DataStructure LooseUnmarshalNestedObject(BinaryReader dis)
-        {
-            if(dis.ReadBoolean())
-            {
-                byte dataType = dis.ReadByte();
-                BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF];
+		}
+
+		public DataStructure LooseUnmarshalNestedObject(BinaryReader dis)
+		{
+			if(dis.ReadBoolean())
+			{
+				byte dataType = dis.ReadByte();
+				BaseDataStreamMarshaller dsm = (BaseDataStreamMarshaller) dataMarshallers[dataType & 0xFF];
 				if(dsm == null)
 				{
 					throw new IOException("Unknown data type: " + dataType);
 				}
-                DataStructure data = dsm.CreateObject();
+				DataStructure data = dsm.CreateObject();
 				dsm.LooseUnmarshal(this, data, dis);
-                return data;
-            }
-            else
-            {
-                return null;
-            }
-        }
-
-        public void renegotiateWireFormat(WireFormatInfo info)
-        {
-            if(info.Version < minimumVersion)
-            {
-                throw new IOException("Remote wire format (" + info.Version +") is lower than the minimum version required (" + minimumVersion + ")");
-            }
+				return data;
+			}
+			else
+			{
+				return null;
+			}
+		}
+
+		public void renegotiateWireFormat(WireFormatInfo info)
+		{
+			if(info.Version < minimumVersion)
+			{
+				throw new IOException("Remote wire format (" + info.Version +") is lower than the minimum version required (" + minimumVersion + ")");
+			}
 
-            this.Version = Math.Min( PreferedWireFormatInfo.Version, info.Version);
-            this.stackTraceEnabled = info.StackTraceEnabled && PreferedWireFormatInfo.StackTraceEnabled;
+			this.Version = Math.Min(PreferedWireFormatInfo.Version, info.Version);
+			this.cacheEnabled = info.CacheEnabled && PreferedWireFormatInfo.CacheEnabled;
+			this.stackTraceEnabled = info.StackTraceEnabled && PreferedWireFormatInfo.StackTraceEnabled;
 			this.tcpNoDelayEnabled = info.TcpNoDelayEnabled && PreferedWireFormatInfo.TcpNoDelayEnabled;
+			this.sizePrefixDisabled = info.SizePrefixDisabled && PreferedWireFormatInfo.SizePrefixDisabled;
 			this.tightEncodingEnabled = info.TightEncodingEnabled && PreferedWireFormatInfo.TightEncodingEnabled;
-            this.sizePrefixDisabled = info.SizePrefixDisabled && PreferedWireFormatInfo.SizePrefixDisabled;
+			this.maxInactivityDuration = info.MaxInactivityDuration;
+			this.maxInactivityDurationInitialDelay = info.MaxInactivityDurationInitialDelay;
+			this.cacheSize = info.CacheSize;
 
 			TcpTransport tcpTransport = this.transport as TcpTransport;
 			if(null != tcpTransport)
 			{
 				tcpTransport.TcpNoDelayEnabled = this.tcpNoDelayEnabled;
 			}
-
-			// The following options is not used client-side.
-			// this.cacheEnabled = info.CacheEnabled && PreferedWireFormatInfo.CacheEnabled;
 		}
-    }
+	}
 }

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/PrimitiveMap.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/PrimitiveMap.cs?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/PrimitiveMap.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/PrimitiveMap.cs Tue Sep  9 17:20:49 2008
@@ -21,527 +21,520 @@
 
 namespace Apache.NMS.ActiveMQ.OpenWire
 {
-    /// <summary>
-    /// A default implementation of IPrimitiveMap
-    /// </summary>
-    public class PrimitiveMap : IPrimitiveMap
-    {
-        public const byte NULL                    = 0;
-        public const byte BOOLEAN_TYPE            = 1;
-        public const byte BYTE_TYPE               = 2;
-        public const byte CHAR_TYPE               = 3;
-        public const byte SHORT_TYPE              = 4;
-        public const byte INTEGER_TYPE            = 5;
-        public const byte LONG_TYPE               = 6;
-        public const byte DOUBLE_TYPE             = 7;
-        public const byte FLOAT_TYPE              = 8;
-        public const byte STRING_TYPE             = 9;
-        public const byte BYTE_ARRAY_TYPE         = 10;
-        public const byte MAP_TYPE                = 11;
-        public const byte LIST_TYPE               = 12;
-        public const byte BIG_STRING_TYPE         = 13;
-
-        private IDictionary dictionary = new Hashtable();
-        
-        public void Clear()
-        {
-            dictionary.Clear();
-        }
-        
-        public bool Contains(Object key)
-        {
-            return dictionary.Contains(key);
-        }
-        
-        public void Remove(Object key)
-        {
-            dictionary.Remove(key);
-        }
-        
-        
-        public int Count
-        {
-            get {
-                return dictionary.Count;
-            }
-        }
-        
-        public ICollection Keys
-        {
-            get {
-                return dictionary.Keys;
-            }
-        }
-        
-        public ICollection Values
-        {
-            get {
-                return dictionary.Values;
-            }
-        }
-        
-        public object this[string key]
-        {
-            get {
-                return GetValue(key);
-            }
-            set {
-                CheckValidType(value);
-                SetValue(key, value);
-            }
-        }
-        
-        public string GetString(string key)
-        {
-            Object value = GetValue(key);
+	/// <summary>
+	/// A default implementation of IPrimitiveMap
+	/// </summary>
+	public class PrimitiveMap : IPrimitiveMap
+	{
+		public const byte NULL                    = 0;
+		public const byte BOOLEAN_TYPE            = 1;
+		public const byte BYTE_TYPE               = 2;
+		public const byte CHAR_TYPE               = 3;
+		public const byte SHORT_TYPE              = 4;
+		public const byte INTEGER_TYPE            = 5;
+		public const byte LONG_TYPE               = 6;
+		public const byte DOUBLE_TYPE             = 7;
+		public const byte FLOAT_TYPE              = 8;
+		public const byte STRING_TYPE             = 9;
+		public const byte BYTE_ARRAY_TYPE         = 10;
+		public const byte MAP_TYPE                = 11;
+		public const byte LIST_TYPE               = 12;
+		public const byte BIG_STRING_TYPE         = 13;
+
+		private IDictionary dictionary = Hashtable.Synchronized(new Hashtable());
+
+		public void Clear()
+		{
+			dictionary.Clear();
+		}
+
+		public bool Contains(Object key)
+		{
+			return dictionary.Contains(key);
+		}
+
+		public void Remove(Object key)
+		{
+			dictionary.Remove(key);
+		}
+
+		public int Count
+		{
+			get { return dictionary.Count; }
+		}
+
+		public ICollection Keys
+		{
+			get { lock(dictionary.SyncRoot) return new ArrayList(dictionary.Keys); }
+		}
+
+		public ICollection Values
+		{
+			get { lock(dictionary.SyncRoot) return new ArrayList(dictionary.Values); }
+		}
+
+		public object this[string key]
+		{
+			get { return GetValue(key); }
+			set
+			{
+				CheckValidType(value);
+				SetValue(key, value);
+			}
+		}
+
+		public string GetString(string key)
+		{
+			Object value = GetValue(key);
 			if( value == null )
 			{
 				return null;
 			}
-            CheckValueType(value, typeof(string));
-            return (string) value;
-        }
-        
-        public void SetString(string key, string value)
-        {
-            SetValue(key, value);
-        }
-        
-        public bool GetBool(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(bool));
-            return (bool) value;
-        }
-        
-        public void SetBool(String key, bool value)
-        {
-            SetValue(key, value);
-        }
-        
-        public byte GetByte(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(byte));
-            return (byte) value;
-        }
-        
-        public void SetByte(String key, byte value)
-        {
-            SetValue(key, value);
-        }
-        
-        public char GetChar(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(char));
-            return (char) value;
-        }
-        
-        public void SetChar(String key, char value)
-        {
-            SetValue(key, value);
-        }
-        
-        public short GetShort(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(short));
-            return (short) value;
-        }
-        
-        public void SetShort(String key, short value)
-        {
-            SetValue(key, value);
-        }
-        
-        public int GetInt(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(int));
-            return (int) value;
-        }
-        
-        public void SetInt(String key, int value)
-        {
-            SetValue(key, value);
-        }
-        
-        public long GetLong(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(long));
-            return (long) value;
-        }
-        
-        public void SetLong(String key, long value)
-        {
-            SetValue(key, value);
-        }
-        
-        public float GetFloat(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(float));
-            return (float) value;
-        }
-        
-        public void SetFloat(String key, float value)
-        {
-            SetValue(key, value);
-        }
-        
-        public double GetDouble(String key)
-        {
-            Object value = GetValue(key);
-            CheckValueType(value, typeof(double));
-            return (double) value;
-        }
-        
-        public void SetDouble(String key, double value)
-        {
-            SetValue(key, value);
-        }
-
-        public IList GetList(String key)
-        {
-            Object value = GetValue(key);
-            if (value != null && !(value is IList))
-            {
-                throw new NMSException("Property: " + key + " is not an IList but is: " + value);
-            }
-            return (IList) value;
-        }
-
-        public void SetList(String key, IList value)
-        {
-            SetValue(key, value);
-        }
-
-        public IDictionary GetDictionary(String key)
-        {
-            Object value = GetValue(key);
-            if (value != null && !(value is IDictionary))
-            {
-                throw new NMSException("Property: " + key + " is not an IDictionary but is: " + value);
-            }
-            return (IDictionary) value;
-        }
-
-        public void SetDictionary(String key, IDictionary value)
-        {
-            SetValue(key, value);
-        }
-
-        
-        protected virtual void SetValue(String key, Object value)
-        {
-            dictionary[key] = value;
-        }
-        
-        
-        protected virtual Object GetValue(String key)
-        {
-            return dictionary[key];
-        }
-        
-        protected virtual void CheckValueType(Object value, Type type)
-        {
-            if (! type.IsInstanceOfType(value))
-            {
-                throw new NMSException("Expected type: " + type.Name + " but was: " + value);
-            }
-        }
-        
-        protected virtual void CheckValidType(Object value)
-        {
-            if (value != null && !(value is IList) && !(value is IDictionary))
-            {
-                Type type = value.GetType();
-                if (! type.IsPrimitive && !type.IsValueType && !type.IsAssignableFrom(typeof(string)))
-                {
-                    throw new NMSException("Invalid type: " + type.Name + " for value: " + value);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Method ToString
-        /// </summary>
-        /// <returns>A string</returns>
-        public override String ToString()
-        {
-            String s="{";
-            bool first=true;
-            foreach (DictionaryEntry entry in dictionary)
-            {
-                if( !first ) {
-                    s+=", ";
-                }
-                first=false;
-                String name = (String) entry.Key;
-                Object value = entry.Value;
-                s+=name+"="+value;
-            }
-            s += "}";
-            return s;
-        }
-
-
-
-
-        /// <summary>
-        /// Unmarshalls the map from the given data or if the data is null just
-        /// return an empty map
-        /// </summary>
-        public static PrimitiveMap Unmarshal(byte[] data)
-        {
-            PrimitiveMap answer = new PrimitiveMap();
-            answer.dictionary = UnmarshalPrimitiveMap(data);
-            return answer;
-        }
-        
-        public byte[] Marshal()
-        {
-            return MarshalPrimitiveMap(dictionary);
-        }
-
-
-        /// <summary>
-        /// Marshals the primitive type map to a byte array
-        /// </summary>
-        public static byte[] MarshalPrimitiveMap(IDictionary map)
-        {
-            if (map == null)
-            {
-                return null;
-            }
-            else
-            {
-                MemoryStream memoryStream = new MemoryStream();
-                MarshalPrimitiveMap(map, new OpenWireBinaryWriter(memoryStream));
-                return memoryStream.GetBuffer();
-            }
-        }
-        
-        public static void MarshalPrimitiveMap(IDictionary map, BinaryWriter dataOut)
-        {
-            if (map == null)
-            {
-                dataOut.Write((int)-1);
-            }
-            else
-            {
-                dataOut.Write(map.Count);
-                foreach (DictionaryEntry entry in map)
-                {
-                    String name = (String) entry.Key;
-                    dataOut.Write(name);
-                    Object value = entry.Value;
-                    MarshalPrimitive(dataOut, value);
-                }
-            }}
-        
-        
-        
-        /// <summary>
-        /// Unmarshals the primitive type map from the given byte array
-        /// </summary>
-        public static  IDictionary UnmarshalPrimitiveMap(byte[] data)
-        {
-            if (data == null)
-            {
-                return new Hashtable();
-            }
-            else
-            {
-                return UnmarshalPrimitiveMap(new OpenWireBinaryReader(new MemoryStream(data)));
-            }
-        }
-        
-        public static  IDictionary UnmarshalPrimitiveMap(BinaryReader dataIn)
-        {
-            int size = dataIn.ReadInt32();
-            if (size < 0)
-            {
-                return null;
-            }
-            else
-            {
-                IDictionary answer = new Hashtable(size);
-                for (int i=0; i < size; i++)
-                {
-                    String name = dataIn.ReadString();
-                    answer[name] = UnmarshalPrimitive(dataIn);
-                }
-                return answer;
-            }
-            
-        }
-
-        public static void MarshalPrimitiveList(IList list, BinaryWriter dataOut)
-        {
-            dataOut.Write((int) list.Count);
-            foreach (Object element in list)
-            {
-                MarshalPrimitive(dataOut, element);
-            }
-        }
-
-        public static IList UnmarshalPrimitiveList(BinaryReader dataIn)
-        {
-            int size = dataIn.ReadInt32();
-            IList answer = new ArrayList(size);
-            while (size-- > 0) {
-                answer.Add(UnmarshalPrimitive(dataIn));
-            }
-            return answer;
-        }
-
-
-        public static void MarshalPrimitive(BinaryWriter dataOut, Object value)
-        {
-            if (value == null)
-            {
-                dataOut.Write(NULL);
-            }
-            else if (value is bool)
-            {
-                dataOut.Write(BOOLEAN_TYPE);
-                dataOut.Write((bool) value);
-            }
-            else if (value is byte)
-            {
-                dataOut.Write(BYTE_TYPE);
-                dataOut.Write(((byte)value));
-            }
-            else if (value is char)
-            {
-                dataOut.Write(CHAR_TYPE);
-                dataOut.Write((char) value);
-            }
-            else if (value is short)
-            {
-                dataOut.Write(SHORT_TYPE);
-                dataOut.Write((short) value);
-            }
-            else if (value is int)
-            {
-                dataOut.Write(INTEGER_TYPE);
-                dataOut.Write((int) value);
-            }
-            else if (value is long)
-            {
-                dataOut.Write(LONG_TYPE);
-                dataOut.Write((long) value);
-            }
-            else if (value is float)
-            {
-                dataOut.Write(FLOAT_TYPE);
-                dataOut.Write((float) value);
-            }
-            else if (value is double)
-            {
-                dataOut.Write(DOUBLE_TYPE);
-                dataOut.Write((double) value);
-            }
-            else if (value is byte[])
-            {
-                byte[] data = (byte[]) value;
-                dataOut.Write(BYTE_ARRAY_TYPE);
-                dataOut.Write(data.Length);
-                dataOut.Write(data);
-            }
-            else if (value is string)
-            {
-                string s = (string) value;
-                // is the string big??
-                if (s.Length > 8191)
-                {
-                    dataOut.Write(BIG_STRING_TYPE);
-                    dataOut.Write(s);
-                }
-                else
-                {
-                    dataOut.Write(STRING_TYPE);
-                    dataOut.Write(s);
-                }
-            }
-            else if (value is IDictionary)
-            {
-                dataOut.Write(MAP_TYPE);
-                MarshalPrimitiveMap((IDictionary) value, dataOut);
-            }
-            else if (value is IList)
-            {
-                dataOut.Write(LIST_TYPE);
-                MarshalPrimitiveList((IList) value, dataOut);
-            }
-            else
-            {
-                throw new IOException("Object is not a primitive: " + value);
-            }
-        }
-        
-        public static Object UnmarshalPrimitive(BinaryReader dataIn)
-        {
-            Object value=null;
-            byte type = dataIn.ReadByte();
-            switch (type)
-            {
-                case NULL:
-                    value = null;
-                    break;
-                case BYTE_TYPE:
-                    value = dataIn.ReadByte();
-                    break;
-                case BOOLEAN_TYPE:
-                    value = dataIn.ReadBoolean();
-                    break;
-                case CHAR_TYPE:
-                    value = dataIn.ReadChar();
-                    break;
-                case SHORT_TYPE:
-                    value = dataIn.ReadInt16();
-                    break;
-                case INTEGER_TYPE:
-                    value = dataIn.ReadInt32();
-                    break;
-                case LONG_TYPE:
-                    value = dataIn.ReadInt64();
-                    break;
-                case FLOAT_TYPE:
-                    value = dataIn.ReadSingle();
-                    break;
-                case DOUBLE_TYPE:
-                    value = dataIn.ReadDouble();
-                    break;
-                case BYTE_ARRAY_TYPE:
-                    int size = dataIn.ReadInt32();
-                    byte[] data = new byte[size];
-                    dataIn.Read(data, 0, size);
-                    value = data;
-                    break;
-                case STRING_TYPE:
-                    value = dataIn.ReadString();
-                    break;
-                case BIG_STRING_TYPE:
-                    value = dataIn.ReadString();
-                    break;
-                case MAP_TYPE:
-                    value = UnmarshalPrimitiveMap(dataIn);
-                    break;
-
-                case LIST_TYPE:
-                    value = UnmarshalPrimitiveList(dataIn);
-                    break;
-
-                default:
-                    throw new Exception("Unsupported data type: " + type);
-            }
-            return value;
-        }
+			CheckValueType(value, typeof(string));
+			return (string) value;
+		}
+
+		public void SetString(string key, string value)
+		{
+			SetValue(key, value);
+		}
+
+		public bool GetBool(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(bool));
+			return (bool) value;
+		}
+
+		public void SetBool(String key, bool value)
+		{
+			SetValue(key, value);
+		}
+
+		public byte GetByte(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(byte));
+			return (byte) value;
+		}
+
+		public void SetByte(String key, byte value)
+		{
+			SetValue(key, value);
+		}
+
+		public char GetChar(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(char));
+			return (char) value;
+		}
+
+		public void SetChar(String key, char value)
+		{
+			SetValue(key, value);
+		}
+
+		public short GetShort(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(short));
+			return (short) value;
+		}
+
+		public void SetShort(String key, short value)
+		{
+			SetValue(key, value);
+		}
+
+		public int GetInt(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(int));
+			return (int) value;
+		}
+
+		public void SetInt(String key, int value)
+		{
+			SetValue(key, value);
+		}
+
+		public long GetLong(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(long));
+			return (long) value;
+		}
+
+		public void SetLong(String key, long value)
+		{
+			SetValue(key, value);
+		}
+
+		public float GetFloat(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(float));
+			return (float) value;
+		}
+
+		public void SetFloat(String key, float value)
+		{
+			SetValue(key, value);
+		}
+
+		public double GetDouble(String key)
+		{
+			Object value = GetValue(key);
+			CheckValueType(value, typeof(double));
+			return (double) value;
+		}
+
+		public void SetDouble(String key, double value)
+		{
+			SetValue(key, value);
+		}
+
+		public IList GetList(String key)
+		{
+			Object value = GetValue(key);
+			if (value != null && !(value is IList))
+			{
+				throw new NMSException("Property: " + key + " is not an IList but is: " + value);
+			}
+			return (IList) value;
+		}
+
+		public void SetList(String key, IList value)
+		{
+			SetValue(key, value);
+		}
+
+		public IDictionary GetDictionary(String key)
+		{
+			Object value = GetValue(key);
+			if (value != null && !(value is IDictionary))
+			{
+				throw new NMSException("Property: " + key + " is not an IDictionary but is: " + value);
+			}
+			return (IDictionary) value;
+		}
+
+		public void SetDictionary(String key, IDictionary value)
+		{
+			SetValue(key, value);
+		}
+
+		protected virtual void SetValue(String key, Object value)
+		{
+			dictionary[key] = value;
+		}
+
+		protected virtual Object GetValue(String key)
+		{
+			return dictionary[key];
+		}
+
+		protected virtual void CheckValueType(Object value, Type type)
+		{
+			if (! type.IsInstanceOfType(value))
+			{
+				throw new NMSException("Expected type: " + type.Name + " but was: " + value);
+			}
+		}
+
+		protected virtual void CheckValidType(Object value)
+		{
+			if (value != null && !(value is IList) && !(value is IDictionary))
+			{
+				Type type = value.GetType();
+				if (! type.IsPrimitive && !type.IsValueType && !type.IsAssignableFrom(typeof(string)))
+				{
+					throw new NMSException("Invalid type: " + type.Name + " for value: " + value);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Method ToString
+		/// </summary>
+		/// <returns>A string</returns>
+		public override String ToString()
+		{
+			String s="{";
+			bool first=true;
+			lock(dictionary.SyncRoot)
+			{
+				foreach(DictionaryEntry entry in dictionary)
+				{
+					if(!first)
+					{
+						s+=", ";
+					}
+					first=false;
+					String name = (String) entry.Key;
+					Object value = entry.Value;
+					s += name + "=" + value;
+				}
+			}
+			s += "}";
+			return s;
+		}
+
+		/// <summary>
+		/// Unmarshalls the map from the given data or if the data is null just
+		/// return an empty map
+		/// </summary>
+		public static PrimitiveMap Unmarshal(byte[] data)
+		{
+			PrimitiveMap answer = new PrimitiveMap();
+			answer.dictionary = UnmarshalPrimitiveMap(data);
+			return answer;
+		}
+
+		public byte[] Marshal()
+		{
+			lock(dictionary.SyncRoot)
+			{
+				return MarshalPrimitiveMap(dictionary);
+			}
+		}
+
+		/// <summary>
+		/// Marshals the primitive type map to a byte array
+		/// </summary>
+		public static byte[] MarshalPrimitiveMap(IDictionary map)
+		{
+			if(map == null)
+			{
+				return null;
+			}
+
+			MemoryStream memoryStream = new MemoryStream();
+			lock(map.SyncRoot)
+			{
+				MarshalPrimitiveMap(map, new OpenWireBinaryWriter(memoryStream));
+			}
+
+			return memoryStream.GetBuffer();
+		}
+
+		public static void MarshalPrimitiveMap(IDictionary map, BinaryWriter dataOut)
+		{
+			if(map == null)
+			{
+				dataOut.Write((int)-1);
+			}
+			else
+			{
+				lock(map.SyncRoot)
+				{
+					dataOut.Write(map.Count);
+					foreach(DictionaryEntry entry in map)
+					{
+						String name = (String) entry.Key;
+						dataOut.Write(name);
+						Object value = entry.Value;
+						MarshalPrimitive(dataOut, value);
+					}
+				}
+			}
+		}
+
+		/// <summary>
+		/// Unmarshals the primitive type map from the given byte array
+		/// </summary>
+		public static  IDictionary UnmarshalPrimitiveMap(byte[] data)
+		{
+			if(data == null)
+			{
+				return new Hashtable();
+			}
+			else
+			{
+				return UnmarshalPrimitiveMap(new OpenWireBinaryReader(new MemoryStream(data)));
+			}
+		}
+
+		public static  IDictionary UnmarshalPrimitiveMap(BinaryReader dataIn)
+		{
+			int size = dataIn.ReadInt32();
+			if (size < 0)
+			{
+				return null;
+			}
+
+			IDictionary answer = new Hashtable(size);
+			for(int i = 0; i < size; i++)
+			{
+				String name = dataIn.ReadString();
+				answer[name] = UnmarshalPrimitive(dataIn);
+			}
+
+			return answer;
+		}
+
+		public static void MarshalPrimitiveList(IList list, BinaryWriter dataOut)
+		{
+			dataOut.Write((int) list.Count);
+			foreach (Object element in list)
+			{
+				MarshalPrimitive(dataOut, element);
+			}
+		}
+
+		public static IList UnmarshalPrimitiveList(BinaryReader dataIn)
+		{
+			int size = dataIn.ReadInt32();
+			IList answer = new ArrayList(size);
+			while (size-- > 0)
+			{
+				answer.Add(UnmarshalPrimitive(dataIn));
+			}
+
+			return answer;
+		}
+
+		public static void MarshalPrimitive(BinaryWriter dataOut, Object value)
+		{
+			if (value == null)
+			{
+				dataOut.Write(NULL);
+			}
+			else if (value is bool)
+			{
+				dataOut.Write(BOOLEAN_TYPE);
+				dataOut.Write((bool) value);
+			}
+			else if (value is byte)
+			{
+				dataOut.Write(BYTE_TYPE);
+				dataOut.Write(((byte)value));
+			}
+			else if (value is char)
+			{
+				dataOut.Write(CHAR_TYPE);
+				dataOut.Write((char) value);
+			}
+			else if (value is short)
+			{
+				dataOut.Write(SHORT_TYPE);
+				dataOut.Write((short) value);
+			}
+			else if (value is int)
+			{
+				dataOut.Write(INTEGER_TYPE);
+				dataOut.Write((int) value);
+			}
+			else if (value is long)
+			{
+				dataOut.Write(LONG_TYPE);
+				dataOut.Write((long) value);
+			}
+			else if (value is float)
+			{
+				dataOut.Write(FLOAT_TYPE);
+				dataOut.Write((float) value);
+			}
+			else if (value is double)
+			{
+				dataOut.Write(DOUBLE_TYPE);
+				dataOut.Write((double) value);
+			}
+			else if (value is byte[])
+			{
+				byte[] data = (byte[]) value;
+				dataOut.Write(BYTE_ARRAY_TYPE);
+				dataOut.Write(data.Length);
+				dataOut.Write(data);
+			}
+			else if (value is string)
+			{
+				string s = (string) value;
+				// is the string big??
+				if (s.Length > 8191)
+				{
+					dataOut.Write(BIG_STRING_TYPE);
+					dataOut.Write(s);
+				}
+				else
+				{
+					dataOut.Write(STRING_TYPE);
+					dataOut.Write(s);
+				}
+			}
+			else if (value is IDictionary)
+			{
+				dataOut.Write(MAP_TYPE);
+				MarshalPrimitiveMap((IDictionary) value, dataOut);
+			}
+			else if (value is IList)
+			{
+				dataOut.Write(LIST_TYPE);
+				MarshalPrimitiveList((IList) value, dataOut);
+			}
+			else
+			{
+				throw new IOException("Object is not a primitive: " + value);
+			}
+		}
 
-        
-    }
+		public static Object UnmarshalPrimitive(BinaryReader dataIn)
+		{
+			Object value=null;
+			byte type = dataIn.ReadByte();
+			switch (type)
+			{
+				case NULL:
+					value = null;
+					break;
+				case BYTE_TYPE:
+					value = dataIn.ReadByte();
+					break;
+				case BOOLEAN_TYPE:
+					value = dataIn.ReadBoolean();
+					break;
+				case CHAR_TYPE:
+					value = dataIn.ReadChar();
+					break;
+				case SHORT_TYPE:
+					value = dataIn.ReadInt16();
+					break;
+				case INTEGER_TYPE:
+					value = dataIn.ReadInt32();
+					break;
+				case LONG_TYPE:
+					value = dataIn.ReadInt64();
+					break;
+				case FLOAT_TYPE:
+					value = dataIn.ReadSingle();
+					break;
+				case DOUBLE_TYPE:
+					value = dataIn.ReadDouble();
+					break;
+				case BYTE_ARRAY_TYPE:
+					int size = dataIn.ReadInt32();
+					byte[] data = new byte[size];
+					dataIn.Read(data, 0, size);
+					value = data;
+					break;
+				case STRING_TYPE:
+					value = dataIn.ReadString();
+					break;
+				case BIG_STRING_TYPE:
+					value = dataIn.ReadString();
+					break;
+				case MAP_TYPE:
+					value = UnmarshalPrimitiveMap(dataIn);
+					break;
+				case LIST_TYPE:
+					value = UnmarshalPrimitiveList(dataIn);
+					break;
+
+				default:
+					throw new Exception("Unsupported data type: " + type);
+			}
+			return value;
+		}
+	}
 }

Added: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/OpenWire/MaxInactivityDurationTest.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/OpenWire/MaxInactivityDurationTest.cs?rev=693666&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/OpenWire/MaxInactivityDurationTest.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/OpenWire/MaxInactivityDurationTest.cs Tue Sep  9 17:20:49 2008
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Apache.NMS.Util;
+using NUnit.Framework;
+using NUnit.Framework.Extensions;
+using System.Threading;
+
+namespace Apache.NMS.Test
+{
+	[TestFixture]
+	public class MaxInactivityDurationTest : NMSTestSupport
+	{
+		protected static string DESTINATION_NAME = "TestMaxInactivityDuration";
+		protected static string CORRELATION_ID = "MaxInactivityCorrelationID";
+
+		/// <summary>
+		/// The name of the connection configuration that CreateNMSFactory() will load.
+		/// </summary>
+		/// <returns></returns>
+		protected override string GetNameTestURI() { return "maxInactivityDurationURI"; }
+
+		[Test, Explicit]
+		public void TestMaxInactivityDuration()
+		{
+			using(IConnection connection = CreateConnection())
+			{
+				connection.Start();
+				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
+				{
+					IDestination destination = SessionUtil.GetDestination(session, DESTINATION_NAME);
+					using(IMessageConsumer consumer = session.CreateConsumer(destination))
+					using(IMessageProducer producer = session.CreateProducer(destination))
+					{
+						SendMessage(producer);
+
+						IMessage receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
+						Assert.AreEqual(CORRELATION_ID, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+
+						// Go inactive...
+						Thread.Sleep(TimeSpan.FromSeconds(60));
+
+						// Send another message.
+						SendMessage(producer);
+						receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
+						Assert.AreEqual(CORRELATION_ID, receivedMsg.NMSCorrelationID, "Invalid correlation ID.");
+					}
+				}
+			}
+		}
+
+		protected void SendMessage(IMessageProducer producer)
+		{
+			IMessage request = producer.CreateMessage();
+			request.NMSCorrelationID = CORRELATION_ID;
+			request.NMSType = "Test";
+			producer.Send(request);
+		}
+	}
+}

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj Tue Sep  9 17:20:49 2008
@@ -17,7 +17,8 @@
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
     <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>activemq-dotnet.snk</AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
     <SccProjectName>Svn</SccProjectName>
     <SccLocalPath>Svn</SccLocalPath>
     <SccAuxPath>Svn</SccAuxPath>
@@ -41,6 +42,7 @@
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="nunit.framework.extensions, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
@@ -58,6 +60,7 @@
     <Compile Include="src\test\csharp\OpenWire\EndianTest.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="src\test\csharp\OpenWire\MaxInactivityDurationTest.cs" />
     <Compile Include="src\test\csharp\OpenWire\PrimitiveMapTest.cs">
       <SubType>Code</SubType>
     </Compile>
@@ -78,7 +81,6 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="activemq-dotnet.snk" />
     <Content Include="nmsprovider-test.config">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

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=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj Tue Sep  9 17:20:49 2008
@@ -2,7 +2,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{08321F42-4B3D-4815-B592-95962BAC3B9F}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -10,7 +10,8 @@
     <AssemblyName>Apache.NMS.ActiveMQ</AssemblyName>
     <WarningLevel>4</WarningLevel>
     <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>activemq-dotnet.snk</AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
     <FileUpgradeFlags>
     </FileUpgradeFlags>
     <OldToolsVersion>2.0</OldToolsVersion>
@@ -59,7 +60,6 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="activemq-dotnet.snk" />
     <Content Include="nmsprovider-activemq.config">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

Modified: activemq/activemq-dotnet/Apache.NMS/trunk/src/test/csharp/NMSTestSupport.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS/trunk/src/test/csharp/NMSTestSupport.cs?rev=693666&r1=693665&r2=693666&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS/trunk/src/test/csharp/NMSTestSupport.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS/trunk/src/test/csharp/NMSTestSupport.cs Tue Sep  9 17:20:49 2008
@@ -195,6 +195,16 @@
 		/// </summary>
 		/// <param name="newClientId">Client ID of the new connection.</param>
 		/// <returns></returns>
+		public virtual IConnection CreateConnection()
+		{
+			return CreateConnection(null);
+		}
+
+		/// <summary>
+		/// Create a new connection to the broker.
+		/// </summary>
+		/// <param name="newClientId">Client ID of the new connection.</param>
+		/// <returns></returns>
 		public virtual IConnection CreateConnection(string newClientId)
 		{
 			IConnection newConnection = Factory.CreateConnection(userName, passWord);