package Ġcom . dy me solutions . lin ke de vents . migrations Ċ Ċ import Ġcom . dy me solutions . common . utils . Read ers Ċ import Ġcom . dy me solutions . lin ke de vents . App Ċ import Ġcom . dy me solutions . lin ke de vents . dao .* Ċ import Ġcom . dy me solutions . lin ke de vents . models .* Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . Json Parser Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ Ċ class ĠM igrations Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġjson Parser Ġ= ĠJson Parser () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( App :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtable Names Ġ= ĠlistOf (" events _ event ", Ġ" he le vents _ user ", Ġ" django _ org hierarchy _ organization ", Ġ" events _ datasource ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmigrations Path Ġ= Ġ"${ File . separator } migrations ${ File . separator }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Table Exists ( tableName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ĠEXISTS ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM ĠĠ Ġinformation _ schema . tables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġ Ġtable _ schema Ġ= Ġ' public ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND ĠĠĠ Ġtable _ name Ġ= Ġ'$ tableName ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ); """. trim Indent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getBoolean ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Schema And Migrate Data (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Checking Ġdatabase Ġschema ...") ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġcheck Ġthat Ġrequired Ġtables Ġexist ĊĠĠĠĠĠĠĠ Ġtable Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check Table Exists ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Required Ġtable Ġ'$ it ' Ġdoesn 't Ġexist !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmigrate Data Sources () ĊĠĠĠĠĠĠĠ Ġmigrate Organizations () ĊĠĠĠĠĠĠĠ Ġmigrate Users () ĊĠĠĠĠĠĠĠ Ġmigrate Keyword Sets () ĊĠĠĠĠĠĠĠ Ġmigrate Keywords () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Users () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } users . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġuser [" username "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġuser [" email "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġuser [" password "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġuser [" firstName "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlastName Ġ= Ġuser [" lastName "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Staff Ġ= Ġuser [" is Staff "]. as Boolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Super User Ġ= Ġuser [" is Super User "]. as Boolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisActive Ġ= Ġuser [" isActive "]. as Boolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġuser To Save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Users . findBy Username ( user To Save . username ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Saving Ġuser Ġwith Ġusername Ġ'${ user To Save . username }' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsers . add ( user To Save )?. let Ġ{ ĠuserId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġuser Ġto Ġsystem Ġadmins ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrganization Regular Users . add ( userId , Ġ" system : admins ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Addresses . add ( email Ġ= Ġuser To Save . email , ĠuserId Ġ= ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġemail Address Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Addresses . verify ById ( email Address Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" User Ġwith Ġusername Ġ'${ user To Save . email }' Ġalready Ġexists !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Data Sources () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } datas ources . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDataSource Save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠdataSource [" id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠdataSource [" name "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠapiKey Ġ= ĠdataSource [" apiKey "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Id Ġ= ĠdataSource [" owner Id "]. let Ġ{ Ġowner Id Ġ-> Ġif Ġ( owner Id . is Json Null ) Ġnull Ġelse Ġowner Id . asString Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Editable Ġ= ĠdataSource [" user Editable "]. as Boolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĠdataSource To Save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Data Sources . findById ( dataSource To Save . id ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Saving Ġdatasource Ġwith ĠID Ġ'${ dataSource To Save . id }' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Sources . add ( dataSource To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Data ĠSource Ġwith ĠID Ġ${ dataSource To Save . id } Ġalready Ġexists !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Organizations () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } organizations . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorganization Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrganization Save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Id Ġ= Ġorganization [" origin Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġorganization [" name "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Id Ġ= Ġorganization [" dataSource Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound ing Date Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis solution Date Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclassification Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ById Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Modified ById Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠparentId Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplaced ById Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Type Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġorganization To Save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorganization Id Ġ= Ġ"${ organization To Save . dataSource Id }:${ organization To Save . origin Id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Organizations . findById ( organization Id ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Saving Ġorganization Ġwith ĠID Ġ'$ organization Id '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrgan izations . add ( organization To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Organization Ġwith ĠID Ġ$ organization Id Ġalready Ġexists !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Places () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } places . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplace Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Keyword Sets () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } keyword - sets . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Set Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyword Set Save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠMulti Lang Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfi Ġ= Ġkeyword Set [" name "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsv Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġen Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusage Ġ= Ġkeyword Set [" usage "]. as Int , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġkeyword Set [" origin Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Id Ġ= Ġkeyword Set [" dataSource Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= Ġkeyword Set [" image "]. let Ġ{ Ġimage Ġ-> Ġif Ġ( image . is Json Null ) Ġnull Ġelse Ġimage . as Int Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorganization Ġ= Ġkeyword Set [" organization "]. asString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġkeyword Set To Save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword SetId Ġ= Ġ"${ keyword Set To Save . dataSource Id }:${ keyword Set To Save . origin }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Keyword Sets . findById ( keyword SetId ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Saving Ġkeyword Ġset Ġwith ĠID Ġ'$ keyword SetId '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyword Sets . add ( keyword Set To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Keyword Ġset Ġwith ĠID Ġ$ keyword SetId Ġalready Ġexists !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Keywords () Ġ{ ĊĠĠĠĠĠĠĠ Ġparse JsonArray From Resource ("${ migrations Path } keywords . json ") Ġ{ Ġarray Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Ġ= Ġit . as JsonObject ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyword Save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġkeyword [" id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠMulti Lang Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfi Ġ= Ġkeyword [" name "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsv Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġen Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Id Ġ= Ġkeyword [" origin Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated Time Ġ= ĠDateTime (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Modified Time Ġ= ĠDateTime (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaggregate Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ById Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Id Ġ= Ġkeyword [" dataSource Id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Modified ById Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeprecated Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Events Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Events Changed Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher Id Ġ= Ġkeyword [" publisher Id "]. asString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġkeyword To Save Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword SetId Ġ= Ġ"${ keyword To Save . dataSource Id }:${ keyword To Save . origin Id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Id Ġ= Ġ"$ keyword SetId :${ keyword To Save . id }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Keywords . findById ( keyword Id ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Saving Ġkeyword Ġwith ĠID Ġ'$ keyword Id '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey words . add ( keyword To Save ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyword Set Keywords . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword SetId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Keyword Ġwith ĠID Ġ$ keyword Id Ġalready Ġexists !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġparse JsonArray From Resource ( resourceName : ĠString , Ġprocess : Ġ( JsonArray ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= Ġjava Class . getResource AsStream ( resourceName )?. let Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Parser . parse ( Read ers . read InputStream ( it )). as JsonArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprocess ( json Array Ġ?: ĠJson Array ()) ĊĠĠĠ Ġ} Ċ } Ċ