/*
* Copyright (C) 2011 Ahmed Yehia (ahmed.yehia.m@gmail.com)
*
* Licensed 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.lightcouch;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
/**
* Helper class for construction of HTTP request URIs.
* @author Ahmed Yehia
*
*/
class URIBuilder {
private String scheme;
private String host;
private int port;
private String path = "";
private final StringBuilder query = new StringBuilder();
private final List<String> queries = new ArrayList<String>();
public static URIBuilder builder() {
return new URIBuilder();
}
public static URIBuilder builder(URI uri) {
URIBuilder builder = URIBuilder.builder()
.scheme(uri.getScheme())
.host(uri.getHost())
.port(uri.getPort())
.path(uri.getPath());
return builder;
}
public URI build() {
try {
for (int i = 0; i < queries.size(); i++) {
query.append(queries.get(i));
if(i != queries.size() - 1)
query.append("&");
}
String q = (query.length() == 0) ? null : query.toString();
return new URI(scheme, null, host, port, path, q, null);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
}
}
public URIBuilder scheme(String scheme) {
this.scheme = scheme;
return this;
}
public URIBuilder host(String host) {
this.host = host;
return this;
}
public URIBuilder port(int port) {
this.port = port;
return this;
}
public URIBuilder path(String path) {
this.path += path;
return this;
}
public URIBuilder query(String name, Object value) {
if(name != null && value != null) {
queries.add(String.format("%s=%s", name, value));
}
return this;
}
public URIBuilder query(String query) {
this.query.append(query);
return this;
}
}