You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2007/09/20 01:29:46 UTC

svn commit: r577464 - in /incubator/qpid/trunk/qpid/java: client/src/main/java/org/apache/qpid/client/ client/src/main/java/org/apache/qpidity/naming/ client/src/main/java/org/apache/qpidity/nclient/ client/src/main/java/org/apache/qpidity/njms/ common...

Author: rajith
Date: Wed Sep 19 16:29:44 2007
New Revision: 577464

URL: http://svn.apache.org/viewvc?rev=577464&view=rev
Log:
merged the qpidity.url classes in to qpid.url and deleted qpidity.url

Added:
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/BindingURLImpl.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidBindingURL.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURL.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURLImpl.java
Removed:
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpidity/url/
Modified:
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/naming/PropertiesFileInitialContextFactory.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Connection.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionFactoryImpl.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionImpl.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/DestinationImpl.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/QueueImpl.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/TopicImpl.java

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java Wed Sep 19 16:29:44 2007
@@ -64,8 +64,8 @@
 import org.apache.qpid.jms.ConnectionURL;
 import org.apache.qpid.jms.FailoverPolicy;
 import org.apache.qpid.protocol.AMQConstant;
+import org.apache.qpid.url.QpidURL;
 import org.apache.qpid.url.URLSyntaxException;
-import org.apache.qpidity.url.QpidURL;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/naming/PropertiesFileInitialContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/naming/PropertiesFileInitialContextFactory.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/naming/PropertiesFileInitialContextFactory.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/naming/PropertiesFileInitialContextFactory.java Wed Sep 19 16:29:44 2007
@@ -5,9 +5,9 @@
  * 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
@@ -19,13 +19,13 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.qpid.url.BindingURLImpl;
+import org.apache.qpid.url.QpidBindingURL;
 import org.apache.qpidity.njms.ConnectionFactoryImpl;
 import org.apache.qpidity.njms.DestinationImpl;
 import org.apache.qpidity.njms.QueueImpl;
 import org.apache.qpidity.njms.TopicImpl;
-import org.apache.qpidity.url.BindingURLImpl;
-import org.apache.qpidity.url.URLSyntaxException;
-import org.apache.qpidity.url.BindingURL;
+import org.apache.qpid.url.URLSyntaxException;
 import org.apache.qpidity.QpidException;
 
 import javax.naming.spi.InitialContextFactory;
