summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-03-26 15:10:09 +0100
committerGitHub <noreply@github.com>2021-03-26 15:10:09 +0100
commitcfc7927446dcea526fbdce38b8578c14671e1d6c (patch)
tree569ee92d0824693bba08207a8debc65910f36c86
parent16eebe41526a31c98d8e5c53f04a37f25334a91b (diff)
parent35852f8079b0e0cd4ca65298fc467d03236b9e20 (diff)
Merge pull request #17209 from vespa-engine/bjorncs/improvements
Bjorncs/improvements
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java40
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java5
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java2
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApi.java27
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java27
-rw-r--r--container-core/src/main/java/com/yahoo/restapi/UriBuilder.java (renamed from container-core/src/main/java/com/yahoo/restapi/Uri.java)24
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ServiceApiResponse.java12
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java4
8 files changed, 72 insertions, 69 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java b/configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java
index 06f3ba56c0c..63b9def7448 100644
--- a/configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java
@@ -6,6 +6,7 @@ import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.container.jdisc.LoggingRequestHandler;
import com.yahoo.restapi.RestApi;
import com.yahoo.restapi.RestApiRequestHandler;
+import com.yahoo.restapi.UriBuilder;
import com.yahoo.vespa.serviceview.bindings.ApplicationView;
import com.yahoo.vespa.serviceview.bindings.ConfigClient;
import com.yahoo.vespa.serviceview.bindings.HealthClient;
@@ -84,7 +85,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
}
private ApplicationView getDefaultUserInfo(RestApi.RequestContext context) {
- return getUserInfo(context.request().getUri(), "default", "default", "default", "default", "default");
+ return getUserInfo(context.uriBuilder(), "default", "default", "default", "default", "default");
}
private ApplicationView getUserInfo(RestApi.RequestContext context) {
@@ -93,7 +94,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
String environmentName = context.pathParameters().getStringOrThrow("environmentName");
String regionName = context.pathParameters().getStringOrThrow("regionName");
String instanceName = context.pathParameters().getStringOrThrow("instanceName");
- return getUserInfo(context.request().getUri(), tenantName, applicationName, environmentName, regionName, instanceName);
+ return getUserInfo(context.uriBuilder(), tenantName, applicationName, environmentName, regionName, instanceName);
}
public HashMap<?, ?> singleService(RestApi.RequestContext context) {
@@ -104,14 +105,14 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
String instanceName = context.pathParameters().getStringOrThrow("instanceName");
String identifier = context.pathParameters().getStringOrThrow("serviceIdentifier");
String apiParams = context.pathParameters().getString("*").orElse("");
- return singleService(context.request().getUri(), tenantName, applicationName, environmentName, regionName, instanceName, identifier, apiParams);
+ return singleService(context.uriBuilder(), context.request().getUri(), tenantName, applicationName, environmentName, regionName, instanceName, identifier, apiParams);
}
- protected ApplicationView getUserInfo(URI requestUri, String tenantName, String applicationName, String environmentName, String regionName, String instanceName) {
+ protected ApplicationView getUserInfo(UriBuilder uriBuilder, String tenantName, String applicationName, String environmentName, String regionName, String instanceName) {
ServiceModel model = new ServiceModel(
getModelConfig(tenantName, applicationName, environmentName, regionName, instanceName));
return model.showAllClusters(
- baseUri(requestUri).toString(),
+ baseUri(uriBuilder).toString(),
applicationIdentifier(tenantName, applicationName, environmentName, regionName, instanceName));
}
@@ -122,13 +123,13 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
}
protected HashMap<?, ?> singleService(
- URI requestUri, String tenantName, String applicationName, String environmentName, String regionName, String instanceName, String identifier, String apiParams) {
+ UriBuilder uriBuilder, URI requestUri, String tenantName, String applicationName, String environmentName, String regionName, String instanceName, String identifier, String apiParams) {
ServiceModel model = new ServiceModel(getModelConfig(tenantName, applicationName, environmentName, regionName, instanceName));
Service s = model.getService(identifier);
int requestedPort = s.matchIdentifierWithPort(identifier);
HealthClient resource = getHealthClient(apiParams, s, requestedPort, requestUri.getRawQuery(), client);
HashMap<?, ?> apiResult = resource.getHealthInfo();
- rewriteResourceLinks(requestUri, apiResult, model, s, applicationIdentifier(tenantName, applicationName, environmentName, regionName, instanceName), identifier);
+ rewriteResourceLinks(uriBuilder, apiResult, model, s, applicationIdentifier(tenantName, applicationName, environmentName, regionName, instanceName), identifier);
return apiResult;
}
@@ -148,7 +149,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
+ "/instance/" + instance;
}
- private void rewriteResourceLinks(URI requestUri,
+ private void rewriteResourceLinks(UriBuilder uriBuilder,
Object apiResult,
ServiceModel model,
Service self,
@@ -159,7 +160,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
Object resource = i.next();
if (resource instanceof String) {
try {
- StringBuilder buffer = linkBuffer(requestUri, applicationIdentifier);
+ StringBuilder buffer = linkBuffer(uriBuilder, applicationIdentifier);
// if it points to a port and host not part of the application, rewriting will not occur, so this is kind of safe
retarget(model, self, buffer, (String) resource);
i.set(buffer.toString());
@@ -167,7 +168,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
break; // assume relatively homogenous lists when doing rewrites to avoid freezing up on scanning long lists
}
} else {
- rewriteResourceLinks(requestUri, resource, model, self, applicationIdentifier, incomingIdentifier);
+ rewriteResourceLinks(uriBuilder, resource, model, self, applicationIdentifier, incomingIdentifier);
}
}
} else if (apiResult instanceof Map) {
@@ -176,14 +177,14 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
for (Map.Entry<Object, Object> entry : api.entrySet()) {
if (SINGLE_API_LINK.equals(entry.getKey()) && entry.getValue() instanceof String) {
try {
- rewriteSingleLink(entry, model, self, linkBuffer(requestUri, applicationIdentifier));
+ rewriteSingleLink(entry, model, self, linkBuffer(uriBuilder, applicationIdentifier));
} catch (GiveUpLinkRetargetingException e) {
// NOP
}
} else if ("link".equals(entry.getKey()) && entry.getValue() instanceof String) {
- buildSingleLink(entry, linkBuffer(requestUri, applicationIdentifier), incomingIdentifier);
+ buildSingleLink(entry, linkBuffer(uriBuilder, applicationIdentifier), incomingIdentifier);
} else {
- rewriteResourceLinks(requestUri, entry.getValue(), model, self, applicationIdentifier, incomingIdentifier);
+ rewriteResourceLinks(uriBuilder, entry.getValue(), model, self, applicationIdentifier, incomingIdentifier);
}
}
}
@@ -204,8 +205,8 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
}
}
- private StringBuilder linkBuffer(URI requestUri, String applicationIdentifier) {
- return baseUri(requestUri).append(applicationIdentifier);
+ private StringBuilder linkBuffer(UriBuilder uriBuilder, String applicationIdentifier) {
+ return baseUri(uriBuilder).append(applicationIdentifier);
}
private void rewriteSingleLink(Map.Entry<Object, Object> entry,
@@ -241,12 +242,7 @@ public class StateRequestHandler extends RestApiRequestHandler<StateRequestHandl
newUri.append(link.getRawPath());
}
- private static StringBuilder baseUri(URI requestUri) {
- return new StringBuilder(requestUri.getScheme())
- .append("://")
- .append(requestUri.getHost())
- .append(':')
- .append(requestUri.getPort())
- .append("/serviceview/v1/");
+ private static StringBuilder baseUri(UriBuilder uriBuilder) {
+ return new StringBuilder(uriBuilder.withPath("/serviceview/v1/").toString());
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java
index a0bb8a5acc7..68eca62e54b 100644
--- a/configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.serviceview;
import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.jdisc.test.MockMetric;
+import com.yahoo.restapi.UriBuilder;
import com.yahoo.vespa.serviceview.bindings.ApplicationView;
import com.yahoo.vespa.serviceview.bindings.HealthClient;
import com.yahoo.vespa.serviceview.bindings.ModelResponse;
@@ -74,14 +75,14 @@ public class StateRequestHandlerTest {
public final void test() {
Service s = correspondingModel.resolve("vespa.yahoo.com", 8080, null);
String api = "/state/v1";
- HashMap<?, ?> boom = testHandler.singleService(URI.create(EXTERNAL_BASE_URI), "default", "default", "default", "default", "default", s.getIdentifier(8080), api);
+ HashMap<?, ?> boom = testHandler.singleService(new UriBuilder("http://someserver:8080"), URI.create(EXTERNAL_BASE_URI), "default", "default", "default", "default", "default", s.getIdentifier(8080), api);
assertEquals(EXTERNAL_BASE_URI + "tenant/default/application/default/environment/default/region/default/instance/default/service/" + s.getIdentifier(8080) + api,
((Map<?, ?>) ((List<?>) boom.get("resources")).get(0)).get("url"));
}
@Test
public final void testLinkEquality() {
- ApplicationView explicitParameters = testHandler.getUserInfo(URI.create(EXTERNAL_BASE_URI), "default", "default", "default", "default", "default");
+ ApplicationView explicitParameters = testHandler.getUserInfo(new UriBuilder("http://someserver:8080"), "default", "default", "default", "default", "default");
assertEquals(EXTERNAL_BASE_URI + "tenant/default/application/default/environment/default/region/default/instance" +
"/default/service/container-clustercontroller-2ul67p8psr451t3w8kdd0qwgg/state/v1/",
explicitParameters.clusters.get(0).services.get(0).url);
diff --git a/container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java b/container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java
index 0188136addb..ce8c718fc74 100644
--- a/container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java
+++ b/container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java
@@ -31,7 +31,7 @@ public class ResourceResponse extends SlimeJsonResponse {
var resourceArray = slime.setObject().setArray("resources");
for (var subResource : subResources) {
var resourceEntry = resourceArray.addObject();
- resourceEntry.setString("url", new Uri(parentUrl).append(subResource)
+ resourceEntry.setString("url", new UriBuilder(parentUrl).append(subResource)
.withTrailingSlash()
.toString());
}
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApi.java b/container-core/src/main/java/com/yahoo/restapi/RestApi.java
index 7a2e71e1388..d4ed4888385 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApi.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApi.java
@@ -28,10 +28,10 @@ public interface RestApi {
Builder addRoute(RouteBuilder route);
Builder addFilter(Filter filter);
<EXCEPTION extends RuntimeException> Builder addExceptionMapper(Class<EXCEPTION> type, ExceptionMapper<EXCEPTION> mapper);
- <ENTITY> Builder addResponseMapper(Class<ENTITY> type, ResponseMapper<ENTITY> mapper);
- <ENTITY> Builder addRequestMapper(Class<ENTITY> type, RequestMapper<ENTITY> mapper);
- <ENTITY> Builder registerJacksonResponseEntity(Class<ENTITY> type);
- <ENTITY> Builder registerJacksonRequestEntity(Class<ENTITY> type);
+ <RESPONSE_ENTITY> Builder addResponseMapper(Class<RESPONSE_ENTITY> type, ResponseMapper<RESPONSE_ENTITY> mapper);
+ <REQUEST_ENTITY> Builder addRequestMapper(Class<REQUEST_ENTITY> type, RequestMapper<REQUEST_ENTITY> mapper);
+ <RESPONSE_ENTITY> Builder registerJacksonResponseEntity(Class<RESPONSE_ENTITY> type);
+ <REQUEST_ENTITY> Builder registerJacksonRequestEntity(Class<REQUEST_ENTITY> type);
Builder disableDefaultExceptionMappers();
Builder disableDefaultResponseMappers();
RestApi build();
@@ -41,30 +41,30 @@ public interface RestApi {
RouteBuilder name(String name);
RouteBuilder get(Handler<?> handler);
RouteBuilder post(Handler<?> handler);
- <ENTITY> RouteBuilder post(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler);
+ <REQUEST_ENTITY> RouteBuilder post(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler);
RouteBuilder put(Handler<?> handler);
- <ENTITY> RouteBuilder put(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler);
+ <REQUEST_ENTITY> RouteBuilder put(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler);
RouteBuilder delete(Handler<?> handler);
RouteBuilder patch(Handler<?> handler);
- <ENTITY> RouteBuilder patch(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler);
+ <REQUEST_ENTITY> RouteBuilder patch(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler);
RouteBuilder defaultHandler(Handler<?> handler);
- <ENTITY> RouteBuilder defaultHandler(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler);
+ <REQUEST_ENTITY> RouteBuilder defaultHandler(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler);
RouteBuilder addFilter(Filter filter);
}
- @FunctionalInterface interface Handler<ENTITY> {
- ENTITY handleRequest(RequestContext context) throws RestApiException;
+ @FunctionalInterface interface Handler<RESPONSE_ENTITY> {
+ RESPONSE_ENTITY handleRequest(RequestContext context) throws RestApiException;
}
- @FunctionalInterface interface HandlerWithRequestEntity<RESPONSE_ENTITY, REQUEST_ENTITY> {
+ @FunctionalInterface interface HandlerWithRequestEntity<REQUEST_ENTITY, RESPONSE_ENTITY> {
RESPONSE_ENTITY handleRequest(RequestContext context, REQUEST_ENTITY requestEntity) throws RestApiException;
}
@FunctionalInterface interface ExceptionMapper<EXCEPTION extends RuntimeException> { HttpResponse toResponse(RequestContext context, EXCEPTION exception); }
- @FunctionalInterface interface ResponseMapper<ENTITY> { HttpResponse toHttpResponse(RequestContext context, ENTITY responseEntity) throws RestApiException; }
+ @FunctionalInterface interface ResponseMapper<RESPONSE_ENTITY> { HttpResponse toHttpResponse(RequestContext context, RESPONSE_ENTITY responseEntity) throws RestApiException; }
- @FunctionalInterface interface RequestMapper<ENTITY> { Optional<ENTITY> toRequestEntity(RequestContext context) throws RestApiException; }
+ @FunctionalInterface interface RequestMapper<REQUEST_ENTITY> { Optional<REQUEST_ENTITY> toRequestEntity(RequestContext context) throws RestApiException; }
@FunctionalInterface interface Filter { HttpResponse filterRequest(FilterContext context); }
@@ -77,6 +77,7 @@ public interface RestApi {
Optional<RequestContent> requestContent();
RequestContent requestContentOrThrow();
ObjectMapper jacksonJsonMapper();
+ UriBuilder uriBuilder();
interface Parameters {
Optional<String> getString(String name);
diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
index 316ec06ef52..3a0f200996e 100644
--- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
+++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java
@@ -12,6 +12,7 @@ import com.yahoo.yolean.Exceptions;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -80,7 +81,7 @@ class RestApiImpl implements RestApi {
}
Object responseEntity;
try {
- responseEntity = resolvedHandler.toHttpResponse(context, requestEntity);
+ responseEntity = resolvedHandler.executeHandler(context, requestEntity);
} catch (RuntimeException e) {
return mapException(context, e);
}
@@ -279,13 +280,13 @@ class RestApiImpl implements RestApi {
@Override public RestApi.RouteBuilder post(Handler<?> handler) {
return addHandler(Method.POST, handler);
}
- @Override public <ENTITY> RouteBuilder post(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler) {
+ @Override public <ENTITY> RouteBuilder post(Class<ENTITY> type, HandlerWithRequestEntity<ENTITY, ?> handler) {
return addHandler(Method.POST, type, handler);
}
@Override public RestApi.RouteBuilder put(Handler<?> handler) {
return addHandler(Method.PUT, handler);
}
- @Override public <ENTITY> RouteBuilder put(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler) {
+ @Override public <ENTITY> RouteBuilder put(Class<ENTITY> type, HandlerWithRequestEntity<ENTITY, ?> handler) {
return addHandler(Method.PUT, type, handler);
}
@Override public RestApi.RouteBuilder delete(Handler<?> handler) {
@@ -294,13 +295,13 @@ class RestApiImpl implements RestApi {
@Override public RestApi.RouteBuilder patch(Handler<?> handler) {
return addHandler(Method.PATCH, handler);
}
- @Override public <ENTITY> RouteBuilder patch(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler) {
+ @Override public <ENTITY> RouteBuilder patch(Class<ENTITY> type, HandlerWithRequestEntity<ENTITY, ?> handler) {
return addHandler(Method.PATCH, type, handler);
}
@Override public RestApi.RouteBuilder defaultHandler(Handler<?> handler) {
defaultHandler = HandlerHolder.of(handler); return this;
}
- @Override public <ENTITY> RouteBuilder defaultHandler(Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler) {
+ @Override public <ENTITY> RouteBuilder defaultHandler(Class<ENTITY> type, HandlerWithRequestEntity<ENTITY, ?> handler) {
defaultHandler = HandlerHolder.of(type, handler); return this;
}
@Override public RestApi.RouteBuilder addFilter(RestApi.Filter filter) { filters.add(filter); return this; }
@@ -310,7 +311,7 @@ class RestApiImpl implements RestApi {
}
private <ENTITY> RestApi.RouteBuilder addHandler(
- Method method, Class<ENTITY> type, HandlerWithRequestEntity<?, ENTITY> handler) {
+ Method method, Class<ENTITY> type, HandlerWithRequestEntity<ENTITY, ?> handler) {
handlerPerMethod.put(method, HandlerHolder.of(type, handler)); return this;
}
@@ -344,6 +345,10 @@ class RestApiImpl implements RestApi {
return requestContent().orElseThrow(() -> new RestApiException.BadRequest("Request content missing"));
}
@Override public ObjectMapper jacksonJsonMapper() { return jacksonJsonMapper; }
+ @Override public UriBuilder uriBuilder() {
+ URI uri = request.getUri();
+ return new UriBuilder(uri.getScheme() + "://" + uri.getHost() + ':' + uri.getPort());
+ }
private class PathParametersImpl implements RestApi.RequestContext.PathParameters {
@Override
@@ -441,25 +446,25 @@ class RestApiImpl implements RestApi {
private static class HandlerHolder<REQUEST_ENTITY> {
final Class<REQUEST_ENTITY> type;
- final HandlerWithRequestEntity<?, REQUEST_ENTITY> handler;
+ final HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler;
- HandlerHolder(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<?, REQUEST_ENTITY> handler) {
+ HandlerHolder(Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, ?> handler) {
this.type = type;
this.handler = handler;
}
static <RESPONSE_ENTITY, REQUEST_ENTITY> HandlerHolder<REQUEST_ENTITY> of(
- Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<RESPONSE_ENTITY, REQUEST_ENTITY> handler) {
+ Class<REQUEST_ENTITY> type, HandlerWithRequestEntity<REQUEST_ENTITY, RESPONSE_ENTITY> handler) {
return new HandlerHolder<>(type, handler);
}
static <RESPONSE_ENTITY> HandlerHolder<Void> of(Handler<RESPONSE_ENTITY> handler) {
return new HandlerHolder<>(
Void.class,
- (HandlerWithRequestEntity<RESPONSE_ENTITY, Void>) (context, nullEntity) -> handler.handleRequest(context));
+ (HandlerWithRequestEntity<Void, RESPONSE_ENTITY>) (context, nullEntity) -> handler.handleRequest(context));
}
- Object toHttpResponse(RestApi.RequestContext context, Object entity) { return handler.handleRequest(context, type.cast(entity)); }
+ Object executeHandler(RestApi.RequestContext context, Object entity) { return handler.handleRequest(context, type.cast(entity)); }
}
private static class RequestMapperHolder<ENTITY> {
diff --git a/container-core/src/main/java/com/yahoo/restapi/Uri.java b/container-core/src/main/java/com/yahoo/restapi/UriBuilder.java
index c1b0d19eb3e..daebb147547 100644
--- a/container-core/src/main/java/com/yahoo/restapi/Uri.java
+++ b/container-core/src/main/java/com/yahoo/restapi/UriBuilder.java
@@ -10,16 +10,16 @@ import java.net.URISyntaxException;
*
* @author bratseth
*/
-public class Uri {
+public class UriBuilder {
/** The URI instance wrapped by this */
private final URI uri;
- public Uri(URI uri) {
+ public UriBuilder(URI uri) {
this.uri = uri;
}
- public Uri(String uri) {
+ public UriBuilder(String uri) {
try {
this.uri = new URI(uri);
}
@@ -29,21 +29,21 @@ public class Uri {
}
/** Returns a uri with the given path appended and all parameters removed */
- public Uri append(String pathElement) {
- return new Uri(withoutParameters().withTrailingSlash() + pathElement);
+ public UriBuilder append(String pathElement) {
+ return new UriBuilder(withoutParameters().withTrailingSlash() + pathElement);
}
- public Uri withoutParameters() {
+ public UriBuilder withoutParameters() {
int parameterStart = uri.toString().indexOf("?");
if (parameterStart < 0)
- return new Uri(uri.toString());
+ return new UriBuilder(uri.toString());
else
- return new Uri(uri.toString().substring(0, parameterStart));
+ return new UriBuilder(uri.toString().substring(0, parameterStart));
}
- public Uri withPath(String path) {
+ public UriBuilder withPath(String path) {
try {
- return new Uri(new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(),
+ return new UriBuilder(new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(),
uri.getPort(), path, uri.getQuery(), uri.getFragment()));
}
catch (URISyntaxException e) {
@@ -51,9 +51,9 @@ public class Uri {
}
}
- public Uri withTrailingSlash() {
+ public UriBuilder withTrailingSlash() {
if (toString().endsWith("/")) return this;
- return new Uri(toString() + "/");
+ return new UriBuilder(toString() + "/");
}
public URI toURI() { return uri; }
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ServiceApiResponse.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ServiceApiResponse.java
index 3166a380f47..9255cbfd7b2 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ServiceApiResponse.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ServiceApiResponse.java
@@ -7,7 +7,7 @@ import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.JsonFormat;
import com.yahoo.slime.Slime;
-import com.yahoo.restapi.Uri;
+import com.yahoo.restapi.UriBuilder;
import com.yahoo.vespa.serviceview.bindings.ApplicationView;
import com.yahoo.vespa.serviceview.bindings.ClusterView;
import com.yahoo.vespa.serviceview.bindings.ServiceView;
@@ -34,7 +34,7 @@ class ServiceApiResponse extends HttpResponse {
private final ApplicationId application;
private final List<URI> configServerURIs;
private final Slime slime;
- private final Uri requestUri;
+ private final UriBuilder requestUri;
// Only set for one of the setResponse calls
private String serviceName = null;
@@ -46,7 +46,7 @@ class ServiceApiResponse extends HttpResponse {
this.application = application;
this.configServerURIs = configServerURIs;
this.slime = new Slime();
- this.requestUri = new Uri(requestUri).withoutParameters();
+ this.requestUri = new UriBuilder(requestUri).withoutParameters();
}
public void setResponse(ApplicationView applicationView) {
@@ -138,7 +138,7 @@ class ServiceApiResponse extends HttpResponse {
mapToSlime((Map)entry, array.addObject());
}
- private String rewriteIfUrl(String urlOrAnyString, Uri requestUri) {
+ private String rewriteIfUrl(String urlOrAnyString, UriBuilder requestUri) {
if (urlOrAnyString == null) return null;
String hostPattern = "(" +
@@ -169,11 +169,11 @@ class ServiceApiResponse extends HttpResponse {
}
}
- private Uri generateLocalLinkPrefix(String identifier, String restPath) {
+ private UriBuilder generateLocalLinkPrefix(String identifier, String restPath) {
String proxiedPath = identifier + "/" + restPath;
if (this.requestUri.toString().endsWith(proxiedPath)) {
- return new Uri(this.requestUri.toString().substring(0, this.requestUri.toString().length() - proxiedPath.length()));
+ return new UriBuilder(this.requestUri.toString().substring(0, this.requestUri.toString().length() - proxiedPath.length()));
} else {
throw new IllegalStateException("Expected the resource path '" + this.requestUri + "' to end with '" + proxiedPath + "'");
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
index 9c609c8341b..5d819ec9804 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
@@ -11,7 +11,7 @@ import com.yahoo.container.jdisc.LoggingRequestHandler;
import com.yahoo.restapi.ErrorResponse;
import com.yahoo.restapi.Path;
import com.yahoo.restapi.SlimeJsonResponse;
-import com.yahoo.restapi.Uri;
+import com.yahoo.restapi.UriBuilder;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Slime;
import com.yahoo.vespa.hosted.controller.Controller;
@@ -227,7 +227,7 @@ public class DeploymentApiHandler extends LoggingRequestHandler {
object.setString("tenant", id.tenant().value());
object.setString("application", id.application().value());
object.setString("instance", id.instance().value());
- object.setString("url", new Uri(request.getUri()).withPath("/application/v4/tenant/" +
+ object.setString("url", new UriBuilder(request.getUri()).withPath("/application/v4/tenant/" +
id.tenant().value() +
"/application/" +
id.application().value()).toString());