package org.radrails.rails.internal.ui.console.commands; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; 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.eclipse.debug.core.ILaunch; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.radrails.db.core.DatabaseManager; import org.radrails.db.core.IDatabaseConstants; import org.radrails.rails.internal.ui.console.IRailsShellConstants; import org.radrails.rails.ui.console.RailsShellCommandProvider; import org.radrails.server.core.IServerConstants; import org.radrails.server.core.Server; import org.radrails.server.core.ServerManager; import org.rubypeople.rdt.launching.ITerminal; public class ScriptServerCommandProvider extends RailsShellCommandProvider { @Override public Set<String> commandsHandled() { Set<String> commands = new HashSet<String>(); commands.add(IRailsShellConstants.SCRIPT_SERVER); return commands; } @Override public List<ICompletionProposal> getCompletionProposals(String prefix, List<String> tokens, int offset) { List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); String token = getLastToken(prefix, tokens); if (tokens.size() <= 1) { if (!tokens.contains(IRailsShellConstants.SCRIPT_SERVER)) { proposals.add(createProposal(IRailsShellConstants.SCRIPT_SERVER, "Rails application server", offset, token)); } } String lastToken = ""; if (!tokens.isEmpty()) lastToken = tokens.get(tokens.size() - 1); if (lastToken.equals("-e")) { Set<String> environments = DatabaseManager.getEnvironments(); for (String env : environments) { proposals.add(createProposal(env, offset, "")); } return proposals; } if (lastToken.equals("-b") || lastToken.equals("-p")) return Collections.emptyList(); if (tokens.size() > 0) { if (!tokens.contains("-p")) proposals.add(createProposal("-p", "Runs Rails on the specified port. Default: 3000", offset, token)); if (!tokens.contains("-b")) proposals.add(createProposal("-b", "Binds Rails to the specified IP. Default: 0.0.0.0", offset, token)); if (!tokens.contains("-d")) proposals.add(createProposal("-d", "Make server run as a daemon", offset, token)); if (!tokens.contains("-e")) proposals.add(createProposal("-e", "Specifies the environment to run this server under. Default: development", offset, token)); if (!tokens.contains("-h")) proposals.add(createProposal("-h", "Show the help message", offset, token)); } return proposals; } @Override public void run(ITerminal shell, final String command) { final Server server = new Server(getProject(), "transient", IServerConstants.TYPE_MONGREL, getHost(command), getPort(command), getEnvironment(command)) { @Override public String getProgramArguments() { return getArgs(command); } }; ServerManager.getInstance().addServer(server); final ILaunch launch = runInNewConsole(shell, command); Job job = new Job("Running Rails server from Rails Shell") { @Override protected IStatus run(IProgressMonitor monitor) { while (!launch.isTerminated()) { Thread.yield(); if (monitor.isCanceled()) { server.stop(); ServerManager.getInstance().removeServer(server); return Status.CANCEL_STATUS; } } ServerManager.getInstance().removeServer(server); return Status.OK_STATUS; } }; job.setSystem(true); job.setPriority(Job.DECORATE); job.schedule(); } private String getHost(String command) { return getArg(command, "binding", Server.DEFAULT_RAILS_HOST); } private String getEnvironment(String command) { return getArg(command, "environment", IDatabaseConstants.ENV_DEVELOPMENT); } private String getPort(String command) { return getArg(command, "port", IServerConstants.DEFAULT_WEBRICK_PORT); } private String getArg(String command, String full, String defaultValue) { int index = command.indexOf("--" + full); String value = defaultValue; if (index != -1) { value = command.substring(index + 7); if (value.indexOf(' ') != -1) value = value.substring(0, value.indexOf(' ')); return value; } else { char letter = full.charAt(0); index = command.indexOf("-" + letter); if (index != -1) { value = command.substring(index + 3); if (value.indexOf(' ') != -1) value = value.substring(0, value.indexOf(' ')); return value; } } return value; } }