Make uri() terminating operator in Routes.

Simplifies dsl and make it easier to read.
This commit is contained in:
Spencer Gibb
2017-10-13 12:40:03 -04:00
parent 5a23335375
commit 279cd03578
4 changed files with 42 additions and 37 deletions

View File

@@ -43,7 +43,7 @@ public class Routes {
private List<Route> routes = new ArrayList<>();
public RouteSpec route(String id) {
public PredicateSpec route(String id) {
return new RouteSpec(this).id(id);
}
@@ -51,6 +51,18 @@ public class Routes {
this.routes.add(route);
}
LocatorBuilder uri(Route.Builder builder, String uri) {
Route route = builder.uri(uri).build();
routes.add(route);
return this;
}
LocatorBuilder uri(Route.Builder builder, URI uri) {
Route route = builder.uri(uri).build();
routes.add(route);
return this;
}
public RouteLocator build() {
return () -> Flux.fromIterable(this.routes);
}
@@ -65,23 +77,8 @@ public class Routes {
this.locatorBuilder = locatorBuilder;
}
public RouteSpec id(String id) {
public PredicateSpec id(String id) {
this.builder.id(id);
return this;
}
public RouteSpec order(int order) {
this.builder.order(order);
return this;
}
public PredicateSpec uri(String uri) {
this.builder.uri(uri);
return predicateBuilder();
}
public PredicateSpec uri(URI uri) {
this.builder.uri(uri);
return predicateBuilder();
}
@@ -93,11 +90,11 @@ public class Routes {
public static class PredicateSpec {
private final Route.Builder routeBuilder;
private final Route.Builder builder;
private LocatorBuilder locatorBuilder;
private PredicateSpec(Route.Builder routeBuilder, LocatorBuilder locatorBuilder) {
this.routeBuilder = routeBuilder;
private PredicateSpec(Route.Builder builder, LocatorBuilder locatorBuilder) {
this.builder = builder;
this.locatorBuilder = locatorBuilder;
}
@@ -109,15 +106,27 @@ public class Routes {
Predicate<ServerWebExchange> predicate = RoutePredicates.host(pattern);
}*/
public PredicateSpec order(int order) {
this.builder.order(order);
return this;
}
public GatewayFilterSpec predicate(Predicate<ServerWebExchange> predicate) {
this.routeBuilder.predicate(predicate);
this.builder.predicate(predicate);
return gatewayFilterBuilder();
}
private GatewayFilterSpec gatewayFilterBuilder() {
return new GatewayFilterSpec(this.routeBuilder, this.locatorBuilder);
return new GatewayFilterSpec(this.builder, this.locatorBuilder);
}
public LocatorBuilder uri(String uri) {
return this.locatorBuilder.uri(this.builder, uri);
}
public LocatorBuilder uri(URI uri) {
return this.locatorBuilder.uri(this.builder, uri);
}
}
public static class GatewayFilterSpec {
@@ -156,11 +165,12 @@ public class Routes {
return add(GatewayFilters.addResponseHeader(headerName, headerValue));
}
// TODO: build()?
public LocatorBuilder and() {
Route route = this.builder.build();
this.locatorBuilder.add(route);
return this.locatorBuilder;
public LocatorBuilder uri(String uri) {
return this.locatorBuilder.uri(this.builder, uri);
}
public LocatorBuilder uri(URI uri) {
return this.locatorBuilder.uri(this.builder, uri);
}
}

View File

@@ -99,11 +99,10 @@ public class PrincipalNameKeyResolverIntegrationTests {
public RouteLocator customRouteLocator(RequestRateLimiterGatewayFilterFactory rateLimiterFactory) {
return Routes.locator()
.route("protected-throttled")
.uri("http://localhost:"+port)
.predicate(path("/myapi/**"))
.filter(rateLimiterFactory.apply(tuple().of(REPLENISH_RATE_KEY, 1, BURST_CAPACITY_KEY, 1)))
.filter(prefixPath("/downstream"))
.and()
.uri("http://localhost:"+port)
.build();
}

View File

@@ -304,9 +304,8 @@ public class WebSocketIntegrationTests {
public RouteLocator wsRouteLocator() {
return Routes.locator()
.route("testws")
.uri("ws://localhost:"+this.wsPort)
.predicate(alwaysTrue())
.and()
.uri("ws://localhost:"+this.wsPort)
.build();
}
}

View File

@@ -45,24 +45,21 @@ public class GatewaySampleApplication {
public RouteLocator customRouteLocator(ThrottleGatewayFilterFactory throttle) {
return Routes.locator()
.route("test")
.uri("http://httpbin.org:80")
.predicate(host("**.abc.org").and(path("/image/png")))
.addResponseHeader("X-TestHeader", "foobar")
.and()
.route("test2")
.uri("http://httpbin.org:80")
.route("test2")
.predicate(path("/image/webp"))
.add(addResponseHeader("X-AnotherHeader", "baz"))
.and()
.uri("http://httpbin.org:80")
.route("test3")
.order(-1)
.uri("http://httpbin.org:80")
.predicate(host("**.throttle.org").and(path("/get")))
.add(throttle.apply(tuple().of("capacity", 1,
"refillTokens", 1,
"refillPeriod", 10,
"refillUnit", "SECONDS")))
.and()
.uri("http://httpbin.org:80")
.build();
}