/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . cache s Ċ Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . new vfs . File Attribute Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġcom . intellij . util . io . Data Input Output Util Ċ Ċ public Ġclass ĠFile Attribute ServiceImpl Ġ: ĠFile Attribute Service Ġ{ ĊĠĠĠ Ġval Ġattributes : ĠMutable Map < String , ĠFile Attribute > Ġ= ĠContainer Util . new Concurrent Map () ĊĊĠĠĠ Ġoverride Ġfun Ġregister ( id : ĠString , Ġversion : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattributes [ id ] Ġ= ĠFile Attribute ( id , Ġversion , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T : ĠEnum < T >> Ġwrite Attribute ( id : ĠString , Ġfile : ĠVirtual File , Ġvalue : ĠT ): ĠCached Attribute Data < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattribute Ġ= Ġattributes [ id ] Ġ?: Ġthrow ĠIllegalArgumentException (" Attribute Ġwith Ġ$ id Ġwasn 't Ġregistered ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠCached Attribute Data ( value , Ġtime Stamp Ġ= Ġfile . time Stamp ) ĊĊĠĠĠĠĠĠĠ Ġattribute . write Attribute ( file ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Input Output Util . write TIME ( it , Ġdata . time Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Input Output Util . write INT ( it , Ġdata . value ?. ordinal () Ġ?: Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T : ĠEnum < T >> Ġread Attribute ( id : ĠString , Ġfile : ĠVirtual File , Ġklass : ĠClass < T >): ĠCached Attribute Data < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattribute Ġ= Ġattributes [ id ] Ġ?: Ġthrow ĠIllegalArgumentException (" Attribute Ġwith Ġ$ id Ġwasn 't Ġregistered ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġattribute . read Attribute ( file ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġstream . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Stamp Ġ= ĠData Input Output Util . read TIME ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Value Ġ= ĠData Input Output Util . read INT ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . time Stamp Ġ== Ġtime Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Attribute Data ( deserialize EnumValue ( intValue , Ġklass ), Ġtime Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T : ĠEnum < T >> Ġdeserialize EnumValue ( i : ĠInt , Ġklass : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġklass . getMethod (" values ") ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmethod . invoke ( null ) Ġas ĠArray < T > ĊĠĠĠĠĠĠĠ Ġreturn Ġvalues [ i ] ĊĠĠĠ Ġ} Ċ } ĊĊ