package Ġio . hol unda . camunda . task pool . view . mongo . service Ċ Ċ import Ġio . hol unda . camunda . task pool . view . Task Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ const Ġval ĠEQUAL S Ġ= Ġ"=" Ċ const Ġval ĠG RE ATER Ġ= Ġ" >" Ċ const Ġval ĠL ESS Ġ= Ġ"< " Ċ const Ġval ĠTASK _ PREFIX Ġ= Ġ" task ." Ċ val ĠOPER ATORS Ġ= ĠRegex (" [$ EQUAL S $ LESS $ GRE ATER ]") Ċ Ċ /** Ċ Ġ* ĠForms Ġcriteria Ġfrom Ġstring Ġfilters . Ċ Ġ*/ Ċ fun Ġto Criteria ( filters : ĠList < String >) Ġ= Ġfilters . map Ġ{ Ġto Criterion ( it ) Ġ}. filter Ġ{ Ġit Ġ! is ĠC riterion . Empty Criterion Ġ} Ċ Ċ /** Ċ Ġ* ĠForms Ġa Ġsingle Ġcriteria Ġfrom Ġstring Ġfilter . Ċ Ġ*/ Ċ internal Ġfun Ġto Criterion ( filter : ĠString ): ĠC riterion Ġ{ ĊĊĠ Ġrequire ( filter . isNotBlank ()) Ġ{ Ġ" Failed Ġto Ġcreate Ġcriteria Ġfrom Ġempty Ġfilter Ġ'$ filter '. " Ġ} ĊĊĠ Ġif Ġ(! filter . contains ( OPER ATORS )) Ġ{ ĊĠĠĠ Ġreturn ĠC riterion . Empty Criterion ĊĠ Ġ} ĊĊĠ Ġval Ġsegments Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġfilter . contains ( EQUAL S ) Ġ-> Ġfilter . split ( EQUAL S ). plus ( EQUAL S ) ĊĠĠĠ Ġfilter . contains ( GRE ATER ) Ġ-> Ġfilter . split ( GRE ATER ). plus ( GRE ATER ) ĊĠĠĠ Ġfilter . contains ( LESS ) Ġ-> Ġfilter . split ( LESS ). plus ( LESS ) ĊĠĠĠ Ġelse Ġ-> ĠlistOf () ĊĠ Ġ} ĊĠ Ġrequire ( segments . size Ġ== Ġ 3 Ġ&& Ġ! segments [ 0 ]. isBlank () Ġ&& Ġ! segments [ 1 ]. isBlank ()) Ġ{ Ġ" Failed Ġto Ġcreate Ġcriteria Ġfrom Ġ$ filter ." Ġ} ĊĊĠ Ġreturn Ġif Ġ( is Task Attribute ( segments [ 0 ])) Ġ{ ĊĠĠĠ ĠC riterion . Task Criterion ( name Ġ= Ġsegments [ 0 ]. substring ( TASK _ PREFIX . length ), Ġvalue Ġ= Ġsegments [ 1 ], Ġoperator Ġ= Ġsegments [ 2 ]) ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ ĠC riterion . Data Entry Criterion ( name Ġ= Ġsegments [ 0 ], Ġvalue Ġ= Ġsegments [ 1 ], Ġoperator Ġ= Ġsegments [ 2 ]) ĊĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠChecks Ġis Ġa Ġproperty Ġis Ġa Ġtask Ġattribute . Ċ Ġ*/ Ċ internal Ġfun Ġis Task Attribute ( propertyName : ĠString ): ĠBoolean Ġ= ĊĠ ĠpropertyName . startsWith ( TASK _ PREFIX ) ĊĠĠĠ Ġ&& ĠpropertyName . length Ġ> ĠTASK _ PREFIX . length ĊĠĠĠ Ġ&& ĠTask :: class . member Properties . map Ġ{ Ġit . name Ġ}. contains ( propertyName . substring ( TASK _ PREFIX . length )) Ċ Ċ /** Ċ Ġ* ĠC riterion . Ċ Ġ*/ Ċ sealed Ġclass ĠC riterion ( open Ġval Ġname : ĠString , Ġopen Ġval Ġvalue : ĠString , Ġopen Ġval Ġoperator : ĠString ) Ġ{ ĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( other Ġ! is ĠC riterion ) Ġreturn Ġfalse ĊĊĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( value Ġ!= Ġother . value ) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( operator Ġ!= Ġother . operator ) Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġname . hashCode () ĊĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġvalue . hashCode () ĊĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġoperator . hashCode () ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġobject ĠEmpty Criterion Ġ: ĠC riterion (" empty ", Ġ" no Ġvalue ", Ġ" none ") ĊĠ Ġ/** ĊĠĠ Ġ* ĠC riterion Ġon Ġtask . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠTask Criterion ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġvalue : ĠString , Ġoverride Ġval Ġoperator : ĠString Ġ= ĠEQUAL S ) Ġ: ĠC riterion ( name , Ġvalue , Ġoperator ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠC riterion Ġon Ġdata Ġentry . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠData Entry Criterion ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġvalue : ĠString , Ġoverride Ġval Ġoperator : ĠString Ġ= ĠEQUAL S ) Ġ: ĠC riterion ( name , Ġvalue , Ġoperator ) Ċ } Ċ