package Ġcom . trad wang . common . cache Ċ Ċ import Ġandroid . util . Base 6 4 Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . trad wang . common . base . App Ċ import Ġcom . trad wang . common . utils . log Ċ import Ġjava . io . File Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security . Message Digest Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠProject Name ĠĠ ĠCommon Study Ċ Ġ* Ġ@ author Ġ Ġtrad wang Ċ Ġ* Ġ@ since ĠĠĠ 1 8 - 1 1 - 5 ĠĠ Ġä¸ĭåįĪ 2 : 0 3 . Ċ Ġ* Ġ@ email Ġ Ġw ang xiao jun @ b ian la . cn Ċ Ġ* Ġ@ version ĠĠ 0 . 1 Ċ Ġ* Ġ@ describe Ċ Ġ* Ġ@ param ĠT ĠéľĢè¦ģ ç¼ĵåŃĺ çļĦ ç±»åŀĭ Ċ Ġ* Ġ@ property Ġtype Token Ġ çĶ¨äºİ gson è§£æŀĲ Ċ Ġ* Ġ@ property Ġname Ġ ç¼ĵåŃĺ åĲįç§° èĭ¥ null åĪĻ çĶ¨ å±ŀæĢ§ åĲį ç¼ĵåŃĺ Ċ Ġ* Ġ@ property Ġpath Ġ Ġ ç¼ĵåŃĺ çļĦ è·¯å¾Ħ Ċ Ġ* Ġ@ property Ġweak Memory Cache Ġ ç¼ĵåŃĺ Ċ Ġ* Ġ@ property Ġgson Ġgson Ċ Ġ* Ġ@ constructor Ċ Ġ*/ Ċ class ĠJson Cache < T >( private Ġval Ġtype Token : ĠType Token < T >, Ġprivate Ġval Ġpath : ĠString ? Ġ= Ġnull , Ġprivate Ġval Ġname : ĠString ? Ġ= Ġnull ) Ġ: ĠRead Write Property < Any ?, ĠT ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġweak Memory Cache : ĠWeak Reference < T >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġgson Ġby Ġlazy Ġ{ ĠGson () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache ( property . name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Cache ( property . name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Cache ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ç¼ĵåŃĺ æķ°æį® ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġ ç¼ĵåŃĺ åĲįç§° ĊĠĠĠĠ Ġ* Ġ@ return ĠT ? Ġæķ°æį® æºĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġget Cache ( name : ĠString ): ĠT ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġweak Memory Cache ?. get () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠgetBy Disk ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak Memory Cache Ġ= ĠWeak Reference ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ ç¼ĵåŃĺ ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġ ç¼ĵåŃĺ åĲįç§° ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠT ? Ġæķ°æį® æºĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġset Cache ( name : ĠString , Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġweak Memory Cache Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweak Memory Cache Ġ= ĠWeak Reference ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset To Disk ( name , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¼ĵåŃĺ åĪ° ç£ ģ çĽĺ ä¸Ĭ ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠString ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠT ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġset To Disk ( name : ĠString , Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencode By MD 5 ( name )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffered Writer Ġ= Ġget Cache File ( it ). buffered Writer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Writer . write ( encode By Base 6 4 ( gson . toJson ( value ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Writer . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Writer . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . toString (). log () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ ç£ ģ çĽĺ ä¸Ĭ èİ·åıĸ æķ°æį® ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġ Ġ ç¼ĵåŃĺ çļĦ åĲįåŃĹ ĊĠĠĠĠ Ġ* Ġ@ return ĠT ? Ġèİ·åıĸ åĪ° çļĦæķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun ĠgetBy Disk ( name : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencode By MD 5 Ġ= Ġencode By MD 5 ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( encode By MD 5 Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġget Cache File ( encode By MD 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson < T >( decode By Base 6 4 ( file . read Text ()), Ġtype Token . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . toString (). log () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠçĶ¨ md 5 çļĦ ç®Ĺæ³ķ è¿Ľè¡Į åĬłå¯Ĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġencode By MD 5 ( plain Text : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Bytes Ġ= ĠMessage Digest . getInstance (" md 5 "). digest ( plain Text . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 6 è¿ĽåĪ¶ æķ°åŃĹ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmd 5 code Ġ= ĠBigInteger ( 1 , Ġsecret Bytes ). toString ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ çĶŁæĪĲ æķ°åŃĹ æľª æ»¡ 3 2 ä½į ï¼Į éľĢè¦ģ åīį éĿ¢ è¡¥ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 3 2 Ġ- Ġmd 5 code . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 code Ġ= Ġ" 0 $ md 5 code " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmd 5 code . toUpperCase () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . toString (). log () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġbase 6 4 åĬłå¯Ĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġencode By Base 6 4 ( plain Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( Base 6 4 . encode ( plain Text . toByteArray ( Charset . default Charset ()), ĠBase 6 4 . URL _ SAFE ), ĠCharset . default Charset ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġbase 6 4 è§£ å¯Ĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdecode By Base 6 4 ( plain Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( Base 6 4 . decode ( plain Text , ĠBase 6 4 . URL _ SAFE ), ĠCharset . default Charset ()); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ç¼ĵåŃĺ çļĦ è·¯å¾Ħ ĊĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġ ç¼ĵåŃĺ æĸĩä»¶ åĲį ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¼ĵåŃĺ çļĦ File å¯¹è±¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Cache File ( fileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetDefault Cache File ( fileName ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( path . trim (). endsWith ("/", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("$ path $ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("$ path /$ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ é»ĺè®¤ çļĦ ç¼ĵåŃĺ è·¯å¾Ħ ĊĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġ ç¼ĵåŃĺ æĸĩä»¶ åĲį ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¼ĵåŃĺ çļĦ File å¯¹è±¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetDefault Cache File ( fileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Dir Ġ= ĠFile ( files Path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! files Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( files Dir , ĠfileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġfiles Path : ĠString ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Dir Ġ= ĠFile ( App . getInstance (). cacheDir , Ġ" cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! files Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Path Ġ= Ġfiles Dir . absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmk Dir () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Dir Ġ= ĠFile ( App . getInstance (). cacheDir , Ġ" cache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! files Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Path Ġ= Ġfiles Dir . absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Synchron ized ĊĠĠĠĠĠĠĠ Ġfun Ġclean Default Cache () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( files Path ). delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmk Dir () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }