use failure::ResultExt;
use j4rs::Instance;
use j4rs::InvocationArg;
use j4rs::Jvm;
use serde::de::DeserializeOwned;
use std::convert::TryFrom;
use super::ErrorKind;
use super::MBeanInfo;
use super::Result;
use super::constants::JMX_SERVICE_URL;
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Serialize, Deserialize)]
pub enum MBeanAddress {
Address(String),
ServiceUrl(String),
}
impl MBeanAddress {
pub fn address<S>(address: S) -> MBeanAddress
where S: Into<String>,
{
MBeanAddress::Address(address.into())
}
pub fn for_java(self, jvm: &Jvm) -> Result<Instance> {
let instance = match self {
MBeanAddress::Address(address) => {
let url = format!(
"service:jmx:rmi://{}/jndi/rmi://{}/jmxrmi",
address, address
);
jvm.create_instance(JMX_SERVICE_URL, &vec![InvocationArg::try_from(url)?])
.with_context(|_| ErrorKind::JavaCreateInstance(JMX_SERVICE_URL))?
},
MBeanAddress::ServiceUrl(url) => jvm.create_instance(
JMX_SERVICE_URL, &vec![InvocationArg::try_from(url)?]
).with_context(|_| ErrorKind::JavaCreateInstance(JMX_SERVICE_URL))?,
};
Ok(instance)
}
pub fn service_url<S>(service_url: S) -> MBeanAddress
where S: Into<String>,
{
MBeanAddress::ServiceUrl(service_url.into())
}
}
pub trait MBeanClientTrait {
fn get_attribute<S1, S2, T>(&self, mbean: S1, attribute: S2) -> Result<T>
where S1: Into<String>,
S2: Into<String>,
T: DeserializeOwned;
fn get_mbean_info<S>(&self, mbean: S) -> Result<MBeanInfo>
where S: Into<String>;
fn query_names<S1, S2>(&self, name: S1, query: S2) -> Result<Vec<String>>
where S1: Into<String>,
S2: Into<String>;
}