@@ -47,7 +47,7 @@
 
 /**
  * This is an implementation of InitialContextFactory that uses a default jndi.properties file.
- * 
+ *
  */
 public class PropertiesFileInitialContextFactory implements InitialContextFactory
 {
@@ -198,7 +198,7 @@
      */
     protected Destination createDestination(String bindingURL)
     {
-        BindingURL binding;
+        QpidBindingURL binding;
         try
         {
             binding = new BindingURLImpl(bindingURL);
@@ -231,9 +231,9 @@
             {
                 result = new QueueImpl((String) value);
             }
-            else if (value instanceof BindingURL)
+            else if (value instanceof QpidBindingURL)
             {
-                result = new QueueImpl((BindingURL) value);
+                result = new QueueImpl((QpidBindingURL) value);
             }
         }
         catch (QpidException e)
@@ -255,9 +255,9 @@
              {
                  return new TopicImpl((String) value);
              }
-             else if (value instanceof BindingURL)
+             else if (value instanceof QpidBindingURL)
              {
-                 return new TopicImpl((BindingURL) value);
+                 return new TopicImpl((QpidBindingURL) value);
              }
         }
         catch (QpidException e)

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Client.java Wed Sep 19 16:29:44 2007
@@ -5,6 +5,7 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.apache.qpid.url.QpidURL;
 import org.apache.qpidity.BrokerDetails;
 import org.apache.qpidity.ErrorCode;
 import org.apache.qpidity.QpidException;
@@ -18,7 +19,6 @@
 import org.apache.qpidity.transport.ProtocolHeader;
 import org.apache.qpidity.transport.SessionDelegate;
 import org.apache.qpidity.transport.network.mina.MinaHandler;
-import org.apache.qpidity.url.QpidURL;
 
 
 public class Client implements org.apache.qpidity.nclient.Connection

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Connection.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Connection.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Connection.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/nclient/Connection.java Wed Sep 19 16:29:44 2007
@@ -18,8 +18,8 @@
  */
 package org.apache.qpidity.nclient;
 
+import org.apache.qpid.url.QpidURL;
 import org.apache.qpidity.QpidException;
-import org.apache.qpidity.url.QpidURL;
 
 /**
  * This represents a physical connection to a broker.

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionFactoryImpl.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionFactoryImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionFactoryImpl.java Wed Sep 19 16:29:44 2007
@@ -4,11 +4,11 @@
 import javax.naming.*;
 import javax.naming.spi.ObjectFactory;
 
+import org.apache.qpid.url.BindingURLImpl;
+import org.apache.qpid.url.QpidURL;
+import org.apache.qpid.url.QpidURLImpl;
 import org.apache.qpidity.QpidException;
 import org.apache.qpidity.BrokerDetails;
-import org.apache.qpidity.url.QpidURLImpl;
-import org.apache.qpidity.url.QpidURL;
-import org.apache.qpidity.url.BindingURLImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionImpl.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/ConnectionImpl.java Wed Sep 19 16:29:44 2007
@@ -33,8 +33,8 @@
 import javax.jms.Topic;
 import javax.jms.TopicSession;
 
+import org.apache.qpid.url.QpidURL;
 import org.apache.qpidity.QpidException;
-import org.apache.qpidity.url.QpidURL;
 import org.apache.qpidity.nclient.Client;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/DestinationImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/DestinationImpl.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/DestinationImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/DestinationImpl.java Wed Sep 19 16:29:44 2007
@@ -5,9 +5,9 @@
  * 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
@@ -18,9 +18,9 @@
 package org.apache.qpidity.njms;
 
 import org.apache.qpidity.QpidException;
-import org.apache.qpidity.url.BindingURL;
-import org.apache.qpidity.url.BindingURLImpl;
-import org.apache.qpidity.url.URLSyntaxException;
+import org.apache.qpid.url.URLSyntaxException;
+import org.apache.qpid.url.QpidBindingURL;
+import org.apache.qpid.url.BindingURLImpl;
 import org.apache.qpid.url.URLHelper;
 
 import javax.jms.Destination;
@@ -68,13 +68,13 @@
      * Indicates whether this destination is durable
      */
     protected boolean _isDurable;
-    
+
     protected String _routingKey;
 
     /**
      * The biding URL used to create this destiantion
      */
-    protected BindingURL _url;
+    protected QpidBindingURL _url;
 
     //--- Constructor
 
@@ -90,14 +90,14 @@
      * @param binding The URL
      * @throws QpidException If the URL is not valid
      */
-    public DestinationImpl(BindingURL binding) throws QpidException
+    public DestinationImpl(QpidBindingURL binding) throws QpidException
     {
         _exchangeName = binding.getExchangeName();
         _exchangeType = binding.getExchangeClass();
         _destinationName = binding.getDestinationName();
-        _isExclusive = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_EXCLUSIVE));
-        _isAutoDelete = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_AUTODELETE));
-        _isDurable = Boolean.parseBoolean(binding.getOption(BindingURL.OPTION_DURABLE));
+        _isExclusive = Boolean.parseBoolean(binding.getOption(QpidBindingURL.OPTION_EXCLUSIVE));
+        _isAutoDelete = Boolean.parseBoolean(binding.getOption(QpidBindingURL.OPTION_AUTODELETE));
+        _isDurable = Boolean.parseBoolean(binding.getOption(QpidBindingURL.OPTION_DURABLE));
         _queueName = binding.getQueueName();
         _routingKey = binding.getQueueName();
         _url = binding;
@@ -179,7 +179,7 @@
     {
         return _routingKey;
     }
-    
+
     /**
      * Indicates whether this destination is Durable.
      *
@@ -226,19 +226,19 @@
             sb.append('?');
             if (_isDurable)
             {
-                sb.append(org.apache.qpid.url.BindingURL.OPTION_DURABLE);
+                sb.append(org.apache.qpid.url.QpidBindingURL.OPTION_DURABLE);
                 sb.append("='true'");
                 sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR);
             }
             if (_isExclusive)
             {
-                sb.append(org.apache.qpid.url.BindingURL.OPTION_EXCLUSIVE);
+                sb.append(org.apache.qpid.url.QpidBindingURL.OPTION_EXCLUSIVE);
                 sb.append("='true'");
                 sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR);
             }
             if (_isAutoDelete)
             {
-                sb.append(org.apache.qpid.url.BindingURL.OPTION_AUTODELETE);
+                sb.append(org.apache.qpid.url.QpidBindingURL.OPTION_AUTODELETE);
                 sb.append("='true'");
                 sb.append(URLHelper.DEFAULT_OPTION_SEPERATOR);
             }

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/QueueImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/QueueImpl.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/QueueImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/QueueImpl.java Wed Sep 19 16:29:44 2007
@@ -5,9 +5,9 @@
  * 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
@@ -17,9 +17,9 @@
  */
 package org.apache.qpidity.njms;
 
