package org.jboss.tools.runtime.reddeer.impl;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.eclipse.wst.server.ui.RuntimePreferencePage;
import org.jboss.reddeer.eclipse.wst.server.ui.editor.ServerEditor;
import org.jboss.reddeer.eclipse.wst.server.ui.view.ServersView;
import org.jboss.reddeer.swt.impl.text.LabeledText;
import org.jboss.tools.runtime.reddeer.Namespaces;
import org.jboss.tools.runtime.reddeer.Remote;
import org.jboss.tools.runtime.reddeer.ServerBase;
import org.jboss.tools.runtime.reddeer.condition.JobIsKilled;
import org.jboss.tools.runtime.reddeer.wizard.NewHostWizard;
import org.jboss.tools.runtime.reddeer.wizard.ServerRuntimeWizard;
import org.jboss.tools.runtime.reddeer.wizard.ServerWizard;
/**
* AS Server
*
* @author apodhrad
*
*/
@XmlRootElement(name = "as", namespace = Namespaces.SOA_REQ)
@XmlAccessorType(XmlAccessType.FIELD)
public class ServerAS extends ServerBase {
public static final int DEFAULT_HTTP_PORT = 8080;
public static final String DEFAULT_CONFIGURATION = "standalone.xml";
private final String category = "JBoss Community";
private final String label = "JBoss AS";
@XmlElement(name = "remote", namespace = Namespaces.SOA_REQ)
private Remote remote;
@XmlElement(name = "configuration", namespace = Namespaces.SOA_REQ, defaultValue = DEFAULT_CONFIGURATION)
private String configuration;
public String getConfiguration() {
return configuration;
}
public void setConfiguration(String configuration) {
this.configuration = configuration;
}
public String getCategory() {
return category;
}
public String getServerType() {
return label + " " + getVersion();
}
public String getRuntimeType() {
return "JBoss " + getVersion() + " Runtime";
}
@Override
public int getHttpPort() {
return DEFAULT_HTTP_PORT;
}
@Override
public String getUrl(String host, String path) {
StringBuffer result = new StringBuffer();
result.append("http://").append(host).append(":").append(getHttpPort()).append("/").append(path);
return result.toString();
}
@Override
public void create() {
if (isRemote()) {
ServerWizard serverWizard = new ServerWizard();
serverWizard.open();
serverWizard.setType(getCategory(), getServerType());
serverWizard.setName(name);
serverWizard.setHostName(remote.getHost());
serverWizard.next();
serverWizard.setRemote();
serverWizard.setUseManagementOperations(remote.isUseManagementOperations());
serverWizard.setAssignRuntime(false);
serverWizard.setExternallyManaged(remote.isExternallyManaged());
serverWizard.next();
NewHostWizard hostWizard = serverWizard.addHost().setSshOnly();
hostWizard.next();
new WaitUntil(new JobIsKilled("Refreshing server adapter list"), TimePeriod.LONG, false);
hostWizard.setHostName(remote.getHost()).setConnectionName(remote.getHost()).finish();
if (!remote.isUseManagementOperations() || !remote.isExternallyManaged()) {
serverWizard.setRemoteServerHome(remote.getRemoteHome());
}
serverWizard.finish();
ServersView servers = new ServersView();
servers.open();
ServerEditor serverEditor = servers.getServer(name).open();
new LabeledText("User Name").setText(remote.getUsername()); // TODO: move this into ServerEditor
new LabeledText("Password").setText(remote.getPassword());
serverEditor.save();
} else {
addJre();
WorkbenchPreferenceDialog preferences = new WorkbenchPreferenceDialog();
preferences.open();
// Add runtime
RuntimePreferencePage runtimePreferencePage = new RuntimePreferencePage();
preferences.select(runtimePreferencePage);
runtimePreferencePage.addRuntime();
ServerRuntimeWizard runtimeWizard = new ServerRuntimeWizard();
runtimeWizard.activate();
runtimeWizard.setType(getCategory(), getRuntimeType());
runtimeWizard.next();
runtimeWizard.setName(getRuntimeName());
runtimeWizard.setHomeDirectory(getHome());
runtimeWizard.selectJre(getJreName());
runtimeWizard.selectExecutionEnvironment(getExecEnv());
new WaitUntil(new JobIsKilled("Refreshing server adapter list"), TimePeriod.LONG, false);
runtimeWizard.finish(TimePeriod.VERY_LONG);
preferences.ok();
// Add server
ServerWizard serverWizard = new ServerWizard();
serverWizard.open();
serverWizard.setType(getCategory(), getServerType());
serverWizard.setName(getName());
serverWizard.next();
serverWizard.setRuntime(getRuntimeName());
new WaitUntil(new JobIsKilled("Refreshing server adapter list"), TimePeriod.LONG, false);
serverWizard.finish();
}
}
@Override
protected boolean canStart() {
int port = 8080;
if (isRemote()) {
boolean portOpen = false;
Socket socket = null;
try {
socket = new Socket(remote.getHost(), port);
portOpen = true;
} catch (IOException e) {
portOpen = false;
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// ignore
}
}
}
if (remote.isExternallyManaged() && !portOpen) {
throw new RuntimeException("No server running on " + remote.getHost() + " on port " + port);
}
if (!remote.isExternallyManaged() && portOpen) {
throw new RuntimeException("Port '" + port + "' is already in use on " + remote.getHost() + "!");
}
return true;
} else {
try {
new ServerSocket(port).close();
return true;
} catch (IOException e) {
throw new RuntimeException("Port '" + port + "' is already in use!", e);
}
}
}
@Override
public boolean isRemote() {
return remote != null;
}
}