import Ġjavafx . application . Platform č Ċ import Ġjavafx . event . ActionEvent č Ċ import Ġjavafx . event . EventHandler č Ċ import Ġjavafx . f xml . FXML č Ċ import Ġjavafx . scene . Parent č Ċ import Ġjavafx . scene . control . Button č Ċ import Ġjavafx . scene . control . Label č Ċ import Ġjavafx . scene . control . ProgressBar č Ċ import Ġjavafx . scene . control . TextField č Ċ import Ġjavafx . scene . layout .* č Ċ import Ġjavafx . scene . paint . Color č Ċ import Ġjavafx . stage . Directory Chooser č Ċ import Ġjavafx . stage . Popup č Ċ import Ġjavafx . stage . Stage č Ċ import Ġorg . apache . commons . io . FileUtils č Ċ import Ġorg . apache . commons . io . file filter . Directory File Filter č Ċ import Ġorg . tiny zip . Tiny Zip č Ċ import Ġjava . io . File č Ċ import Ġjava . io . File Filter č Ċ import Ġjava . nio . file . Files č Ċ import Ġjava . nio . file . Path č Ċ import Ġjava . nio . file . Paths č Ċ import Ġjava . nio . file . Standard Copy Option čĊčĊč Ċ /* čĊ Ġ* Ġ@ created Ġ 2 8 . Ġ 0 1 . Ġ 2 0 2 2 čĊ Ġ* Ġ@ project ĠIntelliJ ĠIDEA čĊ Ġ* Ġ@ author ĠD orm age č Ċ */ čĊč Ċ class ĠMain Cont ro ler ( private Ġval Ġstage : ĠStage , Ġprivate Ġval Ġmain : ĠMain ){ čĊčĊĠĠĠ Ġval Ġdata Manager : ĠData Manager Ġ= Ġmain . data Manager čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġload Progress Ġ: ĠProgress Bar čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmain Pane Ġ: ĠAnchor Pane čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġloading Title Ġ: ĠLabel čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġloading Status Log Ġ: ĠTextField čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpopup Pane : ĠBorder Pane čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġfun Ġload Assignments ( event : ĠAction Event ) Ġ{ čĊĠĠĠĠĠĠĠ Ġprintln (" load Ġcallback ") čĊĠĠĠĠĠĠĠ ĠDirectory Chooser (). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Select Ġfolder Ġcontaining Ġassignments " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog ( stage )?. apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ġ: Parent Ġ= Ġmain . load Component (" Loading Files . f xml ", Ġthis @ Main Cont ro ler ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Pane . children . set All ( new ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// creates Ġtemporary Ġdirectory Ġfollowing Ġrequired ĠMO SS Ġsubmission Ġstructure čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Directory : ĠPath Ġ= ĠFiles . create Temp Directory (" MO SS _ ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Created Ġtemporary Ġfolder Ġat : Ġ Ġ$ temp Directory ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Manager . url Ġ= Ġtemp Directory . toString () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Progress Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubmission Dirs : ĠArray < File > Ġ= Ġabsolute File . list Files ( Directory File Filter . DIRECTORY Ġas ĠFile Filter ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmission Dirs . forEach Indexed Ġ{ Ġindex , Ġassignment Folder Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Processing Ġstudent Ġ: Ġ${ assignment Folder . name }$ Ġ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Loading Progress (" Processing Ġstudent Ġ: Ġ${ assignment Folder . name }$ Ġ... ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror : ĠString Ġ= Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompressed : ĠSequence < File > Ġ= Ġassignment Folder . walk Top Down (). filter Ġ{ Ġassignment Folder . toString (). endsWith (". zip ") Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompressed . forEach Ġ{ file Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Loading Progress (" Un compress ing Ġassignment Ġ... ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTiny Zip . unzip ( file . path . toString (), Ġfile . parent . toString ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġe . toString () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġtemp Ġsubmission Ġfolder čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Student Dir Ġ= ĠFiles . create Directory ( Paths . get ( temp Directory . toString () Ġ+ ĠFile . separator Ġ+ Ġassignment Folder . name . replace (" Ġ"," _ ") Ġ+ File . separator )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Code Files Ġ= ĠFileUtils . list Files ( File ( assignment Folder . toString ()), ĠarrayOf (" java "), Ġtrue ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Code Files . forEach { Ġsource File Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠFile ( temp Student Dir . toString () Ġ+ ĠFile . separator Ġ+ Ġsource File . name ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( source File . to Path (), destination . to Path (), Standard Copy Option . REPLACE _ EXIST ING ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Copy Ġcommand Ġfrom Ġ${ source File . to Path ()} Ġto Ġ: Ġ$ destination ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Loading Progress (" Copy ing Ġsource Ġfiles Ġto Ġ$ destination ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Manager . add Preview ( Preview ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Folder . name , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Student Dir . toString (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Code Files . to Mutable List () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later ( Runnable Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Progress . progress Ġ= Ġcurrent Progress . toDouble () Ġ/ Ġsubmission Dirs . size čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress ++ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Ġ: Parent Ġ= Ġmain . load Component (" Preview Assignments . f xml ", ĠSubmit Cont ro ler ( stage , main )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage . scene . root Ġ= Ġpreview čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠ Ġprivate Ġfun Ġlog Loading Progress ( progress : String ){ čĊĠĠĠĠĠĠĠ ĠPlatform . run Later ( Runnable Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Status Log . text Ġ= Ġprogress čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠ Ġ} čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġfun Ġload History (){ čĊĠĠĠ Ġ} čĊĠĠĠ Ġ@ FXML Ġprivate Ġfun Ġupload Assignments (){ čĊĠĠĠ Ġ} čĊĠĠĠ Ġ@ FXML čĊĠĠĠ Ġprivate Ġfun Ġopen Settings Popup (){ čĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ: ĠParent Ġ= Ġmain . load Component (" Settings Screen . f xml ", Ġthis @ Main Cont ro ler ) čĊĠĠĠĠĠĠĠ Ġval Ġpopup : ĠPopup Ġ= ĠPopup () čĊĠĠĠĠĠĠĠ Ġpopup . scene . fill = ĠColor . web (" FFFFFF ") čĊĠĠĠĠĠĠĠ Ġpopup . width Ġ= Ġ 4 0 0 . 0 čĊĠĠĠĠĠĠĠ Ġpopup . height Ġ= Ġ 3 0 0 . 0 čĊĠĠĠĠĠĠĠ Ġpopup . is Auto Fix Ġ= Ġtrue ; čĊĠĠĠĠĠĠĠ Ġpopup . is Auto Hide Ġ= Ġtrue ; čĊĠĠĠĠĠĠĠ Ġpopup . is Hide On Escape Ġ= Ġtrue ; čĊĠĠĠĠĠĠĠ Ġpopup Pane . border Ġ= ĠBorder ( Border Stroke ( Color . GRE Y , ĠBorder Stroke Style . SOLID , ĠCor ner Rad ii . EMPTY , ĠBorder Widths . DEFAULT )) čĊĠĠĠĠĠĠĠ Ġpopup . content . addAll ( new ) čĊĠĠĠĠĠĠĠ Ġpopup . show ( stage ) čĊĠĠĠĠĠĠĠ Ġval Ġclose : ĠButton Ġ= Ġnew . lookup ("# settings Done ") Ġas ĠButton čĊĠĠĠĠĠĠĠ Ġval Ġevent : ĠEventHandler < ActionEvent ?> Ġ= ĠEventHandler < ActionEvent ?> Ġ{ Ġpopup . hide () Ġ} čĊĠĠĠĠĠĠĠ Ġclose . on Action Ġ= Ġevent čĊĠĠĠ Ġ} č Ċ } čĊčĊčĊčĊ