package com.softwaremill.common.test.web.jboss.server; import com.google.common.base.Charsets; import com.softwaremill.common.test.util.MessageWaiter; import com.softwaremill.common.test.web.jboss.SysoutLog; import com.softwaremill.common.test.web.selenium.ServerProperties; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; /** * @author Pawel Wrzeszcz (pawel [at] softwaremill . com) */ public abstract class AbstractJBossAS implements JBossAS { private final static SysoutLog log = new SysoutLog(); private Process jbossProcess; private boolean running; protected ServerProperties properties; public AbstractJBossAS(ServerProperties serverProperties) { this.properties = serverProperties; this.running = serverProperties.isRunning(); } @Override public Process start() throws Exception { return (running) ? jbossProcess : startServer(); } abstract String[] startCommand(); abstract String[] shutdownCommand(); abstract String startedLogMessage(); protected Process startServer() throws Exception { String[] startCommand = startCommand(); log.info("Starting JBoss server with command: " + Arrays.toString(startCommand)); jbossProcess = Runtime.getRuntime().exec(startCommand); new MessageWaiter(jbossProcess).waitFor(startedLogMessage()); log.info("JBoss started"); return jbossProcess; } protected boolean winSystem() { String osName = System.getProperty("os.name"); return osName != null && osName.contains("Windows"); } @Override public void shutdown() throws IOException, InterruptedException { if (!running) { log.info("Stopping JBoss server"); shutdownServer(); log.info("JBoss Server stopped"); } } protected void shutdownServer() throws IOException, InterruptedException { final Process shutdownProcess = Runtime.getRuntime().exec(shutdownCommand()); if (winSystem()) { PrintWriter writer = new PrintWriter(new OutputStreamWriter(shutdownProcess.getOutputStream(), Charsets.UTF_8)); try { //On windows, user needs to press any key on the console //for the process to exit. Wait a bit for message "Press any key" new MessageWaiter(shutdownProcess).waitFor("Press any key to continue"); writer.write("y"); writer.flush(); } finally { writer.close(); } } shutdownProcess.waitFor(); if (shutdownProcess.exitValue() != 0) { log.info("Failed to stop JBoss"); } else { //Make sure jboss shuts down before leaving this method. jbossProcess.waitFor(); } } }