AMQBindingURL.java
001 /*
002  *
003  * Licensed to the Apache Software Foundation (ASF) under one
004  * or more contributor license agreements.  See the NOTICE file
005  * distributed with this work for additional information
006  * regarding copyright ownership.  The ASF licenses this file
007  * to you under the Apache License, Version 2.0 (the
008  * "License"); you may not use this file except in compliance
009  * with the License.  You may obtain a copy of the License at
010  *
011  *   http://www.apache.org/licenses/LICENSE-2.0
012  *
013  * Unless required by applicable law or agreed to in writing,
014  * software distributed under the License is distributed on an
015  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016  * KIND, either express or implied.  See the License for the
017  * specific language governing permissions and limitations
018  * under the License.
019  *
020  */
021 package org.apache.qpid.url;
022 
023 import java.net.URISyntaxException;
024 import java.util.HashMap;
025 import java.util.Iterator;
026 import java.util.List;
027 
028 import org.apache.qpid.exchange.ExchangeDefaults;
029 import org.apache.qpid.framing.AMQShortString;
030 import org.slf4j.Logger;
031 import org.slf4j.LoggerFactory;
032 
033 public class AMQBindingURL implements BindingURL
034 {
035     private static final Logger _logger = LoggerFactory.getLogger(AMQBindingURL.class);
036 
037     String _url;
038     AMQShortString _exchangeClass = ExchangeDefaults.DIRECT_EXCHANGE_CLASS;
039     AMQShortString _exchangeName = new AMQShortString("");
040     AMQShortString _destinationName = new AMQShortString("");;
041     AMQShortString _queueName = new AMQShortString("");
042     AMQShortString[] _bindingKeys = new AMQShortString[0];
043     private HashMap<String, String> _options;
044 
045     public AMQBindingURL(String urlthrows URISyntaxException
046     {
047         // format:
048         // <exch_class>://<exch_name>/[<destination>]/[<queue>]?<option>='<value>'[,<option>='<value>']*
049         _logger.debug("Parsing URL: " + url);
050         _url = url;
051         _options = new HashMap<String, String>();
052 
053         parseBindingURL();
054     }
055 
056     private void parseBindingURL() throws URISyntaxException
057     {
058         BindingURLParser parser = new BindingURLParser(_url,this);
059         processOptions();
060         _logger.debug("URL Parsed: " this);
061     }
062 
063     public void setExchangeClass(String exchangeClass)
064     {
065         setExchangeClass(new AMQShortString(exchangeClass));
066     }
067 
068     public void setQueueName(String name)
069     {
070         setQueueName(new AMQShortString(name));
071     }
072 
073     public void setDestinationName(String name)
074     {
075         setDestinationName(new AMQShortString(name));
076     }
077 
078     public void setExchangeName(String exchangeName)
079     {
080         setExchangeName(new AMQShortString(exchangeName));
081     }
082 
083     private void processOptions() throws URISyntaxException
084     {
085     }
086 
087     public String getURL()
088     {
089         return _url;
090     }
091 
092     public AMQShortString getExchangeClass()
093     {
094         return _exchangeClass;
095     }
096 
097     private void setExchangeClass(AMQShortString exchangeClass)
098     {
099 
100         _exchangeClass = exchangeClass;
101         if (exchangeClass.equals(ExchangeDefaults.TOPIC_EXCHANGE_CLASS))
102         {
103             setOption(BindingURL.OPTION_EXCLUSIVE, "true");
104         }
105 
106     }
107 
108     public AMQShortString getExchangeName()
109     {
110         return _exchangeName;
111     }
112 
113     private void setExchangeName(AMQShortString name)
114     {
115         _exchangeName = name;
116     }
117 
118     public AMQShortString getDestinationName()
119     {
120         return _destinationName;
121     }
122 
123     private void setDestinationName(AMQShortString name)
124     {
125         _destinationName = name;
126     }
127 
128     public AMQShortString getQueueName()
129     {
130         return _queueName;
131     }
132 
133     public void setQueueName(AMQShortString name)
134     {
135         _queueName = name;
136     }
137 
138     public String getOption(String key)
139     {
140         return _options.get(key);
141     }
142 
143     public void setOption(String key, String value)
144     {
145         _options.put(key, value);
146     }
147 
148     public boolean containsOption(String key)
149     {
150         return _options.containsKey(key);
151     }
152 
153     public AMQShortString getRoutingKey()
154     {
155         if (_exchangeClass.equals(ExchangeDefaults.DIRECT_EXCHANGE_CLASS))
156         {
157             if (containsOption(BindingURL.OPTION_ROUTING_KEY))
158             {
159                 return new AMQShortString((String)getOption(OPTION_ROUTING_KEY));
160             }
161             else
162             {
163                 return getQueueName();
164             }
165         }
166 
167         if (containsOption(BindingURL.OPTION_ROUTING_KEY))
168         {
169             return new AMQShortString((String)getOption(OPTION_ROUTING_KEY));
170         }
171 
172         return getDestinationName();
173     }
174 
175     public AMQShortString[] getBindingKeys()
176     {
177         if (_bindingKeys != null && _bindingKeys.length>0)
178         {
179             return _bindingKeys;
180         }
181         else
182         {
183             return new AMQShortString[]{getRoutingKey()};
184         }
185     }
186 
187     public void setBindingKeys(AMQShortString[] keys)
188     {
189         _bindingKeys = keys;
190     }
191 
192     public void setRoutingKey(AMQShortString key)
193     {
194         setOption(OPTION_ROUTING_KEY, key.toString());
195     }
196 
197     public String toString()
198     {
199         StringBuffer sb = new StringBuffer();
200 
201         sb.append(_exchangeClass);
202         sb.append("://");
203         sb.append(_exchangeName);
204         sb.append('/');
205         sb.append(_destinationName);
206         sb.append('/');
207         sb.append(_queueName);
208 
209         sb.append(URLHelper.printOptions(_options));
210 
211         // temp hack
212         if (getRoutingKey() == null || getRoutingKey().toString().equals(""))
213         {
214 
215             if (sb.toString().indexOf("?"== -1)
216             {
217                 sb.append("?");
218             }
219             else
220             {
221                 sb.append("&");
222             }
223 
224             for (AMQShortString key :_bindingKeys)
225             {
226                 sb.append(BindingURL.OPTION_BINDING_KEY).append("='").append(key.toString()).append("'&");
227             }
228 
229             return sb.toString().substring(0,sb.toString().length()-1);
230         }
231         else
232         {
233             return sb.toString();
234         }
235     }
236 }