package Ġcom . uber to b . rest 4 sf tp . ftp Ċ Ċ import Ġcom . uber to b . rest 4 sf tp . http . Un author ised Exception Ċ import Ġcom . uber to b . rest 4 sf tp . model .* Ċ import Ġorg . apache . commons . net . Print Command Listener Ċ import Ġorg . apache . commons . net . ftp . FTP Client Ċ import Ġorg . apache . commons . net . ftp . FTP File Ċ import Ġorg . apache . commons . net . ftp . FTP Reply Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . time . Duration Ċ Ċ class ĠApache Common s F tp Client ( ĊĠĠĠ Ġprivate Ġval Ġremote Host : ĠRemote Host , ĊĠĠĠ Ġprivate Ġval Ġtimeout : ĠDuration , ĊĠĠĠ Ġprivate Ġval Ġtemp Extension : ĠString Ġ= Ġ". io " Ċ ) Ġ: ĠSimple Remote Client Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġftp Ġ= ĠFTP Client () ĊĊĠĠĠ Ġfun Ġwith Debug () Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġftp . add Protocol Command Listener ( Print Command Listener ( PrintWriter ( System . out ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconnect () Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġftp . setData Timeout ( timeout . to Millis (). toInt ()) ĊĠĠĠĠĠĠĠ Ġcheck (" FTP Ġserver Ġrefused Ġconnection .") Ġ{ Ġftp . connect ( remote Host . host , Ġremote Host . port ) Ġ} ĊĠĠĠĠĠĠĠ Ġcheck (" Invalid Ġlogin .") Ġ{ Ġftp . login ( remote Host . userName , Ġremote Host . password ) Ġ} ĊĠĠĠĠĠĠĠ Ġcheck (" FTP Ġserver Ġnot Ġable Ġto Ġpassive Ġmode .") Ġ{ Ġftp . enter Local Pass ive Mode () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ftp . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġftp . logout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġftp . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Connected (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġftp . isConnected ĊĊĠĠĠ Ġoverride Ġfun Ġlist Files ( folder Path : ĠString , Ġfilter : ĠFilter ): ĠList < FileSystem Element >? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( ftp . change Working Directory ( folder Path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġftp . list Files ( filter . pattern ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . to FileSystem Element ( folder Path )?. let Ġ{ Ġfilter . accept ( it ) Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to FileSystem Elements ( folder Path ) ĊĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Folder ( folder Path : ĠString ): ĠBoolean Ġ= Ġftp . make Directory ( folder Path ) ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Folder ( folder Path : ĠString ): ĠBoolean Ġ= Ġftp . remove Directory ( folder Path ) ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve File ( folder Path : ĠString , ĠfileName : ĠString ): ĠByteArray ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( ftp . change Working Directory ( folder Path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġftp . retrieve FileStream ( fileName )?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġupload File ( folder Path : ĠString , ĠfileName : ĠString , Ġupload : ĠInputStream ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( ftp . change Working Directory ( folder Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġftp . store File ( fileName . temp Ext (), Ġupload ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġftp . status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġftp . rename ( fileName . temp Ext (), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġrename File ( folder Path : ĠString , Ġold FileName : ĠString , Ġnew FileName : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġftp . rename ("$ folder Path /$ old FileName ", Ġ"$ folder Path /$ new FileName ") ĊĊĠĠĠ Ġprivate Ġfun ĠString . temp Ext () Ġ= Ġthis Ġ+ Ġtemp Extension ĊĊĠĠĠ Ġoverride Ġfun Ġdelete File ( folder Path : ĠString , ĠfileName : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġftp . change Working Directory ( folder Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġftp . delete File ( fileName ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġcheck ( error Msg : ĠString , Ġblock : Ġ() Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġblock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! FTP Reply . is Positive Completion ( ftp . reply Code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( error Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn author ised Exception ( message Ġ= Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn author ised Exception ( cause Ġ= Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun ĠArray < FTP File >. to FileSystem Elements ( folder Path : ĠString ): ĠList < FileSystem Element > Ġ= ĊĠĠĠ Ġmap NotNull Ġ{ Ġftp File Ġ-> Ġftp File . to FileSystem Element ( folder Path ) Ġ} Ċ Ċ private Ġfun ĠFTP File . to FileSystem Element ( folder Path : ĠString ): ĠFileSystem Element ? Ġ= ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis File Ġ-> ĠFileInfo ( name , Ġtimestamp . to Instant (), Ġsize , Ġfolder Path ) ĊĠĠĠĠĠĠĠ Ġis Directory Ġ-> ĠFolder Info ( name , Ġtimestamp . to Instant (), Ġfolder Path ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ}