Author: jgomes
Date: Fri Oct 24 11:18:18 2008
New Revision: 707700

URL: http://svn.apache.org/viewvc?rev=707700&view=rev
Log:
Integrating patch submission from Allan Schrum.
Fixes [AMQNET-26]. (See https://issues.apache.org/activemq/browse/AMQNET-26)

Added:
    
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/AtomicReference.cs
Modified:
    activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs
    activemq/activemq-dotnet/Apache.NMS/trunk/vs2008-nms.csproj

Added: 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/AtomicReference.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/AtomicReference.cs?rev=707700&view=auto
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/AtomicReference.cs
 (added)
+++ 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/AtomicReference.cs
 Fri Oct 24 11:18:18 2008
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+namespace Apache.NMS.Util
+{
+#if !NET_1_1
+       public class AtomicReference<T>
+       {
+               private T atomicValue;
+
+               public T Value
+               {
+                       get
+                       {
+                               lock(this)
+                               {
+                                       return atomicValue;
+                               }
+                       }
+                       set
+                       {
+                               lock(this)
+                               {
+                                       atomicValue = value;
+                               }
+                       }
+               }
+
+               public AtomicReference()
+               {
+               }
+
+               public AtomicReference(T defaultValue)
+               {
+                       atomicValue = defaultValue;
+               }
+
+               public T GetAndSet(T value)
+               {
+                       lock(this)
+                       {
+                               T ret = atomicValue;
+                               atomicValue = value;
+                               return ret;
+                       }
+               }
+       }
+#endif
+}

Modified: 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs?rev=707700&r1=707699&r2=707700&view=diff
==============================================================================
--- 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs 
(original)
+++ 
activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs 
Fri Oct 24 11:18:18 2008
@@ -15,24 +15,27 @@
  * limitations under the License.
  */
 using System;
+using System.Collections;
 using System.Collections.Specialized;
 using System.Globalization;
 using System.Reflection;
+using System.Text;
+using System.Web;
 
 namespace Apache.NMS.Util
 {
        /// <summary>
-       /// Class to provide support for URI query parameters which uses .Net 
reflection
+       /// Class to provide support for Uri query parameters which uses .Net 
reflection
        /// to identify and set properties.
        /// </summary>
        public class URISupport
        {
                /// <summary>
-               /// Parse a URI query string of the form ?x=y&amp;z=0
+               /// Parse a Uri query string of the form ?x=y&amp;z=0
                /// into a map of name/value pairs.
                /// </summary>
                /// <param name="query">The query string to parse. This string 
should not contain
-               /// URI escape characters.</param>
+               /// Uri escape characters.</param>
                public static StringDictionary ParseQuery(string query)
                {
                        StringDictionary map = new StringDictionary();
@@ -53,7 +56,7 @@
 
                                        if(nameValue.Length != 2)
                                        {
-                                               throw new 
NMS.NMSException("Invalid URI parameter: " + query);
+                                               throw new 
NMS.NMSException("Invalid Uri parameter: " + query);
                                        }
 
                                        map[nameValue[0]] = nameValue[1];
@@ -63,6 +66,11 @@
                        return map;
                }
 
+               public static StringDictionary ParseParameters(Uri uri)
+               {
+                       return uri.Query == null ? emptyMap() : 
ParseQuery(stripPrefix(uri.Query, "?"));
+               }
+
                /// <summary>
                /// Sets the public properties of a target object using a 
string map.
                /// This method uses .Net reflection to identify public 
properties of
@@ -96,6 +104,324 @@
                                }
                        }
                }
