/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 , ĠGoogle ĠInc . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ċ Ġ* Ġmet : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ Ġ* Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* ĠĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ Ġ* Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ċ Ġ* Ġin Ġthe Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ċ Ġ* Ġdistribution . Ċ Ġ* ĠĠĠĠ Ġ* ĠNeither Ġthe Ġname Ġof ĠGoogle ĠInc . Ġnor Ġthe Ġnames Ġof Ġits Ċ Ġ* Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ Ġ* Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ċ Ġ* Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR Ċ Ġ* ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT Ċ Ġ* ĠOWNER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , Ċ Ġ* ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ Ġ* ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ Ġ* Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ Ġ* ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . by but ter . sis y ph us . api . resource Ċ Ċ import Ġjava . util . Stack Ċ Ċ /** Ċ Ġ* ĠException Ġthrown Ġif Ġthere Ġis Ġa Ġvalidation Ġproblem Ġwith Ġa Ġpath Ġtemplate , Ġhttp Ġconfig , Ġor Ġrelated Ċ Ġ* Ġframework Ġmethods . ĠCome s Ġas Ġan Ġillegal Ġargument Ġexception Ġsubclass . ĠAllows Ġto Ġglobally Ġset Ġa Ċ Ġ* Ġthread - local Ġvalidation Ġcontext Ġdescription Ġwhich Ġeach Ġexception Ġinherits . Ċ Ġ*/ Ċ class ĠValidation Exception ( format : ĠString , Ġvar arg Ġargs : ĠAny ) Ġ: ĠIllegalArgumentException ( message ( context Local . get (), Ġformat , Ġ* args )) Ġ{ ĊĠĠĠ Ġinterface ĠSupplier < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext Local Ġ= ĠThread Local < Stack < Supplier < String >> >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSets Ġthe Ġvalidation Ġcontext Ġdescription . ĠEach Ġthread Ġhas Ġits Ġown Ġdescription , Ġso Ġthis Ġis Ġthread ĊĠĠĠĠĠĠĠĠ Ġ* Ġsafe . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpush Current Thread Validation Context ( supplier : ĠSupplier < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstack : ĠStack < Supplier < String >> ? Ġ= Ġcontext Local . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Ġ= ĠStack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Local . set ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( supplier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpush Current Thread Validation Context ( context : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush Current Thread Validation Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSupplier < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠClear s Ġthe Ġvalidation Ġcontext . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpop Current Thread Validation Context () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġcontext Local . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack ?. pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmessage ( context : ĠStack < Supplier < String >> ?, Ġformat : ĠString , Ġvar arg Ġargs : ĠAny ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull Ġ|| Ġcontext . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString . format ( format , Ġ* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( supplier Ġin Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( supplier . get () Ġ+ Ġ": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () Ġ+ ĠString . format ( format , Ġ* args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