package Ġde . z al ando . z ally . rule set . z al ando Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġcom . google . common . io . Resources Ċ import Ġcom . types afe . config . Config Ċ import Ġde . z al ando . z ally . core . EMPTY _ JSON _ POINTER Ċ import Ġde . z al ando . z ally . core . Json Schema Validator Ċ import Ġde . z al ando . z ally . core . Object Tree Reader Ċ import Ġde . z al ando . z ally . rule . api . Check Ċ import Ġde . z al ando . z ally . rule . api . Context Ċ import Ġde . z al ando . z ally . rule . api . Rule Ċ import Ġde . z al ando . z ally . rule . api . Severity Ċ import Ġde . z al ando . z ally . rule . api . Violation Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . net . URL Ċ Ċ @ Rule ( ĊĠĠĠ Ġrule Set Ġ= ĠZ al ando Rule Set :: class , ĊĠĠĠ Ġid Ġ= Ġ" 1 0 1 ", ĊĠĠĠ Ġseverity Ġ= ĠSeverity . MUST , ĊĠĠĠ Ġtitle Ġ= Ġ" Provide ĠAPI ĠSpecification Ġusing ĠOpenAPI " Ċ ) Ċ class ĠUse Open Api Rule ( rules Config : ĠConfig ) Ġ{ ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠOpen ApiVersion ( val Ġversion : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSW AG GER (" swagger "), ĊĠĠĠĠĠĠĠ ĠOPEN API 3 (" openapi 3 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Use Open Api Rule :: class . java ) ĊĊĠĠĠ Ġval Ġdescription Ġ= Ġ" Given Ġfile Ġis Ġnot ĠOpenAPI Ġ 2 . 0 Ġcompliant ." ĊĊĠĠĠ Ġprivate Ġval Ġjson Schema Validators : ĠMap < Open ApiVersion , ĠJson Schema Validator > ĊĊĠĠĠ Ġprivate Ġval Ġdefault Schemas Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠOpen ApiVersion . SW AG GER Ġto Ġ" schemas / openapi - 2 - schema . json ", ĊĠĠĠĠĠĠĠ ĠOpen ApiVersion . OPEN API 3 Ġto Ġ" schemas / openapi - 3 - schema . json " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġjson Schema Validators Ġ= Ġget Schema Validators ( rules Config . getConfig ( java Class . simple Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ( severity Ġ= ĠSeverity . MUST ) ĊĠĠĠ Ġfun Ġvalidate Schema ( spec : ĠJsonNode ): ĠList < Violation > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġopen Api 3 Spec Ġ= Ġspec . get (" swagger ") Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Version Ġ= Ġif Ġ( open Api 3 Spec ) ĠOpen ApiVersion . OPEN API 3 . version Ġelse ĠOpen ApiVersion . SW AG GER . version ĊĊĠĠĠĠĠĠĠ Ġval Ġswagger Validator Ġ= Ġjson Schema Validators [ Open ApiVersion . SW AG GER ] ĊĠĠĠĠĠĠĠ Ġval Ġopen Api 3 Validator Ġ= Ġjson Schema Validators [ Open ApiVersion . OPEN API 3 ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Api 3 Spec Ġ-> Ġopen Api 3 Validator ?. validate ( spec ). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġswagger Validator ?. validate ( spec ). or Empty () ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVi olation (" Does Ġnot Ġmatch Ġ$ current Version Ġschema : Ġ${ it . description }", Ġit . pointer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ( severity Ġ= ĠSeverity . MUST ) ĊĠĠĠ Ġfun Ġcheck If The Format Is YAML ( context : ĠContext ): ĠVi olation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġpoint Ġthe Ġapi Ġspecification Ġhas Ġbeen Ġalready Ġparsed Ġsuccessfully ĊĠĠĠĠĠĠĠ Ġ// Ġ-> Ġthe Ġsource Ġis Ġeither Ġa Ġvalid ĠYAML Ġor ĠJSON Ġformat ĊĠĠĠĠĠĠĠ Ġ// Ġ-> ĠJSON Ġmust Ġstart Ġwith Ġ'{ ' Ġand Ġend Ġwith Ġ' }' ĊĠĠĠĠĠĠĠ Ġval Ġcleaned Up Source Ġ= Ġcontext . source . trim () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cleaned Up Source . startsWith ("{ ") Ġ&& Ġcleaned Up Source . endsWith (" } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . violation (" must Ġuse ĠYAML Ġformat ", ĠEMPTY _ JSON _ POINTER ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Schema Validators ( rule Config : ĠConfig ): ĠMap < Open ApiVersion , ĠJson Schema Validator > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswagger Schema Link Ġ= ĠURL ( rule Config . getString (" schema _ urls .${ Open ApiVersion . SW AG GER . version } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Api Schema Link Ġ= ĠURL ( rule Config . getString (" schema _ urls .${ Open ApiVersion . OPEN API 3 . version } ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswagger Schema Ġ= ĠObjectMapper (). read Tree ( swagger Schema Link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Api Schema Ġ= ĠObjectMapper (). read Tree ( open Api Schema Link ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġavoid Ġresolving Ġthe Ġ` id ` Ġproperty Ġof Ġthe Ġschema Ġby Ġthe Ġvalidator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( swagger Schema Ġas ĠObject Node ). remove (" id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( open Api Schema Ġas ĠObject Node ). remove (" id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen ApiVersion . SW AG GER Ġto ĠJson Schema Validator ( Open ApiVersion . SW AG GER . version , Ġswagger Schema ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen ApiVersion . OPEN API 3 Ġto ĠJson Schema Validator ( Open ApiVersion . OPEN API 3 . version , Ġopen Api Schema ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Unable Ġto Ġload Ġswagger Ġschemas : Ġ${ e . message }. ĠUsing Ġdefault Ġschemas Ġinstead .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetDefault Schema Validators () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetDefault Schema Validators (): ĠMap < Open ApiVersion , ĠJson Schema Validator > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġdownload Swagger Schema Ġgradle Ġtask Ġcan Ġbe Ġused Ġto Ġdownload Ġlatest Ġversions Ġof Ġschemas ĊĠĠĠĠĠĠĠ Ġval Ġreferenced Online Schema Ġ= Ġ" http :// json - schema . org / draft - 0 4 / schema " ĊĠĠĠĠĠĠĠ Ġval Ġlocal Resource Ġ= ĠResources . getResource (" schemas / json - schema . json "). toString () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdefault Schemas . map Ġ{ Ġ( name , Ġfile ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Url Ġ= ĠResources . getResource ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠObject Tree Reader (). read ( schema Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Schema Validator ( name . version , Ġschema , Ġschema Redirect s Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferenced Online Schema Ġto Ġlocal Resource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// swagger . io / v 2 / schema . json " Ġto ĠResources . getResource (" schemas / openapi - 2 - schema . json "). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// open apis . org / v 3 / schema . json " Ġto ĠResources . getResource (" schemas / openapi - 3 - schema . json "). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ ĠOpen ApiVersion . valueOf ( it . name . toUpperCase ()) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