package org.jboss.tools.runtime.reddeer; import java.io.File; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.ServerCore; import org.jboss.reddeer.eclipse.condition.ConsoleHasText; import org.jboss.reddeer.eclipse.ui.console.ConsoleView; import org.jboss.reddeer.eclipse.wst.server.ui.view.Server; import org.jboss.reddeer.eclipse.wst.server.ui.view.ServerLabel; import org.jboss.reddeer.eclipse.wst.server.ui.view.ServersView; import org.jboss.reddeer.eclipse.wst.server.ui.view.ServersViewEnums.ServerState; import org.jboss.reddeer.requirements.server.ServerReqState; import org.jboss.reddeer.swt.api.Tree; import org.jboss.reddeer.swt.api.TreeItem; import org.jboss.reddeer.core.condition.JobIsRunning; import org.jboss.reddeer.core.condition.ShellWithTextIsActive; import org.jboss.reddeer.swt.impl.button.PushButton; import org.jboss.reddeer.swt.impl.menu.ContextMenu; import org.jboss.reddeer.swt.impl.shell.DefaultShell; import org.jboss.reddeer.swt.impl.tree.DefaultTree; import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem; import org.jboss.reddeer.common.wait.TimePeriod; import org.jboss.reddeer.common.wait.WaitUntil; import org.jboss.reddeer.common.wait.WaitWhile; import org.jboss.tools.runtime.reddeer.preference.InstalledJREs; /** * * @author apodhrad * */ @XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) public abstract class ServerBase extends RuntimeBase { public static final String ADD_REMOVE_LABEL = "Add and Remove..."; public static final String DEFAULT_JRE = "default"; public static final String DEFAULT_EXEC_ENV = "default"; private String jre; private String jreName; private String execEnv; @XmlElement(name = "jre", namespace = Namespaces.SOA_REQ, defaultValue = DEFAULT_JRE) public String getJre() { return jre; } public void setJre(String jre) { if (jre.equals(DEFAULT_JRE)) { return; } File jreFile = new File(jre); if (!jreFile.exists()) { throw new IllegalArgumentException("JRE path '" + jre + "' doesn't exist."); } this.jre = jre; this.jreName = jreFile.getName(); } public String getJreName() { return jreName; } @XmlElement(name = "execEnv", namespace = Namespaces.SOA_REQ, defaultValue = DEFAULT_EXEC_ENV) public String getExecEnv() { return execEnv; } public void setExecEnv(String execEnv) { this.execEnv = execEnv; } public abstract int getHttpPort(); public String getRuntimeName() { return getName() + " Runtime"; } public void setState(ServerReqState requiredState) { ServersView serversView = new ServersView(); serversView.open(); Server server = serversView.getServer(name); ServerState currentState = server.getLabel().getState(); switch (currentState) { case STARTED: if (requiredState == ServerReqState.STOPPED) server.stop(); break; case STOPPED: if (requiredState == ServerReqState.RUNNING && canStart()) { try { server.start(); } catch (Exception e) { try { server = new ServersView().getServer(name); server.stop(); } catch (Exception ex) { } server = new ServersView().getServer(name); server.start(); } } break; default: new AssertionError("It was expected to have server in " + ServerState.STARTED + " or " + ServerState.STOPPED + "state." + " Not in state " + currentState + "."); } } public void deployProject(String project) { deployProject(project, "Deployed \"" + project + ".jar\""); } public void deployProject(String project, String checkPhrase) { ConsoleView consoleView = new ConsoleView(); consoleView.open(); consoleView.clearConsole(); ServersView serversView = new ServersView(); serversView.open(); Tree tree = new DefaultTree(); for (TreeItem item : tree.getItems()) { ServerLabel serverLabel = new ServerLabel(item); if (serverLabel.getName().equals(getName())) { item.select(); new ContextMenu(ADD_REMOVE_LABEL).select(); new DefaultShell(ADD_REMOVE_LABEL); new DefaultTreeItem(project).select(); new PushButton("Add >").click(); new PushButton("Finish").click(); new WaitWhile(new ShellWithTextIsActive(ADD_REMOVE_LABEL), TimePeriod.LONG); new WaitWhile(new JobIsRunning(), TimePeriod.LONG); checkDeployment(project, checkPhrase); return; } } throw new RuntimeException("Cannot find server '" + getName() + "'"); } protected void checkDeployment(String project, String checkPhrase) { new WaitUntil(new ConsoleHasText(checkPhrase), TimePeriod.LONG); } public String getUrl(String path) { return getUrl("localhost", path); } public abstract String getUrl(String host, String path); /** * Returns whether the server can be started. * * @return whether the server can be started */ protected boolean canStart() { return true; } /** * Adds new jre if it is defined. */ protected void addJre() { if (jre != null) { InstalledJREs installedJREsPage = new InstalledJREs(); installedJREsPage.open(); installedJREsPage.addJre(jre, jreName); installedJREsPage.ok(); } } @Override public boolean exists() { IServer[] server = ServerCore.getServers(); for (int i = 0; i < server.length; i++) { if (server[i].getId().equals(name)) { return true; } } return false; } public boolean isRemote() { return false; } }