package Ġau . com . di us . p act . core . p act broker Ċ Ċ import Ġarrow . core . Either Ċ import Ġau . com . di us . p act . com . github . m ichael bull . result . Err Ċ import Ġau . com . di us . p act . com . github . m ichael bull . result . Ok Ċ import Ġau . com . di us . p act . com . github . m ichael bull . result . Result Ċ import Ġau . com . di us . p act . core . support . Json Ċ import Ġau . com . di us . p act . core . support . handle With Ċ import Ġau . com . di us . p act . core . support . isNotEmpty Ċ import Ġcom . github . sal om on br ys . kot son . get Ċ import Ġcom . github . sal om on br ys . kot son . json Array Ċ import Ġcom . github . sal om on br ys . kot son . jsonObject Ċ import Ġcom . github . sal om on br ys . kot son . obj Ċ import Ġcom . github . sal om on br ys . kot son . set Ċ import Ġcom . github . sal om on br ys . kot son . string Ċ import Ġcom . github . sal om on br ys . kot son . toJson Ċ import Ġcom . google . common . net . Url Esc apers . urlPath Segment Esc aper Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . Json Parser Ċ import Ġmu . K Logging Ċ import Ġorg . dm fs . rfc 3 9 8 6 . encoding . Pre coded Ċ import Ġjava . io . File Ċ import Ġjava . net . URL Decoder Ċ import Ġjava . util . function . Bi Function Ċ import Ġjava . util . function . Consumer Ċ Ċ /** Ċ Ġ* ĠWrap s Ġthe Ġresponse Ġfor Ġa ĠP act Ġfrom Ġthe Ġbroker Ġwith Ġthe Ġlink Ġdata Ġassociated Ġwith Ġthe ĠP act Ġdocument . Ċ Ġ*/ Ċ data Ġclass ĠP act Response ( val Ġp act File : ĠJsonObject , Ġval Ġlinks : ĠMap < String , ĠAny ?> ) Ċ Ċ sealed Ġclass ĠTest Result Ġ{ ĊĠ Ġobject ĠOk Ġ: ĠTest Result () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġto Boolean () Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġmerge ( result : ĠTest Result ) Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠ Ġis ĠOk Ġ-> Ġthis ĊĠĠĠĠĠ Ġis ĠFailed Ġ-> Ġresult ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠFailed ( var Ġresults : ĠList < Map < String , ĠAny ? >> Ġ= Ġempty List (), Ġval Ġdescription : ĠString Ġ= Ġ"") Ġ: ĠTest Result () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġto Boolean () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġmerge ( result : ĠTest Result ) Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠ Ġis ĠOk Ġ-> Ġthis ĊĠĠĠĠĠ Ġis ĠFailed Ġ-> ĠFailed ( results Ġ+ Ġresult . results , Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġdescription . isNotEmpty () Ġ&& Ġresult . description . isNotEmpty () Ġ&& Ġdescription Ġ!= Ġresult . description Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ"$ description , Ġ${ result . description }" ĊĠĠĠĠĠĠĠ Ġdescription . isNotEmpty () Ġ-> Ġdescription ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult . description ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġabstract Ġfun Ġto Boolean (): ĠBoolean ĊĠ Ġabstract Ġfun Ġmerge ( result : ĠTest Result ): ĠTest Result ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġfrom Boolean ( result : ĠBoolean ) Ġ= Ġif Ġ( result ) ĠOk Ġelse ĠFailed () ĊĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠLatest Ġ{ ĊĠ Ġdata Ġclass ĠUse Latest ( val Ġlatest : ĠBoolean ) Ġ: ĠLatest () ĊĠ Ġdata Ġclass ĠUse Latest Tag ( val Ġlatest Tag : ĠString ) Ġ: ĠLatest () Ċ } Ċ Ċ data Ġclass ĠCan I Deploy Result ( val Ġok : ĠBoolean , Ġval Ġmessage : ĠString , Ġval Ġreason : ĠString ) Ċ Ċ /** Ċ Ġ* ĠConsumer Ġversion Ġselector . ĠSee Ġhttps :// docs . p act . io / p act _ broker / advanced _ topics / selectors Ċ Ġ*/ Ċ data Ġclass ĠConsumer Version Selector ( val Ġtag : ĠString , Ġval Ġlatest : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠ Ġfun ĠtoJson () Ġ= ĠjsonObject (" tag " Ġto Ġtag , Ġ" latest " Ġto Ġlatest ) Ċ } Ċ Ċ /** Ċ Ġ* ĠClient Ġfor Ġthe Ġp act Ġbroker Ġservice Ċ Ġ*/ Ċ open Ġclass ĠP act Broker Client ( val Ġp act Broker Url : ĠString , Ġval Ġoptions : ĠMap < String , ĠAny >) Ġ{ ĊĊĠ Ġconstructor ( p act Broker Url : ĠString ) Ġ: Ġthis ( p act Broker Url , Ġmap Of ()) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠF etches Ġall Ġconsumers Ġfor Ġthe Ġgiven Ġprovider ĊĠĠ Ġ*/ ĊĠ Ġ@ Deprecated ( message Ġ= Ġ" Use Ġthe Ġversion Ġthat Ġtakes Ġselectors Ġinstead ", ĊĠĠĠ Ġreplace With Ġ= ĠReplace With (" fetch Consum ers With Selectors ")) ĊĠ Ġopen Ġfun Ġfetch Consum ers ( provider : ĠString ): ĠList < P act Broker Consumer > Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠĠĠ Ġval Ġconsumers Ġ= Ġmutable ListOf < P act Broker Consumer >() ĊĠĠĠĠĠ Ġhal Client . navigate ( map Of (" provider " Ġto Ġprovider ), ĠL ATE ST _ PROVIDER _ P ACT S ). for All ( P ACT S , ĠConsumer Ġ{ Ġp act Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġhref Ġ= ĠPre coded ( p act [" href "]. toString ()). decoded (). toString () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġp act [" name "]. toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( options . containsKey (" authentication ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url , Ġoptions [" authentication "] Ġas ĠList < String > )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġconsumers ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotFound Hal Response ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthe Ġprovider Ġis Ġnot Ġdefined Ġin Ġthe Ġbroker , Ġso Ġfail Ġgrace fully . ĊĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠF etches Ġall Ġconsumers Ġfor Ġthe Ġgiven Ġprovider Ġand Ġtag ĊĠĠ Ġ*/ ĊĠ Ġ@ Deprecated ( message Ġ= Ġ" Use Ġthe Ġversion Ġthat Ġtakes Ġselectors Ġinstead ", ĊĠĠĠ Ġreplace With Ġ= ĠReplace With (" fetch Consum ers With Selectors ")) ĊĠ Ġopen Ġfun Ġfetch Consum ers With Tag ( provider : ĠString , Ġtag : ĠString ): ĠList < P act Broker Consumer > Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠĠĠ Ġval Ġconsumers Ġ= Ġmutable ListOf < P act Broker Consumer >() ĊĠĠĠĠĠ Ġhal Client . navigate ( map Of (" provider " Ġto Ġprovider , Ġ" tag " Ġto Ġtag ), ĠL ATE ST _ PROVIDER _ P ACT S _ WITH _ TAG ) ĊĠĠĠĠĠĠĠ Ġ. for All ( P ACT S , ĠConsumer Ġ{ Ġp act Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġhref Ġ= ĠPre coded ( p act [" href "]. toString ()). decoded (). toString () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġp act [" name "]. toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( options . containsKey (" authentication ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url , Ġoptions [" authentication "] Ġas ĠList < String >, Ġtag )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url , Ġempty List (), Ġtag )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġconsumers ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotFound Hal Response ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthe Ġprovider Ġis Ġnot Ġdefined Ġin Ġthe Ġbroker , Ġso Ġfail Ġgrace fully . ĊĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠF etches Ġall Ġconsumers Ġfor Ġthe Ġgiven Ġprovider Ġand Ġselectors ĊĠĠ Ġ*/ ĊĠ Ġopen Ġfun Ġfetch Consum ers With Selectors ( provider : ĠString , Ġconsumer Version Selectors : ĠList < Consumer Version Selector >): ĠEither < Exception , ĠList < P act Result >> Ġ{ ĊĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client (). navigate () ĊĠĠĠ Ġval Ġp acts For Verification Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġhal Client . link Url ( PROVIDER _ P ACT S _ FOR _ VER IFICATION ) Ġ!= Ġnull Ġ-> ĠPRO VIDER _ P ACT S _ FOR _ VER IFICATION ĊĠĠĠĠĠ Ġhal Client . link Url ( B ETA _ PROVIDER _ P ACT S _ FOR _ VER IFICATION ) Ġ!= Ġnull Ġ-> ĠB ETA _ PROVIDER _ P ACT S _ FOR _ VER IFICATION ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( p acts For Verification Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbody Ġ= ĠjsonObject ( ĊĠĠĠĠĠĠĠ Ġ" consumer Version Selectors " Ġto Ġjson Array ( consumer Version Selectors . map Ġ{ Ġit . toJson () Ġ}) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġhandle With Ġ{ ĊĠĠĠĠĠĠĠ Ġhal Client . post Json ( p acts For Verification , Ġmap Of (" provider " Ġto Ġprovider ), Ġbody . toString ()). map Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġresult [" _ embedded "][" p acts "]. as JsonArray . map Ġ{ Ġp act Json Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġself Link Ġ= Ġp act Json [" _ links "][" self "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhref Ġ= ĠPre coded ( Json . toString ( self Link [" href "] )). decoded (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠJson . toString ( self Link [" name "]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotices Ġ= Ġp act Json [" verification Properties "][" notices "]. as JsonArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠVerification Notice . fromJson ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . containsKey (" authentication ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP act Result ( name , Ġhref , Ġp act Broker Url , Ġoptions [" authentication "] Ġas ĠList < String >, Ġnotices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP act Result ( name , Ġhref , Ġp act Broker Url , Ġempty List (), Ġnotices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġreturn Ġhandle With Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( consumer Version Selectors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfetch Consum ers ( provider ). map Ġ{ ĠP act Result . from Consumer ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfetch Consum ers With Tag ( provider , Ġconsumer Version Selectors . first (). tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠP act Result . from Consumer ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUp loads Ġthe Ġgiven Ġp act Ġfile Ġto Ġthe Ġbroker , Ġand Ġoptionally Ġapplies Ġany Ġtags ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġopen Ġfun Ġupload P act File ( p act File : ĠFile , Ġun escaped Version : ĠString , Ġtags : ĠList < String > Ġ= Ġempty List ()): ĠAny ? Ġ{ ĊĠĠĠ Ġval Ġp act Text Ġ= Ġp act File . read Text () ĊĠĠĠ Ġval Ġp act Ġ= ĠJson Parser . parse String ( p act Text ) ĊĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠ Ġval Ġprovider Name Ġ= Ġurl Path Segment Esc aper (). escape ( p act [" provider "][" name "]. string ) ĊĠĠĠ Ġval Ġconsumer Name Ġ= Ġurl Path Segment Esc aper (). escape ( p act [" consumer "][" name "]. string ) ĊĠĠĠ Ġval Ġversion Ġ= Ġurl Path Segment Esc aper (). escape ( unes caped Version ) ĊĠĠĠ Ġval Ġupload Path Ġ= Ġ"/ p acts / provider /$ provider Name / consumer /$ consumer Name / version /$ version " ĊĠĠĠ Ġif Ġ( tags . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġupload Tags ( hal Client , Ġconsumer Name , Ġversion , Ġtags ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhal Client . upload Json ( upload Path , Ġp act Text , ĠBi Function Ġ{ Ġresult , Ġstatus Ġ-> ĊĠĠĠĠĠ Ġif Ġ( result Ġ== Ġ" OK ") Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ" FAILED ! Ġ$ status " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġopen Ġfun ĠgetUrl For Provider ( provider Name : ĠString , Ġtag : ĠString ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠ Ġif Ġ( tag . isEmpty () Ġ|| Ġtag Ġ== Ġ" latest ") Ġ{ ĊĠĠĠĠĠ Ġhal Client . navigate ( map Of (" provider " Ġto Ġprovider Name ), ĠL ATE ST _ PROVIDER _ P ACT S ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġhal Client . navigate ( map Of (" provider " Ġto Ġprovider Name , Ġ" tag " Ġto Ġtag ), ĠL ATE ST _ PROVIDER _ P ACT S _ WITH _ TAG ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhal Client . link Url ( P ACT S ) ĊĠ Ġ} ĊĊĠ Ġopen Ġfun Ġfetch P act ( url : ĠString , Ġencode Path : ĠBoolean Ġ= Ġtrue ): ĠP act Response Ġ{ ĊĠĠĠ Ġval Ġhal Doc Ġ= Ġnew Hal Client (). fetch ( url , Ġencode Path ). obj ĊĠĠĠ Ġreturn ĠP act Response ( hal Doc , ĠHal Client . as Map ( hal Doc [" _ links "]. obj )) ĊĠ Ġ} ĊĊĠ Ġopen Ġfun Ġnew Hal Client (): ĠI Hal Client Ġ= ĠHal Client ( p act Broker Url , Ġoptions ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPub lishes Ġthe Ġresult Ġto Ġthe Ġ" pb : publish - verification - results " Ġlink Ġin Ġthe Ġdocument Ġattributes . ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġopen Ġfun Ġpublish Verification Results ( ĊĠĠĠ Ġdoc Attributes : ĠMap < String , ĠAny ? >, ĊĠĠĠ Ġresult : ĠTest Result , ĊĠĠĠ Ġversion : ĠString , ĊĠĠĠ Ġbuild Url : ĠString ? Ġ= Ġnull ĊĠ Ġ): ĠResult < Boolean , ĠException > Ġ{ ĊĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠ Ġval Ġpublish Link Ġ= Ġdoc Attributes . map Keys Ġ{ Ġit . key . toLowerCase () Ġ} Ġ[" pb : publish - verification - results "] Ġ// Ġk tl int - disable Ġcur ly - spacing ĊĠĠĠ Ġreturn Ġif Ġ( publish Link Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġbuild Payload ( result , Ġversion , Ġbuild Url ) ĊĊĠĠĠĠĠ Ġval Ġlowercase Map Ġ= Ġpublish Link . map Keys Ġ{ Ġit . key . toString (). toLowerCase () Ġ} ĊĠĠĠĠĠ Ġif Ġ( lowercase Map . containsKey (" href ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġhal Client . post Json ( lowercase Map [" href "]. toString (), ĠjsonObject . toString ()) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠErr ( RuntimeException (" Unable Ġto Ġpublish Ġverification Ġresults Ġas Ġthere Ġis Ġno Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" pb : publish - verification - results Ġlink ")) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠErr ( RuntimeException (" Unable Ġto Ġpublish Ġverification Ġresults Ġas Ġthere Ġis Ġno Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" pb : publish - verification - results Ġlink ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġbuild Payload ( result : ĠTest Result , Ġversion : ĠString , Ġbuild Url : ĠString ?): ĠJsonObject Ġ{ ĊĠĠĠ Ġval ĠjsonObject Ġ= ĠjsonObject (" success " Ġto Ġresult . to Boolean (), Ġ" provider Application Version " Ġto Ġversion ) ĊĠĠĠ Ġif Ġ( build Url Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠjsonObject . add (" build Url ", Ġbuild Url . toJson ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlogger . debug Ġ{ Ġ" Test Ġresult Ġ= Ġ$ result " Ġ} ĊĠĠĠ Ġif Ġ( result Ġis ĠTest Result . Failed Ġ&& Ġresult . results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġvalues Ġ= Ġresult . results ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit [" interaction Id "] Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmis matches Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmis matches . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . containsKey (" exception ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġmismatch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mismatch [" type "]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" body " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġbody Mis matches Ġ= Ġmismatch [" comparison "]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġbody Mis matches . entries . filter Ġ{ Ġit . key Ġ!= Ġ" diff " Ġ}. flatMap Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġentry . value Ġas ĠList < Map < String , ĠAny >> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject (" attribute " Ġto Ġ" body ", Ġ" identifier " Ġto Ġentry . key , Ġ" description " Ġto Ġit [" mismatch "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" diff " Ġto Ġit [" diff "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( jsonObject (" attribute " Ġto Ġ" body ", Ġ" description " Ġto Ġbody Mis matches . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" status " Ġ-> ĠlistOf ( jsonObject (" attribute " Ġto Ġ" status ", Ġ" description " Ġto Ġmismatch [" description "])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" header " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( jsonObject ( mismatch . filter Ġ{ Ġit . key Ġ!= Ġ" interaction Id " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . key Ġ== Ġ" type ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" attribute " Ġto Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Pair () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" metadata " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( jsonObject ( mismatch . filter Ġ{ Ġit . key Ġ!= Ġ" interaction Id " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġ-> ĠlistOf (" attribute " Ġto Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf (" identifier " Ġto Ġit . key , Ġ" description " Ġto Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( jsonObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmismatch . filter Not Ġ{ Ġit . key Ġ== Ġ" interaction Id " Ġ|| Ġit . key Ġ== Ġ" type " Ġ}. entries . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Pair () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġinteraction Json Ġ= ĠjsonObject (" interaction Id " Ġto Ġmis matches . key , Ġ" success " Ġto Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mis matches " Ġto Ġjson Array ( values ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġexception Details Ġ= Ġmis matches . value . find Ġ{ Ġit . containsKey (" exception ") Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Details Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġexception Details [" exception "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Json [" exceptions "] Ġ= Ġjson Array ( jsonObject (" message " Ġto Ġexception . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" exception Class " Ġto Ġexception . java Class . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Json [" exceptions "] Ġ= Ġjson Array ( jsonObject (" message " Ġto Ġexception . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġinteraction Json ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠjsonObject . add (" test Results ", Ġjson Array ( values )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠjsonObject ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠF etches Ġthe Ġconsumers Ġof Ġthe Ġprovider Ġthat Ġhave Ġno Ġassociated Ġtag ĊĠĠ Ġ*/ ĊĠ Ġ@ Deprecated ( message Ġ= Ġ" Use Ġthe Ġversion Ġthat Ġtakes Ġselectors Ġinstead ", ĊĠĠĠ Ġreplace With Ġ= ĠReplace With (" fetch Consum ers With Selectors ")) ĊĠ Ġopen Ġfun Ġfetch Latest Consum ers With No Tag ( provider : ĠString ): ĠList < P act Broker Consumer > Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠĠĠ Ġval Ġconsumers Ġ= Ġmutable ListOf < P act Broker Consumer >() ĊĠĠĠĠĠ Ġhal Client . navigate ( map Of (" provider " Ġto Ġprovider ), ĠL ATE ST _ PROVIDER _ P ACT S _ WITH _ NO _ TAG ) ĊĠĠĠĠĠĠĠ Ġ. for All ( P ACT S , ĠConsumer Ġ{ Ġp act Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġhref Ġ= ĠURL Decoder . decode ( p act [" href "]. toString (), ĠUTF 8 ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġp act [" name "]. toString () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . containsKey (" authentication ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url , Ġoptions [" authentication "] Ġas ĠList < String > )) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumers . add ( P act Broker Consumer ( name , Ġhref , Ġp act Broker Url , Ġempty List ())) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġconsumers ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNotFound Hal Response ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthe Ġprovider Ġis Ġnot Ġdefined Ġin Ġthe Ġbroker , Ġso Ġfail Ġgrace fully . ĊĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpublish Provider Tag ( doc Attributes : ĠMap < String , ĠAny ? >, Ġname : ĠString , Ġtag : ĠString , Ġversion : ĠString ) Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠĠĠĠĠ Ġ. with Doc Context ( doc Attributes ) ĊĠĠĠĠĠĠĠ Ġ. navigate ( PROVIDER ) ĊĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġhal Client . put Json ( PROVIDER _ TAG _ VERSION , Ġmap Of (" version " Ġto Ġversion , Ġ" tag " Ġto Ġtag ), Ġ"{} ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠOk Ġ-> Ġlogger . debug Ġ{ Ġ" P ushed Ġtag Ġ$ tag Ġfor Ġprovider Ġ$ name Ġand Ġversion Ġ$ version " Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠErr Ġ-> Ġlogger . error ( result . error ) Ġ{ Ġ" Failed Ġto Ġpush Ġtag Ġ$ tag Ġfor Ġprovider Ġ$ name Ġand Ġversion Ġ$ version " Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNotFound Hal Response ) Ġ{ ĊĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Could Ġnot Ġtag Ġprovider Ġ$ name , Ġlink Ġwas Ġmissing " Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġopen Ġfun Ġcan I Deploy ( p act icipant : ĠString , Ġp act icipant Version : ĠString , Ġlatest : ĠLatest , Ġto : ĠString ?): ĠCan I Deploy Result Ġ{ ĊĠĠĠ Ġval Ġhal Client Ġ= Ġnew Hal Client () ĊĠĠĠ Ġval Ġresult Ġ= Ġhal Client . get Json ("/ matrix " Ġ+ Ġbuild Matrix Query ( p act icipant , Ġp act icipant Version , Ġlatest , Ġto ), ĊĠĠĠĠĠ Ġfalse ) ĊĠĠĠ Ġreturn Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠ Ġis ĠOk Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsummary Ġ= Ġresult . value . as JsonObject [" summary "]. as JsonObject ĊĠĠĠĠĠĠĠ ĠCan I Deploy Result ( Json . to Boolean ( summary [" deploy able "]), Ġ"", ĠJson . toString ( summary [" reason "])) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠErr Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error ( result . error ) Ġ{ Ġ" P act Ġbroker Ġmatrix Ġquery Ġfailed : Ġ${ result . error . message }" Ġ} ĊĠĠĠĠĠĠĠ ĠCan I Deploy Result ( false , Ġresult . error . message . toString (), Ġ"") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Matrix Query ( p act icipant : ĠString , Ġp act icipant Version : ĠString , Ġlatest : ĠLatest , Ġto : ĠString ?): ĠString Ġ{ ĊĠĠĠ Ġval Ġescap er Ġ= Ġurl Path Segment Esc aper () ĊĠĠĠ Ġvar Ġbase Ġ= Ġ"? q [] [ p act icipant ]= ${ es cap er . escape ( p act icipant )} & latest by = cv p " ĊĠĠĠ Ġbase Ġ+= Ġwhen Ġ( latest ) Ġ{ ĊĠĠĠĠĠ Ġis ĠLatest . Use Latest Ġ-> Ġif Ġ( latest . latest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"& q [] [ latest ]= true " ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ"& q [] [ version ]= ${ es cap er . escape ( p act icipant Version )}" ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠLatest . Use Latest Tag Ġ-> Ġ" q [] [ tag ]= ${ es cap er . escape ( latest . latest Tag )}" ĊĠĠĠ Ġ} ĊĠĠĠ Ġbase Ġ+= Ġif Ġ( to . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ"& latest = true & tag =${ es cap er . escape ( to )}" ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"& latest = true " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbase ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ġ{ ĊĠĠĠ Ġconst Ġval ĠL ATE ST _ PROVIDER _ P ACT S _ WITH _ NO _ TAG Ġ= Ġ" pb : latest - unt agged - p act - version " ĊĠĠĠ Ġconst Ġval ĠL ATE ST _ PROVIDER _ P ACT S Ġ= Ġ" pb : latest - provider - p acts " ĊĠĠĠ Ġconst Ġval ĠL ATE ST _ PROVIDER _ P ACT S _ WITH _ TAG Ġ= Ġ" pb : latest - provider - p acts - with - tag " ĊĠĠĠ Ġconst Ġval ĠPRO VIDER _ P ACT S _ FOR _ VER IFICATION Ġ= Ġ" pb : provider - p acts - for - verification " ĊĠĠĠ Ġconst Ġval ĠB ETA _ PROVIDER _ P ACT S _ FOR _ VER IFICATION Ġ= Ġ" beta : provider - p acts - for - verification " ĊĠĠĠ Ġconst Ġval ĠPRO VIDER Ġ= Ġ" pb : provider " ĊĠĠĠ Ġconst Ġval ĠPRO VIDER _ TAG _ VERSION Ġ= Ġ" pb : version - tag " ĊĠĠĠ Ġconst Ġval ĠP ACT S Ġ= Ġ" pb : p acts " ĊĠĠĠ Ġconst Ġval ĠUTF 8 Ġ= Ġ" UTF - 8 " ĊĊĠĠĠ Ġfun Ġupload Tags ( hal Client : ĠI Hal Client , Ġconsumer Name : ĠString , Ġversion : ĠString , Ġtags : ĠList < String >) Ġ{ ĊĠĠĠĠĠ Ġtags . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġurl Path Segment Esc aper (). escape ( it ) ĊĠĠĠĠĠĠĠ Ġhal Client . upload Json ("/ p act icipants /$ consumer Name / versions /$ version / tags /$ tag ", Ġ"", ĊĠĠĠĠĠĠĠĠĠ ĠBi Function Ġ{ Ġ_, Ġ_ Ġ-> Ġnull Ġ}, Ġfalse ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