diff options
Diffstat (limited to 'trunk/qpid/dotnet/Qpid.Client/Client/AmqBrokerInfo.cs')
-rw-r--r-- | trunk/qpid/dotnet/Qpid.Client/Client/AmqBrokerInfo.cs | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/trunk/qpid/dotnet/Qpid.Client/Client/AmqBrokerInfo.cs b/trunk/qpid/dotnet/Qpid.Client/Client/AmqBrokerInfo.cs new file mode 100644 index 0000000000..591c5b941f --- /dev/null +++ b/trunk/qpid/dotnet/Qpid.Client/Client/AmqBrokerInfo.cs @@ -0,0 +1,322 @@ +/* + * + * 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.Collections; +using System.Text; +using Apache.Qpid.Client.Qms; + +namespace Apache.Qpid.Client +{ + public class AmqBrokerInfo : IBrokerInfo + { + public readonly string URL_FORMAT_EXAMPLE = + "<transport>://<hostname>[:<port Default=\""+BrokerInfoConstants.DEFAULT_PORT+"\">][?<option>='<value>'[,<option>='<value>']]"; + + public const long DEFAULT_CONNECT_TIMEOUT = 30000L; + + private string _host = "localhost"; + private int _port = 5672; + private string _transport = "amqp"; + private Hashtable _options = new Hashtable(); + private SslOptions _sslOptions; + + public AmqBrokerInfo() + { + } + + public AmqBrokerInfo(string url) + { + // URL should be of format tcp://host:port?option='value',option='value' + try + { + Uri connection = new Uri(url); + + String transport = connection.Scheme; + + // Handles some defaults to minimise changes to existing broker URLS e.g. localhost + if (transport != null) + { + transport = transport.ToLower(); + //todo this list of valid transports should be enumerated somewhere + if ((!(transport.Equals("vm") || transport.Equals("tcp")))) + { + if (transport.Equals("localhost")) + { + connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url); + transport = connection.Scheme; + } + else + { + if (url[transport.Length] == ':' && url[transport.Length + 1] != '/') + { + //Then most likely we have a host:port value + connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url); + transport = connection.Scheme; + } + else + { + URLHelper.parseError(0, transport.Length, "Unknown transport", url); + } + } + } + } + else + { + //Default the transport + connection = new Uri(BrokerInfoConstants.DEFAULT_TRANSPORT + "://" + url); + transport = connection.Scheme; + } + + if (transport == null) + { + URLHelper.parseError(-1, "Unknown transport:'" + transport + "'" + + " In broker URL:'" + url + "' Format: " + URL_FORMAT_EXAMPLE, ""); + } + + Transport = transport; + + String host = connection.Host; + if (!host.Equals("default")) Host = host; + + int port = connection.Port; + + if (port == -1) + { + // Fix for when there is port data but it is not automatically parseable by getPort(). + String auth = connection.Authority; + + if (auth != null && auth.IndexOf(':') != -1) + { + int start = auth.IndexOf(":") + 1; + int end = start; + bool looking = true; + bool found = false; + //Walk the authority looking for a port value. + while (looking) + { + try + { + end++; + int.Parse(auth.Substring(start, end-start+1)); + + if (end >= auth.Length) + { + looking = false; + found = true; + } + } + catch (FormatException) + { + looking = false; + } + + } + if (found) + { + Port = int.Parse(auth.Substring(start, end-start+1)); + } + else + { + URLHelper.parseError(connection.ToString().IndexOf(connection.Authority) + end - 1, + "Illegal character in port number", connection.ToString()); + } + } + else + { + Port = BrokerInfoConstants.DEFAULT_PORT; + } + } + else + { + Port = port; + } + + String queryString = connection.Query; + if (queryString.Length > 0 && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } + + URLHelper.parseOptions(_options, queryString); + + //Fragment is #string (not used) + } + catch (UriFormatException uris) + { + throw uris; +// if (uris is UrlSyntaxException) +// { +// throw uris; +// } +// +// URLHelper.parseError(uris.getIndex(), uris.getReason(), uris.getInput()); + } + } + + public AmqBrokerInfo(string transport, string host, int port, bool useSSL) : this() + { + _transport = transport; + _host = host; + _port = port; + + if (useSSL) + { + SetOption(BrokerInfoConstants.OPTIONS_SSL, "true"); + } + } + + public AmqBrokerInfo(string transport, string host, int port, SslOptions sslConfig) + : this() + { + _transport = transport; + _host = host; + _port = port; + + if ( sslConfig != null ) + { + SetOption(BrokerInfoConstants.OPTIONS_SSL, "true"); + _sslOptions = sslConfig; + } + } + + + public string Host + { + get { return _host; } + set { _host = value; } + } + + public int Port + { + get { return _port; } + set { _port = value; } + } + + public string Transport + { + get { return _transport; } + set { _transport = value; } + } + + public SslOptions SslOptions + { + get { return _sslOptions; } + } + + public string GetOption(string key) + { + return (string)_options[key]; + } + + public void SetOption(string key, string value) + { + _options[key] = value; + } + + public long Timeout + { + get + { + if ( _options.ContainsKey(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT) ) + { + try + { + return long.Parse(GetOption(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT)); + } catch ( FormatException ) + { + //Do nothing as we will use the default below. + } + } + return BrokerInfoConstants.DEFAULT_CONNECT_TIMEOUT; + } + set + { + SetOption(BrokerInfoConstants.OPTIONS_CONNECT_TIMEOUT, value.ToString()); + } + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + + sb.Append(_transport); + sb.Append("://"); + + if (!(StringEqualsIgnoreCase(_transport, "vm"))) + { + sb.Append(_host); + } + + sb.Append(':'); + sb.Append(_port); + + sb.Append(URLHelper.printOptions(_options)); + + return sb.ToString(); + } + + public override bool Equals(object obj) + { + if (!(obj is IBrokerInfo)) + { + return false; + } + + IBrokerInfo bd = (IBrokerInfo) obj; + return StringEqualsIgnoreCase(_host, bd.Host) && + _port == bd.Port && + StringEqualsIgnoreCase(_transport, bd.Transport) && + UseSSL == bd.UseSSL; + } + + public override int GetHashCode() + { + return _host.ToLower().GetHashCode() ^ _port.GetHashCode(); + } + + // TODO: move to util class. + private bool StringEqualsIgnoreCase(string one, string two) + { + return one.ToLower().Equals(two.ToLower()); + } + + public bool UseSSL + { + get + { + // To be friendly to users we should be case insensitive. + // or simply force users to conform to OPTIONS_SSL + // todo make case insensitive by trying ssl Ssl sSl ssL SSl SsL sSL SSL + + if ( _options.ContainsKey(BrokerInfoConstants.OPTIONS_SSL) ) + { + return StringEqualsIgnoreCase(GetOption(BrokerInfoConstants.OPTIONS_SSL), "true"); + } + + return false; + } + set + { + SetOption(BrokerInfoConstants.OPTIONS_SSL, value.ToString()); + } + } + } +} |