public DomainLifecycleUtil(final JBossAsManagedConfiguration configuration) throws IOException {
   this(configuration, DomainControllerClientConfig.create());
 }
  public void start() {
    try {
      configuration.validate();

      final String address =
          NetworkUtils.formatPossibleIpv6Address(
              configuration.getHostControllerManagementAddress());
      final int port = configuration.getHostControllerManagementPort();
      final URI connectionURI = new URI("remote://" + address + ":" + port);
      // Create the connection - this will try to connect on the first request
      connection = clientConfiguration.createConnection(connectionURI, getCallbackHandler());

      String jbossHomeDir = configuration.getJbossHome();

      final String additionalJavaOpts = System.getProperty("jboss.options");

      File modulesJar = new File(jbossHomeDir + "/jboss-modules.jar");
      if (modulesJar.exists() == false)
        throw new IllegalStateException("Cannot find: " + modulesJar);

      String javaHome = configuration.getJavaHome();
      String java = (javaHome != null) ? javaHome + "/bin/java" : "java";

      File domainDir =
          configuration.getDomainDirectory() != null
              ? new File(configuration.getDomainDirectory())
              : new File(new File(jbossHomeDir), "domain");
      String domainPath = domainDir.getAbsolutePath();

      final String modulePath;
      if (configuration.getModulePath() != null && !configuration.getModulePath().isEmpty()) {
        modulePath = configuration.getModulePath();
      } else {
        modulePath = jbossHomeDir + "/modules";
      }

      // No point backing up the file in a test scenario, just write what we need.
      File usersFile = new File(domainPath + "/configuration/mgmt-users.properties");
      FileOutputStream fos = new FileOutputStream(usersFile);
      PrintWriter pw = new PrintWriter(fos);
      pw.println(
          "slave="
              + new UsernamePasswordHashUtil()
                  .generateHashedHexURP(
                      "slave", "ManagementRealm", "slave_user_password".toCharArray()));
      pw.close();
      fos.close();

      List<String> cmd = new ArrayList<String>();
      cmd.add(java);
      if (additionalJavaOpts != null) {
        for (String opt : additionalJavaOpts.split("\\s+")) {
          cmd.add(opt);
        }
      }
      TestSuiteEnvironment.getIpv6Args(cmd);
      cmd.add("-Djboss.home.dir=" + jbossHomeDir);
      cmd.add("-Dorg.jboss.boot.log.file=" + domainPath + "/log/process-controller.log");
      cmd.add(
          "-Dlogging.configuration=file:"
              + jbossHomeDir
              + "/domain/configuration/logging.properties");
      cmd.add("-jar");
      cmd.add(modulesJar.getAbsolutePath());
      cmd.add("-mp");
      cmd.add(modulePath);
      // cmd.add("-jaxpmodule");
      // cmd.add("javax.xml.jaxp-provider");
      cmd.add("org.jboss.as.process-controller");
      cmd.add("-jboss-home");
      cmd.add(jbossHomeDir);
      cmd.add("-jvm");
      cmd.add(java);
      cmd.add("--");
      cmd.add("-Dorg.jboss.boot.log.file=" + domainPath + "/log/host-controller.log");
      cmd.add(
          "-Dlogging.configuration=file:"
              + jbossHomeDir
              + "/domain/configuration/logging.properties");
      TestSuiteEnvironment.getIpv6Args(cmd);
      if (additionalJavaOpts != null) {
        for (String opt : additionalJavaOpts.split("\\s+")) {
          cmd.add(opt);
        }
      }
      cmd.add("--");
      cmd.add("-default-jvm");
      cmd.add(java);
      if (configuration.getHostCommandLineProperties() != null) {
        for (String opt : configuration.getHostCommandLineProperties().split("\\s+")) {
          cmd.add(opt);
        }
      }

      String domainDirectory = configuration.getDomainDirectory();
      if (domainDirectory != null) {
        cmd.add("-Djboss.domain.base.dir=" + domainDirectory);
      } else {
        domainDirectory = domainPath;
      }
      if (configuration.getDomainConfigFile() != null) {
        String name =
            copyConfigFile(
                new File(configuration.getDomainConfigFile()),
                new File(domainDirectory, "configuration"));
        cmd.add("-domain-config");
        cmd.add(name);
      }
      if (configuration.getHostConfigFile() != null) {
        String name =
            copyConfigFile(
                new File(configuration.getHostConfigFile()),
                new File(domainDirectory, "configuration"));
        cmd.add("-host-config");
        cmd.add(name);
      }
      if (configuration.getHostControllerManagementAddress() != null) {
        cmd.add("--interprocess-hc-address");
        cmd.add(configuration.getHostControllerManagementAddress());
        cmd.add("--pc-address");
        cmd.add(configuration.getHostControllerManagementAddress());
      }
      // the process working dir
      final String workingDir = configuration.getDomainDirectory();

      // Start the process
      final ProcessWrapper wrapper =
          new ProcessWrapper(
              configuration.getHostName(), cmd, Collections.<String, String>emptyMap(), workingDir);
      wrapper.start();
      process = wrapper;

      // Wait for the servers to be started
      boolean serversAvailable = false;
      long start = System.currentTimeMillis();
      long deadline = start + configuration.getStartupTimeoutInSeconds() * 1000;
      // Wait a while before starting to check for the servers
      TimeUnit.SECONDS.sleep(2);
      while (serversAvailable == false) {
        long remaining = deadline - System.currentTimeMillis();
        if (remaining <= 0) {
          break;
        }
        if (!serversAvailable) {
          TimeUnit.MILLISECONDS.sleep(250);
        }
        serversAvailable = areServersStarted();
      }

      if (!serversAvailable) {
        throw new TimeoutException(
            String.format(
                "Managed servers were not started within [%d] seconds",
                configuration.getStartupTimeoutInSeconds()));
      }

      log.info("All servers started in " + (System.currentTimeMillis() - start) + " ms");
    } catch (Exception e) {
      throw new RuntimeException("Could not start container", e);
    }
  }