/* Ċ Copyright Ġ 2 0 1 8 - 2 0 2 0 ĠBar D ĠSoftware Ġs . r . o Ċ Ċ This Ġfile Ġis Ġpart Ġof ĠG antt Project , Ġan Ġopen source Ġproject Ġmanagement Ġtool . Ċ Ċ Gantt Project Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ it Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ċ Gantt Project Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ but ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ MER CHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ GNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ċ You Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ along Ġwith ĠG antt Project . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ */ Ċ package Ġbiz . g ant tp ro ject . storage . cloud Ċ Ċ import Ġbiz . g ant tp ro ject . app . Root Local izer Ċ import Ġbiz . g ant tp ro ject . storage .* Ċ import Ġbiz . g ant tp ro ject . storage . cloud . http . Is Locked Service Ċ import Ġbiz . g ant tp ro ject . storage . cloud . http . Lock Service Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġcom . google . common . base . Strings Ċ import Ġcom . google . common . hash . Hash ing Ċ import Ġjavafx . beans . property . Simple Boolean Property Ċ import Ġjavafx . beans . property . Simple ObjectProperty Ċ import Ġjavafx . event . EventHandler Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnet . sourceforge . g ant tp ro ject . GP Logger Ċ import Ġnet . sourceforge . g ant tp ro ject . document . Abstract URL Document Ċ import Ġnet . sourceforge . g ant tp ro ject . document . Document Ċ import Ġnet . sourceforge . g ant tp ro ject . document . Document Manager Ċ import Ġnet . sourceforge . g ant tp ro ject . document . File Document Ċ import Ġorg . eclipse . core . runtime . I Status Ċ import Ġorg . eclipse . core . runtime . Status Ċ import Ġjava . io .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . function . Consumer Ċ Ċ type alias ĠOff line Document Factory Ġ= Ġ( path : ĠString ) Ġ-> ĠDocument ? Ċ type alias ĠProxy Document Factory Ġ= Ġ( document : ĠDocument ) Ġ-> ĠDocument Ċ Ċ const Ġval ĠURL _ SCHEME Ġ= Ġ" cloud :" Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġrepresents Ġa Ġdocument Ġstored Ġon ĠG antt Project ĠCloud . Ċ Ġ*/ Ċ class ĠG PC loud Document ( val Ġteam Ref id : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġteam Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġvar Ġproject Ref id : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠprojectName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Json : ĠProject Json As Folder Item ?) ĊĠ Ġ: ĠAbstract URL Document (), ĠLock able Document , ĠOnline Document Ġ{ ĊĊĠ Ġoverride Ġval Ġis Mir rored Ġ= ĠSimple Boolean Property () ĊĠ Ġoverride Ġval Ġstatus Ġ= ĠSimple ObjectProperty < Lock Status >() ĊĠ Ġoverride Ġval Ġmode Ġ= ĠSimple ObjectProperty ( Online Document Mode . ON LINE _ ONLY ) ĊĠ Ġoverride Ġval Ġfetch Result Property Ġ= ĠSimple ObjectProperty < Fetch Result >() ĊĠ Ġoverride Ġval Ġlatest Version Property Ġ= ĠSimple ObjectProperty < Latest Version >( this , Ġ"") ĊĊĠ Ġprivate Ġval Ġquery Args : ĠString ĊĠĠĠ Ġget () Ġ= Ġ"? project Ref id =${ this . project Ref id }" ĊĊĠ Ġinternal Ġval ĠprojectId Fingerprint Ġget () Ġ= Ġthis . project Ref id ?. let Ġ{ ĊĠĠĠ ĠHash ing . farm Hash Fingerprint 6 4 (). hash Un encoded Chars ( it ). toString () ĊĠ Ġ} Ġ?: Ġ"" ĊĊĠ Ġprivate Ġvar Ġlast Offline Contents : ĠByteArray ? Ġ= Ġnull ĊĠ Ġinternal Ġvar Ġoffline Document Factory : ĠOff line Document Factory Ġ= Ġ{ Ġnull Ġ} ĊĠ Ġinternal Ġvar Ġproxy Document Factory : ĠProxy Document Factory Ġ= Ġ{ Ġdoc Ġ-> Ġdoc Ġ} ĊĠ Ġinternal Ġvar ĠhttpClient Factory : Ġ() Ġ-> ĠG PC loud HttpClient Ġ= Ġ{ ĠHttpClient Builder . build HttpClient () Ġ} ĊĠ Ġinternal Ġvar Ġis Network Available Ġ= ĠCallable Ġ{ Ġis Network Available () Ġ} ĊĠ Ġinternal Ġvar Ġexecutor Ġ= Ġour Executor ĊĊĠ Ġvar Ġlock : ĠJsonNode ? Ġ= Ġnull ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġthis . status . set ( json 2 lock Status ( value )) ĊĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it [" uid "] ?. text Value () Ġ== ĠG PC loud Options . userId . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠG PC loud Options . cloud Files . files . get Or Put ( this . project Ref id !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG PC loud File Options ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint Ġ= Ġthis . projectId Fingerprint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġthis . projectName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġoptions . lock Token Ġ= Ġit . get (" lock Token ") ?. text Value () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠ Ġoptions . lock Expiration Ġ= Ġit . get (" expiration Epoch Ts ") ?. longValue ()?. toString () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠ ĠG PC loud Options . cloud Files . save () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġoverride Ġvar Ġoffline Mirror : ĠDocument ? Ġ= Ġnull ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcurrent Value Ġ= Ġfield ĊĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull Ġ&& Ġcurrent Value Ġis ĠFile Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Value . delete () ĊĠĠĠĠĠĠĠ Ġthis . mirror Options ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . clear Offline Mirror () ĊĠĠĠĠĠĠĠĠĠ ĠG PC loud Options . cloud Files . save () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠG PC loud Options . cloud Files . files . get Or Put ( this . projectId Fingerprint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠG PC loud File Options ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint Ġ= Ġthis . projectId Fingerprint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġthis . projectName ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptions . offline Mirror Ġ= Ġit . filePath ĊĠĠĠĠĠĠĠ ĠG PC loud Options . cloud Files . save () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ( field Ġ?: Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfp Ġ= Ġthis . projectId Fingerprint ĊĠĠĠĠĠĠĠ Ġval Ġfile Options Ġ= ĠG PC loud Options . cloud Files . getFile Options ( fp ) ĊĠĠĠĠĠĠĠ Ġval Ġonline Only Ġ= Ġfile Options . online Only . to Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġoffline Mirror Path Ġ= Ġfile Options . offline Mirror ĊĠĠĠĠĠĠĠ Ġif Ġ(! online Only Ġ&& Ġoffline Mirror Path Ġ!= Ġnull Ġ&& ĠFiles . exists ( Paths . get ( offline Mirror Path ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . offline Document Factory ( offline Mirror Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ()). also Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġinternal Ġvar Ġmode Value : ĠOnline Document Mode ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis . mode . get () ĊĠĠĠ Ġ} ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( value Ġ== Ġthis . mode . get ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġwhen Ġ( this . mode . value Ġto Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . ON LINE _ ONLY Ġto ĠOnline Document Mode . OFF LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . MIR ROR ĠĠĠĠĠ Ġto ĠOnline Document Mode . OFF LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . last Offline Contents ?. let Ġ{ Ġthis . save Offline Body ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . OFF LINE _ ONLY Ġto ĠOnline Document Mode . MIR ROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġthrow Ġexception Ġif Ġnetwork Ġis Ġunavailable ĊĠĠĠĠĠĠĠĠĠ Ġthis . last Offline Contents ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . save Online ( it ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . ON LINE _ ONLY Ġto ĠOnline Document Mode . MIR ROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . project Ref id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . offline Mirror Ġ= Ġthis . offline Mirror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthis . offline Document Factory (". Cloud Offline Mir rors /${ this . projectId Fingerprint }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fetch Result Property . get ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . save Offline Mirror ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . OFF LINE _ ONLY Ġto ĠOnline Document Mode . ON LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . offline Mirror Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOnline Document Mode . MIR ROR Ġto ĠOnline Document Mode . ON LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . offline Mirror Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . mode . set ( value ) ĊĠĠĠ Ġ} ĊĊĠ Ġval Ġmirror Options : ĠG PC loud File Options ? ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn ĠG PC loud Options . cloud Files . files [ this . projectId Fingerprint ] ĊĠ Ġ} ĊĠ Ġprivate Ġfun Ġmake Mirror Options () Ġ= ĠG PC loud Options . cloud Files . getFile Options ( this . projectId Fingerprint ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġstatus . set ( if Ġ( project Json ?. is Locked Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠ ĠLock Status ( true , Ġproject Json . lock Owner , Ġproject Json . lock Owner Email , Ġproject Json . lock OwnerId ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠLock Status ( false ) ĊĠĠĠ Ġ}) ĊĠĠĠ Ġval Ġfp Ġ= Ġthis . projectId Fingerprint ĊĠĠĠ Ġval Ġfile Options Ġ= ĠG PC loud Options . cloud Files . getFile Options ( fp ) ĊĠĠĠ Ġif Ġ( project Json ?. is Locked Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlock Token Ġ= Ġfile Options . lock Token ĊĠĠĠĠĠ Ġif Ġ( Strings . null To Empty ( lock Token ) Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġ( project Json . node Ġas ĠObject Node ). put (" lock Token ", Ġlock Token ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . lock Ġ= Ġproject Json . node [" lock "] ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġconstructor ( project Json : ĠProject Json As Folder Item , Ġteam Ref id : ĠString ?) Ġ: Ġthis ( ĊĠĠĠĠĠ Ġteam Ref id Ġ= Ġteam Ref id , ĊĠĠĠĠĠ Ġteam Name Ġ= Ġproject Json . node [" team "]. as Text (), ĊĠĠĠĠĠ Ġproject Ref id Ġ= Ġproject Json . node [" ref id "]. as Text (), ĊĠĠĠĠĠ ĠprojectName Ġ= Ġproject Json . node [" name "]. as Text (), ĊĠĠĠĠĠ Ġproject Json Ġ= Ġproject Json ĊĠ Ġ) ĊĊĊĠ Ġconstructor ( team : ĠTeam Json As Folder Item , ĠprojectName : ĠString ) Ġ: Ġthis ( ĊĠĠĠĠĠ Ġteam Ref id Ġ= Ġteam . node [" ref id "]. as Text (), ĊĠĠĠĠĠ Ġteam Name Ġ= Ġteam . name , ĊĠĠĠĠĠ Ġproject Ref id Ġ= Ġnull , ĊĠĠĠĠĠ ĠprojectName Ġ= ĠprojectName , ĊĠĠĠĠĠ Ġproject Json Ġ= Ġnull ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun Ġget FileName (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġthis . projectName ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcan Read (): ĠBoolean Ġ= Ġtrue ĊĊĠ Ġoverride Ġfun Ġcan Write (): ĠI Status Ġ{ ĊĠĠĠ Ġval Ġlock Status Ġ= Ġthis . status . get () ĊĠĠĠ Ġreturn Ġif Ġ( lock Status Ġ== Ġnull Ġ|| Ġ! lock Status . locked Ġ|| Ġ! lock Status . locked By Some one ) Ġ{ ĊĠĠĠĠĠ ĠStatus . OK _ STATUS ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠStatus ( I Status . ERROR , ĠDocument . PLUGIN _ ID , ĊĠĠĠĠĠĠĠĠĠ ĠDocument . ErrorCode . NOT _ WR IT ABLE . ordinal , ĊĠĠĠĠĠĠĠĠĠ ĠRoot Local izer . create With Root Key (" cloud . status Bar "). format Text (" locked By ", Ġlock Status . lock Owner Name Ġ?: Ġ""), ĊĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠisValid For MR U (): ĠBoolean Ġ= Ġtrue ĊĊĠ Ġoverride Ġfun Ġset Mir rored ( mir rored : ĠBoolean ) Ġ= ĊĠĠĠĠĠ Ġif Ġ( mir rored ) Ġthis . mode Value Ġ= ĠOnline Document Mode . MIR ROR Ġelse Ġthis . mode Value Ġ= ĠOnline Document Mode . ON LINE _ ONLY ĊĊĠ Ġprivate Ġfun Ġsave Offline Mirror ( fetch : ĠFetch Result ) Ġ{ ĊĠĠĠ Ġval Ġdocument Ġ= Ġthis . offline Mirror ĊĠĠĠ Ġif Ġ( document Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( document Ġis ĠFile Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdocument . create () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdocument . output Stream . use Ġ{ ĊĠĠĠĠĠĠĠ Ġit . write ( fetch . body ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . make Mirror Options (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġit . name Ġ= ĠfileName ĊĠĠĠĠĠĠĠ Ġit . team Name Ġ= Ġteam Name ĊĠĠĠĠĠĠĠ Ġit . last Online Version Ġ= Ġfetch . actual Version . toString () ĊĠĠĠĠĠĠĠ Ġit . last Online Checksum Ġ= Ġfetch . actual Checksum ĊĠĠĠĠĠĠĠ Ġit . project Ref id Ġ= Ġthis . project Ref id !! ĊĠĠĠĠĠĠĠ Ġit . online Only Ġ= Ġ"" ĊĠĠĠĠĠĠĠ ĠG PC loud Options . cloud Files . save () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . mode . set ( Online Document Mode . MIR ROR ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthis . mode . set ( Online Document Mode . ON LINE _ ONLY ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsave Offline Body ( body : ĠByteArray ) Ġ{ ĊĠĠĠ Ġthis . offline Mirror ?. let Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠ Ġif Ġ( document Ġis ĠFile Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdocument . create () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdocument . output Stream . use Ġ{ ĊĠĠĠĠĠĠĠ Ġit . write ( body ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget InputStream (): ĠInputStream Ġ{ ĊĠĠĠ Ġval Ġfetch Result Ġ= Ġthis . fetch Result Property . get () Ġ?: Ġrun Blocking Ġ{ Ġfetch (). also Ġ{ Ġit . update () Ġ}} ĊĠĠĠ Ġreturn Ġif Ġ( fetch Result . use Mirror ) Ġ{ ĊĠĠĠĠĠ Ġval Ġmirror Bytes Ġ= Ġthis . offline Mirror !!. inputStream . read Bytes () ĊĠĠĠĠĠ Ġsave Online ( mirror Bytes ) ĊĠĠĠĠĠ ĠByteArrayInputStream ( mirror Bytes ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsave Offline Mirror ( fetch Result ) ĊĠĠĠĠĠ ĠByteArrayInputStream ( fetch Result . body ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġfetch (): ĠFetch Result Ġ{ ĊĠĠĠ Ġreturn Ġcall Read Project () ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġfetch Version ( version : ĠLong ): ĠFetch Result Ġ{ ĊĠĠĠ Ġreturn Ġcall Read Project ( version ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Forbidden Exception :: class ) ĊĠ Ġprivate Ġfun Ġcall Read Project ( version : ĠLong Ġ= Ġ- 1 ): ĠFetch Result Ġ{ ĊĠĠĠ ĠLOG . debug (" Calling Ġ/ p / read ") ĊĠĠĠ Ġval Ġhttp Ġ= Ġthis . httpClient Factory () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġresp Ġ= Ġif Ġ( version Ġ== Ġ- 1 L ) Ġhttp . send Get ("/ p / read $ query Args ") Ġelse Ġhttp . send Get ("/ p / read $ query Args & generation =$ version ") ĊĠĠĠĠĠ ĠLOG . debug (" Received ĠHTTP Ġ{}", Ġresp . code ) ĊĠĠĠĠĠ Ġwhen Ġ( resp . code ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġet ag Value Ġ= Ġresp . header (" ET ag ") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Value Ġ= Ġresp . header (" Digest ") ?. substring After (" crc 3 2 c =") ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Body Ġ= Ġresp . decoded Body ĊĊĠĠĠĠĠĠĠĠĠ Ġ// Global Scope . launch Ġ{ Ġprintln ( load Team Resources ( this @ G PC loud Document )) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠFetch Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ G PC loud Document , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mirror Options ?. last Online Checksum Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mirror Options ?. last Online Version ?. to Long () Ġ?: Ġ- 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigest Value Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet ag Value ?. to Long () Ġ?: Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Result Property :: setValue ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 4 0 2 Ġ-> Ġthrow ĠPayment Required Exception ( resp . raw Body . toString ( Charsets . UTF _ 8 ). trim ()) ĊĠĠĠĠĠĠĠĠ 4 0 1 , Ġ 4 0 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠFor bidden Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġread Ġfrom ĠG antt Project ĠCloud : Ġgot Ġresponse Ġ${ resp . code } Ġ: Ġ${ resp . reason }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġex . is Network Unavailable () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . error (" We Ġseem Ġto Ġbe Ġoffline ", Ġkv Ġ= Ġmap Of (" when " Ġto Ġ"/ p / read "), Ġexception Ġ= Ġex ) ĊĠĠĠĠĠĠĠĠĠ Ġthis . offline Mirror ?. let Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mode Value Ġ= ĠOnline Document Mode . OFF LINE _ ONLY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFetch Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonline Document Ġ= Ġthis @ G PC loud Document , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Checksum Ġ= Ġthis . mirror Options ?. last Online Checksum Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Version Ġ= Ġthis . mirror Options ?. last Online Version ?. to Long () Ġ?: Ġ- 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAs Ġif Ġwe Ġjust 've Ġsynced Ġthis Ġmirror Ġwith Ġthe Ġcloud ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Checksum Ġ= Ġthis . mirror Options ?. last Online Checksum Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Version Ġ= Ġthis . mirror Options ?. last Online Version ?. to Long () Ġ?: Ġ- 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fx n Ġ= Ġfetch Result Property :: setValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġit . use Mirror Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ( Exception ). is Network Unavailable (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠSocket Exception Ġ&& Ġthis . message ?. contains (" network Ġis Ġunreachable ", Ġtrue ) Ġ!= Ġfalse ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠConnect Exception ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget OutputStream (): ĠOutputStream Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠByteArrayOutputStream () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . close () ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġthis @ G PC loud Document ĊĠĠĠĠĠĠĠ Ġval Ġdocument Body Ġ= Ġthis . toByteArray () ĊĠĠĠĠĠĠĠ Ġdoc . last Offline Contents Ġ= Ġdocument Body ĊĠĠĠĠĠĠĠ Ġwhen Ġ( doc . mode Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠOnline Document Mode . ON LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Online ( document Body ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠOnline Document Mode . MIR ROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Online ( document Body ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠOnline Document Mode . OFF LINE _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Offline Body ( document Body ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠOBJECT _ MAP PER Ġ= ĠObjectMapper (). configure ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES , Ġfalse ) ĊĊĠ Ġ@ Throws ( Network Unavailable Exception :: class , ĠVersion Mismatch Exception :: class , ĠFor bidden Exception :: class ) ĊĠ Ġprivate Ġfun Ġsave Online ( body : ĠByteArray ) Ġ{ ĊĠĠĠ ĠLOG . debug (" Calling Ġ/ p / write ") ĊĠĠĠ Ġval Ġhttp Ġ= Ġthis . httpClient Factory () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġresp Ġ= Ġhttp . send Post ("/ p / write ", Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" project Ref id " Ġto Ġthis . project Ref id . or Empty (), ĊĠĠĠĠĠĠĠĠĠ Ġ" team Ref id " Ġto Ġthis . team Ref id , ĊĠĠĠĠĠĠĠĠĠ Ġ" filename " Ġto Ġthis . projectName , ĊĠĠĠĠĠĠĠĠĠ Ġ" file Contents " Ġto ĠBase 6 4 . get Encoder (). encode ToString ( body ), ĊĠĠĠĠĠĠĠĠĠ Ġ" lock Token " Ġto Ġthis . lock ?. get (" lock Token ") ?. text Value (), ĊĠĠĠĠĠĠĠĠĠ Ġ" old Version " Ġto Ġthis . fetch Result Property . get ()?. actual Version ?. toString () ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ ĠLOG . debug (" Received ĠHTTP Ġ{}", Ġresp . code ) ĊĠĠĠĠĠ Ġwhen Ġ( resp . code ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġet ag Value Ġ= Ġresp . header (" ET ag ") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Value Ġ= Ġresp . header (" Digest ") ?. substring After (" crc 3 2 c =") ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠOBJECT _ MAP PER . readValue ( resp . raw Body , ĠProject Write Response :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġthis . project Ref id Ġ= Ġresponse . project Ref id ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfetch Ġ= ĠFetch Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ G PC loud Document , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mirror Options ?. last Online Checksum Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mirror Options ?. last Online Version ?. to Long () Ġ?: Ġ- 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigest Value Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet ag Value ?. to Long () Ġ?: Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Result Property :: setValue ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġthis . save Offline Mirror ( fetch ) ĊĠĠĠĠĠĠĠĠĠ Ġfetch . update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 4 0 1 , Ġ 4 0 3 Ġ-> Ġthrow ĠFor bidden Exception () ĊĠĠĠĠĠĠĠĠ 4 0 9 Ġ-> Ġthrow ĠVersion Mismatch Exception ( can Overwrite Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠ 4 0 2 Ġ-> Ġthrow ĠPayment Required Exception ( resp . raw Body . toString ( Charsets . UTF _ 8 ). trim ()) ĊĠĠĠĠĠĠĠĠ 4 1 2 Ġ-> Ġthrow ĠVersion Mismatch Exception () ĊĠĠĠĠĠĠĠĠ 4 0 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Network Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mode Value Ġ= ĠOnline Document Mode . OFF LINE _ ONLY ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Got Ġ 4 0 4 ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġwrite Ġto ĠG antt Project ĠCloud . ĠGot ĠHTTP Ġ${ resp . code }: Ġ${ resp . reason }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġex . is Network Unavailable () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . error (" We Ġseem Ġto Ġbe Ġoffline ", Ġex ) ĊĠĠĠĠĠĠĠĠĠ Ġthis . mode Value Ġ= ĠOnline Document Mode . OFF LINE _ ONLY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġex ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetPath (): ĠString Ġ= Ġ""" cloud ://${ this . project Ref id }/${ this . team Name }/${ this . projectName } """ ĊĊĠ Ġoverride Ġfun Ġwrite () Ġ{ ĊĠĠĠ Ġerror (" Not Ġimplemented ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġwrite ( force : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis . fetch Result Property . set ( null ) ĊĠĠĠ Ġthis . proxy Document Factory ( this ). write () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget URI (): ĠURI Ġ= ĠURI (""" $ G PC LO UD _ PROJECT _ READ _ URL $ query Args """) ĊĊĠ Ġoverride Ġfun Ġis Local (): ĠBoolean Ġ= Ġfalse ĊĊĠ Ġprivate Ġval Ġwebsocket Clean ers Ġ= Ġmutable ListOf < ()-> Unit >() ĊĠ Ġfun Ġattach Websocket ( web Socket : ĠWebSocket Client ) Ġ{ ĊĠĠĠ Ġwebsocket Clean ers . add ( web Socket . on Lock Status Change Ġ{ Ġmsg Ġ-> ĊĠĠĠĠĠ Ġif Ġ( msg [" project Ref id "]. text Value () Ġ== Ġthis . project Ref id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! msg [" locked "]. boolean Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstatus . set ( Lock Status ( false )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstatus . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLock Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocked Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Owner Name Ġ= Ġmsg . path (" author ") ?. path (" name ") ?. text Value (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Owner Email Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock OwnerId Ġ= Ġmsg . path (" author ") ?. path (" id ") ?. text Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġwebsocket Clean ers . add ( web Socket . on Content Change Ġ{ Ġmsg Ġ-> ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ Ġon WebSocket Content Change ( msg ) Ġ}}) ĊĠ Ġ} ĊĊĠ Ġfun Ġdetach Websocket ( web Socket : ĠWebSocket Client ) Ġ{ ĊĠĠĠ Ġthis . websocket Clean ers . forEach Ġ{ Ġit () Ġ} ĊĠĠĠ Ġthis . websocket Clean ers . clear () ĊĠ Ġ} ĊĊĠ Ġinternal Ġsuspend Ġfun Ġon WebSocket Content Change ( msg : ĠObject Node ) Ġ{ ĊĠĠĠ Ġif Ġ( msg [" project Ref id "]. text Value () Ġ== Ġproject Ref id ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġmsg [" timestamp "] ?. as Long () Ġ?: Ġreturn ĊĠĠĠĠĠ Ġval Ġauthor Ġ= Ġmsg [" author "] ?. get (" name ") ?. text Value () Ġ?: Ġreturn ĊĠĠĠĠĠ Ġfetch (). also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . actual Version Ġ!= Ġfetch Result Property . get (). actual Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlatest Version Property . set ( Latest Version ( timestamp , Ġauthor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġtoggle Locked ( duration : ĠDuration ?): ĠCompletableFuture < Lock Status > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠCompletableFuture < Lock Status >() ĊĠĠĠ Ġval Ġlock Service Ġ= ĠLock Service ( this . project Ref id !! , Ġthis . status . get (). locked ) Ġ{ ĊĠĠĠĠĠ Ġresult . complete Exception ally ( RuntimeException ( it )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġlock Service . busy Indicator Ġ= ĠConsumer Ġ{} ĊĠĠĠ Ġlock Service . request Lock Token Ġ= Ġtrue ĊĠĠĠ Ġlock Service . duration Ġ= Ġduration Ġ?: ĠDuration . ZERO ĊĠĠĠ Ġlock Service . on Succeeded Ġ= ĠEventHandler Ġ{ ĊĠĠĠĠĠ Ġval Ġstatus Ġ= Ġjson 2 lock Status ( lock Service . value ) ĊĠĠĠĠĠ Ġthis . lock Ġ= Ġlock Service . value ĊĠĠĠĠĠ Ġresult . complete ( status ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġlock Service . on Failed Ġ= ĠEventHandler Ġ{ Ġresult . complete Exception ally ( RuntimeException (" Failed ")) Ġ} ĊĠĠĠ Ġlock Service . on Cancelled Ġ= ĠEventHandler Ġ{ Ġresult . complete Exception ally ( RuntimeException (" Cancelled ")) Ġ} ĊĠĠĠ Ġlock Service . restart () ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġreload Lock Status (): ĠCompletableFuture < Lock Status > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠCompletableFuture < Lock Status >() ĊĠĠĠ Ġthis . project Ref id ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġservice Ġ= ĠIs Locked Service ( ĊĠĠĠĠĠĠĠĠĠ Ġerror Ui Ġ= Ġ{ error Msg Ġ-> Ġresult . complete Exception ally ( RuntimeException ( error Msg )) Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġbusy Indicator Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠ Ġproject Ref id Ġ= Ġthis . project Ref id !! ĊĠĠĠĠĠ Ġ) Ġ{ value Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . lock Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġresult . complete ( this . status . get ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġservice . restart () ĊĠĠĠ Ġ} Ġ?: Ġresult . complete ( Lock Status ( locked Ġ= Ġfalse )) ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġjson 2 lock Status ( json : ĠJsonNode ?): ĠLock Status Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( json ?. is Missing Node Ġ== Ġfalse Ġ&& Ġjson [" expiration Epoch Ts "] ?. as Long () Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠ ĠLock Status ( true , ĊĠĠĠĠĠĠĠĠĠ Ġjson [" name "] ?. text Value (), Ġjson [" email "] ?. text Value (), Ġjson [" uid "] ?. text Value (), Ġjson ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠLock Status ( false ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun ĠG PC loud Document . on board ( document Manager : ĠDocument Manager , Ġweb Socket : ĠWebSocket Client ) Ġ{ ĊĠ Ġthis . offline Document Factory Ġ= Ġ{ Ġpath Ġ-> Ġdocument Manager . new Document ( path ) Ġ} ĊĠ Ġthis . proxy Document Factory Ġ= Ġdocument Manager :: get Proxy Document ĊĠ Ġweb Socket . register ( this ) ĊĠ Ġif Ġ( G PC loud Options . default Offline Mode . value Ġ&& Ġ! G PC loud Options . cloud Files . getFile Options ( this . projectId Fingerprint ). online Only . to Boolean ()) Ġ{ ĊĠĠĠ Ġthis . mode Value Ġ= ĠOnline Document Mode . MIR ROR ĊĠ Ġ} Ċ } Ċ Ċ private Ġval Ġour Executor Ġ= ĠExec utors . new Single Thread Executor () Ċ private Ġval ĠLOG Ġ= ĠGP Logger . create (" Cloud . Document ") Ċ