You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2010/01/13 19:54:02 UTC

svn commit: r898879 - in /activemq/activemq-dotnet/Apache.NMS.Stomp/trunk: ./ src/main/csharp/ src/main/csharp/Commands/ src/main/csharp/Protocol/

Author: tabish
Date: Wed Jan 13 18:54:01 2010
New Revision: 898879

URL: http://svn.apache.org/viewvc?rev=898879&view=rev
Log:
Adds the ability to create and send a MapMessage over stomp using the ActiveMQ jms-map-xml format.  Support for receive is not yet implemented.

Added:
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs   (with props)
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs   (with props)
Modified:
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Commands/MapMessage.cs
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/StompWireFormat.cs
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Session.cs
    activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/vs2008-stomp.csproj

Modified: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Commands/MapMessage.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Commands/MapMessage.cs?rev=898879&r1=898878&r2=898879&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Commands/MapMessage.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Commands/MapMessage.cs Wed Jan 13 18:54:01 2010
@@ -17,6 +17,7 @@
 
 using System;
 using System.IO;
+using Apache.NMS;
 using Apache.NMS.Util;
 using Apache.NMS.Stomp.Protocol;
 
@@ -84,22 +85,16 @@
 
         public override void BeforeMarshall(StompWireFormat wireFormat)
         {
+            base.BeforeMarshall(wireFormat);
+
             if(body == null)
             {
-                Content = null;
+                this.Content = null;
             }
             else
             {
-                MemoryStream buffer = new MemoryStream();
-                this.body.Marshal(buffer);
-                buffer.Close();
-
-                this.Content = buffer.ToArray();
+                this.Content = wireFormat.MapMarshaler.Marshal(body);
             }
-
-            Tracer.Debug("BeforeMarshalling, content is: " + Content);
-
-            base.BeforeMarshall(wireFormat);
         }
     }
 }

Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs?rev=898879&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs Wed Jan 13 18:54:01 2010
@@ -0,0 +1,58 @@
+// /*
+//  * 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;
+
+namespace Apache.NMS.Stomp.Protocol
+{
+    /// <summary>
+    /// Interface for a utility class used to marshal an IPrimitiveMap instance
+    /// to/from an String.
+    /// </summary>
+    public interface IPrimitiveMapMarshaler
+    {
+        /// <summary>
+        /// Marshals an instance of an IPrimitiveMap to an String object.
+        /// </summary>
+        /// <param name="map">
+        /// A <see cref="IPrimitiveMap"/>
+        /// </param>
+        /// <returns>
+        /// A <see cref="System.Byte[]"/>
+        /// </returns>
+        byte[] Marshal(IPrimitiveMap map);
+
+        /// <summary>
+        /// Un-marshals an IPrimitiveMap instance from a String object.
+        /// </summary>
+        /// <param name="mapContent">
+        /// A <see cref="System.Byte[]"/>
+        /// </param>
+        /// <returns>
+        /// A <see cref="IPrimitiveMap"/>
+        /// </returns>
+        IPrimitiveMap Unmarshal(byte[] mapContent);
+
+        /// <summary>
+        /// Retreives the Name of this Marshaler.
+        /// </summary>
+        string Name { get; }
+
+    }
+}

Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/IPrimitiveMapMarshaler.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/StompWireFormat.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/StompWireFormat.cs?rev=898879&r1=898878&r2=898879&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/StompWireFormat.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/StompWireFormat.cs Wed Jan 13 18:54:01 2010
@@ -30,19 +30,20 @@
     public class StompWireFormat : IWireFormat
     {
         private Encoding encoder = new UTF8Encoding();
+        private IPrimitiveMapMarshaler mapMarshaler = new XmlPrimitiveMapMarshaler();
         private ITransport transport;
 
         public StompWireFormat()
         {
         }
 
-        public ITransport Transport 
+        public ITransport Transport
         {
             get { return transport; }
             set { transport = value; }
         }
 
-        public int Version 
+        public int Version
         {
             get { return 1; }
         }
@@ -53,6 +54,12 @@
             set { this.encoder = value; }
         }
 
+        public IPrimitiveMapMarshaler MapMarshaler
+        {
+            get { return this.mapMarshaler; }
+            set { this.mapMarshaler = value; }
+        }
+
         public void Marshal(Object o, BinaryWriter dataOut)
         {
             Tracer.Debug("StompWireFormat - Marshaling: " + o);
@@ -331,6 +338,10 @@
 
                 frame.SetProperty("transformation", "jms-byte");
             }
