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/08/27 02:16:06 UTC

svn commit: r689294 - in /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk: nmsprovider-test.config src/main/csharp/Commands/ActiveMQMessage.cs src/main/csharp/Commands/WireFormatInfo.cs src/main/csharp/OpenWire/MessagePropertyHelper.cs

Author: jgomes
Date: Tue Aug 26 17:16:05 2008
New Revision: 689294

URL: http://svn.apache.org/viewvc?rev=689294&view=rev
Log:
Refactor properties to set extension header properties automatically.
Fixes [AMQNET-108]. (See https://issues.apache.org/activemq/browse/AMQNET-108)

Modified:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQMessage.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/MessagePropertyHelper.cs

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=689294&r1=689293&r2=689294&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nmsprovider-test.config Tue Aug 26 17:16:05 2008
@@ -16,7 +16,7 @@
 * limitations under the License.
 -->
 <configuration>
-	<defaultURI value="activemq:tcp://jgomesv1:61616">
+	<defaultURI value="activemq:tcp://devgvapp1:61616">
 		<factoryParams/>
 		<userName value="guest"/>
 		<passWord value="guest"/>

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQMessage.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQMessage.cs?rev=689294&r1=689293&r2=689294&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQMessage.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/ActiveMQMessage.cs Tue Aug 26 17:16:05 2008
@@ -27,83 +27,83 @@
 namespace Apache.NMS.ActiveMQ.Commands
 {
 	public class ActiveMQMessage : Message, IMessage, MarshallAware
-    {
-        public const byte ID_ActiveMQMessage = 23;
-        
-        protected static MessagePropertyHelper propertyHelper = new MessagePropertyHelper();
-        
-        private PrimitiveMap properties;
-        
-        public event AcknowledgeHandler Acknowledger;
-
-        public static ActiveMQMessage Transform(IMessage message)
-        {
-            return (ActiveMQMessage) message;
-        }
-        
-        // TODO generate Equals method
-        // TODO generate GetHashCode method
-        
-        
-        public override byte GetDataStructureType()
-        {
-            return ID_ActiveMQMessage;
-        }
-        
-        public void Acknowledge()
-        {
-            if(null == Acknowledger)
+	{
+		public const byte ID_ActiveMQMessage = 23;
+
+		private MessagePropertyHelper propertyHelper;
+		private PrimitiveMap properties;
+
+		public event AcknowledgeHandler Acknowledger;
+
+		public static ActiveMQMessage Transform(IMessage message)
+		{
+			return (ActiveMQMessage) message;
+		}
+
+		// TODO generate Equals method
+		// TODO generate GetHashCode method
+
+
+		public override byte GetDataStructureType()
+		{
+			return ID_ActiveMQMessage;
+		}
+
+		public void Acknowledge()
+		{
+			if(null == Acknowledger)
 			{
-                throw new NMSException("No Acknowledger has been associated with this message: " + this);
+				throw new NMSException("No Acknowledger has been associated with this message: " + this);
 			}
-            else
+			else
 			{
-                Acknowledger(this);
-            }
+				Acknowledger(this);
+			}
 		}
 
 		#region Properties
 
 		public IPrimitiveMap Properties
-        {
-            get
+		{
+			get
 			{
-                if(null == properties)
-                {
-                    properties = PrimitiveMap.Unmarshal(MarshalledProperties);
-                }
-
-                return properties;
-            }
-        }
-        
-        public IDestination FromDestination
-        {
-            get { return Destination; }
-            set { this.Destination = ActiveMQDestination.Transform(value); }
-        }
-                               
-        /// <summary>
-        /// The correlation ID used to correlate messages with conversations or long running business processes
-        /// </summary>
-        public string NMSCorrelationID
-        {
-            get { return CorrelationId; }
-            set { CorrelationId = value; }
-        }
-        
-        /// <summary>
-        /// The destination of the message
-        /// </summary>
-        public IDestination NMSDestination
-        {
-            get { return Destination; }
-        }
+				if(null == properties)
+				{
+					properties = PrimitiveMap.Unmarshal(MarshalledProperties);
+					propertyHelper = new MessagePropertyHelper(this, properties);
+				}
+
+				return propertyHelper;
+			}
+		}
+
+		public IDestination FromDestination
+		{
+			get { return Destination; }
+			set { this.Destination = ActiveMQDestination.Transform(value); }
+		}
+
+		/// <summary>
+		/// The correlation ID used to correlate messages with conversations or long running business processes
+		/// </summary>
+		public string NMSCorrelationID
+		{
+			get { return CorrelationId; }
+			set { CorrelationId = value; }
+		}
+
+		/// <summary>
+		/// The destination of the message
+		/// </summary>
+		public IDestination NMSDestination
+		{
+			get { return Destination; }
+		}
 
 		private long expirationBaseTime = 0;
 		/// <summary>
-        /// The time in milliseconds that this message should expire in
-        /// </summary>
+		/// The time in milliseconds that this message should expire in
+		/// </summary>
 		public TimeSpan NMSTimeToLive
 		{
 			get
@@ -127,64 +127,64 @@
 		}
 
 		/// <summary>
-        /// The message ID which is set by the provider
-        /// </summary>
-        public string NMSMessageId
-        {
-            get { return BaseDataStreamMarshaller.ToString(MessageId); }
-        }
-        
-        /// <summary>
-        /// Whether or not this message is persistent
-        /// </summary>
-        public bool NMSPersistent
-        {
-            get { return Persistent; }
-            set { Persistent = value; }
-        }
-        
-        /// <summary>
-        /// The Priority on this message
-        /// </summary>
-        public byte NMSPriority
-        {
-            get { return Priority; }
-            set { Priority = value; }
-        }
-        
-        /// <summary>
-        /// Returns true if this message has been redelivered to this or another consumer before being acknowledged successfully.
-        /// </summary>
-        public bool NMSRedelivered
-        {
-            get { return (RedeliveryCounter > 0); }
-        }
-        
-        /// <summary>
-        /// The destination that the consumer of this message should send replies to
-        /// </summary>
-        public IDestination NMSReplyTo
-        {
-            get { return ReplyTo; }
-            set { ReplyTo = ActiveMQDestination.Transform(value); }
-        }
-        
-        /// <summary>
-        /// The timestamp the broker added to the message
-        /// </summary>
-        public DateTime NMSTimestamp
-        {
-            get { return DateUtils.ToDateTime(Timestamp); }
-            set { Timestamp = DateUtils.ToJavaTimeUtc(value); }
-        }
-        
-        /// <summary>
-        /// The type name of this message
-        /// </summary>
-        public string NMSType
-        {
-            get { return Type; }
-            set { Type = value; }
+		/// The message ID which is set by the provider
+		/// </summary>
+		public string NMSMessageId
+		{
+			get { return BaseDataStreamMarshaller.ToString(MessageId); }
+		}
+
+		/// <summary>
+		/// Whether or not this message is persistent
+		/// </summary>
+		public bool NMSPersistent
+		{
+			get { return Persistent; }
+			set { Persistent = value; }
+		}
+
+		/// <summary>
+		/// The Priority on this message
+		/// </summary>
+		public byte NMSPriority
+		{
+			get { return Priority; }
+			set { Priority = value; }
+		}
+
+		/// <summary>
+		/// Returns true if this message has been redelivered to this or another consumer before being acknowledged successfully.
+		/// </summary>
+		public bool NMSRedelivered
+		{
+			get { return (RedeliveryCounter > 0); }
+		}
+
+		/// <summary>
+		/// The destination that the consumer of this message should send replies to
+		/// </summary>
+		public IDestination NMSReplyTo
+		{
+			get { return ReplyTo; }
+			set { ReplyTo = ActiveMQDestination.Transform(value); }
+		}
+
+		/// <summary>
+		/// The timestamp the broker added to the message
+		/// </summary>
+		public DateTime NMSTimestamp
+		{
+			get { return DateUtils.ToDateTime(Timestamp); }
+			set { Timestamp = DateUtils.ToJavaTimeUtc(value); }
+		}
+
+		/// <summary>
+		/// The type name of this message
+		/// </summary>
+		public string NMSType
+		{
+			get { return Type; }
+			set { Type = value; }
 		}
 
 		#endregion
@@ -192,78 +192,78 @@
 		#region NMS Extension headers
 
 		/// <summary>
-        /// Returns the number of times this message has been redelivered to other consumers without being acknowledged successfully.
-        /// </summary>
-        public int NMSXDeliveryCount
-        {
-            get { return RedeliveryCounter + 1; }
-        }
-        
-        /// <summary>
-        /// The Message Group ID used to group messages together to the same consumer for the same group ID value
-        /// </summary>
-        public string NMSXGroupID
-        {
-            get { return GroupID; }
-            set { GroupID = value; }
-        }
-        /// <summary>
-        /// The Message Group Sequence counter to indicate the position in a group
-        /// </summary>
-        public int NMSXGroupSeq
-        {
-            get { return GroupSequence; }
-            set { GroupSequence = value; }
-        }
-        
-        /// <summary>
-        /// Returns the ID of the producers transaction
-        /// </summary>
-        public string NMSXProducerTXID
-        {
-            get
-			{
-                TransactionId txnId = OriginalTransactionId;
-                if(null == txnId)
-                {
-                    txnId = TransactionId;
-                }
-
-                if(null != txnId)
-                {
-                    return BaseDataStreamMarshaller.ToString(txnId);
-                }
+		/// Returns the number of times this message has been redelivered to other consumers without being acknowledged successfully.
+		/// </summary>
+		public int NMSXDeliveryCount
+		{
+			get { return RedeliveryCounter + 1; }
+		}
+
+		/// <summary>
+		/// The Message Group ID used to group messages together to the same consumer for the same group ID value
+		/// </summary>
+		public string NMSXGroupID
+		{
+			get { return GroupID; }
+			set { GroupID = value; }
+		}
+		/// <summary>
+		/// The Message Group Sequence counter to indicate the position in a group
+		/// </summary>
+		public int NMSXGroupSeq
+		{
+			get { return GroupSequence; }
+			set { GroupSequence = value; }
+		}
+
+		/// <summary>
+		/// Returns the ID of the producers transaction
+		/// </summary>
+		public string NMSXProducerTXID
+		{
+			get
+			{
+				TransactionId txnId = OriginalTransactionId;
+				if(null == txnId)
+				{
+					txnId = TransactionId;
+				}
 
-                return null;
-            }
+				if(null != txnId)
+				{
+					return BaseDataStreamMarshaller.ToString(txnId);
+				}
+
+				return null;
+			}
 		}
 
 		#endregion
 
 		public object GetObjectProperty(string name)
-        {
-            return propertyHelper.GetObjectProperty(this, name);
-        }
-        
-        public void SetObjectProperty(string name, object value)
-        {
-            propertyHelper.SetObjectProperty(this, name, value);
-        }
-        
-        // MarshallAware interface
-        public override bool IsMarshallAware()
-        {
-            return true;
-        }
-        
-        public override void BeforeMarshall(OpenWireFormat wireFormat)
-        {
-            MarshalledProperties = null;
-            if (properties != null)
-            {
-                MarshalledProperties = properties.Marshal();
-            }
-        }
-    }
+		{
+			return Properties[name];
+		}
+
+		public void SetObjectProperty(string name, object value)
+		{
+			Properties[name] = 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/Commands/WireFormatInfo.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Commands/WireFormatInfo.cs?rev=689294&r1=689293&r2=689294&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 Aug 26 17:16:05 2008
@@ -42,7 +42,6 @@
         int version;
         byte[] marshalledProperties;
         
-        protected static MessagePropertyHelper propertyHelper = new MessagePropertyHelper();
         private PrimitiveMap properties;
         
         public override string ToString() {

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/MessagePropertyHelper.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/MessagePropertyHelper.cs?rev=689294&r1=689293&r2=689294&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/MessagePropertyHelper.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/OpenWire/MessagePropertyHelper.cs Tue Aug 26 17:16:05 2008
@@ -1,3 +1,5 @@
+using System;
+using System.Reflection;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -15,39 +17,216 @@
  * limitations under the License.
 */
 using Apache.NMS.ActiveMQ.Commands;
-using System.Collections;
 
 namespace Apache.NMS.ActiveMQ.OpenWire
 {
-    public delegate object PropertyGetter(ActiveMQMessage message);
-    public delegate void PropertySetter(ActiveMQMessage message, object value);
-    
-    public class MessagePropertyHelper
-    {
-        private IDictionary setters = new Hashtable();
-        private IDictionary getters = new Hashtable();
-        
-        public MessagePropertyHelper()
-        {
-            // TODO find all of the NMS properties via introspection
-        }
-        
-        
-        public object GetObjectProperty(ActiveMQMessage message, string name) {
-            object getter = getters[name];
-            if (getter != null) {
-            }
-            return message.Properties[name];
-        }
-        
-        public void SetObjectProperty(ActiveMQMessage message, string name, object value) {
-            PropertySetter setter = (PropertySetter) setters[name];
-            if (setter != null) {
-                setter(message, value);
-            }
-            else {
-                message.Properties[name] = value;
-            }
-        }
-    }
+	// Set NMS properties via introspection
+	public class MessagePropertyHelper : IPrimitiveMap
+	{
+		private static BindingFlags publicBinding = BindingFlags.Public | BindingFlags.Instance;
+		private ActiveMQMessage message;
+		private IPrimitiveMap properties;
+		private Type messageType;
+
+		public MessagePropertyHelper(ActiveMQMessage _message, IPrimitiveMap _properties)
+		{
+			this.message = _message;
+			this.properties = _properties;
+			this.messageType = _message.GetType();
+		}
+
+		protected object GetObjectProperty(string name)
+		{
+			PropertyInfo propertyInfo = this.messageType.GetProperty(name, publicBinding);
+
+			if(null != propertyInfo && propertyInfo.CanRead)
+			{
+				return propertyInfo.GetValue(this.message, null);
+			}
+			else
+			{
+				FieldInfo fieldInfo = this.messageType.GetField(name, publicBinding);
+
+				if(null != fieldInfo)
+				{
+					return fieldInfo.GetValue(this.message);
+				}
+			}
+
+			return this.properties[name];
+		}
+
+		protected void SetObjectProperty(string name, object value)
+		{
+			PropertyInfo propertyInfo = this.messageType.GetProperty(name, publicBinding);
+
+			if(null != propertyInfo && propertyInfo.CanWrite)
+			{
+				propertyInfo.SetValue(this.message, value, null);
+			}
+			else
+			{
+				FieldInfo fieldInfo = this.messageType.GetField(name, publicBinding);
+
+				if(null != fieldInfo && !fieldInfo.IsLiteral && !fieldInfo.IsInitOnly)
+				{
+					fieldInfo.SetValue(this.message, value);
+				}
+				else
+				{
+					this.properties[name] = value;
+				}
+			}
+		}
+
+		#region IPrimitiveMap Members
+
+		public void Clear()
+		{
+			this.properties.Clear();
+		}
+
+		public bool Contains(object key)
+		{
+			return this.properties.Contains(key);
+		}
+
+		public void Remove(object key)
+		{
+			this.properties.Remove(key);
+		}
+
+		public int Count
+		{
+			get { return this.properties.Count; }
+		}
+
+		public System.Collections.ICollection Keys
+		{
+			get { return this.properties.Keys; }
+		}
+
+		public System.Collections.ICollection Values
+		{
+			get { return this.properties.Values; }
+		}
+
+		public object this[string key]
+		{
+			get { return GetObjectProperty(key); }
+			set { SetObjectProperty(key, value); }
+		}
+
+		public string GetString(string key)
+		{
+			return (string) GetObjectProperty(key);
+		}
+
+		public void SetString(string key, string value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public bool GetBool(string key)
+		{
+			return (bool) GetObjectProperty(key);
+		}
+
+		public void SetBool(string key, bool value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public byte GetByte(string key)
+		{
+			return (byte) GetObjectProperty(key);
+		}
+
+		public void SetByte(string key, byte value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public char GetChar(string key)
+		{
+			return (char) GetObjectProperty(key);
+		}
+
+		public void SetChar(string key, char value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public short GetShort(string key)
+		{
+			return (short) GetObjectProperty(key);
+		}
+
+		public void SetShort(string key, short value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public int GetInt(string key)
+		{
+			return (int) GetObjectProperty(key);
+		}
+
+		public void SetInt(string key, int value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public long GetLong(string key)
+		{
+			return (long) GetObjectProperty(key);
+		}
+
+		public void SetLong(string key, long value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public float GetFloat(string key)
+		{
+			return (float) GetObjectProperty(key);
+		}
+
+		public void SetFloat(string key, float value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public double GetDouble(string key)
+		{
+			return (double) GetObjectProperty(key);
+		}
+
+		public void SetDouble(string key, double value)
+		{
+			SetObjectProperty(key, value);
+		}
+
+		public System.Collections.IList GetList(string key)
+		{
+			return (System.Collections.IList) GetObjectProperty(key);
+		}
+
+		public void SetList(string key, System.Collections.IList list)
+		{
+			SetObjectProperty(key, list);
+		}
+
+		public System.Collections.IDictionary GetDictionary(string key)
+		{
+			return (System.Collections.IDictionary) GetObjectProperty(key);
+		}
+
+		public void SetDictionary(string key, System.Collections.IDictionary dictionary)
+		{
+			SetObjectProperty(key, dictionary);
+		}
+
+		#endregion
+	}
 }