package Ġorg . chron op ol is . rest . entities Ċ Ċ import Ġcom . google . common . collect . Comparison Chain Ċ import Ġorg . chron op ol is . rest . entities . de positor . De positor Ċ import Ġorg . chron op ol is . rest . entities . storage . Staging Storage Ċ import Ġorg . chron op ol is . rest . models . enums . Bag Status Ċ import Ġorg . hibernate . annotations . Natural Id Ċ import Ġjavax . persistence . Cascade Type . MERGE Ċ import Ġjavax . persistence . Cascade Type . PER SIST Ċ import Ġjavax . persistence . Entity Ċ import Ġjavax . persistence . Enum Type Ċ import Ġjavax . persistence . Enumer ated Ċ import Ġjavax . persistence . Fetch Type . E AGER Ċ import Ġjavax . persistence . Fetch Type . LA ZY Ċ import Ġjavax . persistence . JoinColumn Ċ import Ġjavax . persistence . ManyToOne Ċ import Ġjavax . persistence . OneToMany Ċ import Ġjavax . persistence . Pre Update Ċ Ċ /** Ċ Ġ* ĠA ĠBag It Ġ[ Bag ] Ġstored Ġby ĠCh ron op ol is Ċ Ġ* Ċ Ġ* Ġtodo : Ġcreator Ġshould Ġmap Ġto Ġthe Ġuser Ġtable Ġ( which Ġmeans Ġit Ġwill Ġno Ġlonger Ġbe Ġcontrolled Ġby Ċ Ġ* Ġspring - security ) Ċ Ġ* Ċ Ġ* Ġ@ property Ġname Ġa Ġunique Ġidentifier Ġfor Ġthis Ġ[ Bag ] Ċ Ġ* Ġ@ property Ġcreator Ġthe Ġuser Ġwhich Ġcreated Ġthe Ġ[ Bag ] Ċ Ġ* Ġ@ property Ġde positor Ġthe Ġ[ De positor ] Ġwho Ġowns Ġthe Ġcontent Ġof Ġthe Ġ[ Bag ] Ċ Ġ* Ġ@ property Ġsize Ġthe Ġsize Ġof Ġthe Ġ[ Bag ] Ġin Ġbytes Ċ Ġ* Ġ@ property Ġtotal Files Ġthe Ġnumber Ġof Ġfiles Ġcontained Ġwithin Ġthe Ġ[ Bag ] Ċ Ġ* Ġ@ property Ġstatus Ġthe Ġstatus Ġof Ġthe Ġ[ Bag ] Ġin Ġthe ĠCh ron op ol is ĠNetwork Ċ Ġ* Ġ@ property Ġfiles Ġa Ġset Ġof Ġ[ Bag File ] s Ġwhich Ġbelong Ġto Ġthe Ġ[ Bag ] Ċ Ġ* Ġ@ property Ġdistributions Ġa Ġset Ġof Ġ[ Bag Distribution ] s Ġdefining Ġthe Ġstate Ġof Ġthe Ġ[ Bag ] Ġat Ġdistribution Ġ[ Node ] s Ċ Ġ* Ċ Ġ* Ġ@ author Ġsh ake Ċ Ġ*/ Ċ @ Entity Ċ class ĠBag ( ĊĠĠĠĠĠĠĠ Ġ@ Natural Id ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ"", ĊĊĠĠĠĠĠĠĠ Ġvar Ġcreator : ĠString Ġ= Ġ"", ĊĊĠĠĠĠĠĠĠ Ġ@ ManyToOne ĊĠĠĠĠĠĠĠ Ġ@ JoinColumn ( name Ġ= Ġ" de positor _ id ") ĊĠĠĠĠĠĠĠ Ġvar Ġde positor : ĠDep ositor Ġ= ĠDep ositor (), ĊĊĠĠĠĠĠĠĠ Ġvar Ġsize : ĠLong Ġ= Ġ 0 L , ĊĊĠĠĠĠĠĠĠ Ġvar Ġtotal Files : ĠLong Ġ= Ġ 0 L , ĊĊĠĠĠĠĠĠĠ Ġ@ Enumer ated ( Enum Type . STRING ) ĊĠĠĠĠĠĠĠ Ġvar Ġstatus : ĠBag Status Ġ= ĠBag Status . DE POSIT ED Ċ ) Ġ: ĠUp datable Entity (), ĠComparable < Bag > Ġ{ ĊĊĠĠĠ Ġ@ OneToMany ( mapped By Ġ= Ġ" bag ", Ġcascade Ġ= Ġ[ MERGE , ĠPER SIST ], Ġfetch Ġ= ĠL AZ Y , Ġorphan Removal Ġ= Ġtrue ) ĊĠĠĠ Ġvar Ġfiles : ĠMutable Set < Data File > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ@ OneToMany ( mapped By Ġ= Ġ" bag ", Ġcascade Ġ= Ġ[ MERGE , ĠPER SIST ], Ġfetch Ġ= ĠL AZ Y , Ġorphan Removal Ġ= Ġtrue ) ĊĠĠĠ Ġvar Ġstorage : ĠMutable Set < Staging Storage > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ@ OneToMany ( mapped By Ġ= Ġ" bag ", Ġcascade Ġ= Ġ[ MERGE , ĠPER SIST ], Ġfetch Ġ= ĠE AGER , Ġorphan Removal Ġ= Ġtrue ) ĊĠĠĠ Ġvar Ġdistributions : ĠMutable Set < Bag Distribution > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ// ĠFunctions ĊĊĠĠĠ Ġfun Ġget Replic ating Nodes (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdistributions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . node . username Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd File ( file : ĠData File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . add ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Files ( to Add : ĠSet < Data File >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiles . addAll ( to Add ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Staging Storage ( staging : ĠSt aging Storage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . add ( staging ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Distribution ( distribution : ĠBag Distribution ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdistributions . add ( distribution ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Distribution ( node : ĠNode , Ġstatus : ĠBag Distribution Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdistributions . add ( Bag Distribution ( this , Ġnode , Ġstatus )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠBag ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComparison Chain . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compare ( de positor , Ġother . de positor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compare ( name , Ġother . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Pre Update ĊĠĠĠ Ġfun ĠonUpdate Bag () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreplic ated Ġ= Ġdistributions . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Match Ġ{ Ġit . status Ġ== ĠBag Distribution Status . REPL ICATE Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rep licated Ġ&& Ġstatus Ġ!= ĠBag Status . DELETED Ġ&& Ġ! distributions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBag Status . PRE SER VED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠBag ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( creator Ġ!= Ġother . creator ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġname . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcreator . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ Ċ }