package Ġnet . d ank ito . bank ing . bank finder Ċ Ċ import Ġnet . d ank ito . utils . hash ing . Hash Algorithm Ċ import Ġnet . d ank ito . utils . hash ing . Hash Service Ċ import Ġnet . d ank ito . utils . io . FileUtils Ċ import Ġnet . d ank ito . utils . lucene . index . Documents Writer Ċ import Ġnet . d ank ito . utils . lucene . index . FieldBuilder Ċ import Ġnet . d ank ito . utils . lucene . mapper . Property Description Ċ import Ġnet . d ank ito . utils . lucene . mapper . PropertyType Ċ import Ġnet . d ank ito . utils . lucene . search . Field Mapper Ċ import Ġnet . d ank ito . utils . lucene . search . Mapped Search Config Ċ import Ġnet . d ank ito . utils . lucene . search . QueryBuilder Ċ import Ġnet . d ank ito . utils . lucene . search . Searcher Ċ import Ġorg . apache . lucene . document . Document Ċ import Ġorg . apache . lucene . search . Query Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File ĊĊ Ċ open Ġclass ĠLuc ene Bank Finder ( index Folder : ĠFile ) Ġ: ĠBank Finder Base (), ĠI Bank Finder Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIndexed Bank List File Hash Id FieldName Ġ= Ġ" Indexed Bank List File Hash Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIndexed Bank List File Hash Id FieldValue Ġ= Ġ" Indexed Bank List File Hash Value " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIndexed Bank List File Hash FieldName Ġ= Ġ" Indexed Bank List File Hash " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info Name FieldName Ġ= Ġ" name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info Bank Code FieldName Ġ= Ġ" bank _ code " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info B ic FieldName Ġ= Ġ" bic " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info City Indexed FieldName Ġ= Ġ" city _ indexed " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info City Stored FieldName Ġ= Ġ" city _ stored " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info Postal Code FieldName Ġ= Ġ" postal _ code " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info Pin Tan Server Address FieldName Ġ= Ġ" pin _ tan _ server _ address " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBank Info Pin Tan Version FieldName Ġ= Ġ" pin _ tan _ version " ĊĊĠĠĠĠĠĠĠ Ġval Ġbank Info Properties Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . String , ĠBank Info Name FieldName , ĠBank Info :: name ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . String , ĠBank Info Bank Code FieldName , ĠBank Info :: bank Code ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . String , ĠBank Info B ic FieldName , ĠBank Info :: bic ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . String , ĠBank Info Postal Code FieldName , ĠBank Info :: postal Code ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . String , ĠBank Info City Stored FieldName , ĠBank Info :: city ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . Nullable String , ĠBank Info Pin Tan Server Address FieldName , ĠBank Info :: pin Tan Address ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Description ( PropertyType . Nullable String , ĠBank Info Pin Tan Version FieldName , ĠBank Info :: pin Tan Version ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Luc ene Bank Finder :: class . java ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġval Ġindex Dir Ġ= ĠFile ( index Folder , Ġ" bank list ") ĊĊĊĠĠĠ Ġprotected Ġval Ġfile Utils Ġ= ĠFileUtils () ĊĊĠĠĠ Ġprotected Ġval Ġhash Service Ġ= ĠHash Service ( file Utils ) ĊĊĊĠĠĠ Ġprotected Ġval Ġfields Ġ= ĠField Builder () ĊĊĊĠĠĠ Ġprotected Ġval Ġqueries Ġ= ĠQuery Builder () ĊĊĠĠĠ Ġprotected Ġval Ġmapper Ġ= ĠField Mapper () ĊĊĠĠĠ Ġprotected Ġval Ġsearch er Ġ= ĠSearch er ( index Dir ) ĊĊĊĠĠĠ Ġprotected Ġvar Ġbank Finder While Updating Index : ĠI Bank Finder ? Ġ= Ġnull ĊĊĊĠĠĠ Ġoverride Ġfun Ġfind Bank By Bank Code ( query : ĠString ): ĠList < Bank Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġbank Finder While Updating Index ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . find Bank By Bank Code ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Bank List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġl uc ene Query Ġ= Ġqueries . startsWith ( Bank Info Bank Code FieldName , Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget B anks From Query ( lucene Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Bank ByName Bank Code Or City For Non Empty Query ( query : ĠString ): ĠList < Bank Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġbank Finder While Updating Index ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . find Bank ByName Bank Code Or City ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġl uc ene Query Ġ= Ġqueries . create Queries For Single Terms ( query . toLowerCase ()) Ġ{ Ġsingle Term Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueries . full text Query ( Bank Info Name FieldName , Ġsingle Term ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueries . startsWith ( Bank Info City Indexed FieldName , Ġsingle Term ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueries . startsWith ( Bank Info Bank Code FieldName , Ġsingle Term ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġquery Ġfor Ġbranches In Other C ities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget B anks From Query ( lucene Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch Bank By B ic ( bic : ĠString ): ĠBank Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ( bank Finder While Updating Index Ġas ? ĠBank Finder Base )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . search Bank By B ic ( bic ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget B anks From Query ( queries . exact ( Bank Info B ic FieldName , Ġb ic )). first OrNull () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Bank List (): ĠList < Bank Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġbank Finder While Updating Index ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . get Bank List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget B anks From Query ( queries . all Documents That Have Field ( Bank Info Name FieldName )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġget B anks From Query ( query : ĠQuery ): ĠList < Bank Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġmore Ġthan Ġ 1 6 . 0 0 0 Ġb anks Ġin Ġbank Ġlist Ġ-> Ġ 1 0 . 0 0 0 Ġis Ġtoo Ġfew ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch er . search And Map L az ily ( Mapped Search Config ( query , ĠBank Info :: class . java , Ġbank Info Properties , Ġ 1 0 0 _ 0 0 0 )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġpreload Bank List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhash SearchResult Ġ= Ġsearch er . search ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueries . exact ( Indexed Bank List File Hash Id FieldName , ĠIndexed Bank List File Hash Id FieldValue , Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Indexed Bank List File Hash Ġ= Ġhash SearchResult . hits . first OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . string ( it , ĠIndexed Bank List File Hash FieldName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( last Indexed Bank List File Hash Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Index () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Bank List File Hash Ġ= Ġcalculate Current Bank List File Hash () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Bank List File Hash Ġ!= Ġlast Indexed Bank List File Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Index ( current Bank List File Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġupdate Index () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Index ( calculate Current Bank List File Hash ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġupdate Index ( bank List File Hash : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb anks Ġ= Ġload Bank List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhile Ġindexing Ġ- Ġwhich Ġtakes Ġa Ġlong Ġtime Ġon ĠAndroid Ġ- Ġuse ĠIn Memory Bank Finder Ġso Ġthat Ġuser Ġsees Ġat Ġleast Ġsome Ġsearch Ġresults Ġeven Ġthough Ġit 's Ġslower ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbank Finder While Updating Index Ġ= ĠIn Memory Bank Finder ( b anks ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Utils . delete Folder Re cursively ( index Dir ) Ġ// Ġdelete Ġcurrent Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Dir . mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite B anks To Index ( b anks , Ġbank List File Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbank Finder While Updating Index Ġ= Ġnull Ġ// Ġnow Ġuse ĠLuc ene Bank Finder Ġagain Ġfor Ġsearching ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Could Ġnot Ġupdate Ġindex ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġwrite B anks To Index ( b anks : ĠList < Bank Info >, Ġbank List File Hash : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDocuments Writer ( index Dir ). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . save Documents ( b anks . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Document For Bank ( it , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . update Document ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndexed Bank List File Hash Id FieldName , ĠIndexed Bank List File Hash Id FieldValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . stored Field ( Indexed Bank List File Hash FieldName , Ġbank List File Hash )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . optimize Index () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Document For Bank ( bank : ĠBank Info , Ġwriter : ĠDocuments Writer ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex able Fields Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . full Text Search Field ( Bank Info Name FieldName , Ġbank . name , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . keyword Field ( Bank Info Bank Code FieldName , Ġbank . bank Code , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . keyword Field ( Bank Info B ic FieldName , Ġbank . bic , Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . full Text Search Field ( Bank Info City Indexed FieldName , Ġbank . city , Ġtrue ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . stored Field ( Bank Info City Stored FieldName , Ġbank . city ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . stored Field ( Bank Info Postal Code FieldName , Ġbank . postal Code ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . nullable Stored Field ( Bank Info Pin Tan Server Address FieldName , Ġbank . pin Tan Address ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . nullable Stored Field ( Bank Info Pin Tan Version FieldName , Ġbank . pin Tan Version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġindex Ġbranches In Other C ities ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbank . branches In Other C ities . forEach Ġ{ Ġbranch City Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex able Fields . add ( fields . stored Field ( Bank Info City Stored FieldName , Ġbranch City )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwriter . create Document For NonNull Fields ( index able Fields ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcalculate Current Bank List File Hash (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcalculate Hash ( Bank List Deserializer (). read Bank List File ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcalculate Hash ( string To Hash : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhash Service . hash String ( Hash Algorithm . SHA 5 1 2 , Ġstring To Hash ) ĊĠĠĠ Ġ} Ċ Ċ }