package Ġcom . example . server Ċ Ċ import Ġcom . example . contract . Record Contract . Record Commands .* Ċ import Ġcom . example . flow . Create New Record Flow Ċ import Ġcom . example . flow . Go ssip Record Flow Ċ import Ġcom . example . flow . Modify Record Flow Ċ import Ġcom . example . flow . Set Related Record Flow Ċ import Ġcom . example . state . Record State Ċ import Ġnet . cord a . core . contracts . Command Data Ċ import Ġnet . cord a . core . contracts . State And Ref Ċ import Ġnet . cord a . core . contracts . Unique Identifier Ċ import Ġnet . cord a . core . contracts . Unique Identifier . Companion . fromString Ċ import Ġnet . cord a . core . contracts . hash Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . messaging . vault Query By Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . utilities . get OrThrow Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType . APPLICATION _ JSON _ VALUE Ċ import Ġorg . springframework . http . MediaType . TEXT _ PLAIN _ VALUE Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . util . StringUtils Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġorg . springframework . web . multipart . Multipart File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ Ċ val ĠSERVICE _ NAMES Ġ= ĠlistOf (" Not ary ", Ġ" Network ĠMap ĠService ") Ċ val ĠCREATE _ CMD Ġ= ĠlistOf ( Course (), ĠActivity (), ĠConduct ()) Ċ val ĠSET _ CMD Ġ= ĠlistOf ( Quiz (), ĠDo Quiz (), ĠGr ade (), ĠAtt endance (), ĠCert ification ()) Ċ Ċ /** Ċ Ġ* Ġ ĠA ĠSpring ĠBoot ĠServer ĠAPI Ġcontroller Ġfor Ġinteracting Ġwith Ġthe Ġnode Ġvia ĠRPC . Ċ Ġ*/ Ċ Ċ @ RestController Ċ @ RequestMapping ("/ DS RMS / api /") Ġ// ĠThe Ġpaths Ġfor ĠGET Ġand ĠPOST Ġrequests Ġare Ġrelative Ġto Ġthis Ġbase Ġpath . Ċ class ĠMain Controller ( rpc : ĠNode RPC Connection ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( RestController :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmy Legal Name Ġ= Ġrpc . proxy . node Info (). legal Id entities . first (). name ĊĠĠĠ Ġprivate Ġval Ġproxy Ġ= Ġrpc . proxy ĊĠĠĠ Ġprivate Ġval Ġissuer Ġ= Ġproxy . node Info (). legal Id entities . first () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnode 's Ġname . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ( value Ġ= Ġ[ Ġ" me " Ġ], Ġproduces Ġ= Ġ[ ĠAP PLICATION _ JSON _ VALUE Ġ]) ĊĠĠĠ Ġfun Ġwho Am I () Ġ= Ġmap Of (" me " Ġto Ġmy Legal Name ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġparticipants Ġregistered Ġwith Ġthe Ġnetwork Ġmap Ġservice . Ġ( from Ġthe Ġsame Ġschool ) ĊĠĠĠĠ Ġ* ĠThese Ġnames Ġcan Ġbe Ġused Ġto Ġlook Ġup Ġident ities Ġusing Ġthe Ġidentity Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ( value Ġ= Ġ[ Ġ" peers " Ġ], Ġproduces Ġ= Ġ[ ĠAP PLICATION _ JSON _ VALUE Ġ]) ĊĠĠĠ Ġfun Ġget Peers (): ĠMap < String , ĠList < C ord a X 5 0 0 Name >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġproxy . network Map Snapshot () ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of (" peers " Ġto Ġnode Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . legal Id entities . first (). name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// filter Ġout Ġmyself , Ġnot ary Ġand Ġevent ual Ġnetwork Ġmap Ġstarted Ġby Ġdriver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . locality Ġin Ġ( SERVICE _ NAMES Ġ+ Ġmy Legal Name . locality ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġparticipants Ġregistered Ġwith Ġthe Ġnetwork Ġmap Ġservice . ĊĠĠĠĠ Ġ* ĠThese Ġnames Ġcan Ġbe Ġused Ġto Ġlook Ġup Ġident ities Ġusing Ġthe Ġidentity Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ( value Ġ= Ġ[ Ġ" all People " Ġ], Ġproduces Ġ= Ġ[ ĠAP PLICATION _ JSON _ VALUE Ġ]) ĊĠĠĠ Ġfun ĠgetAll People (): ĠMap < String , ĠList < C ord a X 5 0 0 Name >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġproxy . network Map Snapshot () ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of (" all People " Ġto Ġnode Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . legal Id entities . first (). name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// filter Ġout Ġmyself , Ġnot ary Ġand Ġevent ual Ġnetwork Ġmap Ġstarted Ġby Ġdriver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . organisation Ġ! in ĠSERVICE _ NAMES Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInit i ates Ġa Ġflow Ġto Ġcreate Ġrecord Ġbetween Ġtwo Ġparties . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ PostMapping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ Ġ" create - record " Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduces Ġ= Ġ[ ĠTEXT _ PLAIN _ VALUE Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= Ġ[ Ġ" Content - Type = application / x - www - form - urlencoded " Ġ] ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġcreate Record ( request : ĠHttpServletRequest ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparty Name Ġ= Ġrequest . getParameter (" party Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResponseEntity . bad Request (). body (" Query Ġparameter Ġ' party Name ' Ġmust Ġnot Ġbe Ġnull .\ n ") ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġx 5 0 0 Name : ĠString ĊĠĠĠĠĠĠĠ ĠgetAll People ()[" all People "] ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . organisation Ġ== Ġparty Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 5 0 0 Name Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparty X 5 0 0 Name Ġ= ĠC ord a X 5 0 0 Name . parse ( x 5 0 0 Name ) ĊĠĠĠĠĠĠĠ Ġval Ġother Party Ġ= Ġproxy . well Known Party From X 5 0 0 Name ( party X 5 0 0 Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResponseEntity . bad Request (). body (" Party Ġnamed Ġ$ party Name Ġcannot Ġbe Ġfound .\ n ") ĊĊĠĠĠĠĠĠĠ Ġval ĠeventType Cmd Ġ= Ġget EventType Cmd ( request . getParameter (" eventType ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Description : ĠString Ġ= Ġrequest . getParameter (" event Description ") ĊĠĠĠĠĠĠĠ Ġval Ġevent Value : ĠString Ġ= Ġrequest . getParameter (" event Value ") ĊĠĠĠĠĠĠĠ Ġval Ġfile Reference : ĠString Ġ= Ġrequest . getParameter (" file Reference ") ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġsigned Tx : ĠSigned Transaction ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( eventType Cmd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠCREATE _ CMD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Tx Ġ= Ġproxy . start Tracked Flow Dynamic ( Create New Record Flow . Init iator :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer , Ġother Party , ĠeventType Cmd , Ġevent Description , Ġevent Value , Ġfile Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). returnValue . get OrThrow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠSET _ CMD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Linear Id : ĠString Ġ= Ġrequest . getParameter (" ref Linear Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Tx Ġ= Ġproxy . start Tracked Flow Dynamic ( Set Related Record Flow . Init iator :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer , Ġother Party , ĠeventType Cmd , Ġevent Description , Ġevent Value , Ġfile Reference , Ġref Linear Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). returnValue . get OrThrow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo ssip Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠModify Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Linear Id : ĠString Ġ= Ġrequest . getParameter (" ref Linear Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinear Id Str : ĠString Ġ= Ġrequest . getParameter (" linear Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinear Id : ĠUnique Identifier Ġ= Ġfrom String ( linear Id Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Tx Ġ= Ġproxy . start Tracked Flow Dynamic ( Modify Record Flow . Init iator :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer , Ġother Party , Ġevent Description , Ġevent Value , Ġfile Reference , Ġref Linear Id , Ġlinear Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). returnValue . get OrThrow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . bad Request (). body (" Wrong ĠEvent ĠType \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġgo ssip ( signed Tx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . CREATED ). body (" Transaction Ġid Ġ${ signed Tx . id } Ġcommitted Ġto Ġledger .\ n ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex . message , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . bad Request (). body ( ex . message !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDisplays Ġall Ġrecords Ġstates Ġthat Ġonly Ġthis Ġnode Ġhas Ġbeen Ġinvolved Ġin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ GetMapping ( value Ġ= Ġ[ Ġ" my - records " Ġ], Ġproduces Ġ= Ġ[ ĠAP PLICATION _ JSON _ VALUE Ġ]) ĊĠĠĠ Ġfun Ġget My Records (): ĠMap < String , ĠList < State And Ref < Record State >>> Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmy Records Ġ= Ġproxy . vault Query By < Record State >(). states . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . state . data . issuer Ġ== Ġproxy . node Info (). legal Id entities . first () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . state . data . receiver Ġ== Ġproxy . node Info (). legal Id entities . first () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Course " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠCourse () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Quiz " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠQu iz () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Do Quiz " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠDo Quiz () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Grade " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠGr ade () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Activity " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠActivity () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Attendance " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠAtt endance () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cert ification " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠCert ification () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Con duct " Ġto Ġmy Records . map Ġ{ Ġit Ġ} Ġ. filter Ġ{ Ġit . state . data . eventType Ġ== ĠConduct () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ PostMapping (" uploads ") ĊĠĠĠ Ġ@ ResponseBody ĊĠĠĠ Ġfun Ġupload Files (@ RequestParam (" file ") Ġfile Ġ: ĠArray < Multipart File >): ĠString { ĊĠĠĠĠĠĠĠ Ġlogger . info (" Upload Ġfile ( s )") ĊĠĠĠĠĠĠĠ Ġval Ġroot Path Ġ: ĠPath Ġ= ĠPaths . get ("/ files / upload ") ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" upload Ġfile Ġarray Ġis Ġempty " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġfile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ Ġ= ĠStringUtils . clean Path ( f . original Filename !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( f . inputStream , Ġroot Path . resolve ( fileName ), ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" error ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" upload Ġerror " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" success " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgo ssip ( signed Tx : ĠSigned Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġproxy . network Map Snapshot () ĊĠĠĠĠĠĠĠ Ġval Ġall Nodes Ġ= Ġnode Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . legal Id entities . first (). name . organisation Ġ! in Ġ( SERVICE _ NAMES Ġ+ Ġmy Legal Name . organisation ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġgo ssip Re ceiv ers : ĠMutable List < Party > ĊĠĠĠĠĠĠĠ Ġval Ġrand Value Ġ= Ġ( 0 .. 1 0 ). sh uffled ()[ ( 0 .. 1 0 ). sh uffled ()[ 2 ]] ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġall Nodes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ< Ġrand Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo ssip Re ceiv ers . add ( it . legal Id entities [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgo ssip Rand Re ceiv ers Ġ= Ġgo ssip Re ceiv ers . sh uffled (). take (( 0 .. go ssip Re ceiv ers . size ). sh uffled ()[ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġgo ssip Rand Re ceiv ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgo ssip Tx Ġ= Ġproxy . start Tracked Flow Dynamic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGo ssip Record Flow . Init iator :: class . java , Ġit , Ġsigned Tx . tx . outputs [ 0 ]. data . hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). returnValue . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget EventType Cmd ( eventType Str : ĠString ): ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( eventType Str ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Course " Ġ-> ĠCourse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Quiz " Ġ-> ĠQu iz () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Do Quiz " Ġ-> ĠDo Quiz () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Grade " Ġ-> ĠGr ade () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Activity " Ġ-> ĠActivity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Attendance " Ġ-> ĠAtt endance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cert ification " Ġ-> ĠCert ification () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Con duct " Ġ-> ĠConduct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Anonymous " Ġ-> ĠGo ssip () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Modify " Ġ-> ĠModify () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Wrong Ġevent Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