@@ -171,11 +171,14 @@ List<String> validateStep(Step step, String workflowId ) {
171171
172172 if (step .getParameters () != null ) {
173173 for (Parameter parameter : step .getParameters ()) {
174- errors .addAll (validateParameter (parameter , workflowId , null ));
175-
176- if (step .getWorkflowId () != null ) {
177- // when the step in context specifies a workflowId the parameter IN must be defined
178- if (parameter .getIn () == null ) {
174+ if (isRuntimeExpression (parameter .getName ())) {
175+ errors .addAll (validateReusableParameter (parameter , workflowId , null ));
176+ } else {
177+ 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 ) {
179182 errors .add ("'Workflow[" + workflowId + "]' parameter IN must be defined" );
180183 }
181184 }
@@ -208,12 +211,12 @@ List<String> validateStep(Step step, String workflowId ) {
208211 return errors ;
209212 }
210213
211- List <String > validateParameter (Parameter parameter , String workflowId , String componentName ) {
214+ List <String > validateParameter (Parameter parameter , String workflowId , String componentName ) {
212215 List <String > SUPPORTED_VALUES = Arrays .asList ("path" , "query" , "header" , "cookie" , "body" , "workflow" );
213216
214217 String source ;
215218
216- if (workflowId != null ) {
219+ if (workflowId != null ) {
217220 source = "Workflow[" + workflowId + "]" ;
218221 } else {
219222 source = "Component[" + componentName + "]" ;
@@ -222,37 +225,57 @@ List<String> validateParameter(Parameter parameter, String workflowId, String co
222225
223226 List <String > errors = new ArrayList <>();
224227
225- if (parameter .get$ref () != null ) {
226- // Reference object
227- // check is URI
228- } else {
229- // Parameter object
230- String name = parameter .getName ();
228+ // Parameter object
229+ String name = parameter .getName ();
231230
232- if (name == null ) {
233- errors .add (source + " parameter has no name" );
234- }
235- if (parameter .getIn () != null ) {
236- if (!SUPPORTED_VALUES .contains (parameter .getIn ())) {
237- if (name != null ) {
238- errors .add (source + "parameter " + name + " type (" + parameter .getIn () + ") is invalid" );
239- } else {
240- errors .add (source + " parameter type (" + parameter .getIn () + ") is invalid" );
241- }
242- }
243- }
244- if (parameter .getValue () == null ) {
245- if (name != null ) {
246- errors .add (source + " parameter " + name + " has no value" );
231+ if (name == null ) {
232+ errors .add (source + " parameter has no name" );
233+ }
234+ if (parameter .getIn () != null ) {
235+ if (!SUPPORTED_VALUES .contains (parameter .getIn ())) {
236+ if (name != null ) {
237+ errors .add (source + "parameter " + name + " in (" + parameter .getIn () + ") is invalid" );
247238 } else {
248- errors .add (source + " parameter has no value " );
239+ errors .add (source + " parameter in (" + parameter . getIn () + ") is invalid " );
249240 }
250241 }
251- if (parameter .getTarget () != null ) {
252- if (!isValidJsonPointer (parameter .getTarget ())) {
253- errors .add (source + " parameter " + name + " target is not a valid Json Pointer" );
254- }
242+ }
243+ if (parameter .getValue () == null ) {
244+ if (name != null ) {
245+ errors .add (source + " parameter " + name + " has no value" );
246+ } else {
247+ errors .add (source + " parameter has no value" );
248+ }
249+ }
250+ if (isRuntimeExpression (parameter .getName ())) {
251+ errors .add (source + " parameter " + name + " is a Reusable Parameter object" );
252+ }
253+
254+ return errors ;
255+ }
256+
257+ List <String > validateReusableParameter (Parameter parameter , String workflowId , String componentName ) {
258+
259+ String source ;
260+
261+ if (workflowId != null ) {
262+ source = "Workflow[" + workflowId + "]" ;
263+ } else {
264+ source = "Component[" + componentName + "]" ;
265+ }
266+
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" );
255275 }
276+
277+ // TODO: check reusable parameter exists in Components
278+
256279 }
257280 return errors ;
258281 }
@@ -561,4 +584,8 @@ public boolean isValidJsonPointer(String jsonPointerString) {
561584 return ret ;
562585 }
563586
587+ boolean isRuntimeExpression (String name ) {
588+ return name .startsWith ("$" );
589+ }
590+
564591}
0 commit comments