@@ -186,16 +186,63 @@ public Map<String,Path> paths(ObjectNode obj, String location, ParseResult resul
186186 } else {
187187 ObjectNode path = (ObjectNode ) pathValue ;
188188 Path pathObj = path (path , location + ".'" + pathName + "'" , result );
189+ String [] eachPart = pathName .split ("/" );
190+ for (String part : eachPart ) {
191+ if (part .startsWith ("{" ) && part .endsWith ("}" ) && part .length () > 2 ) {
192+ String pathParam = part .substring (1 , part .length () - 1 );
193+ boolean definedInPathLevel = isPathParamDefined (pathParam , pathObj .getParameters ());
194+ if (definedInPathLevel ) {
195+ continue ;
196+ }
197+ List <Operation > operationsInAPath = getAllOperationsInAPath (pathObj );
198+ for (Operation operation : operationsInAPath ) {
199+ if (!isPathParamDefined (pathParam , operation .getParameters ())) {
200+ result .warning (location + ".'" + pathName + "'" ," Declared path parameter " + pathParam + " needs to be defined as a path parameter in path or operation level" );
201+ break ;
202+ }
203+ }
204+ }
205+ }
189206 output .put (pathName , pathObj );
190207 }
191208 }
192209 }
193210 return output ;
194211 }
195212
213+ private boolean isPathParamDefined (String pathParam , List <Parameter > parameters ) {
214+ if (parameters == null || parameters .isEmpty ()) {
215+ return false ;
216+ } else {
217+ for (Parameter parameter : parameters ) {
218+ if (pathParam .equals (parameter .getName ()) && "path" .equals (parameter .getIn ())) {
219+ return true ;
220+ }
221+ }
222+ }
223+ return false ;
224+ }
225+
226+ private void addToOperationsList (List <Operation > operationsList , Operation operation ) {
227+ if (operation == null ) {
228+ return ;
229+ }
230+ operationsList .add (operation );
231+ }
232+
233+ private List <Operation > getAllOperationsInAPath (Path pathObj ) {
234+ List <Operation > operations = new ArrayList <>();
235+ addToOperationsList (operations , pathObj .getGet ());
236+ addToOperationsList (operations , pathObj .getPut ());
237+ addToOperationsList (operations , pathObj .getPost ());
238+ addToOperationsList (operations , pathObj .getPatch ());
239+ addToOperationsList (operations , pathObj .getDelete ());
240+ addToOperationsList (operations , pathObj .getOptions ());
241+ addToOperationsList (operations , pathObj .getHead ());
242+ return operations ;
243+ }
244+
196245 public Path path (ObjectNode obj , String location , ParseResult result ) {
197- boolean hasRef = false ;
198- Path output = null ;
199246 if (obj .get ("$ref" ) != null ) {
200247 JsonNode ref = obj .get ("$ref" );
201248 if (ref .getNodeType ().equals (JsonNodeType .STRING )) {
@@ -1579,6 +1626,7 @@ protected static class ParseResult {
15791626 private Map <Location , JsonNode > extra = new LinkedHashMap <Location , JsonNode >();
15801627 private Map <Location , JsonNode > unsupported = new LinkedHashMap <Location , JsonNode >();
15811628 private Map <Location , String > invalidType = new LinkedHashMap <Location , String >();
1629+ private List <Location > warnings = new ArrayList <>();
15821630 private List <Location > missing = new ArrayList <Location >();
15831631
15841632 public ParseResult () {
@@ -1596,6 +1644,10 @@ public void missing(String location, String key) {
15961644 missing .add (new Location (location , key ));
15971645 }
15981646
1647+ public void warning (String location , String key ) {
1648+ warnings .add (new Location (location , key ));
1649+ }
1650+
15991651 public void invalidType (String location , String key , String expectedType , JsonNode value ){
16001652 invalidType .put (new Location (location , key ), expectedType );
16011653 }
@@ -1661,6 +1713,11 @@ public List<String> getMessages() {
16611713 String message = "attribute " + location + l .key + " is missing" ;
16621714 messages .add (message );
16631715 }
1716+ for (Location l : warnings ) {
1717+ String location = l .location .equals ("" ) ? "" : l .location + "." ;
1718+ String message = "attribute " + location +l .key ;
1719+ messages .add (message );
1720+ }
16641721 for (Location l : unsupported .keySet ()) {
16651722 String location = l .location .equals ("" ) ? "" : l .location + "." ;
16661723 String message = "attribute " + location + l .key + " is unsupported" ;
0 commit comments