/*
* Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved.
WSO2 Inc. licenses this file to you 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 org.wso2.carbon.analytics.common.jmx.agent;
import org.apache.log4j.Logger;
import org.wso2.carbon.analytics.common.jmx.agent.exceptions.JmxConnectionException;
import org.wso2.carbon.analytics.common.jmx.agent.exceptions.JmxMBeanException;
import org.wso2.carbon.analytics.common.jmx.agent.profiles.Profile;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class JmxAgent {
private static Logger log = Logger.getLogger(JmxAgent.class);
private Profile profile;
public Profile getProfile() {
return profile;
}
public JmxAgent(Profile profile) {
this.profile = profile;
}
public JMXConnector openJmxConnection() throws JmxConnectionException {
if (profile == null) {
log.error("Profile is null.");
throw new JmxConnectionException("Profile is null.");
}
if (log.isDebugEnabled()) {
log.debug("Prepare open new jmx connection to " + profile.getUrl());
}
JMXConnector jmxConnector = null;
try {
JMXServiceURL jmxServiceURL = new JMXServiceURL(profile.getUrl());
Map<String, String[]> map = new HashMap<String, String[]>(1);
map.put(JmxConstant.JMX_REMOTE_CREDENTIALS_STR,
new String[]{profile.getUserName(), profile.getPass()});
jmxConnector = JMXConnectorFactory.connect(jmxServiceURL, map);
if (log.isDebugEnabled()) {
log.debug("Successfully created for Jmx connection to " + profile.getUrl());
}
} catch (IOException ex) {
log.error("Unable to create JMX connection.", ex);
throw new JmxConnectionException("Unable to create JMX connection.", ex);
}
return jmxConnector;
}
public void closeJmxConnection(JMXConnector jmxConnector) throws JmxConnectionException {
if (jmxConnector != null) {
try {
jmxConnector.close();
if (log.isDebugEnabled()) {
log.debug("Successfully close the jmx connection to" + ((profile != null) ? profile.getUrl() : ""));
}
} catch (IOException e) {
log.error("Unable to close JMX connection.", e);
throw new JmxConnectionException("Unable to close JMX connection", e);
}
}
}
public Object getAttribute(JMXConnector jmxConnector, String mBean, String attr)
throws JmxMBeanException {
if (jmxConnector != null) {
try {
MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
ObjectName mBeanName = new ObjectName(mBean);
if (mBeanServerConnection.isRegistered(mBeanName)) {
if (log.isDebugEnabled()) {
log.debug("Found MBean:" + mBean);
}
return mBeanServerConnection.getAttribute(mBeanName, attr);
} else {
if (log.isDebugEnabled()) {
log.debug("MBean is not registered " + mBean);
}
}
} catch (IOException e) {
log.error("Unable to open MBean server connection", e);
throw new JmxMBeanException("Unable to open MBean server connection", e);
} catch (MalformedObjectNameException e) {
log.error("Object name issue", e);
throw new JmxMBeanException("Object name issue", e);
} catch (AttributeNotFoundException e) {
log.error("Cannot find the mbean", e);
throw new JmxMBeanException("Cannot find the mbean", e);
} catch (MBeanException e) {
log.error("MBean exception", e);
throw new JmxMBeanException("MBean exception", e);
} catch (ReflectionException e) {
log.error("Reflection exception", e);
throw new JmxMBeanException("Reflection exception", e);
} catch (InstanceNotFoundException e) {
log.error("Instance not found exception", e);
throw new JmxMBeanException("Instance not found exception", e);
}
}
return null;
}
}