+import org.apache.qpid.url.QpidBindingURL;
 import org.apache.qpidity.QpidException;
 import org.apache.qpidity.transport.Option;
-import org.apache.qpidity.url.BindingURL;
 import org.apache.qpidity.exchange.ExchangeDefaults;
 
 import javax.jms.Queue;
@@ -30,7 +30,7 @@
  */
 public class QueueImpl extends DestinationImpl implements Queue
 {
-    //--- Constructor    
+    //--- Constructor
     /**
      * Create a new QueueImpl with a given name.
      *
@@ -58,7 +58,7 @@
      * @param binding The URL
      * @throws QpidException If the URL is not valid
      */
-    protected QueueImpl(SessionImpl session, BindingURL binding) throws QpidException
+    protected QueueImpl(SessionImpl session, QpidBindingURL binding) throws QpidException
     {
         super(binding);
         registerQueue(session, false);
@@ -70,7 +70,7 @@
      * @param binding The URL
      * @throws QpidException If the URL is not valid
      */
-    public QueueImpl(BindingURL binding) throws QpidException
+    public QueueImpl(QpidBindingURL binding) throws QpidException
     {
         super(binding);
     }

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/TopicImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/TopicImpl.java?rev=577464&r1=577463&r2=577464&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/TopicImpl.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpidity/njms/TopicImpl.java Wed Sep 19 16:29:44 2007
@@ -5,9 +5,9 @@
  * 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
@@ -17,10 +17,10 @@
  */
 package org.apache.qpidity.njms;
 
+import org.apache.qpid.url.QpidBindingURL;
 import org.apache.qpidity.QpidException;
 import org.apache.qpidity.exchange.ExchangeDefaults;
 import org.apache.qpidity.transport.Option;
-import org.apache.qpidity.url.BindingURL;
 
 import javax.jms.Topic;
 import java.util.UUID;
@@ -78,7 +78,7 @@
      * @param binding The URL
      * @throws QpidException If the URL is not valid
      */
-    protected TopicImpl(SessionImpl session, BindingURL binding) throws QpidException
+    protected TopicImpl(SessionImpl session, QpidBindingURL binding) throws QpidException
     {
         super(binding);
         checkTopicExists(session);
@@ -91,7 +91,7 @@
      * @param binding The URL
      * @throws QpidException If the URL is not valid
      */
-    public TopicImpl(BindingURL binding) throws QpidException
+    public TopicImpl(QpidBindingURL binding) throws QpidException
     {
         super(binding);
     }
@@ -119,9 +119,9 @@
         session.getQpidSession().exchangeDeclare(_exchangeName, _exchangeType, null, null, Option.PASSIVE);
         // wait for the broker response
         System.out.println("Checking for exchange");
-        
+
         session.getQpidSession().sync();
-        
+
         System.out.println("Calling sync()");
         // todo get the exception
     }

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/BindingURLImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/BindingURLImpl.java?rev=577464&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/BindingURLImpl.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/BindingURLImpl.java Wed Sep 19 16:29:44 2007
@@ -0,0 +1,261 @@
+/* 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.
+ */
+package org.apache.qpid.url;
+
+import org.apache.qpidity.exchange.ExchangeDefaults;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+import java.util.HashMap;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class BindingURLImpl implements QpidBindingURL
+{
+    private static final Logger _logger = LoggerFactory.getLogger(BindingURLImpl.class);
+
+    String _url;
+    String _exchangeClass;
+    String _exchangeName;
+    String _destinationName;
+    String _queueName;
+    private HashMap<String, String> _options;
+
+    public BindingURLImpl(String url) throws URLSyntaxException
+    {
+        // format:
+        // <exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("Parsing URL: " + url);
+        }
+        _url = url;
+        _options = new HashMap<String, String>();
+        parseBindingURL();
+    }
+
+    private void parseBindingURL() throws URLSyntaxException
+    {
+        try
+        {
+            URI connection = new URI(_url);
+            String exchangeClass = connection.getScheme();
+            if (exchangeClass == null)
+            {
+                _url = ExchangeDefaults.DIRECT_EXCHANGE_CLASS + "://" + "" + "//" + _url;
+                // URLHelper.parseError(-1, "Exchange Class not specified.", _url);
+                parseBindingURL();
+                return;
+            }
+            else
+            {
+                setExchangeClass(exchangeClass);
+            }
+            String exchangeName = connection.getHost();
+            if (exchangeName == null)
+            {
+                if (getExchangeClass().equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS))
+                {
+                    setExchangeName("");
+                }
+                else
+                {
+                    throw URLHelper.parseError(-1, "Exchange Name not specified.", _url);
+                }
+            }
+            else
+            {
+                setExchangeName(exchangeName);
+            }
+            String queueName;
+            if ((connection.getPath() == null) || connection.getPath().equals(""))
+            {
+                throw URLHelper.parseError(_url.indexOf(_exchangeName) + _exchangeName.length(),
+                                           "Destination or Queue requried", _url);
+            }
+            else
+            {
+                int slash = connection.getPath().indexOf("/", 1);
+                if (slash == -1)
+                {
+                    throw URLHelper.parseError(_url.indexOf(_exchangeName) + _exchangeName.length(),
+                                               "Destination requried", _url);
+                }
+                else
+                {
+                    String path = connection.getPath();
+                    setDestinationName(path.substring(1, slash));
+
+                    // We don't set queueName yet as the actual value we use depends on options set
+                    // when we are dealing with durable subscriptions
+
+                    queueName = path.substring(slash + 1);
+
+                }
+            }
+
+            URLHelper.parseOptions(_options, connection.getQuery());
+            processOptions();
+            // We can now call setQueueName as the URL is full parsed.
+            setQueueName(queueName);
+            // Fragment is #string (not used)
+            if (_logger.isDebugEnabled())
+            {
+                _logger.debug("URL Parsed: " + this);
+            }
+        }
+        catch (URISyntaxException uris)
+        {
+            throw URLHelper.parseError(uris.getIndex(), uris.getReason(), uris.getInput());
+        }
+    }
+
+
+    private void processOptions()
+    {
+        // this is where we would parse any options that needed more than just storage.
+    }
+
+    public String getURL()
+    {
+        return _url;
+    }
+
+    public String getExchangeClass()
+    {
+        return _exchangeClass;
+    }
+
+    private void setExchangeClass(String exchangeClass)
+    {
+
+        _exchangeClass = exchangeClass;
+        if (exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS))
+        {
+            setOption(BindingURL.OPTION_EXCLUSIVE, "true");
+        }
+
+    }
+
+    public String getExchangeName()
+    {
+        return _exchangeName;
+    }
+
+    private void setExchangeName(String name)
+    {
+        _exchangeName = name;
+    }
+
+    public String getDestinationName()
+    {
+        return _destinationName;
+    }
+
+    private void setDestinationName(String name)
+    {
+        _destinationName = name;
+    }
+
+    public String getQueueName()
+    {
+        return _queueName;
+    }
+
+    public void setQueueName(String name) throws URLSyntaxException
+    {
+        if (_exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS))
+        {
+            if (Boolean.parseBoolean(getOption(OPTION_DURABLE)))
+            {
+                if (containsOption(BindingURL.OPTION_CLIENTID) && containsOption(BindingURL.OPTION_SUBSCRIPTION))
+                {
+                    _queueName = getOption(BindingURL.OPTION_CLIENTID + ":" + BindingURL.OPTION_SUBSCRIPTION);
+                }
+                else
+                {
+                    throw URLHelper.parseError(-1,
+                                               "Durable subscription must have values for " + BindingURL.OPTION_CLIENTID + " and " + BindingURL.OPTION_SUBSCRIPTION + ".",
+                                               _url);
+
+                }
+            }
+            else
+            {
+                _queueName = null;
+            }
+        }
+        else
+        {
+            _queueName = name;
+        }
+
+    }
+
+    public String getOption(String key)
+    {
+        return _options.get(key);
+    }
+
+    public void setOption(String key, String value)
+    {
+        _options.put(key, value);
+    }
+
+    public boolean containsOption(String key)
+    {
+        return _options.containsKey(key);
+    }
+
+    public String getRoutingKey()
+    {
+        if (_exchangeClass.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS))
+        {
+            return getQueueName();
+        }
+
+        if (containsOption(BindingURL.OPTION_ROUTING_KEY))
+        {
+            return getOption(OPTION_ROUTING_KEY);
+        }
+
+        return getDestinationName();
+    }
+
+    public void setRoutingKey(String key)
+    {
+        setOption(OPTION_ROUTING_KEY, key);
+    }
+
+    public String toString()
+    {
+        StringBuffer sb = new StringBuffer();
+
+        sb.append(_exchangeClass);
+        sb.append("://");
+        sb.append(_exchangeName);
+        sb.append('/');
+        sb.append(_destinationName);
+        sb.append('/');
+        sb.append(_queueName);
+
+        sb.append(URLHelper.printOptions(_options));
+
+        return sb.toString();
+    }
+}

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidBindingURL.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidBindingURL.java?rev=577464&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidBindingURL.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidBindingURL.java Wed Sep 19 16:29:44 2007
@@ -0,0 +1,53 @@
+/* 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.
+ */
+package org.apache.qpid.url;
+
+import org.apache.qpid.framing.AMQShortString;
+
+/*
+    Binding URL format:
+    <exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
+*/
+public interface QpidBindingURL
+{
+    public static final String OPTION_EXCLUSIVE = "exclusive";
+    public static final String OPTION_AUTODELETE = "autodelete";
+    public static final String OPTION_DURABLE = "durable";
+    public static final String OPTION_CLIENTID = "clientid";
+    public static final String OPTION_SUBSCRIPTION = "subscription";
+    public static final String OPTION_ROUTING_KEY = "routingkey";
+
+
+    String getURL();
+
+   String getExchangeClass();
+
+    String getExchangeName();
+
+    String getDestinationName();
+
+    String getQueueName();
+
+    String getOption(String key);
+
+    boolean containsOption(String key);
+
+    String getRoutingKey();
+
+    String toString();
+}

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURL.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURL.java?rev=577464&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURL.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURL.java Wed Sep 19 16:29:44 2007
@@ -0,0 +1,57 @@
+/* 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.
+ */
+package org.apache.qpid.url;
+
+import org.apache.qpidity.BrokerDetails;
+
+import java.util.List;
+
+/**
+ * The format of the Qpid URL is based on the AMQP one.
+ * The grammar is as follows:
+ * <p> qpid_url          = "qpid:" [user_props] prot_addr_list ["/" future-parameters]
+ * <p> prot_addr_list 	 = [prot_addr ","]* prot_addr
+ * <p> prot_addr         = tcp_prot_addr | tls_prot_addr | future_prot_addr
+ * <p> tcp_prot_addr     = tcp_id tcp_addr
+ * <p> tcp_id            = "tcp:" | ""
+ * <p> tcp_addr          = [host [":" port] ]
+ * <p> host              = <as per [2]>
+ * <p> port              = number
+ * <p> tls_prot_addr     = tls_id tls_addr
+ * <p> tls_id            = "tls:" | ""
+ * <p> tls_addr          = [host [":" port] ]
+ * <p> future_prot_addr  = future_prot_id future_prot_addr
+ * <p> future_prot_id    = <placeholder, must end in ":". Example "sctp:">
+ * <p> future_prot_addr  = <placeholder, protocl-specific address>
+ * <p> future_parameters = <placeholder, not used in failover addresses>
+ */
+public interface QpidURL
+{
+    /**
+     * Get all the broker details
+     *
+     * @return A list of BrokerDetails.
+     */
+    public List<BrokerDetails> getAllBrokerDetails();
+
+    /**
+     * Get this URL string form
+     * @return This URL string form.
+     */
+    public String getURL();
+}

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURLImpl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURLImpl.java?rev=577464&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURLImpl.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/url/QpidURLImpl.java Wed Sep 19 16:29:44 2007
@@ -0,0 +1,460 @@
+/* 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.
+ */
+package org.apache.qpid.url;
+
+import org.apache.qpidity.BrokerDetails;
+import org.apache.qpidity.BrokerDetailsImpl;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The format Qpid URL is based on the AMQP one.
+ * The grammar is as follows:
+ * <p> qpid_url          = "qpid:" [client_props "@"] port_addr_list ["/" future-parameters]
+ * <p> port_addr_list 	 = [port_addr ","]* port_addr
+ * <p> port_addr         = tcp_port_addr | tls_prot_addr | future_prot_addr
+ * <p> tcp_port_addr     = tcp_id tcp_addr
+ * <p> tcp_id            = "tcp:" | ""
+ * <p> tcp_addr          = host [":" port]
+ * <p> host              = <as per http://www.apps.ietf.org/>
+ * <p> port              = number
+ * <p> tls_prot_addr     = tls_id tls_addr
+ * <p> tls_id            = "tls:" | ""
+ * <p> tls_addr          = host [":" port]
+ * <p> future_prot_addr  = future_prot_id future_prot_addr
+ * <p> future_prot_id    = <placeholder, must end in ":". Example "sctp:">
+ * <p> future_prot_addr  = <placeholder, protocl-specific address>
+ * <p> future_parameters = <placeholder, not used in failover addresses>
+ * <p> client_props      = [client_prop ";"]*  client_prop
+ * <p> client_prop       = prop "=" val
+ * <p> prop              = chars as per <as per http://www.apps.ietf.org/>
+ * <p> val               = valid as per <as per http://www.apps.ietf.org/>
+ * <p/>
+ * Ex: qpid:virtualhost=tcp:host-foo,test,client_id=foo@tcp:myhost.com:5672,virtualhost=prod;
+ * keystore=/opt/keystore@client_id2@tls:mysecurehost.com:5672
+ */
+public class QpidURLImpl implements QpidURL
+{
+    private static final char[] URL_START_SEQ = new char[]{'q', 'p', 'i', 'd', ':'};
+    private static final char PROPERTY_EQUALS_CHAR = '=';
+    private static final char PROPERTY_SEPARATOR_CHAR = ';';
+    private static final char ADDRESS_SEPERATOR_CHAR = ',';
+
+    //private static final char CLIENT_ID_TRANSPORT_SEPARATOR_CHAR = ':';
+    private static final char TRANSPORT_HOST_SEPARATOR_CHAR = ':';
+    private static final char HOST_PORT_SEPARATOR_CHAR = ':';
+    private static final char AT_CHAR = '@';
+
+    enum URLParserState
+    {
+        QPID_URL_START,
+        ADDRESS_START,
+        PROPERTY_NAME,
+        PROPERTY_EQUALS,
+        PROPERTY_VALUE,
+        PROPERTY_SEPARATOR,
+        AT_CHAR,
+        //   CLIENT_ID,
+        //   CLIENT_ID_TRANSPORT_SEPARATOR,
+        TRANSPORT,
+        TRANSPORT_HOST_SEPARATOR,
+        HOST,
+        HOST_PORT_SEPARATOR,
+        PORT,
+        ADDRESS_END,
+        ADDRESS_SEPERATOR,
+        QPID_URL_END,
+        ERROR
+    }
+
+    //-- Constructors
+
+    private char[] _url;
+    private List<BrokerDetails> _brokerDetailList = new ArrayList<BrokerDetails>();
+    private String _error;
+    private int _index = 0;
+    private BrokerDetails _currentBroker;
+    private String _currentPropName;
+    private boolean _endOfURL = false;
+    private URLParserState _currentParserState;
+
+    public QpidURLImpl(String url) throws MalformedURLException
+    {
+        _url = url.toCharArray();
+        _endOfURL = false;
+        _currentParserState = URLParserState.QPID_URL_START;
+        URLParserState prevState = _currentParserState; // for error handling        
+        try
+        {
+            while (_currentParserState != URLParserState.ERROR && _currentParserState != URLParserState.QPID_URL_END)
+            {
+                prevState = _currentParserState;
+                _currentParserState = next();
+            }
+
+            if (_currentParserState == URLParserState.ERROR)
+            {
+                _error =
+                        "Invalid URL format [current_state = " + prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index + ") due to " + _error;
+                MalformedURLException ex;
+                ex = new MalformedURLException(_error);
+                throw ex;
+            }
+        }
+        catch (ArrayIndexOutOfBoundsException e)
+        {
+            e.printStackTrace();
+            _error =
+                    "Invalid URL format [current_state = " + prevState + ", broker details parsed so far " + _currentBroker + " ] error at (" + _index + ")";
+            MalformedURLException ex;
+            ex = new MalformedURLException(_error);
+            throw ex;
+        }
+    }
+
+    //-- interface QpidURL
+    public List<BrokerDetails> getAllBrokerDetails()
+    {
+        return _brokerDetailList;
+    }
+
+    public String getURL()
+    {
+        return new String(_url);
+    }
+
+    private URLParserState next()
+    {
+        switch (_currentParserState)
+        {
+            case QPID_URL_START:
+                return checkSequence(URL_START_SEQ, URLParserState.ADDRESS_START);
+            case ADDRESS_START:
+                return startAddress();
+            case PROPERTY_NAME:
+                return extractPropertyName();
+            case PROPERTY_EQUALS:
+                _index++; // skip the equal sign
+                return URLParserState.PROPERTY_VALUE;
+            case PROPERTY_VALUE:
+                return extractPropertyValue();
+            case PROPERTY_SEPARATOR:
+                _index++; // skip ","
+                return URLParserState.PROPERTY_NAME;
+            case AT_CHAR:
+                _index++; // skip the @ sign
+                return setProperties();
+                // case CLIENT_ID:
+                //     return extractClientId();
+                //  case CLIENT_ID_TRANSPORT_SEPARATOR:
+                //      _index++; // skip ":"
+                //      return URLParserState.TRANSPORT;
+            case TRANSPORT:
+                return extractTransport();
+            case TRANSPORT_HOST_SEPARATOR:
+                _index++; // skip ":"
+                return URLParserState.HOST;
+            case HOST:
+                return extractHost();
+            case HOST_PORT_SEPARATOR:
+                _index++; // skip ":"
+                return URLParserState.PORT;
+            case PORT:
+                return extractPort();
+            case ADDRESS_END:
+                return endAddress();
+            case ADDRESS_SEPERATOR:
+                _index++; // skip ","
+                return URLParserState.ADDRESS_START;
+            default:
+                return URLParserState.ERROR;
+        }
+    }
+
+    private URLParserState checkSequence(char[] expected, URLParserState nextPart)
+    {
+        for (char anExpected : expected)
+        {
+            if (anExpected != _url[_index])
+            {
+                _error = "Excepted (" + anExpected + ") at position " + _index + ", got (" + _url[_index] + ")";
+                return URLParserState.ERROR;
+            }
+            _index++;
+        }
+        return nextPart;
+    }
+
+    private URLParserState startAddress()
+    {
+        _currentBroker = new BrokerDetailsImpl();
+        // check that there is a "@" before the nexte ","
+        for (int j = _index; j < _url.length; j++)
+        {
+            if (_url[j] == AT_CHAR)
+            {
+                return URLParserState.PROPERTY_NAME;
+            }
+            else if (_url[j] == ADDRESS_SEPERATOR_CHAR)
+            {
+                return URLParserState.TRANSPORT;
+            }
+        }
+        return URLParserState.TRANSPORT;
+    }
+
+    private URLParserState endAddress()
+    {
+        _brokerDetailList.add(_currentBroker);
+        if (_endOfURL)
+        {
+            return URLParserState.QPID_URL_END;
+        }
+        else
+        {
+            return URLParserState.ADDRESS_SEPERATOR;
+        }
+    }
+
+    private URLParserState extractPropertyName()
+    {
+        StringBuilder b = new StringBuilder();
+        char next = _url[_index];
+        while (next != PROPERTY_EQUALS_CHAR && next != AT_CHAR)
+        {
+            b.append(next);
+            next = _url[++_index];
+        }
+        _currentPropName = b.toString();
+        if (_currentPropName.trim().equals(""))
+        {
+            _error = "Property name cannot be empty";
+            return URLParserState.ERROR;
+        }
+        else if (next == PROPERTY_EQUALS_CHAR)
+        {
+            return URLParserState.PROPERTY_EQUALS;
+        }
+        else
+        {
+            return URLParserState.AT_CHAR;
+        }
+    }
+
+    private URLParserState extractPropertyValue()
+    {
+        StringBuilder b = new StringBuilder();
+        char next = _url[_index];
+        while (next != PROPERTY_SEPARATOR_CHAR && next != AT_CHAR)
+        {
+            b.append(next);
+            next = _url[++_index];
+        }
+        String propValue = b.toString();
+        if (propValue.trim().equals(""))
+        {
+            _error = "Property values cannot be empty";
+            return URLParserState.ERROR;
+        }
+        else
+        {
+            _currentBroker.setProperty(_currentPropName, propValue);
+            if (next == PROPERTY_SEPARATOR_CHAR)
+            {
+                return URLParserState.PROPERTY_SEPARATOR;
+            }
+            else
+            {
+                return URLParserState.AT_CHAR;
+            }
+        }
+    }
+
+    private URLParserState setProperties()
+    {
+        //Check if atleast virtualhost is there
+        if (_currentBroker.getProperties().get(BrokerDetails.VIRTUAL_HOST) != null)
+        {
+            _currentBroker.setVirtualHost(_currentBroker.getProperties().get(BrokerDetails.VIRTUAL_HOST));
+            _currentBroker.getProperties().remove(BrokerDetails.VIRTUAL_HOST);
+        }
+
+        if (_currentBroker.getProperties().get(BrokerDetails.USERNAME) != null)
+        {
+            String username = _currentBroker.getProperties().get(BrokerDetails.USERNAME);
+            _currentBroker.setUserName(username);
+        }
+        if (_currentBroker.getProperties().get(BrokerDetails.PASSWORD) != null)
+        {
+            String password = _currentBroker.getProperties().get(BrokerDetails.PASSWORD);
+            _currentBroker.setPassword(password);
+        }
+        if (_currentBroker.getProperties().get(BrokerDetails.CLIENT_ID) != null)
+        {
+            String clientID = _currentBroker.getProperties().get(BrokerDetails.CLIENT_ID);
+            _currentBroker.setProperty(BrokerDetails.CLIENT_ID, clientID);
+        }
+        return URLParserState.TRANSPORT;
+    }
+
+    private URLParserState extractTransport()
+    {
+        String transport = buildUntil(TRANSPORT_HOST_SEPARATOR_CHAR);
+        if (transport.trim().equals(""))
+        {
+            _error = "Transport cannot be empty";
+            return URLParserState.ERROR;
+        }
+        else if (!(transport.trim().equals(BrokerDetails.PROTOCOL_TCP) || transport.trim()
+                .equals(BrokerDetails.PROTOCOL_TLS)))
+        {
+            _error = "Transport cannot be " + transport + " value must be tcp or tls";
+            return URLParserState.ERROR;
+        }
+        else
+        {
+            _currentBroker.setProtocol(transport);
+            return URLParserState.TRANSPORT_HOST_SEPARATOR;
+        }
+    }
+
+    private URLParserState extractHost()
+    {
+        char nextSep = 'c';
+        String host;
+        for (int i = _index; i < _url.length; i++)
+        {
+            if (_url[i] == HOST_PORT_SEPARATOR_CHAR)
+            {
+                nextSep = HOST_PORT_SEPARATOR_CHAR;
+                break;
+            }
+            else if (_url[i] == ADDRESS_SEPERATOR_CHAR)
+            {
+                nextSep = ADDRESS_SEPERATOR_CHAR;
+                break;
+            }
+        }
+        if (nextSep == HOST_PORT_SEPARATOR_CHAR)
+        {
+            host = buildUntil(HOST_PORT_SEPARATOR_CHAR);
+            if (host.trim().equals(""))
+            {
+                _error = "Host cannot be empty";
+                return URLParserState.ERROR;
+            }
+            else
+            {
+                _currentBroker.setHost(host);
+                return URLParserState.HOST_PORT_SEPARATOR;
+            }
+        }
+        else if (nextSep == ADDRESS_SEPERATOR_CHAR)
+        {
+            host = buildUntil(ADDRESS_SEPERATOR_CHAR);
+            if (host.trim().equals(""))
+            {
+                _error = "Host cannot be empty";
+                return URLParserState.ERROR;
+            }
+            else
+            {
+                _currentBroker.setHost(host);
+                return URLParserState.ADDRESS_END;
+            }
+        }
+        else
+        {
+            host = String.copyValueOf(_url, _index, _url.length - _index);
+            _currentBroker.setHost(host);
+            _endOfURL = true;
+            return URLParserState.ADDRESS_END;
+        }
+    }
+
+
+    private URLParserState extractPort()
+    {
+
+        StringBuilder b = new StringBuilder();
+        try
+        {
+            char next = _url[_index];
+            while (next != ADDRESS_SEPERATOR_CHAR)
+            {
+                b.append(next);
+                next = _url[++_index];
+            }
+        }
+        catch (ArrayIndexOutOfBoundsException e)
+        {
+            _endOfURL = true;
+        }
+        String portStr = b.toString();
+        if (portStr.trim().equals(""))
+        {
+            _error = "Host cannot be empty";
+            return URLParserState.ERROR;
+        }
+        else
+        {
+            try
+            {
+                int port = Integer.parseInt(portStr);
+                _currentBroker.setPort(port);
+                return URLParserState.ADDRESS_END;
+            }
+            catch (NumberFormatException e)
+            {
+                _error = "Illegal number for port";
+                return URLParserState.ERROR;
+            }
+        }
+    }
+
+    private String buildUntil(char c)
+    {
+        StringBuilder b = new StringBuilder();
+        char next = _url[_index];
+        while (next != c)
+        {
+            b.append(next);
+            next = _url[++_index];
+        }
+        return b.toString();
+    }
+
+    public static void main(String[] args)
+    {
+        String testurl = "qpid:password=pass;username=name@tcp:test1,tcp:fooBroker,keystore=/usr/foo@tls:tlsBroker";
+        try
+        {
+            QpidURLImpl impl = new QpidURLImpl(testurl);
+            for (BrokerDetails d : impl.getAllBrokerDetails())
+            {
+                System.out.println(d);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+}