package Ġme . ak h sa ul . common . tools Ċ Ċ import Ġme . ak h sa ul . common . logger Ċ import Ġme . ak h sa ul . common . math . DataSize Ċ import Ġme . ak h sa ul . common . notNull Ċ import Ġme . ak h sa ul . common . with Lock Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Link Option Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . attribute . File Owner Attribute View Ċ import Ġjava . nio . file . attribute . File Time Ċ import Ġjava . nio . file . attribute . User Principal Ċ Ċ /** Ċ Ġ* ĠTODO Ġchange Ġevery Ġvariable Ġinto Ġfunction Ċ Ġ* ĠĠ Ġwe Ġshould Ġnot Ġstore Ġvalue !! Ċ Ġ* ĠĠ Ġbecause , Ġsometimes Ġfile Ġor Ġdirectory Ġcan Ġbe Ġdeleted Ġby Ġanother Ġprocess Ċ Ġ* ĠĠ Ġthat Ġwill Ġmake Ġdifferent Ġattribute Ġ( in consistent ) Ċ Ġ* Ġ*/ Ċ @ Suppress (" unused ") Ċ class ĠAttribute Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġpath : ĠPath , ĊĠĠĠ Ġprivate Ġval Ġfollow Link : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( data : ĠData , Ġfollow Link : ĠBoolean Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis ( data . path , Ġfollow Link ) ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( file : ĠFile , Ġfollow Link : ĠBoolean Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis ( file . to Path (), Ġfollow Link ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġlogger Ġ{ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġprovider Ġ= Ġpath . file System . provider () ĊĠĠĠ Ġprivate Ġval Ġsupported Ġ= Ġpath . file System . supported File Attribute Views () ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġis Pos ix Ġ= Ġsupported . contains (" posix ") ĊĊĠĠĠ Ġval Ġis File ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic ( false , Ġ" is Regular File ") ĊĊĠĠĠ Ġval Ġis Directory ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic ( false , Ġ" isDirectory ") ĊĊĠĠĠ Ġval Ġis Symbolic Link ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic ( false , Ġ" is Symbolic Link ") ĊĊĠĠĠ Ġval Ġcreation Time ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic < File Time >( File Time . from Millis (- 1 ), Ġ" creation Time ") ĊĊĠĠĠ Ġval Ġlast Access Time ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic < File Time >( File Time . from Millis (- 1 ), Ġ" last Access Time ") ĊĊĠĠĠ Ġval Ġlast Modified Time ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbasic < File Time >( File Time . from Millis (- 1 ), Ġ" lastModified Time ") ĊĊĠĠĠ Ġval Ġowner : ĠUser Principal ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( follow Link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . getFile Attribute View ( path , ĠFile Owner Attribute View :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . getFile Attribute View ( path , ĠFile Owner Attribute View :: class . java , ĠLink Option . NO FOLLOW _ LIN KS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. owner ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġowner Ġname , Ġcan Ġbe Ġempty Ġstring ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġval Ġowner Name ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġowner ?. name Ġ?: Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġ[ get ] Ġfunction Ġreturn Ġa Ġnull Ġthen Ġfile Ġor Ġdirectory Ġis Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġval Ġis Exist : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget < Any >(" * ") Ġ!= Ġnull ĊĊĠĠĠ Ġval Ġis ReadOnly ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget (" dos : readonly ") Ġ?: Ġfalse ĊĊĠĠĠ Ġval Ġis Hidden ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget (" dos : hidden ") Ġ?: Ġfalse ĊĊĠĠĠ Ġval Ġis System ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget (" dos : system ") Ġ?: Ġfalse ĊĊĠĠĠ Ġval Ġis Archive ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget (" dos : archive ") Ġ?: Ġfalse ĊĊĠĠĠ Ġ@ Suppress (" unchecked _ cast ") ĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġget ( attr : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( follow Link ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . read Attributes ( path , Ġattr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . read Attributes ( path , Ġattr , ĠLink Option . NO FOLLOW _ LIN KS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġattr . substring ( attr . indexOf (": ") Ġ+ Ġ 1 , Ġattr . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ key ] Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Exception Ġignored , Ġwhen Ġget Ġattribute Ġof Ġ$ path , Ġname : Ġ'$ attr '. ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġbasic ( default : ĠT , Ġattr : ĠString ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Pos ix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" posix :$ attr ") Ġ?: Ġdefault ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" basic :$ attr ") Ġ?: Ġdefault ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ size : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġsize ( recursive : ĠBoolean Ġ= Ġfalse ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ size Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ size Ġ= Ġwith Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ size Ġ?: Ġif Ġ( isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbasic ( 0 L , Ġ" size ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recursive Ġ&& Ġis Directory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcounted Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData ( path ). walk ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġenter Ġtrash Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter Ġ= Ġ{ Ġ! it . is Trash Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġexception Ġthen Ġset Ġcounted Ġto Ġzero ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġ_, Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Exception Ġignored , Ġwhen Ġcounting Ġfile Ġsize .", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Set Ġ' count ed ' Ġinto Ġzero .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounted Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ walk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwalk Ġfunction Ġwill Ġreturn Ġfile Ġor Ġdirectory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġprocess Ġif Ġit Ġis Ġa Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounted Ġ+= Ġit . size ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġcounted Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcan Ġbe Ġzero Ġor Ġmore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnot Null (_ size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ size Str : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġreadable Size ( recursive : ĠBoolean Ġ= Ġfalse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ size Str Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ size Str Ġ= Ġwith Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ size Str Ġ?: ĠData Size ( size ( recursive )). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnot Null (_ size Str ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Attribute ( path ='$ path ', ĠhashCode =${ hashCode () })" ĊĠĠĠ Ġ} Ċ }