@@ -427,77 +427,83 @@ public interface Visitor {
427
427
428
428
429
429
/**
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}.
432
431
*/
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 {
436
433
437
- private final boolean value ;
438
434
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 ;
449
438
}
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
+ };
454
446
}
455
447
}
456
- }
457
448
458
449
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 );
466
456
}
467
- // Wrap the RequestPredicate with an Evaluator
468
- return new RequestPredicateEvaluator (requestPredicate );
457
+ return value ;
469
458
}
470
459
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 );
472
466
467
+ private static final Result FALSE = new Result (false , null );
473
468
474
- private static final class RequestPredicateEvaluator extends Evaluator {
475
- private final RequestPredicate requestPredicate ;
476
469
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 ;
479
479
}
480
480
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 ) ;
484
484
}
485
- }
486
- }
487
485
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
+ }
498
504
}
499
- return value ;
500
505
}
506
+
501
507
}
502
508
503
509
@@ -507,7 +513,7 @@ private static class HttpMethodPredicate implements RequestPredicate {
507
513
508
514
public HttpMethodPredicate (HttpMethod httpMethod ) {
509
515
Assert .notNull (httpMethod , "HttpMethod must not be null" );
510
- this .httpMethods = Collections . singleton (httpMethod );
516
+ this .httpMethods = Set . of (httpMethod );
511
517
}
512
518
513
519
public HttpMethodPredicate (HttpMethod ... httpMethods ) {
@@ -551,38 +557,41 @@ public String toString() {
551
557
}
552
558
553
559
554
- private static class PathPatternPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor .Target {
560
+ private static class PathPatternPredicate extends RequestModifyingPredicate
561
+ implements ChangePathPatternParserVisitor .Target {
555
562
556
563
private PathPattern pattern ;
557
564
565
+
558
566
public PathPatternPredicate (PathPattern pattern ) {
559
567
Assert .notNull (pattern , "'pattern' must not be null" );
560
568
this .pattern = pattern ;
561
569
}
562
570
571
+
563
572
@ Override
564
- public Evaluation apply (ServerRequest request ) {
573
+ protected Result testInternal (ServerRequest request ) {
565
574
PathContainer pathContainer = request .requestPath ().pathWithinApplication ();
566
575
PathPattern .PathMatchInfo info = this .pattern .matchAndExtract (pathContainer );
567
576
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 ())) ;
570
579
}
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 ) ;
586
595
}
587
596
588
597
@ Override
@@ -824,40 +833,42 @@ public String toString() {
824
833
* {@link RequestPredicate} for where both {@code left} and {@code right} predicates
825
834
* must match.
826
835
*/
827
- static class AndRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor .Target {
836
+ static class AndRequestPredicate extends RequestModifyingPredicate
837
+ implements ChangePathPatternParserVisitor .Target {
828
838
829
839
private final RequestPredicate left ;
830
- private final Evaluator leftEvaluator ;
840
+
841
+ private final RequestModifyingPredicate leftModifying ;
831
842
832
843
private final RequestPredicate right ;
833
- private final Evaluator rightEvaluator ;
844
+
845
+ private final RequestModifyingPredicate rightModifying ;
846
+
834
847
835
848
public AndRequestPredicate (RequestPredicate left , RequestPredicate right ) {
836
849
Assert .notNull (left , "Left RequestPredicate must not be null" );
837
850
Assert .notNull (right , "Right RequestPredicate must not be null" );
838
851
this .left = left ;
839
- this .leftEvaluator = Evaluator . of (left );
852
+ this .leftModifying = of (left );
840
853
this .right = right ;
841
- this .rightEvaluator = Evaluator . of (right );
854
+ this .rightModifying = of (right );
842
855
}
843
856
857
+
844
858
@ 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 () ) {
848
862
return leftResult ;
849
863
}
850
- Evaluation rightResult = this .rightEvaluator . apply (request );
851
- if (!rightResult .value ) {
864
+ Result rightResult = this .rightModifying . testInternal (request );
865
+ if (!rightResult .value () ) {
852
866
return rightResult ;
853
867
}
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
+ });
861
872
}
862
873
863
874
@ Override
@@ -876,11 +887,11 @@ public void accept(Visitor visitor) {
876
887
877
888
@ Override
878
889
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 );
881
892
}
882
- if (this .right instanceof ChangePathPatternParserVisitor .Target rightTarget ) {
883
- rightTarget .changeParser (parser );
893
+ if (this .right instanceof ChangePathPatternParserVisitor .Target target ) {
894
+ target .changeParser (parser );
884
895
}
885
896
}
886
897
@@ -894,26 +905,25 @@ public String toString() {
894
905
/**
895
906
* {@link RequestPredicate} that negates a delegate predicate.
896
907
*/
897
- static class NegateRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor .Target {
908
+ static class NegateRequestPredicate extends RequestModifyingPredicate
909
+ implements ChangePathPatternParserVisitor .Target {
898
910
899
911
private final RequestPredicate delegate ;
900
- private final Evaluator delegateEvaluator ;
912
+
913
+ private final RequestModifyingPredicate delegateModifying ;
914
+
901
915
902
916
public NegateRequestPredicate (RequestPredicate delegate ) {
903
917
Assert .notNull (delegate , "Delegate must not be null" );
904
918
this .delegate = delegate ;
905
- this .delegateEvaluator = Evaluator . of (delegate );
919
+ this .delegateModifying = of (delegate );
906
920
}
907
921
922
+
908
923
@ 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 );
917
927
}
918
928
919
929
@ Override
@@ -941,30 +951,36 @@ public String toString() {
941
951
* {@link RequestPredicate} where either {@code left} or {@code right} predicates
942
952
* may match.
943
953
*/
944
- static class OrRequestPredicate extends EvaluatorRequestPredicate implements ChangePathPatternParserVisitor .Target {
954
+ static class OrRequestPredicate extends RequestModifyingPredicate
955
+ implements ChangePathPatternParserVisitor .Target {
945
956
946
957
private final RequestPredicate left ;
947
- private final Evaluator leftEvaluator ;
958
+
959
+ private final RequestModifyingPredicate leftModifying ;
948
960
949
961
private final RequestPredicate right ;
950
- private final Evaluator rightEvaluator ;
962
+
963
+ private final RequestModifyingPredicate rightModifying ;
964
+
951
965
952
966
public OrRequestPredicate (RequestPredicate left , RequestPredicate right ) {
953
967
Assert .notNull (left , "Left RequestPredicate must not be null" );
954
968
Assert .notNull (right , "Right RequestPredicate must not be null" );
955
969
this .left = left ;
956
- this .leftEvaluator = Evaluator . of (left );
970
+ this .leftModifying = of (left );
957
971
this .right = right ;
958
- this .rightEvaluator = Evaluator . of (right );
972
+ this .rightModifying = of (right );
959
973
}
960
974
961
975
@ 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 () ) {
965
979
return leftResult ;
966
980
}
967
- return this .rightEvaluator .apply (request );
981
+ else {
982
+ return this .rightModifying .testInternal (request );
983
+ }
968
984
}
969
985
970
986
@ Override
@@ -989,11 +1005,11 @@ public void accept(Visitor visitor) {
989
1005
990
1006
@ Override
991
1007
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 );
994
1010
}
995
- if (this .right instanceof ChangePathPatternParserVisitor .Target rightTarget ) {
996
- rightTarget .changeParser (parser );
1011
+ if (this .right instanceof ChangePathPatternParserVisitor .Target target ) {
1012
+ target .changeParser (parser );
997
1013
}
998
1014
}
999
1015
0 commit comments