package Ġcn . yi ig ux ing . plugin . translate . trans Ċ Ċ import Ġcn . yi ig ux ing . plugin . translate . Settings Ċ import Ġcn . yi ig ux ing . plugin . translate . Settings ChangeListener Ċ import Ġcn . yi ig ux ing . plugin . translate . util .* Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . components . Service Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . util . messages . Message Bus Connection ĊĊ Ċ /** Ċ Ġ* ĠTranslate Service Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠYii . G ux ing Ġon Ġ 2 0 1 7 / 1 0 / 3 0 Ċ Ġ*/ Ċ class ĠTranslate Service Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġtranslator : ĠTrans lator Ġ= ĠDEFAULT _ TRANSL ATOR ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠL ru Cache < CacheKey , ĠTranslation >( 5 0 0 ) ĊĊĠĠĠ Ġprivate Ġvar Ġmessage Bus : ĠMessage Bus Connection ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable Map Of < Listener Key , ĠMutable Set < Translate Listener >>() ĊĊĠĠĠ Ġfun Ġset Translator ( translator Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġif Ġ( translator Id Ġ!= Ġtranslator . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslator Ġ= Ġwhen Ġ( translator Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠYou dao Translator . TRANSL ATOR _ ID Ġ-> ĠYou dao Translator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB aid u Translator . TRANSL ATOR _ ID Ġ-> ĠB aid u Translator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDEFAULT _ TRANSL ATOR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Trans l ators (): ĠList < Translator > Ġ= ĠlistOf ( Google Translator , ĠYou dao Translator , ĠB aid u Translator ) ĊĊĠĠĠ Ġfun Ġget Cache ( text : ĠString , Ġsrc Lang : ĠLang , Ġtarget Lang : ĠLang ): ĠTranslation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġreturn Ġcache [ CacheKey ( text , Ġsrc Lang , Ġtarget Lang , Ġtranslator . id )] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Caches () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġcache . ev ict All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( text : ĠString , Ġsrc Lang : ĠLang , Ġtarget Lang : ĠLang , Ġlistener : ĠTranslate Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġcache [ CacheKey ( text , Ġsrc Lang , Ġtarget Lang , Ġtranslator . id )] ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Success ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠListener Key ( text , Ġsrc Lang , Ġtarget Lang ) ĊĠĠĠĠĠĠĠ Ġlisteners [ key ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlisteners [ key ] Ġ= Ġmutable Set Of ( listener ) ĊĊĠĠĠĠĠĠĠ Ġexecute On P ooled Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( translator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate ( text , Ġsrc Lang , Ġtarget Lang ). let Ġ{ Ġtranslation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation . cache ( text , Ġsrc Lang , Ġtarget Lang , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Later ( Modal ity State . any ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . run ( key ) Ġ{ ĠonSuccess ( translation ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTranslate Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . w (" translate ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Later ( Modal ity State . any ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . run ( key ) Ġ{ ĠonError ( e . message , Ġe ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠMutable Map < Listener Key , ĠMutable Set < Translate Listener >> . run ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠListener Key , Ġaction : ĠTranslate Listener . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove ( key )?. forEach Ġ{ Ġit . action () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTranslation . cache ( text : ĠString , Ġsrc Lang : ĠLang , Ġtarget Lang : ĠLang , Ġtranslator Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġcache ĊĠĠĠĠĠĠĠ Ġcache . put ( CacheKey ( text , Ġsrc Lang , Ġtarget Lang , Ġtranslator Id ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Lang . AUTO Ġ== Ġsrc Lang ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( CacheKey ( text , Ġthis . src Lang , Ġtarget Lang , Ġtranslator Id ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Lang . AUTO Ġ== Ġtarget Lang ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( CacheKey ( text , Ġsrc Lang , Ġthis . target Lang , Ġtranslator Id ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Lang . AUTO Ġ== Ġsrc Lang Ġ&& ĠLang . AUTO Ġ== Ġtarget Lang ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( CacheKey ( text , Ġthis . src Lang , Ġthis . target Lang , Ġtranslator Id ), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstall () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġif Ġ( message Bus Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Translator ( Settings . instance . translator ) ĊĠĠĠĠĠĠĠ Ġmessage Bus Ġ= ĠApplication Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getApplication () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message Bus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe ( Settings ChangeListener . TOPIC , Ġobject Ġ: ĠSettings ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Translator Changed ( settings : ĠSettings , Ġtranslator Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Translator ( translator Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuninstall () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Thread () ĊĠĠĠĠĠĠĠ Ġmessage Bus ?. disconnect () ĊĠĠĠĠĠĠĠ Ġmessage Bus Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠListener Key ( val Ġtext : ĠString , Ġval Ġsrc Lang : ĠLang , Ġval Ġtarget Lang : ĠLang ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ TRANSL ATOR : ĠTrans lator Ġ= ĠGoogle Translator ĊĊĠĠĠĠĠĠĠ Ġval Ġinstance : ĠTranslate Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠService Manager . getService ( Translate Service :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLogger . getInstance ( Translate Service :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck Thread () Ġ= Ġcheck Dispatch Thread ( Translate Service :: class . java ) ĊĠĠĠ Ġ} Ċ }