package org.mobicents.tests.diameter; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import gnu.getopt.Getopt; import gnu.getopt.LongOpt; /** * Class which sets up everything for test and waits till test is not * terminated. * * @author baranowb * */ public class CLIRunner { private static final LongOpt[] _LONG_OPTS = new LongOpt[18]; private static final String _GETOPT_PARAMS_STRING = "h:q:w"; private static final Logger log = Logger.getLogger(CLIRunner.class); private static final String _DIA_HOME_DIR = "dia.home.dir"; static { // This should expand, to get all stack props. for nwo its hardcoded. _LONG_OPTS[0] = new LongOpt("usage", LongOpt.NO_ARGUMENT, null, 'h'); _LONG_OPTS[1] = new LongOpt("testclass", LongOpt.REQUIRED_ARGUMENT, null, 'q'); _LONG_OPTS[2] = new LongOpt("config", LongOpt.REQUIRED_ARGUMENT, null, 'w'); // check for dia.home.dir if (System.getenv(_DIA_HOME_DIR) == null && System.getProperty(_DIA_HOME_DIR) == null) { // this is for cli mode, if we are here, it means we are not run by // micocontainer configLog4j(); } } private boolean configured = false; private InputStream configurationFile; private AbstractStackRunner runnerClassInstance; /** * @param args */ public static void main(String[] args) { CLIRunner runner = new CLIRunner(); runner.parseArgs(args); if (runner.isConfigured()) { runner.performTask(); } } private void parseArgs(String[] args) { Getopt getOpt = new Getopt("CLIRunner", args, _GETOPT_PARAMS_STRING, _LONG_OPTS); getOpt.setOpterr(true); int c = -1; String v = null; while ((c = getOpt.getopt()) != -1) { switch (c) { case 'h': usage(); System.exit(0); case 'q': v = getOpt.getOptarg(); setTestClass(v); break; case 'w': v = getOpt.getOptarg(); setConfigurationFile(v); break; default: log.error("Wrong parameter!! ---> " + Character.toString((char) c)); } } } // private void usage() { StringBuffer sb = new StringBuffer(); sb.append("java " + CLIRunner.class.getName() + " [OPTIONS] \n"); sb.append("Where options can be:\n"); sb.append("--usage : prints this message.\n"); sb.append("--testclass : FQDN of test class to run.\n"); sb.append("--config : absolute url to jdiameter config file.\n"); log.info("Usage: \n" + sb); } private void performTask() { if (this.runnerClassInstance != null) { try { this.runnerClassInstance.configure(this.configurationFile); this.runnerClassInstance.performTestRun(); } catch (Exception e) { log.error("Failed to run due to exception.", e); } } } private boolean isConfigured() { return this.configured; } private static void configLog4j() { InputStream inStreamLog4j = CLIRunner.class.getClassLoader().getResourceAsStream("log4j.properties"); Properties propertiesLog4j = new Properties(); try { propertiesLog4j.load(inStreamLog4j); PropertyConfigurator.configure(propertiesLog4j); } catch (Exception e) { e.printStackTrace(); } log.debug("log4j configured"); } // Bean methods and fields for MC runn public void setConfigurationFile(String v) { try { File f = new File(v); if (!f.exists() || !f.canRead() || !f.isFile()) { if (Thread.currentThread().getContextClassLoader().getResource(v) != null) { // this is double check to test runner classes, but we require it to // be sure if deployment in mc is ok this.configurationFile = Thread.currentThread().getContextClassLoader().getResourceAsStream(v); } else { this.configured = false; log.error("File \"" + v + "\" does not exists, is not readable or is not a file."); this.configurationFile = null; } } else { this.configurationFile = new FileInputStream(f); } if (this.runnerClassInstance != null) { configured = true; } } catch (Exception e) { e.printStackTrace(); log.error("Failed to init test class: " + v); this.configured = false; } } public String getConfigurationFile() { if (this.configurationFile != null) { return this.configurationFile.toString(); } else { return null; } } public void setTestClass(String v) { try { Class clazz = Class.forName(v); this.runnerClassInstance = (AbstractStackRunner) clazz.newInstance(); if (this.configurationFile != null) { configured = true; } } catch (Exception e) { e.printStackTrace(); log.error("Failed to init test class: " + v); this.configured = false; } } public String getTestClass() { if (this.runnerClassInstance != null) { return this.runnerClassInstance.toString(); } else { return null; } } public void start() throws Exception { if (isConfigured()) { this.runnerClassInstance.configure(this.configurationFile); // now here we should be able to receive all data. } else { throw new IllegalStateException("Runner is not configured"); } } public void stop() { if (isConfigured()) { this.runnerClassInstance.clean(); } } }