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 url) throws 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 }
|