/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . j ps . incremental Ċ Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . kotlin . metadata . jvm . de serialization . Jvm Byte code Binary Version Ċ import Ġorg . jetbrains . kotlin . metadata . jvm . de serialization . Jvm Metadata Version Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠMan ages Ġfiles Ġwith Ġactual Ġversion Ġ[ load Actual ] Ġand Ġprovides Ġexpected Ġversion Ġ[ expected ]. Ċ Ġ* ĠBased Ġon Ġthat Ġactual Ġand Ġexpected Ġversions Ġ[ Cache Status ] Ġcan Ġbe Ġcalculated . Ċ Ġ* ĠThis Ġcan Ġbe Ġdone Ġby Ġconstructing Ġ[ Cache Attributes Diff ] Ġand Ġcalling Ġ[ Cache Attributes Diff . status ]. Ċ Ġ* ĠBased Ġon Ġthat Ġstatus Ġsystem Ġmay Ġperform Ġrequired Ġactions Ġ( i . e . Ġrebuild Ġsomething , Ġclearing Ġcaches , Ġetc ... ). Ċ Ġ*/ Ċ class ĠCache Version Manager ( ĊĠĠĠ Ġprivate Ġval Ġversion File : ĠFile , ĊĠĠĠ Ġexpected Own Version : ĠInt ? Ċ ) Ġ: ĠCache Attributes Manager < Cache Version > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġexpected : ĠCache Version ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( expected Own Version Ġ== Ġnull ) Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĠCache Version ( expected Own Version , ĠJ vm Byte code Binary Version . INSTANCE , ĠJ vm Metadata Version . INSTANCE ) ĊĊĠĠĠ Ġoverride Ġfun Ġload Actual (): ĠCache Version ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ(! version File . exists ()) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCache Version ( version File . read Text (). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Version ( values : ĠCache Version ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( values Ġ== Ġnull ) Ġversion File . delete () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion File . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion File . write Text ( values . intValue . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Test Only ĊĠĠĠ Ġval Ġversion File ForTesting : ĠFile ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġversion File Ċ } Ċ Ċ fun ĠCache Version ( own : ĠInt , Ġbytecode : ĠJ vm Byte code Binary Version , Ġmetadata : ĠJ vm Metadata Version ): ĠCache Version Ġ{ ĊĠĠĠ Ġrequire ( own Ġin Ġ 0 Ġuntil ĠInt . MAX _ VALUE Ġ/ Ġ 1 0 0 0 0 0 0 ) ĊĠĠĠ Ġrequire ( byte code . major Ġin Ġ 0 .. 9 ) ĊĠĠĠ Ġrequire ( byte code . minor Ġin Ġ 0 .. 9 ) ĊĠĠĠ Ġrequire ( metadata . major Ġin Ġ 0 .. 9 ) ĊĠĠĠ Ġrequire ( metadata . minor Ġin Ġ 0 .. 9 9 ) ĊĊĠĠĠ Ġreturn ĠCache Version ( ĊĠĠĠĠĠĠĠ Ġown Ġ* Ġ 1 0 0 0 0 0 0 Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytecode . major Ġ* Ġ 1 0 0 0 0 Ġ+ Ġbytecode . minor Ġ* Ġ 1 0 0 Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . major Ġ* Ġ 1 0 0 0 Ġ+ Ġmetadata . minor ĊĠĠĠ Ġ) Ċ } Ċ Ċ data Ġclass ĠCache Version ( val Ġint Value : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġown : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġint Value Ġ/ Ġ 1 0 0 0 0 0 0 ĊĊĠĠĠ Ġval Ġbytecode : ĠJ vm Byte code Binary Version ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠJ vm Byte code Binary Version ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Value Ġ/ Ġ 1 0 0 0 0 Ġ% Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Value Ġ/ Ġ 1 0 0 Ġ% Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġmetadata : ĠJ vm Metadata Version ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠJ vm Metadata Version ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Value Ġ/ Ġ 1 0 0 0 Ġ% Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Value Ġ/ Ġ 1 Ġ% Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Cache Version ( cache s : Ġ$ own , Ġbytecode : Ġ$ byte code , Ġmetadata : Ġ$ metadata )" Ċ }