From 65e439635d439c9ae492f97a0df52caf5af057a4 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 27 Jan 2017 21:22:52 -0700 Subject: [PATCH] Change Predicate from (value, args[]) to (args...) --- .../gateway/config/PredicateDefinition.java | 24 +++---------------- .../discovery/DiscoveryClientRouteReader.java | 2 +- .../handler/RoutePredicateHandlerMapping.java | 6 ++--- .../predicate/AfterRoutePredicate.java | 5 ++-- .../predicate/BeforeRoutePredicate.java | 5 ++-- .../predicate/BetweenRoutePredicate.java | 8 +++---- .../predicate/CookieRoutePredicate.java | 12 ++++------ .../predicate/HeaderRoutePredicate.java | 8 +++---- .../handler/predicate/HostRoutePredicate.java | 6 +++-- .../predicate/MethodRoutePredicate.java | 5 ++-- .../predicate/QueryRoutePredicate.java | 16 ++++++------- .../predicate/RemoteAddrRoutePredicate.java | 10 ++++---- .../handler/predicate/RoutePredicate.java | 8 +++---- .../handler/predicate/UrlRoutePredicate.java | 5 +++- .../predicate/AfterRoutePredicateTests.java | 2 +- .../predicate/BeforeRoutePredicateTests.java | 2 +- .../predicate/BetweenRoutePredicateTests.java | 2 +- src/test/resources/application.yml | 2 +- 18 files changed, 57 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java b/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java index 2e477aaa..4f96ef92 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java +++ b/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java @@ -14,9 +14,6 @@ import static org.springframework.util.StringUtils.tokenizeToStringArray; public class PredicateDefinition { @NotNull private String name; - @NotNull - private String value; - private String[] args; public PredicateDefinition() { @@ -31,12 +28,7 @@ public class PredicateDefinition { setName(text.substring(0, eqIdx)); String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ","); - - setValue(args[0]); - - if (args.length > 1) { - setArgs(Arrays.copyOfRange(args, 1, args.length)); - } + setArgs(args); } public String getName() { @@ -47,19 +39,11 @@ public class PredicateDefinition { this.name = name; } - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - public String[] getArgs() { return args; } - public void setArgs(String[] args) { + public void setArgs(String... args) { this.args = args; } @@ -69,20 +53,18 @@ public class PredicateDefinition { if (o == null || getClass() != o.getClass()) return false; PredicateDefinition that = (PredicateDefinition) o; return Objects.equals(name, that.name) && - Objects.equals(value, that.value) && Arrays.equals(args, that.args); } @Override public int hashCode() { - return Objects.hash(name, value, args); + return Objects.hash(name, args); } @Override public String toString() { final StringBuilder sb = new StringBuilder("PredicateDefinition{"); sb.append("name='").append(name).append('\''); - sb.append(", value='").append(value).append('\''); sb.append(", args=").append(Arrays.toString(args)); sb.append('}'); return sb.toString(); diff --git a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java index 5ffe8be9..031b9f53 100644 --- a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java @@ -35,7 +35,7 @@ public class DiscoveryClientRouteReader implements RouteReader { // add a predicate that matches the url at /serviceId/** PredicateDefinition predicate = new PredicateDefinition(); predicate.setName("Url"); - predicate.setValue("/" + serviceId + "/**"); + predicate.setArgs("/" + serviceId + "/**"); route.getPredicates().add(predicate); //TODO: support for other default predicates diff --git a/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java b/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java index a46f50cd..7d11d1bb 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java @@ -142,10 +142,10 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { } else { args = Collections.emptyList(); } - logger.debug("Route " + route.getId() + " applying "+ predicate.getValue() - + ", " + args + " to " + predicate.getName()); + logger.debug("Route " + route.getId() + " applying " + + args + " to " + predicate.getName()); } - return found.apply(predicate.getValue(), predicate.getArgs()); + return found.apply(predicate.getArgs()); } /** diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicate.java index 6a22868b..19fcbdbb 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicate.java @@ -13,8 +13,9 @@ import static org.springframework.cloud.gateway.handler.predicate.BetweenRoutePr public class AfterRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String dateString, String[] args) { - final ZonedDateTime dateTime = parseZonedDateTime(dateString); + public Predicate apply(String... args) { + validate(1, args); + final ZonedDateTime dateTime = parseZonedDateTime(args[0]); return exchange -> { final ZonedDateTime now = ZonedDateTime.now(); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java index 4e87426a..3ef787e1 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java @@ -13,8 +13,9 @@ import static org.springframework.cloud.gateway.handler.predicate.BetweenRoutePr public class BeforeRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String dateString, String[] args) { - final ZonedDateTime dateTime = parseZonedDateTime(dateString); + public Predicate apply(String... args) { + validate(1, args); + final ZonedDateTime dateTime = parseZonedDateTime(args[0]); return exchange -> { final ZonedDateTime now = ZonedDateTime.now(); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicate.java index 22404ae5..99589e28 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicate.java @@ -14,12 +14,12 @@ import org.springframework.web.server.ServerWebExchange; public class BetweenRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String dateString, String[] args) { - validate(args, 1); + public Predicate apply(String... args) { + validate(2, args); //TODO: is ZonedDateTime the right thing to use? - final ZonedDateTime dateTime1 = parseZonedDateTime(dateString); - final ZonedDateTime dateTime2 = parseZonedDateTime(args[0]); + final ZonedDateTime dateTime1 = parseZonedDateTime(args[0]); + final ZonedDateTime dateTime2 = parseZonedDateTime(args[1]); Assert.isTrue(dateTime1.isBefore(dateTime2)); return exchange -> { diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicate.java index 38f7bfea..d0f1ae04 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/CookieRoutePredicate.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.function.Predicate; import org.springframework.http.HttpCookie; -import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; /** @@ -13,13 +12,12 @@ import org.springframework.web.server.ServerWebExchange; public class CookieRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String name, String[] args) { - //TODO: caching can happen here - return exchange -> { - Assert.isTrue(args != null && args.length == 1, - "args must have one entry"); + public Predicate apply(String... args) { + validate(2, args); + String name = args[0]; + String regexp = args[1]; - String regexp = args[0]; + return exchange -> { List cookies = exchange.getRequest().getCookies().get(name); for (HttpCookie cookie : cookies) { if (cookie.getValue().matches(regexp)) { diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicate.java index 38c75820..97293476 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicate.java @@ -11,11 +11,11 @@ import org.springframework.web.server.ServerWebExchange; public class HeaderRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String header, String[] args) { - validate(args, 1); - String regexp = args[0]; + public Predicate apply(String... args) { + validate(2, args); + String header = args[0]; + String regexp = args[1]; - //TODO: caching can happen here return exchange -> { List values = exchange.getRequest().getHeaders().get(header); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicate.java index 45a01cd6..c9bfe6b5 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicate.java @@ -18,8 +18,10 @@ public class HostRoutePredicate implements RoutePredicate { } @Override - public Predicate apply(String pattern, String[] args) { - //TODO: caching can happen here + public Predicate apply(String[] args) { + validate(1, args); + String pattern = args[0]; + return exchange -> { String host = exchange.getRequest().getHeaders().getFirst("Host"); return this.pathMatcher.match(pattern, host); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicate.java index 77dbd865..5750503e 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodRoutePredicate.java @@ -11,8 +11,9 @@ import org.springframework.web.server.ServerWebExchange; public class MethodRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String method, String[] args) { - //TODO: caching can happen here + public Predicate apply(String... args) { + validate(1, args); + String method = args[0]; return exchange -> { HttpMethod requestMethod = exchange.getRequest().getMethod(); return requestMethod.matches(method); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicate.java index acfb4041..eb2ebc63 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryRoutePredicate.java @@ -11,20 +11,18 @@ import org.springframework.web.server.ServerWebExchange; public class QueryRoutePredicate implements RoutePredicate { @Override - public Predicate apply(String param, String[] args) { - //TODO: caching can happen here + public Predicate apply(String... args) { + validate(1, args); + String param = args[0]; + return exchange -> { - String regexp = null; - - if (args != null && args.length == 1) { - regexp = args[0]; - } - - if (regexp == null) { + if (args.length < 2) { // check existence of header return exchange.getRequest().getQueryParams().containsKey(param); } + String regexp = args[1]; + List values = exchange.getRequest().getQueryParams().get(param); for (String value : values) { if (value.matches(regexp)) { diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicate.java index 1219c1f8..531c1631 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/RemoteAddrRoutePredicate.java @@ -19,10 +19,10 @@ public class RemoteAddrRoutePredicate implements RoutePredicate { private static final Log log = LogFactory.getLog(RemoteAddrRoutePredicate.class); @Override - public Predicate apply(String source, String[] args) { - List sources = new ArrayList<>(); - addSource(sources, source); + public Predicate apply(String... args) { + validate(1, args); + List sources = new ArrayList<>(); if (args != null) { for (String arg : args) { addSource(sources, arg); @@ -39,8 +39,8 @@ public class RemoteAddrRoutePredicate implements RoutePredicate { log.warn("Remote addresses didn't match " + hostAddress + " != " + host); } - for (SubnetUtils subnet : sources) { - if (subnet.getInfo().isInRange(hostAddress)) { + for (SubnetUtils source : sources) { + if (source.getInfo().isInRange(hostAddress)) { return true; } } diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/RoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/RoutePredicate.java index 8a3e6765..407c8ffa 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/RoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/RoutePredicate.java @@ -10,10 +10,10 @@ import org.springframework.web.server.ServerWebExchange; */ public interface RoutePredicate { - Predicate apply(String value, String[] args); + Predicate apply(String... args); - default void validate(String[] args, int requiredSize) { - Assert.isTrue(args != null && args.length == requiredSize, - "args must have "+ requiredSize +" entry(s)"); + default void validate(int minimumSize, String... args) { + Assert.isTrue(args != null && args.length >= minimumSize, + "args must have at least "+ minimumSize +" entry(s)"); } } diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlRoutePredicate.java index 72d865b6..ec3acdbc 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlRoutePredicate.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlRoutePredicate.java @@ -35,7 +35,10 @@ public class UrlRoutePredicate implements RoutePredicate { } @Override - public Predicate apply(String pattern, String[] args) { + public Predicate apply(String[] args) { + validate(1, args); + String pattern = args[0]; + return exchange -> { String lookupPath = getPathHelper().getLookupPathForRequest(exchange); boolean match = getPathMatcher().match(pattern, lookupPath); diff --git a/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateTests.java b/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateTests.java index 480c206f..f8c22da3 100644 --- a/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateTests.java +++ b/src/test/java/org/springframework/cloud/gateway/handler/predicate/AfterRoutePredicateTests.java @@ -51,6 +51,6 @@ public class AfterRoutePredicateTests { } private boolean runPredicate(String dateString) { - return new AfterRoutePredicate().apply(dateString, null).test(getExchange()); + return new AfterRoutePredicate().apply(dateString).test(getExchange()); } } diff --git a/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java index b80e2f4f..6bced724 100644 --- a/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java +++ b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java @@ -51,6 +51,6 @@ public class BeforeRoutePredicateTests { } private boolean runPredicate(String dateString) { - return new BeforeRoutePredicate().apply(dateString, null).test(getExchange()); + return new BeforeRoutePredicate().apply(dateString).test(getExchange()); } } diff --git a/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateTests.java b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateTests.java index d76a36a7..028a7ed4 100644 --- a/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateTests.java +++ b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BetweenRoutePredicateTests.java @@ -77,7 +77,7 @@ public class BetweenRoutePredicateTests { } boolean runPredicate(String dateString1, String dateString2) { - return new BetweenRoutePredicate().apply(dateString1, new String[]{dateString2}).test(getExchange()); + return new BetweenRoutePredicate().apply(dateString1, dateString2).test(getExchange()); } static String minusHoursMillis(int hours) { diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index af235679..2d5094fd 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -153,7 +153,7 @@ spring: uri: http://httpbin.org:80 predicates: - name: Url - value: /** + args: /** myservice: ribbon: