/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 7 Ġ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 Ġcom . intellij . stats . experiment Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Json Syntax Exception Ċ import Ġcom . google . gson . internal . Linked TreeMap Ċ import Ġcom . intellij . ide . util . Properties Component Ċ import Ġcom . intellij . stats . network . assertNot ED T Ċ import Ġcom . intellij . stats . network . service . Request Service ĊĊ Ċ class ĠWeb Service Status Provider ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrequest Sender : ĠRequest Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexperiment Decision : ĠExperiment Decision Ċ ): ĠWeb Service Status Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠSTATUS _ URL : ĠString Ġ= Ġ" https :// www . jetbrains . com / config / features - service - status . json " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠG SON Ġ= ĠGson () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠS ALT Ġ= Ġ" completion . stats . experiment . salt " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEX PERIMENT _ VERSION _ KEY Ġ= Ġ" completion . stats . experiment . version " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPER FORM _ EXPERIMENT _ KEY Ġ= Ġ" completion . ml . perform . experiment " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġinfo : ĠExperiment Info Ġ= Ġload Info () ĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġserver Status Ġ= Ġ"" ĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġdata Server Url Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġexperiment Version (): ĠInt Ġ= Ġinfo . experiment Version ĊĊĠĠĠ Ġoverride Ġfun Ġdata Server Url (): ĠString Ġ= Ġdata Server Url ĊĊĠĠĠ Ġoverride Ġfun Ġis Experiment Go ing On Now (): ĠBoolean Ġ= Ġinfo . perform Experiment ĊĊĠĠĠ Ġoverride Ġfun Ġis Server Ok (): ĠBoolean Ġ= Ġserver Status . equals (" ok ", Ġignore Case Ġ= Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġis Experiment On Current IDE (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . perform Experiment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexperiment Decision . is Perform Experiment ( info . salt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Status Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġdata Server Url Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġassert Not ED T () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest Sender . get ( STATUS _ URL ) ĊĠĠĠĠĠĠĠ Ġif Ġ( response Ġ!= Ġnull Ġ&& Ġresponse . is OK ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġparse Server Response ( response . text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= Ġmap [" salt "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexperiment Version Ġ= Ġmap [" experiment Version "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperform Experiment Ġ= Ġmap [" perform Experiment "] ?. toString () Ġ?: Ġ" false " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( salt Ġ!= Ġnull Ġ&& Ġexperiment Version Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// should Ġbe ĠInt Ġalways ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloat Version Ġ= Ġexperiment Version . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= ĠExperiment Info ( float Version . toInt (), Ġsalt , Ġperform Experiment . to Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Info ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Status Ġ= Ġmap [" status "] ?. toString () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Server Url Ġ= Ġmap [" url For Zip Base 6 4 Content "] ?. toString () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Server Response ( responseText : ĠString ): ĠLinked TreeMap < *, Ġ*> Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠG SON . fromJson ( responseText , ĠLinked TreeMap :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Syntax Exception (" Expected Ġvalid ĠJSON Ġobject , Ġbut Ġreceived : Ġ$ responseText ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Info (): ĠExperiment Info Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Ġ( Properties Component . getInstance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠgetValue ( SAL T , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexperiment Version Ġ= Ġget Int ( EXPERIMENT _ VERSION _ KEY , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperform Experiment Ġ= Ġget Boolean ( PER FORM _ EXPERIMENT _ KEY , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExperiment Info ( experiment Version , Ġsalt , Ġperform Experiment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Info ( info : ĠExperiment Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Properties Component . getInstance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( SAL T , Ġinfo . salt ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( EXPERIMENT _ VERSION _ KEY , Ġinfo . experiment Version . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( PER FORM _ EXPERIMENT _ KEY , Ġinfo . perform Experiment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠExperiment Info ( var Ġexperiment Version : ĠInt , Ġvar Ġsalt : ĠString , Ġvar Ġperform Experiment : ĠBoolean )