/*
* 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.tools.simulator;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMISocketFactory;
import java.rmi.server.UnicastRemoteObject;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
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.mobicents.protocols.ss7.tools.simulator.level1.DialogicManMBean;
import org.mobicents.protocols.ss7.tools.simulator.level1.DialogicManStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.level1.M3uaManMBean;
import org.mobicents.protocols.ss7.tools.simulator.level1.M3uaManStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.level2.SccpManMBean;
import org.mobicents.protocols.ss7.tools.simulator.level2.SccpManStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.level3.CapManMBean;
import org.mobicents.protocols.ss7.tools.simulator.level3.CapManStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.level3.MapManMBean;
import org.mobicents.protocols.ss7.tools.simulator.level3.MapManStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.management.TesterHost;
import org.mobicents.protocols.ss7.tools.simulator.management.TesterHostMBean;
import org.mobicents.protocols.ss7.tools.simulator.management.TesterHostStandardMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ati.TestAtiClientManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ati.TestAtiClientStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ati.TestAtiServerManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ati.TestAtiServerStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.cap.TestCapScfManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.cap.TestCapScfStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.cap.TestCapSsfManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.cap.TestCapSsfStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.checkimei.TestCheckImeiClientManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.checkimei.TestCheckImeiClientStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.checkimei.TestCheckImeiServerManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.checkimei.TestCheckImeiServerStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.sms.TestSmsClientManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.sms.TestSmsClientStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.sms.TestSmsServerManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.sms.TestSmsServerStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ussd.TestUssdClientManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ussd.TestUssdClientStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ussd.TestUssdServerManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.ussd.TestUssdServerStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.lcs.TestMapLcsClientStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.lcs.TestMapLcsClientManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.lcs.TestMapLcsServerStandardManMBean;
import org.mobicents.protocols.ss7.tools.simulator.tests.lcs.TestMapLcsServerManMBean;
import com.sun.jdmk.comm.HtmlAdaptorServer;
/**
*
* @author sergey vetyutnev
* @author amit bhayani
*/
public class MainCore {
// public static TesterHost mainGui(String appName) throws Exception {
// TesterHost host = new TesterHost(appName);
//
// return host;
// }
public static void main(String[] args) throws Exception {
// ........................
// SMSC: Hypersonic database
// HTTP case:
// MX4J - free http JMX adapter
// SUN: jmxtools.jar
// <dependency>
// <groupId>com.sun.jdmk</groupId>
// <artifactId>jmxtools</artifactId>
// <version>1.2.1</version>
// <scope>provided</scope>
// </dependency>
// RMI case:
// rmiregistry 9999
// service:jmx:rmi:///jndi/rmi://localhost:9999/server
// JCONSOLE case:
// java -Dcom.sun.management.jmxremote Main
// JMX repository:
// rmiregistry 9999
// VISTA:
// Out-of-the-box it is not possible to connect to a local Java process from the JConsole using Windows Vista.
// The local process box just remains empty... The cause is Vista's security model.
// In default case every Java process creates a file in the folder:
// C:\Users\[LOGIN_NAME]\AppData\Local\Temp\hsperfdata_[LOGIN_NAME],
// in my case e.g.: C:\Users\adam\AppData\Local\Temp\hsperfdata_adam. The name of the file is the PID.
// For some strange reasons this directory is write-protected - it is not possible to create neither files nor folders
// in the hsperfdata_[LOGIN_NAME] directory. It is even not possible to change the write access,
// even not as an administrator (you can understand now, how secure Vista really is :-)).
// However if you delete this directory, and create a new one with the same name - then it works perfectly....
// Custom Notification: http://marxsoftware.blogspot.com/2008/02/publishing-user-objects-in-jmx.html
// ........................
// parsing arguments, possible values:
// name=a1 http=8000 rmi=9999,9998
// -na1 -t8001 -r9999,9998
int httpPort = -1;
int[] rmiPort = new int[] { -1, -1 };
String appName = "main";
if (args != null && args.length > 0) {
for (String s : args) {
if (s.length() > 5 && s.substring(0, 5).toLowerCase().equals("name=")) {
appName = s.substring(5, s.length());
}
if (s.length() > 2 && s.substring(0, 2).toLowerCase().equals("-n")) {
appName = s.substring(2, s.length());
}
if (s.length() > 4 && s.substring(0, 4).toLowerCase().equals("rmi=")) {
try {
String s1 = s.substring(4, s.length());
parseRmi(rmiPort, s1);
} catch (Exception e) {
System.out.println("Exception when parsing parameter \"rmi\"");
}
}
if (s.length() > 2 && s.substring(0, 2).toLowerCase().equals("-r")) {
try {
String s1 = s.substring(2, s.length());
parseRmi(rmiPort, s1);
} catch (Exception e) {
System.out.println("Exception when parsing parameter \"rmi\"");
}
}
if (s.length() > 5 && s.substring(0, 5).toLowerCase().equals("http=")) {
try {
int porta = Integer.parseInt(s.substring(5, s.length()));
if (porta > 0 && porta < 65000)
httpPort = porta;
else
System.out.println("Bad value of field \"http\"");
} catch (Exception e) {
System.out.println("Exception when parsing parameter \"http\"");
}
}
if (s.length() > 2 && s.substring(0, 2).toLowerCase().equals("-t")) {
try {
int porta = Integer.parseInt(s.substring(2, s.length()));
if (porta > 0 && porta < 65000)
httpPort = porta;
else
System.out.println("Bad value of field \"http\"");
} catch (Exception e) {
System.out.println("Exception when parsing parameter \"http\"");
}
}
}
}
MainCore main = new MainCore();
main.start(appName, httpPort, rmiPort[0], rmiPort[1]);
}
private static void parseRmi(int[] rmiPort, String s1) {
String[] ss = s1.split(",");
int porta = Integer.parseInt(ss[0]);
if (porta > 0 && porta < 65000)
rmiPort[0] = porta;
else
System.out.println("Bad value of field \"rmi\"");
if (ss.length >= 2) {
int portb = Integer.parseInt(ss[1]);
if (portb > 0 && portb < 65000)
rmiPort[1] = portb;
else
System.out.println("Bad value of field \"rmi\" - port 2");
}
}
public void start(String appName, int httpPort, int rmiPort, int rmiPort2) throws MalformedObjectNameException,
MBeanRegistrationException, InstanceNotFoundException, IOException {
System.out.println("Application has been loaded...");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
System.out.println("PlatformMBeanServer has been loaded...");
// names initializing
ObjectName adapterName = new ObjectName("SS7_Simulator_" + appName + ":name=htmladapter,port=" + httpPort);
ObjectName nameTesterHost = new ObjectName("SS7_Simulator_" + appName + ":type=TesterHost");
ObjectName nameM3uaMan = new ObjectName("SS7_Simulator_" + appName + ":type=M3uaMan");
ObjectName nameDialogicMan = new ObjectName("SS7_Simulator_" + appName + ":type=DialogicMan");
ObjectName nameSccpMan = new ObjectName("SS7_Simulator_" + appName + ":type=SccpMan");
ObjectName nameMapMan = new ObjectName("SS7_Simulator_" + appName + ":type=MapMan");
ObjectName nameCapMan = new ObjectName("SS7_Simulator_" + appName + ":type=CapMan");
ObjectName nameUssdClientManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestUssdClientMan");
ObjectName nameUssdServerManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestUssdServerMan");
ObjectName nameSmsClientManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestSmsClientMan");
ObjectName nameSmsServerManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestSmsServerMan");
ObjectName nameTestCapSsfMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestCapSsfMan");
ObjectName nameTestCapScfMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestCapScfMan");
ObjectName nameAtiClientManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestAtiClientMan");
ObjectName nameAtiServerManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestAtiServerMan");
ObjectName nameCheckImeiClientManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestCheckImeiClientMan");
ObjectName nameCheckImeiServerManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestCheckImeiServerMan");
ObjectName nameMapLcsClientManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestMapLcsClientMan");
ObjectName nameMapLcsServerManMan = new ObjectName("SS7_Simulator_" + appName + ":type=TestMapLcsServerMan");
// HtmlAdaptorServer
HtmlAdaptorServer adapter = null;
if (httpPort > 0) {
adapter = new HtmlAdaptorServer();
System.out.println("HtmlAdaptorServer has been created...");
}
// Tester host initializing
String sim_home = System.getProperty(TesterHost.SIMULATOR_HOME_VAR);
if (sim_home != null)
sim_home += File.separator + "data";
TesterHost host = new TesterHost(appName, sim_home);
JMXConnectorServer cs = null;
Registry reg = null;
try {
// registering managed beans
Object mbean = new TesterHostStandardMBean(host, TesterHostMBean.class, host);
mbs.registerMBean(mbean, nameTesterHost);
M3uaManStandardMBean m3uaMBean = new M3uaManStandardMBean(host.getM3uaMan(), M3uaManMBean.class);
mbs.registerMBean(m3uaMBean, nameM3uaMan);
DialogicManStandardMBean dialogicMBean = new DialogicManStandardMBean(host.getDialogicMan(), DialogicManMBean.class);
mbs.registerMBean(dialogicMBean, nameDialogicMan);
SccpManStandardMBean sccpMBean = new SccpManStandardMBean(host.getSccpMan(), SccpManMBean.class);
mbs.registerMBean(sccpMBean, nameSccpMan);
MapManStandardMBean mapMBean = new MapManStandardMBean(host.getMapMan(), MapManMBean.class);
mbs.registerMBean(mapMBean, nameMapMan);
CapManStandardMBean capMBean = new CapManStandardMBean(host.getCapMan(), CapManMBean.class);
mbs.registerMBean(capMBean, nameCapMan);
TestUssdClientStandardManMBean ussdClientManMBean = new TestUssdClientStandardManMBean(host.getTestUssdClientMan(),
TestUssdClientManMBean.class);
mbs.registerMBean(ussdClientManMBean, nameUssdClientManMan);
TestUssdServerStandardManMBean ussdServerManMBean = new TestUssdServerStandardManMBean(host.getTestUssdServerMan(),
TestUssdServerManMBean.class);
mbs.registerMBean(ussdServerManMBean, nameUssdServerManMan);
TestSmsClientStandardManMBean smsClientManMBean = new TestSmsClientStandardManMBean(host.getTestSmsClientMan(),
TestSmsClientManMBean.class);
mbs.registerMBean(smsClientManMBean, nameSmsClientManMan);
TestSmsServerStandardManMBean smsServerManMBean = new TestSmsServerStandardManMBean(host.getTestSmsServerMan(),
TestSmsServerManMBean.class);
mbs.registerMBean(smsServerManMBean, nameSmsServerManMan);
TestCapSsfStandardManMBean capSsfManMBean = new TestCapSsfStandardManMBean(host.getTestCapSsfMan(),
TestCapSsfManMBean.class);
mbs.registerMBean(capSsfManMBean, nameTestCapSsfMan);
TestCapScfStandardManMBean capScfManMBean = new TestCapScfStandardManMBean(host.getTestCapScfMan(),
TestCapScfManMBean.class);
mbs.registerMBean(capScfManMBean, nameTestCapScfMan);
TestAtiClientStandardManMBean atiClientManMBean = new TestAtiClientStandardManMBean(host.getTestAtiClientMan(),
TestAtiClientManMBean.class);
mbs.registerMBean(atiClientManMBean, nameAtiClientManMan);
TestAtiServerStandardManMBean atiServerManMBean = new TestAtiServerStandardManMBean(host.getTestAtiServerMan(),
TestAtiServerManMBean.class);
mbs.registerMBean(atiServerManMBean, nameAtiServerManMan);
TestCheckImeiClientStandardManMBean checkImeiClientManMBean = new TestCheckImeiClientStandardManMBean(host.getTestCheckImeiClientMan(),
TestCheckImeiClientManMBean.class);
mbs.registerMBean(checkImeiClientManMBean, nameCheckImeiClientManMan);
TestCheckImeiServerStandardManMBean checkImeiServerManMBean = new TestCheckImeiServerStandardManMBean(host.getTestCheckImeiServerMan(),
TestCheckImeiServerManMBean.class);
mbs.registerMBean(checkImeiServerManMBean, nameCheckImeiServerManMan);
TestMapLcsClientStandardManMBean mapLcsClientManMBean = new TestMapLcsClientStandardManMBean(host.getTestMapLcsClientMan(),
TestMapLcsClientManMBean.class);
mbs.registerMBean(mapLcsClientManMBean, nameMapLcsClientManMan);
TestMapLcsServerStandardManMBean mapLcsServerManMBean = new TestMapLcsServerStandardManMBean(host.getTestMapLcsServerMan(),
TestMapLcsServerManMBean.class);
mbs.registerMBean(mapLcsServerManMBean, nameMapLcsServerManMan);
System.out.println("All beans have been loaded...");
// starting rmi connector
if (rmiPort > 0) {
System.out.println("RMI connector initializing...");
if (rmiPort2 > 0 && rmiPort2 < 65000) {
try {
RMISocketFactory.setSocketFactory(new RMIServerSocketFactoryCustom(rmiPort2));
} catch (IOException e) {
System.err.println("Exception Occurred: " + "setSocketFactory failed");
e.printStackTrace();
}
}
reg = LocateRegistry.createRegistry(rmiPort);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://0.0.0.0:" + rmiPort + "/server");
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
cs.start();
System.out.println("RMI connector has been started...");
}
// starting html connector
if (httpPort > 0) {
System.out.println("Html connector initializing...");
adapter.setPort(httpPort);
mbs.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("Html connector has been started...");
}
} catch (Exception ee) {
System.out.println("Exception when initializing the managed beans or started connectors:");
ee.printStackTrace();
}
System.out.println("Waiting for commands...");
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (host.isNeedQuit())
break;
host.checkStore();
host.execute();
}
System.out.println("Terminating...");
if (httpPort > 0) {
adapter.stop();
mbs.unregisterMBean(adapterName);
}
if (rmiPort > 0) {
cs.stop();
}
mbs.unregisterMBean(nameTesterHost);
mbs.unregisterMBean(nameM3uaMan);
mbs.unregisterMBean(nameDialogicMan);
mbs.unregisterMBean(nameSccpMan);
mbs.unregisterMBean(nameMapMan);
mbs.unregisterMBean(nameCapMan);
mbs.unregisterMBean(nameUssdClientManMan);
mbs.unregisterMBean(nameUssdServerManMan);
mbs.unregisterMBean(nameSmsClientManMan);
mbs.unregisterMBean(nameSmsServerManMan);
mbs.unregisterMBean(nameTestCapSsfMan);
mbs.unregisterMBean(nameTestCapScfMan);
mbs.unregisterMBean(nameAtiClientManMan);
mbs.unregisterMBean(nameAtiServerManMan);
mbs.unregisterMBean(nameCheckImeiClientManMan);
mbs.unregisterMBean(nameCheckImeiServerManMan);
// Registry.unbind(key);
UnicastRemoteObject.unexportObject(reg, true);
System.exit(0);
}
}