package Ġmain . services . aws . ql db . helpers Ċ Ċ import Ġcom . amazon . ion .* Ċ import Ġcom . amazon . ion . system . Ion System Builder Ċ import Ġcom . amazon . ion hash . Ion Hash Reader Builder Ċ import Ġcom . amazon . ion hash . Message Digest Ion Hash er Provider Ċ import Ġcom . fasterxml . jackson . annotation . Json Auto Detect Ċ import Ġcom . fasterxml . jackson . annotation . Json Creator Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Serialize Ċ import Ġcom . fasterxml . jackson . data format . ion . Ion Timestamp Serial izers . Ion Timestamp Java Date Serializer Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . time . Zone Id Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠRepresents Ġa ĠQ l db Revision Ġincluding Ġboth Ġuser Ġdata Ġand Ġmetadata . Ċ Ġ*/ Ċ @ Json Auto Detect ( field Visibility Ġ= ĠJson Auto Detect . Visibility . ANY ) Ċ class ĠQ l db Revision Ġ@ Json Creator Ġconstructor ( ĊĠĠĠ Ġblock Address : ĠBlock Address , ĊĠĠĠ Ġmetadata : ĠMetadata , ĊĠĠĠ Ġhash : ĠByteArray , ĊĠĠĠ Ġdata : ĠIon Struct Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġthe Ġmetadata Ġfield Ġof Ġa ĠQ L DB ĠDocument ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Json Auto Detect ( field Visibility Ġ= ĠJson Auto Detect . Visibility . ANY ) ĊĠĠĠ Ġclass ĠMetadata Ġ@ Json Creator Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGets Ġthe Ġunique ĠID Ġof Ġa ĠQ L DB Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġdocument ĠID . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGets Ġthe Ġversion Ġnumber Ġof Ġthe Ġdocument Ġin Ġthe Ġdocument 's Ġmodification Ġhistory . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġversion Ġnumber . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġversion : ĠLong , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGets Ġthe Ġtime Ġduring Ġwhich Ġthe Ġdocument Ġwas Ġmodified . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtransaction Ġtime . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ field : Json Serialize ( using Ġ= ĠIon Timestamp Java Date Serializer :: class ) Ġval Ġtx Time : ĠDate , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGets Ġthe Ġtransaction ĠID Ġassociated Ġwith Ġthis Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtransaction ĠID . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtx Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConverts Ġa Ġ[ Metadata ] Ġobject Ġto Ġa Ġstring . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġstring Ġrepresentation Ġof Ġthe Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(" Metadata {" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" id ='" Ġ+ Ġid Ġ+ Ġ'\'' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġversion =" Ġ+ Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġtx Time =" Ġ+ Ġtx Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġtx Id ='" Ġ+ Ġtx Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ'\'' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ' }') ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġwhether Ġtwo Ġ[ Metadata ] Ġobjects Ġare Ġequivalent . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġtwo Ġobjects Ġare Ġequal , Ġ` false ` Ġotherwise . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġjava Class Ġ!= Ġother . java Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġother Ġas ĠMetadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġversion Ġ== Ġmetadata . version Ġ&& Ġid Ġ== Ġmetadata . id Ġ&& Ġtx Time Ġ== Ġmetadata . tx Time Ġ&& Ġtx Id Ġ== Ġmetadata . tx Id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGenerate Ġa Ġhash Ġcode Ġfor Ġthe Ġ[ Metadata ] Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġhash Ġcode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ Ġ// ĠCHECK STYLE : OFF Ġ- ĠDis abling Ġas Ġwe Ġare Ġgenerating Ġa ĠhashCode Ġof Ġmultiple Ġproperties . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( id , Ġversion , Ġtx Time , Ġtx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCHECK STYLE : ON ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Ion ( ion Struct : ĠIon Struct ?): ĠMetadata Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ion Struct Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Metadata Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġion Struct [" id "] Ġas ĠIon String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġion Struct [" version "] Ġas ĠIon Int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Time Ġ= Ġion Struct [" tx Time "] Ġas ĠIon Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġion Struct [" tx Id "] Ġas ĠIon String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . stringValue (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion . longValue (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate ( tx Time . millis ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Id . stringValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġparse Ġion Ġdocument ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Document Ġmembers Ġare Ġnot Ġof Ġthe Ġcorrect Ġtype ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġblock Address : ĠBlock Address ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġmetadata Ġof Ġthe Ġrevision . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ Metadata ] Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmetadata : ĠMetadata ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe ĠSHA - 2 5 6 Ġhash Ġvalue Ġof Ġthe Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġbyte Ġarray Ġrepresenting Ġthe Ġhash . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġhash : ĠByteArray ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġrevision Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġrevision Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdata : ĠIon Struct ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġunique ĠID Ġof Ġa ĠQ L DB Ġdocument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ Block Address ] Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Block Address (): ĠBlock Address Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Address ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġ[ Ql db Revision ] Ġobject Ġto Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġstring Ġrepresentation Ġof Ġthe Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Ql db Revision {" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" block Address =" Ġ+ Ġblock Address Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġmetadata =" Ġ+ Ġmetadata Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġhash =" Ġ+ ĠArrays . toString ( hash ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", Ġdata =" Ġ+ Ġdata Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' }' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġwhether Ġtwo Ġ[ Ql db Revision ] Ġobjects Ġare Ġequivalent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġtwo Ġobjects Ġare Ġequal , Ġ` false ` Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġequals ( o : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( o Ġ! is ĠQ l db Revision ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget Block Address () Ġ== Ġo . getBlock Address () Ġ&& Ġmetadata Ġ== Ġo . metadata Ġ&& Ġhash . content Equals ( o . hash ) Ġ&& Ġdata Ġ== Ġo . data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġhash Ġcode Ġfor Ġthe Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġhash Ġcode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ Ġ// ĠCHECK STYLE : OFF Ġ- ĠDis abling Ġas Ġwe Ġare Ġgenerating Ġa ĠhashCode Ġof Ġmultiple Ġproperties . ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠObjects . hash ( block Address , Ġmetadata , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ// ĠCHECK STYLE : ON ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġhash . content HashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Ql db Revision :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSYSTEM Ġ= ĠIon System Builder . standard (). build () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġion Hash er Provider Ġ= ĠMessage Digest Ion Hash er Provider (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUTC Ġ= ĠZone Id . of (" UTC ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠONE _ TH O US AND Ġ= ĠBigDecimal . valueOf ( 1 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConstructs Ġa Ġnew Ġ[ Ql db Revision ] Ġfrom Ġan Ġ[ Ion Struct ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġspecified Ġ[ Ion Struct ] Ġmust Ġinclude Ġthe Ġfollowing Ġfields ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġblock Address Ġ-- Ġa Ġ[ Block Address ], ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġmetadata Ġ-- Ġa Ġ[ Metadata ], ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġhash Ġ-- Ġthe Ġdocument 's Ġhash Ġcalculated Ġby ĠQ L DB , ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġdata Ġ-- Ġan Ġ[ Ion Struct ] Ġcontaining Ġuser Ġdata Ġin Ġthe Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġany Ġof Ġthese Ġfields Ġare Ġmissing Ġor Ġare Ġmalformed , Ġthen Ġthrows Ġ[ IllegalArgumentException ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġdocument Ġhash Ġcalculated Ġfrom Ġthe Ġmembers Ġof Ġthe Ġspecified Ġ[ Ion Struct ] Ġdoes Ġnot Ġmatch ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġhash Ġmember Ġof Ġthe Ġ[ Ion Struct ] Ġthen Ġthrows Ġ[ IllegalArgumentException ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġion Struct ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ[ Ion Struct ] Ġthat Ġcontains Ġa Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġconverted Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġif Ġfailed Ġto Ġparse Ġparameter Ġ[ Ion Struct ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Ion ( ion Struct : ĠIon Struct ): ĠQ l db Revision Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Address : ĠBlock Address Ġ= ĠLed ger Client . MAP PER . readValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġion Struct [" block Address "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Address :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġion Struct [" hash "] Ġas ĠIon Blob ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Struct Ġ= Ġion Struct [" metadata "] Ġas ĠIon Struct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġion Struct [" data "] Ġas ĠIon Struct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Hash Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompute Hash ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Struct , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Arrays . equals ( candidate Hash , Ġhash . bytes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Hash Ġentry Ġof ĠQ L DB Ġrevision Ġand Ġcomputed Ġhash Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" of ĠQ L DB Ġrevision Ġdo Ġnot Ġmatch " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata . from Ion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Struct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQ l db Revision ( block Address , Ġmetadata , Ġhash . bytes , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġparse Ġion Ġdocument ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Document Ġmembers Ġare Ġnot Ġof Ġthe Ġcorrect Ġtype ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalculate Ġthe Ġdigest Ġof Ġtwo ĠQ L DB Ġhashes . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġmetadata ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmetadata Ġportion Ġof Ġa Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġdata Ġportion Ġof Ġa Ġdocument . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġconverted Ġ[ Ql db Revision ] Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcompute Hash ( metadata : ĠIon Struct , Ġdata : ĠIon Struct ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmetaData Hash Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ion Value ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Hash Ġ= Ġhash Ion Value ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVer ifier . join Hashes Pair wise ( metaData Hash , Ġdata Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġhash Ġvalue Ġfrom Ġthe Ġgiven Ġ[ Ion Value ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġion Value ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ[ Ion Value ] Ġto Ġhash . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġbyte Ġarray Ġrepresenting Ġthe Ġhash Ġvalue . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhash Ion Value ( ion Value : ĠIon Value ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠSYSTEM . new Reader ( ion Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Reader Ġ= ĠIon Hash Reader Builder . standard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Hash er Provider ( ion Hash er Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Reader ( reader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( hash Reader . next () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhash Reader . digest () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . block Address Ġ= Ġblock Address ĊĠĠĠĠĠĠĠ Ġthis . metadata Ġ= Ġmetadata ĊĠĠĠĠĠĠĠ Ġthis . hash Ġ= Ġhash ĊĠĠĠĠĠĠĠ Ġthis . data Ġ= Ġdata ĊĠĠĠ Ġ} Ċ }