/*
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. 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.bootstrap;
import gnu.getopt.Getopt;
import gnu.getopt.LongOpt;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
import org.mobicents.protocols.ss7.tools.simulator.MainCore;
import org.mobicents.protocols.ss7.tools.simulatorgui.MainGui;
/**
* @author <a href="mailto:amit.bhayani@jboss.com">amit bhayani</a>
*/
public class Main {
private static final String APP_NAME = "SS7 Simulator";
private static final String HOME_DIR = "SIMULATOR_HOME";
private static final String LOG4J_URL = "/conf/log4j.properties";
private static final String LOG4J_URL_XML = "/conf/log4j.xml";
public static final String SIMULATOR_HOME = "simulator.home.dir";
public static final String SIMULATOR_DATA = "simulator.data.dir";
private static int index = 0;
private static Logger logger = Logger.getLogger(Main.class);
private String command = null;
private String appName = "main";
private int rmiPort = -1;
private int rmiPort2 = -1;
private int httpPort = -1;
public static void main(String[] args) throws Throwable {
String homeDir = getHomeDir(args);
System.setProperty(SIMULATOR_HOME, homeDir);
System.setProperty(SIMULATOR_DATA, homeDir + File.separator + "data" + File.separator);
if (!initLOG4JProperties(homeDir) && !initLOG4JXml(homeDir)) {
logger.error("Failed to initialize loggin, no configuration. Defaults are used.");
}
logger.info("log4j configured");
Main main = new Main();
main.processCommandLine(args);
main.boot();
}
private void processCommandLine(String[] args) {
String programName = System.getProperty("program.name", APP_NAME);
int c;
String arg;
LongOpt[] longopts = new LongOpt[5];
longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
longopts[1] = new LongOpt("name", LongOpt.REQUIRED_ARGUMENT, null, 'n');
longopts[2] = new LongOpt("http", LongOpt.REQUIRED_ARGUMENT, null, 't');
longopts[3] = new LongOpt("rmi", LongOpt.REQUIRED_ARGUMENT, null, 'r');
longopts[4] = new LongOpt("core", LongOpt.NO_ARGUMENT, null, 0);
Getopt g = new Getopt(APP_NAME, args, "-:n:t:r:h", longopts);
g.setOpterr(false); // We'll do our own error handling
//
while ((c = g.getopt()) != -1) {
switch (c) {
case 't':
// http port
arg = g.getOptarg();
this.httpPort = Integer.parseInt(arg);
if (this.httpPort < 0 || this.httpPort > 65000) {
System.err.println("Http port should be in range 0 to 65000");
System.exit(0);
}
break;
case 'r':
// rmi port
arg = g.getOptarg();
String[] ss = arg.split(",");
this.rmiPort = Integer.parseInt(ss[0]);
if (this.rmiPort < 0 || this.rmiPort > 65000) {
System.err.println("RMI port should be in range 0 to 65000");
System.exit(0);
}
if (ss.length >= 2) {
this.rmiPort2 = Integer.parseInt(ss[1]);
if (this.rmiPort2 < 0 || this.rmiPort2 > 65000) {
System.err.println("RMI port 2 should be in range 0 to 65000");
System.exit(0);
}
}
break;
case 'n':
// name
arg = g.getOptarg();
this.appName = arg;
break;
case 'h':
this.genericHelp();
break;
case ':':
System.out.println("You need an argument for option " + (char) g.getOptopt());
System.exit(0);
break;
case '?':
System.out.println("The option '" + (char) g.getOptopt() + "' is not valid");
System.exit(0);
break;
case 1:
String optArg = g.getOptarg();
if (optArg.equals("core")) {
this.command = "core";
} else if (optArg.equals("gui")) {
this.command = "gui";
} else if (optArg.equals("help")) {
if (this.command == null) {
this.genericHelp();
} else if (this.command.equals("core")) {
this.coreHelp();
} else if (this.command.equals("gui")) {
this.guiHelp();
} else {
System.out.println("Invalid command " + optArg);
this.genericHelp();
}
} else {
System.out.println("Invalid command " + optArg);
this.genericHelp();
}
break;
default:
this.genericHelp();
break;
}
}
}
private void genericHelp() {
System.out.println("usage: " + APP_NAME + "<command> [options]");
System.out.println();
System.out.println("command:");
System.out.println(" core Start the SS7 simulator core");
System.out.println(" gui Start the SS7 simulator gui");
System.out.println();
System.out.println("see 'run <command> help' for more information on a specific command:");
System.out.println();
System.exit(0);
}
private void coreHelp() {
System.out.println("core: Starts the simulator core");
System.out.println();
System.out.println("usage: " + APP_NAME + " core [options]");
System.out.println();
System.out.println("options:");
System.out.println(" -n, --name=<simulator name> Simulator name. If not passed default is main");
System.out.println(" -t, --http=<http port> Http port for core");
System.out.println(" -r, --rmi=<rmi port> RMI port for core");
System.out.println();
System.exit(0);
}
private void guiHelp() {
System.out.println("gui: Starts the simulator gui");
System.out.println();
System.out.println("usage: " + APP_NAME + " gui [options]");
System.out.println();
System.out.println("options:");
System.out.println(" -n, --name=<simulator name> Simulator name. If not passed default is main");
System.out.println();
System.exit(0);
}
private static boolean initLOG4JProperties(String homeDir) {
String Log4jURL = homeDir + LOG4J_URL;
try {
URL log4jurl = getURL(Log4jURL);
InputStream inStreamLog4j = log4jurl.openStream();
Properties propertiesLog4j = new Properties();
try {
propertiesLog4j.load(inStreamLog4j);
PropertyConfigurator.configure(propertiesLog4j);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
// e.printStackTrace();
logger.info("Failed to initialize LOG4J with properties file.");
return false;
}
return true;
}
private static boolean initLOG4JXml(String homeDir) {
String Log4jURL = homeDir + LOG4J_URL_XML;
try {
URL log4jurl = getURL(Log4jURL);
DOMConfigurator.configure(log4jurl);
} catch (Exception e) {
// e.printStackTrace();
logger.info("Failed to initialize LOG4J with xml file.");
return false;
}
return true;
}
/**
* Gets the Media Server Home directory.
*
* @param args the command line arguments
* @return the path to the home directory.
*/
private static String getHomeDir(String[] args) {
if (System.getenv(HOME_DIR) == null) {
if (args.length > index) {
return args[index++];
} else {
return ".";
}
} else {
return System.getenv(HOME_DIR);
}
}
protected void boot() throws Throwable {
if (this.command == null) {
System.out.println("No command passed");
this.genericHelp();
} else if (this.command.equals("gui")) {
EventQueue.invokeLater(new MainGui(appName));
} else if (this.command.equals("core")) {
MainCore mainCore = new MainCore();
mainCore.start(appName, httpPort, rmiPort, rmiPort2);
}
}
public static URL getURL(String url) throws Exception {
File file = new File(url);
if (file.exists() == false) {
throw new IllegalArgumentException("No such file: " + url);
}
return file.toURI().toURL();
}
protected void registerShutdownThread() {
Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownThread()));
}
private class ShutdownThread implements Runnable {
public void run() {
System.out.println("Shutting down");
}
}
}