package Ġde . se . team 3 . logic . domain Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Serialize Ċ import Ġde . se . team 3 . logic . exceptions . Invalid Input Exception Ċ import Ġde . se . team 3 . web service . util . Instant Serializer Ċ import Ġjava . time . Instant Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġprocess . Ċ Ġ*/ Ċ class ĠProcess ( ĊĠĠĠ Ġval Ġid : ĠInt ?, ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġval Ġstarter : ĠUser , ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġval Ġprocess Group : ĠProcess Group , ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġval Ġprocess Template : ĠProcess Template , ĊĠĠĠ Ġprivate Ġvar Ġtitle : ĠString , ĊĠĠĠ Ġprivate Ġvar Ġdescription : ĠString , ĊĠĠĠ Ġprivate Ġvar Ġstatus : ĠProcess Status , ĊĠĠĠ Ġ@ Json Serialize ( using Ġ= ĠInstant Serializer :: class ) ĊĠĠĠ Ġprivate Ġvar Ġdeadline : ĠInstant , ĊĠĠĠ Ġ@ Json Serialize ( using Ġ= ĠInstant Serializer :: class ) ĊĠĠĠ Ġval Ġstarted At : ĠInstant , ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġ// Ġthe Ġtasks Ġlies Ġunder Ġthe Ġid Ġof Ġthe Ġcorresponding Ġtask Ġtemplate ĊĠĠĠ Ġval Ġtasks : ĠMap < Int , ĠTask > Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġget Process GroupId () Ġ= Ġprocess Group . id !! ĊĊĠĠĠ Ġfun Ġget Title () Ġ= Ġtitle ĊĊĠĠĠ Ġfun ĠgetDescription () Ġ= Ġdescription ĊĊĠĠĠ Ġfun ĠgetStatus () Ġ= Ġstatus ĊĊĠĠĠ Ġfun Ġget Deadline () Ġ= Ġdeadline ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks . forEach Ġ{ Ġ(_, Ġtask ) Ġ-> Ġtask . process Ġ= Ġthis Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstarter Id Ġ= Ġstarter . id ĊĊĠĠĠ Ġval Ġprocess Template Id Ġ= Ġprocess Template . id !! ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate - Constructor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġstarter : ĠUser , ĊĠĠĠĠĠĠĠ Ġprocess Group : ĠProcess Group , ĊĠĠĠĠĠĠĠ Ġprocess Template : ĠProcess Template , ĊĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġdescription : ĠString , ĊĠĠĠĠĠĠĠ Ġdeadline : ĠInstant ĊĠĠĠ Ġ) Ġ: Ġthis Ġ( null , ĊĠĠĠĠĠĠĠ Ġstarter , ĊĠĠĠĠĠĠĠ Ġprocess Group , ĊĠĠĠĠĠĠĠ Ġprocess Template , ĊĠĠĠĠĠĠĠ Ġtitle , ĊĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠ ĠProcess Status . RUNNING , ĊĠĠĠĠĠĠĠ Ġdeadline , ĊĠĠĠĠĠĠĠ ĠInstant . now (), Ġ// Ġstarted Ġat ĊĠĠĠĠĠĠĠ Ġcreate Tasks ( process Template ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Properties () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate - Constructor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġid : ĠInt , ĊĠĠĠĠĠĠĠ Ġstarter : ĠUser , ĊĠĠĠĠĠĠĠ Ġprocess Group : ĠProcess Group , ĊĠĠĠĠĠĠĠ Ġprocess Template : ĠProcess Template , ĊĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġdescription : ĠString , ĊĠĠĠĠĠĠĠ Ġdeadline : ĠInstant ĊĠĠĠ Ġ) Ġ: Ġthis Ġ( ĊĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠ Ġstarter , ĊĠĠĠĠĠĠĠ Ġprocess Group , ĊĠĠĠĠĠĠĠ Ġprocess Template , ĊĠĠĠĠĠĠĠ Ġtitle , ĊĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠ ĠProcess Status . RUNNING , ĊĠĠĠĠĠĠĠ Ġdeadline , ĊĠĠĠĠĠĠĠ ĠInstant . now (), ĊĠĠĠĠĠĠĠ ĠHashMap < Int , ĠTask >() ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġproperty Ġconstraints . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid Input Exception ĠIs Ġthrown Ġif Ġthe Ġtitle Ġis Ġempty Ġor Ġif Ġthe Ġunderlying ĊĠĠĠĠ Ġ* Ġprocess Ġtemplate Ġis Ġalready Ġdeleted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Properties () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( title . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Input Exception (" title Ġmust Ġnot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠ Ġif Ġ( process Template . is Deleted ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Input Exception (" must Ġnot Ġbe Ġbased Ġon Ġa Ġdeleted Ġprocess Ġtemplate ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġtitle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid Input Exception ĠIs Ġthrown Ġif Ġthe Ġtitle Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetTitle ( title : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( title . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Input Exception (" title Ġmust Ġnot Ġbe Ġempty ") ĊĊĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġtitle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġdescription . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Description ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . description Ġ= Ġdescription ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġdeadline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Deadline ( deadline : ĠInstant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . deadline Ġ= Ġdeadline ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġspecified Ġtask . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Task ( taskId : ĠInt ): ĠTask Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtasks . map Ġ{ Ġit . value Ġ}. find Ġ{ Ġit . id Ġ== ĠtaskId Ġ} !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġprocess Ġis Ġrunning Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġiff Ġthe Ġprocess Ġis Ġrunning . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Running (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstatus Ġ== ĠProcess Status . RUNNING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġspecified Ġuser Ġis Ġassigned Ġto Ġan Ġtask Ġof Ġthis Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġiff Ġthe Ġspecified Ġuser Ġis Ġassigned Ġto Ġat Ġleast Ġon Ġtask Ġof Ġthis Ġprocess . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Assign ee ( userId : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġtask ) Ġin Ġtasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( assignment Ġin Ġtask . get Assignments ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( assignment . assign ee Id Ġ== ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent Ġprogress Ġin Ġpercent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġprogress Ġis Ġthe Ġpercentage Ġof Ġtasks Ġdone Ġweighted Ġby Ġthe Ġestimated Ġduration . ĠThe Ġestimated ĊĠĠĠĠ Ġ* Ġduration Ġof Ġa Ġtask Ġwhere Ġthe Ġtask Ġtemplate Ġdoes Ġnot Ġcontain Ġa Ġestimated Ġduration Ġis Ġassumed ĊĠĠĠĠ Ġ* Ġto Ġbe Ġ 1 . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġprogress Ġof Ġthe Ġprocess Ġin Ġpercent Ġfrom Ġ 0 Ġto Ġ 1 0 0 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ JsonProperty (" progress ") ĊĠĠĠ Ġfun Ġget Progress (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġestimated Duration Done Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġtasks . forEach Ġ{ Ġ_, Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Closed ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġestimated Duration Done Ġ+= Ġtask . task Template !!. estimated Duration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġestimated Duration Done Ġ/ Ġprocess Template . get Est imated Duration Sum () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( ratio Ġ* Ġ 1 0 0 ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDec ides Ġwhether Ġthe Ġprocess Ġcould Ġbe Ġclosed Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġthe Ġprocess Ġcould Ġbe Ġclosed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose able (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠProcess Status . RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġclose able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtasks . forEach Ġ{ Ġ(_, Ġtask ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Closed ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose able Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclose able ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthe Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException ĠIs Ġthrown Ġif Ġthe Ġstatus Ġof Ġthe Ġprocess Ġis Ġnot Ġrunning . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! close able ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" process Ġis Ġnot Ġclose able ") ĊĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠProcess Status . CLOSED ĊĠĠĠĠĠĠĠ Ġprocess Template . decrease Running Processes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAbort s Ġthe Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException ĠIs Ġthrown Ġif Ġthe Ġstatus Ġof Ġthe Ġprocess Ġis Ġnot Ġrunning . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException ĠIs Ġthrown Ġif Ġthe Ġprocess Ġis Ġclose able Ġbut Ġthe Ġclose () ĊĠĠĠĠ Ġ* Ġmethod Ġwas Ġnot Ġcalled Ġyet . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġabort () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠProcess Status . RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" only Ġa Ġrunning Ġprocesses Ġcould Ġbe Ġaborted ") ĊĠĠĠĠĠĠĠ Ġif Ġ( close able ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" a Ġclose able Ġprocess Ġcould Ġnot Ġbe Ġaborted ") ĊĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠProcess Status . ABORT ED ĊĠĠĠĠĠĠĠ Ġprocess Template . decrease Running Processes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġgiven Ġprocess Ġis Ġrelevant Ġfor Ġthe Ġuser . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġiff Ġthe Ġprocess Ġis Ġin Ġa Ġprocess Ġgroup Ġthe Ġspecified Ġuser Ġis Ġa Ġmember Ġof Ġand ĊĠĠĠĠ Ġ* Ġone Ġof Ġthe Ġuser 's Ġroles Ġis Ġdesign ated Ġas Ġresponsible Ġfor Ġthe Ġprocess , Ġor Ġthe Ġuser Ġis ĊĠĠĠĠ Ġ* Ġassigned Ġto Ġone Ġof Ġthe Ġprocesses Ġtasks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġfun Ġis Re levant For ( user : ĠUser ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġall Ġrelevant Ġinformation ĊĠĠĠĠĠĠĠ Ġval Ġusers Group IDs Ġ= Ġuser . get Process Group Ids () ĊĠĠĠĠĠĠĠ Ġval Ġusers Role IDs Ġ= Ġuser . getUser Role Ids () ĊĊĠĠĠĠĠĠĠ Ġ// Ġuser Ġis Ġin Ġprocess 's Ġgroup Ġand Ġone Ġof Ġhis / her Ġroles Ġis Ġassigned Ġto Ġit ĊĠĠĠĠĠĠĠ Ġval Ġin Users Groups Ġ= Ġusers Group IDs . contains ( this . get Process GroupId ()) ĊĠĠĠĠĠĠĠ Ġval Ġdesign ated As Respons ible Ġ= Ġprocess Template . is One Respons ible ( users Role IDs ) ĊĠĠĠĠĠĠĠ Ġif Ġ( in Users Groups Ġ&& Ġdesign ated As Respons ible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Ġuser Ġis Ġassigned Ġto Ġone Ġof Ġthe Ġprocesses Ġtasks ĊĠĠĠĠĠĠĠ Ġif Ġ( has Assign ee ( user . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġthe Ġtasks Ġof Ġthe Ġprocess Ġby Ġlooping Ġover Ġthe Ġunderlying Ġtask Ġtemplates . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Tasks ( process Template : ĠProcess Template ): ĠMap < Int , ĠTask > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= ĠHashMap < Int , ĠTask >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Templates Ġ= Ġprocess Template . task Templates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( id , Ġtask Template ) Ġin Ġtask Templates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstarted At Ġ= Ġif Ġ( task Template . get Pre decess ors (). size Ġ== Ġ 0 ) ĠInstant . now () Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask ( id , Ġstarted At ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . put ( id , Ġtask ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtasks ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