/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠVS CT Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġai . to ck . shared Ċ Ċ import Ġai . to ck . shared . jackson . add Deserializer Ċ import Ġai . to ck . shared . jackson . add Serializer Ċ import Ġai . to ck . shared . jackson . jackson Additional Modules Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . core . Json Token Id Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . de ser . std . Std Scalar Deserializer Ċ import Ġcom . fasterxml . jackson . databind . module . Simple Module Ċ import Ġcom . fasterxml . jackson . databind . ser . std . ToString Serializer Ċ import Ġcom . fasterxml . jackson . datatype . js r 3 1 0 . Decimal Utils Ċ import Ġcom . fasterxml . jackson . datatype . js r 3 1 0 . de ser . Duration Deserializer Ċ import Ġcom . fasterxml . jackson . datatype . js r 3 1 0 . de ser . JS R 3 1 0 String Par s able Deserializer Ċ import Ġcom . fasterxml . jackson . datatype . js r 3 1 0 . ser . Duration Serializer Ċ import Ġcom . mongodb . ConnectionString Ċ import Ġcom . mongodb . Mongo Client Ċ import Ġcom . mongodb . Mongo Client Settings Ċ import Ġcom . mongodb . client . Mongo Database Ċ import Ġcom . mongodb . client . model . change stream . Change Stream Document Ċ import Ġcom . mongodb . client . model . change stream . Full Document Ċ import Ġcom . mongodb . connection . netty . Net ty Stream Factory Factory Ċ import Ġcom . mongodb . reactiv est ream s . client . Mongo Collection Ċ import Ġde . under couch . bson 4 jackson . types . Decimal 1 2 8 Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . lit ote . km ongo . K Mongo Ċ import Ġorg . lit ote . km ongo . id . Id Generator Ċ import Ġorg . lit ote . km ongo . id . ObjectId ToString Generator Ċ import Ġorg . lit ote . km ongo . reactiv est ream s . watch In def initely Ċ import Ġorg . lit ote . km ongo . util . Collection Name Formatter Ċ import Ġorg . lit ote . km ongo . util . K Mongo Configuration Ċ import Ġorg . lit ote . km ongo . util . K Mongo Configuration . register B son Module Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Period Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . Zone Offset Ċ import Ġkotlin . reflect . K Class Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ internal Ġval Ġcollection Builder : Ġ( K Class <* >) Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠ Ġit . simple Name !! ĊĠĠĠĠĠĠĠ Ġ. replace (" storage ", Ġ"", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. toCharArray () ĊĠĠĠĠĠĠĠ Ġ. fold ("") Ġ{ Ġs , Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isEmpty ()) Ġt . toLowerCase (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( t . is UpperCase ()) Ġ"${ s }_${ t . toLowerCase () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"$ s $ t " ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠT ock K Mongo Configuration Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠCollection Name Formatter . default Collection Name Builder Ġ= Ġcollection Builder ĊĠĠĠĠĠĠĠ ĠId Generator . default Generator Ġ= ĠObjectId ToString Generator ĊĊĠĠĠĠĠĠĠ Ġval Ġto ck Module Ġ= ĠSimple Module (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Serializer ( Zone Id :: class , ĠToString Serializer ( Zone Id :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Deserializer ( Zone Id :: class , ĠJ SR 3 1 0 String Par s able Deserializer . ZONE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Serializer ( Zone Offset :: class , ĠToString Serializer ( Zone Offset :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Deserializer ( Zone Offset :: class , ĠJ SR 3 1 0 String Par s able Deserializer . ZONE _ OFFSET ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Deserializer ( Period :: class , ĠJ SR 3 1 0 String Par s able Deserializer . PERIOD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Serializer ( Period :: class , ĠToString Serializer ( Period :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Serializer ( Duration :: class , ĠDuration Serializer . INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Deserializer ( Duration :: class , Ġobject Ġ: ĠStd Scalar Deserializer < Duration >( Duration :: class . java ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( parser : ĠJson Parser , Ġcontext : ĠDeserial ization Context ): ĠDuration ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parser . current Token Id () Ġ== ĠJson Token Id . ID _ EMB ED DED _ OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġparser . embedded Object ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDecimal 1 2 8 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġe . big Decimal Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġb . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnan oseconds Ġ= ĠDecimal Utils . extract Nan ose cond Decimal ( b , Ġseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuration . of Seconds ( seconds , Ġnan oseconds . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDuration Ġ-> Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" unsupported Ġduration Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDuration Deserializer . INSTANCE . deserialize ( parser , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregister B son Module ( to ck Module ) ĊĠĠĠĠĠĠĠ ĠK Mongo Configuration . extended Json Mapper . register Module ( to ck Module ) ĊĠĠĠĠĠĠĠ Ġj ack son Additional Modules . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister B son Module ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK Mongo Configuration . extended Json Mapper . register Module ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconfigure ( async : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" K Mongo ĠT ock Ġ${ if Ġ( async ) Ġ" async " Ġelse Ġ"" } Ġconfiguration Ġloaded ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġmongo Url Ġ= ĠConnection String ( ĊĠĠĠ Ġproperty ( ĊĠĠĠĠĠĠĠ Ġ" to ck _ mongo _ url ", ĊĠĠĠĠĠĠĠ Ġ" mongodb :// localhost : 2 7 0 1 7 , localhost : 2 7 0 1 8 , localhost : 2 7 0 1 9 /? replica Set = to ck & retry Writes = true " ĊĠĠĠ Ġ) Ċ ) Ċ Ċ /** Ċ Ġ* ĠThe Ġsync Ġ[ Mongo Client ] Ġof ĠT ock . Ċ Ġ*/ Ċ internal Ġval Ġmongo Client : ĠMongo Client Ġby Ġlazy Ġ{ ĊĠĠĠ ĠT ock K Mongo Configuration . configure () ĊĠĠĠ ĠK Mongo . create Client ( mongo Url ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġasync Ġ[ Mongo Client ] Ġof ĠT ock . Ċ Ġ*/ Ċ internal Ġval Ġasync Mongo Client : Ġcom . mongodb . reactiv est ream s . client . Mongo Client Ġby Ġlazy Ġ{ ĊĠĠĠ ĠT ock K Mongo Configuration . configure ( true ) ĊĠĠĠ Ġorg . lit ote . km ongo . reactiv est ream s . K Mongo . create Client ( ĊĠĠĠĠĠĠĠ ĠMongo Client Settings . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ConnectionString ( mongo Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mongo Url . ssl Enabled Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Factory Factory ( Net ty Stream Factory Factory . builder (). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġthe Ġsync Ġdatabase Ġspecified Ġin Ġthe Ġ[ database Name Property ]. Ċ Ġ* Ġif Ġthe Ġenv Ġor Ġsystem Ġproperty Ġis Ġnot Ġfound , Ġuse Ġthe Ġ[ database Name Property ] Ġas Ġdatabase Ġname Ġ( remove Ġ"_ mongo _ db " Ġstring Ġis Ġpresent ). Ċ Ġ*/ Ċ fun Ġget Database ( database Name Property : ĠString ): ĠMongo Database Ġ{ ĊĠĠĠ Ġval Ġdatabase Name Ġ= Ġformat Database ( database Name Property ) ĊĠĠĠ Ġlogger . info (" get Ġdatabase Ġ$ database Name ") ĊĠĠĠ Ġreturn Ġinjector . provide < Mongo Client >(). get Database ( database Name ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġthe Ġasync Ġdatabase Ġspecified Ġin Ġthe Ġ[ database Name Property ]. Ċ Ġ* Ġif Ġthe Ġenv Ġor Ġsystem Ġproperty Ġis Ġnot Ġfound , Ġuse Ġthe Ġ[ database Name Property ] Ġas Ġdatabase Ġname Ġ( remove Ġ"_ mongo _ db " Ġstring Ġis Ġpresent ). Ċ Ġ*/ Ċ fun Ġget Async Database ( database Name Property : ĠString ): Ġcom . mongodb . reactiv est ream s . client . Mongo Database Ġ{ ĊĠĠĠ Ġval Ġdatabase Name Ġ= Ġformat Database ( database Name Property ) ĊĠĠĠ Ġlogger . info (" get Ġdatabase Ġ$ database Name ") ĊĠĠĠ Ġreturn Ġinjector . provide < com . mongodb . reactiv est ream s . client . Mongo Client >(). get Database ( database Name ) Ċ } Ċ Ċ private Ġfun Ġformat Database ( database Name Property : ĠString ): ĠString Ġ= ĊĠĠĠ Ġproperty ( database Name Property , Ġdatabase Name Property ). replace ("_ mongo _ db ", Ġ"") Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠMongo Collection < T >. watch ( ĊĠĠĠ Ġfull Document : ĠFull Document Ġ= ĠFull Document . DEFAULT , ĊĠĠĠ Ġno inline Ġlistener : Ġ( Change Stream Document < T >) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġwatch In def initely ( ĊĠĠĠĠĠĠĠ Ġfull Document Ġ= Ġfull Document , ĊĠĠĠĠĠĠĠ Ġsubscribe Listener Ġ= Ġ{ Ġ( Kotlin Logging . logger Ġ{}). info Ġ{ Ġ" Subscribe Ġstream " Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġerror Listener Ġ= Ġ{ Ġ( Kotlin Logging . logger Ġ{}). error ( it ) Ġ}, ĊĠĠĠĠĠĠĠ Ġreopen Listener Ġ= Ġ{ Ġ( Kotlin Logging . logger Ġ{}). warn Ġ{ Ġ" Re open Ġstream " Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġlistener ĊĠĠĠ Ġ) Ċ } Ċ