/******************************************************************************* * 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.workspace.start; import com.google.gwt.core.client.Callback; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import org.eclipse.che.api.workspace.shared.dto.WorkspaceDto; import org.eclipse.che.ide.context.BrowserAddress; import org.eclipse.che.ide.workspace.DefaultWorkspaceComponent; import org.eclipse.che.ide.api.component.Component; import org.eclipse.che.ide.workspace.WorkspaceWidgetFactory; import org.eclipse.che.ide.workspace.create.CreateWorkspacePresenter; import org.eclipse.che.ide.workspace.start.workspacewidget.WorkspaceWidget; import java.util.List; import static org.eclipse.che.api.core.model.workspace.WorkspaceStatus.RUNNING; /** * The class contains business logic which allows start existing workspace which was stopped before. * * @author Dmitry Shnurenko */ @Singleton public class StartWorkspacePresenter implements StartWorkspaceView.ActionDelegate, WorkspaceWidget.ActionDelegate { private final StartWorkspaceView view; private final Provider<DefaultWorkspaceComponent> wsComponentProvider; private final WorkspaceWidgetFactory widgetFactory; private final CreateWorkspacePresenter createWorkspacePresenter; private final BrowserAddress browserAddress; private WorkspaceDto selectedWorkspace; private Callback<Component, Exception> callback; private List<WorkspaceDto> workspaces; @Inject public StartWorkspacePresenter(StartWorkspaceView view, Provider<DefaultWorkspaceComponent> wsComponentProvider, WorkspaceWidgetFactory widgetFactory, CreateWorkspacePresenter createWorkspacePresenter, BrowserAddress browserAddress) { this.view = view; this.view.setDelegate(this); this.wsComponentProvider = wsComponentProvider; this.widgetFactory = widgetFactory; this.createWorkspacePresenter = createWorkspacePresenter; this.browserAddress = browserAddress; } /** * Shows special dialog which contains workspaces which can be started at this time. * * @param callback * callback which is necessary to notify that workspace component started or failed * @param workspaces * available workspaces which will be displayed */ public void show(List<WorkspaceDto> workspaces, Callback<Component, Exception> callback) { this.callback = callback; this.workspaces = workspaces; view.clearWorkspacesPanel(); String workspaceName = browserAddress.getWorkspaceName(); createWsWidgets(workspaces); for (WorkspaceDto workspace : workspaces) { if (workspaceName.equals(workspace.getConfig().getName())) { selectedWorkspace = workspace; break; } } view.setWsName(workspaceName); view.show(); } private void createWsWidgets(List<WorkspaceDto> workspaces) { for (WorkspaceDto workspace : workspaces) { WorkspaceWidget widget = widgetFactory.create(workspace); widget.setDelegate(this); view.addWorkspace(widget); } } /** {@inheritDoc} */ @Override public void onWorkspaceSelected(WorkspaceDto workspace) { selectedWorkspace = workspace; String wsName = workspace.getConfig().getDefaultEnv(); view.setWsName(wsName); view.setEnableStartButton(!wsName.isEmpty()); if (RUNNING.equals(workspace.getStatus())) { DefaultWorkspaceComponent workspaceComponent = wsComponentProvider.get(); workspaceComponent.setCurrentWorkspace(workspace); workspaceComponent.startWorkspace(workspace, callback); view.hide(); } } /** {@inheritDoc} */ @Override public void onCreateWorkspaceClicked() { view.hide(); createWorkspacePresenter.show(workspaces, callback); } /** {@inheritDoc} */ @Override public void onStartWorkspaceClicked() { DefaultWorkspaceComponent workspaceComponent = wsComponentProvider.get(); workspaceComponent.startWorkspace(selectedWorkspace, callback); view.hide(); } }