package Ġexporter . j mx Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjavax . management .* Ċ import Ġjavax . management . remote . J MX Connector Ċ import Ġjavax . management . remote . J MX Connector Factory Ċ import Ġjavax . management . remote . J MX Service URL Ċ Ċ class ĠM Bean Connector ( ĊĠĠĠ Ġval Ġhost : ĠString , ĊĠĠĠ Ġval Ġport : ĠInt , ĊĠĠĠ Ġusername : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġpassword : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠAuto Closeable , ĠNotification Listener Ġ{ ĊĠĠĠ Ġval Ġenvironment Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠ Ġvar Ġconnector : ĠJ MX Connector ĊĠĠĠ Ġvar Ġconnected : ĠBoolean ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġusername ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment [ J MX Connector . CRED ENTIAL S ] Ġ= ĠarrayOf ( username , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Connecting Ġto ĠJ MX Ġservice Ġat Ġ$ host :$ port ") ĊĊĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġconnector Ġ= Ġconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnect (): ĠJ MX Connector Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconn Ġ= ĠJ MX Connector Factory . new J MX Connector ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ MX Service URL (" service : j mx : rmi :/// jn di / rmi :// $ host :$ port / j mx rmi "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġconn . add Connection Notification Listener ( this , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġconn . connect () ĊĠĠĠĠĠĠĠ Ġconn ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( io e . cause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġjavax . naming . Service Unavailable Exception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠM Bean Connector Exception ( CONNECT _ ERR _ TEMPLATE . format ( host , Ġport ), Ġio e . cause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠM Bean Connector Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġopen ĠJ MX Ġconnector : Ġ${ io e . localized Message }", Ġio e ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Re connecting Ġto ĠJ MX Ġservice Ġat Ġ$ host :$ port ") ĊĠĠĠĠĠĠĠ Ġconnector Ġ= Ġconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Notification ( notification : ĠNotification , Ġ_ hand back : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( notification . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ OPEN ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" J MX Ġconnection Ġto Ġ$ host :$ port Ġis Ġopen ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ CLOSED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . remove Connection Notification Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" J MX Ġconnection Ġto Ġ$ host :$ port Ġis Ġclosed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery M Beans ( name : ĠObject Name ): ĠMutable Set < Object Instance > Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! connected ) Ġreconnect () ĊĊĠĠĠĠĠĠĠ Ġconnector . m Bean Server Connection . query M Beans ( name , Ġnull ) ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠM Bean Connector Exception ( DIS CONNECT _ ERR _ TEMPLATE . format ( host , Ġport ), Ġio e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget MBean Info ( name : ĠObject Name ): ĠM Bean Info Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! connected ) Ġreconnect () ĊĊĠĠĠĠĠĠĠ Ġconnector . m Bean Server Connection . getM Bean Info ( name ) ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠM Bean Connector Exception ( DIS CONNECT _ ERR _ TEMPLATE . format ( host , Ġport ), Ġio e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Attributes ( name : ĠObject Name , Ġattribute Names : ĠList < String >): ĠAttribute List Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! connected ) Ġreconnect () ĊĊĠĠĠĠĠĠĠ Ġconnector . m Bean Server Connection . getAttributes ( name , Ġattribute Names . to Typed Array ()) ĊĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠM Bean Connector Exception ( DIS CONNECT _ ERR _ TEMPLATE . format ( host , Ġport ), Ġio e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnector . remove Connection Notification Listener ( this ) ĊĠĠĠĠĠĠĠ Ġconnector . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( MBean Connector :: class . java ) !! ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ OPEN ED Ġ= Ġ" j mx . remote . connection . opened " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ CLOSED Ġ= Ġ" j mx . remote . connection . closed " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONNECT _ ERR _ TEMPLATE Ġ= Ġ" Could Ġnot Ġconnect Ġto ĠJ MX Ġservice Ġat Ġ% s :% d " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDIS CONNECT _ ERR _ TEMPLATE Ġ= Ġ" Could Ġnot Ġcommunicate Ġwith ĠJ MX Ġservice Ġat Ġ% s :% d " ĊĠĠĠ Ġ} Ċ } Ċ