3
3
import com .atlassian .oai .validator .model .Request ;
4
4
import com .atlassian .oai .validator .model .SimpleRequest ;
5
5
import com .atlassian .oai .validator .model .SimpleResponse ;
6
- import com .atlassian . oai . validator . report . ValidationReport ;
6
+ import com .getyourguide . openapi . validation . api . log . OpenApiViolationHandler ;
7
7
import com .getyourguide .openapi .validation .api .metrics .MetricsReporter ;
8
8
import com .getyourguide .openapi .validation .api .model .Direction ;
9
+ import com .getyourguide .openapi .validation .api .model .OpenApiViolation ;
9
10
import com .getyourguide .openapi .validation .api .model .RequestMetaData ;
10
11
import com .getyourguide .openapi .validation .api .model .ResponseMetaData ;
11
- import com .getyourguide .openapi .validation .api . model . ValidationResult ;
12
+ import com .getyourguide .openapi .validation .core . mapper . ValidationReportToOpenApiViolationsMapper ;
12
13
import com .getyourguide .openapi .validation .core .validator .OpenApiInteractionValidatorWrapper ;
13
14
import java .net .URLDecoder ;
14
15
import java .nio .charset .StandardCharsets ;
16
+ import java .util .List ;
15
17
import java .util .concurrent .RejectedExecutionException ;
16
18
import java .util .concurrent .ThreadPoolExecutor ;
17
19
import javax .annotation .Nullable ;
22
24
public class OpenApiRequestValidator {
23
25
private final ThreadPoolExecutor threadPoolExecutor ;
24
26
private final OpenApiInteractionValidatorWrapper validator ;
25
- private final ValidationReportHandler validationReportHandler ;
26
- private final OpenApiRequestValidationConfiguration configuration ;
27
+ private final ValidationReportToOpenApiViolationsMapper mapper ;
27
28
28
29
public OpenApiRequestValidator (
29
30
ThreadPoolExecutor threadPoolExecutor ,
30
- ValidationReportHandler validationReportHandler ,
31
31
MetricsReporter metricsReporter ,
32
32
OpenApiInteractionValidatorWrapper validator ,
33
+ ValidationReportToOpenApiViolationsMapper mapper ,
33
34
OpenApiRequestValidationConfiguration configuration
34
35
) {
35
36
this .threadPoolExecutor = threadPoolExecutor ;
36
37
this .validator = validator ;
37
- this .validationReportHandler = validationReportHandler ;
38
- this .configuration = configuration ;
38
+ this .mapper = mapper ;
39
39
40
40
metricsReporter .reportStartup (
41
41
validator != null ,
@@ -48,12 +48,28 @@ public boolean isReady() {
48
48
return validator != null ;
49
49
}
50
50
51
- public void validateRequestObjectAsync (final RequestMetaData request , @ Nullable ResponseMetaData response , String requestBody ) {
52
- executeAsync (() -> validateRequestObject (request , response , requestBody ));
51
+ public void validateRequestObjectAsync (
52
+ final RequestMetaData request ,
53
+ @ Nullable ResponseMetaData response ,
54
+ String requestBody ,
55
+ OpenApiViolationHandler listener
56
+ ) {
57
+ executeAsync (() -> {
58
+ var violations = validateRequestObject (request , response , requestBody );
59
+ violations .forEach (listener ::onOpenApiViolation );
60
+ });
53
61
}
54
62
55
- public void validateResponseObjectAsync (final RequestMetaData request , ResponseMetaData response , final String responseBody ) {
56
- executeAsync (() -> validateResponseObject (request , response , responseBody ));
63
+ public void validateResponseObjectAsync (
64
+ final RequestMetaData request ,
65
+ ResponseMetaData response ,
66
+ final String responseBody ,
67
+ OpenApiViolationHandler listener
68
+ ) {
69
+ executeAsync (() -> {
70
+ var violations = validateResponseObject (request , response , responseBody );
71
+ violations .forEach (listener ::onOpenApiViolation );
72
+ });
57
73
}
58
74
59
75
private void executeAsync (Runnable command ) {
@@ -64,28 +80,22 @@ private void executeAsync(Runnable command) {
64
80
}
65
81
}
66
82
67
- public ValidationResult validateRequestObject (final RequestMetaData request , String requestBody ) {
83
+ public List < OpenApiViolation > validateRequestObject (final RequestMetaData request , String requestBody ) {
68
84
return validateRequestObject (request , null , requestBody );
69
85
}
70
86
71
- public ValidationResult validateRequestObject (
87
+ public List < OpenApiViolation > validateRequestObject (
72
88
final RequestMetaData request ,
73
89
@ Nullable final ResponseMetaData response ,
74
90
String requestBody
75
91
) {
76
92
try {
77
93
var simpleRequest = buildSimpleRequest (request , requestBody );
78
94
var result = validator .validateRequest (simpleRequest );
79
- // TODO this should not be done here, but currently the only way to do it -> Refactor this so that logging
80
- // is actually done in the interceptor/filter where logging can easily be skipped then.
81
- if (!configuration .isShouldFailOnRequestViolation ()) {
82
- validationReportHandler
83
- .handleValidationReport (request , response , Direction .REQUEST , requestBody , result );
84
- }
85
- return buildValidationResult (result );
95
+ return mapper .map (result , request , response , Direction .REQUEST , requestBody );
86
96
} catch (Exception e ) {
87
97
log .error ("Could not validate request" , e );
88
- return ValidationResult . NOT_APPLICABLE ;
98
+ return List . of () ;
89
99
}
90
100
}
91
101
@@ -108,7 +118,7 @@ private static String nullSafeUrlDecode(String value) {
108
118
return URLDecoder .decode (value , StandardCharsets .UTF_8 );
109
119
}
110
120
111
- public ValidationResult validateResponseObject (
121
+ public List < OpenApiViolation > validateResponseObject (
112
122
final RequestMetaData request ,
113
123
final ResponseMetaData response ,
114
124
final String responseBody
@@ -126,23 +136,10 @@ public ValidationResult validateResponseObject(
126
136
Request .Method .valueOf (request .getMethod ().toUpperCase ()),
127
137
responseBuilder .build ()
128
138
);
129
- validationReportHandler .handleValidationReport (request , response , Direction .RESPONSE , responseBody , result );
130
- return buildValidationResult (result );
139
+ return mapper .map (result , request , response , Direction .RESPONSE , responseBody );
131
140
} catch (Exception e ) {
132
141
log .error ("Could not validate response" , e );
133
- return ValidationResult . NOT_APPLICABLE ;
142
+ return List . of () ;
134
143
}
135
144
}
136
-
137
- private ValidationResult buildValidationResult (ValidationReport validationReport ) {
138
- if (validationReport == null ) {
139
- return ValidationResult .NOT_APPLICABLE ;
140
- }
141
-
142
- if (validationReport .getMessages ().isEmpty ()) {
143
- return ValidationResult .VALID ;
144
- }
145
-
146
- return ValidationResult .INVALID ;
147
- }
148
145
}
0 commit comments