package Ġkey monitor . database Ċ Ċ import Ġkey monitor . common . logger Ċ import Ġjava . sql . ResultSet Ċ import Ġjava . time . Instant Ċ Ċ val ĠCREATE _ KEY _ TABLE Ġ= ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġkeys Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid ĠINTEGER ĠPRIMARY ĠKEY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask _ id ĠINTEGER ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser _ id ĠINTEGER ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup _ time ĠVARCHAR ( 3 2 ) ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup _ phone ĠVARCHAR ( 3 2 ) ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup _ ip ĠVARCHAR ( 3 2 ) ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ĠVARCHAR ( 3 2 ) ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĠVARCHAR ( 2 5 6 ) ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated _ at ĠVARCHAR ( 3 2 ) ĠDEFAULT ĠCURRENT _ TIMESTAMP , ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOREIGN ĠKEY ( task _ id ) ĠREFERENCES Ġtasks ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOREIGN ĠKEY ( user _ id ) ĠREFERENCES Ġusers ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ""" Ċ Ċ private Ġval ĠUPDATE _ KEY Ġ= Ġ" UPDATE ĠKEYS ĠSET Ġstatus Ġ= Ġ? ĠWHERE Ġid Ġ= Ġ? " Ċ Ċ /** ĠRepresents Ġwhether Ġthey Ġhas Ġbeen Ġcompared Ġto Ġprevious Ġversions Ġfor Ġchanges Ġ*/ Ċ enum Ġclass ĠKey Status Ġ{ ĠUN CHECK ED , ĠCHECK ED Ġ} Ċ Ċ /** ĠRepresents Ġthe Ġresults Ġof Ġa Ġkey Ġlookup Ġ*/ Ċ data Ġclass ĠKey ( val Ġid : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask ID : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserID : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlookup Time : ĠInstant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlookup Phone : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlookup IP : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġ_ status : ĠKey Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString ) Ġ{ ĊĊĠĠĠ Ġ/** ĠS aves Ġchanges Ġto Ġthe Ġkey 's Ġstatus Ġ*/ ĊĠĠĠ Ġvar Ġstatus : ĠKey Status ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ status ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Affected Ġ= Ġwith ( Database . connection . prepareStatement ( UPDATE _ KEY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset String ( 1 , Ġ_ status . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Int ( 2 , Ġid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rows Affected Ġ== Ġ 0 ) Ġthrow ĠData State Error (" failed Ġat Ġupdating Ġkey Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠINSERT _ KEY Ġ= Ġ" INSERT ĠINTO Ġkeys ĠVALUES ( null , Ġ?, Ġ?, Ġ?, Ġ?, Ġ?, Ġ?, Ġ?, Ġ? )" Ċ Ċ /** ĠSave Ġa Ġnew Ġkey Ġwith Ġthe Ġgiven Ġvalues Ġto Ġthe Ġdatabase Ġ*/ Ċ fun Ġsave Key ( task : ĠLookup Task , Ġlookup Time : ĠInstant , Ġlookup Phone : ĠString , Ġlookup IP : ĠString , Ġvalue : ĠString ): ĠKey Ġ{ ĊĠĠĠ Ġval Ġrow Ġ= Ġwith ( Database . connection . prepareStatement ( INSERT _ KEY )) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Int ( 1 , Ġtask . id ) ĊĠĠĠĠĠĠĠ Ġset Int ( 2 , Ġtask . userID ) ĊĠĠĠĠĠĠĠ Ġset String ( 3 , Ġlookup Time . toString ()) ĊĠĠĠĠĠĠĠ Ġset String ( 4 , Ġlookup Phone ) ĊĠĠĠĠĠĠĠ Ġset String ( 5 , Ġlookup IP ) ĊĠĠĠĠĠĠĠ Ġset String ( 6 , ĠKey Status . UN CHECK ED . name ) ĊĠĠĠĠĠĠĠ Ġset String ( 7 , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġset String ( 8 , ĠInstant . now (). toString ()) Ġ// Ġcreated _ at ĊĊĠĠĠĠĠĠĠ Ġexecute Update () ĊĠĠĠĠĠĠĠ Ġgenerated Keys ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! row . next ()) Ġthrow ĠData State Error (" failed Ġcreating Ġuser Ġ( cannot Ġaccess Ġcreated ĠID )") ĊĠĠĠ Ġval Ġid Ġ= Ġrow . getInt ( 1 ) ĊĊĠĠĠ Ġreturn ĠKey ( id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask ID Ġ= Ġtask . id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserID Ġ= Ġtask . userID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Time Ġ= Ġlookup Time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Phone Ġ= Ġlookup Phone , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup IP Ġ= Ġlookup IP , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠKey Status . UN CHECK ED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue ) Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġa ĠResultSet Ġadvanced Ġto Ġa Ġvalid Ġrow , Ġparses Ġits Ġvalues Ġinto Ġa ĠKey Ġobject Ċ Ġ* Ċ Ġ* Ġ" Advanced Ġto Ġa Ġvalid Ġrow " Ġmeans , Ġprior Ġto Ġcalling Ġthis , Ġ` result . next ()` Ġshould 've Ġreturned Ġtrue . Ċ Ġ* Ċ Ġ* Ġ@ throws Ġjava . sql . SQLException Ġif Ġno Ġdata Ġis Ġactually Ġavailable Ġat Ġthis Ġpoint Ġin Ġthe ĠResultSet Ċ Ġ*/ Ċ private Ġfun Ġrow To Key ( row : ĠResultSet ): ĠKey Ġ{ ĊĠĠĠ Ġreturn ĠKey ( row . getInt (" id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask ID Ġ= Ġrow . getInt (" task _ id "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserID Ġ= Ġrow . getInt (" user _ id "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Time Ġ= ĠInstant . parse ( row . getString (" lookup _ time ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Phone Ġ= Ġrow . getString (" lookup _ phone "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup IP Ġ= Ġrow . getString (" lookup _ ip "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Ġ= ĠKey Status . valueOf ( row . getString (" status ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġrow . getString (" value ")) Ċ } Ċ Ċ private Ġval ĠSELECT _ KEY Ġ= Ġ" SELECT Ġ* ĠFROM Ġkeys ĠWHERE Ġid Ġ= Ġ? " Ċ Ċ /** ĠReturn Ġthe Ġkey Ġwith Ġthe Ġgiven ĠID Ġ*/ Ċ fun ĠgetKey ( key ID : ĠInt ): ĠKey Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġwith ( Database . connection . prepareStatement ( SELECT _ KEY )) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Int ( 1 , Ġkey ID ) ĊĠĠĠĠĠĠĠ Ġexecute Query () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! result . next ()) Ġthrow ĠIllegalArgumentException (" no Ġkey Ġfound Ġwith ĠID Ġ$ key ID ") ĊĠĠĠ Ġreturn Ġrow To Key ( result ) Ċ } Ċ Ċ private Ġval ĠSELECT _ LAST _ KEY Ġ= Ġ" SELECT Ġ* ĠFROM Ġkeys ĠWHERE Ġstatus Ġ= Ġ'${ Key Status . CHECK ED . name }' ĠAND Ġuser _ id Ġ= Ġ? ĠORDER ĠBY Ġid ĠDESC ĠLIMIT Ġ 1 " Ċ Ċ /** Ċ Ġ* ĠReturn Ġthe Ġlast Ġchecked Ġkey Ġin Ġthe Ġdatabase Ġfor Ġthe Ġgiven Ġuser Ċ Ġ* Ċ Ġ* Ġ@ param ĠuserID Ġthe Ġuser ĠID Ġof Ġthe Ġkey 's Ġowner Ċ Ġ* Ġ@ return Ġthe Ġkey , Ġor Ġnull Ġif Ġnone Ġwas Ġfound Ċ Ġ*/ Ċ fun ĠgetLast Checked Key ( userID : ĠInt ): ĠKey ? Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġwith ( Database . connection . prepareStatement ( SELECT _ LAST _ KEY )) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Int ( 1 , ĠuserID ) ĊĊĠĠĠĠĠĠĠ Ġexecute Query () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! result . next ()) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġrow To Key ( result ) Ċ } Ċ Ċ private Ġval ĠSELECT _ ALL _ WITH _ STATUS Ġ= Ġ" SELECT Ġ* ĠFROM Ġkeys Ġwhere ĠSTATUS Ġ= Ġ? " Ċ Ċ /** Ċ Ġ* ĠReturn Ġall Ġkeys Ġwith Ġthe Ġgiven Ġstatus Ċ Ġ*/ Ċ fun Ġget Keys ( status : ĠKey Status ): ĠCollection < Key > Ġ{ ĊĠĠĠ Ġlogger . info (" getting Ġall Ġkeys Ġwith Ġstatus Ġ$ status ") ĊĊĠĠĠ Ġval Ġresult Ġ= Ġwith ( Database . connection . prepareStatement ( SELECT _ ALL _ WITH _ STATUS )) Ġ{ ĊĠĠĠĠĠĠĠ Ġset String ( 1 , Ġstatus . name ) ĊĊĠĠĠĠĠĠĠ Ġexecute Query () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġkeys Ġ= Ġmutable ListOf < Key >() ĊĠĠĠ Ġwhile Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġkeys . add ( row To Key ( result )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġkeys Ċ }