package Ġjust 4 fun . mod ularity . core . test . test End urance Ċ Ċ import Ġjust 4 fun . mod ularity . core . Module Ċ import Ġjust 4 fun . mod ularity . core . test . rnd Ċ import Ġjust 4 fun . mod ularity . core . test . rnd 0 Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ val Ġbind Lock Ġ= ĠAny () Ċ Ċ class ĠT Module Ref ( val Ġid : ĠInt ) Ġ{ Ċ ĉ private Ġval Ġlock Ġ= ĠAny () Ċ ĉ val Ġklas Ġ= Ġ( Class . forName ("$ packageName . M $ id ") Ġas ĠClass < T Module >). kotlin Ċ ĉ var Ġlevel Ġ= Ġ 0 Ċ ĉ var Ġmodule : ĠT Module ? Ġ= Ġnull Ċ ĉ var Ġpre dec : ĠT Module ? Ġ= Ġnull Ċ ĉ val Ġbound Refs Ġ= ĠCopy On Write ArrayList < T Module Ref >() Ċ ĉ val Ġun bounding Ġ= ĠCopy On Write ArrayList < Int >() Ċ ĉ val Ġbinder Refs Ġ= ĠCopy On Write ArrayList < T Module Ref >() Ċ ĉ // Ġcfg Ċ ĉ var Ġexecutor Option Ġ= Ġrnd ( Executor Option . values ()) Ċ ĉ var Ġstart Rest ful Ġ= Ġrnd . next Boolean () Ċ ĉ var Ġrest Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċ ĉ var Ġrest Duration Ġ= Ġif ( rnd . next Boolean ()) Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ġelse Ġ 0 Ċ ĉ var Ġactivate Opt Ġ= Ġrnd 0 ( 2 ) Ċ ĉ var Ġactivate Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċ ĉ var Ġdeactivate Opt Ġ= Ġrnd 0 ( 2 ) Ċ ĉ var Ġdeactivate Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċ ĉ var Ġneed Final izing Ġ= Ġrnd . next Boolean () Ċ ĉ val Ġdump Config Ġget () Ġ= Ġ"$ executor Option , Ġ ĠR : Ġ$ start Rest ful /$ rest Delay /$ rest Duration , Ġ ĠA : Ġ$ activate Opt /$ activate Delay , Ġ ĠD : Ġ$ deactivate Opt /$ deactivate Delay , Ġ ĠF : Ġ$ need Final izing ; Ġ ĠL v : Ġ$ level " ĊĉĊ ĉ override Ġfun ĠtoString () Ġ= Ġ" M $ id " ĊĉĊ ĉ fun Ġcan Bind ( bound Id : ĠInt ): ĠBoolean Ġ= Ġsynchronized ( bind Lock ) Ġ{ Ċĉ ĉ if Ġ( id Ġ== Ġbound Id ) Ġreturn Ġfalse Ċĉ ĉ val Ġbound Ref Ġ= Ġmodule Refs [ bound Id ] Ċĉ ĉ if Ġ( bound Refs . contains ( bound Ref )) Ġreturn Ġfalse Ċĉ ĉ val Ġcy clic Ġ= Ġis Cyc lic Binding ( bound Ref , Ġmutable ListOf ()) Ċĉ ĉ return Ġif Ġ( cyc lic ) Ġfalse Ġelse Ġbound Ref . add Binder ( this ) Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġis Cyc lic Binding ( bound Ref : ĠT Module Ref , Ġcall ers : ĠMutable List < T Module Ref >): ĠBoolean Ġ{ Ċĉ ĉ return Ġbinder Refs . any Ġ{ Ċ // ĉĉ ĉ log ( 2 , Ġid , Ġ" binder : Ġ$ it ; Ġ Ġbound : Ġ$ bound Ref ; Ġ Ġcall ers : Ġ$ call ers ") Ċĉĉ ĉ ! call ers . contains ( it ) Ġ&& Ġ( it Ġ=== Ġbound Ref Ġ|| Ġit . is Cyc lic Binding ( bound Ref , Ġcall ers . apply Ġ{ Ġadd ( this @ T Module Ref ) Ġ})) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun Ġremove Bound ( bound Ref : ĠT Module Ref ) Ġ= Ġbound Refs . remove ( bound Ref ) Ċ ĉ fun Ġremove Binder ( binder Ref : ĠT Module Ref ) Ġ= Ġsynchronized ( bind Lock ) Ġ{ Ċĉ ĉ binder Refs . remove ( binder Ref ) Ċĉ ĉ binder Ref . remove Bound ( this ) Ċ ĉ } ĊĉĊ ĉ fun Ġadd Bound ( bound Ref : ĠT Module Ref ) Ġ= Ġif Ġ(! bound Refs . contains ( bound Ref )) Ġbound Refs . add ( bound Ref ) Ġelse ĠUnit Ċ ĉ private Ġfun Ġadd Binder ( binder Ref : ĠT Module Ref ): ĠBoolean Ġ{ Ċĉ ĉ if Ġ(! binder Refs . contains ( binder Ref )) Ġ{ Ċĉĉ ĉ binder Refs . add ( binder Ref ) Ċĉĉ ĉ binder Ref . add Bound ( this ) Ċĉĉ ĉ level Ġ= Ġbinder Ref . level Ġ+ Ġ 1 Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĉĉĊ ĉ fun Ġmodule Destroyed ( m : ĠT Module ) Ġ= Ġsynchronized ( bind Lock ) Ġ{ Ċĉ ĉ if Ġ( module Ġ=== Ġm ) Ġ{ Ċĉĉ ĉ bound Refs . forEach Ġ{ Ġit . remove Binder ( this ) Ġ} Ċ // ĉĉ ĉ binder Refs . clear () Ċĉĉ ĉ module Ġ= Ġnull Ċĉĉ ĉ gen Config () Ċĉ ĉ } Ċĉ ĉ if Ġ( pre dec Ġ=== Ġm ) Ġpre dec Ġ= Ġnull Ċĉ ĉ active Modules . remove ( m ) Ċ ĉ } ĊĉĊ ĉ fun ĠisActive Module ( m : ĠT Module ) Ġ= Ġmodule Ġ=== Ġm Ċ ĉ fun Ġset Active Module ( m : ĠT Module ) Ġ= Ġsynchronized ( bind Lock ) Ġ{ Ċĉ ĉ pre dec Ġ= Ġmodule Ċĉ ĉ module Ġ= Ġm Ċĉ ĉ active Modules . add ( m ) Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġgen Config () Ġ{ Ċĉ ĉ executor Option Ġ= Ġrnd ( Executor Option . values ()) Ċĉ ĉ start Rest ful Ġ= Ġrnd . next Boolean () Ċĉ ĉ rest Duration Ġ= Ġ Ġif ( rnd . next Boolean ()) Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ġelse Ġ 0 Ċĉ ĉ rest Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċĉ ĉ activate Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċĉ ĉ activate Opt Ġ= Ġrnd 0 ( 2 ) Ċĉ ĉ deactivate Delay Ġ= Ġrnd 0 ( 1 0 ) Ġ* Ġ 1 0 0 Ċĉ ĉ deactivate Opt Ġ= Ġrnd 0 ( 2 ) Ċĉ ĉ need Final izing Ġ= Ġrnd . next Boolean () Ċ ĉ } ĊĉĊ ĉ fun Ġreset () Ġ{ Ċĉ ĉ level Ġ= Ġ 0 Ċĉ ĉ module Ġ= null Ċĉ ĉ pre dec Ġ= Ġnull Ċĉ ĉ binder Refs . clear () Ċĉ ĉ gen Config () Ċ ĉ } Ċ } Ċ