diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java index 251d4759a91..d7a54d578bc 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/PatternsRequestCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,6 +48,9 @@ public final class PatternsRequestCondition extends AbstractRequestCondition EMPTY_PATH = Collections.singleton(""); + private static final SortedSet ROOT_PATH_PATTERNS = + new TreeSet<>(List.of(new PathPatternParser().parse(""), new PathPatternParser().parse("/"))); + private final SortedSet patterns; @@ -109,19 +112,18 @@ public final class PatternsRequestCondition extends AbstractRequestCondition - *
  • If there are patterns in both instances, combine the patterns in "this" with - * the patterns in "other" using {@link PathPattern#combine(PathPattern)}. - *
  • If only one instance has patterns, use them. - *
  • If neither instance has patterns, use an empty String (i.e. ""). + *
  • If only one instance has patterns, use those. + *
  • If both have patterns, combine patterns from "this" instance with + * patterns from the other instance via {@link PathPattern#combine(PathPattern)}. + *
  • If neither has patterns, use {@code ""} and {@code "/"} as root path patterns. * */ @Override public PatternsRequestCondition combine(PatternsRequestCondition other) { if (isEmptyPathMapping() && other.isEmptyPathMapping()) { - return this; + return new PatternsRequestCondition(ROOT_PATH_PATTERNS); } else if (other.isEmptyPathMapping()) { return this; diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java index 0b7c8bde64f..6e7e6b0ed0c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/PatternsRequestConditionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,8 +52,8 @@ public class PatternsRequestConditionTests { PatternsRequestCondition c2 = new PatternsRequestCondition(); PatternsRequestCondition c3 = c1.combine(c2); - assertThat(c3).isSameAs(c1); assertThat(c1.getPatterns()).isSameAs(c2.getPatterns()).containsExactly(this.parser.parse("")); + assertThat(c3.toString()).isEqualTo("[/ || ]"); } @Test diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/RequestMappingInfoTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/RequestMappingInfoTests.java index b0fbbe4d5d8..59cd4821d7c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/RequestMappingInfoTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/RequestMappingInfoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,7 +73,7 @@ public class RequestMappingInfoTests { assertThat(info.getCustomCondition()).isSameAs(anotherInfo.getCustomCondition()); RequestMappingInfo result = info.combine(anotherInfo); - assertThat(info.getPatternsCondition()).isSameAs(result.getPatternsCondition()); + assertThat(result.getPatternsCondition().toString()).isEqualTo("[/ || ]"); assertThat(info.getMethodsCondition()).isSameAs(result.getMethodsCondition()); assertThat(info.getParamsCondition()).isSameAs(result.getParamsCondition()); assertThat(info.getHeadersCondition()).isSameAs(result.getHeadersCondition()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestCondition.java index e7f4923065d..93e9033fa8c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -52,6 +53,9 @@ public final class PathPatternsRequestCondition extends AbstractRequestCondition private static final Set EMPTY_PATH = Collections.singleton(""); + private static final SortedSet ROOT_PATH_PATTERNS = + new TreeSet<>(List.of(new PathPatternParser().parse(""), new PathPatternParser().parse("/"))); + private final SortedSet patterns; @@ -146,20 +150,18 @@ public final class PathPatternsRequestCondition extends AbstractRequestCondition } /** - * Returns a new instance with URL patterns from the current instance - * ("this") and the "other" instance as follows: + * Combine the patterns of the current and of the other instances as follows: *
      - *
    • If there are patterns in both instances, combine the patterns in - * "this" with the patterns in "other" using - * {@link PathPattern#combine(PathPattern)}. - *
    • If only one instance has patterns, use them. - *
    • If neither instance has patterns, use an empty String (i.e. ""). + *
    • If only one instance has patterns, use those. + *
    • If both have patterns, combine patterns from "this" instance with + * patterns from the other instance via {@link PathPattern#combine(PathPattern)}. + *
    • If neither has patterns, use {@code ""} and {@code "/"} as root path patterns. *
    */ @Override public PathPatternsRequestCondition combine(PathPatternsRequestCondition other) { if (isEmptyPathMapping() && other.isEmptyPathMapping()) { - return this; + return new PathPatternsRequestCondition(ROOT_PATH_PATTERNS); } else if (other.isEmptyPathMapping()) { return this; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PatternsRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PatternsRequestCondition.java index 6bd5676e2b0..f9b69ffbdb3 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PatternsRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/PatternsRequestCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,8 @@ public class PatternsRequestCondition extends AbstractRequestCondition EMPTY_PATH_PATTERN = Collections.singleton(""); + private final static String[] ROOT_PATH_PATTERNS = new String[] {"", "/"}; + private final Set patterns; @@ -227,19 +229,18 @@ public class PatternsRequestCondition extends AbstractRequestCondition - *
  • If there are patterns in both instances, combine the patterns in "this" with - * the patterns in "other" using {@link PathMatcher#combine(String, String)}. - *
  • If only one instance has patterns, use them. - *
  • If neither instance has patterns, use an empty String (i.e. ""). + *
  • If only one instance has patterns, use those. + *
  • If both have patterns, combine patterns from "this" instance with + * patterns from the other instance via {@link PathMatcher#combine(String, String)}. + *
  • If neither has patterns, use {@code ""} and {@code "/"} as root path patterns. * */ @Override public PatternsRequestCondition combine(PatternsRequestCondition other) { if (isEmptyPathMapping() && other.isEmptyPathMapping()) { - return this; + return new PatternsRequestCondition(ROOT_PATH_PATTERNS); } else if (other.isEmptyPathMapping()) { return this; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestConditionTests.java index 9e299bec06a..ccaf197d099 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PathPatternsRequestConditionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,8 +59,8 @@ public class PathPatternsRequestConditionTests { PathPatternsRequestCondition c2 = createCondition(); PathPatternsRequestCondition c3 = c1.combine(c2); - assertThat(c3).isSameAs(c1); assertThat(c1.getPatternValues()).isSameAs(c2.getPatternValues()).containsExactly(""); + assertThat(c3.getPatternValues()).containsExactly("", "/"); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PatternsRequestConditionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PatternsRequestConditionTests.java index 41cda092523..33809b93eca 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PatternsRequestConditionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/condition/PatternsRequestConditionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,8 +58,8 @@ class PatternsRequestConditionTests { PatternsRequestCondition c2 = new PatternsRequestCondition(); PatternsRequestCondition c3 = c1.combine(c2); - assertThat(c3).isSameAs(c1); assertThat(c1.getPatterns()).isSameAs(c2.getPatterns()).containsExactly(""); + assertThat(c3.getPatterns()).containsExactly("", "/"); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoTests.java index 87843e1efb0..1e2914959ce 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -77,7 +77,7 @@ class RequestMappingInfoTests { assertThat(info.getCustomCondition()).isSameAs(anotherInfo.getCustomCondition()); RequestMappingInfo result = info.combine(anotherInfo); - assertThat(info.getActivePatternsCondition()).isSameAs(result.getActivePatternsCondition()); + assertThat(result.getPatternValues()).containsExactly("", "/"); assertThat(info.getMethodsCondition()).isSameAs(result.getMethodsCondition()); assertThat(info.getParamsCondition()).isSameAs(result.getParamsCondition()); assertThat(info.getHeadersCondition()).isSameAs(result.getHeadersCondition());