blob: 3b9a0baab264a28cda4e2352a1504d88f689b90e [file] [log] [blame]
/*
*
* 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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import java.net.URISyntaxException;
import java.util.HashMap;
public class AMQBindingURL implements BindingURL
{
private static final Logger _logger = LoggerFactory.getLogger(AMQBindingURL.class);
private String _url;
private AMQShortString _exchangeClass = ExchangeDefaults.DIRECT_EXCHANGE_CLASS;
private AMQShortString _exchangeName = new AMQShortString("");
private AMQShortString _destinationName = new AMQShortString("");;
private AMQShortString _queueName = new AMQShortString("");
private AMQShortString[] _bindingKeys = new AMQShortString[0];
private HashMap<String, String> _options;
public AMQBindingURL(String url) throws URISyntaxException
{
// format:
// <exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
_logger.debug("Parsing URL: " + url);
_url = url;
_options = new HashMap<String, String>();
parseBindingURL();
}
private void parseBindingURL() throws URISyntaxException
{
BindingURLParser parser = new BindingURLParser();
parser.parse(_url,this);
processOptions();
_logger.debug("URL Parsed: " + this);
}
public void setExchangeClass(String exchangeClass)
{
setExchangeClass(new AMQShortString(exchangeClass));
}
public void setQueueName(String name)
{
setQueueName(new AMQShortString(name));
}
public void setDestinationName(String name)
{
setDestinationName(new AMQShortString(name));
}
public void setExchangeName(String exchangeName)
{
setExchangeName(new AMQShortString(exchangeName));
}
private void processOptions() throws URISyntaxException
{
}
public String getURL()
{
return _url;
}
public AMQShortString getExchangeClass()
{
return _exchangeClass;
}
private void setExchangeClass(AMQShortString exchangeClass)
{
_exchangeClass = exchangeClass;
if (exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS))
{
setOption(BindingURL.OPTION_EXCLUSIVE, "true");
}
}
public AMQShortString getExchangeName()
{
return _exchangeName;
}
private void setExchangeName(AMQShortString name)
{
_exchangeName = name;
}
public AMQShortString getDestinationName()
{
return _destinationName;
}
private void setDestinationName(AMQShortString name)
{
_destinationName = name;
}
public AMQShortString getQueueName()
{
return _queueName;
}
public void setQueueName(AMQShortString name)
{
_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 AMQShortString getRoutingKey()
{
if (_exchangeClass.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS))
{
if (containsOption(BindingURL.OPTION_ROUTING_KEY))
{
return new AMQShortString((String)getOption(OPTION_ROUTING_KEY));
}
else
{
return getQueueName();
}
}
if (containsOption(BindingURL.OPTION_ROUTING_KEY))
{
return new AMQShortString((String)getOption(OPTION_ROUTING_KEY));
}
return getDestinationName();
}
public AMQShortString[] getBindingKeys()
{
if (_bindingKeys != null && _bindingKeys.length>0)
{
return _bindingKeys;
}
else
{
return new AMQShortString[]{getRoutingKey()};
}
}
public void setBindingKeys(AMQShortString[] keys)
{
_bindingKeys = keys;
}
public void setRoutingKey(AMQShortString key)
{
setOption(OPTION_ROUTING_KEY, key.toString());
}
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));
// temp hack
if (getRoutingKey() == null || getRoutingKey().toString().equals(""))
{
if (sb.toString().indexOf("?") == -1)
{
sb.append("?");
}
else
{
sb.append("&");
}
for (AMQShortString key :_bindingKeys)
{
sb.append(BindingURL.OPTION_BINDING_KEY).append("='").append(key.toString()).append("'&");
}
return sb.toString().substring(0,sb.toString().length()-1);
}
else
{
return sb.toString();
}
}
}