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();
+ }
+ }
+}