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/07/16 01:50:59 UTC

svn commit: r964646 - /activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs

Author: tabish
Date: Thu Jul 15 23:50:59 2010
New Revision: 964646

URL: http://svn.apache.org/viewvc?rev=964646&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQNET-261

Should build on Compact Framework now, but causes a UriSupportTest failure, fix is TBD.

Modified:
    activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/Util/URISupport.cs

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=964646&r1=964645&r2=964646&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 Thu Jul 15 23:50:59 2010
@@ -27,12 +27,12 @@ using System.Web;
 
 namespace Apache.NMS.Util
 {
-	/// <summary>
-	/// Class to provide support for Uri query parameters which uses .Net reflection
-	/// to identify and set properties.
-	/// </summary>
-	public class URISupport
-	{
+    /// <summary>
+    /// Class to provide support for Uri query parameters which uses .Net reflection
+    /// to identify and set properties.
+    /// </summary>
+    public class URISupport
+    {
         /// <summary>
         /// Given a string that could be a Composite Uri that uses syntax not compatible
         /// with the .NET Uri class such as an ActiveMQ failover Uri formatted as
@@ -50,186 +50,186 @@ namespace Apache.NMS.Util
             return new Uri(sanitized);
         }
 
-		/// <summary>
-		/// 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>
-		public static StringDictionary ParseQuery(string query)
-		{
-			StringDictionary map = new StringDictionary();
-
-			// strip the initial "?"
-			if(query.StartsWith("?"))
-			{
-				query = query.Substring(1);
-			}
-
-			// split the query into parameters
-			string[] parameters = query.Split('&');
-			foreach(string pair in parameters)
-			{
-				if(pair.Length > 0)
-				{
-					string[] nameValue = pair.Split('=');
-
-					if(nameValue.Length != 2)
-					{
-						throw new NMSException(string.Format("Invalid Uri parameter: {0}", query));
-					}
-
-					map[nameValue[0]] = nameValue[1];
-				}
-			}
-
-			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
-		/// the target object matching the keys from the passed map.
-		/// </summary>
-		/// <param name="target">The object whose properties will be set.</param>
-		/// <param name="map">Map of key/value pairs.</param>
-		/// <param name="prefix">Key value prefix.  This is prepended to the property name
-		/// before searching for a matching key value.</param>
-		public static void SetProperties(object target, StringDictionary map, string prefix)
-		{
-			Type type = target.GetType();
-			
-			List<String> matches = new List<String>();
-
-			foreach(string key in map.Keys)
-			{
-				if(key.ToLower().StartsWith(prefix.ToLower()))
-				{
-					string bareKey = key.Substring(prefix.Length);
-					PropertyInfo prop = type.GetProperty(bareKey,
-															BindingFlags.FlattenHierarchy
-															| BindingFlags.Public
-															| BindingFlags.Instance
-															| BindingFlags.IgnoreCase);
-
-					if(null != prop)
-					{
-						prop.SetValue(target, Convert.ChangeType(map[key], prop.PropertyType, CultureInfo.InvariantCulture), null);
-					}
-					else
-					{
-						FieldInfo field = type.GetField(bareKey,
-															BindingFlags.FlattenHierarchy
-															| BindingFlags.Public
-															| BindingFlags.Instance
-															| BindingFlags.IgnoreCase);
-						if(null != field)
-						{
-							field.SetValue(target, Convert.ChangeType(map[key], field.FieldType, CultureInfo.InvariantCulture));
-						}
-						else
-						{
-							throw new NMSException(string.Format("No such property or field: {0} on class: {1}", bareKey, target.GetType().Name));
-						}
-					}
-					
-					// store for later removal.
-					matches.Add(key);
-				}
-			}
-			
-			// Remove all the properties we set so they are used again later.
-			foreach(string match in matches)
-			{
-				map.Remove(match);
-			}
-		}
-
-	    public static StringDictionary ExtractProperties(StringDictionary props, string prefix) {
-	        
-			if(props == null) 
-			{
-	            throw new Exception("Properties Object was null");
-	        }
-			
-			StringDictionary result = new StringDictionary();
-			List<String> matches = new List<String>();
-		
-			foreach(string key in props.Keys)
-			{
-				if(key.StartsWith(prefix))
-				{
-					String value = props[key];
-					result[key] = value;
-					matches.Add(key);
-				}
-			}
-			
-			foreach(string match in matches)
-			{
-				props.Remove(match);
-			}
-					
-	        return result;
-	    }
-		
-		public static String UrlDecode(String s)
-		{
+        /// <summary>
+        /// 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>
+        public static StringDictionary ParseQuery(string query)
+        {
+            StringDictionary map = new StringDictionary();
+
+            // strip the initial "?"
+            if(query.StartsWith("?"))
+            {
+                query = query.Substring(1);
+            }
+
+            // split the query into parameters
+            string[] parameters = query.Split('&');
+            foreach(string pair in parameters)
+            {
+                if(pair.Length > 0)
+                {
+                    string[] nameValue = pair.Split('=');
+
+                    if(nameValue.Length != 2)
+                    {
+                        throw new NMSException(string.Format("Invalid Uri parameter: {0}", query));
+                    }
+
+                    map[nameValue[0]] = nameValue[1];
+                }
+            }
+
+            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
+        /// the target object matching the keys from the passed map.
+        /// </summary>
+        /// <param name="target">The object whose properties will be set.</param>
+        /// <param name="map">Map of key/value pairs.</param>
+        /// <param name="prefix">Key value prefix.  This is prepended to the property name
+        /// before searching for a matching key value.</param>
+        public static void SetProperties(object target, StringDictionary map, string prefix)
+        {
+            Type type = target.GetType();
+
+            List<String> matches = new List<String>();
+
+            foreach(string key in map.Keys)
+            {
+                if(key.ToLower().StartsWith(prefix.ToLower()))
+                {
+                    string bareKey = key.Substring(prefix.Length);
+                    PropertyInfo prop = type.GetProperty(bareKey,
+                                                            BindingFlags.FlattenHierarchy
+                                                            | BindingFlags.Public
+                                                            | BindingFlags.Instance
+                                                            | BindingFlags.IgnoreCase);
+
+                    if(null != prop)
+                    {
+                        prop.SetValue(target, Convert.ChangeType(map[key], prop.PropertyType, CultureInfo.InvariantCulture), null);
+                    }
+                    else
+                    {
+                        FieldInfo field = type.GetField(bareKey,
+                                                            BindingFlags.FlattenHierarchy
+                                                            | BindingFlags.Public
+                                                            | BindingFlags.Instance
+                                                            | BindingFlags.IgnoreCase);
+                        if(null != field)
+                        {
+                            field.SetValue(target, Convert.ChangeType(map[key], field.FieldType, CultureInfo.InvariantCulture));
+                        }
+                        else
+                        {
+                            throw new NMSException(string.Format("No such property or field: {0} on class: {1}", bareKey, target.GetType().Name));
+                        }
+                    }
+
+                    // store for later removal.
+                    matches.Add(key);
+                }
+            }
+
+            // Remove all the properties we set so they are used again later.
+            foreach(string match in matches)
+            {
+                map.Remove(match);
+            }
+        }
+
+        public static StringDictionary ExtractProperties(StringDictionary props, string prefix) {
+
+            if(props == null)
+            {
+                throw new Exception("Properties Object was null");
+            }
+
+            StringDictionary result = new StringDictionary();
+            List<String> matches = new List<String>();
+
+            foreach(string key in props.Keys)
+            {
+                if(key.StartsWith(prefix))
+                {
+                    String value = props[key];
+                    result[key] = value;
+                    matches.Add(key);
+                }
+            }
+
+            foreach(string match in matches)
+            {
+                props.Remove(match);
+            }
+
+            return result;
+        }
+
+        public static String UrlDecode(String s)
+        {
 #if !NETCF
-			return HttpUtility.HtmlDecode(s);
+            return HttpUtility.HtmlDecode(s);
 #else
-			return Uri.UnescapeDataString(s);
+            return Uri.UnescapeDataString(s);
 #endif
-		}
+        }
 
-		public static String UrlEncode(String s)
-		{
+        public static String UrlEncode(String s)
+        {
 #if !NETCF
-			return HttpUtility.HtmlEncode(s);
+            return HttpUtility.HtmlEncode(s);
 #else
-			return Uri.EscapeUriString(s);
+            return Uri.EscapeUriString(s);
 #endif
-		}
+        }
+
+        public static String CreateQueryString(StringDictionary options)
+        {
+            if(options != null && options.Count > 0)
+            {
+                StringBuilder rc = new StringBuilder();
+                bool first = true;
+
+                foreach(String key in options.Keys)
+                {
+                    string value = options[key];
 
-		public static String CreateQueryString(StringDictionary options)
-		{
-			if(options != null && 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 "";
-			}
-		}
+                    if(first)
+                    {
+                        first = false;
+                    }
+                    else
+                    {
+                        rc.Append("&");
+                    }
+
+                    rc.Append(UrlEncode(key));
+                    rc.Append("=");
+                    rc.Append(UrlEncode(value));
+                }
+
+                return rc.ToString();
+            }
+            else
+            {
+                return "";
+            }
+        }
 
         public static Uri CreateRemainingUri(Uri originalUri, StringDictionary parameters)
         {
@@ -243,63 +243,66 @@ namespace Apache.NMS.Util
             return CreateUriWithQuery(originalUri, s);
         }
 
-		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()
-			{
-                UriBuilder builder = new UriBuilder();
-
-                builder.Scheme = scheme;
-                builder.Host = host;
-                builder.Fragment = fragment;
+        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; }
+            }
 
-                if(components.Length > 0)
+            public Uri toUri()
+            {
+                StringBuilder sb = new StringBuilder();
+                if(scheme != null)
                 {
-                    StringBuilder sb = new StringBuilder();
+                    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++)
                     {
@@ -310,38 +313,39 @@ namespace Apache.NMS.Util
                         sb.Append(components[i].ToString());
                     }
                     sb.Append(')');
+                }
 
-                    if(path != null)
-                    {
-                        sb.Append('/');
-                        sb.Append(path);
-                    }
-
-                    builder.Path = sb.ToString();
+                if(path != null)
+                {
+                    sb.Append('/');
+                    sb.Append(path);
                 }
-                else
+
+                if(parameters.Count != 0)
                 {
-                    builder.Path = path;
+                    sb.Append("?");
+                    sb.Append(CreateQueryString(parameters));
                 }
 
-                if(parameters.Count > 0)
+                if(fragment != null)
                 {
-                    builder.Query = CreateQueryString(parameters);
+                    sb.Append("#");
+                    sb.Append(fragment);
                 }
 
-				return builder.Uri;
-			}
-		}
+                return new Uri(sb.ToString());
+            }
+        }
 
