package Ġio . pro venance . scope Ċ Ċ import Ġarrow . core . Either Ċ import Ġcom . google . protobuf . Message Ċ import Ġio . pro venance . scope . contract . proto . Contracts . Execution Result Ċ import Ġio . pro venance . scope . contract . proto . Contracts . Record Ċ import Ġio . pro venance . scope . contract . proto . Contracts . Contract Ċ import Ġio . pro venance . scope . contract . spec . P 8 e Contract Ċ import Ġio . pro venance . scope . definition . Definition Service Ċ import Ġio . pro venance . scope . encryption . model . Key Ref Ċ import Ġio . pro venance . scope . object store . client . Cached Os Client Ċ import Ġio . pro venance . scope . object store . util . base 6 4 Decode Ċ import Ġio . pro venance . scope . util . or Throw Contract Definition Ċ import Ġio . pro venance . scope . util . to Offset DateTime Ċ import Ġjava . lang . reflect . Constructor Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Parameter Ċ Ċ class ĠContract Wrapper ( ĊĠĠĠ Ġprivate Ġval Ġcontract Spec Class : ĠClass < out ĠAny >, ĊĠĠĠ Ġprivate Ġval Ġencryption Key Ref : ĠKey Ref , ĊĠĠĠ Ġprivate Ġval Ġdefinition Service : ĠDefinition Service , ĊĠĠĠ Ġprivate Ġval Ġos Client : ĠCached Os Client , ĊĠĠĠ Ġprivate Ġval Ġcontract Builder : ĠContract . Builder , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrecords Ġ= Ġbuild Records () ĊĊĠĠĠ Ġval Ġcontract Class Ġ= Ġdefinition Service . load Class ( ĊĠĠĠĠĠĠĠ Ġcontract Builder . definition ĊĠĠĠ Ġ). take If Ġ{ ĊĠĠĠĠĠĠĠ Ġcontract Spec Class . isAssignableFrom ( it ) ĊĠĠĠ Ġ}. or Throw Contract Definition (" Contract Ġclass Ġ${ contract Builder . definition . resource Location . classname } Ġmust Ġimplement Ġ${ contract Spec Class . name }") ĊĠĠĠ Ġ. take If Ġ{ ĊĠĠĠĠĠĠĠ ĠP 8 e Contract :: class . java . isAssignableFrom ( it ) ĊĠĠĠ Ġ}. or Throw Contract Definition (" Contract Ġclass Ġ${ contract Builder . definition . resource Location . classname } Ġmust Ġextend Ġ${ P 8 e Contract :: class . java . name }") ĊĊĠĠĠ Ġprivate Ġval Ġconstructor Ġ= Ġget Constructor ( contract Class ) ĊĊĠĠĠ Ġprivate Ġval Ġconstructor Parameters Ġ= Ġget Constructor Parameters ( constructor , Ġrecords ). map Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ-> Ġwhen ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left < *> Ġ-> Ġx . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right < *> Ġ-> Ġx . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġx ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcontract Ġ= Ġ( constructor . newInstance (* constructor Parameters . to Typed Array ()) Ġas ĠP 8 e Contract ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . currentTime . set ( contract Builder . startTime . to Offset DateTime ()) Ġ} ĊĊĠĠĠ Ġval Ġfunctions Ġ= Ġcontract Builder . consider ations Builder List ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . result Ġ== ĠExecution Result . getDefaultInstance () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġconsideration Ġ-> Ġconsideration Ġto Ġget Consider ation Method ( contract . java Class , Ġconsideration . consider ation Name ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( consider ation , Ġmethod ) Ġ-> ĠFunction ( encryption Key Ref , Ġos Client , Ġcontract , Ġconsideration , Ġmethod , Ġrecords ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Constructor ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠClass < *> ĊĠĠĠ Ġ): ĠConstructor < *> Ġ= ĊĠĠĠĠĠĠĠ Ġclazz . declared Construct ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . size Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Class Ġ${ clazz . name } Ġmust Ġhave Ġonly Ġone Ġconstructor .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . parameters . all Ġ{ Ġparameter Ġ-> Ġparameter . getAnnotation ( io . pro venance . scope . contract . annotations . Record :: class . java ) Ġ!= Ġnull Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" All Ġconstructor Ġarguments Ġfor Ġ${ clazz . name } Ġmust Ġhave Ġan Ġ@ Record Ġannotation Ġ") ĊĊĠĠĠ Ġprivate Ġfun Ġget Constructor Parameters ( ĊĠĠĠĠĠĠĠ Ġconstructor : ĠConstructor <* >, ĊĠĠĠĠĠĠĠ Ġrecords : ĠList < Record Instance > ĊĠĠĠ Ġ): ĠList < Any > Ġ= ĊĠĠĠĠĠĠĠ Ġconstructor . parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġget Parameter Record ( it , Ġrecords ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . message Or Collection Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Parameter Record ( ĊĠĠĠĠĠĠĠ Ġparameter : ĠParameter , ĊĠĠĠĠĠĠĠ Ġrecords : ĠList < Record Instance > ĊĠĠĠ Ġ): ĠRecord Instance ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrecords . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . getAnnotation ( io . pro venance . scope . contract . annotations . Record :: class . java )?. name Ġ== Ġit . name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Consider ation Method ( ĊĠĠĠĠĠĠĠ Ġcontract Class : ĠClass <* >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ĊĠĠĠ Ġ): ĠMethod Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontract Class . methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Annotation Present ( io . pro venance . scope . contract . annotations . Function :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Unable Ġto Ġfind Ġmethod Ġon Ġclass Ġ${ contract Class . name } Ġwith Ġannotation Ġ${ io . pro venance . scope . contract . annotations . Function :: class . java } Ġwith Ġname Ġ$ name ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Records (): ĠList < Record Instance > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontract Builder . inputs List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . data Location . ref . hash . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Record Instance ( encryption Key Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġrecords Ġ-> Ġrecords . map Ġ{ Ġit . name Ġ}. toSet (). size Ġ== Ġrecords . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Found Ġduplicate Ġrecord Ġmessages Ġby Ġname .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Record >. to Record Instance ( ĊĠĠĠĠĠĠĠ Ġencryption Key Ref : ĠKey Ref ĊĠĠĠ Ġ): ĠList < Record Instance > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecord Map : ĠMap < String , ĠList < Message >> Ġ= Ġgroup By To ( mutable Map Of (), Ġ{ Ġit . name Ġ}) Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġos Client . get Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . data Location . classname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord . data Location . ref . hash . base 6 4 Decode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ( name , Ġfutures ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto Ġfutures . map Ġ{ Ġit . get () Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġrecord Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . size Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( name , Ġmessages ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . map Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . java Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Left ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġrecord Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . size Ġ> Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( name , Ġmessages ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . first (). java Class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Right ( messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let ( records :: addAll ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrecords ĊĠĠĠ Ġ} Ċ } Ċ