/**
   * Method for instantiating and starting the application based from the information from the
   * xml-configuration file.
   */
  public static final void start() {
    try {
      JAXBContext context = JAXBContext.newInstance(Application.class);
      Unmarshaller um = context.createUnmarshaller();

      if (configurationFile != null && configurationFile.exists()) {
        SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema =
            sf.newSchema(
                TcLoadTester.class
                    .getClassLoader()
                    .getResource("com/siemens/tcloadtester/TcLoadTester.xsd"));
        um.setSchema(schema);
        app = (Application) um.unmarshal(new FileInputStream(configurationFile));
      } else if (!gui) {
        throw new Exception("Configuration file does not exist.");
      } else {
        app = new Application();
      }

      app.init();

    } catch (Exception e) {
      if (gui) {
        UserInterface.DisplayError("Initialization error", e);
        UserInterface.loop();
      } else {
        e.printStackTrace();
      }
    }
  }
  /**
   * Application entry method that opens the xml-configuration file and parses it into class
   * objects.
   *
   * @param args Args passed from command line.
   */
  public static final void main(String[] args) {
    String config;
    String output;
    String marker;

    try {
      setGlobalProperties();

      appPath =
          new File(
              TcLoadTester.class.getProtectionDomain().getCodeSource().getLocation().getPath());

      if (parseArgs(args, "-debug") != null) debug = true;
      if (parseArgs(args, "-nogui") != null) gui = false;
      if ((config = parseArgs(args, "-config")) != null) configurationFile = new File(config);
      if ((output = parseArgs(args, "-output")) != null) outputFile = new File(output);
      if ((marker = parseArgs(args, "-marker")) != null) markerId = marker;

      if (!gui && configurationFile == null) {
        usage();
        throw new Exception("No configuration defined.");
      }

      // Register shutdown hook to capture kill events
      Shutdown shutdownHook = new Shutdown();
      Runtime.getRuntime().addShutdownHook(shutdownHook.init());

      logger = new Logger();
      if (gui) {
        userInterface = new UserInterface();
        eventListeners.add(userInterface);
        UserInterface.init();
      }

      start();
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.exit(0);
  }