package org.wildfly.swarm.arquillian.runtime;
import java.net.BindException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.inject.Vetoed;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceTarget;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.wildfly.swarm.arquillian.daemon.server.Server;
import org.wildfly.swarm.arquillian.daemon.server.ServerLifecycleException;
import org.wildfly.swarm.spi.api.SwarmProperties;
/**
* @author Bob McWhirter
*/
@Vetoed
public class DaemonService implements Service<Server> {
public static final ServiceName SERVICE_NAME = ServiceName.of("wildfly", "swarm", "arquillian", "daemon");
private static final Logger log = Logger.getLogger(DaemonService.class.getName());
@Override
public void start(StartContext context) throws StartException {
int port = Integer.getInteger(SwarmProperties.ARQUILLIAN_DAEMON_PORT, 12345);
try {
this.server = Server.create("localhost", port);
this.server.start();
} catch (Exception e) {
// this shouldn't be possible per Java control flow rules, but there is a "sneaky throw" somewhere
//noinspection ConstantConditions
if (e instanceof BindException) {
log.log(Level.SEVERE, "Couldn't bind Arquillian Daemon on localhost:" + port
+ "; you can change the port using system property '"
+ SwarmProperties.ARQUILLIAN_DAEMON_PORT + "'", e);
}
throw new StartException(e);
}
}
@Override
public void stop(StopContext context) {
try {
this.server.stop();
} catch (ServerLifecycleException e) {
throw new RuntimeException(e);
}
}
@Override
public Server getValue() throws IllegalStateException, IllegalArgumentException {
return this.server;
}
static void addService(ServiceTarget serviceTarget) {
DaemonService daemon = new DaemonService();
serviceTarget
.addService(SERVICE_NAME, daemon)
.setInitialMode(ServiceController.Mode.ACTIVE)
.install();
}
private Server server;
}