package Ġcom . ade vint a . oss . zo e . core . utils Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . node . Null Node Ċ import Ġio . bur t . j me spath . Expression Ċ import Ġio . bur t . j me spath . jackson . Jack son Runtime Ċ import Ġnet . this ptr . jackson . jq . Builtin Function Loader Ċ import Ġnet . this ptr . jackson . jq . Json Query Ċ import Ġnet . this ptr . jackson . jq . Scope Ċ import Ġnet . this ptr . jackson . jq . Versions Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ interface ĠJson Search Ġ{ ĊĠĠĠ Ġfun Ġvalidate ( expr : ĠString ) ĊĠĠĠ Ġfun Ġquery ( obj : ĠJsonNode , Ġexpr : ĠString ): ĠJsonNode Ċ } Ċ Ċ class ĠJ me spath Impl Ġ: ĠJson Search Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < String , ĠExpression < JsonNode >>() ĊĠĠĠ Ġprivate Ġval Ġj me spath Ġ= ĠJack son Runtime () ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate ( expr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġget Or Compile ( expr ) Ġ}. on Failure Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġj me spath Ġexpression Ġ'$ expr '", Ġerr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery ( obj : ĠJsonNode , Ġexpr : ĠString ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompiled Ġ= Ġget Or Compile ( expr ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcompiled . search ( obj ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Compile ( expr : ĠString ) Ġ= Ġcache . compute If Absent ( expr ) Ġ{ Ġj me spath . compile ( expr ) Ġ} Ċ } Ċ Ċ class ĠJ q Impl Ġ: ĠJson Search Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < String , ĠJson Query >() ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠScope . new Empty Scope (). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠBuiltin Function Loader . getInstance (). load Functions ( Versions . JQ _ 1 _ 6 , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate ( expr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġget Or Compile ( expr ) Ġ}. on Failure Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġjq Ġexpression Ġ'$ expr '", Ġerr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery ( obj : ĠJsonNode , Ġexpr : ĠString ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompiled Ġ= Ġget Or Compile ( expr ) ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠArrayList < JsonNode >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled . apply ( scope , Ġobj ) Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( results . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . first OrNull () Ġ?: ĠNull Node . instance ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . create Array Node (). addAll ( results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Compile ( expr : ĠString ) Ġ= Ġcache . compute If Absent ( expr ) Ġ{ ĠJson Query . compile ( expr , ĠVersions . JQ _ 1 _ 6 ) Ġ} Ċ } Ċ Ċ fun ĠJson Search . match ( obj : ĠJsonNode , Ġfilters : ĠList < String >): ĠBoolean Ġ= ĊĠĠĠ Ġfilters . all Ġ{ Ġexpr Ġ-> Ġquery ( obj , Ġexpr ). as Boolean () Ġ}