/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.command.execute; import com.google.inject.Inject; import org.eclipse.che.api.core.model.machine.Command; import org.eclipse.che.api.core.model.machine.Machine; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.ide.api.command.CommandExecutor; import org.eclipse.che.ide.api.command.CommandImpl; import org.eclipse.che.ide.api.machine.ExecAgentCommandManager; import org.eclipse.che.ide.api.macro.MacroProcessor; import org.eclipse.che.ide.api.selection.Selection; import org.eclipse.che.ide.api.selection.SelectionAgent; import org.eclipse.che.ide.console.CommandConsoleFactory; import org.eclipse.che.ide.console.CommandOutputConsole; import org.eclipse.che.ide.processes.panel.ProcessesPanelPresenter; import org.eclipse.che.ide.machine.chooser.MachineChooser; import java.util.Map; /** Implementation of {@link CommandExecutor}. */ public class CommandExecutorImpl implements CommandExecutor { private final MacroProcessor macroProcessor; private final CommandConsoleFactory commandConsoleFactory; private final ProcessesPanelPresenter processesPanelPresenter; private final ExecAgentCommandManager execAgentClient; private final MachineChooser machineChooser; private final SelectionAgent selectionAgent; @Inject public CommandExecutorImpl(MacroProcessor macroProcessor, CommandConsoleFactory commandConsoleFactory, ProcessesPanelPresenter processesPanelPresenter, ExecAgentCommandManager execAgentClient, MachineChooser machineChooser, SelectionAgent selectionAgent) { this.macroProcessor = macroProcessor; this.commandConsoleFactory = commandConsoleFactory; this.processesPanelPresenter = processesPanelPresenter; this.execAgentClient = execAgentClient; this.machineChooser = machineChooser; this.selectionAgent = selectionAgent; } @Override public void executeCommand(Command command, Machine machine) { final String name = command.getName(); final String type = command.getType(); final String commandLine = command.getCommandLine(); final Map<String, String> attributes = command.getAttributes(); macroProcessor.expandMacros(commandLine).then(expandedCommandLine -> { final CommandImpl expandedCommand = new CommandImpl(name, expandedCommandLine, type, attributes); final CommandOutputConsole console = commandConsoleFactory.create(expandedCommand, machine); final String machineId = machine.getId(); processesPanelPresenter.addCommandOutput(machineId, console); execAgentClient.startProcess(machineId, expandedCommand) .thenIfProcessStartedEvent(console.getProcessStartedConsumer()) .thenIfProcessDiedEvent(console.getProcessDiedConsumer()) .thenIfProcessStdOutEvent(console.getStdOutConsumer()) .thenIfProcessStdErrEvent(console.getStdErrConsumer()); }); } @Override public void executeCommand(CommandImpl command) { final Machine selectedMachine = getSelectedMachine(); if (selectedMachine != null) { executeCommand(command, selectedMachine); } else { machineChooser.show().then(machine -> { executeCommand(command, machine); }); } } /** Returns the currently selected machine or {@code null} if none. */ @Nullable private Machine getSelectedMachine() { final Selection<?> selection = selectionAgent.getSelection(); if (selection != null && !selection.isEmpty() && selection.isSingleSelection()) { final Object possibleNode = selection.getHeadElement(); if (possibleNode instanceof Machine) { return (Machine)possibleNode; } } return null; } }