1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.util;
18
19 import java.net.MalformedURLException;
20 import java.net.URL;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.opensaml.ws.transport.http.HTTPTransportUtils;
25 import org.opensaml.xml.util.DatatypeHelper;
26 import org.opensaml.xml.util.Pair;
27
28
29
30
31
32
33
34 public class URLBuilder {
35
36
37 private String scheme;
38
39
40 private String username;
41
42
43 private String password;
44
45
46 private String host;
47
48
49 private int port;
50
51
52 private String path;
53
54
55 private List<Pair<String, String>> queryParams;
56
57
58 private String fragement;
59
60
61
62
63 public URLBuilder() {
64 queryParams = new ArrayList<Pair<String, String>>();
65 }
66
67
68
69
70
71
72
73
74 public URLBuilder(String baseURL) {
75 try {
76 URL url = new URL(baseURL);
77
78 setScheme(url.getProtocol());
79
80 String userInfo = url.getUserInfo();
81 if (!DatatypeHelper.isEmpty(userInfo)) {
82 if (userInfo.contains(":")) {
83 String[] userInfoComps = userInfo.split(":");
84 setUsername(HTTPTransportUtils.urlDecode(userInfoComps[0]));
85 setPassword(HTTPTransportUtils.urlDecode(userInfoComps[1]));
86 } else {
87 setUsername(userInfo);
88 }
89 }
90
91 setHost(url.getHost());
92 setPort(url.getPort());
93 setPath(url.getPath());
94
95 queryParams = new ArrayList<Pair<String, String>>();
96 String queryString = url.getQuery();
97 if (!DatatypeHelper.isEmpty(queryString)) {
98 String[] queryComps = queryString.split("&");
99 String queryComp;
100 String[] paramComps;
101 String paramName;
102 String paramValue;
103 for (int i = 0; i < queryComps.length; i++) {
104 queryComp = queryComps[i];
105 if (!queryComp.contains("=")) {
106 paramName = HTTPTransportUtils.urlDecode(queryComp);
107 queryParams.add(new Pair<String, String>(paramName, null));
108 } else {
109 paramComps = queryComp.split("=");
110 paramName = HTTPTransportUtils.urlDecode(paramComps[0]);
111 paramValue = HTTPTransportUtils.urlDecode(paramComps[1]);
112 queryParams.add(new Pair<String, String>(paramName, paramValue));
113 }
114 }
115 }
116
117 setFragment(url.getRef());
118 } catch (MalformedURLException e) {
119 throw new IllegalArgumentException("Given URL is not well formed", e);
120 }
121 }
122
123
124
125
126
127
128 public String getFragment() {
129 return fragement;
130 }
131
132
133
134
135
136
137 public void setFragment(String newFragment) {
138 fragement = DatatypeHelper.safeTrimOrNullString(newFragment);
139 }
140
141
142
143
144
145
146 public String getHost() {
147 return host;
148 }
149
150
151
152
153
154
155 public void setHost(String newHost) {
156 host = DatatypeHelper.safeTrimOrNullString(newHost);
157 }
158
159
160
161
162
163
164 public String getPassword() {
165 return password;
166 }
167
168
169
170
171
172
173 public void setPassword(String newPassword) {
174 password = DatatypeHelper.safeTrimOrNullString(newPassword);
175 }
176
177
178
179
180
181
182 public String getPath() {
183 return path;
184 }
185
186
187
188
189
190
191 public void setPath(String newPath) {
192 path = DatatypeHelper.safeTrimOrNullString(newPath);
193 }
194
195
196
197
198
199
200 public int getPort() {
201 return port;
202 }
203
204
205
206
207
208
209 public void setPort(int newPort) {
210 port = newPort;
211 }
212
213
214
215
216
217
218 public List<Pair<String, String>> getQueryParams() {
219 return queryParams;
220 }
221
222
223
224
225
226
227 public String getScheme() {
228 return scheme;
229 }
230
231
232
233
234
235
236 public void setScheme(String newScheme) {
237 scheme = DatatypeHelper.safeTrimOrNullString(newScheme);
238 }
239
240
241
242
243
244
245 public String getUsername() {
246 return username;
247 }
248
249
250
251
252
253
254 public void setUsername(String newUsername) {
255 username = DatatypeHelper.safeTrimOrNullString(newUsername);
256 }
257
258
259
260
261
262
263
264
265 public String buildURL() {
266 StringBuilder builder = new StringBuilder();
267
268 if (!DatatypeHelper.isEmpty(scheme)) {
269 builder.append(scheme);
270 builder.append("://");
271 }
272
273 if (!DatatypeHelper.isEmpty(username)) {
274 builder.append(username);
275 if (!DatatypeHelper.isEmpty(password)) {
276 builder.append(":");
277 builder.append(password);
278 }
279
280 builder.append("@");
281 }
282
283 if (!DatatypeHelper.isEmpty(host)) {
284 builder.append(host);
285 if (port > 0) {
286 builder.append(":");
287 builder.append(Integer.toString(port));
288 }
289 }
290
291 if (!DatatypeHelper.isEmpty(path)) {
292 if (!path.startsWith("/")) {
293 builder.append("/");
294 }
295 builder.append(path);
296 }
297
298 String queryString = buildQueryString();
299 if (!DatatypeHelper.isEmpty(queryString)) {
300 builder.append("?");
301 builder.append(queryString);
302 }
303
304 if (!DatatypeHelper.isEmpty(fragement)) {
305 builder.append("#");
306 builder.append(fragement);
307 }
308
309 return builder.toString();
310 }
311
312
313
314
315
316
317 public String buildQueryString() {
318 StringBuilder builder = new StringBuilder();
319 if (queryParams.size() > 0) {
320 String name;
321 String value;
322
323 Pair<String, String> param;
324 for (int i = 0; i < queryParams.size(); i++) {
325 param = queryParams.get(i);
326 name = DatatypeHelper.safeTrimOrNullString(param.getFirst());
327
328 if (name != null) {
329 builder.append(HTTPTransportUtils.urlEncode(name));
330 value = DatatypeHelper.safeTrimOrNullString(param.getSecond());
331 if (value != null) {
332 builder.append("=");
333 builder.append(HTTPTransportUtils.urlEncode(value));
334 }
335 if (i < queryParams.size() - 1) {
336 builder.append("&");
337 }
338 }
339 }
340 return builder.toString();
341 }
342
343 return null;
344 }
345 }