diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-03-26 15:10:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-26 15:10:09 +0100 |
commit | cfc7927446dcea526fbdce38b8578c14671e1d6c (patch) | |
tree | 569ee92d0824693bba08207a8debc65910f36c86 | |
parent | 16eebe41526a31c98d8e5c53f04a37f25334a91b (diff) | |
parent | 35852f8079b0e0cd4ca65298fc467d03236b9e20 (diff) |
Merge pull request #17209 from vespa-engine/bjorncs/improvements
Bjorncs/improvements
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/serviceview/StateRequestHandler.java | 40 | ||||
-rw-r--r-- | configserver/src/test/java/com/yahoo/vespa/serviceview/StateRequestHandlerTest.java | 5 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/restapi/ResourceResponse.java | 2 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/restapi/RestApi.java | 27 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java | 27 | ||||
-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.java | 12 | ||||
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java | 4 |
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()); |