package Ġcom . d ude . d ms . brain . polling Ċ Ċ import Ġcom . d ude . d ms . backend . containers . Doc Container Ċ import Ġcom . d ude . d ms . backend . containers . Page Container Ċ import Ġcom . d ude . d ms . backend . data . docs . Doc Ċ import Ġcom . d ude . d ms . backend . service . Doc Service Ċ import Ġcom . d ude . d ms . backend . service . Line Service Ċ import Ġcom . d ude . d ms . backend . service . Page Service Ċ import Ġcom . d ude . d ms . backend . service . Word Service Ċ import Ġcom . d ude . d ms . brain . FileManager Ċ import Ġcom . d ude . d ms . brain . options . Options Ċ import Ġcom . d ude . d ms . brain . parsing . Doc Parser Ċ import Ġcom . d ude . d ms . brain . parsing . Spell checker Ċ import Ġcom . d ude . d ms . brain . t Ċ import Ġcom . d ude . d ms . ui . Const Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDateTime Ċ Ċ @ Component Ċ class ĠDoc Import Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfile Manager : ĠFile Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdoc Parser : ĠDoc Parser , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdoc Service : ĠDoc Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpage Service : ĠPage Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġline Service : ĠLine Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġword Service : ĠWord Service Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdocs Ġ= Ġmutable Set Of < Doc Container >() ĊĊĠĠĠ Ġval Ġprogress ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprogress Backing ĊĊĠĠĠ Ġval Ġprogress Text ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprogress Text Backing ĊĊĠĠĠ Ġval Ġcount : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġp dfs . size Ġ+ Ġimg s . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġdocs . size Ġ&& Ġ! import ing ) Ġimport () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġp dfs ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠFile ( Options . get (). doc . polling Path ). list Files Ġ{ Ġ_, Ġname Ġ-> Ġname . endsWith (". pdf ") Ġ} Ġ?: Ġempty Array () ĊĠĠĠ Ġprivate Ġval Ġimg s ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠFile ( Options . get (). doc . polling Path ). list Files Ġ{ Ġ_, Ġname Ġ-> ĠConst . IMAGE _ FORMAT S . any Ġ{ Ġname . endsWith ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġempty Array () ĊĊĠĠĠ Ġfun Ġimport () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( import ing ) Ġreturn ĊĠĠĠĠĠĠĠ Ġimporting Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd cs Ġ= Ġmutable Set Of < Doc Container >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew P dfs Ġ= Ġp dfs . filter Ġ{ Ġpdf Ġ-> Ġpdf . name Ġ! in Ġdocs . map NotNull Ġ{ Ġit . file ?. name Ġ} Ġ&& Ġpdf . name Ġ! in Ġcurrent Imports Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pdf Ġin Ġnew P dfs . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Text Backing Ġ= Ġ"${ pdf . index Ġ+ Ġ 1 } Ġ/ Ġ${ new P dfs . size } Ġ${ t (" saving ", Ġpdf . value . name )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġpdf . index . toDouble () Ġ/ Ġnew P dfs . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cs . add ( file Manager . import Pdf ( pdf . value , Ġfalse )?. let Ġ{ Ġguid Ġ-> ĠDoc Container ( guid , Ġpdf . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontinue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Im gs Ġ= Ġimg s . filter Ġ{ Ġimg Ġ-> Ġimg . name Ġ! in Ġdocs . map NotNull Ġ{ Ġit . file ?. name Ġ} Ġ&& Ġimg . name Ġ! in Ġcurrent Imports Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( img Ġin Ġnew Im gs . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Text Backing Ġ= Ġ"${ img . index Ġ+ Ġ 1 } Ġ/ Ġ${ new Im gs . size } Ġ${ t (" saving ", Ġimg . value . name )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġimg . index . toDouble () Ġ/ Ġnew Im gs . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cs . add ( file Manager . import Image ( img . value , Ġfalse )?. let Ġ{ Ġguid Ġ-> ĠDoc Container ( guid , Ġimg . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontinue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Imports . addAll ( d cs . map NotNull Ġ{ Ġit . file ?. name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspell check ers Ġ= ĠConst . OCR _ L ANGU AGES . associate Ġ{ Ġit Ġto ĠSpell checker ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġd cs . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Max Ġ= Ġsize Ġ* Ġ 4 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cs . forEach Indexed Ġ{ Ġindex , Ġdc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Text Backing Ġ= Ġ"${ index Ġ+ Ġ 1 } Ġ/ Ġ$ size ĠĠĠ Ġ" Ġ+ Ġt (" pdf . parse ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpdf Pages Ġ= Ġasync Ġ{ Ġdoc Parser . get Pdf Text ( dc . guid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġocr Pages Ġ= Ġasync Ġ{ Ġdoc Parser . get O cr Text ( dc . guid , Ġdc . language ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . pdf Pages Ġ= Ġpdf Pages . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dc . pdf Pages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . language Ġ= Ġspell check ers . min By OrNull Ġ{ Ġentry Ġ-> Ġdc . pdf Pages . flatMap Ġ{ Ġit . lines Ġ}. flatMap Ġ{ Ġit . words Ġ}. count Ġ{ Ġcontainer Ġ-> Ġcontainer . word . text ?. let Ġ{ Ġentry . value . check ( it ) Ġ} Ġ!= Ġnull Ġ} Ġ} !!. key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Text Backing Ġ+= Ġ" Ġ> Ġ${ t (" recognized . language ") }: Ġ${ dc . language }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ( index Ġ* Ġ 4 Ġ+ Ġ 1 ) Ġ/ Ġprogress Max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . pdf Pages . forEach Ġ{ Ġit . image Ġ= Ġfile Manager . getImage ( dc . guid , Ġit . nr ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Text Backing Ġ+= Ġ" Ġ> Ġ" Ġ+ Ġt (" image . ocr ", Ġdc . language ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . ocr Pages Ġ= Ġocr Pages . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . ocr Pages . forEach Ġ{ Ġit . image Ġ= Ġfile Manager . getImage ( dc . guid , Ġit . nr ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ( index Ġ* Ġ 4 Ġ+ Ġ 2 ) Ġ/ Ġprogress Max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . pdf Pages . words (). forEach Ġ{ Ġcontainer Ġ-> Ġcontainer . spell ing Ġ= Ġcontainer . word . text ?. let Ġ{ Ġspell check ers . getValue ( dc . language ). check ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . ocr Pages . words (). forEach Ġ{ Ġcontainer Ġ-> Ġcontainer . spell ing Ġ= Ġcontainer . word . text ?. let Ġ{ Ġspell check ers . getValue ( dc . language ). check ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ( index Ġ* Ġ 4 Ġ+ Ġ 3 ) Ġ/ Ġprogress Max ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . use O cr Txt Ġ= Ġdc . ocr Pages . word Count () Ġ> Ġdc . pdf Pages . word Count () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . date Ġ= Ġdoc Parser . get Most F requ ent Date ( dc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . tags Ġ= Ġdoc Parser . discover Tags ( dc ). to Mutable Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdc . attribute Values Ġ= Ġdoc Parser . discover Attribute Values ( dc ). map Ġ{ Ġit . key Ġ}. to Mutable Set () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocs . add ( dc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Imports . remove ( dc . file ?. name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ( index Ġ* Ġ 4 Ġ+ Ġ 4 ) Ġ/ Ġprogress Max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Backing Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimporting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( doc Container : ĠDoc Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpages Ġ= Ġdoc Container . pages ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠDoc ( doc Container . guid , Ġnull , Ġdoc Container . date , ĠLocalDateTime . now (), Ġdoc Container . tag Entities . to Mutable Set ()) ĊĠĠĠĠĠĠĠ Ġdoc Service . create ( doc , Ġdoc Container . attribute Values ) ĊĠĠĠĠĠĠĠ Ġpages . forEach Ġ{ Ġpage Container Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġpage Container . page ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . doc Ġ= Ġdoc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Service . create ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Container . lines . forEach Ġ{ Ġline Container Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġline Container . line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . page Ġ= Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Service . create ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Container . words . forEach Ġ{ Ġword Container Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġword Ġ= Ġword Container . word ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . line Ġ= Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Service . create ( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdoc Service . save ( doc ) ĊĠĠĠĠĠĠĠ Ġdelete ( doc Container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( doc Container : ĠDoc Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdoc Container . file ?. delete () ĊĠĠĠĠĠĠĠ Ġdocs . remove ( doc Container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠfindAll () Ġ= Ġdocs . toSet () ĊĊĠĠĠ Ġprivate Ġfun ĠSet < Page Container >. words () Ġ= Ġflat Map Ġ{ Ġit . lines Ġ}. flatMap Ġ{ Ġit . words Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSet < Page Container >. word Count () Ġ= Ġflat Map Ġ{ Ġit . lines Ġ}. sum Of Ġ{ Ġit . words . size Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġimporting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcurrent Imports Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprogress Backing Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprogress Text Backing Ġ= Ġ"" ĊĠĠĠ Ġ} Ċ }