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.Map; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.radrails.rails.internal.ui.console.IRailsShellConstants; import org.radrails.rails.ui.RailsUILog; import org.radrails.rails.ui.console.RailsShellCommandProvider; import org.rubypeople.rdt.launching.IRubyLaunchConfigurationConstants; import org.rubypeople.rdt.launching.ITerminal; import com.aptana.rdt.rake.IRakeHelper; import com.aptana.rdt.rake.RakePlugin; public class RakeCommandProvider extends RailsShellCommandProvider { @Override public Set<String> commandsHandled() { Set<String> commands = new HashSet<String>(); commands.add(IRailsShellConstants.RAKE); 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.RAKE)) { proposals.add(createProposal(IRailsShellConstants.RAKE, "Run a rake task", offset, token)); } } if (tokens.isEmpty() || (tokens.size() == 1 && !prefix.endsWith(" ")) || (tokens.size() == 2 && prefix.endsWith(" "))) return proposals; Map<String, String> tasks = getRakeTasksHelper().getTasks(getProject(), new NullProgressMonitor()); List<String> taskKeys = new ArrayList<String>(tasks.keySet()); Collections.sort(taskKeys); for (String task : taskKeys) { proposals.add(createProposal(task, tasks.get(task), offset, token)); } return proposals; } @Override public void run(ITerminal shell, String command) { String task = command.substring(4).trim(); int space = task.indexOf(' '); String parameters = ""; if (space > -1) { parameters = task.substring(space + 1); task = task.substring(0, space); } try { ILaunchConfigurationWorkingCopy wc = getRakeTasksHelper().run(getProject(), task, parameters) .getWorkingCopy(); wc.setAttribute(IRubyLaunchConfigurationConstants.ATTR_USE_TERMINAL, IRailsShellConstants.TERMINAL_ID); wc.setAttribute(IRubyLaunchConfigurationConstants.ATTR_TERMINAL_COMMAND, (String) null); wc.doSave().launch(getRunMode(), new NullProgressMonitor()); } catch (CoreException e) { RailsUILog.log(e); } } protected IRakeHelper getRakeTasksHelper() { return RakePlugin.getDefault().getRakeHelper(); } @Override public boolean projectNeedsToBeSelected() { return true; } }