+            else if(command is MapMessage)
+            {
+                frame.SetProperty("transformation", this.mapMarshaler.Name);
+            }
 			
             // Marshal all properties to the Frame.
             IPrimitiveMap map = command.Properties;

Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs?rev=898879&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs Wed Jan 13 18:54:01 2010
@@ -0,0 +1,162 @@
+// /*
+//  * Licensed to the Apache Software Foundation (ASF) under one or more
+//  * contributor license agreements.  See the NOTICE file distributed with
+//  * this work for additional information regarding copyright ownership.
+//  * The ASF licenses this file to You under the Apache License, Version 2.0
+//  * (the "License"); you may not use this file except in compliance with
+//  * the License.  You may obtain a copy of the License at
+//  *
+//  *     http://www.apache.org/licenses/LICENSE-2.0
+//  *
+//  * Unless required by applicable law or agreed to in writing, software
+//  * distributed under the License is distributed on an "AS IS" BASIS,
+//  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  * See the License for the specific language governing permissions and
+//  * limitations under the License.
+//  */
+// 
+
+using System;
+using System.Text;
+using System.Xml;
+using System.Collections;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Stomp.Protocol
+{
+    /// <summary>
+    /// Reads / Writes an IPrimitveMap as XML.
+    /// </summary>
+    public class XmlPrimitiveMapMarshaler : IPrimitiveMapMarshaler
+    {
+        private Encoding encoder = new UTF8Encoding();
+
+        public XmlPrimitiveMapMarshaler() : base()
+        {
+        }
+
+        public XmlPrimitiveMapMarshaler(Encoding encoder) : base()
+        {
+            this.encoder = encoder;
+        }
+
+        public string Name
+        {
+            get{ return "jms-map-xml"; }
+        }
+
+        public byte[] Marshal(IPrimitiveMap map)
+        {
+            StringBuilder builder = new StringBuilder();
+
+            XmlWriterSettings settings = new XmlWriterSettings();
+
+            settings.OmitXmlDeclaration = true;
+            settings.Encoding = this.encoder;
+            settings.NewLineHandling = NewLineHandling.None;
+
+            XmlWriter writer = XmlWriter.Create(builder, settings);
+
+            writer.WriteStartElement("map");
+
+            foreach(String entry in map.Keys)
+            {
+                writer.WriteStartElement("entry");
+
+                // Encode the Key <string>key</string>
+                writer.WriteElementString("string", entry);
+
+                Object value = map[entry];
+
+                // Encode the Value <${type}>value</${type}>
+                MarshalPrimitive(writer, value);
+
+                writer.WriteEndElement();
+            }
+
+            writer.WriteEndElement();
+            writer.Close();
+
+            Console.WriteLine("XML Map = " + builder.ToString());
+
+            return this.encoder.GetBytes(builder.ToString());
+        }
+
+        public IPrimitiveMap Unmarshal(byte[] mapContent)
+        {
+            string content = this.encoder.GetString(mapContent);
+
+            PrimitiveMap result = new PrimitiveMap();
+
+            if(content == null || content == "")
+            {
+                return result;
+            }
+
+            return result;
+        }
+
+        private void MarshalPrimitive(XmlWriter writer, Object value)
+        {
+            if(value == null)
+            {
+                Console.WriteLine("Null Map Value");
+                throw new NullReferenceException("PrimitiveMap values should not be Null");
+            }
+            else if(value is bool)
+            {
+                writer.WriteElementString("boolean", value.ToString().ToLower());
+            }
+            else if(value is byte)
+            {
+                writer.WriteElementString("byte", value.ToString());
+            }
+            else if(value is short)
+            {
+                writer.WriteElementString("short", value.ToString());
+            }
+            else if(value is int)
+            {
+                writer.WriteElementString("int", value.ToString());
+            }
+            else if(value is long)
+            {
+                writer.WriteElementString("long", value.ToString());
+            }
+            else if(value is float)
+            {
+                writer.WriteElementString("float", value.ToString());
+            }
+            else if(value is double)
+            {
+                writer.WriteElementString("double", value.ToString());
+            }
+            else if(value is byte[])
+            {
+                writer.WriteElementString("byte-array", Convert.ToBase64String((byte[]) value));
+            }
+            else if(value is string)
+            {
+                writer.WriteElementString("string", (string) value);
+            }
+            else if(value is IDictionary)
+            {
+                Console.WriteLine("Can't Marshal a Dictionary");
+
+                throw new NotSupportedException("Can't marshal nested Maps in Stomp");
+            }
+            else if(value is IList)
+            {
+                Console.WriteLine("Can't Marshal a List");
+
+                throw new NotSupportedException("Can't marshal nested Maps in Stomp");
+            }
+            else
+            {
+                Console.WriteLine("Can't Marshal a something other than a Primitive Value.");
+
+                throw new Exception("Object is not a primitive: " + value);
+            }
+        }
+    }
+}

Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Protocol/XmlPrimitiveMapMarshaler.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Session.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Session.cs?rev=898879&r1=898878&r2=898879&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Session.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/Session.cs Wed Jan 13 18:54:01 2010
@@ -519,7 +519,8 @@
 
         public IMapMessage CreateMapMessage()
         {
-            throw new NotSupportedException("No Object Message in Stomp");
+            MapMessage answer = new MapMessage();
+            return ConfigureMessage(answer) as IMapMessage;
         }
 
         public IBytesMessage CreateBytesMessage()

Modified: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/vs2008-stomp.csproj
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/vs2008-stomp.csproj?rev=898879&r1=898878&r2=898879&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/vs2008-stomp.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/vs2008-stomp.csproj Wed Jan 13 18:54:01 2010
@@ -111,6 +111,8 @@
     <Compile Include="src\main\csharp\Commands\ConnectionError.cs" />
     <Compile Include="src\main\csharp\Commands\RemoveSubscriptionInfo.cs" />
     <Compile Include="src\main\csharp\Protocol\StompFrame.cs" />
+    <Compile Include="src\main\csharp\Protocol\IPrimitiveMapMarshaler.cs" />
+    <Compile Include="src\main\csharp\Protocol\XmlPrimitiveMapMarshaler.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="keyfile\NMSKey.snk" />