+
+               private static String UrlDecode(String s)
+               {
+#if !NETCF
+                       return HttpUtility.HtmlDecode(s);
+#else
+                       return Uri.UnescapeDataString(s);
+#endif
+               }
+
+               private static String UrlEncode(String s)
+               {
+#if !NETCF
+                       return HttpUtility.HtmlEncode(s);
+#else
+                       return Uri.EscapeUriString(s);
+#endif
+               }
+
+               public static String createQueryString(StringDictionary options)
+               {
+                       if(options.Count > 0)
+                       {
+                               StringBuilder rc = new StringBuilder();
+                               bool first = true;
+                               foreach(String key in options.Keys)
+                               {
+                                       string value = options[key];
+
+                                       if(first)
+                                       {
+                                               first = false;
+                                       }
+                                       else
+                                       {
+                                               rc.Append("&");
+                                       }
+                                       rc.Append(UrlEncode(key));
+                                       rc.Append("=");
+                                       rc.Append(UrlEncode(value));
+                               }
+                               return rc.ToString();
+                       }
+                       else
+                       {
+                               return "";
+                       }
+               }
+
+               public class CompositeData
+               {
+                       private String host;
+                       private String scheme;
+                       private String path;
+                       private Uri[] components;
+                       private StringDictionary parameters;
+                       private String fragment;
+
+                       public Uri[] Components
+                       {
+                               get { return components; }
+                               set { components = value; }
+                       }
+
+                       public String Fragment
+                       {
+                               get { return fragment; }
+                               set { fragment = value; }
+                       }
+
+                       public StringDictionary Parameters
+                       {
+                               get { return parameters; }
+                               set { parameters = value; }
+                       }
+
+                       public String Scheme
+                       {
+                               get { return scheme; }
+                               set { scheme = value; }
+                       }
+
+                       public String Path
+                       {
+                               get { return path; }
+                               set { path = value; }
+                       }
+
+                       public String Host
+                       {
+                               get { return host; }
+                               set { host = value; }
+                       }
+
+                       public Uri toUri()
+                       {
+                               StringBuilder sb = new StringBuilder();
+                               if(scheme != null)
+                               {
+                                       sb.Append(scheme);
+                                       sb.Append(':');
+                               }
+
+                               if(host != null && host.Length != 0)
+                               {
+                                       sb.Append(host);
+                               }
+                               else
+                               {
+                                       sb.Append('(');
+                                       for(int i = 0; i < components.Length; 
i++)
+                                       {
+                                               if(i != 0)
+                                               {
+                                                       sb.Append(',');
+                                               }
+                                               
sb.Append(components[i].ToString());
+                                       }
+                                       sb.Append(')');
+                               }
+
+                               if(path != null)
+                               {
+                                       sb.Append('/');
+                                       sb.Append(path);
+                               }
+
+                               if(parameters.Count != 0)
+                               {
+                                       sb.Append("?");
+                                       
sb.Append(createQueryString(parameters));
+                               }
+
+                               if(fragment != null)
+                               {
+                                       sb.Append("#");
+                                       sb.Append(fragment);
+                               }
+
+                               return new Uri(sb.ToString());
+                       }
+               }
+
+               public static String stripPrefix(String value, String prefix)
+               {
+                       if(value.StartsWith(prefix))
+                       {
+                               return value.Substring(prefix.Length);
+                       }
+
+                       return value;
+               }
+
+               public static CompositeData parseComposite(Uri uri)
+               {
+
+                       CompositeData rc = new CompositeData();
+                       rc.Scheme = uri.Scheme;
+                       String ssp = stripPrefix(uri.AbsoluteUri.Trim(), 
rc.Scheme).Trim();
+                       ssp = stripPrefix(ssp, ":").Trim();
+                       ssp = stripPrefix(ssp, "//").Trim();
+
+                       parseComposite(uri, rc, ssp);
+
+                       rc.Fragment = uri.Fragment;
+                       return rc;
+               }
+
+               /// <summary>
+               /// </summary>
+               /// <param name="uri"></param>
+               /// <param name="rc"></param>
+               /// <param name="ssp"></param>
+               /// <param name="p"></param>
+               private static void parseComposite(Uri uri, CompositeData rc, 
String ssp)
+               {
+                       String componentString;
+                       String parms;
+
+                       if(!checkParenthesis(ssp))
+                       {
+                               throw new ApplicationException(uri.ToString() + 
": Not a matching number of '(' and ')' parenthesis");
+                       }
+
+                       int p;
+                       int intialParen = ssp.IndexOf("(");
+                       if(intialParen >= 0)
+                       {
+                               rc.Host = ssp.Substring(0, intialParen);
+                               p = rc.Host.IndexOf("/");
+                               if(p >= 0)
+                               {
+                                       rc.Path = rc.Host.Substring(p);
+                                       rc.Host = rc.Host.Substring(0, p);
+                               }
+                               p = ssp.LastIndexOf(")");
+                               componentString = ssp.Substring(intialParen + 
1, p - 1);
+                               parms = ssp.Substring(p + 1).Trim();
+
+                       }
+                       else
+                       {
+                               p = ssp.IndexOf("?");
+                               if(p >= 0)
+                               {
+                                       componentString = ssp.Substring(0, p);
+                                       parms = ssp.Substring(p);
+                               }
+                               else
+                               {
+                                       componentString = ssp;
+                                       parms = "";
+                               }
+                       }
+
+                       String[] components = splitComponents(componentString);
+                       rc.Components = new Uri[components.Length];
+                       for(int i = 0; i < components.Length; i++)
+                       {
+                               rc.Components[i] = new 
Uri(components[i].Trim());
+                       }
+
+                       p = parms.IndexOf("?");
+                       if(p >= 0)
+                       {
+                               if(p > 0)
+                               {
+                                       rc.Path = 
stripPrefix(parms.Substring(0, p), "/");
+                               }
+                               rc.Parameters = ParseQuery(parms.Substring(p + 
1));
+                       }
+                       else
+                       {
+                               if(parms.Length > 0)
+                               {
+                                       rc.Path = stripPrefix(parms, "/");
+                               }
+                               rc.Parameters = emptyMap();
+                       }
+               }
+
+               private static StringDictionary emptyMap()
+               {
+                       return new StringDictionary();
+               }
+
+               /// <summary>
+               /// </summary>
+               /// <param name="componentString"></param>
+               private static String[] splitComponents(String str)
+               {
+                       ArrayList l = new ArrayList();
+
+                       int last = 0;
+                       int depth = 0;
+                       char[] chars = str.ToCharArray();
+                       for(int i = 0; i < chars.Length; i++)
+                       {
+                               switch(chars[i])
+                               {
+                               case '(':
+                               depth++;
+                               break;
+                               case ')':
+                               depth--;
+                               break;
+                               case ',':
+                               if(depth == 0)
+                               {
+                                       String s = str.Substring(last, i);
+                                       l.Add(s);
+                                       last = i + 1;
+                               }
+                               break;
+                               default:
+                               break;
+                               }
+                       }
+
+                       String ending = str.Substring(last);
+                       if(ending.Length != 0)
+                       {
+                               l.Add(ending);
+                       }
+
+                       String[] rc = new String[l.Count];
+                       l.CopyTo(rc);
+
+                       return rc;
+               }
+
+               public static bool checkParenthesis(String str)
+               {
+                       bool result = true;
+                       if(str != null)
+                       {
+                               int open = 0;
+                               int closed = 0;
+
+                               int i = 0;
+                               while((i = str.IndexOf('(', i)) >= 0)
+                               {
+                                       i++;
+                                       open++;
+                               }
+
+                               i = 0;
+                               while((i = str.IndexOf(')', i)) >= 0)
+                               {
+                                       i++;
+                                       closed++;
+                               }
+
+                               result = (open == closed);
+                       }
+
+                       return result;
+               }
        }
 }
 

Modified: activemq/activemq-dotnet/Apache.NMS/trunk/vs2008-nms.csproj
URL: 
http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS/trunk/vs2008-nms.csproj?rev=707700&r1=707699&r2=707700&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS/trunk/vs2008-nms.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS/trunk/vs2008-nms.csproj Fri Oct 24 
11:18:18 2008
@@ -42,6 +42,7 @@
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
+    <Reference Include="System.Web" />
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
@@ -74,6 +75,7 @@
     <Compile Include="src\main\csharp\Tracer.cs" />
     <Compile Include="src\main\csharp\Util\Atomic.cs" />
     <Compile Include="src\main\csharp\Util\AtomicBoolean.cs" />
+    <Compile Include="src\main\csharp\Util\AtomicReference.cs" />
     <Compile Include="src\main\csharp\Util\Convert.cs" />
     <Compile Include="src\main\csharp\Util\CountDownLatch.cs" />
     <Compile Include="src\main\csharp\Util\DateUtils.cs" />


Reply via email to