Skip to content

Commit c5c8436

Browse files
committed
Polishing external contribution
1 parent 39786e4 commit c5c8436

File tree

3 files changed

+262
-235
lines changed

3 files changed

+262
-235
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RequestPredicates.java

Lines changed: 132 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -427,77 +427,83 @@ public interface Visitor {
427427

428428

429429
/**
430-
* A boolean result with a state-changing commit step to be conditionally
431-
* applied by a caller.
430+
* Extension of {@code RequestPredicate} that can modify the {@code ServerRequest}.
432431
*/
433-
static abstract class Evaluation {
434-
static final Evaluation TRUE = new NopEvaluation(true);
435-
static final Evaluation FALSE = new NopEvaluation(false);
432+
static abstract class RequestModifyingPredicate implements RequestPredicate {
436433

437-
private final boolean value;
438434

439-
Evaluation(boolean value) {
440-
this.value = value;
441-
}
442-
443-
abstract void doCommit();
444-
445-
446-
private static final class NopEvaluation extends Evaluation {
447-
private NopEvaluation(boolean value) {
448-
super(value);
435+
public static RequestModifyingPredicate of(RequestPredicate requestPredicate) {
436+
if (requestPredicate instanceof RequestModifyingPredicate modifyingPredicate) {
437+
return modifyingPredicate;
449438
}
450-
451-
@Override
452-
void doCommit() {
453-
// pass
439+
else {
440+
return new RequestModifyingPredicate() {
441+
@Override
442+
protected Result testInternal(ServerRequest request) {
443+
return Result.of(requestPredicate.test(request));
444+
}
445+
};
454446
}
455447
}
456-
}
457448

458449

459-
/**
460-
* Evaluates a {@link ServerRequest} and returns an {@link Evaluation}.
461-
*/
462-
private static abstract class Evaluator {
463-
private static Evaluator of(RequestPredicate requestPredicate) {
464-
if (requestPredicate instanceof EvaluatorRequestPredicate evaluatorRequestPredicate) {
465-
return evaluatorRequestPredicate;
450+
@Override
451+
public final boolean test(ServerRequest request) {
452+
Result result = testInternal(request);
453+
boolean value = result.value();
454+
if (value) {
455+
result.modify(request);
466456
}
467-
// Wrap the RequestPredicate with an Evaluator
468-
return new RequestPredicateEvaluator(requestPredicate);
457+
return value;
469458
}
470459

471-
abstract Evaluation apply(ServerRequest request);
460+
protected abstract Result testInternal(ServerRequest request);
461+
462+
463+
protected static final class Result {
464+
465+
private static final Result TRUE = new Result(true, null);
472466

467+
private static final Result FALSE = new Result(false, null);
473468

474-
private static final class RequestPredicateEvaluator extends Evaluator {
475-
private final RequestPredicate requestPredicate;
476469

477-
private RequestPredicateEvaluator(RequestPredicate requestPredicate) {
478-
this.requestPredicate = requestPredicate;
470+
private final boolean value;
471+
472+
@Nullable
473+
private final Consumer<ServerRequest> modify;
474+
475+
476+
private Result(boolean value, @Nullable Consumer<ServerRequest> modify) {
477+
this.value = value;
478+
this.modify = modify;
479479
}
480480

481-
@Override
482-
Evaluation apply(ServerRequest request) {
483-
return this.requestPredicate.test(request) ? Evaluation.TRUE : Evaluation.FALSE;
481+
482+
public static Result of(boolean value) {
483+
return of(value, null);
484484
}
485-
}
486-
}
487485

488-
/**
489-
* A {@link RequestPredicate} which may modify the request.
490-
*/
491-
static abstract class EvaluatorRequestPredicate extends Evaluator implements RequestPredicate {
492-
@Override
493-
public final boolean test(ServerRequest request) {
494-
Evaluation result = apply(request);
495-
boolean value = result.value;
496-
if (value) {
497-
result.doCommit();
486+
public static Result of(boolean value, @Nullable Consumer<ServerRequest> commit) {
487+
if (commit == null) {
488+
return value ? TRUE : FALSE;
489+
}
490+
else {
491+
return new Result(value, commit);
492+
}
493+
}
494+
495+
496+
public boolean value() {
497+
return this.value;
498+
}
499+
500+
public void modify(ServerRequest request) {
501+
if (this.modify != null) {
502+
this.modify.accept(request);
503+
}
498504
}
499-
return value;
500505
}
506+
501507
}
502508

503509

@@ -507,7 +513,7 @@ private static class HttpMethodPredicate implements RequestPredicate {
507513

508514
public HttpMethodPredicate(HttpMethod httpMethod) {
509515
Assert.notNull(httpMethod, "HttpMethod must not be null");
510-
this.httpMethods = Collections.singleton(httpMethod);
516+
this.httpMethods = Set.of(httpMethod);
511517
}
512518

513519
public HttpMethodPredicate(HttpMethod... httpMethods) {
@@ -551,38 +557,41 @@ public String toString() {
551557
}
552558

553559

554-
private static class PathPatternPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor.Target {
560+
private static class PathPatternPredicate extends RequestModifyingPredicate
561+
implements ChangePathPatternParserVisitor.Target {
555562

556563
private PathPattern pattern;
557564

565+
558566
public PathPatternPredicate(PathPattern pattern) {
559567
Assert.notNull(pattern, "'pattern' must not be null");
560568
this.pattern = pattern;
561569
}
562570

571+
563572
@Override
564-
public Evaluation apply(ServerRequest request) {
573+
protected Result testInternal(ServerRequest request) {
565574
PathContainer pathContainer = request.requestPath().pathWithinApplication();
566575
PathPattern.PathMatchInfo info = this.pattern.matchAndExtract(pathContainer);
567576
traceMatch("Pattern", this.pattern.getPatternString(), request.path(), info != null);
568-
if (info == null) {
569-
return Evaluation.FALSE;
577+
if (info != null) {
578+
return Result.of(true, serverRequest -> mergeAttributes(serverRequest, info.getUriVariables()));
570579
}
571-
return new Evaluation(true) {
572-
@Override
573-
void doCommit() {
574-
Map<String, Object> attributes = request.attributes();
575-
Map<String, String> pathVariables = mergePathVariables(request.pathVariables(),
576-
info.getUriVariables());
577-
attributes.put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
578-
Collections.unmodifiableMap(pathVariables));
579-
580-
PathPattern newPattern = mergePatterns(
581-
(PathPattern) attributes.get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE),
582-
PathPatternPredicate.this.pattern);
583-
attributes.put(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE, newPattern);
584-
}
585-
};
580+
else {
581+
return Result.of(false);
582+
}
583+
}
584+
585+
private void mergeAttributes(ServerRequest request, Map<String, String> variables) {
586+
Map<String, Object> attributes = request.attributes();
587+
Map<String, String> pathVariables = mergePathVariables(request.pathVariables(), variables);
588+
attributes.put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
589+
Collections.unmodifiableMap(pathVariables));
590+
591+
PathPattern pattern = mergePatterns(
592+
(PathPattern) attributes.get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE),
593+
this.pattern);
594+
attributes.put(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE, pattern);
586595
}
587596

588597
@Override
@@ -824,40 +833,42 @@ public String toString() {
824833
* {@link RequestPredicate} for where both {@code left} and {@code right} predicates
825834
* must match.
826835
*/
827-
static class AndRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor.Target {
836+
static class AndRequestPredicate extends RequestModifyingPredicate
837+
implements ChangePathPatternParserVisitor.Target {
828838

829839
private final RequestPredicate left;
830-
private final Evaluator leftEvaluator;
840+
841+
private final RequestModifyingPredicate leftModifying;
831842

832843
private final RequestPredicate right;
833-
private final Evaluator rightEvaluator;
844+
845+
private final RequestModifyingPredicate rightModifying;
846+
834847

835848
public AndRequestPredicate(RequestPredicate left, RequestPredicate right) {
836849
Assert.notNull(left, "Left RequestPredicate must not be null");
837850
Assert.notNull(right, "Right RequestPredicate must not be null");
838851
this.left = left;
839-
this.leftEvaluator = Evaluator.of(left);
852+
this.leftModifying = of(left);
840853
this.right = right;
841-
this.rightEvaluator = Evaluator.of(right);
854+
this.rightModifying = of(right);
842855
}
843856

857+
844858
@Override
845-
public Evaluation apply(ServerRequest request) {
846-
Evaluation leftResult = this.leftEvaluator.apply(request);
847-
if (!leftResult.value) {
859+
protected Result testInternal(ServerRequest request) {
860+
Result leftResult = this.leftModifying.testInternal(request);
861+
if (!leftResult.value()) {
848862
return leftResult;
849863
}
850-
Evaluation rightResult = this.rightEvaluator.apply(request);
851-
if (!rightResult.value) {
864+
Result rightResult = this.rightModifying.testInternal(request);
865+
if (!rightResult.value()) {
852866
return rightResult;
853867
}
854-
return new Evaluation(true) {
855-
@Override
856-
void doCommit() {
857-
leftResult.doCommit();
858-
rightResult.doCommit();
859-
}
860-
};
868+
return Result.of(true, serverRequest -> {
869+
leftResult.modify(serverRequest);
870+
rightResult.modify(serverRequest);
871+
});
861872
}
862873

863874
@Override
@@ -876,11 +887,11 @@ public void accept(Visitor visitor) {
876887

877888
@Override
878889
public void changeParser(PathPatternParser parser) {
879-
if (this.left instanceof ChangePathPatternParserVisitor.Target leftTarget) {
880-
leftTarget.changeParser(parser);
890+
if (this.left instanceof ChangePathPatternParserVisitor.Target target) {
891+
target.changeParser(parser);
881892
}
882-
if (this.right instanceof ChangePathPatternParserVisitor.Target rightTarget) {
883-
rightTarget.changeParser(parser);
893+
if (this.right instanceof ChangePathPatternParserVisitor.Target target) {
894+
target.changeParser(parser);
884895
}
885896
}
886897

@@ -894,26 +905,25 @@ public String toString() {
894905
/**
895906
* {@link RequestPredicate} that negates a delegate predicate.
896907
*/
897-
static class NegateRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor.Target {
908+
static class NegateRequestPredicate extends RequestModifyingPredicate
909+
implements ChangePathPatternParserVisitor.Target {
898910

899911
private final RequestPredicate delegate;
900-
private final Evaluator delegateEvaluator;
912+
913+
private final RequestModifyingPredicate delegateModifying;
914+
901915

902916
public NegateRequestPredicate(RequestPredicate delegate) {
903917
Assert.notNull(delegate, "Delegate must not be null");
904918
this.delegate = delegate;
905-
this.delegateEvaluator = Evaluator.of(delegate);
919+
this.delegateModifying = of(delegate);
906920
}
907921

922+
908923
@Override
909-
public Evaluation apply(ServerRequest request) {
910-
Evaluation result = this.delegateEvaluator.apply(request);
911-
return new Evaluation(!result.value) {
912-
@Override
913-
void doCommit() {
914-
result.doCommit();
915-
}
916-
};
924+
protected Result testInternal(ServerRequest request) {
925+
Result result = this.delegateModifying.testInternal(request);
926+
return Result.of(!result.value(), result::modify);
917927
}
918928

919929
@Override
@@ -941,30 +951,36 @@ public String toString() {
941951
* {@link RequestPredicate} where either {@code left} or {@code right} predicates
942952
* may match.
943953
*/
944-
static class OrRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor.Target {
954+
static class OrRequestPredicate extends RequestModifyingPredicate
955+
implements ChangePathPatternParserVisitor.Target {
945956

946957
private final RequestPredicate left;
947-
private final Evaluator leftEvaluator;
958+
959+
private final RequestModifyingPredicate leftModifying;
948960

949961
private final RequestPredicate right;
950-
private final Evaluator rightEvaluator;
962+
963+
private final RequestModifyingPredicate rightModifying;
964+
951965

952966
public OrRequestPredicate(RequestPredicate left, RequestPredicate right) {
953967
Assert.notNull(left, "Left RequestPredicate must not be null");
954968
Assert.notNull(right, "Right RequestPredicate must not be null");
955969
this.left = left;
956-
this.leftEvaluator = Evaluator.of(left);
970+
this.leftModifying = of(left);
957971
this.right = right;
958-
this.rightEvaluator = Evaluator.of(right);
972+
this.rightModifying = of(right);
959973
}
960974

961975
@Override
962-
public Evaluation apply(ServerRequest request) {
963-
Evaluation leftResult = this.leftEvaluator.apply(request);
964-
if (leftResult.value) {
976+
protected Result testInternal(ServerRequest request) {
977+
Result leftResult = this.leftModifying.testInternal(request);
978+
if (leftResult.value()) {
965979
return leftResult;
966980
}
967-
return this.rightEvaluator.apply(request);
981+
else {
982+
return this.rightModifying.testInternal(request);
983+
}
968984
}
969985

970986
@Override
@@ -989,11 +1005,11 @@ public void accept(Visitor visitor) {
9891005

9901006
@Override
9911007
public void changeParser(PathPatternParser parser) {
992-
if (this.left instanceof ChangePathPatternParserVisitor.Target leftTarget) {
993-
leftTarget.changeParser(parser);
1008+
if (this.left instanceof ChangePathPatternParserVisitor.Target target) {
1009+
target.changeParser(parser);
9941010
}
995-
if (this.right instanceof ChangePathPatternParserVisitor.Target rightTarget) {
996-
rightTarget.changeParser(parser);
1011+
if (this.right instanceof ChangePathPatternParserVisitor.Target target) {
1012+
target.changeParser(parser);
9971013
}
9981014
}
9991015

0 commit comments

Comments
 (0)