// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . service Container Ċ Ċ import Ġcom . intellij . diagnostic . Loading Phase Ċ import Ġcom . intellij . diagnostic . Plugin Exception Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . extensions . Plugin Descriptor Ċ import Ġcom . intellij . openapi . extensions . Plugin Id Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġorg . pic oc ont ainer . Component Adapter Ċ import Ġorg . pic oc ont ainer . P ico Container Ċ import Ġorg . pic oc ont ainer . P ico Visitor Ċ Ċ internal Ġabstract Ġclass ĠBase Component Adapter ( internal Ġval Ġcomponent Manager : ĠPlatform Component ManagerImpl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Descriptor : ĠPlugin Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ field : Volatile Ġprotected Ġvar Ġinitialized Instance : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġimplementation Class : ĠClass < *> ?) Ġ: ĠComponent Adapter Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġlogger < Base Component Adapter >() ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġinitializing Ġ= Ġfalse ĊĊĠ Ġfinal Ġoverride Ġfun Ġverify ( container : ĠP ico Container ) Ġ{} ĊĊĠ Ġfinal Ġoverride Ġfun Ġaccept ( visitor : ĠP ico Visitor ) Ġ{ ĊĠĠĠ Ġvisitor . visit Component Adapter ( this ) ĊĠ Ġ} ĊĊĠ Ġprotected Ġval Ġplugin Id : ĠPlugin Id ĊĠĠĠ Ġget () Ġ= Ġplugin Descriptor . plugin Id ĊĊĠ Ġprotected Ġabstract Ġval Ġimplementation ClassName : ĠString ĊĊĠ Ġprotected Ġopen Ġval Ġcreate If Container Disposed : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġfalse ĊĊĠ Ġ@ Synchron ized ĊĠ Ġfun Ġis Implementation Class Resolved () Ġ= Ġimplementation Class Ġ!= Ġnull ĊĊĠ Ġfinal Ġoverride Ġfun Ġget Component Implementation () Ġ= Ġget Implementation Class () ĊĊĠ Ġ@ Synchron ized ĊĠ Ġfun Ġget Implementation Class (): ĠClass < *> Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġimplementation Class ĊĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġimpl Class : ĠClass < *> Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠClass . forName ( implementation ClassName , Ġtrue , Ġplugin Descriptor . plugin ClassLoader ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠPlugin Exception (" Failed Ġto Ġload Ġclass : Ġ${ toString () }", Ġe , Ġplugin Descriptor . plugin Id ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġresult Ġ= Ġimpl Class ĊĠĠĠĠĠ Ġimplementation Class Ġ= Ġresult ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ@ Suppress (" Deprecated Callable Add Replace With ") ĊĠ Ġ@ Deprecated (" Do Ġnot Ġuse ") ĊĠ Ġfinal Ġoverride Ġfun Ġget Component Instance ( container : ĠP ico Container ): ĠAny ? Ġ{ ĊĠĠĠ Ġ// LOG . error (" Use ĠgetInstance () Ġinstead ") ĊĠĠĠ Ġreturn ĠgetInstance ( component Manager ) ĊĠ Ġ} ĊĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġfun Ġ< T Ġ: ĠAny > ĠgetInstance ( component Manager : ĠPlatform Component ManagerImpl , Ġcreate IfNeeded : ĠBoolean Ġ= Ġtrue , Ġindicator : ĠProgress Indicator ? Ġ= Ġnull ): ĠT ? Ġ{ ĊĠĠĠ Ġ// Ġcould Ġbe Ġcalled Ġduring Ġsome Ġcomponent . dispose () Ġcall , Ġin Ġthis Ġcase Ġwe Ġdon 't Ġattempt Ġto Ġinstantiate ĊĠĠĠ Ġvar Ġinstance Ġ= Ġinitialized Instance Ġas ĠT ? ĊĠĠĠ Ġif Ġ( instance Ġ!= Ġnull Ġ|| Ġ! create IfNeeded Ġ|| Ġ(! create If Container Disposed Ġ&& Ġcomponent Manager . is Disposed )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLoading Phase . COMPONENT _ REGISTER ED . assert At Least () ĊĊĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠ Ġinstance Ġ= Ġinitialized Instance Ġas ĠT ? ĊĠĠĠĠĠ Ġif Ġ( instance Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( initial izing ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . error ( Plugin Exception (" Cyc lic Ġservice Ġinitialization : Ġ${ toString () }", Ġplugin Id )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġinitializing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġdo CreateInstance ( component Manager , Ġindicator ) ĊĠĠĠĠĠĠĠ Ġinitialized Instance Ġ= Ġinstance ĊĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġinitializing Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġabstract Ġfun Ġ< T Ġ: ĠAny > Ġdo CreateInstance ( component Manager : ĠPlatform Component ManagerImpl , Ġindicator : ĠProgress Indicator ?): ĠT ĊĊĠ Ġ@ Synchron ized ĊĠ Ġfun Ġ< T Ġ: ĠAny > Ġreplace Instance ( instance : ĠT , Ġparent Disposable : ĠDis posable ?): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġold Ġ= Ġinitialized Instance ĊĠĠĠ Ġinitialized Instance Ġ= Ġinstance ĊĊĠĠĠ Ġif Ġ( parent Disposable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠDis poser . register ( parent Disposable , ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( initialized Instance Ġ=== Ġinstance Ġ&& Ġinstance Ġis ĠDis posable Ġ&& Ġ! Dis poser . is Disposed ( instance )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( instance ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġinitialized Instance Ġ= Ġold ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġreturn Ġold Ġas ĠT ? ĊĠ Ġ} Ċ }