/*
* TeleStax, Open Source Cloud Communications Copyright 2012.
* and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.mobicents.protocols.ss7.oam.common.jmx;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.log4j.Logger;
/**
*
* @author sergey vetyutnev
*
*/
public class MBeanHostImpl implements MBeanHost {
protected static final Logger logger = Logger.getLogger(MBeanHostImpl.class);
public static final String DEFAULT_DOMAIN_NAME = "org.mobicents.ss7";
private String agentId;
private int rmiPort;
private String domainName = DEFAULT_DOMAIN_NAME;
private MBeanServer mBeanServer;
private Registry reg;
private JMXConnectorServer cs;
protected ArrayList<ObjectName> lstRegisteredBeans = new ArrayList<ObjectName>();
public String getAgentId() {
return agentId;
}
public void setAgentId(String val) {
agentId = val;
}
public String getDomainName() {
return domainName;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
}
public int getRmiPort() {
return rmiPort;
}
public void setRmiPort(int val) {
rmiPort = val;
}
public MBeanServer getMBeanServer() {
return mBeanServer;
}
public void start() {
boolean servFound = false;
List<MBeanServer> servers = MBeanServerFactory.findMBeanServer(null);
if (servers != null && servers.size() > 0) {
for (MBeanServer server : servers) {
String defaultDomain = server.getDefaultDomain();
if (defaultDomain != null && defaultDomain.equals(agentId)) {
mBeanServer = server;
servFound = true;
logger.info(String.format("Found MBeanServer matching for agentId=%s", this.agentId));
} else {
logger.warn(String.format("Found non-matching MBeanServer with default domian = %s", defaultDomain));
}
}
}
if (!servFound) {
mBeanServer = ManagementFactory.getPlatformMBeanServer();
if (rmiPort > 0) {
try {
reg = LocateRegistry.createRegistry(rmiPort);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/server");
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);
cs.start();
} catch (RemoteException e) {
logger.error("RemoteException when creating and starting JMXConnectorServer", e);
} catch (MalformedURLException e) {
logger.error("MalformedURLException when creating and starting JMXConnectorServer", e);
} catch (IOException e) {
logger.error("IOException when creating and starting JMXConnectorServer", e);
}
}
}
}
public void stop() {
if (cs != null) {
try {
this.cs.stop();
} catch (IOException e) {
logger.error("IOException when stopping JMXConnectorServer", e);
}
cs = null;
}
for (ObjectName on : lstRegisteredBeans) {
try {
this.mBeanServer.unregisterMBean(on);
} catch (MBeanRegistrationException e) {
logger.error("MBeanRegistrationException when unregisterMBean", e);
} catch (InstanceNotFoundException e) {
logger.error("InstanceNotFoundException when unregisterMBean", e);
}
}
if (reg != null) {
try {
UnicastRemoteObject.unexportObject(reg, true);
} catch (NoSuchObjectException e) {
logger.error("NoSuchObjectException when unexportObject", e);
}
reg = null;
}
}
protected ObjectName createObjectName(MBeanLayer layer, MBeanType type, String name) throws MalformedObjectNameException {
return new ObjectName(this.domainName + ":layer=" + layer.getName() + ",type=" + type.getName() + ",name=" + name);
}
public void registerMBean(MBeanLayer layer, MBeanType type, String name, Object bean) {
if (mBeanServer != null) {
try {
ObjectName on = createObjectName(layer, type, name);
this.mBeanServer.registerMBean(bean, on);
lstRegisteredBeans.add(on);
if (logger.isInfoEnabled()) {
logger.info(String.format("Registered MBean with ObjectName=%s", on));
}
} catch (Exception e) {
logger.error(
String.format("Error while trying to regisetr MBean for Layer=%s Type=%s name=%s", layer, type, name),
e);
}
} else {
logger.error(String.format("mBeanServer is null. Cannot register MBean for Layer=%s Type=%s name=%s", layer, type,
name));
}
}
public Object unregisterMBean(MBeanLayer layer, MBeanType type, String name) {
Object bean = null;
if (mBeanServer != null) {
try {
ObjectName on = createObjectName(layer, type, name);
this.mBeanServer.unregisterMBean(on);
bean = lstRegisteredBeans.remove(on);
if (logger.isInfoEnabled()) {
logger.info(String.format("Unregistered MBean with ObjectName=%s", on));
}
} catch (Exception e) {
logger.error(
String.format("Error while trying to unregisetr MBean for Layer=%s Type=%s name=%s", layer, type, name),
e);
}
} else {
logger.error(String.format("mBeanServer is null. Cannot register MBean for Layer=%s Type=%s name=%s", layer, type,
name));
}
return bean;
}
}