-		public static String StripPrefix(String value, String prefix)
-		{
-			if(value.StartsWith(prefix))
-			{
-				return value.Substring(prefix.Length);
-			}
+        public static String StripPrefix(String value, String prefix)
+        {
+            if(value.StartsWith(prefix))
+            {
+                return value.Substring(prefix.Length);
+            }
 
-			return value;
-		}
+            return value;
+        }
 
         public static Uri CreateUriWithQuery(Uri uri, string query)
         {
@@ -380,13 +384,13 @@ namespace Apache.NMS.Util
             return CreateUriWithQuery(original, null);
         }
 
-		public static CompositeData ParseComposite(Uri uri)
-		{
-			CompositeData rc = new CompositeData();
-			rc.Scheme = uri.Scheme;
+        public static CompositeData ParseComposite(Uri uri)
+        {
+            CompositeData rc = new CompositeData();
+            rc.Scheme = uri.Scheme;
 
-			// Start with original URI
-			//String ssp = uri.Authority + uri.PathAndQuery;
+            // Start with original URI
+            //String ssp = uri.Authority + uri.PathAndQuery;
             String ssp = uri.OriginalString;
 
             ssp = StripPrefix(ssp, rc.Scheme + ":");
@@ -407,172 +411,172 @@ namespace Apache.NMS.Util
             // the authority as a hostname with, ':(' which is valid.
             ssp = ssp.Replace("://(", ":(");
 
-			// Handle the composite components
-			ParseComposite(uri, rc, ssp);
-			return rc;
-		}
-
-		/// <summary>
-		/// </summary>
-		/// <param name="uri"></param>
-		/// <param name="rc"></param>
-		/// <param name="ssp"></param>
-		private static void ParseComposite(Uri uri, CompositeData rc, String ssp)
-		{
-			String componentString;
-			String parms;
-
-			if(!CheckParenthesis(ssp))
-			{
-				throw new NMSException(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(")");
-				int start = intialParen + 1;
-				int len = p - start;
-				componentString = ssp.Substring(start, len);
-				parms = ssp.Substring(p + 1).Trim();
-			}
-			else
-			{
-			    componentString = ssp;
-				parms = "";
-			}
-
-			String[] components = SplitComponents(componentString);
-			rc.Components = new Uri[components.Length];
-			for(int i = 0; i < components.Length; i++)
-			{
-                if(components.Length == 1 && components[0] == ssp)
-                {
-                    String[] parts = components[0].Split('?');
-                    UriBuilder builder = new UriBuilder();
-                    builder.Path = parts[0];
-                    if(parts.Length == 2)
+            // Handle the composite components
+            ParseComposite(uri, rc, ssp);
+            return rc;
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <param name="uri"></param>
+        /// <param name="rc"></param>
+        /// <param name="ssp"></param>
+        private static void ParseComposite(Uri uri, CompositeData rc, String ssp)
+        {
+            String componentString;
+            String parms;
+
+            if(!CheckParenthesis(ssp))
+            {
+                throw new NMSException(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(")");
+                int start = intialParen + 1;
+                int len = p - start;
+                componentString = ssp.Substring(start, len);
+                parms = ssp.Substring(p + 1).Trim();
+            }
+            else
+            {
+                componentString = ssp;
+                parms = "";
+            }
+
+            String[] components = SplitComponents(componentString);
+            rc.Components = new Uri[components.Length];
+            for(int i = 0; i < components.Length; i++)
+            {
+//                if(components.Length == 1 && components[0] == ssp)
+//                {
+//                    String[] parts = components[0].Split('?');
+//                    UriBuilder builder = new UriBuilder();
+//                    builder.Path = parts[0];
+//                    if(parts.Length == 2)
+//                    {
+//                        builder.Query = parts[1];
+//                    }
+//                    rc.Components[i] = builder.Uri;
+//                }
+//                else
+//                {
+                    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
+        {
+            get { return new StringDictionary(); }
+        }
+
+        /// <summary>
+        /// </summary>
+        /// <param name="componentString"></param>
+        private static String[] SplitComponents(String componentString)
+        {
+            ArrayList l = new ArrayList();
+
+            int last = 0;
+            int depth = 0;
+            char[] chars = componentString.ToCharArray();
+            for(int i = 0; i < chars.Length; i++)
+            {
+                switch(chars[i])
+                {
+                case '(':
+                    depth++;
+                    break;
+
+                case ')':
+                    depth--;
+                    break;
+
+                case ',':
+                    if(depth == 0)
                     {
-                        builder.Query = parts[1];
+                        String s = componentString.Substring(last, i - last);
+                        l.Add(s);
+                        last = i + 1;
                     }
-                    rc.Components[i] = builder.Uri;
+                    break;
+
+                default:
+                    break;
                 }
-                else
+            }
+
+            String ending = componentString.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)
                 {
-				    rc.Components[i] = new Uri(components[i].Trim());
+                    i++;
+                    open++;
                 }
-			}
 
-			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
-		{
-			get { return new StringDictionary(); }
-		}
-
-		/// <summary>
-		/// </summary>
-		/// <param name="componentString"></param>
-		private static String[] SplitComponents(String componentString)
-		{
-			ArrayList l = new ArrayList();
-
-			int last = 0;
-			int depth = 0;
-			char[] chars = componentString.ToCharArray();
-			for(int i = 0; i < chars.Length; i++)
-			{
-				switch(chars[i])
-				{
-				case '(':
-					depth++;
-					break;
-
-				case ')':
-					depth--;
-					break;
-
-				case ',':
-					if(depth == 0)
-					{
-						String s = componentString.Substring(last, i - last);
-						l.Add(s);
-						last = i + 1;
-					}
-					break;
-
-				default:
-					break;
-				}
-			}
-
-			String ending = componentString.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;
-		}
-	}
+                i = 0;
+                while((i = str.IndexOf(')', i)) >= 0)
+                {
+                    i++;
+                    closed++;
+                }
+
+                result = (open == closed);
+            }
+
+            return result;
+        }
+    }
 }