package org.radrails.rails.internal.ui.console.commands; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; import org.radrails.rails.internal.core.RailsPlugin; import org.radrails.rails.internal.ui.console.IRailsShellConstants; import org.radrails.rails.internal.ui.wizards.RailsProjectCreator; import org.radrails.rails.ui.RailsUILog; import org.radrails.rails.ui.console.RailsShellCommandProvider; import org.rubypeople.rdt.launching.ITerminal; public class RailsCommandProvider extends RailsShellCommandProvider { @Override public Set<String> commandsHandled() { Set<String> commands = new HashSet<String>(); commands.add(IRailsShellConstants.RAILS); 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.RAILS)) { proposals .add(createProposal(IRailsShellConstants.RAILS, "Generate a new rails project", offset, token)); } } if (tokens.contains("-h") || tokens.contains("-v")) return proposals; String lastToken = ""; if (!tokens.isEmpty()) lastToken = tokens.get(tokens.size() - 1); if (lastToken.equals("-d")) { List<String> dbNames = RailsPlugin.getEligibleDatabaseNamesforCurrentVM(); for (String dbName : dbNames) { proposals.add(createProposal(dbName, offset, token)); } return proposals; } if (!tokens.contains("-d")) proposals.add(createProposal("-d", "Preconfigure for selected database", offset, token)); if (!tokens.contains("-f")) proposals.add(createProposal("-f", "Freeze rails in vendor", offset, token)); proposals.add(createProposal("-v", "Show version number and quit", offset, token)); proposals.add(createProposal("-h", "Show help and quit", offset, token)); return proposals; } @Override public void run(ITerminal shell, String command) { List<String> tokens = getTokens(command); if (tokens.contains("-h") || tokens.contains("-v") || tokens.contains("-p") || tokens.contains("--help") || tokens.contains("--version") || tokens.contains("--pretend")) { // Just run normally as a launch launchInsideShell(shell, command); } else { // Run RailsProjectCreator try { RailsProjectCreator creator = new RailsProjectCreator(getRunMode(), getArgs(command)); WorkspaceModifyDelegatingOperation op = new WorkspaceModifyDelegatingOperation(creator); op.run(new NullProgressMonitor()); shell.setProject(creator.getProject()); } catch (InvocationTargetException e) { RailsUILog.log(e); } catch (InterruptedException e) { RailsUILog.log(e); } } } private List<String> getTokens(String command) { StringTokenizer tokenizer = new StringTokenizer(command); List<String> tokens = new ArrayList<String>(); while (tokenizer.hasMoreTokens()) { tokens.add(tokenizer.nextToken()); } return tokens; } }