@@ -13,7 +13,8 @@ public class OpenAPIWorkflowValidator {
13
13
Set <String > workflowIds = new HashSet <>();
14
14
Map <String , Set <String >> stepIds = new HashMap <>();
15
15
Set <String > operationIds = new HashSet <>();
16
- Set <Schema > components = new HashSet <>();
16
+ Set <String > componentIds = new HashSet <>();
17
+ Components components = null ;
17
18
18
19
OpenAPIWorkflowValidator () {
19
20
}
@@ -31,11 +32,12 @@ public OpenAPIWorkflowValidatorResult validate() {
31
32
loadWorkflowIds (this .openAPIWorkflow );
32
33
loadStepIds (this .openAPIWorkflow .getWorkflows ());
33
34
loadOperationIds (this .openAPIWorkflow );
35
+ loadComponents (this .openAPIWorkflow .getComponents ());
34
36
35
37
OpenAPIWorkflowValidatorResult result = new OpenAPIWorkflowValidatorResult ();
36
38
37
39
if (openAPIWorkflow .getArazzo () == null || openAPIWorkflow .getArazzo ().isEmpty ()) {
38
- result .addError ("'workflowsSpec ' is undefined" );
40
+ result .addError ("'arazzo ' is undefined" );
39
41
}
40
42
41
43
// Info
@@ -85,7 +87,7 @@ List<String> validateInfo(Info info) {
85
87
}
86
88
87
89
List <String > validateSourceDescriptions (List <SourceDescription > sourceDescriptions ) {
88
- List <String > SUPPORTED_TYPES = Arrays .asList ("openapi" , "workflowsSpec " );
90
+ List <String > SUPPORTED_TYPES = Arrays .asList ("openapi" , "arazzo " );
89
91
90
92
List <String > errors = new ArrayList <>();
91
93
@@ -171,15 +173,18 @@ List<String> validateStep(Step step, String workflowId ) {
171
173
172
174
if (step .getParameters () != null ) {
173
175
for (Parameter parameter : step .getParameters ()) {
174
- if (isRuntimeExpression (parameter .getName ())) {
176
+ if (isRuntimeExpression (parameter .getReference ())) {
177
+ // reference a reusable object
175
178
errors .addAll (validateReusableParameter (parameter , workflowId , null ));
176
179
} else {
180
+ // parameter
177
181
errors .addAll (validateParameter (parameter , workflowId , null ));
178
- }
179
- if (step .getWorkflowId () == null ) {
180
- // when the step in context is NOT a workflowId the parameter IN must be defined
181
- if (!isRuntimeExpression (parameter .getName ()) && parameter .getIn () == null ) {
182
- errors .add ("'Workflow[" + workflowId + "]' parameter IN must be defined" );
182
+
183
+ if (step .getWorkflowId () == null ) {
184
+ // when the step in context is NOT a workflowId the parameter IN must be defined
185
+ if (!isRuntimeExpression (parameter .getName ()) && parameter .getIn () == null ) {
186
+ errors .add ("'Workflow[" + workflowId + "]' parameter IN must be defined" );
187
+ }
183
188
}
184
189
}
185
190
}
@@ -212,7 +217,7 @@ List<String> validateStep(Step step, String workflowId ) {
212
217
}
213
218
214
219
List <String > validateParameter (Parameter parameter , String workflowId , String componentName ) {
215
- List <String > SUPPORTED_VALUES = Arrays .asList ("path" , "query" , "header" , "cookie" , "body" , "workflow" );
220
+ List <String > SUPPORTED_VALUES = Arrays .asList ("path" , "query" , "header" , "cookie" , "body" );
216
221
217
222
String source ;
218
223
@@ -264,19 +269,18 @@ List<String> validateReusableParameter(Parameter parameter, String workflowId, S
264
269
source = "Component[" + componentName + "]" ;
265
270
}
266
271
267
- List <String > errors = new ArrayList <>();
268
-
269
- if (isRuntimeExpression (parameter .getName ())) {
270
- // Reusable Parameter object
271
- String name = parameter .getName ();
272
-
273
- if (parameter .getIn () != null ) {
274
- errors .add (source + "parameter " + name + " in (" + parameter .getIn () + ") should not be provided for a Reusable Parameter Object" );
275
- }
272
+ // reference to reusable object
273
+ String reference = parameter .getReference ();
274
+ // normalize reference
275
+ String key = reference .replace ("$components.parameters." , "" );
276
276
277
- // TODO: check reusable parameter exists in Components
277
+ List < String > errors = new ArrayList <>();
278
278
279
+ // check reusable parameter exists in Components
280
+ if (!this .components .getParameters ().containsKey (key )) {
281
+ errors .add (source + " parameter '" + reference + "' not found" );
279
282
}
283
+
280
284
return errors ;
281
285
}
282
286
@@ -447,14 +451,13 @@ String getOutputsKeyRegularExpression() {
447
451
List <String > loadWorkflowIds (OpenAPIWorkflow openAPIWorkflow ) {
448
452
List <String > errors = new ArrayList <>();
449
453
450
- boolean multipleWorkflowsSpec = getNumWorkflowsSpecSourceDescriptions (openAPIWorkflow .getSourceDescriptions ()) > 1 ? true : false ;
451
-
454
+ boolean multipleSpecs = getNumArazzoTypeSourceDescriptions (openAPIWorkflow .getSourceDescriptions ()) > 1 ? true : false ;
452
455
453
456
if (openAPIWorkflow .getWorkflows () != null ) {
454
457
validateWorkflowIdsUniqueness (openAPIWorkflow .getWorkflows ());
455
458
456
459
for (Workflow workflow : openAPIWorkflow .getWorkflows ()) {
457
- errors .addAll (validateStepsWorkflowIds (workflow .getSteps (), multipleWorkflowsSpec ));
460
+ errors .addAll (validateStepsWorkflowIds (workflow .getSteps (), multipleSpecs ));
458
461
}
459
462
460
463
for (Workflow workflow : openAPIWorkflow .getWorkflows ()) {
@@ -508,6 +511,10 @@ List<String> loadOperationIds(OpenAPIWorkflow openAPIWorkflow) {
508
511
return errors ;
509
512
}
510
513
514
+ void loadComponents (Components components ) {
515
+ this .components = components ;
516
+ }
517
+
511
518
public List <String > validateStepsOperationIds (List <Step > steps , boolean multipleOpenApiFiles ) {
512
519
List <String > errors = new ArrayList <>();
513
520
@@ -528,9 +535,9 @@ int getNumOpenApiSourceDescriptions(List<SourceDescription> sourceDescriptions)
528
535
return (int ) sourceDescriptions .stream ().filter (p -> p .isOpenApi ()).count ();
529
536
}
530
537
531
- // num of SourceDescriptions with type 'workflowsSpec '
532
- int getNumWorkflowsSpecSourceDescriptions (List <SourceDescription > sourceDescriptions ) {
533
- return (int ) sourceDescriptions .stream ().filter (p -> p .isWorkflowsSpec ()).count ();
538
+ // num of SourceDescriptions with type 'arazzo '
539
+ int getNumArazzoTypeSourceDescriptions (List <SourceDescription > sourceDescriptions ) {
540
+ return (int ) sourceDescriptions .stream ().filter (p -> p .isArazzo ()).count ();
534
541
}
535
542
536
543
boolean stepExists (String workflowId , String stepId ) {
@@ -554,11 +561,11 @@ List<String> validateWorkflowIdsUniqueness(List<Workflow> workflows) {
554
561
return errors ;
555
562
}
556
563
557
- List <String > validateStepsWorkflowIds (List <Step > steps , boolean multipleWorkflowsSpecFiles ) {
564
+ List <String > validateStepsWorkflowIds (List <Step > steps , boolean multipleArazzoTypeFiles ) {
558
565
List <String > errors = new ArrayList <>();
559
566
560
567
for (Step step : steps ) {
561
- if (multipleWorkflowsSpecFiles ) {
568
+ if (multipleArazzoTypeFiles ) {
562
569
// must use runtime expression to map applicable SourceDescription
563
570
if (step .getWorkflowId () != null && !step .getWorkflowId ().startsWith ("$sourceDescriptions." )) {
564
571
errors .add ("Operation " + step .getWorkflowId () + " must be specified using a runtime expression (e.g., $sourceDescriptions.<name>.<workflowId>)" );
0 commit comments