/*******************************************************************************
* 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.machine.chooser;
import com.google.inject.Inject;
import org.eclipse.che.api.core.model.machine.Machine;
import org.eclipse.che.api.core.model.workspace.WorkspaceRuntime;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseProvider;
import org.eclipse.che.api.promises.client.js.Executor;
import org.eclipse.che.api.promises.client.js.Executor.ExecutorBody;
import org.eclipse.che.api.promises.client.js.JsPromiseError;
import org.eclipse.che.api.promises.client.js.RejectFunction;
import org.eclipse.che.api.promises.client.js.ResolveFunction;
import org.eclipse.che.ide.api.app.AppContext;
import java.util.List;
/**
* Provides a simple mechanism for the user to choose a {@link Machine}.
*
* @author Artem Zatsarynnyi
*/
public class MachineChooser implements MachineChooserView.ActionDelegate {
private final MachineChooserView view;
private final AppContext appContext;
private final PromiseProvider promiseProvider;
private ResolveFunction<Machine> resolveFunction;
private RejectFunction rejectFunction;
@Inject
public MachineChooser(MachineChooserView view,
AppContext appContext,
PromiseProvider promiseProvider) {
this.view = view;
this.appContext = appContext;
this.promiseProvider = promiseProvider;
view.setDelegate(this);
}
/**
* Pops up a dialog for choosing a machine.
* <p><b>Note:</b> if there is only one machine running in the workspace
* then returned promise will be resolved with that machine without asking user.
*
* @return promise that will be resolved with a chosen {@link Machine}
* or rejected in case machine selection has been cancelled.
*/
public Promise<Machine> show() {
final WorkspaceRuntime runtime = appContext.getWorkspace().getRuntime();
if (runtime != null) {
final List<? extends Machine> machines = runtime.getMachines();
if (machines.size() == 1) {
return promiseProvider.resolve(machines.get(0));
}
view.setMachines(machines);
}
view.show();
return promiseProvider.create(Executor.create((ExecutorBody<Machine>)(resolve, reject) -> {
resolveFunction = resolve;
rejectFunction = reject;
}));
}
@Override
public void onMachineSelected(Machine machine) {
view.close();
resolveFunction.apply(machine);
}
@Override
public void onCanceled() {
rejectFunction.apply(JsPromiseError.create("Machine selection has been canceled"));
}
}