/*
* Copyright 2017 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.launch;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.rf.ide.core.execution.RobotAgentEventListener;
import org.rf.ide.core.execution.server.AgentConnectionServer;
import org.rf.ide.core.execution.server.AgentServerStatusListener;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
public class AgentConnectionServerJob extends Job {
private final String host;
private final int port;
private final int timeout;
private final TimeUnit timeoutUnit;
private final List<AgentServerStatusListener> serverListeners;
private final List<RobotAgentEventListener> agentEventListeners;
private AgentConnectionServer agentServer;
private AgentConnectionServerJob(final String host, final int port, final int timeout, final TimeUnit timeoutUnit,
final List<AgentServerStatusListener> serverStatusListeners,
final List<RobotAgentEventListener> agentEventListeners) {
super("Agent connection server");
setSystem(true);
this.host = host;
this.port = port;
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
this.serverListeners = serverStatusListeners;
this.agentEventListeners = agentEventListeners;
}
public static AgentConnectionServerJobBuilder setupServerAt(final String host, final int port) {
return new AgentConnectionServerJobBuilder(host, port);
}
@Override
protected IStatus run(final IProgressMonitor monitor) {
try {
agentServer = new AgentConnectionServer(host, port, timeout, timeoutUnit);
for (final AgentServerStatusListener serverStatusListener : serverListeners) {
agentServer.addStatusListener(serverStatusListener);
}
agentServer.start(agentEventListeners.toArray(new RobotAgentEventListener[0]));
return Status.OK_STATUS;
} catch (final UnknownHostException e) {
return new Status(IStatus.ERROR, RedPlugin.PLUGIN_ID,
String.format("Unable to start server on %s:%d\nUnknown host", host, port));
} catch (final IOException e) {
return new Status(IStatus.ERROR, RedPlugin.PLUGIN_ID,
String.format("Unable to start server on %s:%d\n%s", host, port, e.getMessage()));
}
}
public AgentConnectionServerJob waitForServer() throws InterruptedException {
while (agentServer == null) {
Thread.sleep(500);
}
agentServer.waitForServerToSetup();
return this;
}
public void stopServer() {
if (agentServer != null) {
try {
agentServer.stop();
} catch (final IOException e) {
throw new IllegalStateException("Unable to stop server", e);
}
}
}
public static class AgentConnectionServerJobBuilder {
private final String host;
private final int port;
private int timeout;
private TimeUnit timeoutUnit;
private final List<AgentServerStatusListener> serverListeners = new ArrayList<>();
private final List<RobotAgentEventListener> agentEventListeners = new ArrayList<>();
public AgentConnectionServerJobBuilder(final String host, final int port) {
this.host = host;
this.port = port;
this.timeout = AgentConnectionServer.DEFAULT_CONNECTION_TIMEOUT;
this.timeoutUnit = TimeUnit.SECONDS;
}
public AgentConnectionServerJobBuilder withConnectionTimeout(final int timeout, final TimeUnit timeoutUnit) {
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
return this;
}
public AgentConnectionServerJobBuilder serverStatusHandledBy(final AgentServerStatusListener listener) {
serverListeners.add(listener);
return this;
}
public AgentConnectionServerJobBuilder agentEventsListenedBy(final RobotAgentEventListener listener) {
agentEventListeners.add(listener);
return this;
}
public AgentConnectionServerJobBuilder agentEventsListenedBy(final List<RobotAgentEventListener> listeners) {
agentEventListeners.addAll(listeners);
return this;
}
public AgentConnectionServerJob createJob() {
return new AgentConnectionServerJob(host, port, timeout, timeoutUnit, serverListeners, agentEventListeners);
}
public AgentConnectionServerJob start() {
final AgentConnectionServerJob job = createJob();
job.schedule();
return job;
}
}
}